summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--[-rwxr-xr-x]indra/newview/CMakeLists.txt114
-rw-r--r--indra/newview/app_settings/commands.xml17
-rw-r--r--[-rwxr-xr-x]indra/newview/app_settings/logcontrol.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/app_settings/settings.xml341
-rw-r--r--indra/newview/app_settings/settings_minimal.xml5
-rw-r--r--indra/newview/app_settings/settings_per_account.xml111
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl1
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/previewF.glsl41
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/previewV.glsl57
-rw-r--r--indra/newview/featuretable.txt128
-rw-r--r--indra/newview/featuretable_linux.txt131
-rw-r--r--indra/newview/featuretable_mac.txt128
-rw-r--r--indra/newview/featuretable_xp.txt134
-rw-r--r--indra/newview/generate_breakpad_symbols.py51
-rw-r--r--indra/newview/gpu_table.txt1074
-rwxr-xr-xindra/newview/llagent.cpp121
-rw-r--r--indra/newview/llagent.h9
-rw-r--r--indra/newview/llagentcamera.cpp6
-rw-r--r--[-rwxr-xr-x]indra/newview/llagentwearables.cpp0
-rw-r--r--[-rwxr-xr-x]indra/newview/llagentwearables.h0
-rw-r--r--indra/newview/llagentwearablesfetch.cpp2
-rw-r--r--indra/newview/llappcorehttp.cpp192
-rw-r--r--indra/newview/llappcorehttp.h86
-rw-r--r--[-rwxr-xr-x]indra/newview/llappearancemgr.cpp11
-rw-r--r--indra/newview/llappviewer.cpp377
-rw-r--r--indra/newview/llappviewer.h17
-rw-r--r--indra/newview/llappviewerlinux.cpp3
-rw-r--r--indra/newview/llappviewermacosx.cpp4
-rw-r--r--indra/newview/llappviewerwin32.cpp133
-rw-r--r--indra/newview/llassetuploadresponders.cpp8
-rw-r--r--indra/newview/llattachmentsmgr.cpp6
-rw-r--r--indra/newview/llautoreplace.cpp139
-rw-r--r--indra/newview/llautoreplace.h57
-rwxr-xr-xindra/newview/llavataractions.cpp211
-rw-r--r--indra/newview/llavataractions.h43
-rwxr-xr-xindra/newview/llavatariconctrl.cpp37
-rw-r--r--indra/newview/llavatariconctrl.h20
-rw-r--r--indra/newview/llavatarlist.cpp61
-rw-r--r--indra/newview/llavatarlist.h3
-rw-r--r--indra/newview/llavatarlistitem.cpp51
-rw-r--r--indra/newview/llavatarlistitem.h6
-rw-r--r--indra/newview/llblockedlistitem.cpp114
-rw-r--r--indra/newview/llblockedlistitem.h73
-rw-r--r--indra/newview/llblocklist.cpp284
-rw-r--r--indra/newview/llblocklist.h138
-rw-r--r--indra/newview/llbrowsernotification.cpp8
-rw-r--r--indra/newview/llcallfloater.cpp821
-rw-r--r--indra/newview/llcallfloater.h273
-rw-r--r--indra/newview/llcallingcard.cpp16
-rw-r--r--indra/newview/llchannelmanager.cpp6
-rw-r--r--indra/newview/llchatbar.cpp44
-rw-r--r--indra/newview/llchathistory.cpp263
-rw-r--r--indra/newview/llchathistory.h8
-rw-r--r--indra/newview/llchatitemscontainerctrl.cpp52
-rw-r--r--indra/newview/llchatitemscontainerctrl.h8
-rw-r--r--indra/newview/llchiclet.cpp924
-rw-r--r--indra/newview/llchiclet.h457
-rw-r--r--indra/newview/llchicletbar.cpp101
-rw-r--r--indra/newview/llchicletbar.h14
-rw-r--r--indra/newview/llcommunicationchannel.cpp113
-rw-r--r--indra/newview/llcommunicationchannel.h66
-rw-r--r--indra/newview/llconversationlog.cpp615
-rw-r--r--indra/newview/llconversationlog.h216
-rw-r--r--indra/newview/llconversationloglist.cpp533
-rw-r--r--indra/newview/llconversationloglist.h153
-rw-r--r--indra/newview/llconversationloglistitem.cpp184
-rw-r--r--indra/newview/llconversationloglistitem.h86
-rw-r--r--indra/newview/llconversationmodel.cpp702
-rwxr-xr-xindra/newview/llconversationmodel.h314
-rwxr-xr-xindra/newview/llconversationview.cpp696
-rwxr-xr-xindra/newview/llconversationview.h177
-rw-r--r--indra/newview/lldaycyclemanager.cpp2
-rw-r--r--indra/newview/lldebugview.cpp9
-rw-r--r--indra/newview/lldeferredsounds.cpp45
-rw-r--r--indra/newview/lldeferredsounds.h46
-rw-r--r--indra/newview/lldelayedgestureerror.cpp8
-rw-r--r--indra/newview/lldirpicker.h2
-rw-r--r--indra/newview/lldonotdisturbnotificationstorage.cpp346
-rw-r--r--indra/newview/lldonotdisturbnotificationstorage.h78
-rw-r--r--indra/newview/lldrawable.cpp87
-rw-r--r--indra/newview/lldrawable.h2
-rw-r--r--indra/newview/lldrawpoolalpha.cpp6
-rw-r--r--indra/newview/lldrawpoolavatar.cpp5
-rw-r--r--indra/newview/lldrawpoolbump.cpp2
-rw-r--r--indra/newview/lldrawpoolwlsky.cpp10
-rw-r--r--indra/newview/lldriverparam.h15
-rw-r--r--indra/newview/lleventpoll.cpp2
-rw-r--r--indra/newview/llexpandabletextbox.cpp4
-rw-r--r--indra/newview/llface.cpp17
-rw-r--r--indra/newview/llfasttimerview.cpp42
-rw-r--r--indra/newview/llfasttimerview.h2
-rw-r--r--indra/newview/llfavoritesbar.cpp312
-rw-r--r--indra/newview/llfavoritesbar.h111
-rw-r--r--indra/newview/llfeaturemanager.cpp60
-rw-r--r--indra/newview/llfeaturemanager.h9
-rw-r--r--indra/newview/llfilepicker.h2
-rw-r--r--indra/newview/llfirstuse.cpp2
-rw-r--r--indra/newview/llflexibleobject.cpp54
-rw-r--r--indra/newview/llfloaterautoreplacesettings.cpp46
-rw-r--r--indra/newview/llfloateravatarpicker.cpp240
-rw-r--r--indra/newview/llfloateravatarpicker.h17
-rw-r--r--indra/newview/llfloaterbulkpermission.cpp38
-rw-r--r--indra/newview/llfloaterbulkpermission.h16
-rw-r--r--indra/newview/llfloaterbuycontents.cpp26
-rw-r--r--indra/newview/llfloaterbvhpreview.cpp21
-rw-r--r--indra/newview/llfloatercamera.cpp4
-rw-r--r--indra/newview/llfloaterchatvoicevolume.cpp44
-rw-r--r--indra/newview/llfloaterchatvoicevolume.h44
-rw-r--r--indra/newview/llfloatercolorpicker.cpp38
-rw-r--r--indra/newview/llfloatercolorpicker.h4
-rw-r--r--indra/newview/llfloaterconversationlog.cpp134
-rw-r--r--indra/newview/llfloaterconversationlog.h (renamed from indra/newview/llmemoryview.h)60
-rw-r--r--indra/newview/llfloaterconversationpreview.cpp186
-rw-r--r--indra/newview/llfloaterconversationpreview.h64
-rw-r--r--indra/newview/llfloaterdisplayname.cpp20
-rw-r--r--indra/newview/llfloatergodtools.cpp6
-rw-r--r--indra/newview/llfloaterhelpbrowser.cpp10
-rw-r--r--indra/newview/llfloaterimagepreview.cpp4
-rw-r--r--indra/newview/llfloaterimcontainer.cpp1982
-rw-r--r--indra/newview/llfloaterimcontainer.h209
-rw-r--r--indra/newview/llfloaterimnearbychat.cpp881
-rw-r--r--indra/newview/llfloaterimnearbychat.h (renamed from indra/newview/llnearbychatbar.h)69
-rw-r--r--indra/newview/llfloaterimnearbychathandler.cpp (renamed from indra/newview/llnearbychathandler.cpp)201
-rw-r--r--indra/newview/llfloaterimnearbychathandler.h (renamed from indra/newview/llnearbychathandler.h)17
-rw-r--r--indra/newview/llfloaterimnearbychatlistener.cpp (renamed from indra/newview/llnearbychatbarlistener.cpp)14
-rw-r--r--indra/newview/llfloaterimnearbychatlistener.h (renamed from indra/newview/llnearbychatbarlistener.h)18
-rw-r--r--indra/newview/llfloaterimsession.cpp1274
-rw-r--r--indra/newview/llfloaterimsession.h (renamed from indra/newview/llimfloater.h)159
-rw-r--r--indra/newview/llfloaterimsessiontab.cpp1082
-rw-r--r--indra/newview/llfloaterimsessiontab.h214
-rw-r--r--indra/newview/llfloaterinspect.cpp46
-rw-r--r--indra/newview/llfloaterinspect.h8
-rw-r--r--indra/newview/llfloaterjoystick.cpp4
-rw-r--r--indra/newview/llfloaterland.cpp17
-rw-r--r--indra/newview/llfloatermap.cpp18
-rw-r--r--indra/newview/llfloatermap.h1
-rwxr-xr-xindra/newview/llfloatermodelpreview.cpp159
-rw-r--r--indra/newview/llfloatermodelpreview.h9
-rw-r--r--indra/newview/llfloaternotificationsconsole.cpp38
-rw-r--r--indra/newview/llfloateroutbox.cpp84
-rw-r--r--indra/newview/llfloateroutbox.h2
-rw-r--r--indra/newview/llfloaterpathfindinglinksets.cpp56
-rw-r--r--indra/newview/llfloaterpathfindinglinksets.h7
-rwxr-xr-xindra/newview/llfloaterpreference.cpp338
-rw-r--r--indra/newview/llfloaterpreference.h39
-rw-r--r--indra/newview/llfloaterregioninfo.cpp50
-rw-r--r--indra/newview/llfloaterreporter.cpp23
-rw-r--r--indra/newview/llfloaterreporter.h1
-rw-r--r--indra/newview/llfloaterscriptlimits.cpp15
-rw-r--r--indra/newview/llfloatersellland.cpp22
-rw-r--r--indra/newview/llfloatersidepanelcontainer.cpp7
-rw-r--r--indra/newview/llfloatertexturefetchdebugger.cpp2
-rw-r--r--indra/newview/llfloatertools.cpp15
-rw-r--r--indra/newview/llfloatertools.h2
-rw-r--r--indra/newview/llfloatertopobjects.cpp14
-rw-r--r--indra/newview/llfloatertos.cpp6
-rw-r--r--indra/newview/llfloatertranslationsettings.cpp23
-rw-r--r--indra/newview/llfloatertranslationsettings.h1
-rw-r--r--indra/newview/llfloateruipreview.cpp122
-rw-r--r--indra/newview/llfloaterurlentry.cpp3
-rw-r--r--indra/newview/llfloatervoicevolume.cpp220
-rw-r--r--indra/newview/llfloatervoicevolume.h35
-rw-r--r--indra/newview/llfolderview.cpp2641
-rw-r--r--indra/newview/llfolderview.h377
-rw-r--r--indra/newview/llfoldervieweventlistener.h103
-rw-r--r--indra/newview/llfolderviewitem.cpp2901
-rw-r--r--indra/newview/llfolderviewitem.h577
-rw-r--r--indra/newview/llfolderviewmodelinventory.cpp314
-rw-r--r--indra/newview/llfolderviewmodelinventory.h118
-rw-r--r--indra/newview/llfollowcam.cpp1
-rw-r--r--indra/newview/llfriendcard.cpp6
-rw-r--r--indra/newview/llgesturemgr.cpp6
-rw-r--r--indra/newview/llgroupactions.cpp4
-rw-r--r--indra/newview/llgroupiconctrl.cpp2
-rw-r--r--indra/newview/llgrouplist.cpp6
-rw-r--r--indra/newview/llgrouplist.h13
-rw-r--r--indra/newview/llgroupmgr.cpp198
-rw-r--r--indra/newview/llgroupmgr.h11
-rw-r--r--indra/newview/llhints.cpp4
-rw-r--r--indra/newview/llhudnametag.cpp282
-rw-r--r--indra/newview/llhudnametag.h2
-rw-r--r--indra/newview/llimfloater.cpp1195
-rw-r--r--indra/newview/llimfloatercontainer.cpp165
-rw-r--r--indra/newview/llimfloatercontainer.h70
-rw-r--r--indra/newview/llimhandler.cpp118
-rw-r--r--indra/newview/llimpanel.cpp2
-rw-r--r--indra/newview/llimview.cpp582
-rw-r--r--indra/newview/llimview.h66
-rw-r--r--indra/newview/llinspectavatar.cpp511
-rw-r--r--indra/newview/llinventorybridge.cpp660
-rw-r--r--indra/newview/llinventorybridge.h104
-rw-r--r--indra/newview/llinventoryfilter.cpp403
-rw-r--r--indra/newview/llinventoryfilter.h182
-rw-r--r--indra/newview/llinventoryfunctions.cpp136
-rw-r--r--indra/newview/llinventoryfunctions.h58
-rw-r--r--indra/newview/llinventoryicon.h2
-rw-r--r--[-rwxr-xr-x]indra/newview/llinventorymodel.cpp131
-rw-r--r--indra/newview/llinventorymodel.h18
-rw-r--r--indra/newview/llinventorypanel.cpp646
-rw-r--r--indra/newview/llinventorypanel.h120
-rw-r--r--indra/newview/lllistcontextmenu.h2
-rw-r--r--indra/newview/lllocalbitmaps.cpp4
-rw-r--r--indra/newview/lllogchat.cpp496
-rw-r--r--indra/newview/lllogchat.h35
-rw-r--r--indra/newview/llmanip.cpp9
-rw-r--r--indra/newview/llmaniprotate.cpp232
-rw-r--r--indra/newview/llmediactrl.cpp30
-rw-r--r--indra/newview/llmemoryview.cpp333
-rw-r--r--indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp245
-rw-r--r--indra/newview/llmenuoptionpathfindingrebakenavmesh.h (renamed from indra/newview/llpanelpathfindingrebakenavmesh.h)53
-rwxr-xr-xindra/newview/llmeshrepository.cpp198
-rw-r--r--indra/newview/llmeshrepository.h9
-rw-r--r--indra/newview/llmoveview.cpp15
-rw-r--r--indra/newview/llmoveview.h2
-rw-r--r--indra/newview/llnamelistctrl.cpp46
-rw-r--r--indra/newview/llnamelistctrl.h26
-rw-r--r--indra/newview/llnearbychat.cpp338
-rw-r--r--indra/newview/llnearbychat.h83
-rw-r--r--indra/newview/llnearbychatbar.cpp680
-rw-r--r--indra/newview/llnotificationalerthandler.cpp117
-rw-r--r--indra/newview/llnotificationgrouphandler.cpp65
-rw-r--r--indra/newview/llnotificationhandler.h237
-rw-r--r--indra/newview/llnotificationhandlerutil.cpp272
-rw-r--r--indra/newview/llnotificationhinthandler.cpp27
-rw-r--r--indra/newview/llnotificationmanager.cpp100
-rw-r--r--indra/newview/llnotificationmanager.h17
-rw-r--r--indra/newview/llnotificationofferhandler.cpp199
-rw-r--r--indra/newview/llnotificationscripthandler.cpp104
-rw-r--r--indra/newview/llnotificationstorage.cpp218
-rw-r--r--indra/newview/llnotificationstorage.h35
-rw-r--r--indra/newview/llnotificationtiphandler.cpp121
-rw-r--r--indra/newview/lloutfitslist.cpp30
-rw-r--r--indra/newview/lloutfitslist.h10
-rw-r--r--indra/newview/lloutputmonitorctrl.cpp114
-rw-r--r--indra/newview/lloutputmonitorctrl.h19
-rw-r--r--indra/newview/llpanelblockedlist.cpp168
-rw-r--r--indra/newview/llpanelblockedlist.h38
-rw-r--r--indra/newview/llpaneleditwearable.cpp12
-rw-r--r--indra/newview/llpanelgroup.h2
-rw-r--r--indra/newview/llpanelgroupgeneral.cpp121
-rw-r--r--indra/newview/llpanelgroupgeneral.h6
-rw-r--r--indra/newview/llpanelgroupinvite.cpp53
-rw-r--r--indra/newview/llpanelgroupinvite.h4
-rw-r--r--indra/newview/llpanelgrouplandmoney.cpp2
-rw-r--r--indra/newview/llpanelgroupnotices.cpp5
-rw-r--r--indra/newview/llpanelgrouproles.cpp103
-rw-r--r--indra/newview/llpanelgrouproles.h8
-rw-r--r--indra/newview/llpanelimcontrolpanel.cpp397
-rw-r--r--indra/newview/llpanelimcontrolpanel.h56
-rw-r--r--indra/newview/llpanellandmarks.cpp188
-rw-r--r--indra/newview/llpanellandmarks.h3
-rw-r--r--indra/newview/llpanellogin.cpp83
-rw-r--r--indra/newview/llpanelmaininventory.cpp127
-rw-r--r--indra/newview/llpanelmarketplaceinbox.cpp24
-rw-r--r--indra/newview/llpanelmarketplaceinboxinventory.cpp146
-rw-r--r--indra/newview/llpanelmarketplaceinboxinventory.h19
-rw-r--r--indra/newview/llpanelmarketplaceoutboxinventory.cpp156
-rw-r--r--indra/newview/llpanelmarketplaceoutboxinventory.h78
-rw-r--r--indra/newview/llpanelobjectinventory.cpp184
-rw-r--r--indra/newview/llpanelobjectinventory.h11
-rw-r--r--indra/newview/llpaneloutfitedit.cpp37
-rw-r--r--indra/newview/llpanelpathfindingrebakenavmesh.cpp269
-rw-r--r--indra/newview/llpanelpeople.cpp379
-rw-r--r--indra/newview/llpanelpeople.h34
-rw-r--r--indra/newview/llpanelpeoplemenus.cpp141
-rw-r--r--indra/newview/llpanelpeoplemenus.h20
-rw-r--r--indra/newview/llpanelpermissions.cpp2
-rw-r--r--indra/newview/llpanelplaceprofile.cpp8
-rw-r--r--indra/newview/llpanelplaceprofile.h2
-rw-r--r--indra/newview/llpanelplaces.cpp2
-rw-r--r--indra/newview/llpanelteleporthistory.cpp5
-rw-r--r--indra/newview/llpaneltopinfobar.cpp10
-rw-r--r--indra/newview/llparticipantlist.cpp738
-rw-r--r--indra/newview/llparticipantlist.h152
-rw-r--r--indra/newview/llpathfindingobject.cpp1
-rw-r--r--indra/newview/llpersistentnotificationstorage.cpp145
-rw-r--r--indra/newview/llpersistentnotificationstorage.h63
-rw-r--r--indra/newview/llplacesfolderview.cpp74
-rw-r--r--indra/newview/llplacesfolderview.h72
-rw-r--r--indra/newview/llplacesinventorybridge.cpp50
-rw-r--r--indra/newview/llplacesinventorybridge.h3
-rw-r--r--indra/newview/llplacesinventorypanel.cpp120
-rw-r--r--indra/newview/llplacesinventorypanel.h37
-rw-r--r--indra/newview/llpolymesh.cpp4
-rw-r--r--indra/newview/llpolymesh.h17
-rw-r--r--indra/newview/llpolymorph.cpp66
-rw-r--r--indra/newview/llpolymorph.h19
-rw-r--r--indra/newview/llpreview.cpp17
-rw-r--r--indra/newview/llpreviewscript.cpp8
-rw-r--r--indra/newview/llprogressview.cpp4
-rw-r--r--indra/newview/llscreenchannel.cpp177
-rw-r--r--indra/newview/llscreenchannel.h16
-rw-r--r--indra/newview/llscriptfloater.cpp123
-rw-r--r--indra/newview/llselectmgr.cpp311
-rw-r--r--indra/newview/llselectmgr.h8
-rw-r--r--indra/newview/llsidepanelappearance.cpp8
-rw-r--r--indra/newview/llsidepanelinventory.cpp22
-rw-r--r--indra/newview/llsidepanelinventory.h2
-rw-r--r--indra/newview/llsidepaneltaskinfo.cpp4
-rw-r--r--indra/newview/llsidepaneltaskinfo.h1
-rw-r--r--indra/newview/llspatialpartition.cpp142
-rw-r--r--indra/newview/llspatialpartition.h12
-rw-r--r--indra/newview/llspeakers.cpp205
-rw-r--r--indra/newview/llspeakers.h15
-rw-r--r--indra/newview/llspeakingindicatormanager.cpp46
-rw-r--r--indra/newview/llspeakingindicatormanager.h5
-rw-r--r--[-rwxr-xr-x]indra/newview/llstartup.cpp49
-rw-r--r--[-rwxr-xr-x]indra/newview/llstartup.h0
-rw-r--r--indra/newview/llsurface.cpp3
-rw-r--r--indra/newview/llsurface.h3
-rw-r--r--indra/newview/llsyswellwindow.cpp348
-rw-r--r--indra/newview/llsyswellwindow.h76
-rw-r--r--indra/newview/lltexlayer.cpp8
-rw-r--r--indra/newview/lltexlayerparams.h32
-rw-r--r--indra/newview/lltexturecache.cpp21
-rw-r--r--indra/newview/lltexturectrl.cpp46
-rwxr-xr-x[-rw-r--r--]indra/newview/lltexturefetch.cpp2147
-rw-r--r--indra/newview/lltexturefetch.h265
-rw-r--r--[-rwxr-xr-x]indra/newview/lltextureview.cpp44
-rw-r--r--indra/newview/lltoast.cpp2
-rw-r--r--indra/newview/lltoast.h7
-rw-r--r--indra/newview/lltoastalertpanel.cpp1
-rw-r--r--indra/newview/lltoastgroupnotifypanel.cpp10
-rw-r--r--indra/newview/lltoastgroupnotifypanel.h5
-rw-r--r--indra/newview/lltoastimpanel.cpp4
-rw-r--r--indra/newview/lltoastimpanel.h12
-rw-r--r--indra/newview/lltoastnotifypanel.cpp582
-rw-r--r--indra/newview/lltoastnotifypanel.h31
-rw-r--r--indra/newview/lltoastpanel.cpp40
-rw-r--r--indra/newview/lltoastpanel.h9
-rw-r--r--indra/newview/lltoastscriptquestion.cpp4
-rw-r--r--indra/newview/lltoastscripttextbox.cpp2
-rw-r--r--indra/newview/lltoastscripttextbox.h2
-rw-r--r--indra/newview/lltoolbarview.cpp14
-rw-r--r--indra/newview/lltoolbarview.h4
-rw-r--r--indra/newview/lltooldraganddrop.cpp97
-rw-r--r--indra/newview/lltooldraganddrop.h3
-rw-r--r--indra/newview/lltoolpie.cpp30
-rwxr-xr-xindra/newview/lltranslate.h4
-rw-r--r--[-rwxr-xr-x]indra/newview/llviewerassetstats.cpp0
-rw-r--r--[-rwxr-xr-x]indra/newview/llviewerassetstats.h0
-rw-r--r--indra/newview/llviewerassettype.cpp2
-rw-r--r--indra/newview/llvieweraudio.cpp7
-rw-r--r--indra/newview/llviewercontrol.cpp17
-rw-r--r--indra/newview/llviewerdisplay.cpp18
-rw-r--r--indra/newview/llviewerdisplayname.cpp13
-rw-r--r--indra/newview/llviewerfloaterreg.cpp24
-rwxr-xr-x[-rw-r--r--]indra/newview/llviewerfoldertype.cpp0
-rw-r--r--indra/newview/llviewergesture.cpp6
-rw-r--r--indra/newview/llviewerhelp.cpp6
-rw-r--r--[-rwxr-xr-x]indra/newview/llviewerinventory.cpp364
-rw-r--r--indra/newview/llviewerinventory.h27
-rw-r--r--[-rwxr-xr-x]indra/newview/llviewerjointmesh.cpp0
-rw-r--r--[-rwxr-xr-x]indra/newview/llviewerjointmesh.h0
-rw-r--r--indra/newview/llviewerkeyboard.cpp11
-rw-r--r--indra/newview/llviewermedia.cpp21
-rw-r--r--indra/newview/llviewermenu.cpp340
-rw-r--r--indra/newview/llviewermenu.h7
-rw-r--r--indra/newview/llviewermenufile.cpp10
-rwxr-xr-xindra/newview/llviewermessage.cpp543
-rw-r--r--indra/newview/llviewermessage.h4
-rw-r--r--indra/newview/llviewerobject.cpp110
-rw-r--r--indra/newview/llviewerobject.h3
-rw-r--r--indra/newview/llviewerobjectlist.cpp95
-rw-r--r--indra/newview/llviewerobjectlist.h1
-rw-r--r--indra/newview/llviewerparceloverlay.cpp1
-rw-r--r--indra/newview/llviewerpartsim.cpp26
-rw-r--r--indra/newview/llviewerpartsim.h2
-rw-r--r--indra/newview/llviewerpartsource.cpp22
-rw-r--r--indra/newview/llviewerprecompiledheaders.h7
-rw-r--r--indra/newview/llviewerregion.cpp34
-rw-r--r--indra/newview/llviewershadermgr.cpp13
-rw-r--r--[-rwxr-xr-x]indra/newview/llviewerstats.cpp285
-rw-r--r--[-rwxr-xr-x]indra/newview/llviewerstats.h169
-rw-r--r--indra/newview/llviewerstatsrecorder.cpp181
-rw-r--r--indra/newview/llviewerstatsrecorder.h82
-rw-r--r--indra/newview/llviewertexteditor.cpp8
-rw-r--r--indra/newview/llviewertexture.cpp38
-rw-r--r--[-rwxr-xr-x]indra/newview/llviewertexture.h1
-rw-r--r--indra/newview/llviewertexturelist.cpp77
-rw-r--r--indra/newview/llviewervisualparam.h3
-rwxr-xr-xindra/newview/llviewerwindow.cpp198
-rw-r--r--indra/newview/llviewerwindow.h14
-rw-r--r--indra/newview/llvlcomposition.cpp2
-rw-r--r--[-rwxr-xr-x]indra/newview/llvoavatar.cpp733
-rw-r--r--[-rwxr-xr-x]indra/newview/llvoavatar.h17
-rw-r--r--[-rwxr-xr-x]indra/newview/llvoavatarself.cpp6
-rw-r--r--[-rwxr-xr-x]indra/newview/llvoavatarself.h0
-rw-r--r--indra/newview/llvograss.cpp1
-rw-r--r--indra/newview/llvoicechannel.cpp2
-rw-r--r--indra/newview/llvoicechannel.h2
-rw-r--r--indra/newview/llvoiceclient.cpp2
-rw-r--r--indra/newview/llvoiceclient.h6
-rw-r--r--indra/newview/llvoicevisualizer.cpp46
-rw-r--r--indra/newview/llvoicevisualizer.h11
-rw-r--r--indra/newview/llvoicevivox.cpp166
-rw-r--r--indra/newview/llvoicevivox.h6
-rw-r--r--indra/newview/llvopartgroup.cpp5
-rw-r--r--indra/newview/llvovolume.cpp76
-rw-r--r--indra/newview/llvowlsky.cpp2
-rw-r--r--indra/newview/llwaterparammanager.cpp2
-rw-r--r--indra/newview/llwlhandlers.cpp10
-rw-r--r--indra/newview/llwlparammanager.cpp2
-rw-r--r--indra/newview/llworld.cpp4
-rw-r--r--indra/newview/llworldmapview.cpp5
-rw-r--r--indra/newview/macutil_Prefix.h2
-rw-r--r--indra/newview/pipeline.cpp226
-rw-r--r--indra/newview/pipeline.h21
-rw-r--r--indra/newview/skins/default/colors.xml1592
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Unread_IM.pngbin458 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.pngbin602 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.pngbin669 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.pngbin639 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.pngbin547 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.pngbin526 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Conv_log_inbox.pngbin0 -> 556 bytes
-rwxr-xr-xindra/newview/skins/default/textures/icons/Conv_toolbar_add_person.pngbin0 -> 373 bytes
-rwxr-xr-xindra/newview/skins/default/textures/icons/Conv_toolbar_arrow_ne.pngbin0 -> 215 bytes
-rwxr-xr-xindra/newview/skins/default/textures/icons/Conv_toolbar_arrow_sw.pngbin0 -> 211 bytes
-rwxr-xr-xindra/newview/skins/default/textures/icons/Conv_toolbar_call_log.pngbin0 -> 546 bytes
-rwxr-xr-xindra/newview/skins/default/textures/icons/Conv_toolbar_close.pngbin0 -> 275 bytes
-rwxr-xr-xindra/newview/skins/default/textures/icons/Conv_toolbar_collapse.pngbin0 -> 345 bytes
-rwxr-xr-xindra/newview/skins/default/textures/icons/Conv_toolbar_expand.pngbin0 -> 342 bytes
-rwxr-xr-xindra/newview/skins/default/textures/icons/Conv_toolbar_hang_up.pngbin0 -> 459 bytes
-rwxr-xr-xindra/newview/skins/default/textures/icons/Conv_toolbar_open_call.pngbin0 -> 366 bytes
-rwxr-xr-xindra/newview/skins/default/textures/icons/Conv_toolbar_plus.pngbin0 -> 144 bytes
-rwxr-xr-xindra/newview/skins/default/textures/icons/Conv_toolbar_sort.pngbin0 -> 230 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/collapse_to_one_line.pngbin0 -> 538 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/expand_one_liner.pngbin0 -> 545 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/nearby_chat_icon.pngbin0 -> 399 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml26
-rw-r--r--indra/newview/skins/default/xui/da/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_pathfinding_linksets.xml13
-rw-r--r--indra/newview/skins/default/xui/de/floater_texture_fetch_debugger.xml19
-rw-r--r--indra/newview/skins/default/xui/de/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/de/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_viewer.xml1
-rw-r--r--indra/newview/skins/default/xui/de/notifications.xml55
-rw-r--r--indra/newview/skins/default/xui/de/panel_login.xml10
-rw-r--r--indra/newview/skins/default/xui/de/panel_navmesh_rebake.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_volume_pulldown.xml24
-rw-r--r--indra/newview/skins/default/xui/de/strings.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_bulk_perms.xml19
-rw-r--r--indra/newview/skins/default/xui/en/floater_camera.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_chat_bar.xml85
-rw-r--r--indra/newview/skins/default/xui/en/floater_conversation_log.xml84
-rw-r--r--indra/newview/skins/default/xui/en/floater_conversation_preview.xml64
-rw-r--r--indra/newview/skins/default/xui/en/floater_destinations.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_container.xml203
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_session.xml418
-rw-r--r--indra/newview/skins/default/xui/en/floater_incoming_call.xml58
-rw-r--r--indra/newview/skins/default/xui/en/floater_moveview.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_pathfinding_console.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_people.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_texture_ctrl.xml10
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_ui_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml48
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_controls.xml155
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_effect.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_volume.xml59
-rw-r--r--indra/newview/skins/default/xui/en/inspect_avatar.xml100
-rw-r--r--indra/newview/skins/default/xui/en/menu_cof_gear.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_conversation.xml203
-rw-r--r--indra/newview/skins/default/xui/en/menu_conversation_log_gear.xml142
-rw-r--r--indra/newview/skins/default/xui/en/menu_conversation_log_view.xml45
-rw-r--r--indra/newview/skins/default/xui/en/menu_group_plus.xml4
-rw-r--r--indra/newview/skins/default/xui/en/menu_im_conversation.xml101
-rw-r--r--indra/newview/skins/default/xui/en/menu_im_session_showmodes.xml49
-rw-r--r--indra/newview/skins/default/xui/en/menu_im_well_button.xml16
-rw-r--r--indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml143
-rw-r--r--indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml252
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_add.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_object.xml40
-rw-r--r--indra/newview/skins/default/xui/en/menu_object_icon.xml18
-rw-r--r--indra/newview/skins/default/xui/en/menu_outfit_gear.xml14
-rw-r--r--indra/newview/skins/default/xui/en/menu_participant_view.xml112
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_blocked_gear.xml26
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_blocked_plus.xml20
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_blocked_view.xml26
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_friends_view.xml (renamed from indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml)12
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_groups.xml27
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_groups_view.xml (renamed from indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml)9
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby.xml99
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml14
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby_view.xml53
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml57
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_recent_view.xml (renamed from indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml)4
-rw-r--r--indra/newview/skins/default/xui/en/menu_url_agent.xml20
-rw-r--r--indra/newview/skins/default/xui/en/menu_url_objectim.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml254
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml1869
-rw-r--r--indra/newview/skins/default/xui/en/panel_activeim_row.xml97
-rw-r--r--indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml95
-rw-r--r--indra/newview/skins/default/xui/en/panel_avatar_list_item.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml163
-rw-r--r--indra/newview/skins/default/xui/en/panel_blocked_list_item.xml71
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_chiclet_bar.xml48
-rw-r--r--indra/newview/skins/default/xui/en/panel_conversation_list_item.xml98
-rw-r--r--indra/newview/skins/default/xui/en/panel_conversation_log_list_item.xml107
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_control_panel.xml109
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_list_item.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notices.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_roles.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_im_control_panel.xml166
-rw-r--r--indra/newview/skins/default/xui/en/panel_inbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_landmarks.xml16
-rw-r--r--indra/newview/skins/default/xui/en/panel_login.xml11
-rw-r--r--indra/newview/skins/default/xui/en/panel_media_settings_general.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_navmesh_rebake.xml45
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_chat.xml22
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_outbox_inventory.xml25
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml941
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_advanced.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_chat.xml693
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_colors.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_general.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml35
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_privacy.xml226
-rw-r--r--indra/newview/skins/default/xui/en/panel_script_ed.xml1
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_task_info.xml1092
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml48
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chat_editor.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml55
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml56
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml56
-rwxr-xr-xindra/newview/skins/default/xui/en/widgets/conversation_view_participant.xml42
-rw-r--r--indra/newview/skins/default/xui/en/widgets/conversation_view_session.xml16
-rw-r--r--indra/newview/skins/default/xui/en/widgets/folder_view_item.xml8
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml8
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inbox_inventory_panel.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml9
-rw-r--r--indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/text.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/toolbar.xml12
-rw-r--r--indra/newview/skins/default/xui/es/floater_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_pathfinding_linksets.xml13
-rw-r--r--indra/newview/skins/default/xui/es/floater_texture_fetch_debugger.xml19
-rw-r--r--indra/newview/skins/default/xui/es/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/es/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/es/notifications.xml57
-rw-r--r--indra/newview/skins/default/xui/es/panel_login.xml6
-rw-r--r--indra/newview/skins/default/xui/es/panel_navmesh_rebake.xml6
-rw-r--r--indra/newview/skins/default/xui/es/panel_nearby_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_volume_pulldown.xml24
-rw-r--r--indra/newview/skins/default/xui/es/strings.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_edit_day_cycle.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_model_preview.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/floater_pathfinding_console.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_pathfinding_linksets.xml13
-rw-r--r--indra/newview/skins/default/xui/fr/floater_spellcheck.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_texture_fetch_debugger.xml19
-rw-r--r--indra/newview/skins/default/xui/fr/floater_top_objects.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/menu_viewer.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/notifications.xml53
-rw-r--r--indra/newview/skins/default/xui/fr/panel_block_list_sidetray.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_login.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_navmesh_rebake.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_postcard_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_snapshot_local.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_volume_pulldown.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/strings.xml16
-rw-r--r--indra/newview/skins/default/xui/it/floater_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_pathfinding_linksets.xml13
-rw-r--r--indra/newview/skins/default/xui/it/floater_texture_fetch_debugger.xml19
-rw-r--r--indra/newview/skins/default/xui/it/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/it/notifications.xml51
-rw-r--r--indra/newview/skins/default/xui/it/panel_login.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_navmesh_rebake.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_nearby_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_volume_pulldown.xml26
-rw-r--r--indra/newview/skins/default/xui/it/strings.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/floater_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml13
-rw-r--r--indra/newview/skins/default/xui/ja/floater_texture_fetch_debugger.xml19
-rw-r--r--indra/newview/skins/default/xui/ja/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/notifications.xml49
-rw-r--r--indra/newview/skins/default/xui/ja/panel_login.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_navmesh_rebake.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_volume_pulldown.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/strings.xml14
-rw-r--r--indra/newview/skins/default/xui/pl/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/panel_nearby_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_pathfinding_linksets.xml13
-rw-r--r--indra/newview/skins/default/xui/pt/floater_texture_fetch_debugger.xml19
-rw-r--r--indra/newview/skins/default/xui/pt/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/notifications.xml59
-rw-r--r--indra/newview/skins/default/xui/pt/panel_login.xml13
-rw-r--r--indra/newview/skins/default/xui/pt/panel_navmesh_rebake.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/panel_nearby_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_volume_pulldown.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/strings.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/floater_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_pathfinding_linksets.xml13
-rw-r--r--indra/newview/skins/default/xui/ru/floater_texture_fetch_debugger.xml19
-rw-r--r--indra/newview/skins/default/xui/ru/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/ru/notifications.xml49
-rw-r--r--indra/newview/skins/default/xui/ru/panel_login.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/panel_navmesh_rebake.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/panel_nearby_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/panel_region_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/panel_volume_pulldown.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/strings.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/floater_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_pathfinding_linksets.xml13
-rw-r--r--indra/newview/skins/default/xui/tr/floater_texture_fetch_debugger.xml19
-rw-r--r--indra/newview/skins/default/xui/tr/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/tr/notifications.xml53
-rw-r--r--indra/newview/skins/default/xui/tr/panel_login.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/panel_navmesh_rebake.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/panel_nearby_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/panel_region_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/panel_volume_pulldown.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/strings.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/floater_about.xml77
-rw-r--r--indra/newview/skins/default/xui/zh/floater_about_land.xml41
-rw-r--r--indra/newview/skins/default/xui/zh/floater_animation_anim_preview.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_animation_bvh_preview.xml186
-rw-r--r--indra/newview/skins/default/xui/zh/floater_autoreplace.xml32
-rw-r--r--indra/newview/skins/default/xui/zh/floater_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_build_options.xml27
-rw-r--r--indra/newview/skins/default/xui/zh/floater_buy_currency.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_camera.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/floater_delete_env_preset.xml35
-rw-r--r--indra/newview/skins/default/xui/zh/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_edit_day_cycle.xml104
-rw-r--r--indra/newview/skins/default/xui/zh/floater_edit_sky_preset.xml143
-rw-r--r--indra/newview/skins/default/xui/zh/floater_edit_water_preset.xml72
-rw-r--r--indra/newview/skins/default/xui/zh/floater_environment_settings.xml36
-rw-r--r--indra/newview/skins/default/xui/zh/floater_fast_timers.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/floater_hardware_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/floater_how_to.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_map.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_merchant_outbox.xml27
-rw-r--r--indra/newview/skins/default/xui/zh/floater_model_preview.xml407
-rw-r--r--indra/newview/skins/default/xui/zh/floater_moveview.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_my_appearance.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_object_weights.xml28
-rw-r--r--indra/newview/skins/default/xui/zh/floater_pathfinding_characters.xml57
-rw-r--r--indra/newview/skins/default/xui/zh/floater_pathfinding_console.xml121
-rw-r--r--indra/newview/skins/default/xui/zh/floater_pathfinding_linksets.xml167
-rw-r--r--indra/newview/skins/default/xui/zh/floater_people.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/floater_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_places.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preferences_proxy.xml40
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/floater_search.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_snapshot.xml121
-rw-r--r--indra/newview/skins/default/xui/zh/floater_spellcheck.xml18
-rw-r--r--indra/newview/skins/default/xui/zh/floater_spellcheck_import.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/floater_stats.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/floater_test_layout_stacks.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_test_text_vertical_aligment.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/floater_texture_fetch_debugger.xml77
-rw-r--r--indra/newview/skins/default/xui/zh/floater_tools.xml82
-rw-r--r--indra/newview/skins/default/xui/zh/floater_top_objects.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/floater_toybox.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_translation_settings.xml58
-rw-r--r--indra/newview/skins/default/xui/zh/floater_voice_controls.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/floater_voice_effect.xml129
-rw-r--r--indra/newview/skins/default/xui/zh/floater_window_size.xml15
-rw-r--r--indra/newview/skins/default/xui/zh/menu_hide_navbar.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inspect_object_gear.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_login.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_media_ctrl.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/menu_object.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_nearby_view_sort.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/menu_text_editor.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_toolbars.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_viewer.xml179
-rw-r--r--indra/newview/skins/default/xui/zh/menu_wearing_gear.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/notifications.xml600
-rw-r--r--indra/newview/skins/default/xui/zh/panel_chiclet_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_skin.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_invite.xml3
-rw-r--r--indra/newview/skins/default/xui/zh/panel_login.xml32
-rw-r--r--indra/newview/skins/default/xui/zh/panel_me.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/panel_navigation_bar.xml35
-rw-r--r--indra/newview/skins/default/xui/zh/panel_navmesh_rebake.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_nearby_chat.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfits_list.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_people.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/panel_place_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_places.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_postcard_message.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/panel_postcard_settings.xml23
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml13
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_chat.xml28
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_general.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_move.xml31
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_setup.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_sound.xml26
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_environment.xml33
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_estate.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_terrain.xml49
-rw-r--r--indra/newview/skins/default/xui/zh/panel_script_ed.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_script_question_toast.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/panel_snapshot_local.xml39
-rw-r--r--indra/newview/skins/default/xui/zh/panel_snapshot_options.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/panel_snapshot_postcard.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/panel_snapshot_profile.xml28
-rw-r--r--indra/newview/skins/default/xui/zh/panel_sound_devices.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_status_bar.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/panel_volume_pulldown.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/sidepanel_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/sidepanel_item_info.xml3
-rw-r--r--indra/newview/skins/default/xui/zh/sidepanel_task_info.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/strings.xml503
-rw-r--r--indra/newview/skins/default/xui/zh/teleport_strings.xml10
-rw-r--r--indra/newview/skins/paths.xml10
-rw-r--r--indra/newview/skins/steam/xui/da/strings.xml4483
-rw-r--r--indra/newview/skins/steam/xui/de/strings.xml5018
-rw-r--r--indra/newview/skins/steam/xui/en/strings.xml3761
-rw-r--r--indra/newview/skins/steam/xui/es/strings.xml4925
-rw-r--r--indra/newview/skins/steam/xui/fr/strings.xml5018
-rw-r--r--indra/newview/skins/steam/xui/it/strings.xml4928
-rw-r--r--indra/newview/skins/steam/xui/ja/strings.xml5018
-rw-r--r--indra/newview/skins/steam/xui/pl/strings.xml4340
-rw-r--r--indra/newview/skins/steam/xui/pt/strings.xml4885
-rw-r--r--indra/newview/skins/steam/xui/ru/strings.xml5024
-rw-r--r--indra/newview/skins/steam/xui/tr/strings.xml5025
-rw-r--r--indra/newview/skins/steam/xui/zh/strings.xml4454
-rw-r--r--indra/newview/tests/lldir_stub.cpp4
-rw-r--r--indra/newview/tests/lltranslate_test.cpp7
-rw-r--r--[-rwxr-xr-x]indra/newview/tests/llviewerassetstats_test.cpp0
-rw-r--r--indra/newview/viewer_manifest.py283
764 files changed, 38399 insertions, 87228 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 0031362210..bd0169fb2f 100755..100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -18,6 +18,7 @@ include(JsonCpp)
include(LLAudio)
include(LLCharacter)
include(LLCommon)
+include(LLCoreHttp)
include(LLImage)
include(LLImageJ2COJ)
include(LLInventory)
@@ -34,6 +35,7 @@ include(LLXML)
include(LScript)
include(Linking)
include(NDOF)
+include(NVAPI)
include(GooglePerfTools)
include(TemplateCheck)
include(UI)
@@ -57,6 +59,7 @@ include_directories(
${LLAUDIO_INCLUDE_DIRS}
${LLCHARACTER_INCLUDE_DIRS}
${LLCOMMON_INCLUDE_DIRS}
+ ${LLCOREHTTP_INCLUDE_DIRS}
${LLPHYSICS_INCLUDE_DIRS}
${FMOD_INCLUDE_DIR}
${LLIMAGE_INCLUDE_DIRS}
@@ -97,6 +100,7 @@ set(viewer_SOURCE_FILES
llagentwearables.cpp
llagentwearablesfetch.cpp
llanimstatelabels.cpp
+ llappcorehttp.cpp
llappearancemgr.cpp
llappviewer.cpp
llappviewerlistener.cpp
@@ -110,12 +114,13 @@ set(viewer_SOURCE_FILES
llavatarlist.cpp
llavatarlistitem.cpp
llavatarpropertiesprocessor.cpp
+ llblockedlistitem.cpp
+ llblocklist.cpp
llbox.cpp
llbreadcrumbview.cpp
llbrowsernotification.cpp
llbuycurrencyhtml.cpp
llcallbacklist.cpp
- llcallfloater.cpp
llcallingcard.cpp
llcapabilitylistener.cpp
llcaphttpsender.cpp
@@ -133,16 +138,24 @@ set(viewer_SOURCE_FILES
llcommanddispatcherlistener.cpp
llcommandhandler.cpp
llcommandlineparser.cpp
+ llcommunicationchannel.cpp
llcompilequeue.cpp
llconfirmationmanager.cpp
+ llconversationlog.cpp
+ llconversationloglist.cpp
+ llconversationloglistitem.cpp
+ llconversationmodel.cpp
+ llconversationview.cpp
llcurrencyuimanager.cpp
llcylinder.cpp
lldateutil.cpp
lldaycyclemanager.cpp
lldebugmessagebox.cpp
lldebugview.cpp
+ lldeferredsounds.cpp
lldelayedgestureerror.cpp
lldirpicker.cpp
+ lldonotdisturbnotificationstorage.cpp
lldndbutton.cpp
lldrawable.cpp
lldrawpool.cpp
@@ -190,7 +203,10 @@ set(viewer_SOURCE_FILES
llfloaterbuycurrencyhtml.cpp
llfloaterbuyland.cpp
llfloatercamera.cpp
+ llfloaterchatvoicevolume.cpp
llfloatercolorpicker.cpp
+ llfloaterconversationlog.cpp
+ llfloaterconversationpreview.cpp
llfloaterdeleteenvpreset.cpp
llfloaterdestinations.cpp
llfloaterdisplayname.cpp
@@ -258,13 +274,13 @@ set(viewer_SOURCE_FILES
llfloateruipreview.cpp
llfloaterurlentry.cpp
llfloatervoiceeffect.cpp
+ llfloatervoicevolume.cpp
llfloaterwebcontent.cpp
llfloaterwebprofile.cpp
llfloaterwhitelistentry.cpp
llfloaterwindowsize.cpp
llfloaterworldmap.cpp
- llfolderview.cpp
- llfolderviewitem.cpp
+ llfolderviewmodelinventory.cpp
llfollowcam.cpp
llfriendcard.cpp
llgesturelistener.cpp
@@ -290,8 +306,9 @@ set(viewer_SOURCE_FILES
llhudrender.cpp
llhudtext.cpp
llhudview.cpp
- llimfloater.cpp
- llimfloatercontainer.cpp
+ llfloaterimsessiontab.cpp
+ llfloaterimsession.cpp
+ llfloaterimcontainer.cpp
llimhandler.cpp
llimview.cpp
llinspect.cpp
@@ -333,7 +350,7 @@ set(viewer_SOURCE_FILES
llmarketplacenotifications.cpp
llmediactrl.cpp
llmediadataclient.cpp
- llmemoryview.cpp
+ llmenuoptionpathfindingrebakenavmesh.cpp
llmeshrepository.cpp
llmimetypes.cpp
llmorphview.cpp
@@ -343,10 +360,9 @@ set(viewer_SOURCE_FILES
llnameeditor.cpp
llnamelistctrl.cpp
llnavigationbar.cpp
- llnearbychat.cpp
- llnearbychatbar.cpp
- llnearbychathandler.cpp
- llnearbychatbarlistener.cpp
+ llfloaterimnearbychat.cpp
+ llfloaterimnearbychathandler.cpp
+ llfloaterimnearbychatlistener.cpp
llnetmap.cpp
llnotificationalerthandler.cpp
llnotificationgrouphandler.cpp
@@ -376,7 +392,6 @@ set(viewer_SOURCE_FILES
llpanelgroupnotices.cpp
llpanelgrouproles.cpp
llpanelhome.cpp
- llpanelimcontrolpanel.cpp
llpanelland.cpp
llpanellandaudio.cpp
llpanellandmarkinfo.cpp
@@ -387,7 +402,6 @@ set(viewer_SOURCE_FILES
llpanelmaininventory.cpp
llpanelmarketplaceinbox.cpp
llpanelmarketplaceinboxinventory.cpp
- llpanelmarketplaceoutboxinventory.cpp
llpanelmediasettingsgeneral.cpp
llpanelmediasettingspermissions.cpp
llpanelmediasettingssecurity.cpp
@@ -398,7 +412,6 @@ set(viewer_SOURCE_FILES
llpanelonlinestatus.cpp
llpaneloutfitedit.cpp
llpaneloutfitsinventory.cpp
- llpanelpathfindingrebakenavmesh.cpp
llpanelpeople.cpp
llpanelpeoplemenus.cpp
llpanelpermissions.cpp
@@ -438,10 +451,12 @@ set(viewer_SOURCE_FILES
llpathfindingobject.cpp
llpathfindingobjectlist.cpp
llpathfindingpathtool.cpp
+ llpersistentnotificationstorage.cpp
llphysicsmotion.cpp
llphysicsshapebuilderutil.cpp
llplacesinventorybridge.cpp
llplacesinventorypanel.cpp
+ llplacesfolderview.cpp
llpopupview.cpp
llpolymesh.cpp
llpolymorph.cpp
@@ -672,6 +687,7 @@ set(viewer_HEADER_FILES
llagentwearables.h
llagentwearablesfetch.h
llanimstatelabels.h
+ llappcorehttp.h
llappearance.h
llappearancemgr.h
llappviewer.h
@@ -686,11 +702,12 @@ set(viewer_HEADER_FILES
llavatarlist.h
llavatarlistitem.h
llavatarpropertiesprocessor.h
+ llblockedlistitem.h
+ llblocklist.h
llbox.h
llbreadcrumbview.h
llbuycurrencyhtml.h
llcallbacklist.h
- llcallfloater.h
llcallingcard.h
llcapabilitylistener.h
llcapabilityprovider.h
@@ -709,16 +726,24 @@ set(viewer_HEADER_FILES
llcommanddispatcherlistener.h
llcommandhandler.h
llcommandlineparser.h
+ llcommunicationchannel.h
llcompilequeue.h
llconfirmationmanager.h
+ llconversationlog.h
+ llconversationloglist.h
+ llconversationloglistitem.h
+ llconversationmodel.h
+ llconversationview.h
llcurrencyuimanager.h
llcylinder.h
lldateutil.h
lldaycyclemanager.h
lldebugmessagebox.h
lldebugview.h
+ lldeferredsounds.h
lldelayedgestureerror.h
lldirpicker.h
+ lldonotdisturbnotificationstorage.h
lldndbutton.h
lldrawable.h
lldrawpool.h
@@ -766,7 +791,10 @@ set(viewer_HEADER_FILES
llfloaterbuycurrencyhtml.h
llfloaterbuyland.h
llfloatercamera.h
+ llfloaterchatvoicevolume.h
llfloatercolorpicker.h
+ llfloaterconversationlog.h
+ llfloaterconversationpreview.h
llfloaterdeleteenvpreset.h
llfloaterdestinations.h
llfloaterdisplayname.h
@@ -834,14 +862,13 @@ set(viewer_HEADER_FILES
llfloateruipreview.h
llfloaterurlentry.h
llfloatervoiceeffect.h
+ llfloatervoicevolume.h
llfloaterwebcontent.h
llfloaterwebprofile.h
llfloaterwhitelistentry.h
llfloaterwindowsize.h
llfloaterworldmap.h
- llfolderview.h
- llfoldervieweventlistener.h
- llfolderviewitem.h
+ llfolderviewmodelinventory.h
llfollowcam.h
llfriendcard.h
llgesturelistener.h
@@ -866,8 +893,9 @@ set(viewer_HEADER_FILES
llhudrender.h
llhudtext.h
llhudview.h
- llimfloater.h
- llimfloatercontainer.h
+ llfloaterimsessiontab.h
+ llfloaterimsession.h
+ llfloaterimcontainer.h
llimview.h
llinspect.h
llinspectavatar.h
@@ -909,7 +937,7 @@ set(viewer_HEADER_FILES
llmarketplacenotifications.h
llmediactrl.h
llmediadataclient.h
- llmemoryview.h
+ llmenuoptionpathfindingrebakenavmesh.h
llmeshrepository.h
llmimetypes.h
llmorphview.h
@@ -919,10 +947,9 @@ set(viewer_HEADER_FILES
llnameeditor.h
llnamelistctrl.h
llnavigationbar.h
- llnearbychat.h
- llnearbychatbar.h
- llnearbychathandler.h
- llnearbychatbarlistener.h
+ llfloaterimnearbychat.h
+ llfloaterimnearbychathandler.h
+ llfloaterimnearbychatlistener.h
llnetmap.h
llnotificationhandler.h
llnotificationmanager.h
@@ -946,7 +973,6 @@ set(viewer_HEADER_FILES
llpanelgroupnotices.h
llpanelgrouproles.h
llpanelhome.h
- llpanelimcontrolpanel.h
llpanelland.h
llpanellandaudio.h
llpanellandmarkinfo.h
@@ -957,7 +983,6 @@ set(viewer_HEADER_FILES
llpanelmaininventory.h
llpanelmarketplaceinbox.h
llpanelmarketplaceinboxinventory.h
- llpanelmarketplaceoutboxinventory.h
llpanelmediasettingsgeneral.h
llpanelmediasettingspermissions.h
llpanelmediasettingssecurity.h
@@ -968,7 +993,6 @@ set(viewer_HEADER_FILES
llpanelonlinestatus.h
llpaneloutfitedit.h
llpaneloutfitsinventory.h
- llpanelpathfindingrebakenavmesh.h
llpanelpeople.h
llpanelpeoplemenus.h
llpanelpermissions.h
@@ -1003,10 +1027,12 @@ set(viewer_HEADER_FILES
llpathfindingobject.h
llpathfindingobjectlist.h
llpathfindingpathtool.h
+ llpersistentnotificationstorage.h
llphysicsmotion.h
llphysicsshapebuilderutil.h
llplacesinventorybridge.h
llplacesinventorypanel.h
+ llplacesfolderview.h
llpolymesh.h
llpolymorph.h
llpopupview.h
@@ -1564,9 +1590,10 @@ set(PACKAGE ON CACHE BOOL
if (WINDOWS)
set_target_properties(${VIEWER_BINARY_NAME}
PROPERTIES
- LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS ${TCMALLOC_LINK_FLAGS}"
- LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO"
- LINK_FLAGS_RELEASE "/FORCE:MULTIPLE /MAP\"secondlife-bin.MAP\" /OPT:REF"
+ # *TODO -reenable this once we get server usage sorted out
+ LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS ${TCMALLOC_LINK_FLAGS} /LARGEADDRESSAWARE"
+ LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO /LARGEADDRESSAWARE"
+ LINK_FLAGS_RELEASE "/FORCE:MULTIPLE /MAP\"secondlife-bin.MAP\" /OPT:REF /LARGEADDRESSAWARE"
)
if(USE_PRECOMPILED_HEADERS)
set_target_properties(
@@ -1811,8 +1838,10 @@ target_link_libraries(${VIEWER_BINARY_NAME}
${LLXML_LIBRARIES}
${LSCRIPT_LIBRARIES}
${LLMATH_LIBRARIES}
+ ${LLCOREHTTP_LIBRARIES}
${LLCOMMON_LIBRARIES}
${NDOF_LIBRARY}
+ ${NVAPI_LIBRARY}
${HUNSPELL_LIBRARY}
${viewer_LIBRARIES}
${BOOST_PROGRAM_OPTIONS_LIBRARY}
@@ -1861,7 +1890,6 @@ if (LINUX)
set(COPY_INPUT_DEPENDENCIES
${VIEWER_BINARY_NAME}
linux-crash-logger
- linux-updater
SLPlugin
media_plugin_webkit
media_plugin_gstreamer010
@@ -1992,8 +2020,9 @@ if (INSTALL)
endif (INSTALL)
if (PACKAGE)
+ set(SYMBOL_SEARCH_DIRS "")
if (WINDOWS)
- set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}")
+ list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}")
set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-windows.tar.bz2")
# slplugin.exe failing symbols dump - need to debug, might have to do with updated version of google breakpad
# set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe")
@@ -2002,13 +2031,20 @@ if (PACKAGE)
set(VIEWER_COPY_MANIFEST copy_w_viewer_manifest)
endif (WINDOWS)
if (DARWIN)
- set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app")
+ list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}")
+ # *TODO: Generate these search dirs in the cmake files related to each binary.
+ list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/llplugin/slplugin/${CMAKE_CFG_INTDIR}")
+ list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/mac_crash_logger/${CMAKE_CFG_INTDIR}")
+ list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/mac_updater/${CMAKE_CFG_INTDIR}")
+ list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/gstreamer010/${CMAKE_CFG_INTDIR}")
+ list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}")
+ list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/webkit/${CMAKE_CFG_INTDIR}")
set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-darwin.tar.bz2")
- set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin")
+ set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin mac-updater mac-crash-logger")
set(VIEWER_LIB_GLOB "*.dylib")
endif (DARWIN)
if (LINUX)
- set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/packaged")
+ list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/packaged")
set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-linux.tar.bz2")
set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin")
set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*")
@@ -2028,7 +2064,7 @@ if (PACKAGE)
ARGS
"${CMAKE_CURRENT_SOURCE_DIR}/generate_breakpad_symbols.py"
"${LLBUILD_CONFIG}"
- "${VIEWER_DIST_DIR}"
+ "${SYMBOL_SEARCH_DIRS}"
"${VIEWER_EXE_GLOBS}"
"${VIEWER_LIB_GLOB}"
"${AUTOBUILD_INSTALL_DIR}/bin/dump_syms"
@@ -2065,6 +2101,12 @@ if (LL_TESTS)
LL_TEST_ADDITIONAL_LIBRARIES "${JSONCPP_LIBRARIES}"
)
+ set_source_files_properties(
+ lllogininstance.cpp
+ PROPERTIES
+ LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}"
+ )
+
##################################################
# DISABLING PRECOMPILED HEADERS USAGE FOR TESTS
##################################################
diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml
index 73df064ab2..4659673333 100644
--- a/indra/newview/app_settings/commands.xml
+++ b/indra/newview/app_settings/commands.xml
@@ -44,13 +44,14 @@
/>
<command name="chat"
available_in_toybox="true"
+ is_flashing_allowed="true"
icon="Command_Chat_Icon"
label_ref="Command_Chat_Label"
- tooltip_ref="Command_Chat_Tooltip"
+ tooltip_ref="Command_Conversations_Tooltip"
execute_function="Floater.ToggleOrBringToFront"
- execute_parameters="chat_bar"
+ execute_parameters="im_container"
is_running_function="Floater.IsOpen"
- is_running_parameters="chat_bar"
+ is_running_parameters="im_container"
/>
<command name="compass"
available_in_toybox="false"
@@ -239,14 +240,4 @@
is_running_function="Floater.IsOpen"
is_running_parameters="camera"
/>
- <command name="voice"
- available_in_toybox="true"
- icon="Command_Voice_Icon"
- label_ref="Command_Voice_Label"
- tooltip_ref="Command_Voice_Tooltip"
- execute_function="Floater.ToggleOrBringToFront"
- execute_parameters="voice_controls"
- is_running_function="Floater.IsOpen"
- is_running_parameters="voice_controls"
- />
</commands>
diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml
index 64122bbb6c..92a241857e 100755..100644
--- a/indra/newview/app_settings/logcontrol.xml
+++ b/indra/newview/app_settings/logcontrol.xml
@@ -48,6 +48,6 @@
-->
</array>
</map>
- </array>
+ </array>
</map>
</llsd>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 5e42fc29f7..f2e1e7f7d4 100755..100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -2,6 +2,28 @@
<llsd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="llsd.xsd">
<map>
+ <key>IMShowTime</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable(disable) timestamp showing in the chat.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>IMShowNamesForP2PConv</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable(disable) showing of a names in the chat.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>CrashHostUrl</key>
<map>
<key>Comment</key>
@@ -47,7 +69,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>0.95</real>
+ <real>1</real>
</map>
<key>AdvanceSnapshot</key>
<map>
@@ -1562,6 +1584,28 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>ChatLoadGroupMaxMembers</key>
+ <map>
+ <key>Comment</key>
+ <string>Max number of active members we'll show up for an unresponsive group</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <real>100</real>
+ </map>
+ <key>ChatLoadGroupTimeout</key>
+ <map>
+ <key>Comment</key>
+ <string>Time we give the server to send group participants before we hit the server for group info (seconds)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>10.0</real>
+ </map>
<key>ChatOnlineNotification</key>
<map>
<key>Comment</key>
@@ -1595,17 +1639,6 @@
<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>
@@ -1628,6 +1661,61 @@
<key>Value</key>
<string />
</map>
+ <key>ContextConeInAlpha</key>
+ <map>
+ <key>Comment</key>
+ <string>Cone In Alpha</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.0</real>
+ </map>
+ <key>ContextConeOutAlpha</key>
+ <map>
+ <key>Comment</key>
+ <string>Cone Out Alpha</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1.0</real>
+ </map>
+ <key>ContextConeFadeTime</key>
+ <map>
+ <key>Comment</key>
+ <string>Cone Fade Time</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>.08</real>
+ </map>
+ <key>ConversationHistoryPageSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Chat history of conversation opened from call log is displayed by pages. So this is number of entries per page.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>100</integer>
+ </map>
+ <key>ConversationSortOrder</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies sort key for conversations</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>131073</integer>
+ </map>
<key>CloseChatOnReturn</key>
<map>
<key>Comment</key>
@@ -4051,17 +4139,6 @@
<key>Value</key>
<integer>305</integer>
</map>
- <key>HelpUseLocal</key>
- <map>
- <key>Comment</key>
- <string>If set, always use this for help: skins/default/html/[LANGUAGE]/help-offline/index.html</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>HelpURLFormat</key>
<map>
<key>Comment</key>
@@ -4194,6 +4271,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>IMShowContentPanel</key>
+ <map>
+ <key>Comment</key>
+ <string>Show Toolbar and Body Panels</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>
@@ -4236,7 +4324,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>0.65</real>
+ <real>0.95</real>
</map>
<key>InBandwidth</key>
<map>
@@ -5179,7 +5267,7 @@
<key>Comment</key>
<string>Center the focal point of the minimap.</string>
<key>Persist</key>
- <integer>0</integer>
+ <integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
@@ -5766,7 +5854,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
<key>MemoryPrivatePoolSize</key>
<map>
@@ -6219,6 +6307,61 @@
<key>Value</key>
<integer>305</integer>
</map>
+ <key>NotificationConferenceIMOptions</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies how the UI responds to Conference IM Notifications.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>toast</string>
+ </map>
+ <key>NotificationFriendIMOptions</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies how the UI responds to Friend IM Notifications.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>toast</string>
+ </map>
+ <key>NotificationGroupChatOptions</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies how the UI responds to Group Chat Notifications.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>toast</string>
+ </map>
+ <key>NotificationNearbyChatOptions</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies how the UI responds to Nearby Chat Notifications.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>toast</string>
+ </map>
+ <key>NotificationNonFriendIMOptions</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies how the UI responds to Non Friend IM Notifications.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>toast</string>
+ </map>
<key>NotificationToastLifeTime</key>
<map>
<key>Comment</key>
@@ -6735,6 +6878,50 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>PlaySoundIncomingVoiceCall</key>
+ <map>
+ <key>Comment</key>
+ <string>Plays a sound when have an incoming voice call.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>PlaySoundInventoryOffer</key>
+ <map>
+ <key>Comment</key>
+ <string>Plays a sound when have an inventory offer.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>PlaySoundNewConversation</key>
+ <map>
+ <key>Comment</key>
+ <string>Plays a sound when have a new conversation.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>PlaySoundTeleportOffer</key>
+ <map>
+ <key>Comment</key>
+ <string>Plays a sound when have a teleport offer.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>PluginAttachDebuggerToPlugins</key>
<map>
<key>Comment</key>
@@ -9846,7 +10033,7 @@
<key>ShowScriptErrorsLocation</key>
<map>
<key>Comment</key>
- <string>Show script error in chat or window</string>
+ <string>Show script error in chat (0) or window (1).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -10030,6 +10217,39 @@
<key>Value</key>
<integer>2</integer>
</map>
+ <key>BlockPeopleSortOrder</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies sort order for recent people (0 = by name, 1 = by type)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>CallLogSortOrder</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies sort order for Call Log (0 = by name, 1 = by date)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>SortFriendsFirst</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies whether friends will be sorted first in Call Log</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>ShowPGSearchAll</key>
<map>
<key>Comment</key>
@@ -10789,6 +11009,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>TextureFetchConcurrency</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of HTTP connections used for texture fetches</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>TextureFetchDebuggerEnabled</key>
<map>
<key>Comment</key>
@@ -10853,7 +11084,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <integer>0.0</integer>
+ <real>0.0</real>
</map>
<key>TextureFetchUpdateSkipLowPriority</key>
<map>
@@ -12373,16 +12604,16 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>SpeakerParticipantDefaultOrder</key>
+ <key>sourceid</key>
<map>
<key>Comment</key>
- <string>Order for displaying speakers in voice controls. 0 = alphabetical. 1 = recent.</string>
+ <string>Identify referring agency to Linden web servers</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>U32</string>
+ <string>String</string>
<key>Value</key>
- <integer>1</integer>
+ <string />
</map>
<key>SpeakerParticipantRemoveDelay</key>
<map>
@@ -12428,6 +12659,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>UsePeopleAPI</key>
+ <map>
+ <key>Comment</key>
+ <string>Use the people API cap for avatar name fetching, use old legacy protocol if false. Requires restart.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>UseStartScreen</key>
<map>
<key>Comment</key>
@@ -12481,6 +12723,7 @@
<key>Type</key>
<string>LLSD</string>
<key>Value</key>
+ <array/>
</map>
<key>VFSOldSize</key>
<map>
@@ -12922,10 +13165,10 @@
<key>Value</key>
<real>50.0</real>
</map>
- <key>WellIconFlashCount</key>
+ <key>FlashCount</key>
<map>
<key>Comment</key>
- <string>Number of flashes of IM Well and Notification Well icons after which flashing buttons stay lit up. Requires restart.</string>
+ <string>Number of flashes of item. Requires restart.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -12933,16 +13176,16 @@
<key>Value</key>
<integer>3</integer>
</map>
- <key>WellIconFlashPeriod</key>
+ <key>FlashPeriod</key>
<map>
<key>Comment</key>
- <string>Period at which IM Well and Notification Well icons flash (seconds). Requires restart.</string>
+ <string>Period at which item flash (seconds). Requires restart.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>0.25</real>
+ <real>0.5</real>
</map>
<key>WindLightUseAtmosShaders</key>
<map>
@@ -14059,5 +14302,29 @@
<real>1.0</real>
</array>
</map>
+
+ <key>HideUIControls</key>
+ <map>
+ <key>Comment</key>
+ <string>Hide all menu items and buttons</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+
+ <key>SimulateFBOFailure</key>
+ <map>
+ <key>Comment</key>
+ <string>[DEBUG] Make allocateScreenBuffer return false. Used to test error handling.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
</map>
</llsd>
diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml
index 01a70f2671..e660c1a33b 100644
--- a/indra/newview/app_settings/settings_minimal.xml
+++ b/indra/newview/app_settings/settings_minimal.xml
@@ -1 +1,4 @@
-<llsd/> \ No newline at end of file
+<?xml version="1.0"?>
+<llsd>
+ <undef/>
+</llsd>
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index 143126b334..ada374f892 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -1,9 +1,9 @@
<llsd>
<map>
- <key>BusyResponseChanged</key>
+ <key>DoNotDisturbResponseChanged</key>
<map>
<key>Comment</key>
- <string>Does user's busy mode message differ from default?</string>
+ <string>Does user's do not disturb mode message differ from default?</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -11,17 +11,72 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>BusyModeResponse</key>
+ <key>DoNotDisturbModeResponse</key>
<map>
<key>Comment</key>
- <string>Auto response to instant messages while in busy mode.</string>
+ <string>Auto response to instant messages while in do not disturb mode.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>The Resident you messaged is in &apos;busy mode&apos; which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing.</string>
+ <string>This resident has turned on &apos;Do Not Disturb&apos; and will see your message later.</string>
</map>
+ <key>ConversationsExpandMessagePaneFirst</key>
+ <map>
+ <key>Comment</key>
+ <string>Expand either messages or conversations list pane from Conversations compact mode.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ConversationsListPaneCollapsed</key>
+ <map>
+ <key>Comment</key>
+ <string>Stores the expanded/collapsed state of the conversations list pane in Conversations floater.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ConversationsListPaneWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>Conversations floater list pane width.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>205</integer>
+ </map>
+ <key>ConversationsMessagePaneCollapsed</key>
+ <map>
+ <key>Comment</key>
+ <string>Stores the expanded/collapsed state of Conversations floater message pane.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ConversationsMessagePaneWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>Conversations floater message pane width.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>412</integer>
+ </map>
<key>InstantMessageLogPath</key>
<map>
<key>Comment</key>
@@ -121,17 +176,6 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>LogInstantMessages</key>
- <map>
- <key>Comment</key>
- <string>Log Instant Messages</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>LogShowHistory</key>
<map>
<key>Comment</key>
@@ -215,7 +259,40 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>ShowFavoritesOnLogin</key>
+ <key>TranslatingEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Translation prefs are set</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>KeepConversationLogTranscripts</key>
+ <map>
+ <key>Comment</key>
+ <string>Keep a conversation log and transcripts</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>2</integer>
+ </map>
+ <key>NearbyChatIsNotTornOff</key>
+ <map>
+ <key>Comment</key>
+ <string>saving torn-off state of the nearby chat between sessions</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ShowFavoritesOnLogin</key>
<map>
<key>Comment</key>
<string>Determines whether favorites of last logged in user will be saved on exit from viewer and shown on login screen</string>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl
index e02a7b405b..2cef8f2a5d 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl
@@ -2093,7 +2093,6 @@ uniform sampler2D diffuseMap;
uniform vec2 rcp_screen_res;
uniform vec4 rcp_frame_opt;
uniform vec4 rcp_frame_opt2;
-uniform vec2 screen_res;
VARYING vec2 vary_fragcoord;
VARYING vec2 vary_tc;
diff --git a/indra/newview/app_settings/shaders/class1/objects/previewF.glsl b/indra/newview/app_settings/shaders/class1/objects/previewF.glsl
new file mode 100644
index 0000000000..284da3d0ac
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/previewF.glsl
@@ -0,0 +1,41 @@
+/**
+ * @file previewF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2D diffuseMap;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
+ frag_color = color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
index 5dcfa87066..7f3f84398b 100644
--- a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
@@ -32,12 +32,51 @@ ATTRIBUTE vec3 position;
ATTRIBUTE vec3 normal;
ATTRIBUTE vec2 texcoord0;
+uniform vec4 color;
+
VARYING vec4 vertex_color;
VARYING vec2 vary_texcoord0;
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
+//===================================================================================================
+//declare these here explicitly to separate them from atmospheric lighting elsewhere to work around
+//drivers that are picky about functions being declared but not defined even if they aren't called
+float calcDirectionalLight(vec3 n, vec3 l)
+{
+ float a = max(dot(n,l),0.0);
+ return a;
+}
+
+
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight)
+{
+ //get light vector
+ vec3 lv = lp.xyz-v;
+
+ //get distance
+ float d = length(lv);
+
+ //normalize light vector
+ lv *= 1.0/d;
+
+ //distance attenuation
+ float da = clamp(1.0/(la * d), 0.0, 1.0);
+
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
+
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+
+ return da;
+}
+//====================================================================================================
-vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
-void calcAtmospherics(vec3 inPositionEye);
void main()
{
@@ -45,13 +84,15 @@ void main()
vec4 pos = (modelview_matrix * vec4(position.xyz, 1.0));
gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
-
+
vec3 norm = normalize(normal_matrix * normal);
- calcAtmospherics(pos.xyz);
-
- vec4 color = calcLighting(pos.xyz, norm, vec4(1,1,1,1), vec4(0.));
- vertex_color = color;
+ vec4 col = vec4(0,0,0,1);
-
+ // Collect normal lights (need to be divided by two, as we later multiply by 2)
+ col.rgb += light_diffuse[1].rgb * calcDirectionalLight(norm, light_position[1].xyz);
+ col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].z);
+ col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].z);
+
+ vertex_color = col*color;
}
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index eeb632acaf..4030324ecb 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -1,4 +1,4 @@
-version 32
+version 33
// The version number above should be implemented IF AND ONLY IF some
// change has been made that is sufficiently important to justify
// resetting the graphics preferences of all users to the recommended
@@ -97,10 +97,10 @@ RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
-WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+WLSkyDetail 1 48
RenderFSAASamples 1 0
@@ -129,16 +129,16 @@ RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
-WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+WLSkyDetail 1 48
RenderFSAASamples 1 0
//
-// Mid Graphics Settings
+// Medium Low Graphics Settings
//
-list Mid
+list LowMid
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0.5
@@ -159,16 +159,16 @@ RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
-WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+WLSkyDetail 1 48
RenderFSAASamples 1 0
//
-// High Graphics Settings (purty)
+// Medium Graphics Settings (standard)
//
-list High
+list Mid
RenderAnisotropic 1 1
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 1.0
@@ -189,12 +189,103 @@ RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
-WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+WLSkyDetail 1 48
+RenderFSAASamples 1 2
+
+//
+// Medium High Graphics Settings (deferred enabled)
+//
+list MidHigh
+RenderAnisotropic 1 1
+RenderAvatarCloth 1 0
+RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
+RenderAvatarVP 1 1
+RenderFarClip 1 128
+RenderFlexTimeFactor 1 1.0
+RenderGlowResolutionPow 1 9
+RenderMaxPartCount 1 4096
+RenderObjectBump 1 1
+RenderLocalLights 1 1
+RenderReflectionDetail 1 0
+RenderTerrainDetail 1 1
+RenderTerrainLODFactor 1 2.0
+RenderTransparentWater 1 1
+RenderTreeLODFactor 1 0.5
+RenderUseImpostors 1 1
+RenderVolumeLODFactor 1 1.125
+VertexShaderEnable 1 1
+WindLightUseAtmosShaders 1 1
+RenderDeferred 1 1
+RenderDeferredSSAO 1 0
+RenderShadowDetail 1 0
+WLSkyDetail 1 48
+RenderFSAASamples 1 2
+
+//
+// High Graphics Settings (deferred + SSAO)
+//
+list High
+RenderAnisotropic 1 1
+RenderAvatarCloth 1 0
+RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
+RenderAvatarVP 1 1
+RenderFarClip 1 128
+RenderFlexTimeFactor 1 1.0
+RenderGlowResolutionPow 1 9
+RenderMaxPartCount 1 4096
+RenderObjectBump 1 1
+RenderLocalLights 1 1
+RenderReflectionDetail 1 0
+RenderTerrainDetail 1 1
+RenderTerrainLODFactor 1 2.0
+RenderTransparentWater 1 1
+RenderTreeLODFactor 1 0.5
+RenderUseImpostors 1 1
+RenderVolumeLODFactor 1 1.125
+VertexShaderEnable 1 1
+WindLightUseAtmosShaders 1 1
+RenderDeferred 1 1
+RenderDeferredSSAO 1 1
+RenderShadowDetail 1 0
+WLSkyDetail 1 48
+RenderFSAASamples 1 2
+
+//
+// High Ultra Graphics Settings (deferred + SSAO + shadows)
+//
+list HighUltra
+RenderAnisotropic 1 1
+RenderAvatarCloth 1 0
+RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
+RenderAvatarVP 1 1
+RenderFarClip 1 128
+RenderFlexTimeFactor 1 1.0
+RenderGlowResolutionPow 1 9
+RenderMaxPartCount 1 4096
+RenderObjectBump 1 1
+RenderLocalLights 1 1
+RenderReflectionDetail 1 0
+RenderTerrainDetail 1 1
+RenderTerrainLODFactor 1 2.0
+RenderTransparentWater 1 1
+RenderTreeLODFactor 1 0.5
+RenderUseImpostors 1 1
+RenderVolumeLODFactor 1 1.125
+VertexShaderEnable 1 1
+WindLightUseAtmosShaders 1 1
+RenderDeferred 1 1
+RenderDeferredSSAO 1 1
+RenderShadowDetail 1 2
+WLSkyDetail 1 48
RenderFSAASamples 1 2
+
//
// Ultra graphics (REALLY PURTY!)
//
@@ -230,6 +321,9 @@ RenderFSAASamples 1 2
//
list Unknown
RenderVBOEnable 1 0
+RenderShadowDetail 1 0
+RenderDeferred 1 0
+RenderDeferredSSAO 1 0
//
// Class 0 Hardware (just old)
@@ -244,18 +338,30 @@ list Class1
RenderVBOEnable 1 1
//
-// Class 2 Hardware (make it purty)
+// Class 2 Hardware
//
list Class2
RenderVBOEnable 1 1
//
-// Class 3 Hardware (make it purty)
+// Class 3 Hardware
//
list Class3
RenderVBOEnable 1 1
//
+// Class 4 Hardware
+//
+list Class4
+RenderVBOEnable 1 1
+
+//
+// Class 5 Hardware
+//
+list Class5
+RenderVBOEnable 1 1
+
+//
// VRAM > 512MB
//
list VRAMGT512
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index 3a0e7e3697..6d5284c602 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -1,4 +1,4 @@
-version 27
+version 28
// The version number above should be implemented IF AND ONLY IF some
// change has been made that is sufficiently important to justify
// resetting the graphics preferences of all users to the recommended
@@ -94,10 +94,10 @@ RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
-WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+WLSkyDetail 1 48
RenderFSAASamples 1 0
//
@@ -125,16 +125,16 @@ RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
-WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+WLSkyDetail 1 48
RenderFSAASamples 1 0
//
-// Mid Graphics Settings
+// Medium Low Graphics Settings
//
-list Mid
+list LowMid
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0.5
@@ -143,9 +143,9 @@ RenderAvatarVP 1 1
RenderFarClip 1 96
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 8
-RenderLocalLights 1 1
RenderMaxPartCount 1 2048
RenderObjectBump 1 1
+RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 1.0
@@ -155,16 +155,16 @@ RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
-WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+WLSkyDetail 1 48
RenderFSAASamples 1 0
//
-// High Graphics Settings (purty)
+// Medium Graphics Settings (standard)
//
-list High
+list Mid
RenderAnisotropic 1 1
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 1.0
@@ -173,9 +173,9 @@ RenderAvatarVP 1 1
RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
-RenderLocalLights 1 1
RenderMaxPartCount 1 4096
RenderObjectBump 1 1
+RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
@@ -185,10 +185,100 @@ RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
-WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+WLSkyDetail 1 48
+RenderFSAASamples 1 2
+
+//
+// Medium High Graphics Settings (deferred enabled)
+//
+list MidHigh
+RenderAnisotropic 1 1
+RenderAvatarCloth 1 0
+RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
+RenderAvatarVP 1 1
+RenderFarClip 1 128
+RenderFlexTimeFactor 1 1.0
+RenderGlowResolutionPow 1 9
+RenderMaxPartCount 1 4096
+RenderObjectBump 1 1
+RenderLocalLights 1 1
+RenderReflectionDetail 1 0
+RenderTerrainDetail 1 1
+RenderTerrainLODFactor 1 2.0
+RenderTransparentWater 1 1
+RenderTreeLODFactor 1 0.5
+RenderUseImpostors 1 1
+RenderVolumeLODFactor 1 1.125
+VertexShaderEnable 1 1
+WindLightUseAtmosShaders 1 1
+RenderDeferred 1 1
+RenderDeferredSSAO 1 0
+RenderShadowDetail 1 0
+WLSkyDetail 1 48
+RenderFSAASamples 1 2
+
+//
+// High Graphics Settings (deferred + SSAO)
+//
+list High
+RenderAnisotropic 1 1
+RenderAvatarCloth 1 0
+RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
+RenderAvatarVP 1 1
+RenderFarClip 1 128
+RenderFlexTimeFactor 1 1.0
+RenderGlowResolutionPow 1 9
+RenderMaxPartCount 1 4096
+RenderObjectBump 1 1
+RenderLocalLights 1 1
+RenderReflectionDetail 1 0
+RenderTerrainDetail 1 1
+RenderTerrainLODFactor 1 2.0
+RenderTransparentWater 1 1
+RenderTreeLODFactor 1 0.5
+RenderUseImpostors 1 1
+RenderVolumeLODFactor 1 1.125
+VertexShaderEnable 1 1
+WindLightUseAtmosShaders 1 1
+RenderDeferred 1 1
+RenderDeferredSSAO 1 1
+RenderShadowDetail 1 0
+WLSkyDetail 1 48
+RenderFSAASamples 1 2
+
+//
+// High Ultra Graphics Settings (deferred + SSAO + shadows)
+//
+list HighUltra
+RenderAnisotropic 1 1
+RenderAvatarCloth 1 0
+RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
+RenderAvatarVP 1 1
+RenderFarClip 1 128
+RenderFlexTimeFactor 1 1.0
+RenderGlowResolutionPow 1 9
+RenderMaxPartCount 1 4096
+RenderObjectBump 1 1
+RenderLocalLights 1 1
+RenderReflectionDetail 1 0
+RenderTerrainDetail 1 1
+RenderTerrainLODFactor 1 2.0
+RenderTransparentWater 1 1
+RenderTreeLODFactor 1 0.5
+RenderUseImpostors 1 1
+RenderVolumeLODFactor 1 1.125
+VertexShaderEnable 1 1
+WindLightUseAtmosShaders 1 1
+RenderDeferred 1 1
+RenderDeferredSSAO 1 1
+RenderShadowDetail 1 2
+WLSkyDetail 1 48
RenderFSAASamples 1 2
//
@@ -226,6 +316,9 @@ RenderFSAASamples 1 2
//
list Unknown
RenderVBOEnable 1 0
+RenderShadowDetail 1 0
+RenderDeferred 1 0
+RenderDeferredSSAO 1 0
//
// Class 0 Hardware (just old)
@@ -240,18 +333,30 @@ list Class1
RenderVBOEnable 1 1
//
-// Class 2 Hardware (make it purty)
+// Class 2 Hardware
//
list Class2
RenderVBOEnable 1 1
//
-// Class 3 Hardware (make it purty)
+// Class 3 Hardware
//
list Class3
RenderVBOEnable 1 1
//
+// Class 4 Hardware
+//
+list Class4
+RenderVBOEnable 1 1
+
+//
+// Class 5 Hardware
+//
+list Class5
+RenderVBOEnable 1 1
+
+//
// VRAM > 512MB
//
list VRAMGT512
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index 96362ff4bb..1c0d45c11b 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -1,4 +1,4 @@
-version 32
+version 35
// The version number above should be implemented IF AND ONLY IF some
// change has been made that is sufficiently important to justify
// resetting the graphics preferences of all users to the recommended
@@ -96,10 +96,10 @@ RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
-WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+WLSkyDetail 1 48
RenderFSAASamples 1 0
//
@@ -127,16 +127,16 @@ RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
-WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+WLSkyDetail 1 48
RenderFSAASamples 1 0
//
-// Mid Graphics Settings
+// Medium Low Graphics Settings
//
-list Mid
+list LowMid
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0.5
@@ -145,9 +145,9 @@ RenderAvatarVP 1 1
RenderFarClip 1 96
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 8
-RenderLocalLights 1 1
RenderMaxPartCount 1 2048
RenderObjectBump 1 1
+RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 1.0
@@ -157,16 +157,16 @@ RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
-WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+WLSkyDetail 1 48
RenderFSAASamples 1 0
//
-// High Graphics Settings (purty)
+// Medium Graphics Settings (standard)
//
-list High
+list Mid
RenderAnisotropic 1 1
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 1.0
@@ -175,9 +175,9 @@ RenderAvatarVP 1 1
RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
-RenderLocalLights 1 1
RenderMaxPartCount 1 4096
RenderObjectBump 1 1
+RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
@@ -187,12 +187,103 @@ RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
-WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
+RenderShadowDetail 1 0
+WLSkyDetail 1 48
+RenderFSAASamples 1 2
+
+//
+// Medium High Graphics Settings (deferred enabled)
+//
+list MidHigh
+RenderAnisotropic 1 1
+RenderAvatarCloth 1 0
+RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
+RenderAvatarVP 1 1
+RenderFarClip 1 128
+RenderFlexTimeFactor 1 1.0
+RenderGlowResolutionPow 1 9
+RenderMaxPartCount 1 4096
+RenderObjectBump 1 1
+RenderLocalLights 1 1
+RenderReflectionDetail 1 0
+RenderTerrainDetail 1 1
+RenderTerrainLODFactor 1 2.0
+RenderTransparentWater 1 1
+RenderTreeLODFactor 1 0.5
+RenderUseImpostors 1 1
+RenderVolumeLODFactor 1 1.125
+VertexShaderEnable 1 1
+WindLightUseAtmosShaders 1 1
+RenderDeferred 1 1
+RenderDeferredSSAO 1 0
+RenderShadowDetail 1 0
+WLSkyDetail 1 48
+RenderFSAASamples 1 2
+
+//
+// High Graphics Settings (deferred + SSAO)
+//
+list High
+RenderAnisotropic 1 1
+RenderAvatarCloth 1 0
+RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
+RenderAvatarVP 1 1
+RenderFarClip 1 128
+RenderFlexTimeFactor 1 1.0
+RenderGlowResolutionPow 1 9
+RenderMaxPartCount 1 4096
+RenderObjectBump 1 1
+RenderLocalLights 1 1
+RenderReflectionDetail 1 0
+RenderTerrainDetail 1 1
+RenderTerrainLODFactor 1 2.0
+RenderTransparentWater 1 1
+RenderTreeLODFactor 1 0.5
+RenderUseImpostors 1 1
+RenderVolumeLODFactor 1 1.125
+VertexShaderEnable 1 1
+WindLightUseAtmosShaders 1 1
+RenderDeferred 1 1
+RenderDeferredSSAO 1 1
+RenderShadowDetail 1 0
+WLSkyDetail 1 48
+RenderFSAASamples 1 2
+
+//
+// High Ultra Graphics Settings (deferred + SSAO + shadows)
+//
+list HighUltra
+RenderAnisotropic 1 1
+RenderAvatarCloth 1 0
+RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
+RenderAvatarVP 1 1
+RenderFarClip 1 128
+RenderFlexTimeFactor 1 1.0
+RenderGlowResolutionPow 1 9
+RenderMaxPartCount 1 4096
+RenderObjectBump 1 1
+RenderLocalLights 1 1
+RenderReflectionDetail 1 0
+RenderTerrainDetail 1 1
+RenderTerrainLODFactor 1 2.0
+RenderTransparentWater 1 1
+RenderTreeLODFactor 1 0.5
+RenderUseImpostors 1 1
+RenderVolumeLODFactor 1 1.125
+VertexShaderEnable 1 1
+WindLightUseAtmosShaders 1 1
+RenderDeferred 1 1
+RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
+WLSkyDetail 1 48
RenderFSAASamples 1 2
+
//
// Ultra graphics (REALLY PURTY!)
//
@@ -242,16 +333,27 @@ list Class1
RenderVBOEnable 1 1
//
-// Class 2 Hardware (make it purty)
+// Class 2 Hardware
//
list Class2
RenderVBOEnable 1 1
//
-// Class 3 Hardware (make it purty)
+// Class 3 Hardware
//
list Class3
RenderVBOEnable 1 1
+//
+// Class 4 Hardware
+//
+list Class4
+RenderVBOEnable 1 1
+
+//
+// Class 5 Hardware
+//
+list Class5
+RenderVBOEnable 1 1
//
// No Pixel Shaders available
diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt
index a945f7a693..68e09d010e 100644
--- a/indra/newview/featuretable_xp.txt
+++ b/indra/newview/featuretable_xp.txt
@@ -1,4 +1,4 @@
-version 31
+version 32
// The version number above should be implemented IF AND ONLY IF some
// change has been made that is sufficiently important to justify
// resetting the graphics preferences of all users to the recommended
@@ -63,9 +63,9 @@ Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 1.0
RenderCompressTextures 1 1
RenderShaderLightingMaxLevel 1 3
-RenderDeferred 1 0
-RenderDeferredSSAO 1 0
-RenderShadowDetail 1 0
+RenderDeferred 1 1
+RenderDeferredSSAO 1 1
+RenderShadowDetail 1 2
WatchdogDisabled 1 1
RenderUseStreamVBO 1 1
RenderFSAASamples 1 16
@@ -96,10 +96,10 @@ RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
-WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+WLSkyDetail 1 48
RenderFSAASamples 1 0
//
@@ -127,16 +127,16 @@ RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
-WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+WLSkyDetail 1 48
RenderFSAASamples 1 0
//
-// Mid Graphics Settings
+// Medium Low Graphics Settings
//
-list Mid
+list LowMid
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0.5
@@ -145,9 +145,9 @@ RenderAvatarVP 1 1
RenderFarClip 1 96
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 8
-RenderLocalLights 1 1
RenderMaxPartCount 1 2048
RenderObjectBump 1 1
+RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 1.0
@@ -157,16 +157,16 @@ RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
-WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+WLSkyDetail 1 48
RenderFSAASamples 1 0
//
-// High Graphics Settings (purty)
+// Medium Graphics Settings (standard)
//
-list High
+list Mid
RenderAnisotropic 1 1
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 1.0
@@ -175,9 +175,9 @@ RenderAvatarVP 1 1
RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
-RenderLocalLights 1 1
RenderMaxPartCount 1 4096
RenderObjectBump 1 1
+RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
@@ -187,10 +187,100 @@ RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
-WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
+RenderShadowDetail 1 0
+WLSkyDetail 1 48
+RenderFSAASamples 1 2
+
+//
+// Medium High Graphics Settings (deferred enabled)
+//
+list MidHigh
+RenderAnisotropic 1 1
+RenderAvatarCloth 1 0
+RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
+RenderAvatarVP 1 1
+RenderFarClip 1 128
+RenderFlexTimeFactor 1 1.0
+RenderGlowResolutionPow 1 9
+RenderMaxPartCount 1 4096
+RenderObjectBump 1 1
+RenderLocalLights 1 1
+RenderReflectionDetail 1 0
+RenderTerrainDetail 1 1
+RenderTerrainLODFactor 1 2.0
+RenderTransparentWater 1 1
+RenderTreeLODFactor 1 0.5
+RenderUseImpostors 1 1
+RenderVolumeLODFactor 1 1.125
+VertexShaderEnable 1 1
+WindLightUseAtmosShaders 1 1
+RenderDeferred 1 1
+RenderDeferredSSAO 1 0
+RenderShadowDetail 1 0
+WLSkyDetail 1 48
+RenderFSAASamples 1 2
+
+//
+// High Graphics Settings (deferred + SSAO)
+//
+list High
+RenderAnisotropic 1 1
+RenderAvatarCloth 1 0
+RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
+RenderAvatarVP 1 1
+RenderFarClip 1 128
+RenderFlexTimeFactor 1 1.0
+RenderGlowResolutionPow 1 9
+RenderMaxPartCount 1 4096
+RenderObjectBump 1 1
+RenderLocalLights 1 1
+RenderReflectionDetail 1 0
+RenderTerrainDetail 1 1
+RenderTerrainLODFactor 1 2.0
+RenderTransparentWater 1 1
+RenderTreeLODFactor 1 0.5
+RenderUseImpostors 1 1
+RenderVolumeLODFactor 1 1.125
+VertexShaderEnable 1 1
+WindLightUseAtmosShaders 1 1
+RenderDeferred 1 1
+RenderDeferredSSAO 1 1
+RenderShadowDetail 1 0
+WLSkyDetail 1 48
+RenderFSAASamples 1 2
+
+//
+// High Ultra Graphics Settings (deferred + SSAO + shadows)
+//
+list HighUltra
+RenderAnisotropic 1 1
+RenderAvatarCloth 1 0
+RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
+RenderAvatarVP 1 1
+RenderFarClip 1 128
+RenderFlexTimeFactor 1 1.0
+RenderGlowResolutionPow 1 9
+RenderMaxPartCount 1 4096
+RenderObjectBump 1 1
+RenderLocalLights 1 1
+RenderReflectionDetail 1 0
+RenderTerrainDetail 1 1
+RenderTerrainLODFactor 1 2.0
+RenderTransparentWater 1 1
+RenderTreeLODFactor 1 0.5
+RenderUseImpostors 1 1
+RenderVolumeLODFactor 1 1.125
+VertexShaderEnable 1 1
+WindLightUseAtmosShaders 1 1
+RenderDeferred 1 1
+RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
+WLSkyDetail 1 48
RenderFSAASamples 1 2
//
@@ -242,18 +332,30 @@ list Class1
RenderVBOEnable 1 1
//
-// Class 2 Hardware (make it purty)
+// Class 2 Hardware
//
list Class2
RenderVBOEnable 1 1
//
-// Class 3 Hardware (make it purty)
+// Class 3 Hardware
//
list Class3
RenderVBOEnable 1 1
//
+// Class 4 Hardware (deferred + SSAO)
+//
+list Class4
+RenderVBOEnable 1 1
+
+//
+// Class 5 Hardware
+//
+list Class5
+RenderVBOEnable 1 1
+
+//
// VRAM > 512MB
//
list VRAMGT512
diff --git a/indra/newview/generate_breakpad_symbols.py b/indra/newview/generate_breakpad_symbols.py
index 5ebec1563e..4181e4ebb3 100644
--- a/indra/newview/generate_breakpad_symbols.py
+++ b/indra/newview/generate_breakpad_symbols.py
@@ -39,17 +39,20 @@ import shlex
import subprocess
import tarfile
import StringIO
+import pprint
+
+DEBUG=False
def usage():
- print >>sys.stderr, "usage: %s viewer_dir viewer_exes libs_suffix dump_syms_tool viewer_symbol_file" % sys.argv[0]
+ print >>sys.stderr, "usage: %s search_dirs viewer_exes libs_suffix dump_syms_tool viewer_symbol_file" % sys.argv[0]
class MissingModuleError(Exception):
def __init__(self, modules):
Exception.__init__(self, "Failed to find required modules: %r" % modules)
self.modules = modules
-def main(configuration, viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file):
- print "generate_breakpad_symbols run with args: %s" % str((configuration, viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file))
+def main(configuration, search_dirs, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file):
+ print "generate_breakpad_symbols run with args: %s" % str((configuration, search_dirs, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file))
if not re.match("release", configuration, re.IGNORECASE):
print "skipping breakpad symbol generation for non-release build."
@@ -67,21 +70,49 @@ def main(configuration, viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, vi
return True
return fnmatch.fnmatch(f, libs_suffix)
+ search_dirs = search_dirs.split(";")
+
def list_files():
- for (dirname, subdirs, filenames) in os.walk(viewer_dir):
- #print "scanning '%s' for modules..." % dirname
- for f in itertools.ifilter(matches, filenames):
- yield os.path.join(dirname, f)
+ for search_dir in search_dirs:
+ for (dirname, subdirs, filenames) in os.walk(search_dir):
+ if DEBUG:
+ print "scanning '%s' for modules..." % dirname
+ for f in itertools.ifilter(matches, filenames):
+ yield os.path.join(dirname, f)
def dump_module(m):
print "dumping module '%s' with '%s'..." % (m, dump_syms_tool)
- child = subprocess.Popen([dump_syms_tool, m] , stdout=subprocess.PIPE)
+ dsym_full_path = m
+ child = subprocess.Popen([dump_syms_tool, dsym_full_path] , stdout=subprocess.PIPE)
out, err = child.communicate()
return (m,child.returncode, out, err)
- out = tarfile.open(viewer_symbol_file, 'w:bz2')
+
+ modules = {}
+
+ for m in list_files():
+ if DEBUG:
+ print "examining module '%s' ... " % m,
+ filename=os.path.basename(m)
+ if -1 != m.find("DWARF"):
+ # Just use this module; it has the symbols we want.
+ modules[filename] = m
+ if DEBUG:
+ print "found dSYM entry"
+ elif filename not in modules:
+ # Only use this if we don't already have a (possibly better) entry.
+ modules[filename] = m
+ if DEBUG:
+ print "found new entry"
+ elif DEBUG:
+ print "ignoring entry"
+
+
+ print "Found these following modules:"
+ pprint.pprint( modules )
- for (filename,status,symbols,err) in itertools.imap(dump_module, list_files()):
+ out = tarfile.open(viewer_symbol_file, 'w:bz2')
+ for (filename,status,symbols,err) in itertools.imap(dump_module, modules.values()):
if status == 0:
module_line = symbols[:symbols.index('\n')]
module_line = module_line.split()
diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt
index 777d54a5c3..4c39014c8b 100644
--- a/indra/newview/gpu_table.txt
+++ b/indra/newview/gpu_table.txt
@@ -17,520 +17,582 @@
//
// Format:
// Fields are separated by one or more tab (not space) characters
-// <recognizer name> <regular expression> <class> <supported>
+// <recognizer name> <regular expression> <class> <supported> <stats based> <expected OpenGL version>
//
// Class Numbers:
// 0 - Defaults to low graphics settings. No shaders on by default
// 1 - Defaults to mid graphics settings. Basic shaders on by default
// 2 - Defaults to high graphics settings. Atmospherics on by default.
-// 3 - Same as class 2 for now.
+// 3 - Same as 2, but with lighting and shadows enabled.
+// 4 - Same as 3, but with ambient occlusion enabled.
+// 5 - Same as 4, but with shadows set to "Sun/Moon+Projectors."
//
// Supported Number:
// 0 - We claim to not support this card.
// 1 - We claim to support this card.
//
-3Dfx .*3Dfx.* 0 0
-3Dlabs .*3Dlabs.* 0 0
-ATI 3D-Analyze .*ATI.*3D-Analyze.* 0 0
-ATI All-in-Wonder 7500 .*ATI.*All-in-Wonder 75.* 0 1
-ATI All-in-Wonder 8500 .*ATI.*All-in-Wonder 85.* 0 1
-ATI All-in-Wonder 9200 .*ATI.*All-in-Wonder 92.* 0 1
-ATI All-in-Wonder 9xxx .*ATI.*All-in-Wonder 9.* 1 1
-ATI All-in-Wonder HD .*ATI.*All-in-Wonder HD.* 1 1
-ATI All-in-Wonder X600 .*ATI.*All-in-Wonder X6.* 1 1
-ATI All-in-Wonder X800 .*ATI.*All-in-Wonder X8.* 2 1
-ATI All-in-Wonder X1800 .*ATI.*All-in-Wonder X18.* 3 1
-ATI All-in-Wonder X1900 .*ATI.*All-in-Wonder X19.* 3 1
-ATI All-in-Wonder PCI-E .*ATI.*All-in-Wonder.*PCI-E.* 1 1
-ATI All-in-Wonder Radeon .*ATI.*All-in-Wonder Radeon.* 0 1
-ATI ASUS ARES .*ATI.*ASUS.*ARES.* 3 1
-ATI ASUS A9xxx .*ATI.*ASUS.*A9.* 1 1
-ATI ASUS AH24xx .*ATI.*ASUS.*AH24.* 1 1
-ATI ASUS AH26xx .*ATI.*ASUS.*AH26.* 3 1
-ATI ASUS AH34xx .*ATI.*ASUS.*AH34.* 1 1
-ATI ASUS AH36xx .*ATI.*ASUS.*AH36.* 3 1
-ATI ASUS AH46xx .*ATI.*ASUS.*AH46.* 3 1
-ATI ASUS AX3xx .*ATI.*ASUS.*AX3.* 1 1
-ATI ASUS AX5xx .*ATI.*ASUS.*AX5.* 1 1
-ATI ASUS AX8xx .*ATI.*ASUS.*AX8.* 2 1
-ATI ASUS EAH24xx .*ATI.*ASUS.*EAH24.* 2 1
-ATI ASUS EAH26xx .*ATI.*ASUS.*EAH26.* 3 1
-ATI ASUS EAH29xx .*ATI.*ASUS.*EAH29.* 3 1
-ATI ASUS EAH34xx .*ATI.*ASUS.*EAH34.* 1 1
-ATI ASUS EAH36xx .*ATI.*ASUS.*EAH36.* 3 1
-ATI ASUS EAH38xx .*ATI.*ASUS.*EAH38.* 3 1
-ATI ASUS EAH43xx .*ATI.*ASUS.*EAH43.* 1 1
-ATI ASUS EAH45xx .*ATI.*ASUS.*EAH45.* 1 1
-ATI ASUS EAH48xx .*ATI.*ASUS.*EAH48.* 3 1
-ATI ASUS EAH57xx .*ATI.*ASUS.*EAH57.* 3 1
-ATI ASUS EAH58xx .*ATI.*ASUS.*EAH58.* 3 1
-ATI ASUS EAH6xxx .*ATI.*ASUS.*EAH6.* 3 1
-ATI ASUS Radeon X1xxx .*ATI.*ASUS.*X1.* 3 1
-ATI Radeon X7xx .*ATI.*ASUS.*X7.* 1 1
-ATI Radeon X19xx .*ATI.*(Radeon|Diamond) X19.* ?.* 3 1
-ATI Radeon X18xx .*ATI.*(Radeon|Diamond) X18.* ?.* 3 1
-ATI Radeon X17xx .*ATI.*(Radeon|Diamond) X17.* ?.* 2 1
-ATI Radeon X16xx .*ATI.*(Radeon|Diamond) X16.* ?.* 2 1
-ATI Radeon X15xx .*ATI.*(Radeon|Diamond) X15.* ?.* 2 1
-ATI Radeon X13xx .*ATI.*(Radeon|Diamond) X13.* ?.* 1 1
-ATI Radeon X1xxx .*ATI.*(Radeon|Diamond) X1.. ?.* 1 1
-ATI Radeon X2xxx .*ATI.*(Radeon|Diamond) X2.. ?.* 1 1
-ATI Display Adapter .*ATI.*display adapter.* 0 1
-ATI FireGL 5200 .*ATI.*FireGL V52.* 0 1
-ATI FireGL 5xxx .*ATI.*FireGL V5.* 1 1
-ATI FireGL .*ATI.*Fire.*GL.* 0 1
-ATI FirePro M3900 .*ATI.*FirePro.*M39.* 2 1
-ATI FirePro M5800 .*ATI.*FirePro.*M58.* 3 1
-ATI FirePro M7740 .*ATI.*FirePro.*M77.* 3 1
-ATI FirePro M7820 .*ATI.*FirePro.*M78.* 3 1
-ATI FireMV .*ATI.*FireMV.* 0 1
-ATI Geforce 9500 GT .*ATI.*Geforce 9500 *GT.* 2 1
-ATI Geforce 9600 GT .*ATI.*Geforce 9600 *GT.* 2 1
-ATI Geforce 9800 GT .*ATI.*Geforce 9800 *GT.* 2 1
-ATI Generic .*ATI.*Generic.* 0 0
-ATI Hercules 9800 .*ATI.*Hercules.*9800.* 1 1
-ATI IGP 340M .*ATI.*IGP.*340M.* 0 0
-ATI M52 .*ATI.*M52.* 1 1
-ATI M54 .*ATI.*M54.* 1 1
-ATI M56 .*ATI.*M56.* 1 1
-ATI M71 .*ATI.*M71.* 1 1
-ATI M72 .*ATI.*M72.* 1 1
-ATI M76 .*ATI.*M76.* 3 1
-ATI Radeon HD 64xx .*ATI.*AMD Radeon.* HD [67]4..[MG] 3 1
-ATI Radeon HD 65xx .*ATI.*AMD Radeon.* HD [67]5..[MG] 3 1
-ATI Radeon HD 66xx .*ATI.*AMD Radeon.* HD [67]6..[MG] 3 1
-ATI Mobility Radeon 4100 .*ATI.*Mobility.*41.. 1 1
-ATI Mobility Radeon 7xxx .*ATI.*Mobility.*Radeon 7.* 0 1
-ATI Mobility Radeon 8xxx .*ATI.*Mobility.*Radeon 8.* 0 1
-ATI Mobility Radeon 9800 .*ATI.*Mobility.*98.* 1 1
-ATI Mobility Radeon 9700 .*ATI.*Mobility.*97.* 1 1
-ATI Mobility Radeon 9600 .*ATI.*Mobility.*96.* 0 1
-ATI Mobility Radeon HD 530v .*ATI.*Mobility.*HD *530v.* 1 1
-ATI Mobility Radeon HD 540v .*ATI.*Mobility.*HD *540v.* 2 1
-ATI Mobility Radeon HD 545v .*ATI.*Mobility.*HD *545v.* 2 1
-ATI Mobility Radeon HD 550v .*ATI.*Mobility.*HD *550v.* 2 1
-ATI Mobility Radeon HD 560v .*ATI.*Mobility.*HD *560v.* 2 1
-ATI Mobility Radeon HD 565v .*ATI.*Mobility.*HD *565v.* 2 1
-ATI Mobility Radeon HD 2300 .*ATI.*Mobility.*HD *23.* 2 1
-ATI Mobility Radeon HD 2400 .*ATI.*Mobility.*HD *24.* 2 1
-ATI Mobility Radeon HD 2600 .*ATI.*Mobility.*HD *26.* 3 1
-ATI Mobility Radeon HD 2700 .*ATI.*Mobility.*HD *27.* 3 1
-ATI Mobility Radeon HD 3100 .*ATI.*Mobility.*HD *31.* 0 1
-ATI Mobility Radeon HD 3200 .*ATI.*Mobility.*HD *32.* 0 1
-ATI Mobility Radeon HD 3400 .*ATI.*Mobility.*HD *34.* 2 1
-ATI Mobility Radeon HD 3600 .*ATI.*Mobility.*HD *36.* 3 1
-ATI Mobility Radeon HD 3800 .*ATI.*Mobility.*HD *38.* 3 1
-ATI Mobility Radeon HD 4200 .*ATI.*Mobility.*HD *42.* 2 1
-ATI Mobility Radeon HD 4300 .*ATI.*Mobility.*HD *43.* 2 1
-ATI Mobility Radeon HD 4500 .*ATI.*Mobility.*HD *45.* 3 1
-ATI Mobility Radeon HD 4600 .*ATI.*Mobility.*HD *46.* 3 1
-ATI Mobility Radeon HD 4800 .*ATI.*Mobility.*HD *48.* 3 1
-ATI Mobility Radeon HD 5100 .*ATI.*Mobility.*HD *51.* 3 1
-ATI Mobility Radeon HD 5300 .*ATI.*Mobility.*HD *53.* 3 1
-ATI Mobility Radeon HD 5400 .*ATI.*Mobility.*HD *54.* 3 1
-ATI Mobility Radeon HD 5500 .*ATI.*Mobility.*HD *55.* 3 1
-ATI Mobility Radeon HD 5600 .*ATI.*Mobility.*HD *56.* 3 1
-ATI Mobility Radeon HD 5700 .*ATI.*Mobility.*HD *57.* 3 1
-ATI Mobility Radeon HD 6200 .*ATI.*Mobility.*HD *62.* 3 1
-ATI Mobility Radeon HD 6300 .*ATI.*Mobility.*HD *63.* 3 1
-ATI Mobility Radeon HD 6400M .*ATI.*Mobility.*HD *64.* 3 1
-ATI Mobility Radeon HD 6500M .*ATI.*Mobility.*HD *65.* 3 1
-ATI Mobility Radeon HD 6600M .*ATI.*Mobility.*HD *66.* 3 1
-ATI Mobility Radeon HD 6700M .*ATI.*Mobility.*HD *67.* 3 1
-ATI Mobility Radeon HD 6800M .*ATI.*Mobility.*HD *68.* 3 1
-ATI Mobility Radeon HD 6900M .*ATI.*Mobility.*HD *69.* 3 1
-ATI Radeon HD 2300 .*ATI.*Radeon HD *23.. 2 1
-ATI Radeon HD 2400 .*ATI.*Radeon HD *24.. 2 1
-ATI Radeon HD 2600 .*ATI.*Radeon HD *26.. 2 1
-ATI Radeon HD 2900 .*ATI.*Radeon HD *29.. 3 1
-ATI Radeon HD 3000 .*ATI.*Radeon HD *30.. 0 1
-ATI Radeon HD 3100 .*ATI.*Radeon HD *31.. 1 1
-ATI Radeon HD 3200 .*ATI.*Radeon HD *32.. 1 1
-ATI Radeon HD 3300 .*ATI.*Radeon HD *33.. 2 1
-ATI Radeon HD 3400 .*ATI.*Radeon HD *34.. 2 1
-ATI Radeon HD 3500 .*ATI.*Radeon HD *35.. 2 1
-ATI Radeon HD 3600 .*ATI.*Radeon HD *36.. 3 1
-ATI Radeon HD 3700 .*ATI.*Radeon HD *37.. 3 1
-ATI Radeon HD 3800 .*ATI.*Radeon HD *38.. 3 1
-ATI Radeon HD 4100 .*ATI.*Radeon HD *41.. 1 1
-ATI Radeon HD 4200 .*ATI.*Radeon HD *42.. 1 1
-ATI Radeon HD 4300 .*ATI.*Radeon HD *43.. 2 1
-ATI Radeon HD 4400 .*ATI.*Radeon HD *44.. 2 1
-ATI Radeon HD 4500 .*ATI.*Radeon HD *45.. 3 1
-ATI Radeon HD 4600 .*ATI.*Radeon HD *46.. 3 1
-ATI Radeon HD 4700 .*ATI.*Radeon HD *47.. 3 1
-ATI Radeon HD 4800 .*ATI.*Radeon HD *48.. 3 1
-ATI Radeon HD 5400 .*ATI.*Radeon HD *54.. 3 1
-ATI Radeon HD 5500 .*ATI.*Radeon HD *55.. 3 1
-ATI Radeon HD 5600 .*ATI.*Radeon HD *56.. 3 1
-ATI Radeon HD 5700 .*ATI.*Radeon HD *57.. 3 1
-ATI Radeon HD 5800 .*ATI.*Radeon HD *58.. 3 1
-ATI Radeon HD 5900 .*ATI.*Radeon HD *59.. 3 1
-ATI Radeon HD 6200 .*ATI.*Radeon HD *62.. 3 1
-ATI Radeon HD 6300 .*ATI.*Radeon HD *63.. 3 1
-ATI Radeon HD 6400 .*ATI.*Radeon HD *64.. 3 1
-ATI Radeon HD 6500 .*ATI.*Radeon HD *65.. 3 1
-ATI Radeon HD 6600 .*ATI.*Radeon HD *66.. 3 1
-ATI Radeon HD 6700 .*ATI.*Radeon HD *67.. 3 1
-ATI Radeon HD 6800 .*ATI.*Radeon HD *68.. 3 1
-ATI Radeon HD 6900 .*ATI.*Radeon HD *69.. 3 1
-ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0
-ATI Radeon 2100 .*ATI.*Radeon 21.. 0 1
-ATI Radeon 3000 .*ATI.*Radeon 30.. 0 1
-ATI Radeon 3100 .*ATI.*Radeon 31.. 1 1
-ATI Radeon 5xxx .*ATI.*Radeon 5... 3 1
-ATI Radeon 7xxx .*ATI.*Radeon 7... 0 1
-ATI Radeon 8xxx .*ATI.*Radeon 8... 0 1
-ATI Radeon 9000 .*ATI.*Radeon 90.. 0 1
-ATI Radeon 9100 .*ATI.*Radeon 91.. 0 1
-ATI Radeon 9200 .*ATI.*Radeon 92.. 0 1
-ATI Radeon 9500 .*ATI.*Radeon 95.. 0 1
-ATI Radeon 9600 .*ATI.*Radeon 96.. 0 1
-ATI Radeon 9700 .*ATI.*Radeon 97.. 1 1
-ATI Radeon 9800 .*ATI.*Radeon 98.. 1 1
-ATI Radeon RV250 .*ATI.*RV250.* 0 1
-ATI Radeon RV600 .*ATI.*RV6.* 1 1
-ATI Radeon RX700 .*ATI.*RX70.* 1 1
-ATI Radeon RX800 .*ATI.*Radeon *RX80.* 2 1
-ATI RS880M .*ATI.*RS880M 1 1
-ATI Radeon RX9550 .*ATI.*RX9550.* 1 1
-ATI Radeon VE .*ATI.*Radeon.*VE.* 0 0
-ATI Radeon X300 .*ATI.*Radeon *X3.* 0 1
-ATI Radeon X400 .*ATI.*Radeon ?X4.* 0 1
-ATI Radeon X500 .*ATI.*Radeon ?X5.* 0 1
-ATI Radeon X600 .*ATI.*Radeon ?X6.* 1 1
-ATI Radeon X700 .*ATI.*Radeon ?X7.* 1 1
-ATI Radeon X800 .*ATI.*Radeon ?X8.* 2 1
-ATI Radeon X900 .*ATI.*Radeon ?X9.* 2 1
-ATI Radeon Xpress .*ATI.*Radeon Xpress.* 0 1
-ATI Rage 128 .*ATI.*Rage 128.* 0 1
-ATI R300 (9700) .*R300.* 1 1
-ATI R350 (9800) .*R350.* 1 1
-ATI R580 (X1900) .*R580.* 3 1
-ATI RC410 (Xpress 200) .*RC410.* 0 0
-ATI RS48x (Xpress 200x) .*RS48.* 0 0
-ATI RS600 (Xpress 3200) .*RS600.* 0 0
-ATI RV350 (9600) .*RV350.* 0 1
-ATI RV370 (X300) .*RV370.* 0 1
-ATI RV410 (X700) .*RV410.* 1 1
-ATI RV515 .*RV515.* 1 1
-ATI RV570 (X1900 GT/PRO) .*RV570.* 3 1
-ATI RV380 .*RV380.* 0 1
-ATI RV530 .*RV530.* 1 1
-ATI RX480 (Xpress 200P) .*RX480.* 0 1
-ATI RX700 .*RX700.* 1 1
-AMD ANTILLES (HD 6990) .*(AMD|ATI).*Antilles.* 3 1
-AMD BARTS (HD 6800) .*(AMD|ATI).*Barts.* 3 1
-AMD CAICOS (HD 6400) .*(AMD|ATI).*Caicos.* 3 1
-AMD CAYMAN (HD 6900) .*(AMD|ATI).*(Cayman|CAYMAM).* 3 1
-AMD CEDAR (HD 5450) .*(AMD|ATI).*Cedar.* 2 1
-AMD CYPRESS (HD 5800) .*(AMD|ATI).*Cypress.* 3 1
-AMD HEMLOCK (HD 5970) .*(AMD|ATI).*Hemlock.* 3 1
-AMD JUNIPER (HD 5700) .*(AMD|ATI).*Juniper.* 3 1
-AMD PARK .*(AMD|ATI).*Park.* 3 1
-AMD REDWOOD (HD 5500/5600) .*(AMD|ATI).*Redwood.* 3 1
-AMD TURKS (HD 6500/6600) .*(AMD|ATI).*Turks.* 3 1
-AMD RS780 (HD 3200) .*RS780.* 0 1
-AMD RS880 (HD 4200) .*RS880.* 1 1
-AMD RV610 (HD 2400) .*RV610.* 1 1
-AMD RV620 (HD 3400) .*RV620.* 1 1
-AMD RV630 (HD 2600) .*RV630.* 2 1
-AMD RV635 (HD 3600) .*RV635.* 3 1
-AMD RV670 (HD 3800) .*RV670.* 3 1
-AMD R680 (HD 3870 X2) .*R680.* 3 1
-AMD R700 (HD 4800 X2) .*R700.* 3 1
-AMD RV710 (HD 4300) .*RV710.* 1 1
-AMD RV730 (HD 4600) .*RV730.* 3 1
-AMD RV740 (HD 4700) .*RV740.* 3 1
-AMD RV770 (HD 4800) .*RV770.* 3 1
-AMD RV790 (HD 4800) .*RV790.* 3 1
-ATI 760G/Radeon 3000 .*ATI.*AMD 760G.* 1 1
-ATI 780L/Radeon 3000 .*ATI.*AMD 780L.* 1 1
-ATI Radeon DDR .*ATI.*Radeon ?DDR.* 0 1
-ATI FirePro 2000 .*ATI.*FirePro 2.* 1 1
-ATI FirePro 3000 .*ATI.*FirePro V3.* 1 1
-ATI FirePro 4000 .*ATI.*FirePro V4.* 2 1
-ATI FirePro 5000 .*ATI.*FirePro V5.* 3 1
-ATI FirePro 7000 .*ATI.*FirePro V7.* 3 1
-ATI FirePro M .*ATI.*FirePro M.* 3 1
-ATI Technologies .*ATI *Technologies.* 0 1
-// This entry is last to work around the "R300" driver problem.
-ATI R300 (9700) .*R300.* 1 1
-ATI Radeon .*ATI.*(Diamond|Radeon).* 0 1
-Intel X3100 .*Intel.*X3100.* 0 1
-Intel 830M .*Intel.*830M 0 0
-Intel 845G .*Intel.*845G 0 0
-Intel 855GM .*Intel.*855GM 0 0
-Intel 865G .*Intel.*865G 0 0
-Intel 900 .*Intel.*900.*900 0 0
-Intel 915GM .*Intel.*915GM 0 0
-Intel 915G .*Intel.*915G 0 0
-Intel 945GM .*Intel.*945GM.* 0 1
-Intel 945G .*Intel.*945G.* 0 1
-Intel 950 .*Intel.*950.* 0 1
-Intel 965 .*Intel.*965.* 0 1
-Intel G33 .*Intel.*G33.* 0 0
-Intel G41 .*Intel.*G41.* 0 1
-Intel G45 .*Intel.*G45.* 0 1
-Intel Bear Lake .*Intel.*Bear Lake.* 0 0
-Intel Broadwater .*Intel.*Broadwater.* 0 0
-Intel Brookdale .*Intel.*Brookdale.* 0 0
-Intel Cantiga .*Intel.*Cantiga.* 0 0
-Intel Eaglelake .*Intel.*Eaglelake.* 0 1
-Intel Graphics Media HD .*Intel.*Graphics Media.*HD.* 0 1
-Intel HD Graphics .*Intel.*HD Graphics.* 2 1
-Intel Mobile 4 Series .*Intel.*Mobile.* 4 Series.* 0 1
-Intel Media Graphics HD .*Intel.*Media Graphics HD.* 0 1
-Intel Montara .*Intel.*Montara.* 0 0
-Intel Pineview .*Intel.*Pineview.* 0 1
-Intel Springdale .*Intel.*Springdale.* 0 0
-Intel HD Graphics 2000 .*Intel.*HD2000.* 1 1
-Intel HD Graphics 3000 .*Intel.*HD3000.* 2 1
-Matrox .*Matrox.* 0 0
-Mesa .*Mesa.* 0 0
-NVIDIA 205 .*NVIDIA .*GeForce 205.* 2 1
-NVIDIA 210 .*NVIDIA .*GeForce 210.* 2 1
-NVIDIA 310M .*NVIDIA .*GeForce 310M.* 1 1
-NVIDIA 310 .*NVIDIA .*GeForce 310.* 3 1
-NVIDIA 315M .*NVIDIA .*GeForce 315M.* 2 1
-NVIDIA 315 .*NVIDIA .*GeForce 315.* 3 1
-NVIDIA 320M .*NVIDIA .*GeForce 320M.* 2 1
-NVIDIA G100M .*NVIDIA .*100M.* 0 1
-NVIDIA G100 .*NVIDIA .*100.* 0 1
-NVIDIA G102M .*NVIDIA .*102M.* 0 1
-NVIDIA G103M .*NVIDIA .*103M.* 0 1
-NVIDIA G105M .*NVIDIA .*105M.* 0 1
-NVIDIA G 110M .*NVIDIA .*110M.* 0 1
-NVIDIA G 120M .*NVIDIA .*120M.* 1 1
-NVIDIA G 200 .*NVIDIA .*200(M)?.* 0 1
-NVIDIA G 205M .*NVIDIA .*205(M)?.* 0 1
-NVIDIA G 210 .*NVIDIA .*210(M)?.* 1 1
-NVIDIA 305M .*NVIDIA .*305(M)?.* 1 1
-NVIDIA G 310M .*NVIDIA .*310(M)?.* 2 1
-NVIDIA G 315 .*NVIDIA .*315(M)?.* 2 1
-NVIDIA G 320M .*NVIDIA .*320(M)?.* 2 1
-NVIDIA G 405 .*NVIDIA .*405(M)?.* 1 1
-NVIDIA G 410M .*NVIDIA .*410(M)?.* 1 1
-NVIDIA GT 120M .*NVIDIA .*GT *120(M)?.* 2 1
-NVIDIA GT 120 .*NVIDIA .*GT.*120 2 1
-NVIDIA GT 130M .*NVIDIA .*GT *130(M)?.* 2 1
-NVIDIA GT 140M .*NVIDIA .*GT *140(M)?.* 2 1
-NVIDIA GT 150M .*NVIDIA .*GT(S)? *150(M)?.* 2 1
-NVIDIA GT 160M .*NVIDIA .*GT *160(M)?.* 2 1
-NVIDIA GT 220M .*NVIDIA .*GT *220(M)?.* 2 1
-NVIDIA GT 230M .*NVIDIA .*GT *230(M)?.* 2 1
-NVIDIA GT 240M .*NVIDIA .*GT *240(M)?.* 2 1
-NVIDIA GT 250M .*NVIDIA .*GT *250(M)?.* 2 1
-NVIDIA GT 260M .*NVIDIA .*GT *260(M)?.* 2 1
-NVIDIA GT 320M .*NVIDIA .*GT *320(M)?.* 2 1
-NVIDIA GT 325M .*NVIDIA .*GT *325(M)?.* 0 1
-NVIDIA GT 330M .*NVIDIA .*GT *330(M)?.* 3 1
-NVIDIA GT 335M .*NVIDIA .*GT *335(M)?.* 1 1
-NVIDIA GT 340M .*NVIDIA .*GT *340(M)?.* 2 1
-NVIDIA GT 415M .*NVIDIA .*GT *415(M)?.* 2 1
-NVIDIA GT 420M .*NVIDIA .*GT *420(M)?.* 2 1
-NVIDIA GT 425M .*NVIDIA .*GT *425(M)?.* 3 1
-NVIDIA GT 430M .*NVIDIA .*GT *430(M)?.* 3 1
-NVIDIA GT 435M .*NVIDIA .*GT *435(M)?.* 3 1
-NVIDIA GT 440M .*NVIDIA .*GT *440(M)?.* 3 1
-NVIDIA GT 445M .*NVIDIA .*GT *445(M)?.* 3 1
-NVIDIA GT 450M .*NVIDIA .*GT *450(M)?.* 3 1
-NVIDIA GT 520M .*NVIDIA .*GT *52.(M)?.* 3 1
-NVIDIA GT 530M .*NVIDIA .*GT *530(M)?.* 3 1
-NVIDIA GT 540M .*NVIDIA .*GT *54.(M)?.* 3 1
-NVIDIA GT 550M .*NVIDIA .*GT *550(M)?.* 3 1
-NVIDIA GT 555M .*NVIDIA .*GT *555(M)?.* 3 1
-NVIDIA GTS 160M .*NVIDIA .*GT(S)? *160(M)?.* 2 1
-NVIDIA GTS 240 .*NVIDIA .*GTS *24.* 3 1
-NVIDIA GTS 250 .*NVIDIA .*GTS *25.* 3 1
-NVIDIA GTS 350M .*NVIDIA .*GTS *350M.* 3 1
-NVIDIA GTS 360M .*NVIDIA .*GTS *360M.* 3 1
-NVIDIA GTS 360 .*NVIDIA .*GTS *360.* 3 1
-NVIDIA GTS 450 .*NVIDIA .*GTS *45.* 3 1
-NVIDIA GTX 260 .*NVIDIA .*GTX *26.* 3 1
-NVIDIA GTX 275 .*NVIDIA .*GTX *275.* 3 1
-NVIDIA GTX 270 .*NVIDIA .*GTX *27.* 3 1
-NVIDIA GTX 285 .*NVIDIA .*GTX *285.* 3 1
-NVIDIA GTX 280 .*NVIDIA .*GTX *280.* 3 1
-NVIDIA GTX 290 .*NVIDIA .*GTX *290.* 3 1
-NVIDIA GTX 295 .*NVIDIA .*GTX *295.* 3 1
-NVIDIA GTX 460M .*NVIDIA .*GTX *460M.* 3 1
-NVIDIA GTX 465 .*NVIDIA .*GTX *465.* 3 1
-NVIDIA GTX 460 .*NVIDIA .*GTX *46.* 3 1
-NVIDIA GTX 470M .*NVIDIA .*GTX *470M.* 3 1
-NVIDIA GTX 470 .*NVIDIA .*GTX *47.* 3 1
-NVIDIA GTX 480M .*NVIDIA .*GTX *480M.* 3 1
-NVIDIA GTX 485M .*NVIDIA .*GTX *485M.* 3 1
-NVIDIA GTX 480 .*NVIDIA .*GTX *48.* 3 1
-NVIDIA GTX 530 .*NVIDIA .*GTX *53.* 3 1
-NVIDIA GTX 550 .*NVIDIA .*GTX *55.* 3 1
-NVIDIA GTX 560 .*NVIDIA .*GTX *56.* 3 1
-NVIDIA GTX 570 .*NVIDIA .*GTX *57.* 3 1
-NVIDIA GTX 580M .*NVIDIA .*GTX *580M.* 3 1
-NVIDIA GTX 580 .*NVIDIA .*GTX *58.* 3 1
-NVIDIA GTX 590 .*NVIDIA .*GTX *59.* 3 1
-NVIDIA C51 .*NVIDIA .*C51.* 0 1
-NVIDIA G72 .*NVIDIA .*G72.* 1 1
-NVIDIA G73 .*NVIDIA .*G73.* 1 1
-NVIDIA G84 .*NVIDIA .*G84.* 2 1
-NVIDIA G86 .*NVIDIA .*G86.* 3 1
-NVIDIA G92 .*NVIDIA .*G92.* 3 1
-NVIDIA GeForce .*GeForce 256.* 0 0
-NVIDIA GeForce 2 .*GeForce ?2 ?.* 0 1
-NVIDIA GeForce 3 .*GeForce ?3 ?.* 0 1
-NVIDIA GeForce 3 Ti .*GeForce ?3 Ti.* 0 1
-NVIDIA GeForce 4 .*NVIDIA .*GeForce ?4.* 0 1
-NVIDIA GeForce 4 Go .*NVIDIA .*GeForce ?4.*Go.* 0 1
-NVIDIA GeForce 4 MX .*NVIDIA .*GeForce ?4 MX.* 0 1
-NVIDIA GeForce 4 PCX .*NVIDIA .*GeForce ?4 PCX.* 0 1
-NVIDIA GeForce 4 Ti .*NVIDIA .*GeForce ?4 Ti.* 0 1
-NVIDIA GeForce 6100 .*NVIDIA .*GeForce 61.* 0 1
-NVIDIA GeForce 6200 .*NVIDIA .*GeForce 62.* 0 1
-NVIDIA GeForce 6500 .*NVIDIA .*GeForce 65.* 0 1
-NVIDIA GeForce 6600 .*NVIDIA .*GeForce 66.* 1 1
-NVIDIA GeForce 6700 .*NVIDIA .*GeForce 67.* 2 1
-NVIDIA GeForce 6800 .*NVIDIA .*GeForce 68.* 2 1
-NVIDIA GeForce 7000 .*NVIDIA .*GeForce 70.* 0 1
-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 8100 .*NVIDIA .*GeForce 81.* 1 1
-NVIDIA GeForce 8200M .*NVIDIA .*GeForce 8200M.* 1 1
-NVIDIA GeForce 8200 .*NVIDIA .*GeForce 82.* 1 1
-NVIDIA GeForce 8300 .*NVIDIA .*GeForce 83.* 2 1
-NVIDIA GeForce 8400M .*NVIDIA .*GeForce 8400M.* 2 1
-NVIDIA GeForce 8400 .*NVIDIA .*GeForce 84.* 2 1
-NVIDIA GeForce 8500 .*NVIDIA .*GeForce 85.* 3 1
-NVIDIA GeForce 8600M .*NVIDIA .*GeForce 8600M.* 2 1
-NVIDIA GeForce 8600 .*NVIDIA .*GeForce 86.* 3 1
-NVIDIA GeForce 8700M .*NVIDIA .*GeForce 8700M.* 3 1
-NVIDIA GeForce 8700 .*NVIDIA .*GeForce 87.* 3 1
-NVIDIA GeForce 8800M .*NVIDIA .*GeForce 8800M.* 3 1
-NVIDIA GeForce 8800 .*NVIDIA .*GeForce 88.* 3 1
-NVIDIA GeForce 9100M .*NVIDIA .*GeForce 9100M.* 0 1
-NVIDIA GeForce 9100 .*NVIDIA .*GeForce 91.* 0 1
-NVIDIA GeForce 9200M .*NVIDIA .*GeForce 9200M.* 1 1
-NVIDIA GeForce 9200 .*NVIDIA .*GeForce 92.* 1 1
-NVIDIA GeForce 9300M .*NVIDIA .*GeForce 9300M.* 2 1
-NVIDIA GeForce 9300 .*NVIDIA .*GeForce 93.* 2 1
-NVIDIA GeForce 9400M .*NVIDIA .*GeForce 9400M.* 2 1
-NVIDIA GeForce 9400 .*NVIDIA .*GeForce 94.* 2 1
-NVIDIA GeForce 9500M .*NVIDIA .*GeForce 9500M.* 2 1
-NVIDIA GeForce 9500 .*NVIDIA .*GeForce 95.* 2 1
-NVIDIA GeForce 9600M .*NVIDIA .*GeForce 9600M.* 3 1
-NVIDIA GeForce 9600 .*NVIDIA .*GeForce 96.* 2 1
-NVIDIA GeForce 9700M .*NVIDIA .*GeForce 9700M.* 2 1
-NVIDIA GeForce 9800M .*NVIDIA .*GeForce 9800M.* 3 1
-NVIDIA GeForce 9800 .*NVIDIA .*GeForce 98.* 3 1
-NVIDIA GeForce FX 5100 .*NVIDIA .*GeForce FX 51.* 0 1
-NVIDIA GeForce FX 5200 .*NVIDIA .*GeForce FX 52.* 0 1
-NVIDIA GeForce FX 5300 .*NVIDIA .*GeForce FX 53.* 0 1
-NVIDIA GeForce FX 5500 .*NVIDIA .*GeForce FX 55.* 0 1
-NVIDIA GeForce FX 5600 .*NVIDIA .*GeForce FX 56.* 0 1
-NVIDIA GeForce FX 5700 .*NVIDIA .*GeForce FX 57.* 1 1
-NVIDIA GeForce FX 5800 .*NVIDIA .*GeForce FX 58.* 1 1
-NVIDIA GeForce FX 5900 .*NVIDIA .*GeForce FX 59.* 1 1
-NVIDIA GeForce FX Go5100 .*NVIDIA .*GeForce FX Go51.* 0 1
-NVIDIA GeForce FX Go5200 .*NVIDIA .*GeForce FX Go52.* 0 1
-NVIDIA GeForce FX Go5300 .*NVIDIA .*GeForce FX Go53.* 0 1
-NVIDIA GeForce FX Go5500 .*NVIDIA .*GeForce FX Go55.* 0 1
-NVIDIA GeForce FX Go5600 .*NVIDIA .*GeForce FX Go56.* 0 1
-NVIDIA GeForce FX Go5700 .*NVIDIA .*GeForce FX Go57.* 1 1
-NVIDIA GeForce FX Go5800 .*NVIDIA .*GeForce FX Go58.* 1 1
-NVIDIA GeForce FX Go5900 .*NVIDIA .*GeForce FX Go59.* 1 1
-NVIDIA GeForce FX Go5xxx .*NVIDIA .*GeForce FX Go.* 0 1
-NVIDIA GeForce Go 6100 .*NVIDIA .*GeForce Go 61.* 0 1
-NVIDIA GeForce Go 6200 .*NVIDIA .*GeForce Go 62.* 0 1
-NVIDIA GeForce Go 6400 .*NVIDIA .*GeForce Go 64.* 1 1
-NVIDIA GeForce Go 6500 .*NVIDIA .*GeForce Go 65.* 1 1
-NVIDIA GeForce Go 6600 .*NVIDIA .*GeForce Go 66.* 1 1
-NVIDIA GeForce Go 6700 .*NVIDIA .*GeForce Go 67.* 1 1
-NVIDIA GeForce Go 6800 .*NVIDIA .*GeForce Go 68.* 1 1
-NVIDIA GeForce Go 7200 .*NVIDIA .*GeForce Go 72.* 1 1
-NVIDIA GeForce Go 7300 LE .*NVIDIA .*GeForce Go 73.*LE.* 0 1
-NVIDIA GeForce Go 7300 .*NVIDIA .*GeForce Go 73.* 1 1
-NVIDIA GeForce Go 7400 .*NVIDIA .*GeForce Go 74.* 1 1
-NVIDIA GeForce Go 7600 .*NVIDIA .*GeForce Go 76.* 2 1
-NVIDIA GeForce Go 7700 .*NVIDIA .*GeForce Go 77.* 2 1
-NVIDIA GeForce Go 7800 .*NVIDIA .*GeForce Go 78.* 2 1
-NVIDIA GeForce Go 7900 .*NVIDIA .*GeForce Go 79.* 2 1
-NVIDIA D9M .*NVIDIA .*D9M.* 1 1
-NVIDIA G94 .*NVIDIA .*G94.* 3 1
-NVIDIA GeForce Go 6 .*GeForce Go 6.* 1 1
-NVIDIA ION 2 .*NVIDIA .*ION 2.* 2 1
-NVIDIA ION .*NVIDIA .*ION.* 2 1
-NVIDIA NB8M .*NVIDIA .*NB8M.* 1 1
-NVIDIA NB8P .*NVIDIA .*NB8P.* 2 1
-NVIDIA NB9E .*NVIDIA .*NB9E.* 3 1
-NVIDIA NB9M .*NVIDIA .*NB9M.* 1 1
-NVIDIA NB9P .*NVIDIA .*NB9P.* 2 1
-NVIDIA N10 .*NVIDIA .*N10.* 1 1
-NVIDIA GeForce PCX .*GeForce PCX.* 0 1
-NVIDIA Generic .*NVIDIA .*Unknown.* 0 0
-NVIDIA NV17 .*NVIDIA .*NV17.* 0 1
-NVIDIA NV34 .*NVIDIA .*NV34.* 0 1
-NVIDIA NV35 .*NVIDIA .*NV35.* 0 1
-NVIDIA NV36 .*NVIDIA .*NV36.* 1 1
-NVIDIA NV41 .*NVIDIA .*NV41.* 1 1
-NVIDIA NV43 .*NVIDIA .*NV43.* 1 1
-NVIDIA NV44 .*NVIDIA .*NV44.* 1 1
-NVIDIA nForce .*NVIDIA .*nForce.* 0 0
-NVIDIA MCP51 .*NVIDIA .*MCP51.* 1 1
-NVIDIA MCP61 .*NVIDIA .*MCP61.* 1 1
-NVIDIA MCP67 .*NVIDIA .*MCP67.* 1 1
-NVIDIA MCP68 .*NVIDIA .*MCP68.* 1 1
-NVIDIA MCP73 .*NVIDIA .*MCP73.* 1 1
-NVIDIA MCP77 .*NVIDIA .*MCP77.* 1 1
-NVIDIA MCP78 .*NVIDIA .*MCP78.* 1 1
-NVIDIA MCP79 .*NVIDIA .*MCP79.* 1 1
-NVIDIA MCP7A .*NVIDIA .*MCP7A.* 1 1
-NVIDIA Quadro2 .*Quadro2.* 0 1
-NVIDIA Quadro 1000M .*Quadro.*1000M.* 2 1
-NVIDIA Quadro 2000 M/D .*Quadro.*2000.* 3 1
-NVIDIA Quadro 3000M .*Quadro.*3000M.* 3 1
-NVIDIA Quadro 4000M .*Quadro.*4000M.* 3 1
-NVIDIA Quadro 4000 .*Quadro *4000.* 3 1
-NVIDIA Quadro 50x0 M .*Quadro.*50.0.* 3 1
-NVIDIA Quadro 6000 .*Quadro.*6000.* 3 1
-NVIDIA Quadro 400 .*Quadro.*400.* 2 1
-NVIDIA Quadro 600 .*Quadro.*600.* 2 1
-NVIDIA Quadro4 .*Quadro4.* 0 1
-NVIDIA Quadro DCC .*Quadro DCC.* 0 1
-NVIDIA Quadro CX .*Quadro.*CX.* 3 1
-NVIDIA Quadro FX 770M .*Quadro.*FX *770M.* 2 1
-NVIDIA Quadro FX 1500M .*Quadro.*FX *1500M.* 1 1
-NVIDIA Quadro FX 1600M .*Quadro.*FX *1600M.* 2 1
-NVIDIA Quadro FX 2500M .*Quadro.*FX *2500M.* 2 1
-NVIDIA Quadro FX 2700M .*Quadro.*FX *2700M.* 3 1
-NVIDIA Quadro FX 2800M .*Quadro.*FX *2800M.* 3 1
-NVIDIA Quadro FX 3500 .*Quadro.*FX *3500.* 2 1
-NVIDIA Quadro FX 3600 .*Quadro.*FX *3600.* 3 1
-NVIDIA Quadro FX 3700 .*Quadro.*FX *3700.* 3 1
-NVIDIA Quadro FX 3800 .*Quadro.*FX *3800.* 3 1
-NVIDIA Quadro FX 4500 .*Quadro.*FX *45.* 3 1
-NVIDIA Quadro FX 880M .*Quadro.*FX *880M.* 3 1
-NVIDIA Quadro FX 4800 .*NVIDIA .*Quadro *FX *4800.* 3 1
-NVIDIA Quadro FX .*Quadro FX.* 1 1
-NVIDIA Quadro NVS 1xxM .*Quadro NVS *1.[05]M.* 0 1
-NVIDIA Quadro NVS 300M .*NVIDIA .*NVS *300M.* 2 1
-NVIDIA Quadro NVS 320M .*NVIDIA .*NVS *320M.* 2 1
-NVIDIA Quadro NVS 2100M .*NVIDIA .*NVS *2100M.* 2 1
-NVIDIA Quadro NVS 3100M .*NVIDIA .*NVS *3100M.* 2 1
-NVIDIA Quadro NVS 4200M .*NVIDIA .*NVS *4200M.* 2 1
-NVIDIA Quadro NVS 5100M .*NVIDIA .*NVS *5100M.* 2 1
-NVIDIA Quadro NVS .*NVIDIA .*NVS 0 1
-NVIDIA RIVA TNT .*RIVA TNT.* 0 0
-S3 .*S3 Graphics.* 0 0
-SiS SiS.* 0 0
-Trident Trident.* 0 0
-Tungsten Graphics Tungsten.* 0 0
-XGI XGI.* 0 0
-VIA VIA.* 0 0
-Apple Generic Apple.*Generic.* 0 0
-Apple Software Renderer Apple.*Software Renderer.* 0 0
-Humper Humper.* 0 1
+3Dfx .*3Dfx.* 0 0 0 0
+3Dlabs .*3Dlabs.* 0 0 0 0
+ATI 3D-Analyze .*ATI.*3D-Analyze.* 0 0 0 0
+ATI All-in-Wonder 7500 .*ATI.*All-in-Wonder 75.* 0 1 0 0
+ATI All-in-Wonder 8500 .*ATI.*All-in-Wonder 85.* 0 1 0 0
+ATI All-in-Wonder 9200 .*ATI.*All-in-Wonder 92.* 0 1 0 0
+ATI All-in-Wonder 9xxx .*ATI.*All-in-Wonder 9.* 1 1 0 0
+ATI All-in-Wonder HD .*ATI.*All-in-Wonder HD.* 1 1 1 3.3
+ATI All-in-Wonder X600 .*ATI.*All-in-Wonder X6.* 1 1 0 0
+ATI All-in-Wonder X800 .*ATI.*All-in-Wonder X8.* 1 1 1 2.1
+ATI All-in-Wonder X1800 .*ATI.*All-in-Wonder X18.* 3 1 0 0
+ATI All-in-Wonder X1900 .*ATI.*All-in-Wonder X19.* 3 1 0 0
+ATI All-in-Wonder PCI-E .*ATI.*All-in-Wonder.*PCI-E.* 1 1 0 0
+ATI All-in-Wonder Radeon .*ATI.*All-in-Wonder Radeon.* 0 1 0 0
+ATI ASUS ARES .*ATI.*ASUS.*ARES.* 3 1 0 0
+ATI ASUS A9xxx .*ATI.*ASUS.*A9.* 1 1 0 0
+ATI ASUS AH24xx .*ATI.*ASUS.*AH24.* 1 1 1 3.3
+ATI ASUS AH26xx .*ATI.*ASUS.*AH26.* 1 1 1 3.3
+ATI ASUS AH34xx .*ATI.*ASUS.*AH34.* 1 1 1 3.3
+ATI ASUS AH36xx .*ATI.*ASUS.*AH36.* 1 1 1 3.3
+ATI ASUS AH46xx .*ATI.*ASUS.*AH46.* 2 1 1 3.3
+ATI ASUS AX3xx .*ATI.*ASUS.*AX3.* 1 1 0 0
+ATI ASUS AX5xx .*ATI.*ASUS.*AX5.* 1 1 0 0
+ATI ASUS AX8xx .*ATI.*ASUS.*AX8.* 2 1 0 0
+ATI ASUS EAH24xx .*ATI.*ASUS.*EAH24.* 2 1 0 0
+ATI ASUS EAH26xx .*ATI.*ASUS.*EAH26.* 3 1 0 0
+ATI ASUS EAH29xx .*ATI.*ASUS.*EAH29.* 3 1 0 0
+ATI ASUS EAH34xx .*ATI.*ASUS.*EAH34.* 1 1 0 0
+ATI ASUS EAH36xx .*ATI.*ASUS.*EAH36.* 2 1 0 0
+ATI ASUS EAH38xx .*ATI.*ASUS.*EAH38.* 2 1 1 3.3
+ATI ASUS EAH43xx .*ATI.*ASUS.*EAH43.* 2 1 1 3.3
+ATI ASUS EAH45xx .*ATI.*ASUS.*EAH45.* 2 1 0 0
+ATI ASUS EAH48xx .*ATI.*ASUS.*EAH48.* 3 1 1 3.3
+ATI ASUS EAH57xx .*ATI.*ASUS.*EAH57.* 3 1 1 4.1
+ATI ASUS EAH58xx .*ATI.*ASUS.*EAH58.* 5 1 1 4.1
+ATI ASUS EAH62xx .*ATI.*ASUS.*EAH62.* 2 1 0 0
+ATI ASUS EAH63xx .*ATI.*ASUS.*EAH63.* 2 1 0 0
+ATI ASUS EAH64xx .*ATI.*ASUS.*EAH64.* 2 1 0 0
+ATI ASUS EAH65xx .*ATI.*ASUS.*EAH65.* 2 1 0 4.1
+ATI ASUS EAH66xx .*ATI.*ASUS.*EAH66.* 3 1 0 4.1
+ATI ASUS EAH67xx .*ATI.*ASUS.*EAH67.* 3 1 0 0
+ATI ASUS EAH68xx .*ATI.*ASUS.*EAH68.* 5 1 0 4
+ATI ASUS EAH69xx .*ATI.*ASUS.*EAH69.* 5 1 0 4.1
+ATI ASUS Radeon X1xxx .*ATI.*ASUS.*X1.* 2 1 1 2.1
+ATI Radeon X7xx .*ATI.*ASUS.*X7.* 1 1 0 0
+ATI Radeon X19xx .*ATI.*(Radeon|Diamond) X19.* ?.* 2 1 1 2.1
+ATI Radeon X18xx .*ATI.*(Radeon|Diamond) X18.* ?.* 3 1 1 2.1
+ATI Radeon X17xx .*ATI.*(Radeon|Diamond) X17.* ?.* 1 1 1 2.1
+ATI Radeon X16xx .*ATI.*(Radeon|Diamond) X16.* ?.* 1 1 1 2.1
+ATI Radeon X15xx .*ATI.*(Radeon|Diamond) X15.* ?.* 1 1 1 2.1
+ATI Radeon X13xx .*ATI.*(Radeon|Diamond) X13.* ?.* 1 1 1 2.1
+ATI Radeon X1xxx .*ATI.*(Radeon|Diamond) X1.. ?.* 0 1 1 2.1
+ATI Radeon X2xxx .*ATI.*(Radeon|Diamond) X2.. ?.* 1 1 1 2.1
+ATI Display Adapter .*ATI.*display adapter.* 1 1 1 4.1
+ATI FireGL 5200 .*ATI.*FireGL V52.* 1 1 1 2.1
+ATI FireGL 5xxx .*ATI.*FireGL V5.* 2 1 1 3.3
+ATI FireGL .*ATI.*Fire.*GL.* 4 1 1 4.2
+ATI FirePro M3900 .*ATI.*FirePro.*M39.* 2 1 0 0
+ATI FirePro M5800 .*ATI.*FirePro.*M58.* 3 1 0 0
+ATI FirePro M7740 .*ATI.*FirePro.*M77.* 3 1 0 0
+ATI FirePro M7820 .*ATI.*FirePro.*M78.* 5 1 1 4.2
+ATI FireMV .*ATI.*FireMV.* 0 1 1 1.3
+ATI Generic .*ATI.*Generic.* 0 0 0 0
+ATI Hercules 9800 .*ATI.*Hercules.*9800.* 1 1 0 0
+ATI IGP 340M .*ATI.*IGP.*340M.* 0 0 0 0
+ATI M52 .*ATI.*M52.* 1 1 0 0
+ATI M54 .*ATI.*M54.* 1 1 0 0
+ATI M56 .*ATI.*M56.* 1 1 0 0
+ATI M71 .*ATI.*M71.* 1 1 0 0
+ATI M72 .*ATI.*M72.* 1 1 0 0
+ATI M76 .*ATI.*M76.* 3 1 0 0
+ATI Radeon HD 64xx .*ATI.*AMD Radeon.* HD [67]4..[MG] 2 1 1 4.2
+ATI Radeon HD 65xx .*ATI.*AMD Radeon.* HD [67]5..[MG] 2 1 1 4.2
+ATI Radeon HD 66xx .*ATI.*AMD Radeon.* HD [67]6..[MG] 3 1 1 4.2
+ATI Radeon HD 7100 .*ATI.*AMD Radeon.* HD 71.* 2 1 0 0
+ATI Radeon HD 7200 .*ATI.*AMD Radeon.* HD 72.* 2 1 0 0
+ATI Radeon HD 7300 .*ATI.*AMD Radeon.* HD 73.* 2 1 0 4.2
+ATI Radeon HD 7400 .*ATI.*AMD Radeon.* HD 74.* 2 1 0 4.2
+ATI Radeon HD 7500 .*ATI.*AMD Radeon.* HD 75.* 3 1 1 4.2
+ATI Radeon HD 7600 .*ATI.*AMD Radeon.* HD 76.* 3 1 0 4.2
+ATI Radeon HD 7700 .*ATI.*AMD Radeon.* HD 77.* 4 1 1 4.2
+ATI Radeon HD 7800 .*ATI.*AMD Radeon.* HD 78.* 5 1 1 4.2
+ATI Radeon HD 7900 .*ATI.*AMD Radeon.* HD 79.* 5 1 1 4.2
+ATI ASUS HD7100 .*ATI.*ASUS.* HD71.* 2 1 0 0
+ATI ASUS HD7200 .*ATI.*ASUS.* HD72.* 2 1 0 0
+ATI ASUS HD7300 .*ATI.*ASUS.* HD73.* 2 1 0 0
+ATI ASUS HD7400 .*ATI.*ASUS.* HD74.* 2 1 0 0
+ATI ASUS HD7500 .*ATI.*ASUS.* HD75.* 3 1 1 4.2
+ATI ASUS HD7600 .*ATI.*ASUS.* HD76.* 3 1 0 0
+ATI ASUS HD7700 .*ATI.*ASUS.* HD77.* 4 1 1 4.2
+ATI ASUS HD7800 .*ATI.*ASUS.* HD78.* 5 1 1 4.2
+ATI ASUS HD7900 .*ATI.*ASUS.* HD79.* 5 1 1 4.2
+ATI Mobility Radeon 4100 .*ATI.*Mobility.*41.. 1 1 1 3.3
+ATI Mobility Radeon 7xxx .*ATI.*Mobility.*Radeon 7.* 0 1 1 1.3
+ATI Mobility Radeon 8xxx .*ATI.*Mobility.*Radeon 8.* 0 1 0 0
+ATI Mobility Radeon 9800 .*ATI.*Mobility.*98.* 1 1 0 0
+ATI Mobility Radeon 9700 .*ATI.*Mobility.*97.* 0 1 1 2.1
+ATI Mobility Radeon 9600 .*ATI.*Mobility.*96.* 1 1 1 2.1
+ATI Mobility Radeon HD 530v .*ATI.*Mobility.*HD *530v.* 1 1 1 3.3
+ATI Mobility Radeon HD 540v .*ATI.*Mobility.*HD *540v.* 1 1 1 3.3
+ATI Mobility Radeon HD 545v .*ATI.*Mobility.*HD *545v.* 2 1 1 4
+ATI Mobility Radeon HD 550v .*ATI.*Mobility.*HD *550v.* 3 1 1 4
+ATI Mobility Radeon HD 560v .*ATI.*Mobility.*HD *560v.* 3 1 1 3.2
+ATI Mobility Radeon HD 565v .*ATI.*Mobility.*HD *565v.* 3 1 1 3.3
+ATI Mobility Radeon HD 2300 .*ATI.*Mobility.*HD *23.* 0 1 1 2.1
+ATI Mobility Radeon HD 2400 .*ATI.*Mobility.*HD *24.* 1 1 1 3.3
+ATI Mobility Radeon HD 2600 .*ATI.*Mobility.*HD *26.* 1 1 1 3.3
+ATI Mobility Radeon HD 2700 .*ATI.*Mobility.*HD *27.* 3 1 0 0
+ATI Mobility Radeon HD 3100 .*ATI.*Mobility.*HD *31.* 0 1 0 0
+ATI Mobility Radeon HD 3200 .*ATI.*Mobility.*HD *32.* 0 1 0 0
+ATI Mobility Radeon HD 3400 .*ATI.*Mobility.*HD *34.* 1 1 1 3.3
+ATI Mobility Radeon HD 3600 .*ATI.*Mobility.*HD *36.* 1 1 1 4
+ATI Mobility Radeon HD 3800 .*ATI.*Mobility.*HD *38.* 3 1 1 3.3
+ATI Mobility Radeon HD 4200 .*ATI.*Mobility.*HD *42.* 1 1 1 4
+ATI Mobility Radeon HD 4300 .*ATI.*Mobility.*HD *43.* 1 1 1 4
+ATI Mobility Radeon HD 4500 .*ATI.*Mobility.*HD *45.* 1 1 1 4
+ATI Mobility Radeon HD 4600 .*ATI.*Mobility.*HD *46.* 2 1 1 3.3
+ATI Mobility Radeon HD 4800 .*ATI.*Mobility.*HD *48.* 3 1 1 3.3
+ATI Mobility Radeon HD 5100 .*ATI.*Mobility.*HD *51.* 3 1 1 3.2
+ATI Mobility Radeon HD 5300 .*ATI.*Mobility.*HD *53.* 3 1 0 0
+ATI Mobility Radeon HD 5400 .*ATI.*Mobility.*HD *54.* 2 1 1 4.2
+ATI Mobility Radeon HD 5500 .*ATI.*Mobility.*HD *55.* 3 1 0 0
+ATI Mobility Radeon HD 5600 .*ATI.*Mobility.*HD *56.* 3 1 1 4.2
+ATI Mobility Radeon HD 5700 .*ATI.*Mobility.*HD *57.* 3 1 1 4.1
+ATI Mobility Radeon HD 6200 .*ATI.*Mobility.*HD *62.* 3 1 0 0
+ATI Mobility Radeon HD 6300 .*ATI.*Mobility.*HD *63.* 3 1 1 4.2
+ATI Mobility Radeon HD 6400M .*ATI.*Mobility.*HD *64.* 3 1 0 0
+ATI Mobility Radeon HD 6500M .*ATI.*Mobility.*HD *65.* 5 1 1 4.2
+ATI Mobility Radeon HD 6600M .*ATI.*Mobility.*HD *66.* 5 1 0 0
+ATI Mobility Radeon HD 6700M .*ATI.*Mobility.*HD *67.* 5 1 0 0
+ATI Mobility Radeon HD 6800M .*ATI.*Mobility.*HD *68.* 5 1 0 0
+ATI Mobility Radeon HD 6900M .*ATI.*Mobility.*HD *69.* 5 1 0 0
+ATI Radeon HD 2300 .*ATI.*Radeon HD *23.. 0 1 1 3.3
+ATI Radeon HD 2400 .*ATI.*Radeon HD *24.. 1 1 1 4
+ATI Radeon HD 2600 .*ATI.*Radeon HD *26.. 2 1 1 3.3
+ATI Radeon HD 2900 .*ATI.*Radeon HD *29.. 3 1 1 3.3
+ATI Radeon HD 3000 .*ATI.*Radeon HD *30.. 0 1 0 0
+ATI Radeon HD 3100 .*ATI.*Radeon HD *31.. 1 1 0 0
+ATI Radeon HD 3200 .*ATI.*Radeon HD *32.. 1 1 1 4
+ATI Radeon HD 3300 .*ATI.*Radeon HD *33.. 1 1 1 3.3
+ATI Radeon HD 3400 .*ATI.*Radeon HD *34.. 1 1 1 4
+ATI Radeon HD 3500 .*ATI.*Radeon HD *35.. 2 1 0 0
+ATI Radeon HD 3600 .*ATI.*Radeon HD *36.. 3 1 1 3.3
+ATI Radeon HD 3700 .*ATI.*Radeon HD *37.. 3 1 0 0
+ATI HD3700 .*ATI.* HD37.. 3 1 0 3.3
+ATI Radeon HD 3800 .*ATI.*Radeon HD *38.. 3 1 1 4
+ATI Radeon HD 4100 .*ATI.*Radeon HD *41.. 1 1 0 0
+ATI Radeon HD 4200 .*ATI.*Radeon HD *42.. 1 1 1 4
+ATI Radeon HD 4300 .*ATI.*Radeon HD *43.. 2 1 1 4
+ATI Radeon HD 4400 .*ATI.*Radeon HD *44.. 2 1 0 0
+ATI Radeon HD 4500 .*ATI.*Radeon HD *45.. 2 1 1 3.3
+ATI Radeon HD 4600 .*ATI.*Radeon HD *46.. 3 1 1 4
+ATI Radeon HD 4700 .*ATI.*Radeon HD *47.. 3 1 1 3.3
+ATI Radeon HD 4800 .*ATI.*Radeon HD *48.. 3 1 1 4
+ATI ASUS EAH5400 .*ATI.*ASUS EAH54.. 3 1 1 4.2
+ATI Radeon HD 5400 .*ATI.*Radeon HD *54.. 3 1 1 4.2
+ATI Radeon HD 5500 .*ATI.*Radeon HD *55.. 3 1 1 4.2
+ATI ASUS EAH5500 .*ATI.*ASUS EAH55.. 3 1 1 4.2
+ATI Radeon HD 5600 .*ATI.*Radeon HD *56.. 3 1 1 4.2
+ATI Radeon HD 5700 .*ATI.*Radeon HD *57.. 3 1 1 4.2
+ATI Radeon HD 5800 .*ATI.*Radeon HD *58.. 4 1 1 4.2
+ATI Radeon HD 5900 .*ATI.*Radeon HD *59.. 4 1 1 4.2
+ATI Radeon HD 6200 .*ATI.*Radeon HD *62.. 0 1 1 4.2
+ATI Radeon HD 6300 .*ATI.*Radeon HD *63.. 1 1 1 4.2
+ATI Radeon HD 6400 .*ATI.*Radeon HD *64.. 3 1 1 4.2
+ATI Radeon HD 6500 .*ATI.*Radeon HD *65.. 3 1 1 4.2
+ATI Radeon HD 6600 .*ATI.*Radeon HD *66.. 3 1 1 4.2
+ATI Radeon HD 6700 .*ATI.*Radeon HD *67.. 3 1 1 4.2
+ATI Radeon HD 6800 .*ATI.*Radeon HD *68.. 4 1 1 4.2
+ATI Radeon HD 6900 .*ATI.*Radeon HD *69.. 5 1 1 4.2
+ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0 0 0
+ATI Radeon 2100 .*ATI.*Radeon 21.. 0 1 1 2.1
+ATI Radeon 3000 .*ATI.*Radeon 30.. 1 1 1 4
+ATI Radeon 3100 .*ATI.*Radeon 31.. 0 1 1 3.3
+ATI Radeon 5xxx .*ATI.*Radeon 5... 3 1 0 0
+ATI Radeon 7xxx .*ATI.*Radeon 7... 0 1 1 2
+ATI Radeon 8xxx .*ATI.*Radeon 8... 0 1 0 0
+ATI Radeon 9000 .*ATI.*Radeon 90.. 0 1 1 1.3
+ATI Radeon 9100 .*ATI.*Radeon 91.. 0 1 0 0
+ATI Radeon 9200 .*ATI.*Radeon 92.. 0 1 1 1.3
+ATI Radeon 9500 .*ATI.*Radeon 95.. 0 1 1 2.1
+ATI Radeon 9600 .*ATI.*Radeon 96.. 0 1 1 2.1
+ATI Radeon 9700 .*ATI.*Radeon 97.. 1 1 0 0
+ATI Radeon 9800 .*ATI.*Radeon 98.. 1 1 1 2.1
+ATI Radeon RV250 .*ATI.*RV250.* 0 1 0 0
+ATI Radeon RV600 .*ATI.*RV6.* 1 1 0 0
+ATI Radeon RX700 .*ATI.*RX70.* 1 1 0 0
+ATI Radeon RX800 .*ATI.*Radeon *RX80.* 2 1 0 0
+ATI RS880M .*ATI.*RS880M 1 1 0 0
+ATI Radeon RX9550 .*ATI.*RX9550.* 1 1 0 0
+ATI Radeon VE .*ATI.*Radeon.*VE.* 0 0 0 0
+ATI Radeon X300 .*ATI.*Radeon *X3.* 1 1 1 2.1
+ATI Radeon X400 .*ATI.*Radeon ?X4.* 0 1 0 0
+ATI Radeon X500 .*ATI.*Radeon ?X5.* 1 1 1 2.1
+ATI Radeon X600 .*ATI.*Radeon ?X6.* 1 1 1 2.1
+ATI Radeon X700 .*ATI.*Radeon ?X7.* 2 1 1 2.1
+ATI Radeon X800 .*ATI.*Radeon ?X8.* 1 1 1 2.1
+ATI Radeon X900 .*ATI.*Radeon ?X9.* 2 1 0 0
+ATI Radeon Xpress .*ATI.*Radeon Xpress.* 0 1 1 2.1
+ATI Rage 128 .*ATI.*Rage 128.* 0 1 0 0
+ATI R300 (9700) .*R300.* 0 1 1 2.1
+ATI R350 (9800) .*R350.* 1 1 0 0
+ATI R580 (X1900) .*R580.* 3 1 0 0
+ATI RC410 (Xpress 200) .*RC410.* 0 0 0 0
+ATI RS48x (Xpress 200x) .*RS48.* 0 0 0 0
+ATI RS600 (Xpress 3200) .*RS600.* 0 0 0 0
+ATI RV350 (9600) .*RV350.* 0 1 0 0
+ATI RV370 (X300) .*RV370.* 0 1 0 0
+ATI RV410 (X700) .*RV410.* 1 1 0 0
+ATI RV515 .*RV515.* 1 1 0 0
+ATI RV570 (X1900 GT/PRO) .*RV570.* 3 1 0 0
+ATI RV380 .*RV380.* 0 1 0 0
+ATI RV530 .*RV530.* 1 1 0 0
+ATI RX480 (Xpress 200P) .*RX480.* 0 1 0 0
+ATI RX700 .*RX700.* 1 1 0 0
+AMD ANTILLES (HD 6990) .*(AMD|ATI).*Antilles.* 3 1 0 0
+AMD BARTS (HD 6800) .*(AMD|ATI).*Barts.* 3 1 1 2.1
+AMD CAICOS (HD 6400) .*(AMD|ATI).*Caicos.* 3 1 0 0
+AMD CAYMAN (HD 6900) .*(AMD|ATI).*(Cayman|CAYMAM).* 3 1 0 0
+AMD CEDAR (HD 5450) .*(AMD|ATI).*Cedar.* 2 1 0 0
+AMD CYPRESS (HD 5800) .*(AMD|ATI).*Cypress.* 3 1 0 0
+AMD HEMLOCK (HD 5970) .*(AMD|ATI).*Hemlock.* 3 1 0 0
+AMD JUNIPER (HD 5700) .*(AMD|ATI).*Juniper.* 3 1 0 0
+AMD PARK .*(AMD|ATI).*Park.* 3 1 0 0
+AMD REDWOOD (HD 5500/5600) .*(AMD|ATI).*Redwood.* 3 1 0 0
+AMD TURKS (HD 6500/6600) .*(AMD|ATI).*Turks.* 3 1 0 0
+AMD RS780 (HD 3200) .*RS780.* 0 1 1 2.1
+AMD RS880 (HD 4200) .*RS880.* 0 1 1 3.2
+AMD RV610 (HD 2400) .*RV610.* 1 1 0 0
+AMD RV620 (HD 3400) .*RV620.* 1 1 0 0
+AMD RV630 (HD 2600) .*RV630.* 2 1 0 0
+AMD RV635 (HD 3600) .*RV635.* 3 1 0 0
+AMD RV670 (HD 3800) .*RV670.* 3 1 0 0
+AMD R680 (HD 3870 X2) .*R680.* 3 1 0 0
+AMD R700 (HD 4800 X2) .*R700.* 3 1 0 0
+AMD RV710 (HD 4300) .*RV710.* 0 1 1 1.4
+AMD RV730 (HD 4600) .*RV730.* 3 1 0 0
+AMD RV740 (HD 4700) .*RV740.* 3 1 0 0
+AMD RV770 (HD 4800) .*RV770.* 3 1 0 0
+AMD RV790 (HD 4800) .*RV790.* 3 1 0 0
+ATI 760G/Radeon 3000 .*ATI.*AMD 760G.* 1 1 1 3.3
+ATI 780L/Radeon 3000 .*ATI.*AMD 780L.* 1 1 0 0
+ATI Radeon DDR .*ATI.*Radeon ?DDR.* 0 1 0 0
+ATI FirePro 2000 .*ATI.*FirePro 2.* 2 1 1 4.1
+ATI FirePro 3000 .*ATI.*FirePro V3.* 2 1 0 0
+ATI FirePro 4000 .*ATI.*FirePro V4.* 2 1 0 0
+ATI FirePro 5000 .*ATI.*FirePro V5.* 3 1 0 0
+ATI FirePro 7000 .*ATI.*FirePro V7.* 3 1 0 0
+ATI FirePro M .*ATI.*FirePro M.* 3 1 1 4.2
+ATI R300 (9700) .*R300.* 0 1 1 2.1
+ATI Radeon .*ATI.*(Diamond|Radeon).* 0 1 0 4.2
+Intel X3100 .*Intel.*X3100.* 1 1 1 2.1
+Intel GMA 3600 .*Intel.* 3600.* 0 1 1 3
+Intel 830M .*Intel.*830M 0 0 0 0
+Intel 845G .*Intel.*845G 0 0 1 1.4
+Intel 855GM .*Intel.*855GM 0 0 1 1.4
+Intel 865G .*Intel.*865G 0 0 1 1.4
+Intel 900 .*Intel.*900.*900 0 0 0 0
+Intel 915GM .*Intel.*915GM 0 0 1 1.4
+Intel 915G .*Intel.*915G 0 0 1 1.4
+Intel 945GM .*Intel.*945GM.* 0 1 1 1.4
+Intel 945G .*Intel.*945G.* 0 1 1 1.4
+Intel 950 .*Intel.*950.* 0 1 1 1.4
+Intel 965 .*Intel.*965.* 0 1 1 2.1
+Intel G33 .*Intel.*G33.* 1 0 1 1.4
+Intel G41 .*Intel.*G41.* 1 1 1 2.1
+Intel G45 .*Intel.*G45.* 1 1 1 2.1
+Intel Bear Lake .*Intel.*Bear Lake.* 1 0 1 1.4
+Intel Broadwater .*Intel.*Broadwater.* 0 0 1 1.4
+Intel Brookdale .*Intel.*Brookdale.* 0 0 1 1.3
+Intel Cantiga .*Intel.*Cantiga.* 0 0 1 2
+Intel Eaglelake .*Intel.*Eaglelake.* 1 1 1 2
+Intel Graphics Media HD .*Intel.*Graphics Media.*HD.* 1 1 1 2.1
+Intel HD Graphics 2000 .*Intel.*HD Graphics 2.* 2 1 0 4
+Intel HD Graphics 3000 .*Intel.*HD Graphics 3.* 3 1 1 3.1
+Intel HD Graphics 4000 .*Intel.*HD Graphics 4.* 3 1 1 4
+Intel HD2000 .*Intel.*HD2000.* 2 1 0 0
+Intel HD3000 .*Intel.*HD3000.* 3 1 0 0
+Intel HD Graphics .*Intel.*HD Graphics.* 2 1 1 4
+Intel Mobile 4 Series .*Intel.*Mobile.* 4 Series.* 0 1 1 2.1
+Intel 4 Series Internal .*Intel.* 4 Series Internal.* 1 1 1 2.1
+Intel Media Graphics HD .*Intel.*Media Graphics HD.* 0 1 0 0
+Intel Montara .*Intel.*Montara.* 0 0 1 1.3
+Intel Pineview .*Intel.*Pineview.* 0 1 1 1.4
+Intel Springdale .*Intel.*Springdale.* 0 0 1 1.3
+Intel Grantsdale .*Intel.*Grantsdale.* 1 1 0 0
+Intel Q45/Q43 .*Intel.*Q4.* 1 1 1 2.1
+Intel B45/B43 .*Intel.*B4.* 1 1 1 2.1
+Intel 3D-Analyze .*Intel.*3D-Analyze.* 2 1 0 0
+Matrox .*Matrox.* 0 0 0 0
+Mesa .*Mesa.* 1 0 1 2.1
+Gallium .*Gallium.* 1 1 1 2.1
+NVIDIA G100M .*NVIDIA .*100M.* 4 1 1 3.3
+NVIDIA G102M .*NVIDIA .*102M.* 1 1 1 3.3
+NVIDIA G103M .*NVIDIA .*103M.* 2 1 1 3.3
+NVIDIA G105M .*NVIDIA .*105M.* 2 1 1 3.3
+NVIDIA G 110M .*NVIDIA .*110M.* 1 1 1 3.3
+NVIDIA G 120M .*NVIDIA .*120M.* 1 1 1 3.3
+NVIDIA G 205M .*NVIDIA .*205M.* 1 1 0 0
+NVIDIA G 410M .*NVIDIA .*410M.* 3 1 1 4.2
+NVIDIA GT 120M .*NVIDIA .*GT *12*M.* 3 1 1 3.3
+NVIDIA GT 130M .*NVIDIA .*GT *13*M.* 3 1 1 3.3
+NVIDIA GT 140M .*NVIDIA .*GT *14*M.* 3 1 1 3.3
+NVIDIA GT 150M .*NVIDIA .*GTS *15*M.* 2 1 0 0
+NVIDIA GTS 160M .*NVIDIA .*GTS *16*M.* 2 1 0 0
+NVIDIA G210M .*NVIDIA .*G21*M.* 3 1 0 0
+NVIDIA GT 220M .*NVIDIA .*GT *22*M.* 3 1 1 3.3
+NVIDIA GT 230M .*NVIDIA .*GT *23*M.* 3 1 1 3.3
+NVIDIA GT 240M .*NVIDIA .*GT *24*M.* 3 1 1 3.3
+NVIDIA GTS 250M .*NVIDIA .*GTS *25*M.* 3 1 0 0
+NVIDIA GTS 260M .*NVIDIA .*GTS *26*M.* 3 1 0 0
+NVIDIA GTX 260M .*NVIDIA .*GTX *26*M.* 3 1 0 0
+NVIDIA GTX 270M .*NVIDIA .*GTX *27*M.* 3 1 0 0
+NVIDIA GTX 280M .*NVIDIA .*GTX *28*M.* 3 1 0 0
+NVIDIA 300M .*NVIDIA .*30*M.* 3 1 1 4.2
+NVIDIA G 310M .*NVIDIA .*31*M.* 2 1 0 0
+NVIDIA GT 320M .*NVIDIA .*GT *32*M.* 3 1 0 0
+NVIDIA GT 325M .*NVIDIA .*GT *32*M.* 3 1 1 3.3
+NVIDIA GT 330M .*NVIDIA .*GT *33*M.* 3 1 1 3.3
+NVIDIA GT 340M .*NVIDIA .*GT *34*M.* 4 1 1 3.3
+NVIDIA GTS 350M .*NVIDIA .*GTS *35*M.* 4 1 1 3.3
+NVIDIA GTS 360M .*NVIDIA .*GTS *360M.* 5 1 1 3.3
+NVIDIA 405M .*NVIDIA .* 40*M.* 2 1 0 4.2
+NVIDIA 410M .*NVIDIA .* 41*M.* 3 1 0 0
+NVIDIA GT 415M .*NVIDIA .*GT *41*M.* 3 1 1 4.2
+NVIDIA GT 420M .*NVIDIA .*GT *42*M.* 3 1 1 4.2
+NVIDIA GT 430M .*NVIDIA .*GT *43*M.* 3 1 1 4.2
+NVIDIA GT 440M .*NVIDIA .*GT *44*M.* 3 1 1 4.2
+NVIDIA GT 450M .*NVIDIA .*GT *45*M.* 3 1 0 0
+NVIDIA GTX 460M .*NVIDIA .*GTX *46*M.* 4 1 1 4.2
+NVIDIA GTX 470M .*NVIDIA .*GTX *47*M.* 3 1 0 0
+NVIDIA GTX 480M .*NVIDIA .*GTX *48*M.* 3 1 1 4.2
+NVIDIA GT 520M .*NVIDIA .*GT *52*M.* 3 1 1 4.2
+NVIDIA GT 530M .*NVIDIA .*GT *53*M.* 3 1 1 4.2
+NVIDIA GT 540M .*NVIDIA .*GT *54*M.* 3 1 1 4.2
+NVIDIA GT 550M .*NVIDIA .*GT *55*M.* 3 1 1 4.2
+NVIDIA GTX 560M .*NVIDIA .*GTX *56*M.* 3 1 0 0
+NVIDIA GTX 570M .*NVIDIA .*GTX *57*M.* 5 1 0 0
+NVIDIA GTX 580M .*NVIDIA .*GTX *58*M.* 5 1 1 4.2
+NVIDIA 610M .*NVIDIA.* 61*M.* 3 1 1 4.2
+NVIDIA GT 620M .*NVIDIA .*GT *62*M.* 3 1 0 0
+NVIDIA GT 630M .*NVIDIA .*GT *63*M.* 3 1 0 0
+NVIDIA GT 640M .*NVIDIA .*GT *64*M.* 3 1 0 0
+NVIDIA GT 650M .*NVIDIA .*GT *65*M.* 3 1 0 0
+NVIDIA GTX 660M .*NVIDIA .*GTX *66*M.* 5 1 0 0
+NVIDIA GTX 670M .*NVIDIA .*GTX *67*M.* 5 1 1 4.2
+NVIDIA GTX 680M .*NVIDIA .*GTX *68*M.* 5 1 0 0
+NVIDIA GTX 690M .*NVIDIA .*GTX *69*M.* 5 1 0 0
+NVIDIA G100 .*NVIDIA .*G10.* 3 1 1 4.2
+NVIDIA GT 120 .*NVIDIA .*GT *12.* 2 1 0 3
+NVIDIA GT 130 .*NVIDIA .*GT *13.* 2 1 0 3.3
+NVIDIA GTS 150 .*NVIDIA .*GTS *15.* 2 1 0 0
+NVIDIA 200 .*NVIDIA .*GeForce 20.* 2 1 1 3.3
+NVIDIA G200 .*NVIDIA .*GeForce G20.* 2 1 1 3.3
+NVIDIA G210 .*NVIDIA .*GeForce G210.* 3 1 1 3.3
+NVIDIA 210 .*NVIDIA .*GeForce 210.* 3 1 1 3.3
+NVIDIA GT 220 .*NVIDIA .*GT *22.* 2 1 1 3.3
+NVIDIA GT 230 .*NVIDIA .*GT *23.* 2 1 1 3.3
+NVIDIA GT 240 .*NVIDIA .*GT *24.* 4 1 1 3.3
+NVIDIA GTS 240 .*NVIDIA .*GTS *24.* 4 1 1 3.3
+NVIDIA GTS 250 .*NVIDIA .*GTS *25.* 4 1 1 3.3
+NVIDIA GTX 260 .*NVIDIA .*GTX *26.* 4 1 1 3.3
+NVIDIA GTX 270 .*NVIDIA .*GTX *27.* 4 1 0 3.3
+NVIDIA GTX 280 .*NVIDIA .*GTX *28.* 4 1 1 3.3
+NVIDIA GTX 290 .*NVIDIA .*GTX *29.* 5 1 0 3.3
+NVIDIA 310 .*NVIDIA .*GeForce 310.* 3 1 1 3.3
+NVIDIA 315 .*NVIDIA .*GeForce 315.* 3 1 1 3.3
+NVIDIA GT 320 .*NVIDIA .*GT *32.* 3 1 0 3.3
+NVIDIA GT 330 .*NVIDIA .*GT *33.* 3 1 0 3.3
+NVIDIA GT 340 .*NVIDIA .*GT *34.* 3 1 0 0
+NVIDIA 405 .*NVIDIA .* 405.* 3 1 0 3.3
+NVIDIA GT 420 .*NVIDIA .*GT *42.* 3 1 1 4.2
+NVIDIA GT 430 .*NVIDIA .*GT *43.* 3 1 1 4.2
+NVIDIA GT 440 .*NVIDIA .*GT *44.* 4 1 0 4.2
+NVIDIA GTS 450 .*NVIDIA .*GTS *45.* 4 1 1 4.2
+NVIDIA GTX 460 .*NVIDIA .*GTX *46.* 5 1 1 4.3
+NVIDIA GTX 470 .*NVIDIA .*GTX *47.* 5 1 1 4.2
+NVIDIA GTX 480 .*NVIDIA .*GTX *48.* 5 1 1 4.2
+NVIDIA 510 .*NVIDIA .* 510.* 3 1 0 0
+NVIDIA GT 520 .*NVIDIA .*GT *52.* 3 1 1 4.2
+NVIDIA GT 530 .*NVIDIA .*GT *53.* 3 1 1 4.2
+NVIDIA GT 540 .*NVIDIA .*GT *54.* 3 1 1 4.2
+NVIDIA GTX 550 .*NVIDIA .*GTX *55.* 5 1 1 4.3
+NVIDIA GTX 560 .*NVIDIA .*GTX *56.* 5 1 1 4.2
+NVIDIA GTX 570 .*NVIDIA .*GTX *57.* 5 1 1 4.2
+NVIDIA GTX 580 .*NVIDIA .*GTX *58.* 5 1 1 4.3
+NVIDIA GTX 590 .*NVIDIA .*GTX *59.* 5 1 1 4.2
+NVIDIA GT 610 .*NVIDIA .*GT *61.* 3 1 1 4.2
+NVIDIA GT 620 .*NVIDIA .*GT *62.* 3 1 0 4.2
+NVIDIA GT 630 .*NVIDIA .*GT *63.* 3 1 0 4.2
+NVIDIA GT 640 .*NVIDIA .*GT *64.* 3 1 0 4.3
+NVIDIA GT 650 .*NVIDIA .*GT *65.* 3 1 1 4.2
+NVIDIA GTX 650 .*NVIDIA .*GTX *65.* 3 1 1 4.2
+NVIDIA GTX 660 .*NVIDIA .*GTX *66.* 5 1 0 4.3
+NVIDIA GTX 670 .*NVIDIA .*GTX *67.* 5 1 1 4.2
+NVIDIA GTX 680 .*NVIDIA .*GTX *68.* 5 1 1 4.2
+NVIDIA GTX 690 .*NVIDIA .*GTX *69.* 5 1 1 4.2
+NVIDIA C51 .*NVIDIA .*C51.* 0 1 1 2
+NVIDIA G72 .*NVIDIA .*G72.* 1 1 0 0
+NVIDIA G73 .*NVIDIA .*G73.* 1 1 0 0
+NVIDIA G84 .*NVIDIA .*G84.* 2 1 0 0
+NVIDIA G86 .*NVIDIA .*G86.* 3 1 0 0
+NVIDIA G92 .*NVIDIA .*G92.* 3 1 0 0
+NVIDIA GeForce .*GeForce 256.* 0 0 0 0
+NVIDIA GeForce 2 .*GeForce ?2 ?.* 0 1 1 1.5
+NVIDIA GeForce 3 .*GeForce ?3 ?.* 2 1 1 2.1
+NVIDIA GeForce 3 Ti .*GeForce ?3 Ti.* 0 1 0 0
+NVIDIA GeForce 4 .*NVIDIA .*GeForce ?4.* 0 1 1 1.5
+NVIDIA GeForce 4 Go .*NVIDIA .*GeForce ?4.*Go.* 0 1 0 0
+NVIDIA GeForce 4 MX .*NVIDIA .*GeForce ?4 MX.* 0 1 0 0
+NVIDIA GeForce 4 PCX .*NVIDIA .*GeForce ?4 PCX.* 0 1 0 0
+NVIDIA GeForce 4 Ti .*NVIDIA .*GeForce ?4 Ti.* 0 1 0 0
+NVIDIA GeForce 6100 .*NVIDIA .*GeForce 61.* 3 1 1 4.2
+NVIDIA GeForce 6200 .*NVIDIA .*GeForce 62.* 0 1 1 2.1
+NVIDIA GeForce 6500 .*NVIDIA .*GeForce 65.* 1 1 1 2.1
+NVIDIA GeForce 6600 .*NVIDIA .*GeForce 66.* 2 1 1 2.1
+NVIDIA GeForce 6700 .*NVIDIA .*GeForce 67.* 2 1 1 2.1
+NVIDIA GeForce 6800 .*NVIDIA .*GeForce 68.* 1 1 1 2.1
+NVIDIA GeForce 7000 .*NVIDIA .*GeForce 70.* 1 1 1 2.1
+NVIDIA GeForce 7100 .*NVIDIA .*GeForce 71.* 1 1 1 2.1
+NVIDIA GeForce 7200 .*NVIDIA .*GeForce 72.* 1 1 0 0
+NVIDIA GeForce 7300 .*NVIDIA .*GeForce 73.* 1 1 1 2.1
+NVIDIA GeForce 7500 .*NVIDIA .*GeForce 75.* 2 1 1 2.1
+NVIDIA GeForce 7600 .*NVIDIA .*GeForce 76.* 2 1 1 2.1
+NVIDIA GeForce 7800 .*NVIDIA .*GeForce 78.* 2 1 1 2.1
+NVIDIA GeForce 7900 .*NVIDIA .*GeForce 79.* 3 1 1 2.1
+NVIDIA GeForce 8100 .*NVIDIA .*GeForce 81.* 1 1 0 0
+NVIDIA GeForce 8200M .*NVIDIA .*GeForce 8200M.* 1 1 0 3.3
+NVIDIA GeForce 8200 .*NVIDIA .*GeForce 82.* 1 1 0 2.1
+NVIDIA GeForce 8300 .*NVIDIA .*GeForce 83.* 3 1 1 3.3
+NVIDIA GeForce 8400M .*NVIDIA .*GeForce 8400M.* 1 1 1 3.3
+NVIDIA GeForce 8400 .*NVIDIA .*GeForce 84.* 2 1 1 3.3
+NVIDIA GeForce 8500 .*NVIDIA .*GeForce 85.* 2 1 1 3.3
+NVIDIA GeForce 8600M .*NVIDIA .*GeForce 8600M.* 2 1 1 3.3
+NVIDIA GeForce 8600 .*NVIDIA .*GeForce 86.* 3 1 1 3.3
+NVIDIA GeForce 8700M .*NVIDIA .*GeForce 8700M.* 2 1 1 3.3
+NVIDIA GeForce 8700 .*NVIDIA .*GeForce 87.* 3 1 0 0
+NVIDIA GeForce 8800M .*NVIDIA .*GeForce 8800M.* 2 1 1 3.3
+NVIDIA GeForce 8800 .*NVIDIA .*GeForce 88.* 3 1 1 3.3
+NVIDIA GeForce 9100M .*NVIDIA .*GeForce 9100M.* 0 1 0 0
+NVIDIA GeForce 9100 .*NVIDIA .*GeForce 91.* 0 1 0 3.3
+NVIDIA GeForce 9200M .*NVIDIA .*GeForce 9200M.* 1 1 0 3.1
+NVIDIA GeForce 9200 .*NVIDIA .*GeForce 92.* 1 1 0 3.3
+NVIDIA GeForce 9300M .*NVIDIA .*GeForce 9300M.* 1 1 1 3.3
+NVIDIA GeForce 9300 .*NVIDIA .*GeForce 93.* 1 1 1 3.3
+NVIDIA GeForce 9400M .*NVIDIA .*GeForce 9400M.* 2 1 1 3.3
+NVIDIA GeForce 9400 .*NVIDIA .*GeForce 94.* 3 1 1 3.3
+NVIDIA GeForce 9500M .*NVIDIA .*GeForce 9500M.* 1 1 1 3.3
+NVIDIA GeForce 9500 .*NVIDIA .*GeForce 95.* 3 1 1 3.3
+NVIDIA GeForce 9600M .*NVIDIA .*GeForce 9600M.* 2 1 1 3.3
+NVIDIA GeForce 9600 .*NVIDIA .*GeForce 96.* 3 1 1 3.3
+NVIDIA GeForce 9700M .*NVIDIA .*GeForce 9700M.* 0 1 1 3.3
+NVIDIA GeForce 9800M .*NVIDIA .*GeForce 9800M.* 2 1 1 3.3
+NVIDIA GeForce 9800 .*NVIDIA .*GeForce 98.* 3 1 1 3.3
+NVIDIA GeForce FX 5100 .*NVIDIA .*GeForce FX 51.* 0 1 0 0
+NVIDIA GeForce FX 5200 .*NVIDIA .*GeForce FX 52.* 0 1 0 2.1
+NVIDIA GeForce FX 5300 .*NVIDIA .*GeForce FX 53.* 0 1 0 0
+NVIDIA GeForce FX 5500 .*NVIDIA .*GeForce FX 55.* 0 1 1 2.1
+NVIDIA GeForce FX 5600 .*NVIDIA .*GeForce FX 56.* 1 1 1 2.1
+NVIDIA GeForce FX 5700 .*NVIDIA .*GeForce FX 57.* 0 1 1 2.1
+NVIDIA GeForce FX 5800 .*NVIDIA .*GeForce FX 58.* 1 1 0 0
+NVIDIA GeForce FX 5900 .*NVIDIA .*GeForce FX 59.* 1 1 1 2.1
+NVIDIA GeForce FX Go5100 .*NVIDIA .*GeForce FX Go51.* 0 1 0 0
+NVIDIA GeForce FX Go5200 .*NVIDIA .*GeForce FX Go52.* 0 1 0 0
+NVIDIA GeForce FX Go5300 .*NVIDIA .*GeForce FX Go53.* 0 1 0 0
+NVIDIA GeForce FX Go5500 .*NVIDIA .*GeForce FX Go55.* 0 1 0 0
+NVIDIA GeForce FX Go5600 .*NVIDIA .*GeForce FX Go56.* 0 1 1 2.1
+NVIDIA GeForce FX Go5700 .*NVIDIA .*GeForce FX Go57.* 1 1 1 1.5
+NVIDIA GeForce FX Go5800 .*NVIDIA .*GeForce FX Go58.* 1 1 0 0
+NVIDIA GeForce FX Go5900 .*NVIDIA .*GeForce FX Go59.* 1 1 0 0
+NVIDIA GeForce FX Go5xxx .*NVIDIA .*GeForce FX Go.* 0 1 0 0
+NVIDIA GeForce Go 6100 .*NVIDIA .*GeForce Go 61.* 0 1 1 2.1
+NVIDIA GeForce Go 6200 .*NVIDIA .*GeForce Go 62.* 0 1 0 0
+NVIDIA GeForce Go 6400 .*NVIDIA .*GeForce Go 64.* 1 1 1 2
+NVIDIA GeForce Go 6500 .*NVIDIA .*GeForce Go 65.* 1 1 0 0
+NVIDIA GeForce Go 6600 .*NVIDIA .*GeForce Go 66.* 0 1 1 2.1
+NVIDIA GeForce Go 6700 .*NVIDIA .*GeForce Go 67.* 1 1 0 0
+NVIDIA GeForce Go 6800 .*NVIDIA .*GeForce Go 68.* 0 1 1 2.1
+NVIDIA GeForce Go 7200 .*NVIDIA .*GeForce Go 72.* 1 1 0 0
+NVIDIA GeForce Go 7300 LE .*NVIDIA .*GeForce Go 73.*LE.* 1 1 0 0
+NVIDIA GeForce Go 7300 .*NVIDIA .*GeForce Go 73.* 1 1 1 2.1
+NVIDIA GeForce Go 7400 .*NVIDIA .*GeForce Go 74.* 1 1 1 2.1
+NVIDIA GeForce Go 7600 .*NVIDIA .*GeForce Go 76.* 1 1 1 2.1
+NVIDIA GeForce Go 7700 .*NVIDIA .*GeForce Go 77.* 0 1 1 2.1
+NVIDIA GeForce Go 7800 .*NVIDIA .*GeForce Go 78.* 2 1 0 0
+NVIDIA GeForce Go 7900 .*NVIDIA .*GeForce Go 79.* 1 1 1 2.1
+NVIDIA D9M .*NVIDIA .*D9M.* 1 1 0 0
+NVIDIA G94 .*NVIDIA .*G94.* 3 1 0 0
+NVIDIA GeForce Go 6 .*GeForce Go 6.* 1 1 0 0
+NVIDIA ION 2 .*NVIDIA .*ION 2.* 2 1 0 0
+NVIDIA ION .*NVIDIA Corporation.*ION.* 2 1 1 3.3
+NVIDIA NB8M .*NVIDIA .*NB8M.* 1 1 0 0
+NVIDIA NB8P .*NVIDIA .*NB8P.* 2 1 0 0
+NVIDIA NB9E .*NVIDIA .*NB9E.* 3 1 0 0
+NVIDIA NB9M .*NVIDIA .*NB9M.* 1 1 0 0
+NVIDIA NB9P .*NVIDIA .*NB9P.* 2 1 0 0
+NVIDIA N10 .*NVIDIA .*N10.* 1 1 0 0
+NVIDIA GeForce PCX .*GeForce PCX.* 0 1 0 0
+NVIDIA Generic .*NVIDIA .*Unknown.* 0 0 0 3
+NVIDIA NV17 .*NVIDIA .*NV17.* 0 1 0 0
+NVIDIA NV34 .*NVIDIA .*NV34.* 0 1 0 0
+NVIDIA NV35 .*NVIDIA .*NV35.* 0 1 0 0
+NVIDIA NV36 .*NVIDIA .*NV36.* 1 1 0 0
+NVIDIA NV41 .*NVIDIA .*NV41.* 1 1 0 0
+NVIDIA NV43 .*NVIDIA .*NV43.* 1 1 0 0
+NVIDIA NV44 .*NVIDIA .*NV44.* 1 1 0 0
+NVIDIA nForce .*NVIDIA .*nForce.* 0 0 0 3.3
+NVIDIA MCP51 .*NVIDIA .*MCP51.* 1 1 0 0
+NVIDIA MCP61 .*NVIDIA .*MCP61.* 1 1 0 0
+NVIDIA MCP67 .*NVIDIA .*MCP67.* 1 1 0 0
+NVIDIA MCP68 .*NVIDIA .*MCP68.* 1 1 0 0
+NVIDIA MCP73 .*NVIDIA .*MCP73.* 1 1 0 0
+NVIDIA MCP77 .*NVIDIA .*MCP77.* 1 1 0 0
+NVIDIA MCP78 .*NVIDIA .*MCP78.* 1 1 0 0
+NVIDIA MCP79 .*NVIDIA .*MCP79.* 1 1 0 0
+NVIDIA MCP7A .*NVIDIA .*MCP7A.* 1 1 0 0
+NVIDIA Quadro2 .*Quadro2.* 0 1 0 0
+NVIDIA Quadro 1000M .*Quadro.*1000M.* 2 1 0 4.2
+NVIDIA Quadro 2000 M/D .*Quadro.*2000.* 3 1 0 4.2
+NVIDIA Quadro 3000M .*Quadro.*3000M.* 3 1 0 0
+NVIDIA Quadro 4000M .*Quadro.*4000M.* 3 1 0 0
+NVIDIA Quadro 4000 .*Quadro *4000.* 3 1 0 4.2
+NVIDIA Quadro 50x0 M .*Quadro.*50.0.* 3 1 0 0
+NVIDIA Quadro 6000 .*Quadro.*6000.* 3 1 0 0
+NVIDIA Quadro 400 .*Quadro.*400.* 2 1 0 3.3
+NVIDIA Quadro 600 .*Quadro.*600.* 2 1 0 3.3
+NVIDIA Quadro4 .*Quadro4.* 0 1 0 0
+NVIDIA Quadro DCC .*Quadro DCC.* 0 1 0 0
+NVIDIA Quadro CX .*Quadro.*CX.* 3 1 0 0
+NVIDIA Quadro FX 770M .*Quadro.*FX *770M.* 2 1 0 0
+NVIDIA Quadro FX 1500M .*Quadro.*FX *1500M.* 1 1 0 2.1
+NVIDIA Quadro FX 1600M .*Quadro.*FX *1600M.* 2 1 0 0
+NVIDIA Quadro FX 2500M .*Quadro.*FX *2500M.* 2 1 0 0
+NVIDIA Quadro FX 2700M .*Quadro.*FX *2700M.* 3 1 0 0
+NVIDIA Quadro FX 2800M .*Quadro.*FX *2800M.* 3 1 0 3.3
+NVIDIA Quadro FX 3500 .*Quadro.*FX *3500.* 2 1 0 2.1
+NVIDIA Quadro FX 3600 .*Quadro.*FX *3600.* 3 1 0 0
+NVIDIA Quadro FX 3700 .*Quadro.*FX *3700.* 3 1 0 3.3
+NVIDIA Quadro FX 3800 .*Quadro.*FX *3800.* 3 1 0 3.2
+NVIDIA Quadro FX 4500 .*Quadro.*FX *45.* 3 1 0 0
+NVIDIA Quadro FX 880M .*Quadro.*FX *880M.* 3 1 0 3.3
+NVIDIA Quadro FX 4800 .*NVIDIA .*Quadro *FX *4800.* 3 1 0 0
+NVIDIA Quadro FX .*Quadro FX.* 1 1 0 3.3
+NVIDIA Quadro NVS 1xxM .*Quadro NVS *1.[05]M.* 0 1 1 3.3
+NVIDIA Quadro NVS 300M .*NVIDIA .*NVS *300M.* 2 1 0 0
+NVIDIA Quadro NVS 320M .*NVIDIA .*NVS *320M.* 2 1 0 0
+NVIDIA Quadro NVS 2100M .*NVIDIA .*NVS *2100M.* 2 1 0 0
+NVIDIA Quadro NVS 3100M .*NVIDIA .*NVS *3100M.* 2 1 0 0
+NVIDIA Quadro NVS 4200M .*NVIDIA .*NVS *4200M.* 2 1 0 4.1
+NVIDIA Quadro NVS 5100M .*NVIDIA .*NVS *5100M.* 2 1 0 0
+NVIDIA Quadro NVS .*NVIDIA .*NVS 0 1 0 3.2
+NVIDIA Corporation N12P .*NVIDIA .*N12P.* 1 1 1 4.1
+NVIDIA Corporation N11M .*NVIDIA .*N11M.* 2 1 0 0
+NVIDIA RIVA TNT .*RIVA TNT.* 0 0 0 0
+S3 .*S3 Graphics.* 0 0 1 1.4
+SiS SiS.* 0 0 1 1.5
+Trident Trident.* 0 0 0 0
+Tungsten Graphics Tungsten.* 0 0 0 0
+XGI XGI.* 0 0 0 0
+VIA VIA.* 0 0 0 0
+Apple Generic Apple.*Generic.* 0 0 0 0
+Apple Software Renderer Apple.*Software Renderer.* 0 0 0 0
+Humper Humper.* 0 1 1 2.1
+PowerVR SGX545 .*PowerVR SGX.* 1 1 1 3
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 447836910d..094d502078 100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -41,6 +41,7 @@
#include "llchannelmanager.h"
#include "llchicletbar.h"
#include "llconsole.h"
+#include "lldonotdisturbnotificationstorage.h"
#include "llenvmanager.h"
#include "llfirstuse.h"
#include "llfloatercamera.h"
@@ -54,9 +55,8 @@
#include "llmorphview.h"
#include "llmoveview.h"
#include "llnavigationbar.h" // to show/hide navigation bar when changing mouse look state
-#include "llnearbychatbar.h"
+#include "llfloaterimnearbychat.h"
#include "llnotificationsutil.h"
-#include "llpanelpathfindingrebakenavmesh.h"
#include "llpaneltopinfobar.h"
#include "llparcel.h"
#include "llrendersphere.h"
@@ -376,7 +376,7 @@ LLAgent::LLAgent() :
mShowAvatar(TRUE),
mFrameAgent(),
- mIsBusy(FALSE),
+ mIsDoNotDisturb(false),
mControlFlags(0x00000000),
mbFlagsDirty(FALSE),
@@ -1356,12 +1356,7 @@ void LLAgent::setAFK()
{
sendAnimationRequest(ANIM_AGENT_AWAY, ANIM_REQUEST_START);
setControlFlags(AGENT_CONTROL_AWAY | AGENT_CONTROL_STOP);
- LL_INFOS("AFK") << "Setting Away" << LL_ENDL;
gAwayTimer.start();
- if (gAFKMenu)
- {
- gAFKMenu->setLabel(LLTrans::getString("AvatarSetNotAway"));
- }
}
}
@@ -1380,11 +1375,6 @@ void LLAgent::clearAFK()
{
sendAnimationRequest(ANIM_AGENT_AWAY, ANIM_REQUEST_STOP);
clearControlFlags(AGENT_CONTROL_AWAY);
- LL_INFOS("AFK") << "Clearing Away" << LL_ENDL;
- if (gAFKMenu)
- {
- gAFKMenu->setLabel(LLTrans::getString("AvatarSetAway"));
- }
}
}
@@ -1397,39 +1387,26 @@ BOOL LLAgent::getAFK() const
}
//-----------------------------------------------------------------------------
-// setBusy()
-//-----------------------------------------------------------------------------
-void LLAgent::setBusy()
-{
- sendAnimationRequest(ANIM_AGENT_BUSY, ANIM_REQUEST_START);
- mIsBusy = TRUE;
- if (gBusyMenu)
- {
- gBusyMenu->setLabel(LLTrans::getString("AvatarSetNotBusy"));
- }
- LLNotificationsUI::LLChannelManager::getInstance()->muteAllChannels(true);
-}
-
-//-----------------------------------------------------------------------------
-// clearBusy()
+// setDoNotDisturb()
//-----------------------------------------------------------------------------
-void LLAgent::clearBusy()
+void LLAgent::setDoNotDisturb(bool pIsDoNotDisturb)
{
- mIsBusy = FALSE;
- sendAnimationRequest(ANIM_AGENT_BUSY, ANIM_REQUEST_STOP);
- if (gBusyMenu)
+ bool isDoNotDisturbSwitchedOff = (mIsDoNotDisturb && !pIsDoNotDisturb);
+ mIsDoNotDisturb = pIsDoNotDisturb;
+ sendAnimationRequest(ANIM_AGENT_DO_NOT_DISTURB, (pIsDoNotDisturb ? ANIM_REQUEST_START : ANIM_REQUEST_STOP));
+ LLNotificationsUI::LLChannelManager::getInstance()->muteAllChannels(pIsDoNotDisturb);
+ if (isDoNotDisturbSwitchedOff)
{
- gBusyMenu->setLabel(LLTrans::getString("AvatarSetBusy"));
+ LLDoNotDisturbNotificationStorage::getInstance()->updateNotifications();
}
- LLNotificationsUI::LLChannelManager::getInstance()->muteAllChannels(false);
}
//-----------------------------------------------------------------------------
-// getBusy()
+// isDoNotDisturb()
//-----------------------------------------------------------------------------
-BOOL LLAgent::getBusy() const
+bool LLAgent::isDoNotDisturb() const
{
- return mIsBusy;
+ return mIsDoNotDisturb;
}
@@ -1911,7 +1888,8 @@ void LLAgent::startTyping()
{
sendAnimationRequest(ANIM_AGENT_TYPE, ANIM_REQUEST_START);
}
- LLNearbyChatBar::getInstance()->sendChatFromViewer("", CHAT_TYPE_START, FALSE);
+ (LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat"))->
+ sendChatFromViewer("", CHAT_TYPE_START, FALSE);
}
//-----------------------------------------------------------------------------
@@ -1923,7 +1901,8 @@ void LLAgent::stopTyping()
{
clearRenderState(AGENT_STATE_TYPING);
sendAnimationRequest(ANIM_AGENT_TYPE, ANIM_REQUEST_STOP);
- LLNearbyChatBar::getInstance()->sendChatFromViewer("", CHAT_TYPE_STOP, FALSE);
+ (LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat"))->
+ sendChatFromViewer("", CHAT_TYPE_STOP, FALSE);
}
}
@@ -2002,7 +1981,6 @@ void LLAgent::endAnimationUpdateUI()
LLChicletBar::getInstance()->setVisible(TRUE);
LLPanelStandStopFlying::getInstance()->setVisible(TRUE);
- LLPanelPathfindingRebakeNavmesh::getInstance()->setVisible(TRUE);
LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
@@ -2112,7 +2090,6 @@ void LLAgent::endAnimationUpdateUI()
LLChicletBar::getInstance()->setVisible(FALSE);
LLPanelStandStopFlying::getInstance()->setVisible(FALSE);
- LLPanelPathfindingRebakeNavmesh::getInstance()->setVisible(FALSE);
// clear out camera lag effect
gAgentCamera.clearCameraLag();
@@ -2567,51 +2544,21 @@ void LLMaturityPreferencesResponder::error(U32 pStatus, const std::string& pReas
U8 LLMaturityPreferencesResponder::parseMaturityFromServerResponse(const LLSD &pContent)
{
- // stinson 05/24/2012 Pathfinding regions have re-defined the response behavior. In the old server code,
- // if you attempted to change the preferred maturity to the same value, the response content would be an
- // undefined LLSD block. In the new server code with pathfinding, the response content should always be
- // defined. Thus, the check for isUndefined() can be replaced with an assert after pathfinding is merged
- // into server trunk and fully deployed.
U8 maturity = SIM_ACCESS_MIN;
- if (pContent.isUndefined())
+
+ llassert(!pContent.isUndefined());
+ llassert(pContent.isMap());
+ llassert(pContent.has("access_prefs"));
+ llassert(pContent.get("access_prefs").isMap());
+ llassert(pContent.get("access_prefs").has("max"));
+ llassert(pContent.get("access_prefs").get("max").isString());
+ if (!pContent.isUndefined() && pContent.isMap() && pContent.has("access_prefs")
+ && pContent.get("access_prefs").isMap() && pContent.get("access_prefs").has("max")
+ && pContent.get("access_prefs").get("max").isString())
{
- maturity = mPreferredMaturity;
- }
- else
- {
- llassert(!pContent.isUndefined());
- llassert(pContent.isMap());
-
- if (!pContent.isUndefined() && pContent.isMap())
- {
- // stinson 05/24/2012 Pathfinding regions have re-defined the response syntax. The if statement catches
- // the new syntax, and the else statement catches the old syntax. After pathfinding is merged into
- // server trunk and fully deployed, we can remove the else statement.
- if (pContent.has("access_prefs"))
- {
- llassert(pContent.has("access_prefs"));
- llassert(pContent.get("access_prefs").isMap());
- llassert(pContent.get("access_prefs").has("max"));
- llassert(pContent.get("access_prefs").get("max").isString());
- if (pContent.get("access_prefs").isMap() && pContent.get("access_prefs").has("max") &&
- pContent.get("access_prefs").get("max").isString())
- {
- LLSD::String actualPreference = pContent.get("access_prefs").get("max").asString();
- LLStringUtil::trim(actualPreference);
- maturity = LLViewerRegion::shortStringToAccess(actualPreference);
- }
- }
- else if (pContent.has("max"))
- {
- llassert(pContent.get("max").isString());
- if (pContent.get("max").isString())
- {
- LLSD::String actualPreference = pContent.get("max").asString();
- LLStringUtil::trim(actualPreference);
- maturity = LLViewerRegion::shortStringToAccess(actualPreference);
- }
- }
- }
+ LLSD::String actualPreference = pContent.get("access_prefs").get("max").asString();
+ LLStringUtil::trim(actualPreference);
+ maturity = LLViewerRegion::shortStringToAccess(actualPreference);
}
return maturity;
@@ -4045,6 +3992,12 @@ void LLAgent::teleportViaLocation(const LLVector3d& pos_global)
void LLAgent::doTeleportViaLocation(const LLVector3d& pos_global)
{
LLViewerRegion* regionp = getRegion();
+
+ if (!regionp)
+ {
+ return;
+ }
+
U64 handle = to_region_handle(pos_global);
LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromHandle(handle);
if(regionp && info)
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 99904e118c..daa15b0c1a 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -378,14 +378,13 @@ public:
void sitDown();
//--------------------------------------------------------------------
- // Busy
+ // Do Not Disturb
//--------------------------------------------------------------------
public:
- void setBusy();
- void clearBusy();
- BOOL getBusy() const;
+ void setDoNotDisturb(bool pIsDoNotDisturb);
+ bool isDoNotDisturb() const;
private:
- BOOL mIsBusy;
+ bool mIsDoNotDisturb;
//--------------------------------------------------------------------
// Grab
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 751b73e1eb..9025c7af8b 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -35,6 +35,7 @@
#include "llfloaterreg.h"
#include "llhudmanager.h"
#include "lljoystickbutton.h"
+#include "llmoveview.h"
#include "llselectmgr.h"
#include "llsmoothstep.h"
#include "lltoolmgr.h"
@@ -2113,6 +2114,11 @@ void LLAgentCamera::changeCameraToDefault()
{
changeCameraToThirdPerson();
}
+ if (gSavedSettings.getBOOL("HideUIControls"))
+ {
+ gViewerWindow->setUIVisibility(false);
+ LLPanelStandStopFlying::getInstance()->setVisible(false);
+ }
}
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index e441f21f90..e441f21f90 100755..100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index 5932be21c6..5932be21c6 100755..100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp
index e2417cdddb..e31e39dca2 100644
--- a/indra/newview/llagentwearablesfetch.cpp
+++ b/indra/newview/llagentwearablesfetch.cpp
@@ -342,7 +342,7 @@ void LLLibraryOutfitsFetch::folderDone()
}
mClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
- mLibraryClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING, false, true);
+ mLibraryClothingID = gInventory.findLibraryCategoryUUIDForType(LLFolderType::FT_CLOTHING, false);
// If Library->Clothing->Initial Outfits exists, use that.
LLNameCategoryCollector matchFolderFunctor("Initial Outfits");
diff --git a/indra/newview/llappcorehttp.cpp b/indra/newview/llappcorehttp.cpp
new file mode 100644
index 0000000000..0d7d41304d
--- /dev/null
+++ b/indra/newview/llappcorehttp.cpp
@@ -0,0 +1,192 @@
+/**
+ * @file llappcorehttp.cpp
+ * @brief
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llappcorehttp.h"
+
+#include "llviewercontrol.h"
+
+
+const F64 LLAppCoreHttp::MAX_THREAD_WAIT_TIME(10.0);
+
+LLAppCoreHttp::LLAppCoreHttp()
+ : mRequest(NULL),
+ mStopHandle(LLCORE_HTTP_HANDLE_INVALID),
+ mStopRequested(0.0),
+ mStopped(false),
+ mPolicyDefault(-1)
+{}
+
+
+LLAppCoreHttp::~LLAppCoreHttp()
+{
+ delete mRequest;
+ mRequest = NULL;
+}
+
+
+void LLAppCoreHttp::init()
+{
+ LLCore::HttpStatus status = LLCore::HttpRequest::createService();
+ if (! status)
+ {
+ LL_ERRS("Init") << "Failed to initialize HTTP services. Reason: "
+ << status.toString()
+ << LL_ENDL;
+ }
+
+ // Point to our certs or SSH/https: will fail on connect
+ status = LLCore::HttpRequest::setPolicyGlobalOption(LLCore::HttpRequest::GP_CA_FILE,
+ gDirUtilp->getCAFile());
+ if (! status)
+ {
+ LL_ERRS("Init") << "Failed to set CA File for HTTP services. Reason: "
+ << status.toString()
+ << LL_ENDL;
+ }
+
+ // Establish HTTP Proxy. "LLProxy" is a special string which directs
+ // the code to use LLProxy::applyProxySettings() to establish any
+ // HTTP or SOCKS proxy for http operations.
+ status = LLCore::HttpRequest::setPolicyGlobalOption(LLCore::HttpRequest::GP_LLPROXY, 1);
+ if (! status)
+ {
+ LL_ERRS("Init") << "Failed to set HTTP proxy for HTTP services. Reason: "
+ << status.toString()
+ << LL_ENDL;
+ }
+
+ // Tracing levels for library & libcurl (note that 2 & 3 are beyond spammy):
+ // 0 - None
+ // 1 - Basic start, stop simple transitions
+ // 2 - libcurl CURLOPT_VERBOSE mode with brief lines
+ // 3 - with partial data content
+ static const std::string http_trace("QAModeHttpTrace");
+ if (gSavedSettings.controlExists(http_trace))
+ {
+ long trace_level(0L);
+ trace_level = long(gSavedSettings.getU32(http_trace));
+ status = LLCore::HttpRequest::setPolicyGlobalOption(LLCore::HttpRequest::GP_TRACE, trace_level);
+ }
+
+ // Setup default policy and constrain if directed to
+ mPolicyDefault = LLCore::HttpRequest::DEFAULT_POLICY_ID;
+ static const std::string texture_concur("TextureFetchConcurrency");
+ if (gSavedSettings.controlExists(texture_concur))
+ {
+ U32 concur(llmin(gSavedSettings.getU32(texture_concur), U32(12)));
+
+ if (concur > 0)
+ {
+ LLCore::HttpStatus status;
+ status = LLCore::HttpRequest::setPolicyClassOption(mPolicyDefault,
+ LLCore::HttpRequest::CP_CONNECTION_LIMIT,
+ concur);
+ if (! status)
+ {
+ LL_WARNS("Init") << "Unable to set texture fetch concurrency. Reason: "
+ << status.toString()
+ << LL_ENDL;
+ }
+ else
+ {
+ LL_INFOS("Init") << "Application settings overriding default texture fetch concurrency. New value: "
+ << concur
+ << LL_ENDL;
+ }
+ }
+ }
+
+ // Kick the thread
+ status = LLCore::HttpRequest::startThread();
+ if (! status)
+ {
+ LL_ERRS("Init") << "Failed to start HTTP servicing thread. Reason: "
+ << status.toString()
+ << LL_ENDL;
+ }
+
+ mRequest = new LLCore::HttpRequest;
+}
+
+
+void LLAppCoreHttp::requestStop()
+{
+ llassert_always(mRequest);
+
+ mStopHandle = mRequest->requestStopThread(this);
+ if (LLCORE_HTTP_HANDLE_INVALID != mStopHandle)
+ {
+ mStopRequested = LLTimer::getTotalSeconds();
+ }
+}
+
+
+void LLAppCoreHttp::cleanup()
+{
+ if (LLCORE_HTTP_HANDLE_INVALID == mStopHandle)
+ {
+ // Should have been started already...
+ requestStop();
+ }
+
+ if (LLCORE_HTTP_HANDLE_INVALID == mStopHandle)
+ {
+ LL_WARNS("Cleanup") << "Attempting to cleanup HTTP services without thread shutdown"
+ << LL_ENDL;
+ }
+ else
+ {
+ while (! mStopped && LLTimer::getTotalSeconds() < (mStopRequested + MAX_THREAD_WAIT_TIME))
+ {
+ mRequest->update(200000);
+ ms_sleep(50);
+ }
+ if (! mStopped)
+ {
+ LL_WARNS("Cleanup") << "Attempting to cleanup HTTP services with thread shutdown incomplete"
+ << LL_ENDL;
+ }
+ }
+
+ delete mRequest;
+ mRequest = NULL;
+
+ LLCore::HttpStatus status = LLCore::HttpRequest::destroyService();
+ if (! status)
+ {
+ LL_WARNS("Cleanup") << "Failed to shutdown HTTP services, continuing. Reason: "
+ << status.toString()
+ << LL_ENDL;
+ }
+}
+
+
+void LLAppCoreHttp::onCompleted(LLCore::HttpHandle, LLCore::HttpResponse *)
+{
+ mStopped = true;
+}
diff --git a/indra/newview/llappcorehttp.h b/indra/newview/llappcorehttp.h
new file mode 100644
index 0000000000..241d73ad52
--- /dev/null
+++ b/indra/newview/llappcorehttp.h
@@ -0,0 +1,86 @@
+/**
+ * @file llappcorehttp.h
+ * @brief Singleton initialization/shutdown class for llcorehttp library
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef _LL_APP_COREHTTP_H_
+#define _LL_APP_COREHTTP_H_
+
+
+#include "httprequest.h"
+#include "httphandler.h"
+#include "httpresponse.h"
+
+
+// This class manages the lifecyle of the core http library.
+// Slightly different style than traditional code but reflects
+// the use of handler classes and light-weight interface
+// object instances of the new libraries. To be used
+// as a singleton and static construction is fine.
+class LLAppCoreHttp : public LLCore::HttpHandler
+{
+public:
+ LLAppCoreHttp();
+ ~LLAppCoreHttp();
+
+ // Initialize the LLCore::HTTP library creating service classes
+ // and starting the servicing thread. Caller is expected to do
+ // other initializations (SSL mutex, thread hash function) appropriate
+ // for the application.
+ void init();
+
+ // Request that the servicing thread stop servicing requests,
+ // release resource references and stop. Request is asynchronous
+ // and @see cleanup() will perform a limited wait loop for this
+ // request to stop the thread.
+ void requestStop();
+
+ // Terminate LLCore::HTTP library services. Caller is expected
+ // to have made a best-effort to shutdown the servicing thread
+ // by issuing a requestThreadStop() and waiting for completion
+ // notification that the stop has completed.
+ void cleanup();
+
+ // Notification when the stop request is complete.
+ virtual void onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response);
+
+ // Retrieve the policy class for default operations.
+ int getPolicyDefault() const
+ {
+ return mPolicyDefault;
+ }
+
+private:
+ static const F64 MAX_THREAD_WAIT_TIME;
+
+private:
+ LLCore::HttpRequest * mRequest;
+ LLCore::HttpHandle mStopHandle;
+ F64 mStopRequested;
+ bool mStopped;
+ int mPolicyDefault;
+};
+
+
+#endif // _LL_APP_COREHTTP_H_
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 6d67e098a6..769b4eafe1 100755..100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -52,7 +52,8 @@
std::string self_av_string()
{
- return gAgentAvatarp->avString();
+ // On logout gAgentAvatarp can already be invalid
+ return isAgentAvatarValid() ? gAgentAvatarp->avString() : "";
}
// RAII thingy to guarantee that a variable gets reset when the Setter
@@ -1602,8 +1603,6 @@ void LLAppearanceMgr::updateAgentWearables(LLWearableHoldingPattern* holder, boo
{
gAgentWearables.setWearableOutfit(items, wearables, !append);
}
-
-// dec_busy_count();
}
static void remove_non_link_items(LLInventoryModel::item_array_t &items)
@@ -2004,7 +2003,6 @@ void LLAppearanceMgr::wearInventoryCategoryOnAvatar( LLInventoryCategory* catego
void LLAppearanceMgr::wearOutfitByName(const std::string& name)
{
LL_INFOS("Avatar") << self_av_string() << "Wearing category " << name << LL_ENDL;
- //inc_busy_count();
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t item_array;
@@ -2044,8 +2042,6 @@ void LLAppearanceMgr::wearOutfitByName(const std::string& name)
llwarns << "Couldn't find outfit " <<name<< " in wearOutfitByName()"
<< llendl;
}
-
- //dec_busy_count();
}
bool areMatchingWearables(const LLViewerInventoryItem *a, const LLViewerInventoryItem *b)
@@ -2330,7 +2326,7 @@ void LLAppearanceMgr::copyLibraryGestures()
// Copy gestures
LLUUID lib_gesture_cat_id =
- gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE,false,true);
+ gInventory.findLibraryCategoryUUIDForType(LLFolderType::FT_GESTURE,false);
if (lib_gesture_cat_id.isNull())
{
llwarns << "Unable to copy gestures, source category not found" << llendl;
@@ -2967,7 +2963,6 @@ public:
{
llwarns << "Nothing fetched in category " << mComplete.front()
<< llendl;
- //dec_busy_count();
gInventory.removeObserver(this);
// lets notify observers that loading is finished.
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index c9458857d1..1c6f099185 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * Copyright (C) 2012, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -42,6 +42,7 @@
#include "llagentcamera.h"
#include "llagentlanguage.h"
#include "llagentwearables.h"
+#include "llfloaterimcontainer.h"
#include "llwindow.h"
#include "llviewerstats.h"
#include "llviewerstatsrecorder.h"
@@ -59,6 +60,7 @@
#include "llares.h"
#include "llcurl.h"
#include "llcalc.h"
+#include "llconversationlog.h"
#include "lltexturestats.h"
#include "lltexturestats.h"
#include "llviewerwindow.h"
@@ -93,7 +95,6 @@
#include "llweb.h"
#include "llsecondlifeurls.h"
#include "llupdaterservice.h"
-#include "llcallfloater.h"
#include "llfloatertexturefetchdebugger.h"
#include "llspellcheck.h"
@@ -116,6 +117,7 @@
#include "llnotificationsutil.h"
#include "llleap.h"
+#include "stringize.h"
// Third party library includes
#include <boost/bind.hpp>
@@ -123,7 +125,6 @@
#include <boost/algorithm/string.hpp>
-
#if LL_WINDOWS
# include <share.h> // For _SH_DENYWR in initMarkerFile
#else
@@ -200,6 +201,7 @@
#include "llviewercontrol.h"
#include "lleventnotifier.h"
#include "llcallbacklist.h"
+#include "lldeferredsounds.h"
#include "pipeline.h"
#include "llgesturemgr.h"
#include "llsky.h"
@@ -322,7 +324,7 @@ BOOL gLogoutInProgress = FALSE;
////////////////////////////////////////////////////////////
// Internal globals... that should be removed.
static std::string gArgs;
-
+const int MAX_MARKER_LENGTH = 1024;
const std::string MARKER_FILE_NAME("SecondLife.exec_marker");
const std::string ERROR_MARKER_FILE_NAME("SecondLife.error_marker");
const std::string LLERROR_MARKER_FILE_NAME("SecondLife.llerror_marker");
@@ -458,7 +460,18 @@ static void ui_audio_callback(const LLUUID& uuid)
{
if (gAudiop)
{
- gAudiop->triggerSound(uuid, gAgent.getID(), 1.0f, LLAudioEngine::AUDIO_TYPE_UI);
+ SoundData soundData(uuid, gAgent.getID(), 1.0f, LLAudioEngine::AUDIO_TYPE_UI);
+ gAudiop->triggerSound(soundData);
+ }
+}
+
+// A callback set in LLAppViewer::init()
+static void deferred_ui_audio_callback(const LLUUID& uuid)
+{
+ if (gAudiop)
+ {
+ SoundData soundData(uuid, gAgent.getID(), 1.0f, LLAudioEngine::AUDIO_TYPE_UI);
+ LLDeferredSounds::instance().deferSound(soundData);
}
}
@@ -625,7 +638,7 @@ LLTextureFetch* LLAppViewer::sTextureFetch = NULL;
LLAppViewer::LLAppViewer() :
mMarkerFile(),
- mLogoutMarkerFile(NULL),
+ mLogoutMarkerFile(),
mReportedCrash(false),
mNumSessions(0),
mPurgeCache(false),
@@ -691,7 +704,7 @@ bool LLAppViewer::init()
gDirUtilp->initAppDirs("SecondLife");
// set skin search path to default, will be overridden later
// this allows simple skinned file lookups to work
- gDirUtilp->setSkinFolder("default");
+ gDirUtilp->setSkinFolder("default", "en");
initLogging();
@@ -709,7 +722,7 @@ bool LLAppViewer::init()
//set the max heap size.
initMaxHeapSize() ;
- LLPrivateMemoryPoolManager::initClass((BOOL)gSavedSettings.getBOOL("MemoryPrivatePoolEnabled"), (U32)gSavedSettings.getU32("MemoryPrivatePoolSize")) ;
+ LLPrivateMemoryPoolManager::initClass((BOOL)gSavedSettings.getBOOL("MemoryPrivatePoolEnabled"), (U32)gSavedSettings.getU32("MemoryPrivatePoolSize")*1024*1024) ;
// write Google Breakpad minidump files to our log directory
std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "");
@@ -730,10 +743,10 @@ bool LLAppViewer::init()
mAlloc.setProfilingEnabled(gSavedSettings.getBOOL("MemProfiling"));
-#if LL_RECORD_VIEWER_STATS
- LLViewerStatsRecorder::initClass();
-#endif
-
+ // Initialize the non-LLCurl libcurl library. Should be called
+ // before consumers (LLTextureFetch).
+ mAppCoreHttp.init();
+
// *NOTE:Mani - LLCurl::initClass is not thread safe.
// Called before threads are created.
LLCurl::initClass(gSavedSettings.getF32("CurlRequestTimeOut"),
@@ -772,15 +785,19 @@ bool LLAppViewer::init()
LLUI::initClass(settings_map,
LLUIImageList::getInstance(),
ui_audio_callback,
+ deferred_ui_audio_callback,
&LLUI::sGLScaleFactor);
LL_INFOS("InitInfo") << "UI initialized." << LL_ENDL ;
- // Setup paths and LLTrans after LLUI::initClass has been called.
- LLUI::setupPaths();
- LLTransUtil::parseStrings("strings.xml", default_trans_args);
- LLTransUtil::parseLanguageStrings("language_settings.xml");
+ // NOW LLUI::getLanguage() should work. gDirUtilp must know the language
+ // for this session ASAP so all the file-loading commands that follow,
+ // that use findSkinnedFilenames(), will include the localized files.
+ gDirUtilp->setSkinFolder(gDirUtilp->getSkinFolder(), LLUI::getLanguage());
+
+ // Setup LLTrans after LLUI::initClass has been called.
+ initStrings();
- // Setup notifications after LLUI::setupPaths() has been called.
+ // Setup notifications after LLUI::initClass() has been called.
LLNotifications::instance();
LL_INFOS("InitInfo") << "Notifications initialized." << LL_ENDL ;
@@ -800,9 +817,6 @@ 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.
@@ -1029,11 +1043,20 @@ bool LLAppViewer::init()
}
#if LL_WINDOWS
- if (gGLManager.mIsIntel &&
- LLFeatureManager::getInstance()->getGPUClass() > 0 &&
- gGLManager.mGLVersion <= 3.f)
+ if (gGLManager.mGLVersion < LLFeatureManager::getInstance()->getExpectedGLVersion())
{
- LLNotificationsUtil::add("IntelOldDriver");
+ if (gGLManager.mIsIntel)
+ {
+ LLNotificationsUtil::add("IntelOldDriver");
+ }
+ else if (gGLManager.mIsNVIDIA)
+ {
+ LLNotificationsUtil::add("NVIDIAOldDriver");
+ }
+ else if (gGLManager.mIsATI)
+ {
+ LLNotificationsUtil::add("AMDOldDriver");
+ }
}
#endif
@@ -1188,9 +1211,10 @@ static LLFastTimer::DeclareTimer FTM_SERVICE_CALLBACK("Callback");
static LLFastTimer::DeclareTimer FTM_AGENT_AUTOPILOT("Autopilot");
static LLFastTimer::DeclareTimer FTM_AGENT_UPDATE("Update");
+LLFastTimer::DeclareTimer FTM_FRAME("Frame", true);
+
bool LLAppViewer::mainLoop()
{
- LLMemType mt1(LLMemType::MTYPE_MAIN);
mMainloopTimeout = new LLWatchdogTimeout();
//-------------------------------------------
@@ -1206,7 +1230,7 @@ bool LLAppViewer::mainLoop()
LLVoiceChannel::initClass();
LLVoiceClient::getInstance()->init(gServicePump);
- LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::sOnCurrentChannelChanged, _1), true);
+ LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLFloaterIMContainer::onCurrentChannelChanged, _1), true);
LLTimer frameTimer,idleTimer;
LLTimer debugTime;
LLViewerJoystick* joystick(LLViewerJoystick::getInstance());
@@ -1226,7 +1250,8 @@ bool LLAppViewer::mainLoop()
// Handle messages
while (!LLApp::isExiting())
{
- LLFastTimer::nextFrame(); // Should be outside of any timer instances
+ LLFastTimer _(FTM_FRAME);
+ LLFastTimer::nextFrame();
//clear call stack records
llclearcallstacks;
@@ -1290,7 +1315,6 @@ bool LLAppViewer::mainLoop()
&& (gHeadlessClient || !gViewerWindow->getShowProgress())
&& !gFocusMgr.focusLocked())
{
- LLMemType mjk(LLMemType::MTYPE_JOY_KEY);
joystick->scanJoystick();
gKeyboard->scanKeyboard();
}
@@ -1304,7 +1328,6 @@ bool LLAppViewer::mainLoop()
if (gAres != NULL && gAres->isInitialized())
{
- LLMemType mt_ip(LLMemType::MTYPE_IDLE_PUMP);
pingMainloopTimeout("Main:ServicePump");
LLFastTimer t4(FTM_PUMP);
{
@@ -1354,7 +1377,6 @@ bool LLAppViewer::mainLoop()
// Sleep and run background threads
{
- LLMemType mt_sleep(LLMemType::MTYPE_SLEEP);
LLFastTimer t2(FTM_SLEEP);
// yield some time to the os based on command line option
@@ -1835,6 +1857,9 @@ bool LLAppViewer::cleanup()
// save mute list. gMuteList used to also be deleted here too.
LLMuteList::getInstance()->cache(gAgent.getID());
+ //save call log list
+ LLConversationLog::instance().cache();
+
if (mPurgeOnExit)
{
llinfos << "Purging all cache files on exit" << llendflush;
@@ -1884,6 +1909,7 @@ bool LLAppViewer::cleanup()
// Delete workers first
// shotdown all worker threads before deleting them in case of co-dependencies
+ mAppCoreHttp.requestStop();
sTextureFetch->shutdown();
sTextureCache->shutdown();
sImageDecodeThread->shutdown();
@@ -1891,8 +1917,20 @@ bool LLAppViewer::cleanup()
sTextureFetch->shutDownTextureCacheThread() ;
sTextureFetch->shutDownImageDecodeThread() ;
+ llinfos << "Shutting down message system" << llendflush;
+ end_messaging_system();
+
+ // *NOTE:Mani - The following call is not thread safe.
+ LL_CHECK_MEMORY
+ LLCurl::cleanupClass();
+ LL_CHECK_MEMORY
+
+ // Non-LLCurl libcurl library
+ mAppCoreHttp.cleanup();
+
LLFilePickerThread::cleanupClass();
+ //MUST happen AFTER LLCurl::cleanupClass
delete sTextureCache;
sTextureCache = NULL;
delete sTextureFetch;
@@ -1918,10 +1956,6 @@ bool LLAppViewer::cleanup()
LLMetricPerformanceTesterBasic::cleanClass() ;
-#if LL_RECORD_VIEWER_STATS
- LLViewerStatsRecorder::cleanupClass();
-#endif
-
llinfos << "Cleaning up Media and Textures" << llendflush;
//Note:
@@ -1961,12 +1995,6 @@ bool LLAppViewer::cleanup()
LLViewerAssetStatsFF::cleanup();
- llinfos << "Shutting down message system" << llendflush;
- end_messaging_system();
-
- // *NOTE:Mani - The following call is not thread safe.
- LLCurl::cleanupClass();
-
// If we're exiting to launch an URL, do that here so the screen
// is at the right resolution before we launch IE.
if (!gLaunchFileOnQuit.empty())
@@ -2249,10 +2277,8 @@ bool LLAppViewer::initConfiguration()
OSMessageBox(msg.str(),LLStringUtil::null,OSMB_OK);
return false;
}
-
- LLUI::setupPaths(); // setup paths for LLTrans based on settings files only
- LLTransUtil::parseStrings("strings.xml", default_trans_args);
- LLTransUtil::parseLanguageStrings("language_settings.xml");
+
+ initStrings(); // setup paths for LLTrans based on settings files only
// - set procedural settings
// Note: can't use LL_PATH_PER_SL_ACCOUNT for any of these since we haven't logged in yet
gSavedSettings.setString("ClientSettingsFile",
@@ -2566,13 +2592,15 @@ bool LLAppViewer::initConfiguration()
LLStartUp::setStartSLURL(start_slurl);
}
- const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinCurrent");
- if(skinfolder && LLStringUtil::null != skinfolder->getValue().asString())
- {
- // hack to force the skin to default.
- gDirUtilp->setSkinFolder(skinfolder->getValue().asString());
- //gDirUtilp->setSkinFolder("default");
- }
+ const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinCurrent");
+ if(skinfolder && LLStringUtil::null != skinfolder->getValue().asString())
+ {
+ // Examining "Language" may not suffice -- see LLUI::getLanguage()
+ // logic. Unfortunately LLUI::getLanguage() doesn't yet do us much
+ // good because we haven't yet called LLUI::initClass().
+ gDirUtilp->setSkinFolder(skinfolder->getValue().asString(),
+ gSavedSettings.getString("Language"));
+ }
if (gSavedSettings.getBOOL("SpellCheck"))
{
@@ -2744,6 +2772,52 @@ bool LLAppViewer::initConfiguration()
return true; // Config was successful.
}
+// The following logic is replicated in initConfiguration() (to be able to get
+// some initial strings before we've finished initializing enough to know the
+// current language) and also in init() (to initialize for real). Somehow it
+// keeps growing, necessitating a method all its own.
+void LLAppViewer::initStrings()
+{
+ LLTransUtil::parseStrings("strings.xml", default_trans_args);
+ LLTransUtil::parseLanguageStrings("language_settings.xml");
+
+ // parseStrings() sets up the LLTrans substitution table. Add this one item.
+ LLTrans::setDefaultArg("[sourceid]", gSavedSettings.getString("sourceid"));
+
+ // Now that we've set "[sourceid]", have to go back through
+ // default_trans_args and reinitialize all those other keys because some
+ // of them, in turn, reference "[sourceid]".
+ BOOST_FOREACH(std::string key, default_trans_args)
+ {
+ std::string brackets(key), nobrackets(key);
+ // Invalid to inspect key[0] if key is empty(). But then, the entire
+ // body of this loop is pointless if key is empty().
+ if (key.empty())
+ continue;
+
+ if (key[0] != '[')
+ {
+ // key was passed without brackets. That means that 'nobrackets'
+ // is correct but 'brackets' is not.
+ brackets = STRINGIZE('[' << brackets << ']');
+ }
+ else
+ {
+ // key was passed with brackets. That means that 'brackets' is
+ // correct but 'nobrackets' is not. Erase the left bracket.
+ nobrackets.erase(0, 1);
+ std::string::size_type length(nobrackets.length());
+ if (length && nobrackets[length - 1] == ']')
+ {
+ nobrackets.erase(length - 1);
+ }
+ }
+ // Calling LLTrans::getString() is what embeds the other default
+ // translation strings into this one.
+ LLTrans::setDefaultArg(brackets, LLTrans::getString(nobrackets));
+ }
+}
+
namespace {
// *TODO - decide if there's a better place for these functions.
// do we need a file llupdaterui.cpp or something? -brad
@@ -3145,8 +3219,8 @@ void LLAppViewer::writeSystemInfo()
}
// Dump some debugging info
- LL_INFOS("SystemInfo") << LLTrans::getString("APP_NAME")
- << " version " << LLVersionInfo::getShortVersion() << LL_ENDL;
+ LL_INFOS("SystemInfo") << "Application: " << LLTrans::getString("APP_NAME") << LL_ENDL;
+ LL_INFOS("SystemInfo") << "Version: " << LLVersionInfo::getChannelAndVersion() << LL_ENDL;
// Dump the local time and time zone
time_t now;
@@ -3161,8 +3235,6 @@ void LLAppViewer::writeSystemInfo()
LL_INFOS("SystemInfo") << "OS: " << getOSInfo().getOSStringSimple() << LL_ENDL;
LL_INFOS("SystemInfo") << "OS info: " << getOSInfo() << LL_ENDL;
- LL_INFOS("SystemInfo") << "Timers: " << LLFastTimer::sClockType << LL_ENDL;
-
writeDebugInfo(); // Save out debug_info.log early, in case of crash.
}
@@ -3274,22 +3346,27 @@ void LLAppViewer::handleViewerCrash()
//we're already in a crash situation
if (gDirUtilp)
{
- std::string crash_file_name;
- if(gLLErrorActivated) crash_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,LLERROR_MARKER_FILE_NAME);
- else crash_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,ERROR_MARKER_FILE_NAME);
- llinfos << "Creating crash marker file " << crash_file_name << llendl;
+ std::string crash_file_name = ( gLLErrorActivated )
+ ? gDirUtilp->getExpandedFilename(LL_PATH_LOGS,LLERROR_MARKER_FILE_NAME)
+ : gDirUtilp->getExpandedFilename(LL_PATH_LOGS,ERROR_MARKER_FILE_NAME);
+ LL_INFOS("MarkerFile") << "Creating crash marker file " << crash_file_name << LL_ENDL;
LLAPRFile crash_file ;
crash_file.open(crash_file_name, LL_APR_W);
if (crash_file.getFileHandle())
{
LL_INFOS("MarkerFile") << "Created crash marker file " << crash_file_name << LL_ENDL;
+ recordMarkerVersion(crash_file);
}
else
{
LL_WARNS("MarkerFile") << "Cannot create error marker file " << crash_file_name << LL_ENDL;
}
}
+ else
+ {
+ LL_WARNS("MarkerFile") << "No gDirUtilp with which to create error marker file name" << LL_ENDL;
+ }
if (gMessageSystem && gDirUtilp)
{
@@ -3341,7 +3418,7 @@ bool LLAppViewer::anotherInstanceRunning()
// If the file is currently locked, that means another process is already running.
std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, MARKER_FILE_NAME);
- LL_DEBUGS("MarkerFile") << "Checking marker file for lock..." << LL_ENDL;
+ LL_DEBUGS("MarkerFile") << "Checking marker file '"<< marker_file << "' for lock..." << LL_ENDL;
//Freeze case checks
if (LLAPRFile::isExist(marker_file, NULL, LL_APR_RB))
@@ -3367,6 +3444,46 @@ bool LLAppViewer::anotherInstanceRunning()
return false;
}
+// static
+void LLAppViewer::recordMarkerVersion(LLAPRFile& marker_file)
+{
+ std::string marker_version(LLVersionInfo::getChannelAndVersion());
+ if ( marker_version.length() > MAX_MARKER_LENGTH )
+ {
+ LL_WARNS_ONCE("MarkerFile") << "Version length ("<< marker_version.length()<< ") greater than maximum: marker matching may be incorrect" << LL_ENDL;
+ }
+
+ // record the viewer version in the marker file
+ marker_file.write(marker_version.data(), marker_version.length());
+}
+
+bool LLAppViewer::markerIsSameVersion(const std::string& marker_name) const
+{
+ bool sameVersion = false;
+
+ std::string my_version(LLVersionInfo::getChannelAndVersion());
+ char marker_version[MAX_MARKER_LENGTH];
+ S32 marker_version_length;
+
+ LLAPRFile marker_file;
+ marker_file.open(marker_name, LL_APR_RB);
+ if (marker_file.getFileHandle())
+ {
+ marker_version_length = marker_file.read(marker_version, sizeof(marker_version));
+ LL_DEBUGS("MarkerFile") << "Compare markers: ";
+ std::string marker_string(marker_version, marker_version_length);
+ LL_CONT << "\n mine '" << my_version << "'"
+ << "\n marker '" << marker_string << "'"
+ << LL_ENDL;
+ if ( 0 == my_version.compare( 0, my_version.length(), marker_version, 0, marker_version_length ) )
+ {
+ sameVersion = true;
+ }
+ marker_file.close();
+ }
+ return sameVersion;
+}
+
void LLAppViewer::initMarkerFile()
{
//First, check for the existence of other files.
@@ -3389,27 +3506,55 @@ void LLAppViewer::initMarkerFile()
if (LLAPRFile::isExist(mMarkerFileName, NULL, LL_APR_RB) && !anotherInstanceRunning())
{
- gLastExecEvent = LAST_EXEC_FROZE;
- LL_INFOS("MarkerFile") << "Exec marker found: program froze on previous execution" << LL_ENDL;
+ if ( markerIsSameVersion(mMarkerFileName) )
+ {
+ LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found" << LL_ENDL;
+ gLastExecEvent = LAST_EXEC_FROZE;
+ }
+ else
+ {
+ LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found, but versions did not match" << LL_ENDL;
+ }
}
if(LLAPRFile::isExist(logout_marker_file, NULL, LL_APR_RB))
{
- gLastExecEvent = LAST_EXEC_LOGOUT_FROZE;
- LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL;
+ if (markerIsSameVersion(logout_marker_file))
+ {
+ gLastExecEvent = LAST_EXEC_LOGOUT_FROZE;
+ LL_INFOS("MarkerFile") << "Logout crashed '"<< logout_marker_file << "', setting LastExecEvent to " << gLastExecEvent << LL_ENDL;
+ }
+ else
+ {
+ LL_INFOS("MarkerFile") << "Logout crash marker '"<< logout_marker_file << "' found, but versions did not match" << LL_ENDL;
+ }
LLAPRFile::remove(logout_marker_file);
}
if(LLAPRFile::isExist(llerror_marker_file, NULL, LL_APR_RB))
{
- if(gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) gLastExecEvent = LAST_EXEC_LOGOUT_CRASH;
- else gLastExecEvent = LAST_EXEC_LLERROR_CRASH;
- LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL;
+ if (markerIsSameVersion(llerror_marker_file))
+ {
+ gLastExecEvent = ( gLastExecEvent == LAST_EXEC_LOGOUT_FROZE )
+ ? LAST_EXEC_LOGOUT_CRASH : LAST_EXEC_LLERROR_CRASH;
+ LL_INFOS("MarkerFile") << "Last exec LLError '"<< llerror_marker_file << "' crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL;
+ }
+ else
+ {
+ LL_INFOS("MarkerFile") << "Last exec LLError marker '"<< llerror_marker_file << "' found, but versions did not match" << LL_ENDL;
+ }
LLAPRFile::remove(llerror_marker_file);
}
if(LLAPRFile::isExist(error_marker_file, NULL, LL_APR_RB))
{
- if(gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) gLastExecEvent = LAST_EXEC_LOGOUT_CRASH;
- else gLastExecEvent = LAST_EXEC_OTHER_CRASH;
- LL_INFOS("MarkerFile") << "Last exec crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL;
+ if (markerIsSameVersion(error_marker_file))
+ {
+ gLastExecEvent = (gLastExecEvent == LAST_EXEC_LOGOUT_FROZE)
+ ? LAST_EXEC_LOGOUT_CRASH : LAST_EXEC_OTHER_CRASH;
+ LL_INFOS("MarkerFile") << "Last exec '"<< error_marker_file << "' crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL;
+ }
+ else
+ {
+ LL_INFOS("MarkerFile") << "Last exec '"<< error_marker_file << "' marker found, but versions did not match" << LL_ENDL;
+ }
LLAPRFile::remove(error_marker_file);
}
@@ -3425,35 +3570,48 @@ void LLAppViewer::initMarkerFile()
if (s == APR_SUCCESS && mMarkerFile.getFileHandle())
{
- LL_DEBUGS("MarkerFile") << "Marker file created." << LL_ENDL;
+ LL_DEBUGS("MarkerFile") << "Marker file '"<< mMarkerFileName << "' created." << LL_ENDL;
+ if (APR_SUCCESS == apr_file_lock(mMarkerFile.getFileHandle(), APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE))
+ {
+ recordMarkerVersion(mMarkerFile);
+ LL_DEBUGS("MarkerFile") << "Marker file locked." << LL_ENDL;
+ }
+ else
+ {
+ LL_INFOS("MarkerFile") << "Marker file cannot be locked." << LL_ENDL;
+ }
}
else
{
- LL_INFOS("MarkerFile") << "Failed to create marker file." << LL_ENDL;
- return;
+ LL_INFOS("MarkerFile") << "Failed to create marker file '"<< mMarkerFileName << "'." << LL_ENDL;
}
- if (apr_file_lock(mMarkerFile.getFileHandle(), APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE) != APR_SUCCESS)
- {
- mMarkerFile.close() ;
- LL_INFOS("MarkerFile") << "Marker file cannot be locked." << LL_ENDL;
- return;
- }
-
- LL_DEBUGS("MarkerFile") << "Marker file locked." << LL_ENDL;
}
void LLAppViewer::removeMarkerFile(bool leave_logout_marker)
{
- LL_DEBUGS("MarkerFile") << "removeMarkerFile()" << LL_ENDL;
+ LL_DEBUGS("MarkerFile") << "removeMarkerFile("<<leave_logout_marker<<")" << LL_ENDL;
if (mMarkerFile.getFileHandle())
{
- mMarkerFile.close() ;
+ LL_DEBUGS("MarkerFile") << "removeMarkerFile marker '"<<mMarkerFileName<<"'"<< LL_ENDL;
+ mMarkerFile.close();
LLAPRFile::remove( mMarkerFileName );
}
- if (mLogoutMarkerFile != NULL && !leave_logout_marker)
+ else
+ {
+ LL_WARNS("MarkerFile") << "removeMarkerFile marker '"<<mMarkerFileName<<"' not open"<< LL_ENDL;
+ }
+ if (!leave_logout_marker)
{
+ if (mLogoutMarkerFile.getFileHandle())
+ {
+ LL_DEBUGS("MarkerFile") << "removeMarkerFile marker '"<<mLogoutMarkerFileName<<"'"<< LL_ENDL;
+ mLogoutMarkerFile.close();
+ }
+ else
+ {
+ LL_WARNS("MarkerFile") << "removeMarkerFile marker '"<<mLogoutMarkerFileName<<"' not open"<< LL_ENDL;
+ }
LLAPRFile::remove( mLogoutMarkerFileName );
- mLogoutMarkerFile = NULL;
}
}
@@ -3596,8 +3754,7 @@ void LLAppViewer::migrateCacheDirectory()
{
gSavedSettings.setBOOL("MigrateCacheDirectory", FALSE);
- std::string delimiter = gDirUtilp->getDirDelimiter();
- std::string old_cache_dir = gDirUtilp->getOSUserAppDir() + delimiter + "cache";
+ std::string old_cache_dir = gDirUtilp->add(gDirUtilp->getOSUserAppDir(), "cache");
std::string new_cache_dir = gDirUtilp->getCacheDir(true);
if (gDirUtilp->fileExists(old_cache_dir))
@@ -3613,8 +3770,8 @@ void LLAppViewer::migrateCacheDirectory()
while (iter.next(file_name))
{
if (file_name == "." || file_name == "..") continue;
- std::string source_path = old_cache_dir + delimiter + file_name;
- std::string dest_path = new_cache_dir + delimiter + file_name;
+ std::string source_path = gDirUtilp->add(old_cache_dir, file_name);
+ std::string dest_path = gDirUtilp->add(new_cache_dir, file_name);
if (!LLFile::rename(source_path, dest_path))
{
file_count++;
@@ -3845,7 +4002,7 @@ bool LLAppViewer::initCache()
LLDirIterator iter(dir, mask);
if (iter.next(found_file))
{
- old_vfs_data_file = dir + gDirUtilp->getDirDelimiter() + found_file;
+ old_vfs_data_file = gDirUtilp->add(dir, found_file);
S32 start_pos = found_file.find_last_of('.');
if (start_pos > 0)
@@ -4147,7 +4304,6 @@ static LLFastTimer::DeclareTimer FTM_VLMANAGER("VL Manager");
///////////////////////////////////////////////////////
void LLAppViewer::idle()
{
- LLMemType mt_idle(LLMemType::MTYPE_IDLE);
pingMainloopTimeout("Main:Idle");
// Update frame timers
@@ -4260,7 +4416,6 @@ void LLAppViewer::idle()
// of SEND_STATS_PERIOD so that the initial stats report will
// be sent immediately.
static LLFrameStatsTimer viewer_stats_timer(SEND_STATS_PERIOD);
- reset_statistics();
// Update session stats every large chunk of time
// *FIX: (???) SAMANTHA
@@ -4320,7 +4475,7 @@ void LLAppViewer::idle()
idle_afk_check();
// Update statistics for this frame
- update_statistics(gFrameCount);
+ update_statistics();
}
////////////////////////////////////////
@@ -4658,16 +4813,15 @@ void LLAppViewer::sendLogoutRequest()
mLogoutMarkerFileName = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,LOGOUT_MARKER_FILE_NAME);
LLAPRFile outfile ;
- outfile.open(mLogoutMarkerFileName, LL_APR_W);
- mLogoutMarkerFile = outfile.getFileHandle() ;
- if (mLogoutMarkerFile)
+ mLogoutMarkerFile.open(mLogoutMarkerFileName, LL_APR_W);
+ if (mLogoutMarkerFile.getFileHandle())
{
- llinfos << "Created logout marker file " << mLogoutMarkerFileName << llendl;
- apr_file_close(mLogoutMarkerFile);
+ LL_INFOS("MarkerFile") << "Created logout marker file '"<< mLogoutMarkerFileName << "' " << mLogoutMarkerFileName << LL_ENDL;
+ recordMarkerVersion(outfile);
}
else
{
- llwarns << "Cannot create logout marker file " << mLogoutMarkerFileName << llendl;
+ LL_WARNS("MarkerFile") << "Cannot create logout marker file " << mLogoutMarkerFileName << LL_ENDL;
}
}
}
@@ -4746,7 +4900,6 @@ static LLFastTimer::DeclareTimer FTM_CHECK_REGION_CIRCUIT("Check Region Circuit"
void LLAppViewer::idleNetwork()
{
- LLMemType mt_in(LLMemType::MTYPE_IDLE_NETWORK);
pingMainloopTimeout("idleNetwork");
gObjectList.mNumNewObjects = 0;
@@ -5160,20 +5313,20 @@ void LLAppViewer::launchUpdater()
// we tell the updater where to find the xml containing string
// translations which it can use for its own UI
std::string xml_strings_file = "strings.xml";
- std::vector<std::string> xui_path_vec = LLUI::getXUIPaths();
+ std::vector<std::string> xui_path_vec =
+ gDirUtilp->findSkinnedFilenames(LLDir::XUI, xml_strings_file);
std::string xml_search_paths;
- std::vector<std::string>::const_iterator iter;
+ const char* delim = "";
// build comma-delimited list of xml paths to pass to updater
- for (iter = xui_path_vec.begin(); iter != xui_path_vec.end(); )
- {
- std::string this_skin_dir = gDirUtilp->getDefaultSkinDir()
- + gDirUtilp->getDirDelimiter()
- + (*iter);
- llinfos << "Got a XUI path: " << this_skin_dir << llendl;
- xml_search_paths.append(this_skin_dir);
- ++iter;
- if (iter != xui_path_vec.end())
- xml_search_paths.append(","); // comma-delimit
+ BOOST_FOREACH(std::string this_skin_path, xui_path_vec)
+ {
+ // Although we already have the full set of paths with the filename
+ // appended, the linux-updater.bin command-line switches require us to
+ // snip the filename OFF and pass it as a separate switch argument. :-P
+ llinfos << "Got a XUI path: " << this_skin_path << llendl;
+ xml_search_paths.append(delim);
+ xml_search_paths.append(gDirUtilp->getDirName(this_skin_path));
+ delim = ",";
}
// build the overall command-line to run the updater correctly
LLAppViewer::sUpdaterInfo->mUpdateExePath =
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index ae3c795d1e..0cc02b14e6 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -31,6 +31,7 @@
#include "llcontrol.h"
#include "llsys.h" // for LLOSInfo
#include "lltimer.h"
+#include "llappcorehttp.h"
class LLCommandLineParser;
class LLFrameTimer;
@@ -41,6 +42,9 @@ class LLTextureFetch;
class LLWatchdogTimeout;
class LLUpdaterService;
+extern LLFastTimer::DeclareTimer FTM_FRAME;
+
+
class LLAppViewer : public LLApp
{
public:
@@ -173,6 +177,9 @@ public:
// Metrics policy helper statics.
static void metricsUpdateRegion(U64 region_handle);
static void metricsSend(bool enable_reporting);
+
+ // llcorehttp init/shutdown/config information.
+ LLAppCoreHttp & getAppCoreHttp() { return mAppCoreHttp; }
protected:
virtual bool initWindow(); // Initialize the viewer's window.
@@ -194,6 +201,7 @@ private:
void initMaxHeapSize();
bool initThreads(); // Initialize viewer threads, return false on failure.
bool initConfiguration(); // Initialize settings from the command line/config file.
+ void initStrings(); // Initialize LLTrans machinery
void initUpdater(); // Initialize the updater service.
bool initCache(); // Initialize local client cache.
void checkMemory() ;
@@ -209,7 +217,9 @@ private:
bool anotherInstanceRunning();
void initMarkerFile();
-
+ static void recordMarkerVersion(LLAPRFile& marker_file);
+ bool markerIsSameVersion(const std::string& marker_name) const;
+
void idle();
void idleShutdown();
// update avatar SLID and display name caches
@@ -229,7 +239,7 @@ private:
LLAPRFile mMarkerFile; // A file created to indicate the app is running.
std::string mLogoutMarkerFileName;
- apr_file_t* mLogoutMarkerFile; // A file created to indicate the app is running.
+ LLAPRFile mLogoutMarkerFile; // A file created to indicate the app is running.
LLOSInfo mSysOSInfo;
@@ -271,6 +281,9 @@ private:
boost::scoped_ptr<LLUpdaterService> mUpdater;
+ // llcorehttp library init/shutdown helper
+ LLAppCoreHttp mAppCoreHttp;
+
//---------------------------------------------
//*NOTE: Mani - legacy updater stuff
// Still useable?
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index e8d8efdc0a..8695652168 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -31,7 +31,6 @@
#include "llcommandlineparser.h"
#include "lldiriterator.h"
-#include "llmemtype.h"
#include "llurldispatcher.h" // SLURL from other app instance
#include "llviewernetwork.h"
#include "llviewercontrol.h"
@@ -71,8 +70,6 @@ static void exceptionTerminateHandler()
int main( int argc, char **argv )
{
- LLMemType mt1(LLMemType::MTYPE_STARTUP);
-
#if LL_SOLARIS && defined(__sparc)
asm ("ta\t6"); // NOTE: Make sure memory alignment is enforced on SPARC
#endif
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index c2916717bd..4d340cafa9 100644
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -33,8 +33,6 @@
#include "llappviewermacosx.h"
#include "llcommandlineparser.h"
-#include "llmemtype.h"
-
#include "llviewernetwork.h"
#include "llviewercontrol.h"
#include "llmd5.h"
@@ -67,8 +65,6 @@ namespace
int main( int argc, char **argv )
{
- LLMemType mt1(LLMemType::MTYPE_STARTUP);
-
#if LL_SOLARIS && defined(__sparc)
asm ("ta\t6"); // NOTE: Make sure memory alignment is enforced on SPARC
#endif
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 53c77fa22e..8326be433e 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -32,7 +32,6 @@
#include "llappviewerwin32.h"
-#include "llmemtype.h"
#include "llwindowwin32.h" // *FIX: for setting gIconResource.
#include "llgl.h"
@@ -47,6 +46,11 @@
#include "llviewercontrol.h"
#include "lldxhardware.h"
+#include "nvapi/nvapi.h"
+#include "nvapi/NvApiDriverSettings.h"
+
+#include <stdlib.h>
+
#include "llweb.h"
#include "llsecondlifeurls.h"
@@ -61,6 +65,7 @@
#include "llwindebug.h"
#endif
+
// *FIX:Mani - This hack is to fix a linker issue with libndofdev.lib
// The lib was compiled under VS2005 - in VS2003 we need to remap assert
#ifdef LL_DEBUG
@@ -76,6 +81,20 @@ extern "C" {
const std::string LLAppViewerWin32::sWindowClass = "Second Life";
+/*
+ This function is used to print to the command line a text message
+ describing the nvapi error and quits
+*/
+void nvapi_error(NvAPI_Status status)
+{
+ NvAPI_ShortString szDesc = {0};
+ NvAPI_GetErrorMessage(status, szDesc);
+ llwarns << szDesc << llendl;
+
+ //should always trigger when asserts are enabled
+ llassert(status == NVAPI_OK);
+}
+
// Create app mutex creates a unique global windows object.
// If the object can be created it returns true, otherwise
// it returns false. The false result can be used to determine
@@ -97,6 +116,79 @@ bool create_app_mutex()
return result;
}
+void ll_nvapi_init(NvDRSSessionHandle hSession)
+{
+ // (2) load all the system settings into the session
+ NvAPI_Status status = NvAPI_DRS_LoadSettings(hSession);
+ if (status != NVAPI_OK)
+ {
+ nvapi_error(status);
+ return;
+ }
+
+ NvAPI_UnicodeString profile_name;
+ std::string app_name = LLTrans::getString("APP_NAME");
+ llutf16string w_app_name = utf8str_to_utf16str(app_name);
+ wsprintf(profile_name, L"%s", w_app_name.c_str());
+ status = NvAPI_DRS_SetCurrentGlobalProfile(hSession, profile_name);
+ if (status != NVAPI_OK)
+ {
+ nvapi_error(status);
+ return;
+ }
+
+ // (3) Obtain the current profile.
+ NvDRSProfileHandle hProfile = 0;
+ status = NvAPI_DRS_GetCurrentGlobalProfile(hSession, &hProfile);
+ if (status != NVAPI_OK)
+ {
+ nvapi_error(status);
+ return;
+ }
+
+ // load settings for querying
+ status = NvAPI_DRS_LoadSettings(hSession);
+ if (status != NVAPI_OK)
+ {
+ nvapi_error(status);
+ return;
+ }
+
+ //get the preferred power management mode for Second Life
+ NVDRS_SETTING drsSetting = {0};
+ drsSetting.version = NVDRS_SETTING_VER;
+ status = NvAPI_DRS_GetSetting(hSession, hProfile, PREFERRED_PSTATE_ID, &drsSetting);
+ if (status == NVAPI_SETTING_NOT_FOUND)
+ { //only override if the user hasn't specifically set this setting
+ // (4) Specify that we want the VSYNC disabled setting
+ // first we fill the NVDRS_SETTING struct, then we call the function
+ drsSetting.version = NVDRS_SETTING_VER;
+ drsSetting.settingId = PREFERRED_PSTATE_ID;
+ drsSetting.settingType = NVDRS_DWORD_TYPE;
+ drsSetting.u32CurrentValue = PREFERRED_PSTATE_PREFER_MAX;
+ status = NvAPI_DRS_SetSetting(hSession, hProfile, &drsSetting);
+ if (status != NVAPI_OK)
+ {
+ nvapi_error(status);
+ return;
+ }
+ }
+ else if (status != NVAPI_OK)
+ {
+ nvapi_error(status);
+ return;
+ }
+
+
+
+ // (5) Now we apply (or save) our changes to the system
+ status = NvAPI_DRS_SaveSettings(hSession);
+ if (status != NVAPI_OK)
+ {
+ nvapi_error(status);
+ }
+}
+
//#define DEBUGGING_SEH_FILTER 1
#if DEBUGGING_SEH_FILTER
# define WINMAIN DebuggingWinMain
@@ -117,21 +209,21 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
#endif // _DEBUG
#endif // INCLUDE_VLD
- LLMemType mt1(LLMemType::MTYPE_STARTUP);
-
const S32 MAX_HEAPS = 255;
DWORD heap_enable_lfh_error[MAX_HEAPS];
S32 num_heaps = 0;
#if WINDOWS_CRT_MEM_CHECKS && !INCLUDE_VLD
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); // dump memory leaks on exit
-#elif 1
+#elif 0
// Experimental - enable the low fragmentation heap
// This results in a 2-3x improvement in opening a new Inventory window (which uses a large numebr of allocations)
// Note: This won't work when running from the debugger unless the _NO_DEBUG_HEAP environment variable is set to 1
// Enable to get mem debugging within visual studio.
- //_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
+#if LL_DEBUG
+ _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
+#else
_CrtSetDbgFlag(0); // default, just making explicit
ULONG ulEnableLFH = 2;
@@ -146,6 +238,7 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
heap_enable_lfh_error[i] = GetLastError();
}
#endif
+#endif
// *FIX: global
gIconResource = MAKEINTRESOURCE(IDI_LL_ICON);
@@ -165,6 +258,27 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
return -1;
}
+ NvAPI_Status status;
+
+ // Initialize NVAPI
+ status = NvAPI_Initialize();
+ NvDRSSessionHandle hSession = 0;
+
+ if (status == NVAPI_OK)
+ {
+ // Create the session handle to access driver settings
+ status = NvAPI_DRS_CreateSession(&hSession);
+ if (status != NVAPI_OK)
+ {
+ nvapi_error(status);
+ }
+ else
+ {
+ //override driver setting as needed
+ ll_nvapi_init(hSession);
+ }
+ }
+
// Have to wait until after logging is initialized to display LFH info
if (num_heaps > 0)
{
@@ -232,6 +346,15 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
LLAppViewer::sUpdaterInfo = NULL ;
}
+
+
+ // (NVAPI) (6) We clean up. This is analogous to doing a free()
+ if (hSession)
+ {
+ NvAPI_DRS_DestroySession(hSession);
+ hSession = 0;
+ }
+
return 0;
}
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index 65bfc990d1..7b2c536f5a 100644
--- a/indra/newview/llassetuploadresponders.cpp
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -919,7 +919,7 @@ public:
bool uploadConfirmationCallback(
const LLSD& notification,
const LLSD& response,
- boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder> responder)
+ LLPointer<LLNewAgentInventoryVariablePriceResponder> responder)
{
S32 option;
std::string confirmation_url;
@@ -949,7 +949,7 @@ public:
void confirmUpload(
const std::string& confirmation_url,
- boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder> responder)
+ LLPointer<LLNewAgentInventoryVariablePriceResponder> responder)
{
if ( getFilename().empty() )
{
@@ -1124,7 +1124,7 @@ void LLNewAgentInventoryVariablePriceResponder::showConfirmationDialog(
// and cause sadness.
mImpl->confirmUpload(
confirmation_url,
- boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder>(this));
+ LLPointer<LLNewAgentInventoryVariablePriceResponder>(this));
}
else
{
@@ -1157,7 +1157,7 @@ void LLNewAgentInventoryVariablePriceResponder::showConfirmationDialog(
mImpl,
_1,
_2,
- boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder>(this)));
+ LLPointer<LLNewAgentInventoryVariablePriceResponder>(this)));
}
}
diff --git a/indra/newview/llattachmentsmgr.cpp b/indra/newview/llattachmentsmgr.cpp
index c9543988a6..ea0b8f00a4 100644
--- a/indra/newview/llattachmentsmgr.cpp
+++ b/indra/newview/llattachmentsmgr.cpp
@@ -62,6 +62,12 @@ void LLAttachmentsMgr::onIdle(void *)
void LLAttachmentsMgr::onIdle()
{
+ // Make sure we got a region before trying anything else
+ if( !gAgent.getRegion() )
+ {
+ return;
+ }
+
S32 obj_count = mPendingAttachments.size();
if (obj_count == 0)
{
diff --git a/indra/newview/llautoreplace.cpp b/indra/newview/llautoreplace.cpp
index 0f1ce2bcd0..1d72397cbc 100644
--- a/indra/newview/llautoreplace.cpp
+++ b/indra/newview/llautoreplace.cpp
@@ -30,68 +30,60 @@
#include "llviewercontrol.h"
#include "llnotificationsutil.h"
-LLAutoReplace* LLAutoReplace::sInstance;
-
const char* LLAutoReplace::SETTINGS_FILE_NAME = "autoreplace.xml";
-LLAutoReplace::LLAutoReplace()
-{
-}
-
-LLAutoReplace::~LLAutoReplace()
+void LLAutoReplace::autoreplaceCallback(S32& replacement_start, S32& replacement_length, LLWString& replacement_string, S32& cursor_pos, const LLWString& input_text)
{
- sInstance = NULL;
-}
+ // make sure these returned values are cleared in case there is no replacement
+ replacement_start = 0;
+ replacement_length = 0;
+ replacement_string.clear();
-void LLAutoReplace::autoreplaceCallback(LLUIString& inputText, S32& cursorPos)
-{
static LLCachedControl<bool> perform_autoreplace(gSavedSettings, "AutoReplace");
- if(perform_autoreplace)
+ if (perform_autoreplace)
{
- S32 wordEnd = cursorPos-1;
- LLWString text = inputText.getWString();
+ S32 word_end = cursor_pos - 1;
- bool atSpace = (text[wordEnd] == ' ');
- bool haveWord = (LLWStringUtil::isPartOfWord(text[wordEnd]));
+ bool at_space = (input_text[word_end] == ' ');
+ bool have_word = (LLWStringUtil::isPartOfWord(input_text[word_end]));
- if (atSpace || haveWord)
+ if (at_space || have_word)
{
- if (atSpace && wordEnd > 0)
+ if (at_space && word_end > 0)
{
// find out if this space immediately follows a word
- wordEnd--;
- haveWord = (LLWStringUtil::isPartOfWord(text[wordEnd]));
+ word_end--;
+ have_word = (LLWStringUtil::isPartOfWord(input_text[word_end]));
}
- if (haveWord)
+ if (have_word)
{
- // wordEnd points to the end of a word, now find the start of the word
+ // word_end points to the end of a word, now find the start of the word
std::string word;
- S32 wordStart = wordEnd;
- for ( S32 backOne = wordStart - 1;
- backOne >= 0 && LLWStringUtil::isPartOfWord(text[backOne]);
- backOne--
- )
+ S32 word_start = word_end;
+ for (S32 back_one = word_start - 1;
+ back_one >= 0 && LLWStringUtil::isPartOfWord(input_text[back_one]);
+ back_one--
+ )
{
- wordStart--; // walk wordStart back to the beginning of the word
+ word_start--; // walk word_start back to the beginning of the word
}
- LL_DEBUGS("AutoReplace")<<"wordStart: "<<wordStart<<" wordEnd: "<<wordEnd<<LL_ENDL;
- std::string strText = std::string(text.begin(), text.end());
- std::string lastWord = strText.substr(wordStart, wordEnd-wordStart+1);
- std::string replacementWord( mSettings.replaceWord( lastWord ) );
+ LL_DEBUGS("AutoReplace") << "word_start: " << word_start << " word_end: " << word_end << LL_ENDL;
+ std::string str_text = std::string(input_text.begin(), input_text.end());
+ std::string last_word = str_text.substr(word_start, word_end - word_start + 1);
+ std::string replacement_word(mSettings.replaceWord(last_word));
- if ( replacementWord != lastWord )
+ if (replacement_word != last_word)
{
// The last word is one for which we have a replacement
- if (atSpace)
+ if (at_space)
{
- // replace the last word in the input
- LLWString strNew = utf8str_to_wstring(replacementWord);
- LLWString strOld = utf8str_to_wstring(lastWord);
- int size_change = strNew.size() - strOld.size();
-
- text.replace(wordStart,lastWord.length(),strNew);
- inputText = wstring_to_utf8str(text);
- cursorPos+=size_change;
+ // return the replacement string
+ replacement_start = word_start;
+ replacement_length = last_word.length();
+ replacement_string = utf8str_to_wstring(replacement_word);
+ LLWString old_string = utf8str_to_wstring(last_word);
+ S32 size_change = replacement_string.size() - old_string.size();
+ cursor_pos += size_change;
}
}
}
@@ -99,16 +91,6 @@ void LLAutoReplace::autoreplaceCallback(LLUIString& inputText, S32& cursorPos)
}
}
-LLAutoReplace* LLAutoReplace::getInstance()
-{
- if(!sInstance)
- {
- sInstance = new LLAutoReplace();
- sInstance->loadFromSettings();
- }
- return sInstance;
-}
-
std::string LLAutoReplace::getUserSettingsFileName()
{
std::string path=gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "");
@@ -147,6 +129,15 @@ void LLAutoReplace::setSettings(const LLAutoReplaceSettings& newSettings)
saveToUserSettings();
}
+LLAutoReplace::LLAutoReplace()
+{
+}
+
+void LLAutoReplace::initSingleton()
+{
+ loadFromSettings();
+}
+
void LLAutoReplace::loadFromSettings()
{
std::string filename=getUserSettingsFileName();
@@ -220,7 +211,7 @@ void LLAutoReplace::saveToUserSettings()
std::string filename=getUserSettingsFileName();
llofstream file;
file.open(filename.c_str());
- LLSDSerialize::toPrettyXML(mSettings.getAsLLSD(), file);
+ LLSDSerialize::toPrettyXML(mSettings.asLLSD(), file);
file.close();
LL_INFOS("AutoReplace") << "settings saved to '" << filename << "'" << LL_ENDL;
}
@@ -536,6 +527,46 @@ LLAutoReplaceSettings::AddListResult LLAutoReplaceSettings::addList(const LLSD&
return result;
}
+LLAutoReplaceSettings::AddListResult LLAutoReplaceSettings::replaceList(const LLSD& newList)
+{
+ AddListResult result = AddListInvalidList;
+ if ( listIsValid( newList ) )
+ {
+ std::string listName = newList[AUTOREPLACE_LIST_NAME].asString();
+ bool listFound = false;
+ S32 search_index;
+ LLSD targetList;
+ // The following is working around the fact that LLSD arrays containing maps also seem to have undefined entries... see LLSD-30
+ for ( search_index = 0, targetList = mLists[0];
+ !listFound && search_index < mLists.size();
+ search_index += 1, targetList = mLists[search_index]
+ )
+ {
+ if ( targetList.isMap() )
+ {
+ if ( listNameMatches( targetList, listName) )
+ {
+ LL_DEBUGS("AutoReplace")<<"list to replace found at "<<search_index<<LL_ENDL;
+ mLists.erase(search_index);
+ mLists.insert(search_index, newList);
+ listFound = true;
+ result = AddListOk;
+ }
+ }
+ }
+
+ if ( ! listFound )
+ {
+ LL_WARNS("AutoReplace") << "attempt to replace unconfigured list" << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_WARNS("AutoReplace") << "attempt to add invalid list" << LL_ENDL;
+ }
+ return result;
+}
+
bool LLAutoReplaceSettings::removeReplacementList(std::string listName)
{
bool found = false;
@@ -761,7 +792,7 @@ LLSD LLAutoReplaceSettings::getExampleLLSD()
return example;
}
-const LLSD& LLAutoReplaceSettings::getAsLLSD()
+const LLSD& LLAutoReplaceSettings::asLLSD()
{
return mLists;
}
diff --git a/indra/newview/llautoreplace.h b/indra/newview/llautoreplace.h
index 30b1fd2c65..9eecc2d981 100644
--- a/indra/newview/llautoreplace.h
+++ b/indra/newview/llautoreplace.h
@@ -67,6 +67,9 @@ class LLAutoReplaceSettings
/// Inserts a new list at the end of the priority order
AddListResult addList(const LLSD& newList);
+ /// Inserts a list in place of an existing list of the same name
+ AddListResult replaceList(const LLSD& newList);
+
/// Removes the named list, @returns false if not found
bool removeReplacementList(std::string listName);
@@ -129,7 +132,7 @@ class LLAutoReplaceSettings
LLSD getExampleLLSD();
/// Get the actual settings as LLSD
- const LLSD& getAsLLSD();
+ const LLSD& asLLSD();
///< @note for use only in AutoReplace::saveToUserSettings
private:
@@ -180,49 +183,45 @@ class LLAutoReplaceSettings
* When the end of a word is detected (defined as any punctuation character,
* or any whitespace except newline or return), the preceding word is used
* as a lookup key in an ordered list of maps. If a match is found in any
- * map, the keyword is replaced by the associated value from the map.
+ * map, the replacement start index and length are returned along with the
+ * new replacement string.
*
* See the autoreplaceCallback method for how to add autoreplace functionality
* to a text entry tool.
*/
class LLAutoReplace : public LLSingleton<LLAutoReplace>
{
- public:
- LLAutoReplace();
- ~LLAutoReplace();
-
- /// @return a pointer to the active instance
- static LLAutoReplace* getInstance();
+public:
+ /// Callback that provides the hook for use in text entry methods
+ void autoreplaceCallback(S32& replacement_start, S32& replacement_length, LLWString& replacement_string, S32& cursor_pos, const LLWString& input_text);
- /// Callback that provides the hook for use in text entry methods
- void autoreplaceCallback(LLUIString& inputText, S32& cursorPos);
+ /// Get a copy of the current settings
+ LLAutoReplaceSettings getSettings();
- /// Get a copy of the current settings
- LLAutoReplaceSettings getSettings();
+ /// Commit new settings after making changes
+ void setSettings(const LLAutoReplaceSettings& settings);
- /// Commit new settings after making changes
- void setSettings(const LLAutoReplaceSettings& settings);
-
- private:
- friend class LLSingleton<LLAutoReplace>;
- static LLAutoReplace* sInstance; ///< the active settings instance
+private:
+ friend class LLSingleton<LLAutoReplace>;
+ LLAutoReplace();
+ /*virtual*/ void initSingleton();
- LLAutoReplaceSettings mSettings; ///< configuration information
+ LLAutoReplaceSettings mSettings; ///< configuration information
- /// Read settings from persistent storage
- void loadFromSettings();
+ /// Read settings from persistent storage
+ void loadFromSettings();
- /// Make the newSettings active and write them to user storage
- void saveToUserSettings();
+ /// Make the newSettings active and write them to user storage
+ void saveToUserSettings();
- /// Compute the user settings file name
- std::string getUserSettingsFileName();
+ /// Compute the user settings file name
+ std::string getUserSettingsFileName();
- /// Compute the (read-ony) application settings file name
- std::string getAppSettingsFileName();
+ /// Compute the (read-ony) application settings file name
+ std::string getAppSettingsFileName();
- /// basename for the settings files
- static const char* SETTINGS_FILE_NAME;
+ /// basename for the settings files
+ static const char* SETTINGS_FILE_NAME;
};
#endif /* LLAUTOREPLACE_H */
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index fdd4565e50..b513a52ff7 100755
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -42,7 +42,9 @@
#include "llappviewer.h" // for gLastVersionChannel
#include "llcachename.h"
#include "llcallingcard.h" // for LLAvatarTracker
+#include "llconversationlog.h"
#include "llfloateravatarpicker.h" // for LLFloaterAvatarPicker
+#include "llfloaterconversationpreview.h"
#include "llfloatergroupinvite.h"
#include "llfloatergroups.h"
#include "llfloaterreg.h"
@@ -55,6 +57,7 @@
#include "llinventorybridge.h"
#include "llinventorymodel.h" // for gInventory.findCategoryUUIDForType
#include "llinventorypanel.h"
+#include "llfloaterimcontainer.h"
#include "llimview.h" // for gIMMgr
#include "llmutelist.h"
#include "llnotificationsutil.h" // for LLNotificationsUtil
@@ -66,7 +69,6 @@
#include "llviewerobjectlist.h"
#include "llviewermessage.h" // for handle_lure
#include "llviewerregion.h"
-#include "llimfloater.h"
#include "lltrans.h"
#include "llcallingcard.h"
#include "llslurl.h" // IDEVO
@@ -93,7 +95,7 @@ void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::strin
LLRecentPeople::instance().add(id);
}
-void on_avatar_name_friendship(const LLUUID& id, const LLAvatarName av_name)
+static void on_avatar_name_friendship(const LLUUID& id, const LLAvatarName av_name)
{
LLAvatarActions::requestFriendshipDialog(id, av_name.getCompleteName());
}
@@ -134,7 +136,7 @@ void LLAvatarActions::removeFriendsDialog(const uuid_vec_t& ids)
LLAvatarName av_name;
if(LLAvatarNameCache::get(agent_id, &av_name))
{
- args["NAME"] = av_name.mDisplayName;
+ args["NAME"] = av_name.getDisplayName();
}
msgType = "RemoveFromFriends";
@@ -179,11 +181,11 @@ void LLAvatarActions::offerTeleport(const uuid_vec_t& ids)
static void on_avatar_name_cache_start_im(const LLUUID& agent_id,
const LLAvatarName& av_name)
{
- std::string name = av_name.getCompleteName();
+ std::string name = av_name.getDisplayName();
LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, agent_id);
if (session_id != LLUUID::null)
{
- LLIMFloater::show(session_id);
+ LLFloaterIMContainer::getInstance()->showConversation(session_id);
}
make_ui_sound("UISndStartIM");
}
@@ -191,11 +193,10 @@ static void on_avatar_name_cache_start_im(const LLUUID& agent_id,
// static
void LLAvatarActions::startIM(const LLUUID& id)
{
- if (id.isNull())
+ if (id.isNull() || gAgent.getID() == id)
return;
- LLAvatarNameCache::get(id,
- boost::bind(&on_avatar_name_cache_start_im, _1, _2));
+ LLAvatarNameCache::get(id, boost::bind(&on_avatar_name_cache_start_im, _1, _2));
}
// static
@@ -214,7 +215,7 @@ void LLAvatarActions::endIM(const LLUUID& id)
static void on_avatar_name_cache_start_call(const LLUUID& agent_id,
const LLAvatarName& av_name)
{
- std::string name = av_name.getCompleteName();
+ std::string name = av_name.getDisplayName();
LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, agent_id, true);
if (session_id != LLUUID::null)
{
@@ -230,12 +231,11 @@ void LLAvatarActions::startCall(const LLUUID& id)
{
return;
}
- LLAvatarNameCache::get(id,
- boost::bind(&on_avatar_name_cache_start_call, _1, _2));
+ LLAvatarNameCache::get(id, boost::bind(&on_avatar_name_cache_start_call, _1, _2));
}
// static
-void LLAvatarActions::startAdhocCall(const uuid_vec_t& ids)
+void LLAvatarActions::startAdhocCall(const uuid_vec_t& ids, const LLUUID& floater_id)
{
if (ids.size() == 0)
{
@@ -252,7 +252,7 @@ void LLAvatarActions::startAdhocCall(const uuid_vec_t& ids)
// create the new ad hoc voice session
const std::string title = LLTrans::getString("conference-title");
LLUUID session_id = gIMMgr->addSession(title, IM_SESSION_CONFERENCE_START,
- ids[0], id_array, true);
+ ids[0], id_array, true, floater_id);
if (session_id == LLUUID::null)
{
return;
@@ -285,7 +285,7 @@ bool LLAvatarActions::canCall()
}
// static
-void LLAvatarActions::startConference(const uuid_vec_t& ids)
+void LLAvatarActions::startConference(const uuid_vec_t& ids, const LLUUID& floater_id)
{
// *HACK: Copy into dynamic array
LLDynamicArray<LLUUID> id_array;
@@ -294,11 +294,15 @@ void LLAvatarActions::startConference(const uuid_vec_t& ids)
id_array.push_back(*it);
}
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)
+ LLUUID session_id = gIMMgr->addSession(title, IM_SESSION_CONFERENCE_START, ids[0], id_array, false, floater_id);
+
+ if (session_id == LLUUID::null)
{
- LLIMFloater::show(session_id);
+ return;
}
+
+ LLFloaterIMContainer::getInstance()->showConversation(session_id);
+
make_ui_sound("UISndStartIM");
}
@@ -310,19 +314,11 @@ static const char* get_profile_floater_name(const LLUUID& avatar_id)
static void on_avatar_name_show_profile(const LLUUID& agent_id, const LLAvatarName& av_name)
{
- std::string username = av_name.mUsername;
- if (username.empty())
- {
- username = LLCacheName::buildUsername(av_name.mDisplayName);
- }
-
- llinfos << "opening web profile for " << username << llendl;
- std::string url = getProfileURL(username);
+ std::string url = getProfileURL(av_name.getAccountName());
// PROFILES: open in webkit window
LLFloaterWebContent::Params p;
- p.url(url).
- id(agent_id.asString());
+ p.url(url).id(agent_id.asString());
LLFloaterReg::showInstance(get_profile_floater_name(agent_id), p);
}
@@ -374,19 +370,19 @@ void LLAvatarActions::showOnMap(const LLUUID& id)
return;
}
- gFloaterWorldMap->trackAvatar(id, av_name.mDisplayName);
+ gFloaterWorldMap->trackAvatar(id, av_name.getDisplayName());
LLFloaterReg::showInstance("world_map");
}
// static
void LLAvatarActions::pay(const LLUUID& id)
{
- LLNotification::Params params("BusyModePay");
+ LLNotification::Params params("DoNotDisturbModePay");
params.functor.function(boost::bind(&LLAvatarActions::handlePay, _1, _2, id));
- if (gAgent.getBusy())
+ if (gAgent.isDoNotDisturb())
{
- // warn users of being in busy mode during a transaction
+ // warn users of being in do not disturb mode during a transaction
LLNotifications::instance().add(params);
}
else
@@ -448,6 +444,7 @@ void LLAvatarActions::share(const LLUUID& id)
{
LLSD key;
LLFloaterSidePanelContainer::showPanel("inventory", key);
+ LLFloaterReg::showInstance("im_container");
LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL,id);
@@ -529,23 +526,6 @@ namespace action_give_inventory
return acceptable;
}
- static void build_residents_string(const std::vector<LLAvatarName> avatar_names, std::string& residents_string)
- {
- llassert(avatar_names.size() > 0);
-
- const std::string& separator = LLTrans::getString("words_separator");
- for (std::vector<LLAvatarName>::const_iterator it = avatar_names.begin(); ; )
- {
- LLAvatarName av_name = *it;
- residents_string.append(av_name.mDisplayName);
- if (++it == avatar_names.end())
- {
- break;
- }
- residents_string.append(separator);
- }
- }
-
static void build_items_string(const std::set<LLUUID>& inventory_selected_uuids , std::string& items_string)
{
llassert(inventory_selected_uuids.size() > 0);
@@ -681,7 +661,7 @@ namespace action_give_inventory
}
std::string residents;
- build_residents_string(avatar_names, residents);
+ LLAvatarActions::buildResidentsString(avatar_names, residents);
std::string items;
build_items_string(inventory_selected_uuids, items);
@@ -712,38 +692,84 @@ namespace action_give_inventory
}
}
+// static
+void LLAvatarActions::buildResidentsString(std::vector<LLAvatarName> avatar_names, std::string& residents_string)
+{
+ llassert(avatar_names.size() > 0);
+
+ std::sort(avatar_names.begin(), avatar_names.end());
+ const std::string& separator = LLTrans::getString("words_separator");
+ for (std::vector<LLAvatarName>::const_iterator it = avatar_names.begin(); ; )
+ {
+ residents_string.append((*it).getDisplayName());
+ if (++it == avatar_names.end())
+ {
+ break;
+ }
+ residents_string.append(separator);
+ }
+}
+// static
+void LLAvatarActions::buildResidentsString(const uuid_vec_t& avatar_uuids, std::string& residents_string)
+{
+ std::vector<LLAvatarName> avatar_names;
+ uuid_vec_t::const_iterator it = avatar_uuids.begin();
+ for (; it != avatar_uuids.end(); ++it)
+ {
+ LLAvatarName av_name;
+ if (LLAvatarNameCache::get(*it, &av_name))
+ {
+ avatar_names.push_back(av_name);
+ }
+ }
+
+ // We should check whether the vector is not empty to pass the assertion
+ // that avatar_names.size() > 0 in LLAvatarActions::buildResidentsString.
+ if (!avatar_names.empty())
+ {
+ LLAvatarActions::buildResidentsString(avatar_names, residents_string);
+ }
+}
//static
std::set<LLUUID> LLAvatarActions::getInventorySelectedUUIDs()
{
- std::set<LLUUID> inventory_selected_uuids;
+ std::set<LLFolderViewItem*> inventory_selected;
LLInventoryPanel* active_panel = action_give_inventory::get_active_inventory_panel();
if (active_panel)
{
- inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList();
+ inventory_selected= active_panel->getRootFolder()->getSelectionList();
}
- if (inventory_selected_uuids.empty())
+ if (inventory_selected.empty())
{
LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
if (sidepanel_inventory)
{
- inventory_selected_uuids = sidepanel_inventory->getInboxSelectionList();
+ inventory_selected= sidepanel_inventory->getInboxSelectionList();
}
}
+ std::set<LLUUID> inventory_selected_uuids;
+ for (std::set<LLFolderViewItem*>::iterator it = inventory_selected.begin(), end_it = inventory_selected.end();
+ it != end_it;
+ ++it)
+ {
+ inventory_selected_uuids.insert(static_cast<LLFolderViewModelItemInventory*>((*it)->getViewModelItem())->getUUID());
+ }
return inventory_selected_uuids;
}
//static
-void LLAvatarActions::shareWithAvatars()
+void LLAvatarActions::shareWithAvatars(LLView * panel)
{
using namespace action_give_inventory;
+ LLFloater* root_floater = gFloaterView->getParentFloater(panel);
LLFloaterAvatarPicker* picker =
- LLFloaterAvatarPicker::show(boost::bind(give_inventory, _1, _2), TRUE, FALSE);
+ LLFloaterAvatarPicker::show(boost::bind(give_inventory, _1, _2), TRUE, FALSE, FALSE, root_floater->getName());
if (!picker)
{
return;
@@ -751,6 +777,11 @@ void LLAvatarActions::shareWithAvatars()
picker->setOkBtnEnableCb(boost::bind(is_give_inventory_acceptable));
picker->openFriendsTab();
+
+ if (root_floater)
+ {
+ root_floater->addDependentFloater(picker);
+ }
LLNotificationsUtil::add("ShareNotification");
}
@@ -769,15 +800,15 @@ bool LLAvatarActions::canShareSelectedItems(LLInventoryPanel* inv_panel /* = NUL
// check selection in the panel
LLFolderView* root_folder = inv_panel->getRootFolder();
- const std::set<LLUUID> inventory_selected_uuids = root_folder->getSelectionList();
- if (inventory_selected_uuids.empty()) return false; // nothing selected
+ const std::set<LLFolderViewItem*> inventory_selected = root_folder->getSelectionList();
+ if (inventory_selected.empty()) return false; // nothing selected
bool can_share = true;
- std::set<LLUUID>::const_iterator it = inventory_selected_uuids.begin();
- const std::set<LLUUID>::const_iterator it_end = inventory_selected_uuids.end();
+ std::set<LLFolderViewItem*>::const_iterator it = inventory_selected.begin();
+ const std::set<LLFolderViewItem*>::const_iterator it_end = inventory_selected.end();
for (; it != it_end; ++it)
{
- LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
+ LLViewerInventoryCategory* inv_cat = gInventory.getCategory(static_cast<LLFolderViewModelItemInventory*>((*it)->getViewModelItem())->getUUID());
// any category can be offered.
if (inv_cat)
{
@@ -785,9 +816,9 @@ bool LLAvatarActions::canShareSelectedItems(LLInventoryPanel* inv_panel /* = NUL
}
// check if inventory item can be given
- LLFolderViewItem* item = root_folder->getItemByID(*it);
+ LLFolderViewItem* item = *it;
if (!item) return false;
- LLInvFVBridge* bridge = dynamic_cast<LLInvFVBridge*>(item->getListener());
+ LLInvFVBridge* bridge = dynamic_cast<LLInvFVBridge*>(item->getViewModelItem());
if (bridge && bridge->canShare())
{
continue;
@@ -820,6 +851,26 @@ void LLAvatarActions::toggleBlock(const LLUUID& id)
}
// static
+void LLAvatarActions::toggleMuteVoice(const LLUUID& id)
+{
+ std::string name;
+ gCacheName->getFullName(id, name); // needed for mute
+
+ LLMuteList* mute_list = LLMuteList::getInstance();
+ bool is_muted = mute_list->isMuted(id, LLMute::flagVoiceChat);
+
+ LLMute mute(id, name, LLMute::AGENT);
+ if (!is_muted)
+ {
+ mute_list->add(mute, LLMute::flagVoiceChat);
+ }
+ else
+ {
+ mute_list->remove(mute, LLMute::flagVoiceChat);
+ }
+}
+
+// static
bool LLAvatarActions::canOfferTeleport(const LLUUID& id)
{
// First use LLAvatarTracker::isBuddy()
@@ -865,6 +916,33 @@ void LLAvatarActions::inviteToGroup(const LLUUID& id)
}
}
+// static
+void LLAvatarActions::viewChatHistory(const LLUUID& id)
+{
+ const std::vector<LLConversation>& conversations = LLConversationLog::instance().getConversations();
+ std::vector<LLConversation>::const_iterator iter = conversations.begin();
+
+ for (; iter != conversations.end(); ++iter)
+ {
+ if (iter->getParticipantID() == id)
+ {
+ LLFloaterReg::showInstance("preview_conversation", iter->getSessionID(), true);
+ return;
+ }
+ }
+
+ if (LLLogChat::isTranscriptExist(id))
+ {
+ LLAvatarName avatar_name;
+ LLSD extended_id(id);
+
+ LLAvatarNameCache::get(id, &avatar_name);
+ extended_id[LL_FCP_COMPLETE_NAME] = avatar_name.getCompleteName();
+ extended_id[LL_FCP_ACCOUNT_NAME] = avatar_name.getAccountName();
+ LLFloaterReg::showInstance("preview_conversation", extended_id, true);
+ }
+}
+
//== private methods ========================================================================================
// static
@@ -907,7 +985,7 @@ bool LLAvatarActions::handlePay(const LLSD& notification, const LLSD& response,
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
{
- gAgent.clearBusy();
+ gAgent.setDoNotDisturb(false);
}
LLFloaterPayUtil::payDirectly(&give_money, avatar_id, /*is_group=*/false);
@@ -1015,7 +1093,6 @@ void LLAvatarActions::requestFriendship(const LLUUID& target_id, const std::stri
LLSD payload;
payload["from_id"] = target_id;
- payload["SUPPRESS_TOAST"] = true;
LLNotificationsUtil::add("FriendshipOffered", args, payload);
}
@@ -1034,6 +1111,12 @@ bool LLAvatarActions::isBlocked(const LLUUID& id)
}
// static
+bool LLAvatarActions::isVoiceMuted(const LLUUID& id)
+{
+ return LLMuteList::getInstance()->isMuted(id, LLMute::flagVoiceChat);
+}
+
+// static
bool LLAvatarActions::canBlock(const LLUUID& id)
{
std::string full_name;
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 748b7cb3d1..6e1198cd09 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -34,8 +34,10 @@
#include <string>
#include <vector>
+class LLAvatarName;
class LLInventoryPanel;
class LLFloater;
+class LLView;
/**
* Friend-related actions (add, remove, offer teleport, etc)
@@ -81,14 +83,14 @@ public:
static void startCall(const LLUUID& id);
/**
- * Start an ad-hoc conference voice call with multiple users
+ * Start an ad-hoc conference voice call with multiple users in a specific IM floater.
*/
- static void startAdhocCall(const uuid_vec_t& ids);
+ static void startAdhocCall(const uuid_vec_t& ids, const LLUUID& floater_id = LLUUID::null);
/**
- * Start conference chat with the given avatars.
+ * Start conference chat with the given avatars in a specific IM floater.
*/
- static void startConference(const uuid_vec_t& ids);
+ static void startConference(const uuid_vec_t& ids, const LLUUID& floater_id = LLUUID::null);
/**
* Show avatar profile.
@@ -116,7 +118,7 @@ public:
/**
* Share items with the picked avatars.
*/
- static void shareWithAvatars();
+ static void shareWithAvatars(LLView * panel);
/**
* Block/unblock the avatar.
@@ -124,6 +126,11 @@ public:
static void toggleBlock(const LLUUID& id);
/**
+ * Block/unblock the avatar voice.
+ */
+ static void toggleMuteVoice(const LLUUID& id);
+
+ /**
* Return true if avatar with "id" is a friend
*/
static bool isFriend(const LLUUID& id);
@@ -134,6 +141,11 @@ public:
static bool isBlocked(const LLUUID& id);
/**
+ * @return true if the avatar voice is blocked
+ */
+ static bool isVoiceMuted(const LLUUID& id);
+
+ /**
* @return true if you can block the avatar
*/
static bool canBlock(const LLUUID& id);
@@ -198,6 +210,27 @@ public:
*/
static bool canShareSelectedItems(LLInventoryPanel* inv_panel = NULL);
+ /**
+ * Builds a string of residents' display names separated by "words_separator" string.
+ *
+ * @param avatar_names - a vector of given avatar names from which resulting string is built
+ * @param residents_string - the resulting string
+ */
+ static void buildResidentsString(std::vector<LLAvatarName> avatar_names, std::string& residents_string);
+
+ /**
+ * Builds a string of residents' display names separated by "words_separator" string.
+ *
+ * @param avatar_uuids - a vector of given avatar uuids from which resulting string is built
+ * @param residents_string - the resulting string
+ */
+ static void buildResidentsString(const uuid_vec_t& avatar_uuids, std::string& residents_string);
+
+ /**
+ * Opens the chat history for avatar
+ */
+ static void viewChatHistory(const LLUUID& id);
+
static std::set<LLUUID> getInventorySelectedUUIDs();
private:
diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index b539ac38ed..714bde6f37 100755
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -28,6 +28,8 @@
#include "llavatariconctrl.h"
+#include <boost/signals2.hpp>
+
// viewer includes
#include "llagent.h"
#include "llavatarconstants.h"
@@ -36,7 +38,7 @@
#include "llmenugl.h"
#include "lluictrlfactory.h"
#include "llagentdata.h"
-#include "llimfloater.h"
+#include "llfloaterimsession.h"
// library includes
#include "llavatarnamecache.h"
@@ -148,9 +150,13 @@ LLAvatarIconCtrl::Params::Params()
LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)
-: LLIconCtrl(p),
+ : LLIconCtrl(p),
+ LLAvatarPropertiesObserver(),
+ mAvatarId(),
+ mFullName(),
mDrawTooltip(p.draw_tooltip),
- mDefaultIconName(p.default_icon_name)
+ mDefaultIconName(p.default_icon_name),
+ mAvatarNameCacheConnection()
{
mPriority = LLViewerFetchedTexture::BOOST_ICON;
@@ -203,6 +209,11 @@ LLAvatarIconCtrl::~LLAvatarIconCtrl()
LLAvatarPropertiesProcessor::getInstance()->removeObserver(mAvatarId, this);
// Name callbacks will be automatically disconnected since LLUICtrl is trackable
}
+
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
}
//virtual
@@ -245,9 +256,19 @@ void LLAvatarIconCtrl::setValue(const LLSD& value)
LLIconCtrl::setValue(value);
}
- LLAvatarNameCache::get(mAvatarId,
- boost::bind(&LLAvatarIconCtrl::onAvatarNameCache,
- this, _1, _2));
+ fetchAvatarName();
+}
+
+void LLAvatarIconCtrl::fetchAvatarName()
+{
+ if (mAvatarId.notNull())
+ {
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+ mAvatarNameCacheConnection = LLAvatarNameCache::get(mAvatarId, boost::bind(&LLAvatarIconCtrl::onAvatarNameCache, this, _1, _2));
+ }
}
bool LLAvatarIconCtrl::updateFromCache()
@@ -292,11 +313,13 @@ void LLAvatarIconCtrl::processProperties(void* data, EAvatarProcessorType type)
void LLAvatarIconCtrl::onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name)
{
+ mAvatarNameCacheConnection.disconnect();
+
if (agent_id == mAvatarId)
{
// Most avatar icon controls are next to a UI element that shows
// a display name, so only show username.
- mFullName = av_name.mUsername;
+ mFullName = av_name.getUserName();
if (mDrawTooltip)
{
diff --git a/indra/newview/llavatariconctrl.h b/indra/newview/llavatariconctrl.h
index 7f568fc5b8..4929efb7d0 100644
--- a/indra/newview/llavatariconctrl.h
+++ b/indra/newview/llavatariconctrl.h
@@ -27,7 +27,9 @@
#ifndef LL_LLAVATARICONCTRL_H
#define LL_LLAVATARICONCTRL_H
-#include "lliconctrl.h"
+#include <boost/signals2.hpp>
+
+#include "../llui/lliconctrl.h"
#include "llavatarpropertiesprocessor.h"
#include "llviewermenu.h"
@@ -86,20 +88,24 @@ public:
// LLAvatarPropertiesProcessor observer trigger
virtual void processProperties(void* data, EAvatarProcessorType type);
- void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
-
const LLUUID& getAvatarId() const { return mAvatarId; }
const std::string& getFullName() const { return mFullName; }
void setDrawTooltip(bool value) { mDrawTooltip = value;}
protected:
- LLUUID mAvatarId;
- std::string mFullName;
- bool mDrawTooltip;
- std::string mDefaultIconName;
+ LLUUID mAvatarId;
+ std::string mFullName;
+ bool mDrawTooltip;
+ std::string mDefaultIconName;
bool updateFromCache();
+
+private:
+ void fetchAvatarName();
+ void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
+
+ boost::signals2::connection mAvatarNameCacheConnection;
};
#endif // LL_LLAVATARICONCTRL_H
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index 771419f60a..9f02f301a1 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -46,6 +46,7 @@
#include "lluuid.h"
#include "llvoiceclient.h"
#include "llviewercontrol.h" // for gSavedSettings
+#include "lltooldraganddrop.h"
static LLDefaultChildRegistry::Register<LLAvatarList> r("avatar_list");
@@ -278,7 +279,7 @@ void LLAvatarList::refresh()
LLAvatarName av_name;
have_names &= LLAvatarNameCache::get(buddy_id, &av_name);
- if (!have_filter || findInsensitive(av_name.mDisplayName, mNameFilter))
+ if (!have_filter || findInsensitive(av_name.getDisplayName(), mNameFilter))
{
if (nadded >= ADD_LIMIT)
{
@@ -296,8 +297,9 @@ void LLAvatarList::refresh()
}
else
{
+ std::string display_name = av_name.getDisplayName();
addNewItem(buddy_id,
- av_name.mDisplayName.empty() ? waiting_str : av_name.mDisplayName,
+ display_name.empty() ? waiting_str : display_name,
LLAvatarTracker::instance().isBuddyOnline(buddy_id));
}
@@ -325,7 +327,7 @@ void LLAvatarList::refresh()
const LLUUID& buddy_id = it->asUUID();
LLAvatarName av_name;
have_names &= LLAvatarNameCache::get(buddy_id, &av_name);
- if (!findInsensitive(av_name.mDisplayName, mNameFilter))
+ if (!findInsensitive(av_name.getDisplayName(), mNameFilter))
{
removeItemByUUID(buddy_id);
modified = true;
@@ -398,7 +400,7 @@ bool LLAvatarList::filterHasMatches()
// 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(av_name.mDisplayName, mNameFilter))
+ if (have_name && !findInsensitive(av_name.getDisplayName(), mNameFilter))
{
continue;
}
@@ -461,6 +463,57 @@ BOOL LLAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask)
return handled;
}
+BOOL LLAvatarList::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ gFocusMgr.setMouseCapture(this);
+
+ S32 screen_x;
+ S32 screen_y;
+ localPointToScreen(x, y, &screen_x, &screen_y);
+ LLToolDragAndDrop::getInstance()->setDragStart(screen_x, screen_y);
+
+ return LLFlatListViewEx::handleMouseDown(x, y, mask);
+}
+
+BOOL LLAvatarList::handleMouseUp( S32 x, S32 y, MASK mask )
+{
+ if(hasMouseCapture())
+ {
+ gFocusMgr.setMouseCapture(NULL);
+ }
+
+ return LLFlatListViewEx::handleMouseUp(x, y, mask);
+}
+
+BOOL LLAvatarList::handleHover(S32 x, S32 y, MASK mask)
+{
+ bool handled = hasMouseCapture();
+ if(handled)
+ {
+ S32 screen_x;
+ S32 screen_y;
+ localPointToScreen(x, y, &screen_x, &screen_y);
+
+ if(LLToolDragAndDrop::getInstance()->isOverThreshold(screen_x, screen_y))
+ {
+ // First, create the global drag and drop object
+ std::vector<EDragAndDropType> types;
+ uuid_vec_t cargo_ids;
+ getSelectedUUIDs(cargo_ids);
+ types.resize(cargo_ids.size(), DAD_PERSON);
+ LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_PEOPLE;
+ LLToolDragAndDrop::getInstance()->beginMultiDrag(types, cargo_ids, src);
+ }
+ }
+
+ if(!handled)
+ {
+ handled = LLFlatListViewEx::handleHover(x, y, mask);
+ }
+
+ return handled;
+}
+
bool LLAvatarList::isAvalineItemSelected()
{
std::vector<LLPanel*> selected_items;
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index 4814a88a79..3542577ae3 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -84,6 +84,9 @@ public:
bool getIconsVisible() const { return mShowIcons; }
const std::string getIconParamName() const{return mIconParamName;}
virtual BOOL handleRightMouseDown(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);
// Return true if filter has at least one match.
bool filterHasMatches();
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 30eecfe323..3e6c817dd6 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -27,6 +27,8 @@
#include "llviewerprecompiledheaders.h"
+#include <boost/signals2.hpp>
+
#include "llavataractions.h"
#include "llavatarlistitem.h"
@@ -38,6 +40,7 @@
#include "llavatarnamecache.h"
#include "llavatariconctrl.h"
#include "lloutputmonitorctrl.h"
+#include "lltooldraganddrop.h"
bool LLAvatarListItem::sStaticInitialized = false;
S32 LLAvatarListItem::sLeftPadding = 0;
@@ -58,7 +61,8 @@ LLAvatarListItem::Params::Params()
LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/)
-: LLPanel(),
+ : LLPanel(),
+ LLFriendObserver(),
mAvatarIcon(NULL),
mAvatarName(NULL),
mLastInteractionTime(NULL),
@@ -73,7 +77,8 @@ LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/)
mShowInfoBtn(true),
mShowProfileBtn(true),
mShowPermissions(false),
- mHovered(false)
+ mHovered(false),
+ mAvatarNameCacheConnection()
{
if (not_from_ui_factory)
{
@@ -86,7 +91,14 @@ LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/)
LLAvatarListItem::~LLAvatarListItem()
{
if (mAvatarId.notNull())
+ {
LLAvatarTracker::instance().removeParticularFriendObserver(mAvatarId, this);
+ }
+
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
}
BOOL LLAvatarListItem::postBuild()
@@ -129,6 +141,29 @@ BOOL LLAvatarListItem::postBuild()
return TRUE;
}
+void LLAvatarListItem::handleVisibilityChange ( BOOL new_visibility )
+{
+ //Adjust positions of icons (info button etc) when
+ //speaking indicator visibility was changed/toggled while panel was closed (not visible)
+ if(new_visibility && mSpeakingIndicator->getIndicatorToggled())
+ {
+ updateChildren();
+ mSpeakingIndicator->setIndicatorToggled(false);
+ }
+}
+
+void LLAvatarListItem::fetchAvatarName()
+{
+ if (mAvatarId.notNull())
+ {
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+ mAvatarNameCacheConnection = LLAvatarNameCache::get(getAvatarId(), boost::bind(&LLAvatarListItem::onAvatarNameCache, this, _2));
+ }
+}
+
S32 LLAvatarListItem::notifyParent(const LLSD& info)
{
if (info.has("visibility_changed"))
@@ -259,8 +294,7 @@ void LLAvatarListItem::setAvatarId(const LLUUID& id, const LLUUID& session_id, b
mAvatarIcon->setValue(id);
// Set avatar name.
- LLAvatarNameCache::get(id,
- boost::bind(&LLAvatarListItem::onAvatarNameCache, this, _2));
+ fetchAvatarName();
}
}
@@ -358,8 +392,7 @@ std::string LLAvatarListItem::getAvatarToolTip() const
void LLAvatarListItem::updateAvatarName()
{
- LLAvatarNameCache::get(getAvatarId(),
- boost::bind(&LLAvatarListItem::onAvatarNameCache, this, _2));
+ fetchAvatarName();
}
//== PRIVATE SECITON ==========================================================
@@ -371,8 +404,10 @@ void LLAvatarListItem::setNameInternal(const std::string& name, const std::strin
void LLAvatarListItem::onAvatarNameCache(const LLAvatarName& av_name)
{
- setAvatarName(av_name.mDisplayName);
- setAvatarToolTip(av_name.mUsername);
+ mAvatarNameCacheConnection.disconnect();
+
+ setAvatarName(av_name.getDisplayName());
+ setAvatarToolTip(av_name.getUserName());
//requesting the list to resort
notifyParent(LLSD().with("sort", LLSD()));
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index c95ac39696..7ef35a746e 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -27,6 +27,8 @@
#ifndef LL_LLAVATARLISTITEM_H
#define LL_LLAVATARLISTITEM_H
+#include <boost/signals2.hpp>
+
#include "llpanel.h"
#include "lloutputmonitorctrl.h"
#include "llbutton.h"
@@ -82,6 +84,7 @@ public:
/**
* Processes notification from speaker indicator to update children when indicator's visibility is changed.
*/
+ virtual void handleVisibilityChange ( BOOL new_visibility );
virtual S32 notifyParent(const LLSD& info);
virtual void onMouseLeave(S32 x, S32 y, MASK mask);
virtual void onMouseEnter(S32 x, S32 y, MASK mask);
@@ -214,6 +217,9 @@ private:
/// true when the mouse pointer is hovering over this item
bool mHovered;
+
+ void fetchAvatarName();
+ boost::signals2::connection mAvatarNameCacheConnection;
static bool sStaticInitialized; // this variable is introduced to improve code readability
static S32 sLeftPadding; // padding to first left visible child (icon or name)
diff --git a/indra/newview/llblockedlistitem.cpp b/indra/newview/llblockedlistitem.cpp
new file mode 100644
index 0000000000..d9afd2b629
--- /dev/null
+++ b/indra/newview/llblockedlistitem.cpp
@@ -0,0 +1,114 @@
+/**
+ * @file llviewerobjectlistitem.cpp
+ * @brief viewer object list item implementation
+ *
+ * Class LLPanelInventoryListItemBase displays inventory item as an element
+ * of LLInventoryItemsList.
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llblockedlistitem.h"
+
+// llui
+#include "lliconctrl.h"
+#include "lltextbox.h"
+#include "lltextutil.h"
+
+// newview
+#include "llavatariconctrl.h"
+#include "llgroupiconctrl.h"
+#include "llinventoryicon.h"
+#include "llviewerobject.h"
+
+LLBlockedListItem::LLBlockedListItem(const LLMute* item)
+: LLPanel(),
+ mItemID(item->mID),
+ mItemName(item->mName),
+ mMuteType(item->mType)
+{
+ buildFromFile("panel_blocked_list_item.xml");
+}
+
+BOOL LLBlockedListItem::postBuild()
+{
+ mTitleCtrl = getChild<LLTextBox>("item_name");
+ mTitleCtrl->setValue(mItemName);
+
+ switch (mMuteType)
+ {
+ case LLMute::AGENT:
+ case LLMute::EXTERNAL:
+ {
+ LLAvatarIconCtrl* avatar_icon = getChild<LLAvatarIconCtrl>("avatar_icon");
+ avatar_icon->setVisible(TRUE);
+ avatar_icon->setValue(mItemID);
+ }
+ break;
+ case LLMute::GROUP:
+ {
+ LLGroupIconCtrl* group_icon = getChild<LLGroupIconCtrl>("group_icon");
+ group_icon->setVisible(TRUE);
+ group_icon->setValue(mItemID);
+ }
+ break;
+ case LLMute::OBJECT:
+ case LLMute::BY_NAME:
+ getChild<LLUICtrl>("object_icon")->setVisible(TRUE);
+ break;
+
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+void LLBlockedListItem::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ getChildView("hovered_icon")->setVisible(true);
+ LLPanel::onMouseEnter(x, y, mask);
+}
+
+void LLBlockedListItem::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ getChildView("hovered_icon")->setVisible(false);
+ LLPanel::onMouseLeave(x, y, mask);
+}
+
+void LLBlockedListItem::setValue(const LLSD& value)
+{
+ if (!value.isMap() || !value.has("selected"))
+ {
+ return;
+ }
+
+ getChildView("selected_icon")->setVisible(value["selected"]);
+}
+
+void LLBlockedListItem::highlightName(const std::string& highlited_text)
+{
+ LLStyle::Params params;
+ LLTextUtil::textboxSetHighlightedVal(mTitleCtrl, params, mItemName, highlited_text);
+}
diff --git a/indra/newview/llblockedlistitem.h b/indra/newview/llblockedlistitem.h
new file mode 100644
index 0000000000..05409e8a3b
--- /dev/null
+++ b/indra/newview/llblockedlistitem.h
@@ -0,0 +1,73 @@
+/**
+ * @file llviewerobjectlistitem.h
+ * @brief viewer object list item header file
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+#ifndef LLVIEWEROBJECTLISTITEM_H_
+#define LLVIEWEROBJECTLISTITEM_H_
+
+#include "llmutelist.h"
+#include "llpanel.h"
+#include "llstyle.h"
+#include "lltextbox.h"
+#include "lliconctrl.h"
+
+/**
+ * This class represents items of LLBlockList, which represents
+ * contents of LLMuteList. LLMuteList "consists" of LLMute items.
+ * Each LLMute represents either blocked avatar or object and
+ * stores info about mute type (avatar or object)
+ *
+ * Each item consists if object/avatar icon and object/avatar name
+ *
+ * To create a blocked list item just need to pass LLMute pointer
+ * and appropriate block list item will be created depending on
+ * LLMute type (LLMute::EType) and other LLMute's info
+ */
+class LLBlockedListItem : public LLPanel
+{
+public:
+
+ LLBlockedListItem(const LLMute* item);
+ virtual BOOL postBuild();
+
+ void onMouseEnter(S32 x, S32 y, MASK mask);
+ void onMouseLeave(S32 x, S32 y, MASK mask);
+
+ virtual void setValue(const LLSD& value);
+
+ void highlightName(const std::string& highlited_text);
+ const std::string& getName() const { return mItemName; }
+ const LLMute::EType& getType() const { return mMuteType; }
+ const LLUUID& getUUID() const { return mItemID; }
+
+private:
+
+ LLTextBox* mTitleCtrl;
+ const LLUUID mItemID;
+ std::string mItemName;
+ LLMute::EType mMuteType;
+
+};
+
+#endif /* LLVIEWEROBJECTLISTITEM_H_ */
diff --git a/indra/newview/llblocklist.cpp b/indra/newview/llblocklist.cpp
new file mode 100644
index 0000000000..066cb71677
--- /dev/null
+++ b/indra/newview/llblocklist.cpp
@@ -0,0 +1,284 @@
+/**
+ * @file llblocklist.cpp
+ * @brief List of the blocked avatars and objects.
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llblocklist.h"
+
+#include "llavataractions.h"
+#include "llblockedlistitem.h"
+#include "llfloatersidepanelcontainer.h"
+#include "llviewermenu.h"
+
+static LLDefaultChildRegistry::Register<LLBlockList> r("block_list");
+
+static const LLBlockListNameComparator NAME_COMPARATOR;
+static const LLBlockListNameTypeComparator NAME_TYPE_COMPARATOR;
+
+LLBlockList::LLBlockList(const Params& p)
+: LLFlatListViewEx(p),
+ mSelectedItem(NULL),
+ mDirty(true)
+{
+
+ LLMuteList::getInstance()->addObserver(this);
+
+ // Set up context menu.
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+
+ registrar.add ("Block.Action", boost::bind(&LLBlockList::onCustomAction, this, _2));
+ enable_registrar.add("Block.Enable", boost::bind(&LLBlockList::isActionEnabled, this, _2));
+
+ LLToggleableMenu* context_menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>(
+ "menu_people_blocked_gear.xml",
+ gMenuHolder,
+ LLViewerMenuHolderGL::child_registry_t::instance());
+ if(context_menu)
+ {
+ mContextMenu = context_menu->getHandle();
+ }
+}
+
+LLBlockList::~LLBlockList()
+{
+ if (mContextMenu.get())
+ {
+ mContextMenu.get()->die();
+ }
+
+ LLMuteList::getInstance()->removeObserver(this);
+}
+
+BOOL LLBlockList::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask);
+
+ LLToggleableMenu* context_menu = mContextMenu.get();
+ if (context_menu && size())
+ {
+ context_menu->buildDrawLabels();
+ context_menu->updateParent(LLMenuGL::sMenuContainer);
+ LLMenuGL::showPopup(this, context_menu, x, y);
+ }
+
+ return handled;
+}
+
+void LLBlockList::setNameFilter(const std::string& filter)
+{
+ std::string filter_upper = filter;
+ LLStringUtil::toUpper(filter_upper);
+ if (mNameFilter != filter_upper)
+ {
+ mNameFilter = filter_upper;
+ setDirty();
+ }
+}
+
+void LLBlockList::sortByName()
+{
+ setComparator(&NAME_COMPARATOR);
+ sort();
+}
+
+void LLBlockList::sortByType()
+{
+ setComparator(&NAME_TYPE_COMPARATOR);
+ sort();
+}
+
+void LLBlockList::draw()
+{
+ if (mDirty)
+ {
+ refresh();
+ }
+
+ LLFlatListView::draw();
+}
+
+void LLBlockList::addNewItem(const LLMute* mute)
+{
+ LLBlockedListItem* item = new LLBlockedListItem(mute);
+ if (!mNameFilter.empty())
+ {
+ item->highlightName(mNameFilter);
+ }
+ addItem(item, item->getUUID(), ADD_BOTTOM);
+}
+
+void LLBlockList::refresh()
+{
+ bool have_filter = !mNameFilter.empty();
+
+ // save selection to restore it after list rebuilt
+ LLUUID selected = getSelectedUUID();
+
+ // calling refresh may be initiated by removing currently selected item
+ // so select next item and save the selection to restore it after list rebuilt
+ if (!selectNextItemPair(false, true))
+ {
+ selectNextItemPair(true, true);
+ }
+ LLUUID next_selected = getSelectedUUID();
+
+ clear();
+
+ std::vector<LLMute> mutes = LLMuteList::instance().getMutes();
+ std::vector<LLMute>::const_iterator mute_it = mutes.begin();
+
+ for (; mute_it != mutes.end(); ++mute_it)
+ {
+ if (have_filter && !findInsensitive(mute_it->mName, mNameFilter))
+ continue;
+
+ addNewItem(&*mute_it);
+ }
+
+ if (getItemPair(selected))
+ {
+ // restore previously selected item
+ selectItemPair(getItemPair(selected), true);
+ }
+ else if (getItemPair(next_selected))
+ {
+ // previously selected item was removed, so select next item
+ selectItemPair(getItemPair(next_selected), true);
+ }
+
+ // Sort the list.
+ sort();
+
+ setDirty(false);
+}
+
+bool LLBlockList::findInsensitive(std::string haystack, const std::string& needle_upper)
+{
+ LLStringUtil::toUpper(haystack);
+ return haystack.find(needle_upper) != std::string::npos;
+}
+
+LLBlockedListItem* LLBlockList::getBlockedItem() const
+{
+ LLPanel* panel = LLFlatListView::getSelectedItem();
+ LLBlockedListItem* item = dynamic_cast<LLBlockedListItem*>(panel);
+ return item;
+}
+
+bool LLBlockList::isActionEnabled(const LLSD& userdata)
+{
+ bool action_enabled = true;
+
+ const std::string command_name = userdata.asString();
+
+ if ("profile_item" == command_name)
+ {
+ LLBlockedListItem* item = getBlockedItem();
+ action_enabled = item && (LLMute::AGENT == item->getType());
+ }
+
+ if ("unblock_item" == command_name)
+ {
+ action_enabled = getSelectedItem() != NULL;
+ }
+
+ return action_enabled;
+}
+
+void LLBlockList::onCustomAction(const LLSD& userdata)
+{
+ if (!isActionEnabled(userdata))
+ {
+ return;
+ }
+
+ LLBlockedListItem* item = getBlockedItem();
+ const std::string command_name = userdata.asString();
+
+ if ("unblock_item" == command_name)
+ {
+ LLMute mute(item->getUUID(), item->getName());
+ LLMuteList::getInstance()->remove(mute);
+ }
+ else if ("profile_item" == command_name)
+ {
+ switch(item->getType())
+ {
+
+ case LLMute::AGENT:
+ LLAvatarActions::showProfile(item->getUUID());
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+bool LLBlockListItemComparator::compare(const LLPanel* item1, const LLPanel* item2) const
+{
+ const LLBlockedListItem* blocked_item1 = dynamic_cast<const LLBlockedListItem*>(item1);
+ const LLBlockedListItem* blocked_item2 = dynamic_cast<const LLBlockedListItem*>(item2);
+
+ if (!blocked_item1 || !blocked_item2)
+ {
+ llerror("blocked_item1 and blocked_item2 cannot be null", 0);
+ return true;
+ }
+
+ return doCompare(blocked_item1, blocked_item2);
+}
+
+bool LLBlockListNameComparator::doCompare(const LLBlockedListItem* blocked_item1, const LLBlockedListItem* blocked_item2) const
+{
+ std::string name1 = blocked_item1->getName();
+ std::string name2 = blocked_item2->getName();
+
+ LLStringUtil::toUpper(name1);
+ LLStringUtil::toUpper(name2);
+
+ return name1 < name2;
+}
+
+bool LLBlockListNameTypeComparator::doCompare(const LLBlockedListItem* blocked_item1, const LLBlockedListItem* blocked_item2) const
+{
+ LLMute::EType type1 = blocked_item1->getType();
+ LLMute::EType type2 = blocked_item2->getType();
+
+ // if mute type is LLMute::BY_NAME or LLMute::OBJECT it means that this mute is an object
+ bool both_mutes_are_objects = (LLMute::OBJECT == type1 || LLMute::BY_NAME == type1) && (LLMute::OBJECT == type2 || LLMute::BY_NAME == type2);
+
+ // mute types may be different, but since both LLMute::BY_NAME and LLMute::OBJECT types represent objects
+ // it's needed to perform additional checking of both_mutes_are_objects variable
+ if (type1 != type2 && !both_mutes_are_objects)
+ {
+ // objects in block list go first, so return true if mute type is not an avatar
+ return LLMute::AGENT != type1;
+ }
+
+ return NAME_COMPARATOR.compare(blocked_item1, blocked_item2);
+}
diff --git a/indra/newview/llblocklist.h b/indra/newview/llblocklist.h
new file mode 100644
index 0000000000..1a215710f4
--- /dev/null
+++ b/indra/newview/llblocklist.h
@@ -0,0 +1,138 @@
+/**
+ * @file llblocklist.h
+ * @brief List of the blocked avatars and objects.
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+#ifndef LLBLOCKLIST_H_
+#define LLBLOCKLIST_H_
+
+#include "llflatlistview.h"
+#include "lllistcontextmenu.h"
+#include "llmutelist.h"
+#include "lltoggleablemenu.h"
+
+class LLBlockedListItem;
+class LLMute;
+
+/**
+ * List of blocked avatars and objects.
+ * This list represents contents of the LLMuteList.
+ * Each change in LLMuteList leads to rebuilding this list, so
+ * it's always in actual state.
+ */
+class LLBlockList: public LLFlatListViewEx, public LLMuteListObserver
+{
+ LOG_CLASS(LLBlockList);
+public:
+ struct Params : public LLInitParam::Block<Params, LLFlatListViewEx::Params>
+ {
+ Params(){};
+ };
+
+ LLBlockList(const Params& p);
+ virtual ~LLBlockList();
+
+ virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+ LLToggleableMenu* getContextMenu() const { return mContextMenu.get(); }
+ LLBlockedListItem* getBlockedItem() const;
+
+ virtual void onChange() { refresh(); }
+ virtual void draw();
+
+ void setNameFilter(const std::string& filter);
+ void sortByName();
+ void sortByType();
+ void refresh();
+
+private:
+
+ void addNewItem(const LLMute* mute);
+ void setDirty(bool dirty = true) { mDirty = dirty; }
+ bool findInsensitive(std::string haystack, const std::string& needle_upper);
+
+ bool isActionEnabled(const LLSD& userdata);
+ void onCustomAction (const LLSD& userdata);
+
+
+ LLHandle<LLToggleableMenu> mContextMenu;
+
+ LLBlockedListItem* mSelectedItem;
+ std::string mNameFilter;
+ bool mDirty;
+
+};
+
+
+/*
+ * Abstract comparator for blocked items
+ */
+class LLBlockListItemComparator : public LLFlatListView::ItemComparator
+{
+ LOG_CLASS(LLBlockListItemComparator);
+
+public:
+ LLBlockListItemComparator() {};
+ virtual ~LLBlockListItemComparator() {};
+
+ virtual bool compare(const LLPanel* item1, const LLPanel* item2) const;
+
+protected:
+
+ virtual bool doCompare(const LLBlockedListItem* blocked_item1, const LLBlockedListItem* blocked_item2) const = 0;
+};
+
+
+/*
+ * Compares items by name
+ */
+class LLBlockListNameComparator : public LLBlockListItemComparator
+{
+ LOG_CLASS(LLBlockListNameComparator);
+
+public:
+ LLBlockListNameComparator() {};
+ virtual ~LLBlockListNameComparator() {};
+
+protected:
+
+ virtual bool doCompare(const LLBlockedListItem* blocked_item1, const LLBlockedListItem* blocked_item2) const;
+};
+
+/*
+ * Compares items by type and then by name within type
+ * Objects come first then avatars
+ */
+class LLBlockListNameTypeComparator : public LLBlockListItemComparator
+{
+ LOG_CLASS(LLBlockListNameTypeComparator);
+
+public:
+ LLBlockListNameTypeComparator() {};
+ virtual ~LLBlockListNameTypeComparator() {};
+
+protected:
+
+ virtual bool doCompare(const LLBlockedListItem* blocked_item1, const LLBlockedListItem* blocked_item2) const;
+};
+
+#endif /* LLBLOCKLIST_H_ */
diff --git a/indra/newview/llbrowsernotification.cpp b/indra/newview/llbrowsernotification.cpp
index 6e77d1e336..19747757db 100644
--- a/indra/newview/llbrowsernotification.cpp
+++ b/indra/newview/llbrowsernotification.cpp
@@ -35,11 +35,13 @@
using namespace LLNotificationsUI;
-bool LLBrowserNotification::processNotification(const LLSD& notify)
+LLBrowserNotification::LLBrowserNotification()
+ : LLSystemNotificationHandler("Browser", "browser")
{
- LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());
- if (!notification) return false;
+}
+bool LLBrowserNotification::processNotification(const LLNotificationPtr& notification)
+{
LLUUID media_id = notification->getPayload()["media_id"].asUUID();
LLMediaCtrl* media_instance = LLMediaCtrl::getInstance(media_id);
if (media_instance)
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
deleted file mode 100644
index f2375bfa4f..0000000000
--- a/indra/newview/llcallfloater.cpp
+++ /dev/null
@@ -1,821 +0,0 @@
-/**
- * @file llcallfloater.cpp
- * @author Mike Antipov
- * @brief Voice Control Panel in a Voice Chats (P2P, Group, Nearby...).
- *
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llcallfloater.h"
-
-#include "llnotificationsutil.h"
-#include "lltrans.h"
-
-#include "llagent.h"
-#include "llagentdata.h" // for gAgentID
-#include "llavatarnamecache.h"
-#include "llavatariconctrl.h"
-#include "llavatarlist.h"
-#include "lldraghandle.h"
-#include "llimfloater.h"
-#include "llimview.h"
-#include "llfloaterreg.h"
-#include "llparticipantlist.h"
-#include "llspeakers.h"
-#include "lltextutil.h"
-#include "lltransientfloatermgr.h"
-#include "llviewercontrol.h"
-#include "llviewerdisplayname.h"
-#include "llviewerwindow.h"
-#include "llvoicechannel.h"
-#include "llviewerparcelmgr.h"
-#include "llfirstuse.h"
-
-static void get_voice_participants_uuids(uuid_vec_t& 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::setAvatarName(formatted_phone);
- LLAvatarListItem::setAvatarToolTip(formatted_phone);
- }
-
- void setSpeakerId(const LLUUID& id) { mSpeakingIndicator->setSpeakerId(id); }
-};
-
-
-static void* create_non_avatar_caller(void*)
-{
- return new LLNonAvatarCaller;
-}
-
-LLVoiceChannel* LLCallFloater::sCurrentVoiceChannel = 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::instance().addObserver(this);
- LLTransientFloaterMgr::getInstance()->addControlView(this);
-
- // update the agent's name if display name setting change
- LLAvatarNameCache::addUseDisplayNamesCallback(boost::bind(&LLCallFloater::updateAgentModeratorState, this));
- LLViewerDisplayName::addNameChangedCallback(boost::bind(&LLCallFloater::updateAgentModeratorState, this));
-
-}
-
-LLCallFloater::~LLCallFloater()
-{
- resetVoiceRemoveTimers();
- delete mSpeakerDelayRemover;
-
- delete mParticipants;
- mParticipants = NULL;
-
- mAvatarListRefreshConnection.disconnect();
- mVoiceChannelStateChangeConnection.disconnect();
-
- if(LLVoiceClient::instanceExists())
- {
- LLVoiceClient::getInstance()->removeObserver(this);
- }
- LLTransientFloaterMgr::getInstance()->removeControlView(this);
-}
-
-// virtual
-BOOL LLCallFloater::postBuild()
-{
- mAvatarList = getChild<LLAvatarList>("speakers_list");
- mAvatarListRefreshConnection = mAvatarList->setRefreshCompleteCallback(boost::bind(&LLCallFloater::onAvatarListRefreshed, this));
-
- childSetAction("leave_call_btn", boost::bind(&LLCallFloater::leaveCall, this));
-
- mNonAvatarCaller = findChild<LLNonAvatarCaller>("non_avatar_caller");
- mNonAvatarCaller->setVisible(FALSE);
-
- initAgentData();
-
- connectToChannel(LLVoiceChannel::getCurrentVoiceChannel());
-
- updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730)
-
- updateSession();
- return TRUE;
-}
-
-// virtual
-void LLCallFloater::onOpen(const LLSD& /*key*/)
-{
- LLFirstUse::speak(false);
-}
-
-// 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 = LLVoiceClient::getInstance()->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->update();
-
- LLFloater::draw();
-}
-
-// virtual
-void LLCallFloater::setFocus( BOOL b )
-{
- LLFloater::setFocus(b);
-
- // Force using active floater transparency (STORM-730).
- // We have to override setFocus() for LLCallFloater because selecting an item
- // of the voice morphing combobox causes the floater to lose focus and thus become transparent.
- updateTransparency(TT_ACTIVE);
-}
-
-// virtual
-void LLCallFloater::onParticipantsChanged()
-{
- if (NULL == mParticipants) return;
- updateParticipantsVoiceState();
-
- // Add newly joined participants.
- uuid_vec_t speakers_uuids;
- get_voice_participants_uuids(speakers_uuids);
- for (uuid_vec_t::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)
- {
- gIMMgr->endCall(voice_channel->getSessionID());
- }
-}
-
-void LLCallFloater::updateSession()
-{
- LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel();
- if (voice_channel)
- {
- LL_DEBUGS("Voice") << "Current voice channel: " << voice_channel->getSessionID() << LL_ENDL;
-
- if (mSpeakerManager && voice_channel->getSessionID() == mSpeakerManager->getSessionID())
- {
- LL_DEBUGS("Voice") << "Speaker manager is already set for session: " << voice_channel->getSessionID() << LL_ENDL;
- return;
- }
- else
- {
- mSpeakerManager = NULL;
- }
- }
-
- const LLUUID& session_id = voice_channel ? voice_channel->getSessionID() : LLUUID::null;
-
- 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 show nearby chat participants
- mSpeakerManager = LLLocalSpeakerMgr::getInstance();
- LL_DEBUGS("Voice") << "Set DEFAULT speaker manager" << LL_ENDL;
- mVoiceType = VC_LOCAL_CHAT;
- }
-
- updateTitle();
-
- // Hide "Leave Call" button for nearby chat
- bool is_local_chat = mVoiceType == VC_LOCAL_CHAT;
- getChildView("leave_call_btn_panel")->setVisible( !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)
- {
- llassert(mParticipants == NULL); // check for possible memory leak
- mParticipants = new LLParticipantList(mSpeakerManager, mAvatarList, true, mVoiceType != VC_GROUP_CHAT && mVoiceType != VC_AD_HOC_CHAT, false);
- mParticipants->setValidateSpeakerCallback(boost::bind(&LLCallFloater::validateSpeaker, this, _1));
- const U32 speaker_sort_order = gSavedSettings.getU32("SpeakerParticipantDefaultOrder");
- mParticipants->setSortOrder(LLParticipantList::EParticipantSortOrder(speaker_sort_order));
-
- 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 == sCurrentVoiceChannel) return;
-
- LLCallFloater* call_floater = LLFloaterReg::getTypedInstance<LLCallFloater>("voice_controls");
-
- call_floater->connectToChannel(channel);
-}
-
-void LLCallFloater::onAvatarNameCache(const LLUUID& agent_id,
- const LLAvatarName& av_name)
-{
- LLStringUtil::format_map_t args;
- args["[NAME]"] = av_name.getCompleteName();
- std::string title = getString("title_peer_2_peer", args);
- setTitle(title);
-}
-
-void LLCallFloater::updateTitle()
-{
- LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel();
- if (mVoiceType == VC_PEER_TO_PEER)
- {
- LLUUID session_id = voice_channel->getSessionID();
- LLIMModel::LLIMSession* im_session =
- LLIMModel::getInstance()->findIMSession(session_id);
- if (im_session)
- {
- LLAvatarNameCache::get(im_session->mOtherParticipantID,
- boost::bind(&LLCallFloater::onAvatarNameCache,
- this, _1, _2));
- return;
- }
- }
- 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->getChild<LLUICtrl>("user_icon")->setValue(gAgentID);
-
- // Just use display name, because it's you
- LLAvatarName av_name;
- LLAvatarNameCache::get( gAgentID, &av_name );
- mAgentPanel->getChild<LLUICtrl>("user_text")->setValue(av_name.mDisplayName);
-
- 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::onModeratorNameCache(const LLAvatarName& av_name)
-{
- std::string name;
- name = av_name.mDisplayName;
-
- if(mSpeakerManager && gAgent.isInGroup(mSpeakerManager->getSessionID()))
- {
- // This method can be called when LLVoiceChannel.mState == STATE_NO_CHANNEL_INFO
- // in this case there are not 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->getChild<LLUICtrl>("user_text")->setValue(name);
-}
-
-void LLCallFloater::updateAgentModeratorState()
-{
- LLAvatarNameCache::get(gAgentID, boost::bind(&LLCallFloater::onModeratorNameCache, this, _2));
-}
-
-static void get_voice_participants_uuids(uuid_vec_t& speakers_uuids)
-{
- // Get a list of participants from VoiceClient
- std::set<LLUUID> participants;
- LLVoiceClient::getInstance()->getParticipantList(participants);
-
- for (std::set<LLUUID>::const_iterator iter = participants.begin();
- iter != participants.end(); ++iter)
- {
- speakers_uuids.push_back(*iter);
- }
-
-}
-
-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();
-
-
- uuid_vec_t 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();
-
- uuid_vec_t::const_iterator speaker_iter = std::find(speakers_uuids.begin(), speakers_uuids.end(), speaker_id);
-
- // If an avatarID assigned to a panel is found in a speakers list
- // obtained from VoiceClient we assign the JOINED status to the owner
- // 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()
-{
- uuid_vec_t speakers_list;
-
- // Get a list of participants from VoiceClient
- uuid_vec_t 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;
-
- uuid_vec_t::iterator speakers_iter = std::find(speakers_uuids.begin(), speakers_uuids.end(), participant_id);
-
- LL_DEBUGS("Voice") << "processing speaker: " << item->getAvatarName() << ", " << item->getAvatarId() << LL_ENDL;
-
- // If an avatarID assigned to a panel is found in a speakers list
- // obtained from VoiceClient we assign the JOINED status to the owner
- // 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_LEFT:
- // nothing to do. These states should not be changed.
- break;
- case STATE_INVITED:
- // If avatar was invited into group chat and went offline it is still exists in mSpeakerStateMap
- // If it goes online it will be rendered as JOINED via LAvatarListItem.
- // Lets update its visual representation. See EXT-6660
- case STATE_UNKNOWN:
- // If an avatarID is not found in a speakers list from VoiceClient and
- // a panel with this ID has an UNKNOWN status this means that this person
- // 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)
-{
- uuid_vec_t& speaker_uuids = mAvatarList->getIDs();
- uuid_vec_t::iterator pos = std::find(speaker_uuids.begin(), speaker_uuids.end(), voice_speaker_id);
- if(pos != speaker_uuids.end())
- {
- speaker_uuids.erase(pos);
- 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).
- uuid_vec_t 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();
-
- sCurrentVoiceChannel = channel;
-
- mVoiceChannelStateChangeConnection = sCurrentVoiceChannel->setStateChangedCallback(boost::bind(&LLCallFloater::onVoiceChannelStateChanged, this, _1, _2));
-
- updateState(channel->getState());
-}
-
-void LLCallFloater::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
-{
- // check is voice operational and if it doesn't work hide VCP (EXT-4397)
- if(LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking())
- {
- updateState(new_state);
- }
- else
- {
- closeFloater();
- }
-}
-
-void LLCallFloater::updateState(const LLVoiceChannel::EState& new_state)
-{
- LL_DEBUGS("Voice") << "Updating state: " << new_state << ", session name: " << sCurrentVoiceChannel->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
- getChildView("leave_call_btn_panel")->setVisible( 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
deleted file mode 100644
index 00a3f76e56..0000000000
--- a/indra/newview/llcallfloater.h
+++ /dev/null
@@ -1,273 +0,0 @@
-/**
- * @file llcallfloater.h
- * @author Mike Antipov
- * @brief Voice Control Panel in a Voice Chats (P2P, Group, Nearby...).
- *
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLCALLFLOATER_H
-#define LL_LLCALLFLOATER_H
-
-#include "lltransientdockablefloater.h"
-#include "llvoicechannel.h"
-#include "llvoiceclient.h"
-
-class LLAvatarList;
-class LLAvatarListItem;
-class LLAvatarName;
-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 Voice Chat, the Voice Control Panel provides control
- * over the audible volume of each of the other participants, the Resident's own Voice
- * Morphing settings (if she has subscribed to enable the feature), and Voice Recording.
- *
- * When the Resident is engaged in any chat except Nearby Chat, the Voice Control Panel
- * also provides a '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();
- /*virtual*/ void setFocus( BOOL b );
-
- /**
- * Is called by LLVoiceClient::notifyParticipantObservers when voice participant list is changed.
- *
- * Refreshes list to display participants not in voice as disabled.
- */
- /*virtual*/ void onParticipantsChanged();
-
- 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();
-
- /**
- * Updates window title with an avatar name
- */
- void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
-
- void updateTitle();
- void initAgentData();
- void setModeratorMutedVoice(bool moderator_muted);
- void updateAgentModeratorState();
- void onModeratorNameCache(const LLAvatarName& av_name);
-
- /**
- * 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* sCurrentVoiceChannel;
-
- /* 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 0d55c4429a..30306b230f 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -54,6 +54,7 @@
#include "llresmgr.h"
#include "llslurl.h"
#include "llimview.h"
+#include "lltrans.h"
#include "llviewercontrol.h"
#include "llviewernetwork.h"
#include "llviewerobjectlist.h"
@@ -703,9 +704,7 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
if(chat_notify)
{
// Look up the name of this agent for the notification
- LLAvatarNameCache::get(agent_id,
- boost::bind(&on_avatar_name_cache_notify,
- _1, _2, online, payload));
+ LLAvatarNameCache::get(agent_id,boost::bind(&on_avatar_name_cache_notify,_1, _2, online, payload));
}
mModifyMask |= LLFriendObserver::ONLINE;
@@ -722,13 +721,14 @@ static void on_avatar_name_cache_notify(const LLUUID& agent_id,
// Popup a notify box with online status of this agent
// Use display name only because this user is your friend
LLSD args;
- args["NAME"] = av_name.mDisplayName;
+ args["NAME"] = av_name.getDisplayName();
+ args["STATUS"] = online ? LLTrans::getString("OnlineStatus") : LLTrans::getString("OfflineStatus");
LLNotificationPtr notification;
if (online)
{
notification =
- LLNotificationsUtil::add("FriendOnline",
+ LLNotificationsUtil::add("FriendOnlineOffline",
args,
payload.with("respond_on_mousedown", TRUE),
boost::bind(&LLAvatarActions::startIM, agent_id));
@@ -736,7 +736,7 @@ static void on_avatar_name_cache_notify(const LLUUID& agent_id,
else
{
notification =
- LLNotificationsUtil::add("FriendOffline", args, payload);
+ LLNotificationsUtil::add("FriendOnlineOffline", args, payload);
}
// If there's an open IM session with this agent, send a notification there too.
@@ -867,7 +867,7 @@ bool LLCollectMappableBuddies::operator()(const LLUUID& buddy_id, LLRelationship
{
LLAvatarName av_name;
LLAvatarNameCache::get( buddy_id, &av_name);
- buddy_map_t::value_type value(av_name.mDisplayName, buddy_id);
+ buddy_map_t::value_type value(av_name.getDisplayName(), buddy_id);
if(buddy->isOnline() && buddy->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION))
{
mMappable.insert(value);
@@ -890,7 +890,7 @@ bool LLCollectAllBuddies::operator()(const LLUUID& buddy_id, LLRelationship* bud
{
LLAvatarName av_name;
LLAvatarNameCache::get(buddy_id, &av_name);
- mFullName = av_name.mDisplayName;
+ mFullName = av_name.getDisplayName();
buddy_map_t::value_type value(mFullName, buddy_id);
if(buddy->isOnline())
{
diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp
index 987651fc80..43757d0174 100644
--- a/indra/newview/llchannelmanager.cpp
+++ b/indra/newview/llchannelmanager.cpp
@@ -29,7 +29,8 @@
#include "llchannelmanager.h"
#include "llappviewer.h"
-#include "llnotificationstorage.h"
+#include "lldonotdisturbnotificationstorage.h"
+#include "llpersistentnotificationstorage.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
#include "llrootview.h"
@@ -138,6 +139,9 @@ void LLChannelManager::onLoginCompleted()
}
LLPersistentNotificationStorage::getInstance()->loadNotifications();
+
+ LLDoNotDisturbNotificationStorage::getInstance()->initialize();
+ LLDoNotDisturbNotificationStorage::getInstance()->loadNotifications();
}
//--------------------------------------------------------------------------
diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp
index d6095cce07..7d0331757b 100644
--- a/indra/newview/llchatbar.cpp
+++ b/indra/newview/llchatbar.cpp
@@ -669,47 +669,3 @@ void LLChatBar::onCommitGesture(LLUICtrl* ctrl)
mGestureCombo->setFocus(FALSE);
}
}
-
-
-/* Cruft - global gChatHandler declared below has been commented out,
- so this class is never used. See similar code in llnearbychatbar.cpp
-class LLChatHandler : public LLCommandHandler
-{
-public:
- // not allowed from outside the app
- LLChatHandler() : LLCommandHandler("chat", UNTRUSTED_BLOCK) { }
-
- // Your code here
- bool handle(const LLSD& tokens, const LLSD& query_map,
- LLMediaCtrl* web)
- {
- bool retval = false;
- // Need at least 2 tokens to have a valid message.
- if (tokens.size() < 2)
- {
- retval = false;
- }
- else
- {
- S32 channel = tokens[0].asInteger();
- // VWR-19499 Restrict function to chat channels greater than 0.
- if ((channel > 0) && (channel < CHAT_CHANNEL_DEBUG))
- {
- retval = true;
- // Say mesg on channel
- std::string mesg = tokens[1].asString();
- send_chat_from_viewer(mesg, CHAT_TYPE_NORMAL, channel);
- }
- else
- {
- retval = false;
- // Tell us this is an unsupported SLurl.
- }
- }
- return retval;
- }
-};
-
-// Creating the object registers with the dispatcher.
-//LLChatHandler gChatHandler;
-cruft */
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 84e73e96fa..53926c1fef 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -28,6 +28,8 @@
#include "llchathistory.h"
+#include <boost/signals2.hpp>
+
#include "llavatarnamecache.h"
#include "llinstantmessage.h"
@@ -56,7 +58,7 @@
#include "llworld.h"
#include "lluiconstants.h"
#include "llstring.h"
-
+#include "llurlaction.h"
#include "llviewercontrol.h"
static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history");
@@ -110,7 +112,10 @@ public:
mFrom(),
mSessionID(),
mMinUserNameWidth(0),
- mUserNameFont(NULL)
+ mUserNameFont(NULL),
+ mUserNameTextBox(NULL),
+ mTimeBoxTextBox(NULL),
+ mAvatarNameCacheConnection()
{}
static LLChatHistoryHeader* createInstance(const std::string& file_name)
@@ -124,6 +129,11 @@ public:
{
// Detach the info button so that it doesn't get destroyed (EXT-8463).
hideInfoCtrl();
+
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
}
BOOL handleMouseUp(S32 x, S32 y, MASK mask)
@@ -143,8 +153,20 @@ public:
{
LLMuteList::getInstance()->add(LLMute(getAvatarId(), mFrom, LLMute::OBJECT));
- LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD().with("blocked_to_select", getAvatarId()));
+ LLFloaterSidePanelContainer::showPanel("people", "panel_people",
+ LLSD().with("people_panel_tab_name", "blocked_panel").with("blocked_to_select", getAvatarId()));
+ }
+ else if (level == "map")
+ {
+ std::string url = "secondlife://" + mObjectData["slurl"].asString();
+ LLUrlAction::showLocationOnMap(url);
+ }
+ else if (level == "teleport")
+ {
+ std::string url = "secondlife://" + mObjectData["slurl"].asString();
+ LLUrlAction::teleportToLocation(url);
}
+
}
void onAvatarIconContextMenuItemClicked(const LLSD& userdata)
@@ -187,6 +209,9 @@ public:
setMouseEnterCallback(boost::bind(&LLChatHistoryHeader::showInfoCtrl, this));
setMouseLeaveCallback(boost::bind(&LLChatHistoryHeader::hideInfoCtrl, this));
+ mUserNameTextBox = getChild<LLTextBox>("user_name");
+ mTimeBoxTextBox = getChild<LLTextBox>("time_box");
+
return LLPanel::postBuild();
}
@@ -282,8 +307,7 @@ public:
// Start with blank so sample data from XUI XML doesn't
// flash on the screen
user_name->setValue( LLSD() );
- LLAvatarNameCache::get(mAvatarID,
- boost::bind(&LLChatHistoryHeader::onAvatarNameCache, this, _1, _2));
+ fetchAvatarName();
}
else if (chat.mChatStyle == CHAT_STYLE_HISTORY ||
mSourceType == CHAT_SOURCE_AGENT)
@@ -377,8 +401,8 @@ public:
/*virtual*/ void draw()
{
- LLTextBox* user_name = getChild<LLTextBox>("user_name");
- LLTextBox* time_box = getChild<LLTextBox>("time_box");
+ LLTextBox* user_name = mUserNameTextBox; //getChild<LLTextBox>("user_name");
+ LLTextBox* time_box = mTimeBoxTextBox; //getChild<LLTextBox>("time_box");
LLRect user_name_rect = user_name->getRect();
S32 user_name_width = user_name_rect.getWidth();
@@ -415,31 +439,6 @@ public:
}
}
- void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name)
- {
- mFrom = av_name.mDisplayName;
-
- LLTextBox* user_name = getChild<LLTextBox>("user_name");
- user_name->setValue( LLSD(av_name.mDisplayName ) );
- user_name->setToolTip( av_name.mUsername );
-
- if (gSavedSettings.getBOOL("NameTagShowUsernames") &&
- LLAvatarNameCache::useDisplayNames() &&
- !av_name.mIsDisplayNameDefault)
- {
- LLStyle::Params style_params_name;
- LLColor4 userNameColor = LLUIColorTable::instance().getColor("EmphasisColor");
- style_params_name.color(userNameColor);
- style_params_name.font.name("SansSerifSmall");
- style_params_name.font.style("NORMAL");
- style_params_name.readonly_color(userNameColor);
- user_name->appendText(" - " + av_name.mUsername, FALSE, style_params_name);
- }
- setToolTip( av_name.mUsername );
- // name might have changed, update width
- updateMinUserNameWidth();
- }
-
protected:
static const S32 PADDING = 20;
@@ -554,6 +553,46 @@ private:
user_name->reshape(user_rect.getWidth() + delta_pos_x, user_rect.getHeight());
}
+ void fetchAvatarName()
+ {
+ if (mAvatarID.notNull())
+ {
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+ mAvatarNameCacheConnection = LLAvatarNameCache::get(mAvatarID,
+ boost::bind(&LLChatHistoryHeader::onAvatarNameCache, this, _1, _2));
+ }
+ }
+
+ void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name)
+ {
+ mAvatarNameCacheConnection.disconnect();
+
+ mFrom = av_name.getDisplayName();
+
+ LLTextBox* user_name = getChild<LLTextBox>("user_name");
+ user_name->setValue( LLSD(av_name.getDisplayName() ) );
+ user_name->setToolTip( av_name.getUserName() );
+
+ if (gSavedSettings.getBOOL("NameTagShowUsernames") &&
+ av_name.useDisplayNames() &&
+ !av_name.isDisplayNameDefault())
+ {
+ LLStyle::Params style_params_name;
+ LLColor4 userNameColor = LLUIColorTable::instance().getColor("EmphasisColor");
+ style_params_name.color(userNameColor);
+ style_params_name.font.name("SansSerifSmall");
+ style_params_name.font.style("NORMAL");
+ style_params_name.readonly_color(userNameColor);
+ user_name->appendText(" - " + av_name.getUserName(), FALSE, style_params_name);
+ }
+ setToolTip( av_name.getUserName() );
+ // name might have changed, update width
+ updateMinUserNameWidth();
+ }
+
protected:
LLHandle<LLView> mPopupMenuHandleAvatar;
LLHandle<LLView> mPopupMenuHandleObject;
@@ -568,6 +607,11 @@ protected:
S32 mMinUserNameWidth;
const LLFontGL* mUserNameFont;
+ LLTextBox* mUserNameTextBox;
+ LLTextBox* mTimeBoxTextBox;
+
+private:
+ boost::signals2::connection mAvatarNameCacheConnection;
};
LLUICtrl* LLChatHistoryHeader::sInfoCtrl = NULL;
@@ -584,7 +628,8 @@ LLChatHistory::LLChatHistory(const LLChatHistory::Params& p)
mBottomSeparatorPad(p.bottom_separator_pad),
mTopHeaderPad(p.top_header_pad),
mBottomHeaderPad(p.bottom_header_pad),
- mIsLastMessageFromLog(false)
+ mIsLastMessageFromLog(false),
+ mNotifyAboutUnreadMsg(p.notify_unread_msg)
{
LLTextEditor::Params editor_params(p);
editor_params.rect = getLocalRect();
@@ -594,6 +639,14 @@ LLChatHistory::LLChatHistory(const LLChatHistory::Params& p)
mEditor = LLUICtrlFactory::create<LLTextEditor>(editor_params, this);
}
+LLSD LLChatHistory::getValue() const
+{
+ LLSD* text=new LLSD();
+ text->assign(mEditor->getText());
+ return *text;
+
+}
+
LLChatHistory::~LLChatHistory()
{
this->clear();
@@ -695,6 +748,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
{
LLFastTimer _(FTM_APPEND_MESSAGE);
bool use_plain_text_chat_history = args["use_plain_text_chat_history"].asBoolean();
+ bool square_brackets = false; // square brackets necessary for a system messages
llassert(mEditor);
if (!mEditor)
@@ -702,9 +756,10 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
return;
}
+ bool from_me = chat.mFromID == gAgent.getID();
mEditor->setPlainText(use_plain_text_chat_history);
- if (!mEditor->scrolledToEnd() && chat.mFromID != gAgent.getID() && !chat.mFromName.empty())
+ if (mNotifyAboutUnreadMsg && !mEditor->scrolledToEnd() && !from_me && !chat.mFromName.empty())
{
mUnreadChatSources.insert(chat.mFromName);
mMoreChatPanel->setVisible(TRUE);
@@ -734,16 +789,23 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
}
LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
+ LLColor4 name_color(txt_color);
+
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);
+
+ LLStyle::Params body_message_params;
+ body_message_params.color(txt_color);
+ body_message_params.readonly_color(txt_color);
+ body_message_params.font.name(font_name);
+ body_message_params.font.size(font_size);
+ body_message_params.font.style(input_append_params.font.style);
+
+ LLStyle::Params name_params(body_message_params);
+ name_params.color(name_color);
+ name_params.readonly_color(name_color);
std::string prefix = chat.mText.substr(0, 4);
@@ -766,29 +828,60 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
if (irc_me || chat.mChatStyle == CHAT_STYLE_IRC)
{
delimiter = LLStringUtil::null;
- style_params.font.style = "ITALIC";
+ body_message_params.font.style = "ITALIC";
+ }
+
+ if(chat.mChatType == CHAT_TYPE_WHISPER)
+ {
+ body_message_params.font.style = "ITALIC";
+ }
+ else if(chat.mChatType == CHAT_TYPE_SHOUT)
+ {
+ body_message_params.font.style = "BOLD";
}
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);
+ txt_color = LLColor4::grey;
+ body_message_params.color(txt_color);
+ body_message_params.readonly_color(txt_color);
+ name_params.color(txt_color);
+ name_params.readonly_color(txt_color);
}
+ bool prependNewLineState = mEditor->getText().size() != 0;
+
+ // compact mode: show a timestamp and name
if (use_plain_text_chat_history)
{
- LLStyle::Params timestamp_style(style_params);
+ square_brackets = chat.mFromName == SYSTEM_FROM;
+
+ LLStyle::Params timestamp_style(body_message_params);
+
+ // out of the timestamp
+ if (args["show_time"].asBoolean())
+ {
if (!message_from_log)
{
LLColor4 timestamp_color = LLUIColorTable::instance().getColor("ChatTimestampColor");
timestamp_style.color(timestamp_color);
timestamp_style.readonly_color(timestamp_color);
}
- mEditor->appendText("[" + chat.mTimeStr + "] ", mEditor->getLength() != 0, timestamp_style);
+ mEditor->appendText("[" + chat.mTimeStr + "] ", prependNewLineState, timestamp_style);
+ prependNewLineState = false;
+ }
+
+ // out the opening square bracket (if need)
+ if (square_brackets)
+ {
+ mEditor->appendText("[", prependNewLineState, body_message_params);
+ prependNewLineState = false;
+ }
- if (utf8str_trim(chat.mFromName).size() != 0)
+ // names showing
+ if (args["show_names_for_p2p_conv"].asBoolean() && 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 && chat.mFromID.notNull())
@@ -798,32 +891,47 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
// 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);
+ LLStyle::Params link_params(body_message_params);
LLColor4 link_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
link_params.color = link_color;
link_params.readonly_color = link_color;
link_params.is_link = true;
link_params.link_href = url;
- mEditor->appendText(chat.mFromName + delimiter,
- false, link_params);
+ mEditor->appendText(chat.mFromName + delimiter, prependNewLineState, link_params);
+ prependNewLineState = false;
}
else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() && !message_from_log)
{
- LLStyle::Params link_params(style_params);
+ LLStyle::Params link_params(body_message_params);
link_params.overwriteFrom(LLStyleMap::instance().lookupAgent(chat.mFromID));
+ if (from_me)
+ { std::string localized_name;
+ bool is_localized = LLTrans::findString(localized_name, "AgentNameSubst");
+ mEditor->appendText((is_localized? localized_name:"(You)") + delimiter,
+ prependNewLineState, link_params);
+ prependNewLineState = false;
+ }
+ else
+ {
// Add link to avatar's inspector and delimiter to message.
- mEditor->appendText(std::string(link_params.link_href) + delimiter, false, link_params);
+ mEditor->appendText(std::string(link_params.link_href) + delimiter,
+ prependNewLineState, link_params);
+ prependNewLineState = false;
+ }
}
else
{
- mEditor->appendText("<nolink>" + chat.mFromName + "</nolink>" + delimiter, false, style_params);
+ mEditor->appendText("<nolink>" + chat.mFromName + "</nolink>" + delimiter,
+ prependNewLineState, body_message_params);
+ prependNewLineState = false;
}
}
}
- else
+ else // showing timestamp and name in the expanded mode
{
+ prependNewLineState = false;
LLView* view = NULL;
LLInlineViewSegment::Params p;
p.force_newline = true;
@@ -844,7 +952,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
}
else
{
- view = getHeader(chat, style_params, args);
+ view = getHeader(chat, name_params, args);
if (mEditor->getLength() == 0)
p.top_pad = 0;
else
@@ -873,41 +981,16 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
mIsLastMessageFromLog = message_from_log;
}
+ // body of the message processing
+
+ // notify processing
if (chat.mNotifId.notNull())
{
LLNotificationPtr notification = LLNotificationsUtil::find(chat.mNotifId);
if (notification != NULL)
{
LLIMToastNotifyPanel* notify_box = new LLIMToastNotifyPanel(
- notification, chat.mSessionID, LLRect::null, !use_plain_text_chat_history);
- //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;
- // Children were added by addChild() which uses push_front to insert them into list,
- // so to get buttons in correct order reverse iterator is used (EXT-5906)
- for (ctrl_list_t::reverse_iterator it = ctrls.rbegin(); it != ctrls.rend(); it++)
- {
- LLButton * button = dynamic_cast<LLButton*> (*it);
- if (button != NULL)
- {
- button->setOrigin( offset,
- button->getRect().mBottom);
- button->setLeftHPad(2 * HPAD);
- button->setRightHPad(2 * HPAD);
- // set zero width before perform autoResize()
- button->setRect(LLRect(button->getRect().mLeft,
- button->getRect().mTop, button->getRect().mLeft,
- button->getRect().mBottom));
- button->setAutoResize(true);
- button->autoResize();
- offset += HPAD + button->getRect().getWidth();
- button->setFollowsNone();
- }
- }
+ notification, chat.mSessionID, LLRect::null, !use_plain_text_chat_history, mEditor);
//Prepare the rect for the view
LLRect target_rect = mEditor->getDocumentView()->getRect();
@@ -924,6 +1007,8 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
mEditor->appendWidget(params, "\n", false);
}
}
+
+ // usual messages showing
else
{
std::string message = irc_me ? chat.mText.substr(3) : chat.mText;
@@ -931,7 +1016,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
//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())
+ if (use_plain_text_chat_history && !from_me && chat.mFromID.notNull())
{
std::string slurl_about = SLURL_APP_AGENT + chat.mFromID.asString() + SLURL_ABOUT;
if (message.length() > slurl_about.length() &&
@@ -946,13 +1031,19 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
message = chat.mFromName + message;
}
- mEditor->appendText(message, FALSE, style_params);
+ if (square_brackets)
+ {
+ message += "]";
+ }
+
+ mEditor->appendText(message, prependNewLineState, body_message_params);
+ prependNewLineState = false;
}
mEditor->blockUndo();
// automatically scroll to end when receiving chat from myself
- if (chat.mFromID == gAgentID)
+ if (from_me)
{
mEditor->setCursorAndScrollToEnd();
}
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index 28344e6a10..bb6d4fb59c 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -60,6 +60,8 @@ class LLChatHistory : public LLUICtrl
Optional<LLTextBox::Params> more_chat_text;
+ Optional<bool> notify_unread_msg;
+
Params()
: message_header("message_header"),
message_separator("message_separator"),
@@ -71,7 +73,8 @@ class LLChatHistory : public LLUICtrl
bottom_separator_pad("bottom_separator_pad"),
top_header_pad("top_header_pad"),
bottom_header_pad("bottom_header_pad"),
- more_chat_text("more_chat_text")
+ more_chat_text("more_chat_text"),
+ notify_unread_msg("notify_unread_msg", true)
{}
};
@@ -100,7 +103,7 @@ class LLChatHistory : public LLUICtrl
public:
~LLChatHistory();
-
+ LLSD getValue() const;
void initFromParams(const Params&);
/**
@@ -122,6 +125,7 @@ class LLChatHistory : public LLUICtrl
LLUUID mLastFromID;
LLDate mLastMessageTime;
bool mIsLastMessageFromLog;
+ bool mNotifyAboutUnreadMsg;
//std::string mLastMessageTimeStr;
std::string mMessageHeaderFilename;
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 9a84280f25..a1a9463d43 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -35,7 +35,7 @@
#include "llfloaterreg.h"
#include "lllocalcliprect.h"
#include "lltrans.h"
-#include "llnearbychatbar.h"
+#include "llfloaterimnearbychat.h"
#include "llviewercontrol.h"
#include "llagentdata.h"
@@ -81,23 +81,30 @@ public:
LLObjectHandler gObjectHandler;
//*******************************************************************************************************************
-//LLNearbyChatToastPanel
+//LLFloaterIMNearbyChatToastPanel
//*******************************************************************************************************************
-LLNearbyChatToastPanel* LLNearbyChatToastPanel::createInstance()
+LLFloaterIMNearbyChatToastPanel* LLFloaterIMNearbyChatToastPanel::createInstance()
{
- LLNearbyChatToastPanel* item = new LLNearbyChatToastPanel();
+ LLFloaterIMNearbyChatToastPanel* item = new LLFloaterIMNearbyChatToastPanel();
item->buildFromFile("panel_chat_item.xml");
item->setFollows(FOLLOWS_NONE);
return item;
}
-void LLNearbyChatToastPanel::reshape (S32 width, S32 height, BOOL called_from_parent )
+void LLFloaterIMNearbyChatToastPanel::reshape (S32 width, S32 height, BOOL called_from_parent )
{
LLPanel::reshape(width, height,called_from_parent);
- LLUICtrl* msg_text = getChild<LLUICtrl>("msg_text", false);
- LLUICtrl* icon = getChild<LLUICtrl>("avatar_icon", false);
+ // reshape() may be called from LLView::initFromParams() before the children are created.
+ // We call findChild() instead of getChild() here to avoid creating dummy controls.
+ LLUICtrl* msg_text = findChild<LLUICtrl>("msg_text", false);
+ LLUICtrl* icon = findChild<LLUICtrl>("avatar_icon", false);
+
+ if (!msg_text || !icon)
+ {
+ return;
+ }
LLRect msg_text_rect = msg_text->getRect();
LLRect avatar_rect = icon->getRect();
@@ -114,12 +121,12 @@ void LLNearbyChatToastPanel::reshape (S32 width, S32 height, BOOL called_from_p
msg_text->setRect(msg_text_rect);
}
-BOOL LLNearbyChatToastPanel::postBuild()
+BOOL LLFloaterIMNearbyChatToastPanel::postBuild()
{
return LLPanel::postBuild();
}
-void LLNearbyChatToastPanel::addMessage(LLSD& notification)
+void LLFloaterIMNearbyChatToastPanel::addMessage(LLSD& notification)
{
std::string messageText = notification["message"].asString(); // UTF-8 line of text
@@ -171,7 +178,7 @@ void LLNearbyChatToastPanel::addMessage(LLSD& notification)
}
-void LLNearbyChatToastPanel::init(LLSD& notification)
+void LLFloaterIMNearbyChatToastPanel::init(LLSD& notification)
{
std::string messageText = notification["message"].asString(); // UTF-8 line of text
std::string fromName = notification["from"].asString(); // agent or object name
@@ -266,7 +273,7 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
mIsDirty = true;//will set Avatar Icon in draw
}
-void LLNearbyChatToastPanel::snapToMessageHeight ()
+void LLFloaterIMNearbyChatToastPanel::snapToMessageHeight ()
{
LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false);
S32 new_height = llmax (text_box->getTextPixelHeight() + 2*text_box->getVPad() + 2*msg_height_pad, 25);
@@ -281,22 +288,22 @@ void LLNearbyChatToastPanel::snapToMessageHeight ()
}
-void LLNearbyChatToastPanel::onMouseLeave (S32 x, S32 y, MASK mask)
+void LLFloaterIMNearbyChatToastPanel::onMouseLeave (S32 x, S32 y, MASK mask)
{
}
-void LLNearbyChatToastPanel::onMouseEnter (S32 x, S32 y, MASK mask)
+void LLFloaterIMNearbyChatToastPanel::onMouseEnter (S32 x, S32 y, MASK mask)
{
if(mSourceType != CHAT_SOURCE_AGENT)
return;
}
-BOOL LLNearbyChatToastPanel::handleMouseDown (S32 x, S32 y, MASK mask)
+BOOL LLFloaterIMNearbyChatToastPanel::handleMouseDown (S32 x, S32 y, MASK mask)
{
return LLPanel::handleMouseDown(x,y,mask);
}
-BOOL LLNearbyChatToastPanel::handleMouseUp (S32 x, S32 y, MASK mask)
+BOOL LLFloaterIMNearbyChatToastPanel::handleMouseUp (S32 x, S32 y, MASK mask)
{
/*
fix for request EXT-4780
@@ -316,16 +323,16 @@ BOOL LLNearbyChatToastPanel::handleMouseUp (S32 x, S32 y, MASK mask)
return TRUE;
else
{
- LLNearbyChatBar::getInstance()->showHistory();
+ (LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat"))->showHistory();
return FALSE;
}
}
- LLNearbyChatBar::getInstance()->showHistory();
+ (LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat"))->showHistory();
return LLPanel::handleMouseUp(x,y,mask);
}
-void LLNearbyChatToastPanel::setHeaderVisibility(EShowItemHeader e)
+void LLFloaterIMNearbyChatToastPanel::setHeaderVisibility(EShowItemHeader e)
{
LLUICtrl* icon = getChild<LLUICtrl>("avatar_icon", false);
if(icon)
@@ -333,7 +340,7 @@ void LLNearbyChatToastPanel::setHeaderVisibility(EShowItemHeader e)
}
-bool LLNearbyChatToastPanel::canAddText ()
+bool LLFloaterIMNearbyChatToastPanel::canAddText ()
{
LLChatMsgBox* msg_text = findChild<LLChatMsgBox>("msg_text");
if(!msg_text)
@@ -341,7 +348,7 @@ bool LLNearbyChatToastPanel::canAddText ()
return msg_text->getLineCount()<10;
}
-BOOL LLNearbyChatToastPanel::handleRightMouseDown(S32 x, S32 y, MASK mask)
+BOOL LLFloaterIMNearbyChatToastPanel::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
LLUICtrl* avatar_icon = getChild<LLUICtrl>("avatar_icon", false);
@@ -353,8 +360,10 @@ BOOL LLNearbyChatToastPanel::handleRightMouseDown(S32 x, S32 y, MASK mask)
return TRUE;
return LLPanel::handleRightMouseDown(x,y,mask);
}
-void LLNearbyChatToastPanel::draw()
+void LLFloaterIMNearbyChatToastPanel::draw()
{
+ LLPanel::draw();
+
if(mIsDirty)
{
LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon", false);
@@ -372,7 +381,6 @@ void LLNearbyChatToastPanel::draw()
}
mIsDirty = false;
}
- LLToastPanelBase::draw();
}
diff --git a/indra/newview/llchatitemscontainerctrl.h b/indra/newview/llchatitemscontainerctrl.h
index 1d700dcede..54b6499d52 100644
--- a/indra/newview/llchatitemscontainerctrl.h
+++ b/indra/newview/llchatitemscontainerctrl.h
@@ -40,18 +40,18 @@ typedef enum e_show_item_header
CHATITEMHEADER_SHOW_BOTH
} EShowItemHeader;
-class LLNearbyChatToastPanel: public LLToastPanelBase
+class LLFloaterIMNearbyChatToastPanel : public LLPanel
{
protected:
- LLNearbyChatToastPanel()
+ LLFloaterIMNearbyChatToastPanel()
:
mIsDirty(false),
mSourceType(CHAT_SOURCE_OBJECT)
{};
public:
- ~LLNearbyChatToastPanel(){}
+ ~LLFloaterIMNearbyChatToastPanel(){}
- static LLNearbyChatToastPanel* createInstance();
+ static LLFloaterIMNearbyChatToastPanel* createInstance();
const LLUUID& getFromID() const { return mFromID;}
const std::string& getFromName() const { return mFromName; }
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index a661808d1f..b221daf936 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -27,35 +27,17 @@
#include "llviewerprecompiledheaders.h" // must be first include
#include "llchiclet.h"
-#include "llagent.h"
-#include "llavataractions.h"
#include "llchicletbar.h"
-#include "lleventtimer.h"
-#include "llgroupactions.h"
-#include "lliconctrl.h"
-#include "llimfloater.h"
-#include "llimview.h"
+#include "llfloaterimsession.h"
+#include "llfloaterimcontainer.h"
#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 "llgroupmgr.h"
-#include "llnotificationmanager.h"
-#include "lltransientfloatermgr.h"
+#include "llsingleton.h"
#include "llsyswellwindow.h"
static LLDefaultChildRegistry::Register<LLChicletPanel> t1("chiclet_panel");
-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");
@@ -66,65 +48,10 @@ boost::signals2::signal<LLChiclet* (const LLUUID&),
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
-/**
- * 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)
+ : button("button")
+ , unread_notifications("unread_notifications")
+ , max_displayed_count("max_displayed_count", 99)
{
button.name = "button";
button.tab_stop = FALSE;
@@ -132,30 +59,24 @@ LLSysWellChiclet::Params::Params()
}
LLSysWellChiclet::LLSysWellChiclet(const Params& p)
-: LLChiclet(p)
-, mButton(NULL)
-, mCounter(0)
-, mMaxDisplayedCount(p.max_displayed_count)
-, mIsNewMessagesState(false)
-, mFlashToLitTimer(NULL)
-, mContextMenu(NULL)
+ : LLChiclet(p)
+ , mButton(NULL)
+ , mCounter(0)
+ , mMaxDisplayedCount(p.max_displayed_count)
+ , mIsNewMessagesState(false)
+ , mFlashToLitTimer(NULL)
+ , mContextMenu(NULL)
{
LLButton::Params button_params = p.button;
mButton = LLUICtrlFactory::create<LLButton>(button_params);
addChild(mButton);
- // use settings from settings.xml to be able change them via Debug settings. See EXT-5973.
- // Due to Timer is implemented as derived class from EventTimer it is impossible to change period
- // in runtime. So, both settings are made as required restart.
- static S32 flash_to_lit_count = gSavedSettings.getS32("WellIconFlashCount");
- static F32 flash_period = gSavedSettings.getF32("WellIconFlashPeriod");
-
- mFlashToLitTimer = new FlashToLitTimer(flash_to_lit_count, flash_period, boost::bind(&LLSysWellChiclet::changeLitState, this));
+ mFlashToLitTimer = new LLFlashTimer(boost::bind(&LLSysWellChiclet::changeLitState, this, _1));
}
LLSysWellChiclet::~LLSysWellChiclet()
{
- delete mFlashToLitTimer;
+ mFlashToLitTimer->unset();
}
void LLSysWellChiclet::setCounter(S32 counter)
@@ -190,7 +111,7 @@ void LLSysWellChiclet::setToggleState(BOOL toggled) {
mButton->setToggleState(toggled);
}
-void LLSysWellChiclet::changeLitState()
+void LLSysWellChiclet::changeLitState(bool blink)
{
setNewMessagesState(!mIsNewMessagesState);
}
@@ -235,130 +156,18 @@ BOOL LLSysWellChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
}
/************************************************************************/
-/* 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);
-}
-
-LLIMWellChiclet::~LLIMWellChiclet()
-{
- LLIMWellWindow* im_well_window = LLIMWellWindow::findInstance();
- if (im_well_window)
- {
- im_well_window->setSysWellChiclet(NULL);
- }
-
- LLIMMgr::getInstance()->removeSessionObserver(this);
-}
-
-void LLIMWellChiclet::onMenuItemClicked(const LLSD& user_data)
-{
- std::string action = user_data.asString();
- if("close all" == action)
- {
- LLIMWellWindow::getInstance()->closeAll();
- }
-}
-
-bool LLIMWellChiclet::enableMenuItem(const LLSD& user_data)
-{
- std::string item = user_data.asString();
- if (item == "can close all")
- {
- return !LLIMWellWindow::getInstance()->isWindowEmpty();
- }
- return true;
-}
-
-void LLIMWellChiclet::createMenu()
-{
- if(mContextMenu)
- {
- llwarns << "Menu already exists" << llendl;
- return;
- }
-
- LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
- registrar.add("IMWellChicletMenu.Action",
- boost::bind(&LLIMWellChiclet::onMenuItemClicked, this, _2));
-
- LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
- enable_registrar.add("IMWellChicletMenu.EnableItem",
- boost::bind(&LLIMWellChiclet::enableMenuItem, this, _2));
-
- mContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>
- ("menu_im_well_button.xml",
- LLMenuGL::sMenuContainer,
- LLViewerMenuHolderGL::child_registry_t::instance());
-}
-
-void LLIMWellChiclet::messageCountChanged(const LLSD& session_data)
-{
- // The singleton class LLChicletBar instance might be already deleted
- // so don't create a new one.
- if (!LLChicletBar::instanceExists())
- {
- return;
- }
-
- const LLUUID& session_id = session_data["session_id"];
- const S32 counter = LLChicletBar::getInstance()->getTotalUnreadIMCount();
- const bool im_not_visible = !LLFloaterReg::instanceVisible("im_container")
- && !LLFloaterReg::instanceVisible("impanel", session_id);
-
- setNewMessagesState(counter > mCounter && im_not_visible);
-
- // we have to flash to 'Lit' state each time new unread message is coming.
- if (counter > mCounter && im_not_visible)
- {
- mFlashToLitTimer->flash();
- }
- else if (counter == 0)
- {
- // if notification is resolved while well is flashing it can leave in the 'Lit' state
- // when flashing finishes itself. Let break flashing here.
- mFlashToLitTimer->stopFlashing();
- }
-
- setCounter(counter);
-}
-
-/************************************************************************/
/* LLNotificationChiclet implementation */
/************************************************************************/
LLNotificationChiclet::LLNotificationChiclet(const Params& p)
-: LLSysWellChiclet(p)
-, mUreadSystemNotifications(0)
+: LLSysWellChiclet(p),
+ mUreadSystemNotifications(0)
{
- // connect counter handlers to the signals
- connectCounterUpdatersToSignal("notify");
- connectCounterUpdatersToSignal("groupnotify");
- connectCounterUpdatersToSignal("offer");
-
+ mNotificationChannel.reset(new ChicletNotificationChannel(this));
// 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)
- {
- n_handler->setNewNotificationCallback(boost::bind(&LLNotificationChiclet::incUreadSystemNotifications, this));
- n_handler->setDelNotification(boost::bind(&LLNotificationChiclet::decUreadSystemNotifications, this));
- }
-}
-
void LLNotificationChiclet::onMenuItemClicked(const LLSD& user_data)
{
std::string action = user_data.asString();
@@ -407,6 +216,23 @@ void LLNotificationChiclet::setCounter(S32 counter)
updateWidget(getCounter() == 0);
}
+
+bool LLNotificationChiclet::ChicletNotificationChannel::filterNotification( LLNotificationPtr notification )
+{
+ if (notification->getName() == "ScriptDialog")
+ {
+ return false;
+ }
+
+ if( !(notification->canLogToIM() && notification->hasFormElements())
+ && (!notification->getPayload().has("give_inventory_notification")
+ || notification->getPayload()["give_inventory_notification"]))
+ {
+ return true;
+ }
+ return false;
+}
+
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -422,12 +248,6 @@ LLChiclet::LLChiclet(const Params& p)
, mSessionId(LLUUID::null)
, mShowCounter(p.show_counter)
{
-
-}
-
-LLChiclet::~LLChiclet()
-{
-
}
boost::signals2::connection LLChiclet::setLeftButtonClickCallback(
@@ -462,7 +282,9 @@ LLSD LLChiclet::getValue() const
void LLChiclet::setValue(const LLSD& value)
{
if(value.isUUID())
+ {
setSessionId(value.asUUID());
+ }
}
//////////////////////////////////////////////////////////////////////////
@@ -474,12 +296,9 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p)
, mShowSpeaker(false)
, mDefaultWidth(p.rect().getWidth())
, mNewMessagesIcon(NULL)
-, mSpeakerCtrl(NULL)
-, mCounterCtrl(NULL)
, mChicletButton(NULL)
, mPopupMenu(NULL)
{
- enableCounterControl(p.enable_counter);
}
/* virtual*/
@@ -490,16 +309,6 @@ BOOL LLIMChiclet::postBuild()
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)
{
@@ -510,87 +319,13 @@ void LLIMChiclet::enableCounterControl(bool enable)
}
}
-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)
@@ -607,8 +342,7 @@ bool LLIMChiclet::getShowNewMessagesIcon()
void LLIMChiclet::onMouseDown()
{
- LLIMFloater::toggle(getSessionId());
- setCounter(0);
+ LLFloaterIMSession::toggle(getSessionId());
}
void LLIMChiclet::setToggleState(bool toggle)
@@ -616,52 +350,6 @@ void LLIMChiclet::setToggleState(bool toggle)
mChicletButton->setToggleState(toggle);
}
-void LLIMChiclet::draw()
-{
- LLUICtrl::draw();
-}
-
-// static
-LLIMChiclet::EType LLIMChiclet::getIMSessionType(const LLUUID& session_id)
-{
- EType type = TYPE_UNKNOWN;
-
- if(session_id.isNull())
- return type;
-
- EInstantMessage im_type = LLIMModel::getInstance()->getType(session_id);
- if (IM_COUNT == im_type)
- {
- llassert_always(0 && "IM session not found"); // should never happen
- return type;
- }
-
- switch(im_type)
- {
- case IM_NOTHING_SPECIAL:
- case IM_SESSION_P2P_INVITE:
- type = TYPE_IM;
- break;
- case IM_SESSION_GROUP_START:
- case IM_SESSION_INVITE:
- if (gAgent.isInGroup(session_id))
- {
- type = TYPE_GROUP;
- }
- else
- {
- type = TYPE_AD_HOC;
- }
- break;
- case IM_SESSION_CONFERENCE_START:
- type = TYPE_AD_HOC;
- default:
- break;
- }
-
- return type;
-}
-
BOOL LLIMChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
if(!mPopupMenu)
@@ -697,382 +385,6 @@ bool LLIMChiclet::canCreateMenu()
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
-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")
-{
-}
-
-LLIMP2PChiclet::LLIMP2PChiclet(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);
-
- LLChicletAvatarIconCtrl::Params avatar_params = p.avatar_icon;
- mChicletIconCtrl = LLUICtrlFactory::create<LLChicletAvatarIconCtrl>(avatar_params);
- addChild(mChicletIconCtrl);
-
- LLChicletNotificationCounterCtrl::Params unread_params = p.unread_notifications;
- mCounterCtrl = LLUICtrlFactory::create<LLChicletNotificationCounterCtrl>(unread_params);
- addChild(mCounterCtrl);
-
- setCounter(getCounter());
- setShowCounter(getShowCounter());
-
- LLChicletSpeakerCtrl::Params speaker_params = p.speaker;
- mSpeakerCtrl = LLUICtrlFactory::create<LLChicletSpeakerCtrl>(speaker_params);
- addChild(mSpeakerCtrl);
-
- sendChildToFront(mNewMessagesIcon);
- setShowSpeaker(p.show_speaker);
-}
-
-void LLIMP2PChiclet::initSpeakerControl()
-{
- mSpeakerCtrl->setSpeakerId(getOtherParticipantId());
-}
-
-void LLIMP2PChiclet::setOtherParticipantId(const LLUUID& other_participant_id)
-{
- LLIMChiclet::setOtherParticipantId(other_participant_id);
- mChicletIconCtrl->setValue(getOtherParticipantId());
-}
-
-void LLIMP2PChiclet::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>("Send IM")->setEnabled(!open_window_exists);
-
- bool is_friend = LLAvatarActions::isFriend(getOtherParticipantId());
- mPopupMenu->getChild<LLUICtrl>("Add Friend")->setEnabled(!is_friend);
-}
-
-void LLIMP2PChiclet::createPopupMenu()
-{
- if(!canCreateMenu())
- return;
-
- LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
- registrar.add("IMChicletMenu.Action", boost::bind(&LLIMP2PChiclet::onMenuItemClicked, this, _2));
-
- mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>
- ("menu_imchiclet_p2p.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-}
-
-void LLIMP2PChiclet::onMenuItemClicked(const LLSD& user_data)
-{
- std::string level = user_data.asString();
- LLUUID other_participant_id = getOtherParticipantId();
-
- if("profile" == level)
- {
- LLAvatarActions::showProfile(other_participant_id);
- }
- else if("im" == level)
- {
- LLAvatarActions::startIM(other_participant_id);
- }
- else if("add" == level)
- {
- LLAvatarActions::requestFriendshipDialog(other_participant_id);
- }
- else if("end" == level)
- {
- LLAvatarActions::endIM(other_participant_id);
- }
-}
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
-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)
-{
-}
-
-LLAdHocChiclet::LLAdHocChiclet(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);
-
- 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;
- mCounterCtrl = LLUICtrlFactory::create<LLChicletNotificationCounterCtrl>(unread_params);
- addChild(mCounterCtrl);
-
- setCounter(getCounter());
- setShowCounter(getShowCounter());
-
- LLChicletSpeakerCtrl::Params speaker_params = p.speaker;
- mSpeakerCtrl = LLUICtrlFactory::create<LLChicletSpeakerCtrl>(speaker_params);
- addChild(mSpeakerCtrl);
-
- sendChildToFront(mNewMessagesIcon);
- setShowSpeaker(p.show_speaker);
-}
-
-void LLAdHocChiclet::setSessionId(const LLUUID& session_id)
-{
- LLChiclet::setSessionId(session_id);
- LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
- mChicletIconCtrl->setValue(im_session->mOtherParticipantID);
-}
-
-void LLAdHocChiclet::draw()
-{
- switchToCurrentSpeaker();
- LLIMChiclet::draw();
-}
-
-void LLAdHocChiclet::initSpeakerControl()
-{
- switchToCurrentSpeaker();
-}
-
-void LLAdHocChiclet::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)
- {
- LLPointer<LLSpeaker> s = *i;
- if (s->mSpeechVolume > 0 || s->mStatus == LLSpeaker::STATUS_SPEAKING)
- {
- speaker_id = s->mID;
- break;
- }
- }
-
- mSpeakerCtrl->setSpeakerId(speaker_id);
-}
-
-void LLAdHocChiclet::createPopupMenu()
-{
- if(!canCreateMenu())
- 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)
- {
- LLGroupActions::endIM(group_id);
- }
-}
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
-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")
-{
-}
-
-LLIMGroupChiclet::LLIMGroupChiclet(const Params& p)
-: LLIMChiclet(p)
-, LLGroupMgrObserver(LLUUID::null)
-, 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);
-
- LLChicletGroupIconCtrl::Params avatar_params = p.group_icon;
- mChicletIconCtrl = LLUICtrlFactory::create<LLChicletGroupIconCtrl>(avatar_params);
- addChild(mChicletIconCtrl);
-
- LLChicletNotificationCounterCtrl::Params unread_params = p.unread_notifications;
- mCounterCtrl = LLUICtrlFactory::create<LLChicletNotificationCounterCtrl>(unread_params);
- addChild(mCounterCtrl);
-
- setCounter(getCounter());
- setShowCounter(getShowCounter());
-
- LLChicletSpeakerCtrl::Params speaker_params = p.speaker;
- mSpeakerCtrl = LLUICtrlFactory::create<LLChicletSpeakerCtrl>(speaker_params);
- addChild(mSpeakerCtrl);
-
- sendChildToFront(mNewMessagesIcon);
- setShowSpeaker(p.show_speaker);
-}
-
-LLIMGroupChiclet::~LLIMGroupChiclet()
-{
- LLGroupMgr::getInstance()->removeObserver(this);
-}
-
-void LLIMGroupChiclet::draw()
-{
- if(getShowSpeaker())
- {
- switchToCurrentSpeaker();
- }
- LLIMChiclet::draw();
-}
-
-void LLIMGroupChiclet::initSpeakerControl()
-{
- 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)
- {
- LLPointer<LLSpeaker> s = *i;
- if (s->mSpeechVolume > 0 || s->mStatus == LLSpeaker::STATUS_SPEAKING)
- {
- speaker_id = s->mID;
- break;
- }
- }
-
- mSpeakerCtrl->setSpeakerId(speaker_id);
-}
-
-void LLIMGroupChiclet::setSessionId(const LLUUID& session_id)
-{
- LLChiclet::setSessionId(session_id);
-
- LLGroupMgr* grp_mgr = LLGroupMgr::getInstance();
- LLGroupMgrGroupData* group_data = grp_mgr->getGroupData(session_id);
- if (group_data && group_data->mInsigniaID.notNull())
- {
- mChicletIconCtrl->setValue(group_data->mInsigniaID);
- }
- else
- {
- if(getSessionId() != mID)
- {
- grp_mgr->removeObserver(this);
- mID = getSessionId();
- grp_mgr->addObserver(this);
- }
- grp_mgr->sendGroupPropertiesRequest(session_id);
- }
-}
-
-void LLIMGroupChiclet::changed(LLGroupChange gc)
-{
- if (GC_PROPERTIES == gc)
- {
- LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(getSessionId());
- if (group_data)
- {
- mChicletIconCtrl->setValue(group_data->mInsigniaID);
- }
- }
-}
-
-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);
-}
-
-void LLIMGroupChiclet::createPopupMenu()
-{
- if(!canCreateMenu())
- return;
-
- LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
- registrar.add("IMChicletMenu.Action", boost::bind(&LLIMGroupChiclet::onMenuItemClicked, this, _2));
-
- mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>
- ("menu_imchiclet_group.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-}
-
-void LLIMGroupChiclet::onMenuItemClicked(const LLSD& user_data)
-{
- std::string level = user_data.asString();
- LLUUID group_id = getSessionId();
-
- if("group chat" == level)
- {
- LLGroupActions::startIM(group_id);
- }
- else if("info" == level)
- {
- LLGroupActions::show(group_id);
- }
- else if("end" == level)
- {
- LLGroupActions::endIM(group_id);
- }
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
LLChicletPanel::Params::Params()
: chiclet_padding("chiclet_padding")
, scrolling_offset("scrolling_offset")
@@ -1115,28 +427,17 @@ LLChicletPanel::~LLChicletPanel()
void LLChicletPanel::onMessageCountChanged(const LLSD& data)
{
+ // *TODO : we either suppress this method or return a value. Right now, it servers no purpose.
+ /*
LLUUID session_id = data["session_id"].asUUID();
S32 unread = data["participant_unread"].asInteger();
- LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+ LLFloaterIMSession* im_floater = LLFloaterIMSession::findInstance(session_id);
if (im_floater && im_floater->getVisible() && im_floater->hasFocus())
{
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(unread);
- }
- else
- {
- llwarns << "Unable to set counter for chiclet " << session_id << llendl;
- }
- }
+ */
}
void LLChicletPanel::objectChicletCallback(const LLSD& data)
@@ -1151,10 +452,6 @@ void LLChicletPanel::objectChicletCallback(const LLSD& data)
LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*iter);
if (chiclet != NULL)
{
- if(data.has("unread"))
- {
- chiclet->setCounter(data["unread"]);
- }
chiclet->setShowNewMessagesIcon(new_message);
}
}
@@ -1196,28 +493,13 @@ void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id)
LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);
if(chiclet)
{
- chiclet->setShowSpeaker(true);
if (gSavedSettings.getBOOL("OpenIMOnVoice"))
{
- LLIMFloater::show(chiclet->getSessionId());
+ LLFloaterIMContainer::getInstance()->showConversation(session_id);
}
}
}
- 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;
}
@@ -1690,7 +972,7 @@ bool LLChicletPanel::isAnyIMFloaterDoked()
for (chiclet_list_t::iterator it = mChicletList.begin(); it
!= mChicletList.end(); it++)
{
- LLIMFloater* im_floater = LLFloaterReg::findTypedInstance<LLIMFloater>(
+ LLFloaterIMSession* im_floater = LLFloaterReg::findTypedInstance<LLFloaterIMSession>(
"impanel", (*it)->getSessionId());
if (im_floater != NULL && im_floater->getVisible()
&& !im_floater->isMinimized() && im_floater->isDocked())
@@ -1703,89 +985,17 @@ bool LLChicletPanel::isAnyIMFloaterDoked()
return res;
}
-S32 LLChicletPanel::getTotalUnreadIMCount()
-{
- S32 count = 0;
- chiclet_list_t::const_iterator it = mChicletList.begin();
- for( ; mChicletList.end() != it; ++it)
- {
- LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);
- if(chiclet)
- {
- count += chiclet->getCounter();
- }
- }
- return count;
-}
-
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
LLChicletNotificationCounterCtrl::Params::Params()
-: max_displayed_count("max_displayed_count", 99)
-{
-}
-
-LLChicletNotificationCounterCtrl::LLChicletNotificationCounterCtrl(const Params& p)
- : LLTextBox(p)
- , mCounter(0)
- , mInitialWidth(0)
- , mMaxDisplayedCount(p.max_displayed_count)
-{
- mInitialWidth = getRect().getWidth();
-}
-
-void LLChicletNotificationCounterCtrl::setCounter(S32 counter)
-{
- mCounter = counter;
-
- // 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(s_count);
- }
- else
- {
- setText(std::string(""));
- }
-}
-
-LLRect LLChicletNotificationCounterCtrl::getRequiredRect()
-{
- LLRect rc;
- S32 text_width = getTextPixelWidth();
-
- rc.mRight = rc.mLeft + llmax(text_width, mInitialWidth);
-
- return rc;
-}
-
-void LLChicletNotificationCounterCtrl::setValue(const LLSD& value)
+ : max_displayed_count("max_displayed_count", 99)
{
- if(value.isInteger())
- setCounter(value.asInteger());
-}
-
-LLSD LLChicletNotificationCounterCtrl::getValue() const
-{
- return LLSD(getCounter());
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
-
LLChicletAvatarIconCtrl::LLChicletAvatarIconCtrl(const Params& p)
: LLAvatarIconCtrl(p)
{
@@ -1795,29 +1005,6 @@ LLChicletAvatarIconCtrl::LLChicletAvatarIconCtrl(const Params& p)
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
-LLChicletGroupIconCtrl::LLChicletGroupIconCtrl(const Params& p)
-: LLIconCtrl(p)
-, mDefaultIcon(p.default_icon)
-{
- setValue(LLUUID::null);
-}
-
-void LLChicletGroupIconCtrl::setValue(const LLSD& value )
-{
- if(value.asUUID().isNull())
- {
- LLIconCtrl::setValue(mDefaultIcon);
- }
- else
- {
- LLIconCtrl::setValue(value);
- }
-}
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
LLChicletInvOfferIconCtrl::LLChicletInvOfferIconCtrl(const Params& p)
: LLChicletAvatarIconCtrl(p)
, mDefaultIcon(p.default_icon)
@@ -1840,15 +1027,6 @@ void LLChicletInvOfferIconCtrl::setValue(const LLSD& value )
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
-LLChicletSpeakerCtrl::LLChicletSpeakerCtrl(const Params&p)
- : LLOutputMonitorCtrl(p)
-{
-}
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
LLScriptChiclet::Params::Params()
: icon("icon")
, chiclet_button("chiclet_button")
@@ -1884,11 +1062,6 @@ void LLScriptChiclet::setSessionId(const LLUUID& session_id)
setToolTip(LLScriptFloaterManager::getObjectName(session_id));
}
-void LLScriptChiclet::setCounter(S32 counter)
-{
- setShowNewMessagesIcon( counter > 0 );
-}
-
void LLScriptChiclet::onMouseDown()
{
LLScriptFloaterManager::getInstance()->toggleScriptFloater(getSessionId());
@@ -1967,11 +1140,6 @@ void LLInvOfferChiclet::setSessionId(const LLUUID& session_id)
}
}
-void LLInvOfferChiclet::setCounter(S32 counter)
-{
- setShowNewMessagesIcon( counter > 0 );
-}
-
void LLInvOfferChiclet::onMouseDown()
{
LLScriptFloaterManager::instance().toggleScriptFloater(getSessionId());
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index 19683492c2..efaf03384a 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -29,14 +29,11 @@
#include "llavatariconctrl.h"
#include "llbutton.h"
-#include "llpanel.h"
+#include "llnotifications.h"
#include "lltextbox.h"
-#include "lloutputmonitorctrl.h"
-#include "llgroupmgr.h"
-#include "llimview.h"
class LLMenuGL;
-class LLIMFloater;
+class LLFloaterIMSession;
/**
* Class for displaying amount of messages/notifications(unread).
@@ -48,11 +45,11 @@ public:
struct Params : public LLInitParam::Block<Params, LLTextBox::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).
- */
+ * 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();
@@ -120,35 +117,6 @@ protected:
};
/**
- * Class for displaying group's icon in Group chiclet.
- */
-class LLChicletGroupIconCtrl : public LLIconCtrl
-{
-public:
-
- struct Params : public LLInitParam::Block<Params, LLIconCtrl::Params>
- {
- Optional<std::string> default_icon;
-
- Params()
- : default_icon("default_icon", "Generic_Group")
- {}
- };
-
- /**
- * Sets icon, if value is LLUUID::null - default icon will be set.
- */
- virtual void setValue(const LLSD& value );
-
-protected:
-
- LLChicletGroupIconCtrl(const Params& p);
- friend class LLUICtrlFactory;
-
- std::string mDefaultIcon;
-};
-
-/**
* Class for displaying icon in inventory offer chiclet.
*/
class LLChicletInvOfferIconCtrl : public LLChicletAvatarIconCtrl
@@ -182,23 +150,6 @@ private:
};
/**
- * Class for displaying of speaker's voice indicator
- */
-class LLChicletSpeakerCtrl : public LLOutputMonitorCtrl
-{
-public:
-
- struct Params : public LLInitParam::Block<Params, LLOutputMonitorCtrl::Params>
- {
- Params(){};
- };
-protected:
-
- LLChicletSpeakerCtrl(const Params&p);
- friend class LLUICtrlFactory;
-};
-
-/**
* Base class for all chiclets.
*/
class LLChiclet : public LLUICtrl
@@ -213,7 +164,7 @@ public:
Params();
};
- /*virtual*/ ~LLChiclet();
+ virtual ~LLChiclet() {}
/**
* Associates chat session id with chiclet.
@@ -226,26 +177,11 @@ public:
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(
@@ -322,6 +258,7 @@ public:
* 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.
*/
@@ -334,52 +271,11 @@ public:
virtual void setOtherParticipantId(const LLUUID& other_participant_id) { mOtherParticipantId = other_participant_id; }
/**
- * Gets id of person/group user is chatting with.
+ * Enables/disables the counter control for a chiclet.
*/
- virtual LLUUID getOtherParticipantId() { return mOtherParticipantId; }
-
- /**
- * 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;};
-
- /**
- * 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 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();
@@ -394,21 +290,6 @@ public:
*/
virtual bool getShowNewMessagesIcon();
- virtual void draw();
-
- /**
- * Determine whether given ID refers to a group or an IM chat session.
- *
- * This is used when we need to chose what IM chiclet (P2P/group)
- * class to instantiate.
- *
- * @param session_id session ID.
- * @return TYPE_GROUP in case of group chat session,
- * TYPE_IM in case of P2P session,
- * TYPE_UNKNOWN otherwise.
- */
- static EType getIMSessionType(const LLUUID& session_id);
-
/**
* The action taken on mouse down event.
*
@@ -450,8 +331,6 @@ protected:
S32 mDefaultWidth;
LLIconCtrl* mNewMessagesIcon;
- LLChicletNotificationCounterCtrl* mCounterCtrl;
- LLChicletSpeakerCtrl* mSpeakerCtrl;
LLButton* mChicletButton;
/** the id of another participant, either an avatar id or a group id*/
@@ -479,137 +358,6 @@ public:
sFindChicletsSignal;
};
-/**
- * Implements P2P chiclet.
- */
-class LLIMP2PChiclet : public LLIMChiclet
-{
-public:
- 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();
- };
-
- /* virtual */ void setOtherParticipantId(const LLUUID& other_participant_id);
-
- /**
- * Init Speaker Control with speaker's ID
- */
- /*virtual*/ void initSpeakerControl();
-
- /**
- * Returns number of unread messages.
- */
- /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
-
-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.
- */
- virtual void createPopupMenu();
-
- /**
- * Processes clicks on chiclet popup menu.
- */
- virtual void onMenuItemClicked(const LLSD& user_data);
-
- /**
- * 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;
-};
-
-/**
- * Implements AD-HOC chiclet.
- */
-class LLAdHocChiclet : public LLIMChiclet
-{
-public:
- 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();
- };
-
- /**
- * Sets session id.
- * Session ID for group chat is actually Group ID.
- */
- /*virtual*/ void setSessionId(const LLUUID& session_id);
-
- /**
- * Keep Speaker Control with actual speaker's ID
- */
- /*virtual*/ void draw();
-
- /**
- * Init Speaker Control with speaker's ID
- */
- /*virtual*/ void initSpeakerControl();
-
- /**
- * Returns number of unread messages.
- */
- /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
-
-protected:
- LLAdHocChiclet(const Params& p);
- friend class LLUICtrlFactory;
-
- /**
- * 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);
-
- /**
- * Finds a current speaker and resets the SpeakerControl with speaker's ID
- */
- /*virtual*/ void switchToCurrentSpeaker();
-
-private:
-
- LLChicletAvatarIconCtrl* mChicletIconCtrl;
-};
/**
* Chiclet for script floaters.
@@ -631,10 +379,6 @@ public:
/*virtual*/ void setSessionId(const LLUUID& session_id);
- /*virtual*/ void setCounter(S32 counter);
-
- /*virtual*/ S32 getCounter() { return 0; }
-
/**
* Toggle script floater
*/
@@ -680,10 +424,6 @@ public:
/*virtual*/ void setSessionId(const LLUUID& session_id);
- /*virtual*/ void setCounter(S32 counter);
-
- /*virtual*/ S32 getCounter() { return 0; }
-
/**
* Toggle script floater
*/
@@ -708,96 +448,13 @@ private:
};
/**
- * Implements Group chat chiclet.
- */
-class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver
-{
-public:
-
- 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();
- };
-
- /**
- * Sets session id.
- * Session ID for group chat is actually Group ID.
- */
- /*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);
-
- /**
- * Init Speaker Control with speaker's ID
- */
- /*virtual*/ void initSpeakerControl();
-
- /**
- * Returns number of unread messages.
- */
- /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
-
- ~LLIMGroupChiclet();
-
-protected:
- LLIMGroupChiclet(const Params& p);
- friend class LLUICtrlFactory;
-
- /**
- * 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.
- */
- virtual void onMenuItemClicked(const LLSD& user_data);
-
- /**
- * Enables/disables "show session" menu item depending on visible IM floater existence.
- */
- virtual void updateMenuItems();
-
-private:
-
- LLChicletGroupIconCtrl* mChicletIconCtrl;
-};
-
-/**
* Implements notification chiclet. Used to display total amount of unread messages
* across all IM sessions, total amount of system notifications. See EXT-3147 for details
*/
class LLSysWellChiclet : public LLChiclet
{
public:
-
+
struct Params : public LLInitParam::Block<Params, LLChiclet::Params>
{
Optional<LLButton::Params> button;
@@ -843,7 +500,7 @@ protected:
* There is an assumption that it will be called 2*N times to do not change its start state.
* @see FlashToLitTimer
*/
- void changeLitState();
+ void changeLitState(bool blink);
/**
* Displays menu.
@@ -859,86 +516,58 @@ protected:
S32 mMaxDisplayedCount;
bool mIsNewMessagesState;
- FlashToLitTimer* mFlashToLitTimer;
+ LLFlashTimer* 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
{
+ LOG_CLASS(LLNotificationChiclet);
+
friend class LLUICtrlFactory;
public:
struct Params : public LLInitParam::Block<Params, LLSysWellChiclet::Params>{};
-
+
protected:
+ struct ChicletNotificationChannel : public LLNotificationChannel
+ {
+ ChicletNotificationChannel(LLNotificationChiclet* chiclet)
+ : LLNotificationChannel(LLNotificationChannel::Params().filter(filterNotification).name(chiclet->getSessionId().asString()))
+ , mChiclet(chiclet)
+ {
+ // connect counter handlers to the signals
+ connectToChannel("Group Notifications");
+ connectToChannel("Offer");
+ connectToChannel("Notifications");
+ }
+
+ static bool filterNotification(LLNotificationPtr notify);
+ // connect counter updaters to the corresponding signals
+ /*virtual*/ void onAdd(LLNotificationPtr p) { mChiclet->setCounter(++mChiclet->mUreadSystemNotifications); }
+ /*virtual*/ void onDelete(LLNotificationPtr p) { mChiclet->setCounter(--mChiclet->mUreadSystemNotifications); }
+
+ LLNotificationChiclet* const mChiclet;
+ };
+
+ boost::scoped_ptr<ChicletNotificationChannel> mNotificationChannel;
+
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;
};
@@ -1044,9 +673,7 @@ public:
S32 getMinWidth() const { return mMinWidth; }
- S32 getTotalUnreadIMCount();
-
- S32 notifyParent(const LLSD& info);
+ /*virtual*/ S32 notifyParent(const LLSD& info);
/**
* Toggle chiclet by session id ON and toggle OFF all other chiclets.
diff --git a/indra/newview/llchicletbar.cpp b/indra/newview/llchicletbar.cpp
index f1bc51fbe7..a51c844775 100644
--- a/indra/newview/llchicletbar.cpp
+++ b/indra/newview/llchicletbar.cpp
@@ -25,16 +25,10 @@
*/
#include "llviewerprecompiledheaders.h" // must be first include
-
#include "llchicletbar.h"
-// library includes
-#include "llfloaterreg.h"
-#include "lllayoutstack.h"
-
-// newview includes
#include "llchiclet.h"
-#include "llimfloater.h" // for LLIMFloater
+#include "lllayoutstack.h"
#include "llpaneltopinfobar.h"
#include "llsyswellwindow.h"
@@ -57,107 +51,14 @@ LLChicletBar::LLChicletBar(const LLSD&)
: mChicletPanel(NULL),
mToolbarStack(NULL)
{
- // Firstly add our self to IMSession observers, so we catch session events
- // before chiclets do that.
- LLIMMgr::getInstance()->addSessionObserver(this);
-
buildFromFile("panel_chiclet_bar.xml");
}
-LLChicletBar::~LLChicletBar()
-{
- if (!LLSingleton<LLIMMgr>::destroyed())
- {
- LLIMMgr::getInstance()->removeSessionObserver(this);
- }
-}
-
-LLIMChiclet* LLChicletBar::createIMChiclet(const LLUUID& session_id)
-{
- LLIMChiclet::EType im_chiclet_type = LLIMChiclet::getIMSessionType(session_id);
-
- switch (im_chiclet_type)
- {
- case LLIMChiclet::TYPE_IM:
- return getChicletPanel()->createChiclet<LLIMP2PChiclet>(session_id);
- case LLIMChiclet::TYPE_GROUP:
- return getChicletPanel()->createChiclet<LLIMGroupChiclet>(session_id);
- case LLIMChiclet::TYPE_AD_HOC:
- return getChicletPanel()->createChiclet<LLAdHocChiclet>(session_id);
- case LLIMChiclet::TYPE_UNKNOWN:
- break;
- }
-
- return NULL;
-}
-
-//virtual
-void LLChicletBar::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
-{
- 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)
- {
- chiclet->setIMSessionName(name);
- chiclet->setOtherParticipantId(other_participant_id);
-
- LLIMFloater::onIMChicletCreated(session_id);
-
- }
- else
- {
- llwarns << "Could not create chiclet" << llendl;
- }
-}
-
-//virtual
-void LLChicletBar::sessionRemoved(const LLUUID& session_id)
-{
- if(getChicletPanel())
- {
- // IM floater should be closed when session removed and associated chiclet closed
- LLIMFloater* iMfloater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
- if (iMfloater != NULL)
- {
- iMfloater->closeFloater();
- }
-
- getChicletPanel()->removeChiclet(session_id);
- }
-}
-
-void LLChicletBar::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id)
-{
- //this is only needed in case of outgoing ad-hoc/group chat sessions
- LLChicletPanel* chiclet_panel = getChicletPanel();
- if (chiclet_panel)
- {
- //it should be ad-hoc im chiclet or group im chiclet
- LLChiclet* chiclet = chiclet_panel->findChiclet<LLChiclet>(old_session_id);
- if (chiclet) chiclet->setSessionId(new_session_id);
- }
-}
-
-S32 LLChicletBar::getTotalUnreadIMCount()
-{
- return getChicletPanel()->getTotalUnreadIMCount();
-}
-
BOOL LLChicletBar::postBuild()
{
mToolbarStack = getChild<LLLayoutStack>("toolbar_stack");
mChicletPanel = getChild<LLChicletPanel>("chiclet_list");
- showWellButton("im_well", !LLIMWellWindow::getInstance()->isWindowEmpty());
showWellButton("notification_well", !LLNotificationWellWindow::getInstance()->isWindowEmpty());
LLPanelTopInfoBar::instance().setResizeCallback(boost::bind(&LLChicletBar::fitWithTopInfoBar, this));
diff --git a/indra/newview/llchicletbar.h b/indra/newview/llchicletbar.h
index 1427bf95e0..956c82cb77 100644
--- a/indra/newview/llchicletbar.h
+++ b/indra/newview/llchicletbar.h
@@ -28,7 +28,6 @@
#define LL_LLCHICLETBAR_H
#include "llpanel.h"
-#include "llimview.h"
class LLChicletPanel;
class LLIMChiclet;
@@ -38,30 +37,17 @@ class LLLayoutStack;
class LLChicletBar
: public LLSingleton<LLChicletBar>
, public LLPanel
- , public LLIMSessionObserver
{
LOG_CLASS(LLChicletBar);
friend class LLSingleton<LLChicletBar>;
public:
- ~LLChicletBar();
BOOL postBuild();
LLChicletPanel* getChicletPanel() { return mChicletPanel; }
- // 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);
-
- S32 getTotalUnreadIMCount();
-
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent);
- /**
- * Creates IM Chiclet based on session type (IM chat or Group chat)
- */
- LLIMChiclet* createIMChiclet(const LLUUID& session_id);
/**
* Shows/hides panel with specified well button (IM or Notification)
diff --git a/indra/newview/llcommunicationchannel.cpp b/indra/newview/llcommunicationchannel.cpp
new file mode 100644
index 0000000000..0821510645
--- /dev/null
+++ b/indra/newview/llcommunicationchannel.cpp
@@ -0,0 +1,113 @@
+/**
+* @file llcommunicationchannel.cpp
+* @brief Implementation of llcommunicationchannel
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h" // must be first include
+
+#include "llcommunicationchannel.h"
+
+#include <string>
+#include <map>
+
+#include "llagent.h"
+#include "lldate.h"
+#include "llnotifications.h"
+
+
+LLCommunicationChannel::LLCommunicationChannel(const std::string& pName, const std::string& pParentName)
+ : LLNotificationChannel(pName, pParentName, filterByDoNotDisturbStatus)
+ , mHistory()
+{
+}
+
+LLCommunicationChannel::~LLCommunicationChannel()
+{
+}
+
+bool LLCommunicationChannel::filterByDoNotDisturbStatus(LLNotificationPtr)
+{
+ return !gAgent.isDoNotDisturb();
+}
+
+S32 LLCommunicationChannel::getHistorySize() const
+{
+ return mHistory.size();
+}
+
+LLCommunicationChannel::history_list_t::const_iterator LLCommunicationChannel::beginHistory() const
+{
+ return mHistory.begin();
+}
+
+LLCommunicationChannel::history_list_t::const_iterator LLCommunicationChannel::endHistory() const
+{
+ return mHistory.end();
+}
+
+LLCommunicationChannel::history_list_t::iterator LLCommunicationChannel::beginHistory()
+{
+ return mHistory.begin();
+}
+
+LLCommunicationChannel::history_list_t::iterator LLCommunicationChannel::endHistory()
+{
+ return mHistory.end();
+}
+
+void LLCommunicationChannel::clearHistory()
+{
+ mHistory.clear();
+}
+
+void LLCommunicationChannel::removeItemFromHistory(LLNotificationPtr p)
+{
+ //Find the notification and removes it from mHistory
+ for(history_list_t::iterator it = beginHistory(); it != endHistory(); ++it)
+ {
+ if(it->second == p)
+ {
+ mHistory.erase(it);
+ break;
+ }
+ }
+}
+
+void LLCommunicationChannel::onDelete(LLNotificationPtr p)
+{
+ removeItemFromHistory(p);
+}
+
+void LLCommunicationChannel::onFilterFail(LLNotificationPtr pNotificationPtr)
+{
+ std::string notificationType = pNotificationPtr->getType();
+ if ((notificationType == "groupnotify")
+ || (notificationType == "offer")
+ || (notificationType == "notifytoast")
+ && !pNotificationPtr->isCancelled())
+ {
+ mHistory.insert(std::make_pair<LLDate, LLNotificationPtr>(pNotificationPtr->getDate(), pNotificationPtr));
+ }
+}
diff --git a/indra/newview/llcommunicationchannel.h b/indra/newview/llcommunicationchannel.h
new file mode 100644
index 0000000000..0d8f7f4387
--- /dev/null
+++ b/indra/newview/llcommunicationchannel.h
@@ -0,0 +1,66 @@
+/**
+* @file llcommunicationchannel.h
+* @brief Header file for llcommunicationchannel
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+#ifndef LL_LLCOMMUNICATIONCHANNEL_H
+#define LL_LLCOMMUNICATIONCHANNEL_H
+
+#include <string>
+#include <map>
+
+#include "lldate.h"
+#include "llerror.h"
+#include "llnotifications.h"
+
+class LLCommunicationChannel : public LLNotificationChannel
+{
+ LOG_CLASS(LLCommunicationChannel);
+public:
+ LLCommunicationChannel(const std::string& pName, const std::string& pParentName);
+ virtual ~LLCommunicationChannel();
+
+ static bool filterByDoNotDisturbStatus(LLNotificationPtr);
+
+ typedef std::multimap<LLDate, LLNotificationPtr> history_list_t;
+ S32 getHistorySize() const;
+ history_list_t::const_iterator beginHistory() const;
+ history_list_t::const_iterator endHistory() const;
+ history_list_t::iterator beginHistory();
+ history_list_t::iterator endHistory();
+
+ void clearHistory();
+ void removeItemFromHistory(LLNotificationPtr p);
+
+protected:
+ virtual void onDelete(LLNotificationPtr p);
+ virtual void onFilterFail(LLNotificationPtr pNotificationPtr);
+
+private:
+
+ history_list_t mHistory;
+};
+
+#endif // LL_LLCOMMUNICATIONCHANNEL_H
+
diff --git a/indra/newview/llconversationlog.cpp b/indra/newview/llconversationlog.cpp
new file mode 100644
index 0000000000..7883e4cb89
--- /dev/null
+++ b/indra/newview/llconversationlog.cpp
@@ -0,0 +1,615 @@
+/**
+ * @file llconversationlog.h
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llagent.h"
+#include "llavatarnamecache.h"
+#include "llconversationlog.h"
+#include "lldiriterator.h"
+#include "llnotificationsutil.h"
+#include "lltrans.h"
+
+#include <boost/foreach.hpp>
+#include "boost/lexical_cast.hpp"
+
+const int CONVERSATION_LIFETIME = 30; // lifetime of LLConversation is 30 days by spec
+
+struct ConversationParams
+{
+ ConversationParams(time_t time)
+ : mTime(time),
+ mTimestamp(LLConversation::createTimestamp(time))
+ {}
+
+ time_t mTime;
+ std::string mTimestamp;
+ SessionType mConversationType;
+ std::string mConversationName;
+ std::string mHistoryFileName;
+ LLUUID mSessionID;
+ LLUUID mParticipantID;
+ bool mHasOfflineIMs;
+};
+
+/************************************************************************/
+/* LLConversation implementation */
+/************************************************************************/
+
+LLConversation::LLConversation(const ConversationParams& params)
+: mTime(params.mTime),
+ mTimestamp(params.mTimestamp),
+ mConversationType(params.mConversationType),
+ mConversationName(params.mConversationName),
+ mHistoryFileName(params.mHistoryFileName),
+ mSessionID(params.mSessionID),
+ mParticipantID(params.mParticipantID),
+ mHasOfflineIMs(params.mHasOfflineIMs)
+{
+ setListenIMFloaterOpened();
+}
+
+LLConversation::LLConversation(const LLIMModel::LLIMSession& session)
+: mTime(time_corrected()),
+ mTimestamp(createTimestamp(mTime)),
+ mConversationType(session.mSessionType),
+ mConversationName(session.mName),
+ mHistoryFileName(session.mHistoryFileName),
+ mSessionID(session.isOutgoingAdHoc() ? session.generateOutgouigAdHocHash() : session.mSessionID),
+ mParticipantID(session.mOtherParticipantID),
+ mHasOfflineIMs(session.mHasOfflineMessage)
+{
+ setListenIMFloaterOpened();
+}
+
+LLConversation::LLConversation(const LLConversation& conversation)
+{
+ mTime = conversation.getTime();
+ mTimestamp = conversation.getTimestamp();
+ mConversationType = conversation.getConversationType();
+ mConversationName = conversation.getConversationName();
+ mHistoryFileName = conversation.getHistoryFileName();
+ mSessionID = conversation.getSessionID();
+ mParticipantID = conversation.getParticipantID();
+ mHasOfflineIMs = conversation.hasOfflineMessages();
+
+ setListenIMFloaterOpened();
+}
+
+LLConversation::~LLConversation()
+{
+ mIMFloaterShowedConnection.disconnect();
+}
+
+void LLConversation::updateTimestamp()
+{
+ mTime = time_corrected();
+ mTimestamp = createTimestamp(mTime);
+}
+
+void LLConversation::onIMFloaterShown(const LLUUID& session_id)
+{
+ if (mSessionID == session_id)
+ {
+ mHasOfflineIMs = false;
+ }
+}
+
+// static
+const std::string LLConversation::createTimestamp(const time_t& utc_time)
+{
+ std::string timeStr;
+ LLSD substitution;
+ substitution["datetime"] = (S32) utc_time;
+
+ timeStr = "["+LLTrans::getString ("TimeMonth")+"]/["
+ +LLTrans::getString ("TimeDay")+"]/["
+ +LLTrans::getString ("TimeYear")+"] ["
+ +LLTrans::getString ("TimeHour")+"]:["
+ +LLTrans::getString ("TimeMin")+"]";
+
+
+ LLStringUtil::format (timeStr, substitution);
+ return timeStr;
+}
+
+bool LLConversation::isOlderThan(U32 days) const
+{
+ time_t now = time_corrected();
+ U32 age = (U32)((now - mTime) / SEC_PER_DAY); // age of conversation in days
+
+ return age > days;
+}
+
+void LLConversation::setListenIMFloaterOpened()
+{
+ LLFloaterIMSession* floater = LLFloaterIMSession::findInstance(mSessionID);
+
+ bool offline_ims_visible = LLFloaterIMSession::isVisible(floater) && floater->hasFocus();
+
+ // we don't need to listen for im floater with this conversation is opened
+ // if floater is already opened or this conversation doesn't have unread offline messages
+ if (mHasOfflineIMs && !offline_ims_visible)
+ {
+ mIMFloaterShowedConnection = LLFloaterIMSession::setIMFloaterShowedCallback(boost::bind(&LLConversation::onIMFloaterShown, this, _1));
+ }
+ else
+ {
+ mHasOfflineIMs = false;
+ }
+}
+
+/************************************************************************/
+/* LLConversationLogFriendObserver implementation */
+/************************************************************************/
+
+// Note : An LLSingleton like LLConversationLog cannot be an LLFriendObserver
+// at the same time.
+// This is because avatar observers are deleted by the observed object which
+// conflicts with the way LLSingleton are deleted.
+
+class LLConversationLogFriendObserver : public LLFriendObserver
+{
+public:
+ LLConversationLogFriendObserver() {}
+ virtual ~LLConversationLogFriendObserver() {}
+ virtual void changed(U32 mask);
+};
+
+void LLConversationLogFriendObserver::changed(U32 mask)
+{
+ if (mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE))
+ {
+ LLConversationLog::instance().notifyObservers();
+ }
+}
+
+/************************************************************************/
+/* LLConversationLog implementation */
+/************************************************************************/
+
+LLConversationLog::LLConversationLog() :
+ mAvatarNameCacheConnection(),
+ mLoggingEnabled(false)
+{
+ if(gSavedPerAccountSettings.controlExists("KeepConversationLogTranscripts"))
+ {
+ LLControlVariable * keep_log_ctrlp = gSavedPerAccountSettings.getControl("KeepConversationLogTranscripts").get();
+ S32 log_mode = keep_log_ctrlp->getValue();
+ keep_log_ctrlp->getSignal()->connect(boost::bind(&LLConversationLog::enableLogging, this, _2));
+ if (log_mode > 0)
+ {
+ loadFromFile(getFileName());
+
+ enableLogging(log_mode);
+ }
+ }
+}
+
+void LLConversationLog::enableLogging(S32 log_mode)
+{
+ mLoggingEnabled = log_mode > 0;
+ if (log_mode > 0)
+ {
+ mConversations.clear();
+ loadFromFile(getFileName());
+ LLIMMgr::instance().addSessionObserver(this);
+ mNewMessageSignalConnection = LLIMModel::instance().addNewMsgCallback(boost::bind(&LLConversationLog::onNewMessageReceived, this, _1));
+
+ mFriendObserver = new LLConversationLogFriendObserver;
+ LLAvatarTracker::instance().addObserver(mFriendObserver);
+ }
+ else
+ {
+ saveToFile(getFileName());
+
+ LLIMMgr::instance().removeSessionObserver(this);
+ mNewMessageSignalConnection.disconnect();
+ LLAvatarTracker::instance().removeObserver(mFriendObserver);
+ }
+
+ notifyObservers();
+}
+
+void LLConversationLog::logConversation(const LLUUID& session_id, BOOL has_offline_msg)
+{
+ const LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(session_id);
+ LLConversation* conversation = findConversation(session);
+
+ if (session && session->mOtherParticipantID != gAgentID)
+ {
+ if (conversation)
+ {
+ if(has_offline_msg)
+ {
+ updateOfflineIMs(session, has_offline_msg);
+ }
+ updateConversationTimestamp(conversation);
+ }
+ else
+ {
+ createConversation(session);
+ }
+ }
+}
+
+void LLConversationLog::createConversation(const LLIMModel::LLIMSession* session)
+{
+ if (session)
+ {
+ LLConversation conversation(*session);
+ mConversations.push_back(conversation);
+
+ if (LLIMModel::LLIMSession::P2P_SESSION == session->mSessionType)
+ {
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+ mAvatarNameCacheConnection = LLAvatarNameCache::get(session->mOtherParticipantID, boost::bind(&LLConversationLog::onAvatarNameCache, this, _1, _2, session));
+ }
+
+ notifyObservers();
+ }
+}
+
+void LLConversationLog::updateConversationName(const LLIMModel::LLIMSession* session, const std::string& name)
+{
+ if (!session)
+ {
+ return;
+ }
+
+ LLConversation* conversation = findConversation(session);
+ if (conversation)
+ {
+ conversation->setConversationName(name);
+ notifyParticularConversationObservers(conversation->getSessionID(), LLConversationLogObserver::CHANGED_NAME);
+ }
+}
+
+void LLConversationLog::updateOfflineIMs(const LLIMModel::LLIMSession* session, BOOL new_messages)
+{
+ if (!session)
+ {
+ return;
+ }
+
+ LLConversation* conversation = findConversation(session);
+ if (conversation)
+ {
+ conversation->setOfflineMessages(new_messages);
+ notifyParticularConversationObservers(conversation->getSessionID(), LLConversationLogObserver::CHANGED_OfflineIMs);
+ }
+}
+
+void LLConversationLog::updateConversationTimestamp(LLConversation* conversation)
+{
+ if (conversation)
+ {
+ conversation->updateTimestamp();
+ notifyParticularConversationObservers(conversation->getSessionID(), LLConversationLogObserver::CHANGED_TIME);
+ }
+}
+
+LLConversation* LLConversationLog::findConversation(const LLIMModel::LLIMSession* session)
+{
+ if (session)
+ {
+ const LLUUID session_id = session->isOutgoingAdHoc() ? session->generateOutgouigAdHocHash() : session->mSessionID;
+
+ conversations_vec_t::iterator conv_it = mConversations.begin();
+ for(; conv_it != mConversations.end(); ++conv_it)
+ {
+ if (conv_it->getSessionID() == session_id)
+ {
+ return &*conv_it;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+void LLConversationLog::removeConversation(const LLConversation& conversation)
+{
+ conversations_vec_t::iterator conv_it = mConversations.begin();
+ for(; conv_it != mConversations.end(); ++conv_it)
+ {
+ if (conv_it->getSessionID() == conversation.getSessionID() && conv_it->getTime() == conversation.getTime())
+ {
+ mConversations.erase(conv_it);
+ notifyObservers();
+ cache();
+ return;
+ }
+ }
+}
+
+const LLConversation* LLConversationLog::getConversation(const LLUUID& session_id)
+{
+ conversations_vec_t::const_iterator conv_it = mConversations.begin();
+ for(; conv_it != mConversations.end(); ++conv_it)
+ {
+ if (conv_it->getSessionID() == session_id)
+ {
+ return &*conv_it;
+ }
+ }
+
+ return NULL;
+}
+
+void LLConversationLog::addObserver(LLConversationLogObserver* observer)
+{
+ mObservers.insert(observer);
+}
+
+void LLConversationLog::removeObserver(LLConversationLogObserver* observer)
+{
+ mObservers.erase(observer);
+}
+
+void LLConversationLog::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id, BOOL has_offline_msg)
+{
+ logConversation(session_id, has_offline_msg);
+}
+
+void LLConversationLog::cache()
+{
+ if (gSavedPerAccountSettings.getS32("KeepConversationLogTranscripts") > 0)
+ {
+ saveToFile(getFileName());
+ }
+}
+
+void LLConversationLog::getListOfBackupLogs(std::vector<std::string>& list_of_backup_logs)
+{
+ // get Users log directory
+ std::string dirname = gDirUtilp->getPerAccountChatLogsDir();
+
+ // add final OS dependent delimiter
+ dirname += gDirUtilp->getDirDelimiter();
+
+ // create search pattern
+ std::string pattern = "conversation.log.backup*";
+
+ LLDirIterator iter(dirname, pattern);
+ std::string filename;
+ while (iter.next(filename))
+ {
+ list_of_backup_logs.push_back(gDirUtilp->add(dirname, filename));
+ }
+}
+
+void LLConversationLog::deleteBackupLogs()
+{
+ std::vector<std::string> backup_logs;
+ getListOfBackupLogs(backup_logs);
+
+ BOOST_FOREACH(const std::string& fullpath, backup_logs)
+ {
+ LLFile::remove(fullpath);
+ }
+}
+
+bool LLConversationLog::moveLog(const std::string &originDirectory, const std::string &targetDirectory)
+{
+
+ std::string backupFileName;
+ unsigned backupFileCount = 0;
+
+ //Does the file exist in the current path, if it does lets move it
+ if(LLFile::isfile(originDirectory))
+ {
+ //The target directory contains that file already, so lets store it
+ if(LLFile::isfile(targetDirectory))
+ {
+ backupFileName = targetDirectory + ".backup";
+
+ //If needed store backup file as .backup1 etc.
+ while(LLFile::isfile(backupFileName))
+ {
+ ++backupFileCount;
+ backupFileName = targetDirectory + ".backup" + boost::lexical_cast<std::string>(backupFileCount);
+ }
+
+ //Rename the file to its backup name so it is not overwritten
+ LLFile::rename(targetDirectory, backupFileName);
+ }
+
+ //Move the file from the current path to target path
+ if(LLFile::rename(originDirectory, targetDirectory) != 0)
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+std::string LLConversationLog::getFileName()
+{
+ std::string filename = "conversation";
+ return gDirUtilp->getExpandedFilename(LL_PATH_PER_ACCOUNT_CHAT_LOGS, filename) + ".log";
+}
+
+bool LLConversationLog::saveToFile(const std::string& filename)
+{
+ if (!filename.size())
+ {
+ llwarns << "Call log list filename is empty!" << llendl;
+ return false;
+ }
+
+ LLFILE* fp = LLFile::fopen(filename, "wb");
+ if (!fp)
+ {
+ llwarns << "Couldn't open call log list" << filename << llendl;
+ return false;
+ }
+
+ std::string participant_id;
+ std::string conversation_id;
+
+ conversations_vec_t::const_iterator conv_it = mConversations.begin();
+ for (; conv_it != mConversations.end(); ++conv_it)
+ {
+ conv_it->getSessionID().toString(conversation_id);
+ conv_it->getParticipantID().toString(participant_id);
+
+ // examples of two file entries
+ // [1343221177] 0 1 0 John Doe| 7e4ec5be-783f-49f5-71dz-16c58c64c145 4ec62a74-c246-0d25-2af6-846beac2aa55 john.doe|
+ // [1343222639] 2 0 0 Ad-hoc Conference| c3g67c89-c479-4c97-b21d-32869bcfe8rc 68f1c33e-4135-3e3e-a897-8c9b23115c09 Ad-hoc Conference hash597394a0-9982-766d-27b8-c75560213b9a|
+
+ fprintf(fp, "[%lld] %d %d %d %s| %s %s %s|\n",
+ (S64)conv_it->getTime(),
+ (S32)conv_it->getConversationType(),
+ (S32)0,
+ (S32)conv_it->hasOfflineMessages(),
+ conv_it->getConversationName().c_str(),
+ participant_id.c_str(),
+ conversation_id.c_str(),
+ conv_it->getHistoryFileName().c_str());
+ }
+ fclose(fp);
+ return true;
+}
+bool LLConversationLog::loadFromFile(const std::string& filename)
+{
+ if(!filename.size())
+ {
+ llwarns << "Call log list filename is empty!" << llendl;
+ return false;
+ }
+
+ LLFILE* fp = LLFile::fopen(filename, "rb");
+ if (!fp)
+ {
+ llwarns << "Couldn't open call log list" << filename << llendl;
+ return false;
+ }
+
+ char buffer[MAX_STRING];
+ char conv_name_buffer[MAX_STRING];
+ char part_id_buffer[MAX_STRING];
+ char conv_id_buffer[MAX_STRING];
+ char history_file_name[MAX_STRING];
+ S32 has_offline_ims;
+ S32 stype;
+ S64 time;
+ // before CHUI-348 it was a flag of conversation voice state
+ int prereserved_unused;
+
+ while (!feof(fp) && fgets(buffer, MAX_STRING, fp))
+ {
+ conv_name_buffer[0] = '\0';
+ part_id_buffer[0] = '\0';
+ conv_id_buffer[0] = '\0';
+
+ sscanf(buffer, "[%lld] %d %d %d %[^|]| %s %s %[^|]|",
+ &time,
+ &stype,
+ &prereserved_unused,
+ &has_offline_ims,
+ conv_name_buffer,
+ part_id_buffer,
+ conv_id_buffer,
+ history_file_name);
+
+ ConversationParams params((time_t)time);
+ params.mConversationType = (SessionType)stype;
+ params.mHasOfflineIMs = has_offline_ims;
+ params.mConversationName = std::string(conv_name_buffer);
+ params.mParticipantID = LLUUID(part_id_buffer);
+ params.mSessionID = LLUUID(conv_id_buffer);
+ params.mHistoryFileName = std::string(history_file_name);
+
+ LLConversation conversation(params);
+
+ // CHUI-325
+ // The conversation log should be capped to the last 30 days. Conversations with the last utterance
+ // being over 30 days old should be purged from the conversation log text file on login.
+ if (conversation.isOlderThan(CONVERSATION_LIFETIME))
+ {
+ continue;
+ }
+
+ mConversations.push_back(conversation);
+ }
+ fclose(fp);
+
+ LLFile::remove(filename);
+ cache();
+
+ notifyObservers();
+ return true;
+}
+
+void LLConversationLog::notifyObservers()
+{
+ std::set<LLConversationLogObserver*>::const_iterator iter = mObservers.begin();
+ for (; iter != mObservers.end(); ++iter)
+ {
+ (*iter)->changed();
+ }
+}
+
+void LLConversationLog::notifyParticularConversationObservers(const LLUUID& session_id, U32 mask)
+{
+ std::set<LLConversationLogObserver*>::const_iterator iter = mObservers.begin();
+ for (; iter != mObservers.end(); ++iter)
+ {
+ (*iter)->changed(session_id, mask);
+ }
+}
+
+void LLConversationLog::onNewMessageReceived(const LLSD& data)
+{
+ const LLUUID session_id = data["session_id"].asUUID();
+ logConversation(session_id, false);
+}
+
+void LLConversationLog::onAvatarNameCache(const LLUUID& participant_id, const LLAvatarName& av_name, const LLIMModel::LLIMSession* session)
+{
+ mAvatarNameCacheConnection.disconnect();
+ updateConversationName(session, av_name.getCompleteName());
+}
+
+void LLConversationLog::onClearLog()
+{
+ LLNotificationsUtil::add("PreferenceChatClearLog", LLSD(), LLSD(), boost::bind(&LLConversationLog::onClearLogResponse, this, _1, _2));
+}
+
+void LLConversationLog::onClearLogResponse(const LLSD& notification, const LLSD& response)
+{
+ if (0 == LLNotificationsUtil::getSelectedOption(notification, response))
+ {
+ mConversations.clear();
+ notifyObservers();
+ cache();
+ deleteBackupLogs();
+ }
+}
diff --git a/indra/newview/llconversationlog.h b/indra/newview/llconversationlog.h
new file mode 100644
index 0000000000..265b1f0ef0
--- /dev/null
+++ b/indra/newview/llconversationlog.h
@@ -0,0 +1,216 @@
+/**
+ * @file llconversationlog.h
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LLCONVERSATIONLOG_H_
+#define LLCONVERSATIONLOG_H_
+
+#include "llcallingcard.h"
+#include "llfloaterimsession.h"
+#include "llimview.h"
+
+class LLConversationLogObserver;
+struct ConversationParams;
+
+typedef LLIMModel::LLIMSession::SType SessionType;
+
+/*
+ * This class represents a particular session(conversation) of any type(im/voice/p2p/group/...) by storing some of session's data.
+ * Each LLConversation object has a corresponding visual representation in a form of LLConversationLogListItem.
+ */
+class LLConversation
+{
+public:
+
+ LLConversation(const ConversationParams& params);
+ LLConversation(const LLIMModel::LLIMSession& session);
+ LLConversation(const LLConversation& conversation);
+
+ ~LLConversation();
+
+ const SessionType& getConversationType() const { return mConversationType; }
+ const std::string& getConversationName() const { return mConversationName; }
+ const std::string& getHistoryFileName() const { return mHistoryFileName; }
+ const LLUUID& getSessionID() const { return mSessionID; }
+ const LLUUID& getParticipantID() const { return mParticipantID; }
+ const std::string& getTimestamp() const { return mTimestamp; }
+ const time_t& getTime() const { return mTime; }
+ bool hasOfflineMessages() const { return mHasOfflineIMs; }
+
+ void setConversationName(std::string conv_name) { mConversationName = conv_name; }
+ void setOfflineMessages(bool new_messages) { mHasOfflineIMs = new_messages; }
+ bool isOlderThan(U32 days) const;
+
+ /*
+ * updates last interaction time
+ */
+ void updateTimestamp();
+
+ /*
+ * Resets flag of unread offline message to false when im floater with this conversation is opened.
+ */
+ void onIMFloaterShown(const LLUUID& session_id);
+
+ /*
+ * returns string representation(in form of: mm/dd/yyyy hh:mm) of time when conversation was started
+ */
+ static const std::string createTimestamp(const time_t& utc_time);
+
+private:
+
+ /*
+ * If conversation has unread offline messages sets callback for opening LLFloaterIMSession
+ * with this conversation.
+ */
+ void setListenIMFloaterOpened();
+
+ boost::signals2::connection mIMFloaterShowedConnection;
+
+ time_t mTime; // last interaction time
+ SessionType mConversationType;
+ std::string mConversationName;
+ std::string mHistoryFileName;
+ LLUUID mSessionID;
+ LLUUID mParticipantID;
+ bool mHasOfflineIMs;
+ std::string mTimestamp; // last interaction time in form of: mm/dd/yyyy hh:mm
+};
+
+/**
+ * LLConversationLog stores all agent's conversations.
+ * This class is responsible for creating and storing LLConversation objects when im or voice session starts.
+ * Also this class saves/retrieves conversations to/from file.
+ *
+ * Also please note that it may be several conversations with the same sessionID stored in the conversation log.
+ * To distinguish two conversations with the same sessionID it's also needed to compare their creation date.
+ */
+
+class LLConversationLog : public LLSingleton<LLConversationLog>, LLIMSessionObserver
+{
+ friend class LLSingleton<LLConversationLog>;
+public:
+
+ void removeConversation(const LLConversation& conversation);
+
+ /**
+ * Returns first conversation with matched session_id
+ */
+ const LLConversation* getConversation(const LLUUID& session_id);
+ const std::vector<LLConversation>& getConversations() { return mConversations; }
+
+ void addObserver(LLConversationLogObserver* observer);
+ void removeObserver(LLConversationLogObserver* observer);
+
+ // LLIMSessionObserver triggers
+ virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id, BOOL has_offline_msg);
+ virtual void sessionActivated(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) {}; // Stub
+ virtual void sessionRemoved(const LLUUID& session_id){} // Stub
+ virtual void sessionVoiceOrIMStarted(const LLUUID& session_id){}; // Stub
+ virtual void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id){}; // Stub
+
+ void notifyObservers();
+
+ void onNewMessageReceived(const LLSD& data);
+
+ /**
+ * public method which is called on viewer exit to save conversation log
+ */
+ void cache();
+ bool moveLog(const std::string &originDirectory, const std::string &targetDirectory);
+ void getListOfBackupLogs(std::vector<std::string>& list_of_backup_logs);
+ void deleteBackupLogs();
+
+ void onClearLog();
+ void onClearLogResponse(const LLSD& notification, const LLSD& response);
+
+ bool getIsLoggingEnabled() { return mLoggingEnabled; }
+ bool isLogEmpty() { return mConversations.empty(); }
+
+ /**
+ * constructs file name in which conversations log will be saved
+ * file name is conversation.log
+ */
+ std::string getFileName();
+
+private:
+
+ LLConversationLog();
+ virtual ~LLConversationLog()
+ {
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+ }
+
+ void enableLogging(S32 log_mode);
+
+ /**
+ * adds conversation to the conversation list and notifies observers
+ */
+ void logConversation(const LLUUID& session_id, BOOL has_offline_msg);
+
+ void notifyParticularConversationObservers(const LLUUID& session_id, U32 mask);
+
+ bool saveToFile(const std::string& filename);
+ bool loadFromFile(const std::string& filename);
+
+ void onAvatarNameCache(const LLUUID& participant_id, const LLAvatarName& av_name, const LLIMModel::LLIMSession* session);
+
+ void createConversation(const LLIMModel::LLIMSession* session);
+ void updateConversationTimestamp(LLConversation* conversation);
+ void updateConversationName(const LLIMModel::LLIMSession* session, const std::string& name);
+ void updateOfflineIMs(const LLIMModel::LLIMSession* session, BOOL new_messages);
+
+ LLConversation* findConversation(const LLIMModel::LLIMSession* session);
+
+ typedef std::vector<LLConversation> conversations_vec_t;
+ std::vector<LLConversation> mConversations;
+ std::set<LLConversationLogObserver*> mObservers;
+
+ LLFriendObserver* mFriendObserver; // Observer of the LLAvatarTracker instance
+
+ boost::signals2::connection mNewMessageSignalConnection;
+ boost::signals2::connection mAvatarNameCacheConnection;
+
+ bool mLoggingEnabled;
+};
+
+class LLConversationLogObserver
+{
+public:
+
+ enum EConversationChange
+ {
+ CHANGED_TIME = 1, // last interaction time changed
+ CHANGED_NAME = 2, // conversation name changed
+ CHANGED_OfflineIMs = 3
+ };
+
+ virtual ~LLConversationLogObserver(){}
+ virtual void changed() = 0;
+ virtual void changed(const LLUUID& session_id, U32 mask){};
+};
+
+#endif /* LLCONVERSATIONLOG_H_ */
diff --git a/indra/newview/llconversationloglist.cpp b/indra/newview/llconversationloglist.cpp
new file mode 100644
index 0000000000..5ab108b39f
--- /dev/null
+++ b/indra/newview/llconversationloglist.cpp
@@ -0,0 +1,533 @@
+/**
+ * @file llconversationloglist.cpp
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llavataractions.h"
+#include "llagent.h"
+#include "llfloaterreg.h"
+#include "llfloaterconversationpreview.h"
+#include "llgroupactions.h"
+#include "llconversationloglist.h"
+#include "llconversationloglistitem.h"
+#include "llviewermenu.h"
+#include "lltrans.h"
+
+static LLDefaultChildRegistry::Register<LLConversationLogList> r("conversation_log_list");
+
+static LLConversationLogListNameComparator NAME_COMPARATOR;
+static LLConversationLogListDateComparator DATE_COMPARATOR;
+
+LLConversationLogList::LLConversationLogList(const Params& p)
+: LLFlatListViewEx(p),
+ mIsDirty(true)
+{
+ LLConversationLog::instance().addObserver(this);
+
+ // Set up context menu.
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar check_registrar;
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+
+ registrar.add ("Calllog.Action", boost::bind(&LLConversationLogList::onCustomAction, this, _2));
+ check_registrar.add ("Calllog.Check", boost::bind(&LLConversationLogList::isActionChecked,this, _2));
+ enable_registrar.add("Calllog.Enable", boost::bind(&LLConversationLogList::isActionEnabled,this, _2));
+
+ LLToggleableMenu* context_menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>(
+ "menu_conversation_log_gear.xml",
+ gMenuHolder,
+ LLViewerMenuHolderGL::child_registry_t::instance());
+ if(context_menu)
+ {
+ mContextMenu = context_menu->getHandle();
+ }
+
+ mIsFriendsOnTop = gSavedSettings.getBOOL("SortFriendsFirst");
+}
+
+LLConversationLogList::~LLConversationLogList()
+{
+ if (mContextMenu.get())
+ {
+ mContextMenu.get()->die();
+ }
+
+ LLConversationLog::instance().removeObserver(this);
+}
+
+void LLConversationLogList::draw()
+{
+ if (mIsDirty)
+ {
+ refresh();
+ }
+ LLFlatListViewEx::draw();
+}
+
+BOOL LLConversationLogList::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask);
+
+ LLToggleableMenu* context_menu = mContextMenu.get();
+ {
+ context_menu->buildDrawLabels();
+ if (context_menu && size())
+ context_menu->updateParent(LLMenuGL::sMenuContainer);
+ LLMenuGL::showPopup(this, context_menu, x, y);
+ }
+
+ return handled;
+}
+
+void LLConversationLogList::setNameFilter(const std::string& filter)
+{
+ std::string filter_upper = filter;
+ LLStringUtil::toUpper(filter_upper);
+ if (mNameFilter != filter_upper)
+ {
+ mNameFilter = filter_upper;
+ setDirty();
+ }
+}
+
+bool LLConversationLogList::findInsensitive(std::string haystack, const std::string& needle_upper)
+{
+ LLStringUtil::toUpper(haystack);
+ return haystack.find(needle_upper) != std::string::npos;
+}
+
+void LLConversationLogList::sortByName()
+{
+ setComparator(&NAME_COMPARATOR);
+ sort();
+}
+
+void LLConversationLogList::sortByDate()
+{
+ setComparator(&DATE_COMPARATOR);
+ sort();
+}
+
+void LLConversationLogList::toggleSortFriendsOnTop()
+{
+ mIsFriendsOnTop = !mIsFriendsOnTop;
+ gSavedSettings.setBOOL("SortFriendsFirst", mIsFriendsOnTop);
+ sort();
+}
+
+void LLConversationLogList::changed()
+{
+ refresh();
+}
+
+void LLConversationLogList::changed(const LLUUID& session_id, U32 mask)
+{
+ LLConversationLogListItem* item = getConversationLogListItem(session_id);
+
+ if (!item)
+ {
+ return;
+ }
+
+ if (mask & LLConversationLogObserver::CHANGED_TIME)
+ {
+ item->updateTimestamp();
+
+ // if list is sorted by date and a date of some item has changed,
+ // than the whole list should be rebuilt
+ if (E_SORT_BY_DATE == getSortOrder())
+ {
+ mIsDirty = true;
+ }
+ }
+ else if (mask & LLConversationLogObserver::CHANGED_NAME)
+ {
+ item->updateName();
+ // if list is sorted by name and a name of some item has changed,
+ // than the whole list should be rebuilt
+ if (E_SORT_BY_DATE == getSortOrder())
+ {
+ mIsDirty = true;
+ }
+ }
+ else if (mask & LLConversationLogObserver::CHANGED_OfflineIMs)
+ {
+ item->updateOfflineIMs();
+ }
+}
+
+void LLConversationLogList::addNewItem(const LLConversation* conversation)
+{
+ LLConversationLogListItem* item = new LLConversationLogListItem(&*conversation);
+ if (!mNameFilter.empty())
+ {
+ item->highlightNameDate(mNameFilter);
+ }
+ addItem(item, conversation->getSessionID(), ADD_TOP);
+}
+
+void LLConversationLogList::refresh()
+{
+ rebuildList();
+ sort();
+
+ mIsDirty = false;
+}
+
+void LLConversationLogList::rebuildList()
+{
+ const LLConversation * selected_conversationp = getSelectedConversation();
+
+ clear();
+
+ bool have_filter = !mNameFilter.empty();
+ LLConversationLog &log_instance = LLConversationLog::instance();
+
+ const std::vector<LLConversation>& conversations = log_instance.getConversations();
+ std::vector<LLConversation>::const_iterator iter = conversations.begin();
+
+ for (; iter != conversations.end(); ++iter)
+ {
+ bool not_found = have_filter && !findInsensitive(iter->getConversationName(), mNameFilter) && !findInsensitive(iter->getTimestamp(), mNameFilter);
+ if (not_found)
+ continue;
+
+ addNewItem(&*iter);
+ }
+
+ // try to restore selection of item
+ if (NULL != selected_conversationp)
+ {
+ selectItemByUUID(selected_conversationp->getSessionID());
+ }
+
+ bool logging_enabled = log_instance.getIsLoggingEnabled();
+ bool log_empty = log_instance.isLogEmpty();
+ if (!logging_enabled && log_empty)
+ {
+ setNoItemsCommentText(LLTrans::getString("logging_calls_disabled_log_empty"));
+ }
+ else if (!logging_enabled && !log_empty)
+ {
+ setNoItemsCommentText(LLTrans::getString("logging_calls_disabled_log_not_empty"));
+ }
+ else if (logging_enabled && log_empty)
+ {
+ setNoItemsCommentText(LLTrans::getString("logging_calls_enabled_log_empty"));
+ }
+ else if (logging_enabled && !log_empty)
+ {
+ setNoItemsCommentText("");
+ }
+}
+
+void LLConversationLogList::onCustomAction(const LLSD& userdata)
+{
+ const LLConversation * selected_conversationp = getSelectedConversation();
+
+ if (NULL == selected_conversationp)
+ {
+ return;
+ }
+
+ const std::string command_name = userdata.asString();
+ const LLUUID& selected_conversation_participant_id = selected_conversationp->getParticipantID();
+ const LLUUID& selected_conversation_session_id = selected_conversationp->getSessionID();
+ LLIMModel::LLIMSession::SType stype = getSelectedSessionType();
+
+ if ("im" == command_name)
+ {
+ switch (stype)
+ {
+ case LLIMModel::LLIMSession::P2P_SESSION:
+ LLAvatarActions::startIM(selected_conversation_participant_id);
+ break;
+
+ case LLIMModel::LLIMSession::GROUP_SESSION:
+ LLGroupActions::startIM(selected_conversation_session_id);
+ break;
+
+ default:
+ break;
+ }
+ }
+ else if ("call" == command_name)
+ {
+ switch (stype)
+ {
+ case LLIMModel::LLIMSession::P2P_SESSION:
+ LLAvatarActions::startCall(selected_conversation_participant_id);
+ break;
+
+ case LLIMModel::LLIMSession::GROUP_SESSION:
+ LLGroupActions::startCall(selected_conversation_session_id);
+ break;
+
+ default:
+ break;
+ }
+ }
+ else if ("view_profile" == command_name)
+ {
+ switch (stype)
+ {
+ case LLIMModel::LLIMSession::P2P_SESSION:
+ LLAvatarActions::showProfile(selected_conversation_participant_id);
+ break;
+
+ case LLIMModel::LLIMSession::GROUP_SESSION:
+ LLGroupActions::show(selected_conversation_session_id);
+ break;
+
+ default:
+ break;
+ }
+ }
+ else if ("chat_history" == command_name)
+ {
+ LLFloaterReg::showInstance("preview_conversation", selected_conversation_session_id, true);
+ }
+ else if ("offer_teleport" == command_name)
+ {
+ LLAvatarActions::offerTeleport(selected_conversation_participant_id);
+ }
+ else if("add_friend" == command_name)
+ {
+ if (!LLAvatarActions::isFriend(selected_conversation_participant_id))
+ {
+ LLAvatarActions::requestFriendshipDialog(selected_conversation_participant_id);
+ }
+ }
+ else if("remove_friend" == command_name)
+ {
+ if (LLAvatarActions::isFriend(selected_conversation_participant_id))
+ {
+ LLAvatarActions::removeFriendDialog(selected_conversation_participant_id);
+ }
+ }
+ else if ("invite_to_group" == command_name)
+ {
+ LLAvatarActions::inviteToGroup(selected_conversation_participant_id);
+ }
+ else if ("show_on_map" == command_name)
+ {
+ LLAvatarActions::showOnMap(selected_conversation_participant_id);
+ }
+ else if ("share" == command_name)
+ {
+ LLAvatarActions::share(selected_conversation_participant_id);
+ }
+ else if ("pay" == command_name)
+ {
+ LLAvatarActions::pay(selected_conversation_participant_id);
+ }
+ else if ("block" == command_name)
+ {
+ LLAvatarActions::toggleBlock(selected_conversation_participant_id);
+ }
+}
+
+bool LLConversationLogList::isActionEnabled(const LLSD& userdata)
+{
+ const LLConversation * selected_conversationp = getSelectedConversation();
+
+ if (NULL == selected_conversationp || numSelected() > 1)
+ {
+ return false;
+ }
+
+ const std::string command_name = userdata.asString();
+
+ LLIMModel::LLIMSession::SType stype = getSelectedSessionType();
+ const LLUUID& selected_id = selected_conversationp->getParticipantID();
+
+ bool is_p2p = LLIMModel::LLIMSession::P2P_SESSION == stype;
+ bool is_group = LLIMModel::LLIMSession::GROUP_SESSION == stype;
+
+ if ("can_im" == command_name || "can_view_profile" == command_name)
+ {
+ return is_p2p || is_group;
+ }
+ else if ("can_view_chat_history" == command_name)
+ {
+ return true;
+ }
+ else if ("can_call" == command_name)
+ {
+ return (is_p2p || is_group) && LLAvatarActions::canCall();
+ }
+ else if ("add_rem_friend" == command_name ||
+ "can_invite_to_group" == command_name ||
+ "can_share" == command_name ||
+ "can_block" == command_name ||
+ "can_pay" == command_name)
+ {
+ return is_p2p;
+ }
+ else if("can_offer_teleport" == command_name)
+ {
+ return is_p2p && LLAvatarActions::canOfferTeleport(selected_id);
+ }
+ else if ("can_show_on_map" == command_name)
+ {
+ return is_p2p && ((LLAvatarTracker::instance().isBuddyOnline(selected_id) && is_agent_mappable(selected_id)) || gAgent.isGodlike());
+ }
+
+ return false;
+}
+
+bool LLConversationLogList::isActionChecked(const LLSD& userdata)
+{
+ const LLConversation * selected_conversationp = getSelectedConversation();
+
+ if (NULL == selected_conversationp)
+ {
+ return false;
+ }
+
+ const std::string command_name = userdata.asString();
+
+ const LLUUID& selected_id = selected_conversationp->getParticipantID();
+ bool is_p2p = LLIMModel::LLIMSession::P2P_SESSION == getSelectedSessionType();
+
+ if ("is_blocked" == command_name)
+ {
+ return is_p2p && LLAvatarActions::isBlocked(selected_id);
+ }
+ else if ("is_friend" == command_name)
+ {
+ return is_p2p && LLAvatarActions::isFriend(selected_id);
+ }
+ else if ("is_not_friend" == command_name)
+ {
+ return is_p2p && !LLAvatarActions::isFriend(selected_id);
+ }
+
+ return false;
+}
+
+LLIMModel::LLIMSession::SType LLConversationLogList::getSelectedSessionType()
+{
+ const LLConversationLogListItem* item = getSelectedConversationPanel();
+
+ if (item)
+ {
+ return item->getConversation()->getConversationType();
+ }
+
+ return LLIMModel::LLIMSession::NONE_SESSION;
+}
+
+const LLConversationLogListItem* LLConversationLogList::getSelectedConversationPanel()
+{
+ LLPanel* panel = LLFlatListViewEx::getSelectedItem();
+ LLConversationLogListItem* conv_panel = dynamic_cast<LLConversationLogListItem*>(panel);
+
+ return conv_panel;
+}
+
+const LLConversation* LLConversationLogList::getSelectedConversation()
+{
+ const LLConversationLogListItem* panel = getSelectedConversationPanel();
+
+ if (panel)
+ {
+ return panel->getConversation();
+ }
+
+ return NULL;
+}
+
+LLConversationLogListItem* LLConversationLogList::getConversationLogListItem(const LLUUID& session_id)
+{
+ std::vector<LLPanel*> panels;
+ LLFlatListViewEx::getItems(panels);
+ std::vector<LLPanel*>::iterator iter = panels.begin();
+
+ for (; iter != panels.end(); ++iter)
+ {
+ LLConversationLogListItem* item = dynamic_cast<LLConversationLogListItem*>(*iter);
+ if (item && session_id == item->getConversation()->getSessionID())
+ {
+ return item;
+ }
+ }
+
+ return NULL;
+}
+
+LLConversationLogList::ESortOrder LLConversationLogList::getSortOrder()
+{
+ return static_cast<ESortOrder>(gSavedSettings.getU32("CallLogSortOrder"));
+}
+
+bool LLConversationLogListItemComparator::compare(const LLPanel* item1, const LLPanel* item2) const
+{
+ const LLConversationLogListItem* conversation_item1 = dynamic_cast<const LLConversationLogListItem*>(item1);
+ const LLConversationLogListItem* conversation_item2 = dynamic_cast<const LLConversationLogListItem*>(item2);
+
+ if (!conversation_item1 || !conversation_item2)
+ {
+ llerror("conversation_item1 and conversation_item2 cannot be null", 0);
+ return true;
+ }
+
+ return doCompare(conversation_item1, conversation_item2);
+}
+
+bool LLConversationLogListNameComparator::doCompare(const LLConversationLogListItem* conversation1, const LLConversationLogListItem* conversation2) const
+{
+ std::string name1 = conversation1->getConversation()->getConversationName();
+ std::string name2 = conversation2->getConversation()->getConversationName();
+ const LLUUID& id1 = conversation1->getConversation()->getParticipantID();
+ const LLUUID& id2 = conversation2->getConversation()->getParticipantID();
+
+ LLStringUtil::toUpper(name1);
+ LLStringUtil::toUpper(name2);
+
+ bool friends_first = gSavedSettings.getBOOL("SortFriendsFirst");
+ if (friends_first && (LLAvatarActions::isFriend(id1) ^ LLAvatarActions::isFriend(id2)))
+ {
+ return LLAvatarActions::isFriend(id1);
+ }
+
+ return name1 < name2;
+}
+
+bool LLConversationLogListDateComparator::doCompare(const LLConversationLogListItem* conversation1, const LLConversationLogListItem* conversation2) const
+{
+ time_t date1 = conversation1->getConversation()->getTime();
+ time_t date2 = conversation2->getConversation()->getTime();
+ const LLUUID& id1 = conversation1->getConversation()->getParticipantID();
+ const LLUUID& id2 = conversation2->getConversation()->getParticipantID();
+
+ bool friends_first = gSavedSettings.getBOOL("SortFriendsFirst");
+ if (friends_first && (LLAvatarActions::isFriend(id1) ^ LLAvatarActions::isFriend(id2)))
+ {
+ return LLAvatarActions::isFriend(id1);
+ }
+
+ return date1 > date2;
+}
diff --git a/indra/newview/llconversationloglist.h b/indra/newview/llconversationloglist.h
new file mode 100644
index 0000000000..62ec57e09e
--- /dev/null
+++ b/indra/newview/llconversationloglist.h
@@ -0,0 +1,153 @@
+/**
+ * @file llconversationloglist.h
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LLCONVERSATIONLOGLIST_H_
+#define LLCONVERSATIONLOGLIST_H_
+
+#include "llconversationlog.h"
+#include "llflatlistview.h"
+#include "lltoggleablemenu.h"
+
+class LLConversationLogListItem;
+
+/**
+ * List of all agent's conversations. I.e. history of conversations.
+ * This list represents contents of the LLConversationLog.
+ * Each change in LLConversationLog leads to rebuilding this list, so
+ * it's always in actual state.
+ */
+
+class LLConversationLogList: public LLFlatListViewEx, public LLConversationLogObserver
+{
+ LOG_CLASS(LLConversationLogList);
+public:
+
+ typedef enum e_sort_oder{
+ E_SORT_BY_NAME = 0,
+ E_SORT_BY_DATE = 1,
+ } ESortOrder;
+
+ struct Params : public LLInitParam::Block<Params, LLFlatListViewEx::Params>
+ {
+ Params(){};
+ };
+
+ LLConversationLogList(const Params& p);
+ virtual ~LLConversationLogList();
+
+ virtual void draw();
+
+ virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+
+ LLToggleableMenu* getContextMenu() const { return mContextMenu.get(); }
+
+ void addNewItem(const LLConversation* conversation);
+ void setNameFilter(const std::string& filter);
+ void sortByName();
+ void sortByDate();
+ void toggleSortFriendsOnTop();
+ bool getSortFriendsOnTop() const { return mIsFriendsOnTop; }
+
+ /**
+ * Changes from LLConversationLogObserver
+ */
+ virtual void changed();
+ virtual void changed(const LLUUID& session_id, U32 mask);
+
+private:
+
+ void setDirty(bool dirty = true) { mIsDirty = dirty; }
+ void refresh();
+
+ /**
+ * Clears list and re-adds items from LLConverstationLog
+ * If filter is not empty re-adds items which match the filter
+ */
+ void rebuildList();
+
+ bool findInsensitive(std::string haystack, const std::string& needle_upper);
+
+ void onCustomAction (const LLSD& userdata);
+ bool isActionEnabled(const LLSD& userdata);
+ bool isActionChecked(const LLSD& userdata);
+
+ LLIMModel::LLIMSession::SType getSelectedSessionType();
+ const LLConversationLogListItem* getSelectedConversationPanel();
+ const LLConversation* getSelectedConversation();
+ LLConversationLogListItem* getConversationLogListItem(const LLUUID& session_id);
+
+ ESortOrder getSortOrder();
+
+ LLHandle<LLToggleableMenu> mContextMenu;
+ bool mIsDirty;
+ bool mIsFriendsOnTop;
+ std::string mNameFilter;
+};
+
+/**
+ * Abstract comparator for ConversationLogList items
+ */
+class LLConversationLogListItemComparator : public LLFlatListView::ItemComparator
+{
+ LOG_CLASS(LLConversationLogListItemComparator);
+
+public:
+ LLConversationLogListItemComparator() {};
+ virtual ~LLConversationLogListItemComparator() {};
+
+ virtual bool compare(const LLPanel* item1, const LLPanel* item2) const;
+
+protected:
+
+ virtual bool doCompare(const LLConversationLogListItem* conversation1, const LLConversationLogListItem* conversation2) const = 0;
+};
+
+class LLConversationLogListNameComparator : public LLConversationLogListItemComparator
+{
+ LOG_CLASS(LLConversationLogListNameComparator);
+
+public:
+ LLConversationLogListNameComparator() {};
+ virtual ~LLConversationLogListNameComparator() {};
+
+protected:
+
+ virtual bool doCompare(const LLConversationLogListItem* conversation1, const LLConversationLogListItem* conversation2) const;
+};
+
+class LLConversationLogListDateComparator : public LLConversationLogListItemComparator
+{
+ LOG_CLASS(LLConversationLogListDateComparator);
+
+public:
+ LLConversationLogListDateComparator() {};
+ virtual ~LLConversationLogListDateComparator() {};
+
+protected:
+
+ virtual bool doCompare(const LLConversationLogListItem* conversation1, const LLConversationLogListItem* conversation2) const;
+};
+
+#endif /* LLCONVERSATIONLOGLIST_H_ */
diff --git a/indra/newview/llconversationloglistitem.cpp b/indra/newview/llconversationloglistitem.cpp
new file mode 100644
index 0000000000..4e984d603b
--- /dev/null
+++ b/indra/newview/llconversationloglistitem.cpp
@@ -0,0 +1,184 @@
+/**
+ * @file llconversationloglistitem.cpp
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+// llui
+#include "lliconctrl.h"
+#include "lltextbox.h"
+#include "lltextutil.h"
+
+// newview
+#include "llavataractions.h"
+#include "llavatariconctrl.h"
+#include "llconversationlog.h"
+#include "llconversationloglistitem.h"
+#include "llgroupactions.h"
+#include "llgroupiconctrl.h"
+#include "llinventoryicon.h"
+
+LLConversationLogListItem::LLConversationLogListItem(const LLConversation* conversation)
+: LLPanel(),
+ mConversation(conversation),
+ mConversationName(NULL),
+ mConversationDate(NULL)
+{
+ buildFromFile("panel_conversation_log_list_item.xml");
+
+ LLFloaterIMSession* floater = LLFloaterIMSession::findInstance(mConversation->getSessionID());
+
+ bool ims_are_read = LLFloaterIMSession::isVisible(floater) && floater->hasFocus();
+
+ if (mConversation->hasOfflineMessages() && !ims_are_read)
+ {
+ mIMFloaterShowedConnection = LLFloaterIMSession::setIMFloaterShowedCallback(boost::bind(&LLConversationLogListItem::onIMFloaterShown, this, _1));
+ }
+}
+
+LLConversationLogListItem::~LLConversationLogListItem()
+{
+ mIMFloaterShowedConnection.disconnect();
+}
+
+BOOL LLConversationLogListItem::postBuild()
+{
+ initIcons();
+
+ // set conversation name
+ mConversationName = getChild<LLTextBox>("conversation_name");
+ mConversationName->setValue(mConversation->getConversationName());
+
+ // set conversation date and time
+ mConversationDate = getChild<LLTextBox>("date_time");
+ mConversationDate->setValue(mConversation->getTimestamp());
+
+ getChild<LLButton>("delete_btn")->setClickedCallback(boost::bind(&LLConversationLogListItem::onRemoveBtnClicked, this));
+ setDoubleClickCallback(boost::bind(&LLConversationLogListItem::onDoubleClick, this));
+
+ return TRUE;
+}
+
+void LLConversationLogListItem::initIcons()
+{
+ switch (mConversation->getConversationType())
+ {
+ case LLIMModel::LLIMSession::P2P_SESSION:
+ case LLIMModel::LLIMSession::ADHOC_SESSION:
+ {
+ LLAvatarIconCtrl* avatar_icon = getChild<LLAvatarIconCtrl>("avatar_icon");
+ avatar_icon->setVisible(TRUE);
+ avatar_icon->setValue(mConversation->getParticipantID());
+ break;
+ }
+ case LLIMModel::LLIMSession::GROUP_SESSION:
+ {
+ LLGroupIconCtrl* group_icon = getChild<LLGroupIconCtrl>("group_icon");
+ group_icon->setVisible(TRUE);
+ group_icon->setValue(mConversation->getSessionID());
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (mConversation->hasOfflineMessages())
+ {
+ getChild<LLIconCtrl>("unread_ims_icon")->setVisible(TRUE);
+ }
+}
+
+void LLConversationLogListItem::updateTimestamp()
+{
+ mConversationDate->setValue(mConversation->getTimestamp());
+}
+
+void LLConversationLogListItem::updateName()
+{
+ mConversationName->setValue(mConversation->getConversationName());
+}
+
+void LLConversationLogListItem::updateOfflineIMs()
+{
+ getChild<LLIconCtrl>("unread_ims_icon")->setVisible(mConversation->hasOfflineMessages());
+}
+
+void LLConversationLogListItem::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ getChildView("hovered_icon")->setVisible(true);
+ LLPanel::onMouseEnter(x, y, mask);
+}
+
+void LLConversationLogListItem::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ getChildView("hovered_icon")->setVisible(false);
+ LLPanel::onMouseLeave(x, y, mask);
+}
+
+void LLConversationLogListItem::setValue(const LLSD& value)
+{
+ if (!value.isMap() || !value.has("selected"))
+ {
+ return;
+ }
+
+ getChildView("selected_icon")->setVisible(value["selected"]);
+}
+
+void LLConversationLogListItem::onIMFloaterShown(const LLUUID& session_id)
+{
+ if (mConversation->getSessionID() == session_id)
+ {
+ getChild<LLIconCtrl>("unread_ims_icon")->setVisible(FALSE);
+ }
+}
+
+void LLConversationLogListItem::onRemoveBtnClicked()
+{
+ LLConversationLog::instance().removeConversation(*mConversation);
+}
+
+void LLConversationLogListItem::highlightNameDate(const std::string& highlited_text)
+{
+ LLStyle::Params params;
+ LLTextUtil::textboxSetHighlightedVal(mConversationName, params, mConversation->getConversationName(), highlited_text);
+ LLTextUtil::textboxSetHighlightedVal(mConversationDate, params, mConversation->getTimestamp(), highlited_text);
+}
+
+void LLConversationLogListItem::onDoubleClick()
+{
+ switch (mConversation->getConversationType())
+ {
+ case LLIMModel::LLIMSession::P2P_SESSION:
+ LLAvatarActions::startIM(mConversation->getParticipantID());
+ break;
+
+ case LLIMModel::LLIMSession::GROUP_SESSION:
+ LLGroupActions::startIM(mConversation->getSessionID());
+ break;
+
+ default:
+ break;
+ }
+}
diff --git a/indra/newview/llconversationloglistitem.h b/indra/newview/llconversationloglistitem.h
new file mode 100644
index 0000000000..ee28456bbb
--- /dev/null
+++ b/indra/newview/llconversationloglistitem.h
@@ -0,0 +1,86 @@
+/**
+ * @file llconversationloglistitem.h
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LLCONVERSATIONLOGLISTITEM_H_
+#define LLCONVERSATIONLOGLISTITEM_H_
+
+#include "llfloaterimsession.h"
+#include "llpanel.h"
+
+class LLTextBox;
+class LLConversation;
+
+/**
+ * This class is a visual representation of LLConversation, each of which is LLConversationLog entry.
+ * LLConversationLogList consists of these LLConversationLogListItems.
+ * LLConversationLogListItem consists of:
+ * conversaion_type_icon
+ * conversaion_name
+ * conversaion_date
+ * Also LLConversationLogListItem holds pointer to its LLConversationLog.
+ */
+
+class LLConversationLogListItem : public LLPanel
+{
+public:
+ LLConversationLogListItem(const LLConversation* conversation);
+ virtual ~LLConversationLogListItem();
+
+ void onMouseEnter(S32 x, S32 y, MASK mask);
+ void onMouseLeave(S32 x, S32 y, MASK mask);
+
+ virtual void setValue(const LLSD& value);
+
+ virtual BOOL postBuild();
+
+ void onIMFloaterShown(const LLUUID& session_id);
+ void onRemoveBtnClicked();
+
+ const LLConversation* getConversation() const { return mConversation; }
+
+ void highlightNameDate(const std::string& highlited_text);
+
+ void onDoubleClick();
+
+ /**
+ * updates string value of last interaction time from conversation
+ */
+ void updateTimestamp();
+ void updateName();
+ void updateOfflineIMs();
+
+private:
+
+ void initIcons();
+
+ const LLConversation* mConversation;
+
+ LLTextBox* mConversationName;
+ LLTextBox* mConversationDate;
+
+ boost::signals2::connection mIMFloaterShowedConnection;
+};
+
+#endif /* LLCONVERSATIONLOGITEM_H_ */
diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp
new file mode 100644
index 0000000000..c74ce24872
--- /dev/null
+++ b/indra/newview/llconversationmodel.cpp
@@ -0,0 +1,702 @@
+/**
+ * @file llconversationmodel.cpp
+ * @brief Implementation of conversations list
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llagent.h"
+#include "llavatarnamecache.h"
+#include "llavataractions.h"
+#include "llevents.h"
+#include "llfloaterimsession.h"
+#include "llsdutil.h"
+#include "llconversationmodel.h"
+#include "llimview.h" //For LLIMModel
+#include "lltrans.h"
+
+#include <boost/foreach.hpp>
+
+//
+// Conversation items : common behaviors
+//
+
+LLConversationItem::LLConversationItem(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) :
+ LLFolderViewModelItemCommon(root_view_model),
+ mName(display_name),
+ mUUID(uuid),
+ mNeedsRefresh(true),
+ mConvType(CONV_UNKNOWN),
+ mLastActiveTime(0.0),
+ mDisplayModeratorOptions(false),
+ mAvatarNameCacheConnection()
+{
+}
+
+LLConversationItem::LLConversationItem(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) :
+ LLFolderViewModelItemCommon(root_view_model),
+ mName(""),
+ mUUID(uuid),
+ mNeedsRefresh(true),
+ mConvType(CONV_UNKNOWN),
+ mLastActiveTime(0.0),
+ mDisplayModeratorOptions(false),
+ mAvatarNameCacheConnection()
+{
+}
+
+LLConversationItem::LLConversationItem(LLFolderViewModelInterface& root_view_model) :
+ LLFolderViewModelItemCommon(root_view_model),
+ mName(""),
+ mUUID(),
+ mNeedsRefresh(true),
+ mConvType(CONV_UNKNOWN),
+ mLastActiveTime(0.0),
+ mDisplayModeratorOptions(false),
+ mAvatarNameCacheConnection()
+{
+}
+
+LLConversationItem::~LLConversationItem()
+{
+ // Disconnect any previous avatar name cache connection to ensure
+ // that the callback method is not called after destruction
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+}
+
+void LLConversationItem::postEvent(const std::string& event_type, LLConversationItemSession* session, LLConversationItemParticipant* participant)
+{
+ LLUUID session_id = (session ? session->getUUID() : LLUUID());
+ LLUUID participant_id = (participant ? participant->getUUID() : LLUUID());
+ LLSD event(LLSDMap("type", event_type)("session_uuid", session_id)("participant_uuid", participant_id));
+ LLEventPumps::instance().obtain("ConversationsEvents").post(event);
+}
+
+// Virtual action callbacks
+void LLConversationItem::performAction(LLInventoryModel* model, std::string action)
+{
+}
+
+void LLConversationItem::openItem( void )
+{
+}
+
+void LLConversationItem::closeItem( void )
+{
+}
+
+void LLConversationItem::previewItem( void )
+{
+}
+
+void LLConversationItem::showProperties(void)
+{
+}
+
+void LLConversationItem::buildParticipantMenuOptions(menuentry_vec_t& items, U32 flags)
+{
+ if (flags & ITEM_IN_MULTI_SELECTION)
+ {
+ items.push_back(std::string("im"));
+ items.push_back(std::string("offer_teleport"));
+ items.push_back(std::string("voice_call"));
+ items.push_back(std::string("remove_friends"));
+ }
+ else
+ {
+ items.push_back(std::string("view_profile"));
+ items.push_back(std::string("im"));
+ items.push_back(std::string("offer_teleport"));
+ items.push_back(std::string("voice_call"));
+ items.push_back(std::string("chat_history"));
+ items.push_back(std::string("separator_chat_history"));
+ items.push_back(std::string("add_friend"));
+ items.push_back(std::string("remove_friend"));
+ items.push_back(std::string("invite_to_group"));
+ items.push_back(std::string("separator_invite_to_group"));
+ if (static_cast<LLConversationItem*>(mParent)->getType() == CONV_SESSION_NEARBY)
+ items.push_back(std::string("zoom_in"));
+ items.push_back(std::string("map"));
+ items.push_back(std::string("share"));
+ items.push_back(std::string("pay"));
+ items.push_back(std::string("block_unblock"));
+ items.push_back(std::string("MuteText"));
+
+ if ((getType() != CONV_SESSION_1_ON_1) && mDisplayModeratorOptions)
+ {
+ items.push_back(std::string("Moderator Options Separator"));
+ items.push_back(std::string("Moderator Options"));
+ items.push_back(std::string("AllowTextChat"));
+ items.push_back(std::string("moderate_voice_separator"));
+ items.push_back(std::string("ModerateVoiceMuteSelected"));
+ items.push_back(std::string("ModerateVoiceUnMuteSelected"));
+ items.push_back(std::string("ModerateVoiceMute"));
+ items.push_back(std::string("ModerateVoiceUnmute"));
+ }
+ }
+}
+
+// method does subscription to changes in avatar name cache for current session/participant conversation item.
+void LLConversationItem::fetchAvatarName(bool isParticipant /*= true*/)
+{
+ LLUUID item_id = getUUID();
+
+ // item should not be null for participants
+ if (isParticipant)
+ {
+ llassert(item_id.notNull());
+ }
+
+ // disconnect any previous avatar name cache connection
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+
+ // exclude nearby chat item
+ if (item_id.notNull())
+ {
+ // for P2P session item, override it as item of called agent
+ if (CONV_SESSION_1_ON_1 == getType())
+ {
+ item_id = LLIMModel::getInstance()->getOtherParticipantID(item_id);
+ }
+
+ // subscribe on avatar name cache changes for participant and session items
+ mAvatarNameCacheConnection = LLAvatarNameCache::get(item_id, boost::bind(&LLConversationItem::onAvatarNameCache, this, _2));
+ }
+}
+
+//
+// LLConversationItemSession
+//
+
+LLConversationItemSession::LLConversationItemSession(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) :
+ LLConversationItem(display_name,uuid,root_view_model),
+ mIsLoaded(false)
+{
+ mConvType = CONV_SESSION_UNKNOWN;
+}
+
+LLConversationItemSession::LLConversationItemSession(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) :
+ LLConversationItem(uuid,root_view_model)
+{
+ mConvType = CONV_SESSION_UNKNOWN;
+}
+
+bool LLConversationItemSession::hasChildren() const
+{
+ return getChildrenCount() > 0;
+}
+
+void LLConversationItemSession::addParticipant(LLConversationItemParticipant* participant)
+{
+ addChild(participant);
+ mIsLoaded = true;
+ mNeedsRefresh = true;
+ updateName(participant);
+ postEvent("add_participant", this, participant);
+}
+
+void LLConversationItemSession::updateName(LLConversationItemParticipant* participant)
+{
+ EConversationType conversation_type = getType();
+ // We modify the session name only in the case of an ad-hoc session or P2P session, exit otherwise (nothing to do)
+ if ((conversation_type != CONV_SESSION_AD_HOC) && (conversation_type != CONV_SESSION_1_ON_1))
+ {
+ return;
+ }
+
+ // Avoid changing the default name if no participant present yet
+ if (mChildren.size() == 0)
+ {
+ return;
+ }
+
+ uuid_vec_t temp_uuids; // uuids vector for building the added participants' names string
+ if (conversation_type == CONV_SESSION_AD_HOC || conversation_type == CONV_SESSION_1_ON_1)
+ {
+ // Build a string containing the participants UUIDs (minus own agent) and check if ready for display (we don't want "(waiting)" in there)
+ // Note: we don't bind ourselves to the LLAvatarNameCache event as updateParticipantName() is called by
+ // onAvatarNameCache() which is itself attached to the same event.
+
+ // In the case of a P2P conversation, we need to grab the name of the other participant in the session instance itself
+ // as we do not create participants for such a session.
+
+ LLFolderViewModelItem * itemp;
+ BOOST_FOREACH(itemp, mChildren)
+ {
+ LLConversationItem* current_participant = dynamic_cast<LLConversationItem*>(itemp);
+ // Add the avatar uuid to the list (except if it's the own agent uuid)
+ if (current_participant->getUUID() != gAgentID)
+ {
+ LLAvatarName av_name;
+ if (LLAvatarNameCache::get(current_participant->getUUID(), &av_name))
+ {
+ temp_uuids.push_back(current_participant->getUUID());
+
+ if (conversation_type == CONV_SESSION_1_ON_1)
+ {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if (temp_uuids.size() != 0)
+ {
+ std::string new_session_name;
+ LLAvatarActions::buildResidentsString(temp_uuids, new_session_name);
+ renameItem(new_session_name);
+ postEvent("update_session", this, NULL);
+ }
+}
+
+void LLConversationItemSession::removeParticipant(LLConversationItemParticipant* participant)
+{
+ removeChild(participant);
+ mNeedsRefresh = true;
+ updateName(participant);
+ postEvent("remove_participant", this, participant);
+}
+
+void LLConversationItemSession::removeParticipant(const LLUUID& participant_id)
+{
+ LLConversationItemParticipant* participant = findParticipant(participant_id);
+ if (participant)
+ {
+ removeParticipant(participant);
+ }
+}
+
+void LLConversationItemSession::clearParticipants()
+{
+ clearChildren();
+ mIsLoaded = false;
+ mNeedsRefresh = true;
+}
+
+LLConversationItemParticipant* LLConversationItemSession::findParticipant(const LLUUID& participant_id)
+{
+ // This is *not* a general tree parsing algorithm. It assumes that a session contains only
+ // items (LLConversationItemParticipant) that have themselve no children.
+ LLConversationItemParticipant* participant = NULL;
+ child_list_t::iterator iter;
+ for (iter = mChildren.begin(); iter != mChildren.end(); iter++)
+ {
+ participant = dynamic_cast<LLConversationItemParticipant*>(*iter);
+ if (participant->hasSameValue(participant_id))
+ {
+ break;
+ }
+ }
+ return (iter == mChildren.end() ? NULL : participant);
+}
+
+void LLConversationItemSession::setParticipantIsMuted(const LLUUID& participant_id, bool is_muted)
+{
+ LLConversationItemParticipant* participant = findParticipant(participant_id);
+ if (participant)
+ {
+ participant->muteVoice(is_muted);
+ }
+}
+
+void LLConversationItemSession::setParticipantIsModerator(const LLUUID& participant_id, bool is_moderator)
+{
+ LLConversationItemParticipant* participant = findParticipant(participant_id);
+ if (participant)
+ {
+ participant->setIsModerator(is_moderator);
+ }
+}
+
+void LLConversationItemSession::setTimeNow(const LLUUID& participant_id)
+{
+ mLastActiveTime = LLFrameTimer::getElapsedSeconds();
+ mNeedsRefresh = true;
+ LLConversationItemParticipant* participant = findParticipant(participant_id);
+ if (participant)
+ {
+ participant->setTimeNow();
+ }
+}
+
+void LLConversationItemSession::setDistance(const LLUUID& participant_id, F64 dist)
+{
+ LLConversationItemParticipant* participant = findParticipant(participant_id);
+ if (participant)
+ {
+ participant->setDistance(dist);
+ mNeedsRefresh = true;
+ }
+}
+
+void LLConversationItemSession::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+ lldebugs << "LLConversationItemParticipant::buildContextMenu()" << llendl;
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
+
+ if(this->getType() == CONV_SESSION_1_ON_1)
+ {
+ items.push_back(std::string("close_conversation"));
+ items.push_back(std::string("separator_disconnect_from_voice"));
+ buildParticipantMenuOptions(items, flags);
+ }
+ else if(this->getType() == CONV_SESSION_GROUP)
+ {
+ items.push_back(std::string("close_conversation"));
+ addVoiceOptions(items);
+ items.push_back(std::string("chat_history"));
+ items.push_back(std::string("separator_chat_history"));
+ items.push_back(std::string("group_profile"));
+ items.push_back(std::string("activate_group"));
+ items.push_back(std::string("leave_group"));
+ }
+ else if(this->getType() == CONV_SESSION_AD_HOC)
+ {
+ items.push_back(std::string("close_conversation"));
+ addVoiceOptions(items);
+ items.push_back(std::string("chat_history"));
+ }
+
+ hide_context_entries(menu, items, disabled_items);
+}
+
+void LLConversationItemSession::addVoiceOptions(menuentry_vec_t& items)
+{
+ LLVoiceChannel* voice_channel = LLIMModel::getInstance() ? LLIMModel::getInstance()->getVoiceChannel(this->getUUID()) : NULL;
+
+ if(voice_channel != LLVoiceChannel::getCurrentVoiceChannel())
+ {
+ items.push_back(std::string("open_voice_conversation"));
+ }
+ else
+ {
+ items.push_back(std::string("disconnect_from_voice"));
+ }
+}
+
+// The time of activity of a session is the time of the most recent activity, session and participants included
+const bool LLConversationItemSession::getTime(F64& time) const
+{
+ F64 most_recent_time = mLastActiveTime;
+ bool has_time = (most_recent_time > 0.1);
+ LLConversationItemParticipant* participant = NULL;
+ child_list_t::const_iterator iter;
+ for (iter = mChildren.begin(); iter != mChildren.end(); iter++)
+ {
+ participant = dynamic_cast<LLConversationItemParticipant*>(*iter);
+ F64 participant_time;
+ if (participant->getTime(participant_time))
+ {
+ has_time = true;
+ most_recent_time = llmax(most_recent_time,participant_time);
+ }
+ }
+ if (has_time)
+ {
+ time = most_recent_time;
+ }
+ return has_time;
+}
+
+void LLConversationItemSession::dumpDebugData(bool dump_children)
+{
+ // Session info
+ llinfos << "Merov debug : session " << this << ", uuid = " << mUUID << ", name = " << mName << ", is loaded = " << mIsLoaded << llendl;
+ // Children info
+ if (dump_children)
+ {
+ for (child_list_t::iterator iter = mChildren.begin(); iter != mChildren.end(); iter++)
+ {
+ LLConversationItemParticipant* participant = dynamic_cast<LLConversationItemParticipant*>(*iter);
+ if (participant)
+ {
+ participant->dumpDebugData();
+ }
+ }
+ }
+}
+
+// should be invoked only for P2P sessions
+void LLConversationItemSession::onAvatarNameCache(const LLAvatarName& av_name)
+{
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+
+ renameItem(av_name.getDisplayName());
+ postEvent("update_session", this, NULL);
+}
+
+//
+// LLConversationItemParticipant
+//
+
+LLConversationItemParticipant::LLConversationItemParticipant(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) :
+ LLConversationItem(display_name,uuid,root_view_model),
+ mIsModerator(false),
+ mDisplayModeratorLabel(false),
+ mDistToAgent(-1.0)
+{
+ mDisplayName = display_name;
+ mConvType = CONV_PARTICIPANT;
+}
+
+LLConversationItemParticipant::LLConversationItemParticipant(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) :
+ LLConversationItem(uuid,root_view_model),
+ mIsModerator(false),
+ mDisplayModeratorLabel(false),
+ mDistToAgent(-1.0)
+{
+ mConvType = CONV_PARTICIPANT;
+}
+
+void LLConversationItemParticipant::updateName()
+{
+ llassert(getUUID().notNull());
+ if (getUUID().notNull())
+ {
+ LLAvatarName av_name;
+ if (LLAvatarNameCache::get(getUUID(),&av_name))
+ {
+ updateName(av_name);
+ }
+ }
+}
+
+void LLConversationItemParticipant::onAvatarNameCache(const LLAvatarName& av_name)
+{
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+
+ updateName(av_name);
+}
+
+void LLConversationItemParticipant::updateName(const LLAvatarName& av_name)
+{
+ mName = av_name.getUserName();
+ mDisplayName = av_name.getDisplayName();
+
+ if (mDisplayModeratorLabel)
+ {
+ mDisplayName += " " + LLTrans::getString("IM_moderator_label");
+ }
+
+ renameItem(mDisplayName);
+ if (mParent != NULL)
+ {
+ LLConversationItemSession* parent_session = dynamic_cast<LLConversationItemSession*>(mParent);
+ if (parent_session != NULL)
+ {
+ parent_session->requestSort();
+ parent_session->updateName(this);
+ postEvent("update_participant", parent_session, this);
+ }
+ }
+}
+
+void LLConversationItemParticipant::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
+
+ buildParticipantMenuOptions(items, flags);
+
+ hide_context_entries(menu, items, disabled_items);
+}
+
+LLConversationItemSession* LLConversationItemParticipant::getParentSession()
+{
+ LLConversationItemSession* parent_session = NULL;
+ if (hasParent())
+ {
+ parent_session = dynamic_cast<LLConversationItemSession*>(mParent);
+ }
+ return parent_session;
+}
+
+void LLConversationItemParticipant::dumpDebugData()
+{
+ llinfos << "Merov debug : participant, uuid = " << mUUID << ", name = " << mName << ", display name = " << mDisplayName << ", muted = " << isVoiceMuted() << ", moderator = " << mIsModerator << llendl;
+}
+
+void LLConversationItemParticipant::setDisplayModeratorRole(bool displayRole)
+{
+ if (displayRole != mDisplayModeratorLabel)
+ {
+ mDisplayModeratorLabel = displayRole;
+ updateName();
+ }
+}
+
+bool LLConversationItemParticipant::isVoiceMuted()
+{
+ return LLMuteList::getInstance()->isMuted(mUUID, LLMute::flagVoiceChat);
+}
+
+void LLConversationItemParticipant::muteVoice(bool mute_voice)
+{
+ std::string name;
+ gCacheName->getFullName(mUUID, name);
+ LLMuteList * mute_listp = LLMuteList::getInstance();
+ bool voice_already_muted = mute_listp->isMuted(mUUID, name);
+
+ LLMute mute(mUUID, name, LLMute::AGENT);
+ if (voice_already_muted && !mute_voice)
+ {
+ mute_listp->remove(mute);
+ }
+ else if (!voice_already_muted && mute_voice)
+ {
+ mute_listp->add(mute);
+ }
+}
+
+//
+// LLConversationSort
+//
+
+// Comparison operator: returns "true" is a comes before b, "false" otherwise
+bool LLConversationSort::operator()(const LLConversationItem* const& a, const LLConversationItem* const& b) const
+{
+ LLConversationItem::EConversationType type_a = a->getType();
+ LLConversationItem::EConversationType type_b = b->getType();
+
+ if ((type_a == LLConversationItem::CONV_PARTICIPANT) && (type_b == LLConversationItem::CONV_PARTICIPANT))
+ {
+ // If both items are participants
+ U32 sort_order = getSortOrderParticipants();
+ if (sort_order == LLConversationFilter::SO_DATE)
+ {
+ F64 time_a = 0.0;
+ F64 time_b = 0.0;
+ bool has_time_a = a->getTime(time_a);
+ bool has_time_b = b->getTime(time_b);
+ if (has_time_a && has_time_b)
+ {
+ // Most recent comes first
+ return (time_a > time_b);
+ }
+ else if (has_time_a || has_time_b)
+ {
+ // If we have only one time available, the element with time must come first
+ return has_time_a;
+ }
+ // If no time available, we'll default to sort by name at the end of this method
+ }
+ else if (sort_order == LLConversationFilter::SO_DISTANCE)
+ {
+ F64 dist_a = 0.0;
+ F64 dist_b = 0.0;
+ bool has_dist_a = a->getDistanceToAgent(dist_a);
+ bool has_dist_b = b->getDistanceToAgent(dist_b);
+ if (has_dist_a && has_dist_b)
+ {
+ // Closest comes first
+ return (dist_a < dist_b);
+ }
+ else if (has_dist_a || has_dist_b)
+ {
+ // If we have only one distance available, the element with it must come first
+ return has_dist_a;
+ }
+ // If no distance available, we'll default to sort by name at the end of this method
+ }
+ }
+ else if ((type_a > LLConversationItem::CONV_PARTICIPANT) && (type_b > LLConversationItem::CONV_PARTICIPANT))
+ {
+ // If both are sessions
+ U32 sort_order = getSortOrderSessions();
+
+ if (sort_order == LLConversationFilter::SO_DATE)
+ {
+ // Sort by time
+ F64 time_a = 0.0;
+ F64 time_b = 0.0;
+ bool has_time_a = a->getTime(time_a);
+ bool has_time_b = b->getTime(time_b);
+ if (has_time_a && has_time_b)
+ {
+ // Most recent comes first
+ return (time_a > time_b);
+ }
+ else if (has_time_a || has_time_b)
+ {
+ // If we have only one time available, the element with time must come first
+ return has_time_a;
+ }
+ // If no time available, we'll default to sort by name at the end of this method
+ }
+ else
+ {
+ if ((type_a == LLConversationItem::CONV_SESSION_NEARBY) || (type_b == LLConversationItem::CONV_SESSION_NEARBY))
+ {
+ // If one is the nearby session, put nearby session *always* last
+ return (type_b == LLConversationItem::CONV_SESSION_NEARBY);
+ }
+ else if (sort_order == LLConversationFilter::SO_SESSION_TYPE)
+ {
+ if (type_a != type_b)
+ {
+ // Lowest types come first. See LLConversationItem definition of types
+ return (type_a < type_b);
+ }
+ // If types are identical, we'll default to sort by name at the end of this method
+ }
+ }
+ }
+ else
+ {
+ // If one item is a participant and the other a session, the session comes before the participant
+ // so we simply compare the type
+ // Notes: as a consequence, CONV_UNKNOWN (which should never get created...) always come first
+ return (type_a > type_b);
+ }
+ // By default, in all other possible cases (including sort order type LLConversationFilter::SO_NAME of course),
+ // we sort by name
+ S32 compare = LLStringUtil::compareDict(a->getName(), b->getName());
+ return (compare < 0);
+}
+
+//
+// LLConversationViewModel
+//
+
+void LLConversationViewModel::sort(LLFolderViewFolder* folder)
+{
+ base_t::sort(folder);
+}
+
+// EOF
diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h
new file mode 100755
index 0000000000..8766585049
--- /dev/null
+++ b/indra/newview/llconversationmodel.h
@@ -0,0 +1,314 @@
+/**
+ * @file llconversationmodel.h
+ * @brief Implementation of conversations list
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLCONVERSATIONMODEL_H
+#define LL_LLCONVERSATIONMODEL_H
+
+#include <boost/signals2.hpp>
+
+#include "llavatarname.h"
+#include "../llui/llfolderviewitem.h"
+#include "../llui/llfolderviewmodel.h"
+#include "llviewerfoldertype.h"
+
+// Implementation of conversations list
+
+class LLConversationItem;
+class LLConversationItemSession;
+class LLConversationItemParticipant;
+
+typedef std::map<LLUUID, LLConversationItem*> conversations_items_map;
+typedef std::map<LLUUID, LLFolderViewItem*> conversations_widgets_map;
+
+typedef std::vector<std::string> menuentry_vec_t;
+
+// Conversation items: we hold a list of those and create an LLFolderViewItem widget for each
+// that we tuck into the mConversationsListPanel.
+class LLConversationItem : public LLFolderViewModelItemCommon
+{
+public:
+ enum EConversationType
+ {
+ CONV_UNKNOWN = 0,
+ CONV_PARTICIPANT = 1,
+ CONV_SESSION_NEARBY = 2, // The order counts here as it is used to sort sessions by type
+ CONV_SESSION_1_ON_1 = 3,
+ CONV_SESSION_AD_HOC = 4,
+ CONV_SESSION_GROUP = 5,
+ CONV_SESSION_UNKNOWN = 6
+ };
+
+ LLConversationItem(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);
+ LLConversationItem(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);
+ LLConversationItem(LLFolderViewModelInterface& root_view_model);
+ virtual ~LLConversationItem();
+
+ // Stub those things we won't really be using in this conversation context
+ virtual const std::string& getName() const { return mName; }
+ virtual const std::string& getDisplayName() const { return mName; }
+ virtual const std::string& getSearchableName() const { return mName; }
+ virtual const LLUUID& getUUID() const { return mUUID; }
+ virtual time_t getCreationDate() const { return 0; }
+ virtual LLPointer<LLUIImage> getIcon() const { return NULL; }
+ virtual LLPointer<LLUIImage> getOpenIcon() const { return getIcon(); }
+ virtual LLFontGL::StyleFlags getLabelStyle() const { return LLFontGL::NORMAL; }
+ virtual std::string getLabelSuffix() const { return LLStringUtil::null; }
+ virtual BOOL isItemRenameable() const { return TRUE; }
+ virtual BOOL renameItem(const std::string& new_name) { mName = new_name; mNeedsRefresh = true; return TRUE; }
+ virtual BOOL isItemMovable( void ) const { return FALSE; }
+ virtual BOOL isItemRemovable( void ) const { return FALSE; }
+ virtual BOOL isItemInTrash( void) const { return FALSE; }
+ virtual BOOL removeItem() { return FALSE; }
+ virtual void removeBatch(std::vector<LLFolderViewModelItem*>& batch) { }
+ virtual void move( LLFolderViewModelItem* parent_listener ) { }
+ virtual BOOL isItemCopyable() const { return FALSE; }
+ virtual BOOL copyToClipboard() const { return FALSE; }
+ virtual BOOL cutToClipboard() const { return FALSE; }
+ virtual BOOL isClipboardPasteable() const { return FALSE; }
+ virtual void pasteFromClipboard() { }
+ virtual void pasteLinkFromClipboard() { }
+ virtual void buildContextMenu(LLMenuGL& menu, U32 flags) { }
+ virtual BOOL isUpToDate() const { return TRUE; }
+ virtual bool hasChildren() const { return FALSE; }
+
+ virtual bool potentiallyVisible() { return true; }
+ virtual bool filter( LLFolderViewFilter& filter) { return false; }
+ virtual bool descendantsPassedFilter(S32 filter_generation = -1) { return true; }
+ virtual void setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0) { }
+ virtual bool passedFilter(S32 filter_generation = -1) { return true; }
+
+ // The action callbacks
+ virtual void performAction(LLInventoryModel* model, std::string action);
+ virtual void openItem( void );
+ virtual void closeItem( void );
+ virtual void previewItem( void );
+ virtual void selectItem(void) { }
+ virtual void showProperties(void);
+
+ // Methods used in sorting (see LLConversationSort::operator())
+ EConversationType const getType() const { return mConvType; }
+ virtual const bool getTime(F64& time) const { time = mLastActiveTime; return (time > 0.1); }
+ virtual const bool getDistanceToAgent(F64& distance) const { return false; }
+
+ // This method will be called to determine if a drop can be
+ // performed, and will set drop to TRUE if a drop is
+ // requested.
+ // Returns TRUE if a drop is possible/happened, FALSE otherwise.
+ virtual BOOL dragOrDrop(MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ std::string& tooltip_msg) { return FALSE; }
+
+// bool hasSameValues(std::string name, const LLUUID& uuid) { return ((name == mName) && (uuid == mUUID)); }
+ bool hasSameValue(const LLUUID& uuid) { return (uuid == mUUID); }
+
+ void resetRefresh() { mNeedsRefresh = false; }
+ bool needsRefresh() { return mNeedsRefresh; }
+
+ void postEvent(const std::string& event_type, LLConversationItemSession* session, LLConversationItemParticipant* participant);
+
+ void buildParticipantMenuOptions(menuentry_vec_t& items, U32 flags);
+
+ void fetchAvatarName(bool isParticipant = true); // fetch and update the avatar name
+
+protected:
+ virtual void onAvatarNameCache(const LLAvatarName& av_name) {}
+
+ std::string mName; // Name of the session or the participant
+ LLUUID mUUID; // UUID of the session or the participant
+ EConversationType mConvType; // Type of conversation item
+ bool mNeedsRefresh; // Flag signaling to the view that something changed for this item
+ F64 mLastActiveTime;
+ bool mDisplayModeratorOptions;
+ boost::signals2::connection mAvatarNameCacheConnection;
+};
+
+class LLConversationItemSession : public LLConversationItem
+{
+public:
+ LLConversationItemSession(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);
+ LLConversationItemSession(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);
+
+ /*virtual*/ bool hasChildren() const;
+ LLPointer<LLUIImage> getIcon() const { return NULL; }
+ void setSessionID(const LLUUID& session_id) { mUUID = session_id; mNeedsRefresh = true; }
+ void addParticipant(LLConversationItemParticipant* participant);
+ void updateName(LLConversationItemParticipant* participant);
+ void removeParticipant(LLConversationItemParticipant* participant);
+ void removeParticipant(const LLUUID& participant_id);
+ void clearParticipants();
+ LLConversationItemParticipant* findParticipant(const LLUUID& participant_id);
+
+ void setParticipantIsMuted(const LLUUID& participant_id, bool is_muted);
+ void setParticipantIsModerator(const LLUUID& participant_id, bool is_moderator);
+ void setTimeNow(const LLUUID& participant_id);
+ void setDistance(const LLUUID& participant_id, F64 dist);
+
+ bool isLoaded() { return mIsLoaded; }
+
+ void buildContextMenu(LLMenuGL& menu, U32 flags);
+ void addVoiceOptions(menuentry_vec_t& items);
+ virtual const bool getTime(F64& time) const;
+
+ void dumpDebugData(bool dump_children = false);
+
+private:
+ /*virtual*/ void onAvatarNameCache(const LLAvatarName& av_name);
+
+ bool mIsLoaded; // true if at least one participant has been added to the session, false otherwise
+};
+
+class LLConversationItemParticipant : public LLConversationItem
+{
+public:
+ LLConversationItemParticipant(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);
+ LLConversationItemParticipant(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);
+
+ virtual const std::string& getDisplayName() const { return mDisplayName; }
+
+ bool isVoiceMuted();
+ bool isModerator() const { return mIsModerator; }
+ void muteVoice(bool mute_voice);
+ void setIsModerator(bool is_moderator) { mIsModerator = is_moderator; mNeedsRefresh = true; }
+ void setTimeNow() { mLastActiveTime = LLFrameTimer::getElapsedSeconds(); mNeedsRefresh = true; }
+ void setDistance(F64 dist) { mDistToAgent = dist; mNeedsRefresh = true; }
+
+ void buildContextMenu(LLMenuGL& menu, U32 flags);
+
+ virtual const bool getDistanceToAgent(F64& dist) const { dist = mDistToAgent; return (dist >= 0.0); }
+
+ void updateName(); // get from the cache (do *not* fetch) and update the avatar name
+ LLConversationItemSession* getParentSession();
+
+ void dumpDebugData();
+ void setModeratorOptionsVisible(bool visible) { mDisplayModeratorOptions = visible; }
+ void setDisplayModeratorRole(bool displayRole);
+
+private:
+ void onAvatarNameCache(const LLAvatarName& av_name); // callback used by fetchAvatarName
+ void updateName(const LLAvatarName& av_name);
+
+ bool mIsMuted; // default is false
+ bool mIsModerator; // default is false
+ bool mDisplayModeratorLabel; // default is false
+ std::string mDisplayName;
+ F64 mDistToAgent; // Distance to the agent. A negative (meaningless) value means the distance has not been set.
+ boost::signals2::connection mAvatarNameCacheConnection;
+};
+
+// We don't want to ever filter conversations but we need to declare that class to create a conversation view model.
+// We just stubb everything for the moment.
+class LLConversationFilter : public LLFolderViewFilter
+{
+public:
+
+ enum ESortOrderType
+ {
+ SO_NAME = 0, // Sort by name
+ SO_DATE = 0x1, // Sort by date (most recent)
+ SO_SESSION_TYPE = 0x2, // Sort by type (valid only for sessions)
+ SO_DISTANCE = 0x3, // Sort by distance (valid only for participants in nearby chat)
+ };
+ // Default sort order is by type for sessions and by date for participants
+ static const U32 SO_DEFAULT = (SO_SESSION_TYPE << 16) | (SO_DATE);
+
+ LLConversationFilter() { mEmpty = ""; }
+ ~LLConversationFilter() {}
+
+ bool check(const LLFolderViewModelItem* item) { return true; }
+ bool checkFolder(const LLFolderViewModelItem* folder) const { return true; }
+ void setEmptyLookupMessage(const std::string& message) { }
+ std::string getEmptyLookupMessage() const { return mEmpty; }
+ bool showAllResults() const { return true; }
+ std::string::size_type getStringMatchOffset(LLFolderViewModelItem* item) const { return std::string::npos; }
+ std::string::size_type getFilterStringSize() const { return 0; }
+
+ bool isActive() const { return false; }
+ bool isModified() const { return false; }
+ void clearModified() { }
+ const std::string& getName() const { return mEmpty; }
+ const std::string& getFilterText() { return mEmpty; }
+ void setModified(EFilterModified behavior = FILTER_RESTART) { }
+
+ void setFilterCount(S32 count) { }
+ S32 getFilterCount() const { return 0; }
+ void decrementFilterCount() { }
+
+ bool isDefault() const { return true; }
+ bool isNotDefault() const { return false; }
+ void markDefault() { }
+ void resetDefault() { }
+
+ S32 getCurrentGeneration() const { return 0; }
+ S32 getFirstSuccessGeneration() const { return 0; }
+ S32 getFirstRequiredGeneration() const { return 0; }
+private:
+ std::string mEmpty;
+};
+
+class LLConversationSort
+{
+public:
+ LLConversationSort(U32 order = LLConversationFilter::SO_DEFAULT) : mSortOrder(order) { }
+
+ // 16 LSB bits used for participants, 16 MSB bits for sessions
+ U32 getSortOrderSessions() const { return ((mSortOrder >> 16) & 0xFFFF); }
+ U32 getSortOrderParticipants() const { return (mSortOrder & 0xFFFF); }
+ void setSortOrderSessions(LLConversationFilter::ESortOrderType session) { mSortOrder = ((session & 0xFFFF) << 16) | (mSortOrder & 0xFFFF); }
+ void setSortOrderParticipants(LLConversationFilter::ESortOrderType participant) { mSortOrder = (mSortOrder & 0xFFFF0000) | (participant & 0xFFFF); }
+
+ bool operator()(const LLConversationItem* const& a, const LLConversationItem* const& b) const;
+ operator U32() const { return mSortOrder; }
+private:
+ // Note: we're treating this value as a sort order bitmask as done in other places in the code (e.g. inventory)
+ U32 mSortOrder;
+};
+
+class LLConversationViewModel
+: public LLFolderViewModel<LLConversationSort, LLConversationItem, LLConversationItem, LLConversationFilter>
+{
+public:
+ typedef LLFolderViewModel<LLConversationSort, LLConversationItem, LLConversationItem, LLConversationFilter> base_t;
+
+ void sort(LLFolderViewFolder* folder);
+ bool contentsReady() { return true; } // *TODO : we need to check that participants names are available somewhat
+ bool startDrag(std::vector<LLFolderViewModelItem*>& items) { return false; } // We do not allow drag of conversation items
+
+private:
+};
+
+// Utility function to hide all entries except those in the list
+// Can be called multiple times on the same menu (e.g. if multiple items
+// are selected). If "append" is false, then only common enabled items
+// are set as enabled.
+
+//(defined in inventorybridge.cpp)
+//TODO: Gilbert Linden - Refactor to make this function non-global
+void hide_context_entries(LLMenuGL& menu,
+ const menuentry_vec_t &entries_to_show,
+ const menuentry_vec_t &disabled_entries);
+
+#endif // LL_LLCONVERSATIONMODEL_H
diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp
new file mode 100755
index 0000000000..956abcd586
--- /dev/null
+++ b/indra/newview/llconversationview.cpp
@@ -0,0 +1,696 @@
+/**
+ * @file llconversationview.cpp
+ * @brief Implementation of conversations list widgets and views
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llconversationview.h"
+
+#include <boost/bind.hpp>
+#include "llagentdata.h"
+#include "llconversationmodel.h"
+#include "llfloaterimsession.h"
+#include "llfloaterimnearbychat.h"
+#include "llfloaterimsessiontab.h"
+#include "llfloaterimcontainer.h"
+#include "llfloaterreg.h"
+#include "llgroupiconctrl.h"
+#include "lluictrlfactory.h"
+#include "lltoolbarview.h"
+
+//
+// Implementation of conversations list session widgets
+//
+static LLDefaultChildRegistry::Register<LLConversationViewSession> r_conversation_view_session("conversation_view_session");
+
+const LLColor4U DEFAULT_WHITE(255, 255, 255);
+
+class LLNearbyVoiceClientStatusObserver : public LLVoiceClientStatusObserver
+{
+public:
+
+ LLNearbyVoiceClientStatusObserver(LLConversationViewSession* conv)
+ : conversation(conv)
+ {}
+
+ virtual void onChange(EStatusType status, const std::string &channelURI, bool proximal)
+ {
+ conversation->showVoiceIndicator(conversation
+ && status != STATUS_JOINING
+ && status != STATUS_LEFT_CHANNEL
+ && LLVoiceClient::getInstance()->voiceEnabled()
+ && LLVoiceClient::getInstance()->isVoiceWorking());
+ }
+
+private:
+ LLConversationViewSession* conversation;
+};
+
+LLConversationViewSession::Params::Params() :
+ container()
+{}
+
+LLConversationViewSession::LLConversationViewSession(const LLConversationViewSession::Params& p):
+ LLFolderViewFolder(p),
+ mContainer(p.container),
+ mItemPanel(NULL),
+ mCallIconLayoutPanel(NULL),
+ mSessionTitle(NULL),
+ mSpeakingIndicator(NULL),
+ mVoiceClientObserver(NULL),
+ mCollapsedMode(false),
+ mHasArrow(true),
+ mIsInActiveVoiceChannel(false),
+ mFlashStateOn(false),
+ mFlashStarted(false)
+{
+ mFlashTimer = new LLFlashTimer();
+}
+
+LLConversationViewSession::~LLConversationViewSession()
+{
+ mActiveVoiceChannelConnection.disconnect();
+
+ if(LLVoiceClient::instanceExists() && mVoiceClientObserver)
+ {
+ LLVoiceClient::getInstance()->removeObserver(mVoiceClientObserver);
+ }
+
+ mFlashTimer->unset();
+}
+
+void LLConversationViewSession::setFlashState(bool flash_state)
+{
+ if (flash_state && !mFlashStateOn)
+ {
+ // flash chat toolbar button if scrolled out of sight (because flashing will not be visible)
+ if (mContainer->isScrolledOutOfSight(this))
+ {
+ gToolBarView->flashCommand(LLCommandId("chat"), true);
+ }
+ }
+
+ mFlashStateOn = flash_state;
+ mFlashStarted = false;
+ mFlashTimer->stopFlashing();
+}
+
+void LLConversationViewSession::startFlashing()
+{
+ if (mFlashStateOn && !mFlashStarted)
+ {
+ mFlashStarted = true;
+ mFlashTimer->startFlashing();
+ }
+}
+
+bool LLConversationViewSession::isHighlightAllowed()
+{
+ return mFlashStateOn || mIsSelected;
+}
+
+bool LLConversationViewSession::isHighlightActive()
+{
+ return (mFlashStateOn ? (mFlashTimer->isFlashingInProgress() ? mFlashTimer->isCurrentlyHighlighted() : true) : mIsCurSelection);
+}
+
+BOOL LLConversationViewSession::postBuild()
+{
+ LLFolderViewItem::postBuild();
+
+ mItemPanel = LLUICtrlFactory::getInstance()->createFromFile<LLPanel>("panel_conversation_list_item.xml", NULL, LLPanel::child_registry_t::instance());
+ addChild(mItemPanel);
+
+ mCallIconLayoutPanel = mItemPanel->getChild<LLPanel>("call_icon_panel");
+ mSessionTitle = mItemPanel->getChild<LLTextBox>("conversation_title");
+
+ mActiveVoiceChannelConnection = LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLConversationViewSession::onCurrentVoiceSessionChanged, this, _1));
+ mSpeakingIndicator = getChild<LLOutputMonitorCtrl>("speaking_indicator");
+
+ LLConversationItem* vmi = dynamic_cast<LLConversationItem*>(getViewModelItem());
+ if (vmi)
+ {
+ switch(vmi->getType())
+ {
+ case LLConversationItem::CONV_PARTICIPANT:
+ case LLConversationItem::CONV_SESSION_1_ON_1:
+ {
+ LLIMModel::LLIMSession* session= LLIMModel::instance().findIMSession(vmi->getUUID());
+ if (session)
+ {
+ LLAvatarIconCtrl* icon = mItemPanel->getChild<LLAvatarIconCtrl>("avatar_icon");
+ icon->setVisible(true);
+ icon->setValue(session->mOtherParticipantID);
+ mSpeakingIndicator->setSpeakerId(gAgentID, session->mSessionID, true);
+ mHasArrow = false;
+ }
+ break;
+ }
+ case LLConversationItem::CONV_SESSION_AD_HOC:
+ {
+ LLGroupIconCtrl* icon = mItemPanel->getChild<LLGroupIconCtrl>("group_icon");
+ icon->setVisible(true);
+ mSpeakingIndicator->setSpeakerId(gAgentID, vmi->getUUID(), true);
+ break;
+ }
+ case LLConversationItem::CONV_SESSION_GROUP:
+ {
+ LLGroupIconCtrl* icon = mItemPanel->getChild<LLGroupIconCtrl>("group_icon");
+ icon->setVisible(true);
+ icon->setValue(vmi->getUUID());
+ mSpeakingIndicator->setSpeakerId(gAgentID, vmi->getUUID(), true);
+ break;
+ }
+ case LLConversationItem::CONV_SESSION_NEARBY:
+ {
+ LLIconCtrl* icon = mItemPanel->getChild<LLIconCtrl>("nearby_chat_icon");
+ icon->setVisible(true);
+ mSpeakingIndicator->setSpeakerId(gAgentID, LLUUID::null, true);
+ mIsInActiveVoiceChannel = true;
+ if(LLVoiceClient::instanceExists())
+ {
+ LLNearbyVoiceClientStatusObserver* mVoiceClientObserver = new LLNearbyVoiceClientStatusObserver(this);
+ LLVoiceClient::getInstance()->addObserver(mVoiceClientObserver);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ refresh();
+
+ return TRUE;
+}
+
+void LLConversationViewSession::draw()
+{
+ getViewModelItem()->update();
+
+ const LLFolderViewItem::Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
+ const BOOL show_context = (getRoot() ? getRoot()->getShowSelectionContext() : FALSE);
+
+ // Indicate that flash can start (moot operation if already started, done or not flashing)
+ startFlashing();
+
+ // draw highlight for selected items
+ drawHighlight(show_context, true, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor);
+
+ // Draw children if root folder, or any other folder that is open. Do not draw children when animating to closed state or you get rendering overlap.
+ bool draw_children = getRoot() == static_cast<LLFolderViewFolder*>(this) || isOpen();
+
+ for (folders_t::iterator iter = mFolders.begin();
+ iter != mFolders.end();)
+ {
+ folders_t::iterator fit = iter++;
+ (*fit)->setVisible(draw_children);
+ }
+ for (items_t::iterator iter = mItems.begin();
+ iter != mItems.end();)
+ {
+ items_t::iterator iit = iter++;
+ (*iit)->setVisible(draw_children);
+ }
+
+ // we don't draw the open folder arrow in minimized mode
+ if (mHasArrow && !mCollapsedMode)
+ {
+ // update the rotation angle of open folder arrow
+ updateLabelRotation();
+ drawOpenFolderArrow(default_params, sFgColor);
+ }
+
+ refresh();
+
+ LLView::draw();
+}
+
+BOOL LLConversationViewSession::handleMouseDown( S32 x, S32 y, MASK mask )
+{
+ //Will try to select a child node and then itself (if a child was not selected)
+ BOOL result = LLFolderViewFolder::handleMouseDown(x, y, mask);
+
+ //This node (conversation) was selected and a child (participant) was not
+ if(result && getRoot())
+ {
+ selectConversationItem();
+ }
+
+ return result;
+}
+
+BOOL LLConversationViewSession::handleRightMouseDown( S32 x, S32 y, MASK mask )
+{
+ BOOL result = LLFolderViewFolder::handleRightMouseDown(x, y, mask);
+
+ if(result)
+ {
+ selectConversationItem();
+ }
+
+ return result;
+}
+
+void LLConversationViewSession::selectConversationItem()
+{
+ if(getRoot()->getCurSelectedItem() == this)
+ {
+ LLConversationItem* item = dynamic_cast<LLConversationItem *>(getViewModelItem());
+ LLUUID session_id = item? item->getUUID() : LLUUID();
+
+ LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container");
+ im_container->flashConversationItemWidget(session_id,false);
+ im_container->selectConversationPair(session_id, false);
+ im_container->collapseMessagesPane(false);
+ }
+}
+
+// virtual
+S32 LLConversationViewSession::arrange(S32* width, S32* height)
+{
+ //LLFolderViewFolder::arrange computes value for getIndentation() function below
+ S32 arranged = LLFolderViewFolder::arrange(width, height);
+
+ S32 h_pad = mHasArrow ? getIndentation() + mArrowSize : getIndentation();
+
+ LLRect rect(mCollapsedMode ? getLocalRect().mLeft : h_pad,
+ getLocalRect().mTop,
+ getLocalRect().mRight,
+ getLocalRect().mTop - getItemHeight());
+ mItemPanel->setShape(rect);
+
+ return arranged;
+}
+
+// virtual
+void LLConversationViewSession::toggleOpen()
+{
+ // conversations should not be opened while in minimized mode
+ if (!mCollapsedMode)
+ {
+ LLFolderViewFolder::toggleOpen();
+
+ // do item's selection when opened
+ if (LLFolderViewFolder::isOpen())
+ {
+ getParentFolder()->setSelection(this, true);
+ }
+ mContainer->reSelectConversation();
+ }
+}
+
+void LLConversationViewSession::toggleCollapsedMode(bool is_collapsed)
+{
+ mCollapsedMode = is_collapsed;
+
+ // hide the layout stack which contains all item's child widgets
+ // except for the icon which we display in minimized mode
+ getChild<LLView>("conversation_item_stack")->setVisible(!mCollapsedMode);
+
+ S32 h_pad = mHasArrow ? getIndentation() + mArrowSize : getIndentation();
+
+ mItemPanel->translate(mCollapsedMode ? -h_pad : h_pad, 0);
+}
+
+void LLConversationViewSession::setVisibleIfDetached(BOOL visible)
+{
+ // Do this only if the conversation floater has been torn off (i.e. no multi floater host) and is not minimized
+ // Note: minimized dockable floaters are brought to front hence unminimized when made visible and we don't want that here
+ LLFolderViewModelItem* item = mViewModelItem;
+ LLUUID session_uuid = dynamic_cast<LLConversationItem*>(item)->getUUID();
+ LLFloater* session_floater = LLFloaterIMSessionTab::getConversation(session_uuid);
+
+ if (session_floater && !session_floater->getHost() && !session_floater->isMinimized())
+ {
+ session_floater->setVisible(visible);
+ }
+}
+
+LLConversationViewParticipant* LLConversationViewSession::findParticipant(const LLUUID& participant_id)
+{
+ // This is *not* a general tree parsing algorithm. We search only in the mItems list
+ // assuming there is no mFolders which makes sense for sessions (sessions don't contain
+ // sessions).
+ LLConversationViewParticipant* participant = NULL;
+ items_t::const_iterator iter;
+ for (iter = getItemsBegin(); iter != getItemsEnd(); iter++)
+ {
+ participant = dynamic_cast<LLConversationViewParticipant*>(*iter);
+ if (participant->hasSameValue(participant_id))
+ {
+ break;
+ }
+ }
+ return (iter == getItemsEnd() ? NULL : participant);
+}
+
+void LLConversationViewSession::showVoiceIndicator(bool visible)
+{
+ mCallIconLayoutPanel->setVisible(visible && LLVoiceChannel::getCurrentVoiceChannel()->getSessionID().isNull());
+ requestArrange();
+}
+
+void LLConversationViewSession::refresh()
+{
+ // Refresh the session view from its model data
+ LLConversationItem* vmi = dynamic_cast<LLConversationItem*>(getViewModelItem());
+ vmi->resetRefresh();
+
+ if (mSessionTitle)
+ {
+ mSessionTitle->setText(vmi->getDisplayName());
+ }
+
+ // Update all speaking indicators
+ LLSpeakingIndicatorManager::updateSpeakingIndicators();
+
+ // we should show indicator for specified voice session only if this is current channel. EXT-5562.
+ if (!mIsInActiveVoiceChannel)
+ {
+ if (mSpeakingIndicator)
+ {
+ mSpeakingIndicator->setVisible(false);
+ }
+ LLConversationViewParticipant* participant = NULL;
+ items_t::const_iterator iter;
+ for (iter = getItemsBegin(); iter != getItemsEnd(); iter++)
+ {
+ participant = dynamic_cast<LLConversationViewParticipant*>(*iter);
+ if (participant)
+ {
+ participant->hideSpeakingIndicator();
+ }
+ }
+ }
+ requestArrange();
+ // Do the regular upstream refresh
+ LLFolderViewFolder::refresh();
+}
+
+void LLConversationViewSession::onCurrentVoiceSessionChanged(const LLUUID& session_id)
+{
+ LLConversationItem* vmi = dynamic_cast<LLConversationItem*>(getViewModelItem());
+
+ if (vmi)
+ {
+ mIsInActiveVoiceChannel = vmi->getUUID() == session_id;
+ mCallIconLayoutPanel->setVisible(mIsInActiveVoiceChannel);
+ }
+}
+
+//
+// Implementation of conversations list participant (avatar) widgets
+//
+
+static LLDefaultChildRegistry::Register<LLConversationViewParticipant> r("conversation_view_participant");
+bool LLConversationViewParticipant::sStaticInitialized = false;
+S32 LLConversationViewParticipant::sChildrenWidths[LLConversationViewParticipant::ALIC_COUNT];
+
+LLConversationViewParticipant::Params::Params() :
+container(),
+participant_id(),
+avatar_icon("avatar_icon"),
+info_button("info_button"),
+output_monitor("output_monitor")
+{}
+
+LLConversationViewParticipant::LLConversationViewParticipant( const LLConversationViewParticipant::Params& p ):
+ LLFolderViewItem(p),
+ mAvatarIcon(NULL),
+ mInfoBtn(NULL),
+ mSpeakingIndicator(NULL),
+ mUUID(p.participant_id)
+{
+}
+
+LLConversationViewParticipant::~LLConversationViewParticipant()
+{
+ mActiveVoiceChannelConnection.disconnect();
+}
+
+void LLConversationViewParticipant::initFromParams(const LLConversationViewParticipant::Params& params)
+{
+ LLAvatarIconCtrl::Params avatar_icon_params(params.avatar_icon());
+ applyXUILayout(avatar_icon_params, this);
+ LLAvatarIconCtrl * avatarIcon = LLUICtrlFactory::create<LLAvatarIconCtrl>(avatar_icon_params);
+ addChild(avatarIcon);
+
+ LLButton::Params info_button_params(params.info_button());
+ applyXUILayout(info_button_params, this);
+ LLButton * button = LLUICtrlFactory::create<LLButton>(info_button_params);
+ addChild(button);
+
+ LLOutputMonitorCtrl::Params output_monitor_params(params.output_monitor());
+ applyXUILayout(output_monitor_params, this);
+ LLOutputMonitorCtrl * outputMonitor = LLUICtrlFactory::create<LLOutputMonitorCtrl>(output_monitor_params);
+ addChild(outputMonitor);
+}
+
+BOOL LLConversationViewParticipant::postBuild()
+{
+ mAvatarIcon = getChild<LLAvatarIconCtrl>("avatar_icon");
+
+ mInfoBtn = getChild<LLButton>("info_btn");
+ mInfoBtn->setClickedCallback(boost::bind(&LLConversationViewParticipant::onInfoBtnClick, this));
+ mInfoBtn->setVisible(false);
+
+ mSpeakingIndicator = getChild<LLOutputMonitorCtrl>("speaking_indicator");
+
+ if (!sStaticInitialized)
+ {
+ // Remember children widths including their padding from the next sibling,
+ // so that we can hide and show them again later.
+ initChildrenWidths(this);
+ sStaticInitialized = true;
+ }
+
+ updateChildren();
+ return LLFolderViewItem::postBuild();
+}
+
+void LLConversationViewParticipant::draw()
+{
+ static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
+ static LLUIColor sFgDisabledColor = LLUIColorTable::instance().getColor("MenuItemDisabledColor", DEFAULT_WHITE);
+ static LLUIColor sHighlightFgColor = LLUIColorTable::instance().getColor("MenuItemHighlightFgColor", DEFAULT_WHITE);
+ static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE);
+ static LLUIColor sFlashBgColor = LLUIColorTable::instance().getColor("MenuItemFlashBgColor", DEFAULT_WHITE);
+ static LLUIColor sFocusOutlineColor = LLUIColorTable::instance().getColor("InventoryFocusOutlineColor", DEFAULT_WHITE);
+ static LLUIColor sMouseOverColor = LLUIColorTable::instance().getColor("InventoryMouseOverColor", DEFAULT_WHITE);
+
+ const BOOL show_context = (getRoot() ? getRoot()->getShowSelectionContext() : FALSE);
+
+ const LLFontGL* font = getLabelFontForStyle(mLabelStyle);
+ F32 right_x = 0;
+
+ F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad;
+ F32 text_left = (F32)getLabelXPos();
+
+ LLColor4 color;
+ LLLocalSpeakerMgr *speakerMgr = LLLocalSpeakerMgr::getInstance();
+
+ if (speakerMgr && speakerMgr->isSpeakerToBeRemoved(mUUID))
+ {
+ color = sFgDisabledColor;
+ }
+ else
+ {
+ color = mIsSelected ? sHighlightFgColor : sFgColor;
+ }
+
+ drawHighlight(show_context, mIsSelected, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor);
+ drawLabel(font, text_left, y, color, right_x);
+ refresh();
+
+ LLView::draw();
+}
+
+// virtual
+S32 LLConversationViewParticipant::arrange(S32* width, S32* height)
+{
+ //Need to call arrange first since it computes value used in getIndentation()
+ S32 arranged = LLFolderViewItem::arrange(width, height);
+
+ //Adjusts the avatar icon based upon the indentation
+ LLRect avatarRect(getIndentation(),
+ mAvatarIcon->getRect().mTop,
+ getIndentation() + mAvatarIcon->getRect().getWidth(),
+ mAvatarIcon->getRect().mBottom);
+ mAvatarIcon->setShape(avatarRect);
+
+ //Since dimensions changed, adjust the children (info button, speaker indicator)
+ updateChildren();
+
+ return arranged;
+}
+
+void LLConversationViewParticipant::addToFolder(LLFolderViewFolder* folder)
+{
+ // Add the item to the folder (conversation)
+ LLFolderViewItem::addToFolder(folder);
+
+ // Retrieve the folder (conversation) UUID, which is also the speaker session UUID
+ LLConversationItem* vmi = getParentFolder() ? dynamic_cast<LLConversationItem*>(getParentFolder()->getViewModelItem()) : NULL;
+ if (vmi)
+ {
+ addToSession(vmi->getUUID());
+ }
+}
+
+void LLConversationViewParticipant::addToSession(const LLUUID& session_id)
+{
+ //Allows speaking icon image to be loaded based on mUUID
+ mAvatarIcon->setValue(mUUID);
+
+ //Allows the speaker indicator to be activated based on the user and conversation
+ mSpeakingIndicator->setSpeakerId(mUUID, session_id);
+}
+
+void LLConversationViewParticipant::onInfoBtnClick()
+{
+ LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mUUID));
+}
+
+BOOL LLConversationViewParticipant::handleMouseDown( S32 x, S32 y, MASK mask )
+{
+ BOOL result = LLFolderViewItem::handleMouseDown(x, y, mask);
+
+ if(result && getRoot())
+ {
+ if(getRoot()->getCurSelectedItem() == this)
+ {
+ LLConversationItem* vmi = getParentFolder() ? dynamic_cast<LLConversationItem*>(getParentFolder()->getViewModelItem()) : NULL;
+ LLUUID session_id = vmi? vmi->getUUID() : LLUUID();
+
+ LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container");
+ LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(session_id);
+ im_container->setSelectedSession(session_id);
+ im_container->flashConversationItemWidget(session_id,false);
+ im_container->selectFloater(session_floater);
+ im_container->collapseMessagesPane(false);
+ }
+ }
+ return result;
+}
+
+void LLConversationViewParticipant::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ mInfoBtn->setVisible(true);
+ updateChildren();
+ LLFolderViewItem::onMouseEnter(x, y, mask);
+}
+
+void LLConversationViewParticipant::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ mInfoBtn->setVisible(false);
+ updateChildren();
+ LLFolderViewItem::onMouseLeave(x, y, mask);
+}
+
+S32 LLConversationViewParticipant::getLabelXPos()
+{
+ return getIndentation() + mAvatarIcon->getRect().getWidth() + mIconPad;
+}
+
+// static
+void LLConversationViewParticipant::initChildrenWidths(LLConversationViewParticipant* self)
+{
+ //speaking indicator width + padding
+ S32 speaking_indicator_width = self->getRect().getWidth() - self->mSpeakingIndicator->getRect().mLeft;
+
+ //info btn width + padding
+ S32 info_btn_width = self->mSpeakingIndicator->getRect().mLeft - self->mInfoBtn->getRect().mLeft;
+
+ S32 index = ALIC_COUNT;
+ sChildrenWidths[--index] = info_btn_width;
+ sChildrenWidths[--index] = speaking_indicator_width;
+ llassert(index == 0);
+}
+
+void LLConversationViewParticipant::updateChildren()
+{
+ mLabelPaddingRight = DEFAULT_LABEL_PADDING_RIGHT;
+ LLView* control;
+ S32 ctrl_width;
+ LLRect controlRect;
+
+ //Cycles through controls starting from right to left
+ for (S32 i = 0; i < ALIC_COUNT; ++i)
+ {
+ control = getItemChildView((EAvatarListItemChildIndex)i);
+
+ // skip invisible views
+ if (!control->getVisible()) continue;
+
+ //Get current pos/dimensions
+ controlRect = control->getRect();
+
+ ctrl_width = sChildrenWidths[i]; // including space between current & left controls
+ // accumulate the amount of space taken by the controls
+ mLabelPaddingRight += ctrl_width;
+
+ //Reposition visible controls in case adjacent controls to the right are hidden.
+ controlRect.setLeftTopAndSize(
+ getLocalRect().getWidth() - mLabelPaddingRight,
+ controlRect.mTop,
+ controlRect.getWidth(),
+ controlRect.getHeight());
+
+ //Sets the new position
+ control->setShape(controlRect);
+ }
+}
+
+LLView* LLConversationViewParticipant::getItemChildView(EAvatarListItemChildIndex child_view_index)
+{
+ LLView* child_view = NULL;
+
+ switch (child_view_index)
+ {
+ case ALIC_SPEAKER_INDICATOR:
+ child_view = mSpeakingIndicator;
+ break;
+ case ALIC_INFO_BUTTON:
+ child_view = mInfoBtn;
+ break;
+ default:
+ LL_WARNS("AvatarItemReshape") << "Unexpected child view index is passed: " << child_view_index << LL_ENDL;
+ llassert(0);
+ break;
+ // leave child_view untouched
+ }
+
+ return child_view;
+}
+
+void LLConversationViewParticipant::hideSpeakingIndicator()
+{
+ mSpeakingIndicator->setVisible(false);
+}
+
+// EOF
+
diff --git a/indra/newview/llconversationview.h b/indra/newview/llconversationview.h
new file mode 100755
index 0000000000..3eb2e63792
--- /dev/null
+++ b/indra/newview/llconversationview.h
@@ -0,0 +1,177 @@
+/**
+ * @file llconversationview.h
+ * @brief Implementation of conversations list widgets and views
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLCONVERSATIONVIEW_H
+#define LL_LLCONVERSATIONVIEW_H
+
+#include "../llui/llfolderviewitem.h"
+
+#include "llavatariconctrl.h"
+#include "../llui/llbutton.h"
+#include "lloutputmonitorctrl.h"
+
+class LLTextBox;
+class LLFloaterIMContainer;
+class LLConversationViewSession;
+class LLConversationViewParticipant;
+
+class LLVoiceClientStatusObserver;
+
+// Implementation of conversations list session widgets
+
+class LLConversationViewSession : public LLFolderViewFolder
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLFolderViewItem::Params>
+ {
+ Optional<LLFloaterIMContainer*> container;
+
+ Params();
+ };
+
+protected:
+ friend class LLUICtrlFactory;
+ LLConversationViewSession( const Params& p );
+
+ /*virtual*/ bool isHighlightAllowed();
+ /*virtual*/ bool isHighlightActive();
+ /*virtual*/ bool isFlashing() { return mFlashStateOn; }
+
+ LLFloaterIMContainer* mContainer;
+
+public:
+ virtual ~LLConversationViewSession();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void draw();
+ /*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask );
+ /*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
+
+ /*virtual*/ S32 arrange(S32* width, S32* height);
+
+ /*virtual*/ void toggleOpen();
+
+ /*virtual*/ bool isCollapsed() { return mCollapsedMode; }
+
+ void toggleCollapsedMode(bool is_collapsed);
+
+ void setVisibleIfDetached(BOOL visible);
+ LLConversationViewParticipant* findParticipant(const LLUUID& participant_id);
+
+ void showVoiceIndicator(bool visible);
+
+ virtual void refresh();
+
+ /*virtual*/ void setFlashState(bool flash_state);
+
+private:
+
+ void onCurrentVoiceSessionChanged(const LLUUID& session_id);
+ void startFlashing();
+ void selectConversationItem();
+
+ LLPanel* mItemPanel;
+ LLPanel* mCallIconLayoutPanel;
+ LLTextBox* mSessionTitle;
+ LLOutputMonitorCtrl* mSpeakingIndicator;
+ LLFlashTimer* mFlashTimer;
+ bool mFlashStateOn;
+ bool mFlashStarted;
+
+ bool mCollapsedMode;
+ bool mHasArrow;
+
+ bool mIsInActiveVoiceChannel;
+
+ LLVoiceClientStatusObserver* mVoiceClientObserver;
+
+ boost::signals2::connection mActiveVoiceChannelConnection;
+};
+
+// Implementation of conversations list participant (avatar) widgets
+
+class LLConversationViewParticipant : public LLFolderViewItem
+{
+
+public:
+
+ struct Params : public LLInitParam::Block<Params, LLFolderViewItem::Params>
+ {
+ Optional<LLFloaterIMContainer*> container;
+ Optional<LLUUID> participant_id;
+ Optional<LLAvatarIconCtrl::Params> avatar_icon;
+ Optional<LLButton::Params> info_button;
+ Optional<LLOutputMonitorCtrl::Params> output_monitor;
+
+ Params();
+ };
+
+ virtual ~LLConversationViewParticipant( void );
+
+ bool hasSameValue(const LLUUID& uuid) { return (uuid == mUUID); }
+ void addToFolder(LLFolderViewFolder* folder);
+ void addToSession(const LLUUID& session_id);
+
+ void onMouseEnter(S32 x, S32 y, MASK mask);
+ void onMouseLeave(S32 x, S32 y, MASK mask);
+
+ /*virtual*/ S32 getLabelXPos();
+ /*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask );
+ void hideSpeakingIndicator();
+
+protected:
+ friend class LLUICtrlFactory;
+ LLConversationViewParticipant( const Params& p );
+ void initFromParams(const Params& params);
+ BOOL postBuild();
+ /*virtual*/ void draw();
+ /*virtual*/ S32 arrange(S32* width, S32* height);
+
+ void onInfoBtnClick();
+
+private:
+
+ LLAvatarIconCtrl* mAvatarIcon;
+ LLButton * mInfoBtn;
+ LLOutputMonitorCtrl* mSpeakingIndicator;
+ LLUUID mUUID; // UUID of the participant
+
+ typedef enum e_avatar_item_child {
+ ALIC_SPEAKER_INDICATOR,
+ ALIC_INFO_BUTTON,
+ ALIC_COUNT,
+ } EAvatarListItemChildIndex;
+
+ static bool sStaticInitialized; // this variable is introduced to improve code readability
+ static S32 sChildrenWidths[ALIC_COUNT];
+ static void initChildrenWidths(LLConversationViewParticipant* self);
+ void updateChildren();
+ LLView* getItemChildView(EAvatarListItemChildIndex child_view_index);
+
+ boost::signals2::connection mActiveVoiceChannelConnection;
+};
+
+#endif // LL_LLCONVERSATIONVIEW_H
diff --git a/indra/newview/lldaycyclemanager.cpp b/indra/newview/lldaycyclemanager.cpp
index 347a467a8b..8af2f4ea33 100644
--- a/indra/newview/lldaycyclemanager.cpp
+++ b/indra/newview/lldaycyclemanager.cpp
@@ -184,7 +184,7 @@ void LLDayCycleManager::loadPresets(const std::string& dir)
{
std::string file;
if (!dir_iter.next(file)) break; // no more files
- loadPreset(dir + file);
+ loadPreset(gDirUtilp->add(dir, file));
}
}
diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp
index 29b1d23d7d..aeecf054b8 100644
--- a/indra/newview/lldebugview.cpp
+++ b/indra/newview/lldebugview.cpp
@@ -30,7 +30,6 @@
// library includes
#include "llfasttimerview.h"
-#include "llmemoryview.h"
#include "llconsole.h"
#include "lltextureview.h"
#include "llresmgr.h"
@@ -38,7 +37,6 @@
#include "llviewercontrol.h"
#include "llviewerwindow.h"
#include "llappviewer.h"
-#include "llmemoryview.h"
#include "llsceneview.h"
#include "llviewertexture.h"
#include "llfloaterreg.h"
@@ -103,13 +101,6 @@ void LLDebugView::init()
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);
- mp.follows.flags(FOLLOWS_TOP | FOLLOWS_LEFT);
- mp.visible(false);
- mMemoryView = LLUICtrlFactory::create<LLMemoryView>(mp);
- addChild(mMemoryView);
r.set(150, rect.getHeight() - 50, 820, 100);
LLTextureView::Params tvp;
diff --git a/indra/newview/lldeferredsounds.cpp b/indra/newview/lldeferredsounds.cpp
new file mode 100644
index 0000000000..9416e7cd29
--- /dev/null
+++ b/indra/newview/lldeferredsounds.cpp
@@ -0,0 +1,45 @@
+/**
+* @file lldeferredsounds.cpp
+* @brief Implementation of lldeferredsounds
+* @author Gilbert@lindenlab.com
+*
+* $LicenseInfo:firstyear=2013&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2013, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lldeferredsounds.h"
+
+#include "llaudioengine.h"
+
+void LLDeferredSounds::deferSound(SoundData& sound)
+{
+ soundVector.push_back(sound);
+}
+void LLDeferredSounds::playdeferredSounds()
+{
+ while(soundVector.size())
+ {
+ gAudiop->triggerSound(soundVector.back());
+ soundVector.pop_back();
+ }
+}
diff --git a/indra/newview/lldeferredsounds.h b/indra/newview/lldeferredsounds.h
new file mode 100644
index 0000000000..bf1eb62957
--- /dev/null
+++ b/indra/newview/lldeferredsounds.h
@@ -0,0 +1,46 @@
+/**
+* @file lldeferredsounds.h
+* @brief Header file for lldeferredsounds
+* @author Gilbert@lindenlab.com
+*
+* $LicenseInfo:firstyear=2013&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2013, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+#ifndef LL_LLDEFERREDSOUNDS_H
+#define LL_LLDEFERREDSOUNDS_H
+
+#include "llsingleton.h"
+
+struct SoundData;
+
+class LLDeferredSounds : public LLSingleton<LLDeferredSounds>
+{
+private:
+ std::vector<SoundData> soundVector;
+public:
+ //Add sounds to be played once progress bar is hidden (such as after teleport or loading screen)
+ void deferSound(SoundData& sound);
+
+ void playdeferredSounds();
+};
+
+#endif // LL_LLDEFERREDSOUNDS_H
+
diff --git a/indra/newview/lldelayedgestureerror.cpp b/indra/newview/lldelayedgestureerror.cpp
index 80e7c9f1b2..ef1b644ad4 100644
--- a/indra/newview/lldelayedgestureerror.cpp
+++ b/indra/newview/lldelayedgestureerror.cpp
@@ -113,9 +113,11 @@ bool LLDelayedGestureError::doDialog(const LLErrorEntry &ent, bool uuid_ok)
}
}
-
- LLNotificationsUtil::add(ent.mNotifyName, args);
-
+ if(!LLApp::isQuitting())
+ {
+ LLNotificationsUtil::add(ent.mNotifyName, args);
+ }
+
return true;
}
diff --git a/indra/newview/lldirpicker.h b/indra/newview/lldirpicker.h
index 2188b7edd0..682f9d6476 100644
--- a/indra/newview/lldirpicker.h
+++ b/indra/newview/lldirpicker.h
@@ -37,8 +37,8 @@
#include <Carbon/Carbon.h>
// AssertMacros.h does bad things.
+#include "fix_macros.h"
#undef verify
-#undef check
#undef require
#include <vector>
diff --git a/indra/newview/lldonotdisturbnotificationstorage.cpp b/indra/newview/lldonotdisturbnotificationstorage.cpp
new file mode 100644
index 0000000000..be20adeb8a
--- /dev/null
+++ b/indra/newview/lldonotdisturbnotificationstorage.cpp
@@ -0,0 +1,346 @@
+/**
+* @file lldonotdisturbnotificationstorage.cpp
+* @brief Implementation of lldonotdisturbnotificationstorage
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lldonotdisturbnotificationstorage.h"
+
+#include "llcommunicationchannel.h"
+#include "lldir.h"
+#include "llerror.h"
+#include "llfloaterreg.h"
+#include "llimview.h"
+#include "llnotifications.h"
+#include "llnotificationhandler.h"
+#include "llnotificationstorage.h"
+#include "llscriptfloater.h"
+#include "llsd.h"
+#include "llsingleton.h"
+#include "lluuid.h"
+
+static const F32 DND_TIMER = 3.0;
+const char * LLDoNotDisturbNotificationStorage::toastName = "IMToast";
+const char * LLDoNotDisturbNotificationStorage::offerName = "UserGiveItem";
+
+LLDoNotDisturbNotificationStorageTimer::LLDoNotDisturbNotificationStorageTimer() : LLEventTimer(DND_TIMER)
+{
+
+}
+
+LLDoNotDisturbNotificationStorageTimer::~LLDoNotDisturbNotificationStorageTimer()
+{
+
+}
+
+BOOL LLDoNotDisturbNotificationStorageTimer::tick()
+{
+ LLDoNotDisturbNotificationStorage * doNotDisturbNotificationStorage = LLDoNotDisturbNotificationStorage::getInstance();
+
+ if(doNotDisturbNotificationStorage
+ && doNotDisturbNotificationStorage->getDirty())
+ {
+ doNotDisturbNotificationStorage->saveNotifications();
+ }
+ return FALSE;
+}
+
+LLDoNotDisturbNotificationStorage::LLDoNotDisturbNotificationStorage()
+ : LLSingleton<LLDoNotDisturbNotificationStorage>()
+ , LLNotificationStorage(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "dnd_notifications.xml"))
+ , mDirty(false)
+{
+ nameToPayloadParameterMap[toastName] = "SESSION_ID";
+ nameToPayloadParameterMap[offerName] = "object_id";
+}
+
+LLDoNotDisturbNotificationStorage::~LLDoNotDisturbNotificationStorage()
+{
+}
+
+void LLDoNotDisturbNotificationStorage::initialize()
+{
+ getCommunicationChannel()->connectFailedFilter(boost::bind(&LLDoNotDisturbNotificationStorage::onChannelChanged, this, _1));
+}
+
+bool LLDoNotDisturbNotificationStorage::getDirty()
+{
+ return mDirty;
+}
+
+void LLDoNotDisturbNotificationStorage::resetDirty()
+{
+ mDirty = false;
+}
+
+static LLFastTimer::DeclareTimer FTM_SAVE_DND_NOTIFICATIONS("Save DND Notifications");
+
+void LLDoNotDisturbNotificationStorage::saveNotifications()
+{
+ LLFastTimer _(FTM_SAVE_DND_NOTIFICATIONS);
+
+ LLNotificationChannelPtr channelPtr = getCommunicationChannel();
+ const LLCommunicationChannel *commChannel = dynamic_cast<LLCommunicationChannel*>(channelPtr.get());
+ llassert(commChannel != NULL);
+
+ LLSD output = LLSD::emptyMap();
+ LLSD& data = output["data"];
+ data = LLSD::emptyArray();
+
+ for (LLCommunicationChannel::history_list_t::const_iterator historyIter = commChannel->beginHistory();
+ historyIter != commChannel->endHistory(); ++historyIter)
+ {
+ LLNotificationPtr notificationPtr = historyIter->second;
+
+ if (!notificationPtr->isRespondedTo() && !notificationPtr->isCancelled() && !notificationPtr->isExpired())
+ {
+ data.append(notificationPtr->asLLSD(true));
+ }
+ }
+
+ writeNotifications(output);
+
+ resetDirty();
+}
+
+static LLFastTimer::DeclareTimer FTM_LOAD_DND_NOTIFICATIONS("Load DND Notifications");
+
+void LLDoNotDisturbNotificationStorage::loadNotifications()
+{
+ LLFastTimer _(FTM_LOAD_DND_NOTIFICATIONS);
+
+ LLSD input;
+ if (!readNotifications(input) ||input.isUndefined())
+ {
+ return;
+ }
+
+ LLSD& data = input["data"];
+ if (data.isUndefined())
+ {
+ return;
+ }
+
+ LLNotifications& instance = LLNotifications::instance();
+ bool imToastExists = false;
+ bool group_ad_hoc_toast_exists = false;
+ S32 toastSessionType;
+ bool offerExists = false;
+
+ for (LLSD::array_const_iterator notification_it = data.beginArray();
+ notification_it != data.endArray();
+ ++notification_it)
+ {
+ LLSD notification_params = *notification_it;
+ const LLUUID& notificationID = notification_params["id"];
+ std::string notificationName = notification_params["name"];
+ LLNotificationPtr notification = instance.find(notificationID);
+
+ if(notificationName == toastName)
+ {
+ toastSessionType = notification_params["payload"]["SESSION_TYPE"];
+ if(toastSessionType == LLIMModel::LLIMSession::P2P_SESSION)
+ {
+ imToastExists = true;
+ }
+ //Don't add group/ad-hoc messages to the notification system because
+ //this means the group/ad-hoc session has to be re-created
+ else if(toastSessionType == LLIMModel::LLIMSession::GROUP_SESSION
+ || toastSessionType == LLIMModel::LLIMSession::ADHOC_SESSION)
+ {
+ //Just allows opening the conversation log for group/ad-hoc messages upon startup
+ group_ad_hoc_toast_exists = true;
+ continue;
+ }
+ }
+ else if(notificationName == offerName)
+ {
+ offerExists = true;
+ }
+
+ //Notification already exists due to persistent storage adding it first into the notification system
+ if(notification)
+ {
+ notification->setDND(true);
+ instance.update(instance.find(notificationID));
+ }
+ //New notification needs to be added
+ else
+ {
+ notification = (LLNotificationPtr) new LLNotification(notification_params.with("is_dnd", true));
+ LLNotificationResponderInterface* responder = createResponder(notification_params["responder_sd"]["responder_type"], notification_params["responder_sd"]);
+ if (responder == NULL)
+ {
+ LL_WARNS("LLDoNotDisturbNotificationStorage") << "cannot create responder for notification of type '"
+ << notification->getType() << "'" << LL_ENDL;
+ }
+ else
+ {
+ LLNotificationResponderPtr responderPtr(responder);
+ notification->setResponseFunctor(responderPtr);
+ }
+
+ instance.add(notification);
+ }
+
+ }
+
+ if(imToastExists)
+ {
+ LLFloaterReg::showInstance("im_container");
+ }
+
+ if(group_ad_hoc_toast_exists)
+ {
+ LLFloaterReg::showInstance("conversation");
+ }
+
+ if(imToastExists || group_ad_hoc_toast_exists || offerExists)
+ {
+ make_ui_sound_deferred("UISndNewIncomingIMSession");
+ }
+
+ //writes out empty .xml file (since LLCommunicationChannel::mHistory is empty)
+ saveNotifications();
+}
+
+void LLDoNotDisturbNotificationStorage::updateNotifications()
+{
+
+ LLNotificationChannelPtr channelPtr = getCommunicationChannel();
+ LLCommunicationChannel *commChannel = dynamic_cast<LLCommunicationChannel*>(channelPtr.get());
+ llassert(commChannel != NULL);
+
+ LLNotifications& instance = LLNotifications::instance();
+ bool imToastExists = false;
+ bool offerExists = false;
+
+ for (LLCommunicationChannel::history_list_t::const_iterator it = commChannel->beginHistory();
+ it != commChannel->endHistory();
+ ++it)
+ {
+ LLNotificationPtr notification = it->second;
+ std::string notificationName = notification->getName();
+
+ if(notificationName == toastName)
+ {
+ imToastExists = true;
+ }
+ else if(notificationName == offerName)
+ {
+ offerExists = true;
+ }
+
+ //Notification already exists in notification pipeline (same instance of app running)
+ if (notification)
+ {
+ notification->setDND(true);
+ instance.update(notification);
+ }
+ }
+
+ if(imToastExists)
+ {
+ LLFloaterReg::showInstance("im_container");
+ }
+
+ if(imToastExists || offerExists)
+ {
+ make_ui_sound("UISndNewIncomingIMSession");
+ }
+
+ //When exit DND mode, write empty notifications file
+ if(commChannel->getHistorySize())
+ {
+ commChannel->clearHistory();
+ saveNotifications();
+ }
+}
+
+LLNotificationChannelPtr LLDoNotDisturbNotificationStorage::getCommunicationChannel() const
+{
+ LLNotificationChannelPtr channelPtr = LLNotifications::getInstance()->getChannel("Communication");
+ llassert(channelPtr);
+ return channelPtr;
+}
+
+void LLDoNotDisturbNotificationStorage::removeNotification(const char * name, const LLUUID& id)
+{
+ LLNotifications& instance = LLNotifications::instance();
+ LLNotificationChannelPtr channelPtr = getCommunicationChannel();
+ LLCommunicationChannel *commChannel = dynamic_cast<LLCommunicationChannel*>(channelPtr.get());
+ LLNotificationPtr notification;
+ LLSD payload;
+ LLUUID notificationObjectID;
+ std::string notificationName;
+ std::string payloadVariable = nameToPayloadParameterMap[name];
+ LLCommunicationChannel::history_list_t::iterator it;
+ std::vector<LLCommunicationChannel::history_list_t::iterator> itemsToRemove;
+
+ //Find notification with the matching session id
+ for (it = commChannel->beginHistory();
+ it != commChannel->endHistory();
+ ++it)
+ {
+ notification = it->second;
+ payload = notification->getPayload();
+ notificationObjectID = payload[payloadVariable].asUUID();
+ notificationName = notification->getName();
+
+ if((notificationName == name)
+ && id == notificationObjectID)
+ {
+ itemsToRemove.push_back(it);
+ }
+ }
+
+
+ //Remove the notifications
+ if(itemsToRemove.size())
+ {
+ while(itemsToRemove.size())
+ {
+ it = itemsToRemove.back();
+ notification = it->second;
+ commChannel->removeItemFromHistory(notification);
+ instance.cancel(notification);
+ itemsToRemove.pop_back();
+ }
+ //Trigger saving of notifications to xml once all have been removed
+ saveNotifications();
+ }
+}
+
+
+bool LLDoNotDisturbNotificationStorage::onChannelChanged(const LLSD& pPayload)
+{
+ if (pPayload["sigtype"].asString() != "load")
+ {
+ mDirty = true;
+ }
+
+ return false;
+}
diff --git a/indra/newview/lldonotdisturbnotificationstorage.h b/indra/newview/lldonotdisturbnotificationstorage.h
new file mode 100644
index 0000000000..6e68b0d1be
--- /dev/null
+++ b/indra/newview/lldonotdisturbnotificationstorage.h
@@ -0,0 +1,78 @@
+/**
+* @file lldonotdisturbnotificationstorage.h
+* @brief Header file for lldonotdisturbnotificationstorage
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+#ifndef LL_LLDONOTDISTURBNOTIFICATIONSTORAGE_H
+#define LL_LLDONOTDISTURBNOTIFICATIONSTORAGE_H
+
+#include "llerror.h"
+#include "lleventtimer.h"
+#include "llnotifications.h"
+#include "llnotificationstorage.h"
+#include "llsingleton.h"
+
+class LLSD;
+
+class LLDoNotDisturbNotificationStorageTimer : public LLEventTimer
+{
+public:
+ LLDoNotDisturbNotificationStorageTimer();
+ ~LLDoNotDisturbNotificationStorageTimer();
+
+public:
+ BOOL tick();
+};
+
+class LLDoNotDisturbNotificationStorage : public LLSingleton<LLDoNotDisturbNotificationStorage>, public LLNotificationStorage
+{
+ LOG_CLASS(LLDoNotDisturbNotificationStorage);
+public:
+ static const char * toastName;
+ static const char * offerName;
+
+ LLDoNotDisturbNotificationStorage();
+ ~LLDoNotDisturbNotificationStorage();
+
+ void initialize();
+ bool getDirty();
+ void resetDirty();
+ void saveNotifications();
+ void loadNotifications();
+ void updateNotifications();
+ void removeNotification(const char * name, const LLUUID& id);
+
+protected:
+
+private:
+ bool mDirty;
+ LLDoNotDisturbNotificationStorageTimer mTimer;
+
+ LLNotificationChannelPtr getCommunicationChannel() const;
+ bool onChannelChanged(const LLSD& pPayload);
+ std::map<std::string, std::string> nameToPayloadParameterMap;
+};
+
+#endif // LL_LLDONOTDISTURBNOTIFICATIONSTORAGE_H
+
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 4eda2b92b3..4b0d3b361d 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -254,11 +254,17 @@ S32 LLDrawable::findReferences(LLDrawable *drawablep)
return count;
}
+static LLFastTimer::DeclareTimer FTM_ALLOCATE_FACE("Allocate Face", true);
+
LLFace* LLDrawable::addFace(LLFacePool *poolp, LLViewerTexture *texturep)
{
- LLMemType mt(LLMemType::MTYPE_DRAWABLE);
- LLFace *face = new LLFace(this, mVObjp);
+ LLFace *face;
+ {
+ LLFastTimer t(FTM_ALLOCATE_FACE);
+ face = new LLFace(this, mVObjp);
+ }
+
if (!face) llerrs << "Allocating new Face: " << mFaces.size() << llendl;
if (face)
@@ -280,10 +286,12 @@ LLFace* LLDrawable::addFace(LLFacePool *poolp, LLViewerTexture *texturep)
LLFace* LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep)
{
- LLMemType mt(LLMemType::MTYPE_DRAWABLE);
-
LLFace *face;
- face = new LLFace(this, mVObjp);
+
+ {
+ LLFastTimer t(FTM_ALLOCATE_FACE);
+ face = new LLFace(this, mVObjp);
+ }
face->setTEOffset(mFaces.size());
face->setTexture(texturep);
@@ -433,7 +441,7 @@ void LLDrawable::makeActive()
}
llassert(isAvatar() || isRoot() || mParent->isActive());
-}
+ }
void LLDrawable::makeStatic(BOOL warning_enabled)
@@ -447,7 +455,7 @@ void LLDrawable::makeStatic(BOOL warning_enabled)
//drawable became static with active parent, not acceptable
llassert(mParent.isNull() || !mParent->isActive() || !warning_enabled);
-
+
LLViewerObject::const_child_list_t& child_list = mVObjp->getChildren();
for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
iter != child_list.end(); iter++)
@@ -516,6 +524,7 @@ F32 LLDrawable::updateXform(BOOL undamped)
dist_squared = dist_vec_squared(new_pos, target_pos);
LLQuaternion new_rot = nlerp(lerp_amt, old_rot, target_rot);
+ // FIXME: This can be negative! It is be possible for some rots to 'cancel out' pos or size changes.
dist_squared += (1.f - dot(new_rot, target_rot)) * 10.f;
LLVector3 new_scale = lerp(old_scale, target_scale, lerp_amt);
@@ -539,6 +548,15 @@ F32 LLDrawable::updateXform(BOOL undamped)
}
}
}
+ else
+ {
+ // The following fixes MAINT-1742 but breaks vehicles similar to MAINT-2275
+ // dist_squared = dist_vec_squared(old_pos, target_pos);
+
+ // The following fixes MAINT-2247 but causes MAINT-2275
+ //dist_squared += (1.f - dot(old_rot, target_rot)) * 10.f;
+ //dist_squared += dist_vec_squared(old_scale, target_scale);
+ }
LLVector3 vec = mCurrentScale-target_scale;
@@ -559,6 +577,12 @@ F32 LLDrawable::updateXform(BOOL undamped)
mVObjp->dirtySpatialGroup();
}
}
+ else if (!isRoot() &&
+ ((dist_vec_squared(old_pos, target_pos) > 0.f)
+ || (1.f - dot(old_rot, target_rot)) > 0.f))
+ { //fix for BUG-840, MAINT-2275, MAINT-1742, MAINT-2247
+ gPipeline.markRebuild(this, LLDrawable::REBUILD_POSITION, TRUE);
+ }
else if (!getVOVolume() && !isAvatar())
{
movePartition();
@@ -625,18 +649,9 @@ BOOL LLDrawable::updateMove()
return FALSE;
}
- BOOL done;
+ makeActive();
- if (isState(MOVE_UNDAMPED))
- {
- done = updateMoveUndamped();
- }
- else
- {
- makeActive();
- done = updateMoveDamped();
- }
- return done;
+ return isState(MOVE_UNDAMPED) ? updateMoveUndamped() : updateMoveDamped();
}
BOOL LLDrawable::updateMoveUndamped()
@@ -763,8 +778,6 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
void LLDrawable::updateTexture()
{
- LLMemType mt(LLMemType::MTYPE_DRAWABLE);
-
if (isDead())
{
llwarns << "Dead drawable updating texture!" << llendl;
@@ -951,6 +964,12 @@ LLSpatialGroup* LLDrawable::getSpatialGroup() const
void LLDrawable::setSpatialGroup(LLSpatialGroup *groupp)
{
+ //precondition: mSpatialGroupp MUST be null or DEAD or mSpatialGroupp MUST NOT contain this
+ llassert(!mSpatialGroupp || mSpatialGroupp->isDead() || !mSpatialGroupp->hasElement(this));
+
+ //precondition: groupp MUST be null or groupp MUST contain this
+ llassert(!groupp || groupp->hasElement(this));
+
/*if (mSpatialGroupp && (groupp != mSpatialGroupp))
{
mSpatialGroupp->setState(LLSpatialGroup::GEOM_DIRTY);
@@ -970,9 +989,12 @@ void LLDrawable::setSpatialGroup(LLSpatialGroup *groupp)
}
}
- mSpatialGroupp = groupp;
+ //postcondition: if next group is NULL, previous group must be dead OR NULL OR binIndex must be -1
+ //postcondition: if next group is NOT NULL, binIndex must not be -1
+ llassert(groupp == NULL ? (mSpatialGroupp == NULL || mSpatialGroupp->isDead()) || getBinIndex() == -1 :
+ getBinIndex() != -1);
- llassert((mSpatialGroupp == NULL) ? getBinIndex() == -1 : getBinIndex() != -1);
+ mSpatialGroupp = groupp;
}
LLSpatialPartition* LLDrawable::getSpatialPartition()
@@ -1400,7 +1422,7 @@ void LLSpatialBridge::updateDistance(LLCamera& camera_in, bool force_update)
markDead();
return;
}
-
+
if (gShiftFrame)
{
return;
@@ -1483,13 +1505,11 @@ void LLSpatialBridge::cleanupReferences()
LLDrawable::cleanupReferences();
if (mDrawable)
{
- LLSpatialGroup* group = mDrawable->getSpatialGroup();
- if (group)
- {
- group->mOctreeNode->remove(mDrawable);
- mDrawable->setSpatialGroup(NULL);
- }
+ /*
+ DON'T DO THIS -- this should happen through octree destruction
+
+ mDrawable->setSpatialGroup(NULL);
if (mDrawable->getVObj())
{
LLViewerObject::const_child_list_t& child_list = mDrawable->getVObj()->getChildren();
@@ -1500,15 +1520,10 @@ void LLSpatialBridge::cleanupReferences()
LLDrawable* drawable = child->mDrawable;
if (drawable)
{
- LLSpatialGroup* group = drawable->getSpatialGroup();
- if (group)
- {
- group->mOctreeNode->remove(drawable);
- drawable->setSpatialGroup(NULL);
- }
+ drawable->setSpatialGroup(NULL);
}
}
- }
+ }*/
LLDrawable* drawablep = mDrawable;
mDrawable = NULL;
diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h
index b1e32bdb5b..4608d16fec 100644
--- a/indra/newview/lldrawable.h
+++ b/indra/newview/lldrawable.h
@@ -38,7 +38,6 @@
#include "llvector4a.h"
#include "llquaternion.h"
#include "xform.h"
-#include "llmemtype.h"
#include "lldarray.h"
#include "llviewerobject.h"
#include "llrect.h"
@@ -87,7 +86,6 @@ public:
}
LLDrawable() { init(); }
- MEM_TYPE_NEW(LLMemType::MTYPE_DRAWABLE);
void markDead(); // Mark this drawable as dead
BOOL isDead() const { return isState(DEAD); }
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index b4f6bf9383..313b310e1e 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -411,12 +411,6 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
continue;
}
- if ((params.mVertexBuffer->getTypeMask() & mask) != mask)
- { //FIXME!
- llwarns << "Missing required components, skipping render batch." << llendl;
- continue;
- }
-
LLRenderPass::applyModelMatrix(params);
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 730ad1a364..294cecc703 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -1272,6 +1272,9 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
face->setGeomIndex(0);
face->setIndicesIndex(0);
+ //rigged faces do not batch textures
+ face->setTextureIndex(255);
+
if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable())
{ //make a new buffer
if (sShaderLevel > 0)
@@ -1630,6 +1633,7 @@ void LLDrawPoolAvatar::renderRiggedAlpha(LLVOAvatar* avatar)
LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
renderRigged(avatar, RIGGED_ALPHA);
+ gGL.setColorMask(true, false);
}
}
@@ -1646,6 +1650,7 @@ void LLDrawPoolAvatar::renderRiggedFullbrightAlpha(LLVOAvatar* avatar)
LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
renderRigged(avatar, RIGGED_FULLBRIGHT_ALPHA);
+ gGL.setColorMask(true, false);
}
}
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index a264eae302..1b0b11298c 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -1192,7 +1192,7 @@ static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_MIN_MAX("Min/Max");
static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_RGB2LUM("RGB to Luminance");
static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_RESCALE("Rescale");
static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_GEN_NORMAL("Generate Normal");
-static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_CREATE("Create");
+static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_CREATE("Bump Source Create");
// static
void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLImageRaw* src, LLUUID& source_asset_id, EBumpEffect bump_code )
diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp
index caf15fe1cb..b5faff7968 100644
--- a/indra/newview/lldrawpoolwlsky.cpp
+++ b/indra/newview/lldrawpoolwlsky.cpp
@@ -192,14 +192,18 @@ void LLDrawPoolWLSky::renderStars(void) const
bool error;
LLColor4 star_alpha(LLColor4::black);
star_alpha.mV[3] = LLWLParamManager::getInstance()->mCurParams.getFloat("star_brightness", error) / 2.f;
- llassert_always(!error);
+
+ // If start_brightness is not set, exit
+ if( error )
+ {
+ llwarns << "star_brightness missing in mCurParams" << llendl;
+ return;
+ }
gGL.getTexUnit(0)->bind(gSky.mVOSkyp->getBloomTex());
gGL.pushMatrix();
gGL.rotatef(gFrameTimeSeconds*0.01f, 0.f, 0.f, 1.f);
- // gl_FragColor.rgb = gl_Color.rgb;
- // gl_FragColor.a = gl_Color.a * star_alpha.a;
if (LLGLSLShader::sNoFixedFunction)
{
gCustomAlphaProgram.bind();
diff --git a/indra/newview/lldriverparam.h b/indra/newview/lldriverparam.h
index 7a4d711d4e..216cf003e1 100644
--- a/indra/newview/lldriverparam.h
+++ b/indra/newview/lldriverparam.h
@@ -75,6 +75,7 @@ protected:
//-----------------------------------------------------------------------------
+LL_ALIGN_PREFIX(16)
class LLDriverParam : public LLViewerVisualParam
{
friend class LLPhysicsMotion; // physics motion needs to access driven params directly.
@@ -83,6 +84,16 @@ public:
LLDriverParam(LLWearable *wearablep);
~LLDriverParam();
+ void* operator new(size_t size)
+ {
+ return ll_aligned_malloc_16(size);
+ }
+
+ void operator delete(void* ptr)
+ {
+ ll_aligned_free_16(ptr);
+ }
+
// Special: These functions are overridden by child classes
LLDriverParamInfo* getInfo() const { return (LLDriverParamInfo*)mInfo; }
// This sets mInfo and calls initialization functions
@@ -116,13 +127,13 @@ protected:
void setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake);
- LLVector4a mDefaultVec; // temp holder
+ LL_ALIGN_16(LLVector4a mDefaultVec); // temp holder
typedef std::vector<LLDrivenEntry> entry_list_t;
entry_list_t mDriven;
LLViewerVisualParam* mCurrentDistortionParam;
// Backlink only; don't make this an LLPointer.
LLVOAvatar* mAvatarp;
LLWearable* mWearablep;
-};
+} LL_ALIGN_POSTFIX(16);
#endif // LL_LLDRIVERPARAM_H
diff --git a/indra/newview/lleventpoll.cpp b/indra/newview/lleventpoll.cpp
index 4f4d9a40b4..2c786b7f8b 100644
--- a/indra/newview/lleventpoll.cpp
+++ b/indra/newview/lleventpoll.cpp
@@ -86,7 +86,7 @@ namespace
class LLEventPollEventTimer : public LLEventTimer
{
- typedef boost::intrusive_ptr<LLEventPollResponder> EventPollResponderPtr;
+ typedef LLPointer<LLEventPollResponder> EventPollResponderPtr;
public:
LLEventPollEventTimer(F32 period, EventPollResponderPtr responder)
diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index 935dcb74b0..a50184460b 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -150,7 +150,7 @@ void LLExpandableTextBox::LLTextBoxEx::showExpandText()
std::pair<S32, S32> visible_lines = getVisibleLines(true);
S32 last_line = visible_lines.second - 1;
- LLStyle::Params expander_style(getDefaultStyleParams());
+ LLStyle::Params expander_style(getStyleParams());
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);
@@ -166,7 +166,7 @@ void LLExpandableTextBox::LLTextBoxEx::hideExpandText()
if (mExpanderVisible)
{
// this will overwrite the expander segment and all text styling with a single style
- LLStyleConstSP sp(new LLStyle(getDefaultStyleParams()));
+ LLStyleConstSP sp(new LLStyle(getStyleParams()));
LLNormalTextSegment* segmentp = new LLNormalTextSegment(sp, 0, getLength() + 1, *this);
insertSegment(segmentp);
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 4a0c94df33..28e4b32793 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -166,7 +166,8 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
//special value to indicate uninitialized position
mIndicesIndex = 0xFFFFFFFF;
-
+
+ mIndexInTex = 0;
mTexture = NULL;
mTEOffset = -1;
mTextureIndex = 255;
@@ -262,8 +263,6 @@ void LLFace::setPool(LLFacePool* pool)
void LLFace::setPool(LLFacePool* new_pool, LLViewerTexture *texturep)
{
- LLMemType mt1(LLMemType::MTYPE_DRAWABLE);
-
if (!new_pool)
{
llerrs << "Setting pool to null!" << llendl;
@@ -441,8 +440,6 @@ U16 LLFace::getGeometryAvatar(
LLStrider<F32> &vertex_weights,
LLStrider<LLVector4> &clothing_weights)
{
- LLMemType mt1(LLMemType::MTYPE_DRAWABLE);
-
if (mVertexBuffer.notNull())
{
mVertexBuffer->getVertexStrider (vertices, mGeomIndex, mGeomCount);
@@ -458,8 +455,6 @@ U16 LLFace::getGeometryAvatar(
U16 LLFace::getGeometry(LLStrider<LLVector3> &vertices, LLStrider<LLVector3> &normals,
LLStrider<LLVector2> &tex_coords, LLStrider<U16> &indicesp)
{
- LLMemType mt1(LLMemType::MTYPE_DRAWABLE);
-
if (mVertexBuffer.notNull())
{
mVertexBuffer->getVertexStrider(vertices, mGeomIndex, mGeomCount);
@@ -769,8 +764,6 @@ bool less_than_max_mag(const LLVector4a& vec)
BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
const LLMatrix4& mat_vert_in, const LLMatrix3& mat_normal_in, BOOL global_volume)
{
- LLMemType mt1(LLMemType::MTYPE_DRAWABLE);
-
//get bounding box
if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION | LLDrawable::REBUILD_RIGGED))
{
@@ -1061,7 +1054,11 @@ bool LLFace::canRenderAsMask()
}
const LLTextureEntry* te = getTextureEntry();
-
+ if( !te || !getViewerObject() || !getTexture() )
+ {
+ return false;
+ }
+
if ((te->getColor().mV[3] == 1.0f) && // can't treat as mask if we have face alpha
(te->getGlow() == 0.f) && // glowing masks are hard to implement - don't mask
getTexture()->getIsAlphaMask()) // texture actually qualifies for masking (lazily recalculated but expensive)
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index 9664aa7dbe..4dfb93f1bc 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -95,7 +95,6 @@ LLFastTimerView::LLFastTimerView(const LLSD& key)
mHoverBarIndex = -1;
FTV_NUM_TIMERS = LLFastTimer::NamedTimer::instanceCount();
mPrintStats = -1;
- mAverageCyclesPerTimer = 0;
}
void LLFastTimerView::onPause()
@@ -161,7 +160,7 @@ LLFastTimer::NamedTimer* LLFastTimerView::getLegendID(S32 y)
BOOL LLFastTimerView::handleDoubleClick(S32 x, S32 y, MASK mask)
{
- for(timer_tree_iterator_t it = begin_timer_tree(LLFastTimer::NamedTimer::getRootNamedTimer());
+ for(timer_tree_iterator_t it = begin_timer_tree(getFrameTimer());
it != end_timer_tree();
++it)
{
@@ -258,7 +257,7 @@ BOOL LLFastTimerView::handleHover(S32 x, S32 y, MASK mask)
}
S32 i = 0;
- for(timer_tree_iterator_t it = begin_timer_tree(LLFastTimer::NamedTimer::getRootNamedTimer());
+ for(timer_tree_iterator_t it = begin_timer_tree(getFrameTimer());
it != end_timer_tree();
++it, ++i)
{
@@ -379,12 +378,6 @@ 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
{
@@ -392,10 +385,6 @@ 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 ",
@@ -419,7 +408,6 @@ 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);
}
@@ -431,11 +419,11 @@ void LLFastTimerView::draw()
y -= (texth + 2);
- sTimerColors[&LLFastTimer::NamedTimer::getRootNamedTimer()] = LLColor4::grey;
+ sTimerColors[&getFrameTimer()] = LLColor4::grey;
F32 hue = 0.f;
- for (timer_tree_iterator_t it = begin_timer_tree(LLFastTimer::NamedTimer::getRootNamedTimer());
+ for (timer_tree_iterator_t it = begin_timer_tree(getFrameTimer());
it != timer_tree_iterator_t();
++it)
{
@@ -460,7 +448,7 @@ void LLFastTimerView::draw()
S32 cur_line = 0;
ft_display_idx.clear();
std::map<LLFastTimer::NamedTimer*, S32> display_line;
- for (timer_tree_iterator_t it = begin_timer_tree(LLFastTimer::NamedTimer::getRootNamedTimer());
+ for (timer_tree_iterator_t it = begin_timer_tree(getFrameTimer());
it != timer_tree_iterator_t();
++it)
{
@@ -526,6 +514,7 @@ void LLFastTimerView::draw()
while(!is_child_of_hover_item && next_parent)
{
is_child_of_hover_item = (mHoverID == next_parent);
+ if (next_parent->getParent() == next_parent) break;
next_parent = next_parent->getParent();
}
@@ -570,7 +559,7 @@ void LLFastTimerView::draw()
U64 totalticks;
if (!LLFastTimer::sPauseHistory)
{
- U64 ticks = LLFastTimer::NamedTimer::getRootNamedTimer().getHistoricalCount(mScrollIndex);
+ U64 ticks = getFrameTimer().getHistoricalCount(mScrollIndex);
if (LLFastTimer::getCurFrameIndex() >= 10)
{
@@ -610,7 +599,7 @@ void LLFastTimerView::draw()
totalticks = 0;
for (S32 j=0; j<histmax; j++)
{
- U64 ticks = LLFastTimer::NamedTimer::getRootNamedTimer().getHistoricalCount(j);
+ U64 ticks = getFrameTimer().getHistoricalCount(j);
if (ticks > totalticks)
totalticks = ticks;
@@ -716,7 +705,7 @@ void LLFastTimerView::draw()
LLFastTimer::NamedTimer* prev_id = NULL;
S32 i = 0;
- for(timer_tree_iterator_t it = begin_timer_tree(LLFastTimer::NamedTimer::getRootNamedTimer());
+ for(timer_tree_iterator_t it = begin_timer_tree(getFrameTimer());
it != end_timer_tree();
++it, ++i)
{
@@ -793,6 +782,7 @@ void LLFastTimerView::draw()
while(!is_child_of_hover_item && next_parent)
{
is_child_of_hover_item = (mHoverID == next_parent);
+ if (next_parent->getParent() == next_parent) break;
next_parent = next_parent->getParent();
}
@@ -879,7 +869,7 @@ void LLFastTimerView::draw()
}
U64 cur_max = 0;
- for(timer_tree_iterator_t it = begin_timer_tree(LLFastTimer::NamedTimer::getRootNamedTimer());
+ for(timer_tree_iterator_t it = begin_timer_tree(getFrameTimer());
it != end_timer_tree();
++it)
{
@@ -980,7 +970,7 @@ void LLFastTimerView::draw()
{
std::string legend_stat;
bool first = true;
- for(timer_tree_iterator_t it = begin_timer_tree(LLFastTimer::NamedTimer::getRootNamedTimer());
+ for(timer_tree_iterator_t it = begin_timer_tree(getFrameTimer());
it != end_timer_tree();
++it)
{
@@ -1002,7 +992,7 @@ void LLFastTimerView::draw()
std::string timer_stat;
first = true;
- for(timer_tree_iterator_t it = begin_timer_tree(LLFastTimer::NamedTimer::getRootNamedTimer());
+ for(timer_tree_iterator_t it = begin_timer_tree(getFrameTimer());
it != end_timer_tree();
++it)
{
@@ -1563,3 +1553,9 @@ void LLFastTimerView::onClickCloseBtn()
setVisible(false);
}
+LLFastTimer::NamedTimer& LLFastTimerView::getFrameTimer()
+{
+ return FTM_FRAME.getNamedTimer();
+}
+
+
diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h
index a349e7ad4c..5766cfa0b0 100644
--- a/indra/newview/llfasttimerview.h
+++ b/indra/newview/llfasttimerview.h
@@ -46,6 +46,7 @@ private:
static LLSD analyzePerformanceLogDefault(std::istream& is) ;
static void exportCharts(const std::string& base, const std::string& target);
void onPause();
+ LLFastTimer::NamedTimer& getFrameTimer();
public:
@@ -90,7 +91,6 @@ private:
S32 mHoverBarIndex;
LLFrameTimer mHighlightTimer;
S32 mPrintStats;
- S32 mAverageCyclesPerTimer;
LLRect mGraphRect;
};
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index 4cbc9cab4a..e30dd51acb 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -38,6 +38,7 @@
#include "lltooltip.h"
#include "llagent.h"
+#include "llavatarnamecache.h"
#include "llclipboard.h"
#include "llclipboard.h"
#include "llinventorybridge.h"
@@ -45,12 +46,14 @@
#include "llfloatersidepanelcontainer.h"
#include "llfloaterworldmap.h"
#include "lllandmarkactions.h"
+#include "lllogininstance.h"
#include "llnotificationsutil.h"
#include "lltoggleablemenu.h"
#include "llviewerinventory.h"
#include "llviewermenu.h"
#include "llviewermenu.h"
#include "lltooldraganddrop.h"
+#include "llsdserialize.h"
static LLDefaultChildRegistry::Register<LLFavoritesBarCtrl> r("favorites_bar");
@@ -317,7 +320,8 @@ public:
if (item)
{
- item->setSortField(mSortField);
+ LLFavoritesOrderStorage::instance().setSortIndex(item, mSortField);
+
item->setComplete(TRUE);
item->updateServer(FALSE);
@@ -339,8 +343,8 @@ struct LLFavoritesSort
// TODO - made it customizible using gSavedSettings
bool operator()(const LLViewerInventoryItem* const& a, const LLViewerInventoryItem* const& b)
{
- S32 sortField1 = a->getSortField();
- S32 sortField2 = b->getSortField();
+ S32 sortField1 = LLFavoritesOrderStorage::instance().getSortIndex(a->getUUID());
+ S32 sortField2 = LLFavoritesOrderStorage::instance().getSortIndex(b->getUUID());
if (!(sortField1 < 0 && sortField2 < 0))
{
@@ -528,7 +532,7 @@ void LLFavoritesBarCtrl::handleExistingFavoriteDragAndDrop(S32 x, S32 y)
mItems.push_back(gInventory.getItem(mDragItemId));
}
- gInventory.saveItemsOrder(mItems);
+ LLFavoritesOrderStorage::instance().saveItemsOrder(mItems);
LLToggleableMenu* menu = (LLToggleableMenu*) mOverflowMenuHandle.get();
@@ -587,7 +591,8 @@ void LLFavoritesBarCtrl::handleNewFavoriteDragAndDrop(LLInventoryItem *item, con
}
else
{
- currItem->setSortField(++sortField);
+ LLFavoritesOrderStorage::instance().setSortIndex(currItem, ++sortField);
+
currItem->setComplete(TRUE);
currItem->updateServer(FALSE);
@@ -640,7 +645,7 @@ void LLFavoritesBarCtrl::changed(U32 mask)
for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i)
{
- (*i)->getSLURL();
+ LLFavoritesOrderStorage::instance().getSLURL((*i)->getAssetUUID());
}
updateButtons();
}
@@ -909,7 +914,7 @@ BOOL LLFavoritesBarCtrl::collectFavoriteItems(LLInventoryModel::item_array_t &it
S32 sortField = 0;
for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i)
{
- (*i)->setSortField(++sortField);
+ LLFavoritesOrderStorage::instance().setSortIndex((*i), ++sortField);
}
}
@@ -1355,7 +1360,7 @@ BOOL LLFavoritesBarCtrl::needToSaveItemsOrder(const LLInventoryModel::item_array
// if there is an item without sort order field set, we need to save items order
for (LLInventoryModel::item_array_t::const_iterator i = items.begin(); i != items.end(); ++i)
{
- if ((*i)->getSortField() < 0)
+ if (LLFavoritesOrderStorage::instance().getSortIndex((*i)->getUUID()) < 0)
{
result = TRUE;
break;
@@ -1390,4 +1395,295 @@ void LLFavoritesBarCtrl::insertItem(LLInventoryModel::item_array_t& items, const
}
}
+const std::string LLFavoritesOrderStorage::SORTING_DATA_FILE_NAME = "landmarks_sorting.xml";
+const S32 LLFavoritesOrderStorage::NO_INDEX = -1;
+
+void LLFavoritesOrderStorage::setSortIndex(const LLViewerInventoryItem* inv_item, S32 sort_index)
+{
+ mSortIndexes[inv_item->getUUID()] = sort_index;
+ mIsDirty = true;
+ getSLURL(inv_item->getAssetUUID());
+}
+
+S32 LLFavoritesOrderStorage::getSortIndex(const LLUUID& inv_item_id)
+{
+ sort_index_map_t::const_iterator it = mSortIndexes.find(inv_item_id);
+ if (it != mSortIndexes.end())
+ {
+ return it->second;
+ }
+ return NO_INDEX;
+}
+
+void LLFavoritesOrderStorage::removeSortIndex(const LLUUID& inv_item_id)
+{
+ mSortIndexes.erase(inv_item_id);
+ mIsDirty = true;
+}
+
+void LLFavoritesOrderStorage::getSLURL(const LLUUID& asset_id)
+{
+ slurls_map_t::iterator slurl_iter = mSLURLs.find(asset_id);
+ if (slurl_iter != mSLURLs.end()) return; // SLURL for current landmark is already cached
+
+ LLLandmark* lm = gLandmarkList.getAsset(asset_id,
+ boost::bind(&LLFavoritesOrderStorage::onLandmarkLoaded, this, asset_id, _1));
+ if (lm)
+ {
+ onLandmarkLoaded(asset_id, lm);
+ }
+}
+
+// static
+void LLFavoritesOrderStorage::destroyClass()
+{
+ LLFavoritesOrderStorage::instance().cleanup();
+ if (gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin"))
+ {
+ LLFavoritesOrderStorage::instance().saveFavoritesSLURLs();
+ }
+ else
+ {
+ LLFavoritesOrderStorage::instance().removeFavoritesRecordOfUser();
+ }
+}
+
+void LLFavoritesOrderStorage::load()
+{
+ // load per-resident sorting information
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_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)
+ {
+ mSortIndexes.insert(std::make_pair(LLUUID(iter->first), (S32)iter->second.asInteger()));
+ }
+}
+
+void LLFavoritesOrderStorage::saveFavoritesSLURLs()
+{
+ // Do not change the file if we are not logged in yet.
+ if (!LLLoginInstance::getInstance()->authSuccess())
+ {
+ llwarns << "Cannot save favorites: not logged in" << llendl;
+ return;
+ }
+
+ std::string user_dir = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "");
+ if (user_dir.empty())
+ {
+ llwarns << "Cannot save favorites: empty user dir name" << llendl;
+ return;
+ }
+
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");
+ llifstream in_file;
+ in_file.open(filename);
+ LLSD fav_llsd;
+ if (in_file.is_open())
+ {
+ LLSDSerialize::fromXML(fav_llsd, in_file);
+ }
+
+ 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);
+
+ LLSD user_llsd;
+ for (LLInventoryModel::item_array_t::iterator it = items.begin(); it != items.end(); it++)
+ {
+ LLSD value;
+ value["name"] = (*it)->getName();
+ value["asset_id"] = (*it)->getAssetUUID();
+
+ slurls_map_t::iterator slurl_iter = mSLURLs.find(value["asset_id"]);
+ if (slurl_iter != mSLURLs.end())
+ {
+ lldebugs << "Saving favorite: idx=" << LLFavoritesOrderStorage::instance().getSortIndex((*it)->getUUID()) << ", SLURL=" << slurl_iter->second << ", value=" << value << llendl;
+ value["slurl"] = slurl_iter->second;
+ user_llsd[LLFavoritesOrderStorage::instance().getSortIndex((*it)->getUUID())] = value;
+ }
+ else
+ {
+ llwarns << "Not saving favorite " << value["name"] << ": no matching SLURL" << llendl;
+ }
+ }
+
+ LLAvatarName av_name;
+ LLAvatarNameCache::get( gAgentID, &av_name );
+ // Note : use the "John Doe" and not the "john.doe" version of the name
+ // as we'll compare it with the stored credentials in the login panel.
+ lldebugs << "Saved favorites for " << av_name.getUserName() << llendl;
+ fav_llsd[av_name.getUserName()] = user_llsd;
+
+ llofstream file;
+ file.open(filename);
+ LLSDSerialize::toPrettyXML(fav_llsd, file);
+}
+
+void LLFavoritesOrderStorage::removeFavoritesRecordOfUser()
+{
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");
+ LLSD fav_llsd;
+ llifstream file;
+ file.open(filename);
+ if (!file.is_open()) return;
+ LLSDSerialize::fromXML(fav_llsd, file);
+
+ LLAvatarName av_name;
+ LLAvatarNameCache::get( gAgentID, &av_name );
+ // Note : use the "John Doe" and not the "john.doe" version of the name.
+ // See saveFavoritesSLURLs() here above for the reason why.
+ lldebugs << "Removed favorites for " << av_name.getUserName() << llendl;
+ if (fav_llsd.has(av_name.getUserName()))
+ {
+ fav_llsd.erase(av_name.getUserName());
+ }
+
+ llofstream out_file;
+ out_file.open(filename);
+ LLSDSerialize::toPrettyXML(fav_llsd, out_file);
+
+}
+
+void LLFavoritesOrderStorage::onLandmarkLoaded(const LLUUID& asset_id, LLLandmark* landmark)
+{
+ if (!landmark) return;
+
+ LLVector3d pos_global;
+ if (!landmark->getGlobalPos(pos_global))
+ {
+ // If global position was unknown on first getGlobalPos() call
+ // it should be set for the subsequent calls.
+ landmark->getGlobalPos(pos_global);
+ }
+
+ if (!pos_global.isExactlyZero())
+ {
+ LLLandmarkActions::getSLURLfromPosGlobal(pos_global,
+ boost::bind(&LLFavoritesOrderStorage::storeFavoriteSLURL, this, asset_id, _1));
+ }
+}
+
+void LLFavoritesOrderStorage::storeFavoriteSLURL(const LLUUID& asset_id, std::string& slurl)
+{
+ lldebugs << "Saving landmark SLURL: " << slurl << llendl;
+ mSLURLs[asset_id] = slurl;
+}
+
+void LLFavoritesOrderStorage::save()
+{
+ // 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())
+ {
+ 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);
+}
+
+void LLFavoritesOrderStorage::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 (LLInventoryModel::item_array_t::const_iterator i = items.begin(); i != items.end(); ++i)
+ {
+ LLViewerInventoryItem* item = *i;
+
+ setSortIndex(item, ++sortField);
+
+ item->setComplete(TRUE);
+ item->updateServer(FALSE);
+
+ gInventory.updateItem(item);
+
+ // Tell the parent folder to refresh its sort order.
+ gInventory.addChangedMask(LLInventoryObserver::SORT, item->getParentUUID());
+ }
+
+ gInventory.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 LLFavoritesOrderStorage::instance().getSortIndex(a->getUUID())
+ < LLFavoritesOrderStorage::instance().getSortIndex(b->getUUID());
+ }
+};
+
+// * @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 LLFavoritesOrderStorage::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
+ std::sort(items.begin(), items.end(), LLViewerInventoryItemSort());
+
+ // update order
+ gInventory.updateItemsOrder(items, source_item_id, target_item_id);
+
+ saveItemsOrder(items);
+}
+
+void AddFavoriteLandmarkCallback::fire(const LLUUID& inv_item_id)
+{
+ if (mTargetLandmarkId.isNull()) return;
+
+ LLFavoritesOrderStorage::instance().rearrangeFavoriteLandmarks(inv_item_id, mTargetLandmarkId);
+}
// EOF
diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h
index 447d30f1f4..e000adc4aa 100644
--- a/indra/newview/llfavoritesbar.h
+++ b/indra/newview/llfavoritesbar.h
@@ -33,6 +33,7 @@
#include "llinventoryobserver.h"
#include "llinventorymodel.h"
+#include "llviewerinventory.h"
class LLMenuItemCallGL;
class LLToggleableMenu;
@@ -161,5 +162,115 @@ private:
boost::signals2::connection mEndDragConnection;
};
+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;
+};
+
+/**
+ * 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>
+{
+ LOG_CLASS(LLFavoritesOrderStorage);
+public:
+ /**
+ * Sets sort index for specified with LLUUID favorite landmark
+ */
+ void setSortIndex(const LLViewerInventoryItem* inv_item, 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);
+
+ void getSLURL(const LLUUID& asset_id);
+
+ // Saves current order of the passed items using inventory item sort field.
+ // Resets 'items' sort fields and saves them on server.
+ // Is used to save order for Favorites folder.
+ void saveItemsOrder(const LLInventoryModel::item_array_t& items);
+
+ void rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_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();
+
+ void saveFavoritesSLURLs();
+
+ // Remove record of current user's favorites from file on disk.
+ void removeFavoritesRecordOfUser();
+
+ void onLandmarkLoaded(const LLUUID& asset_id, class LLLandmark* landmark);
+ void storeFavoriteSLURL(const LLUUID& asset_id, std::string& slurl);
+
+ typedef std::map<LLUUID, S32> sort_index_map_t;
+ sort_index_map_t mSortIndexes;
+
+ typedef std::map<LLUUID, std::string> slurls_map_t;
+ slurls_map_t mSLURLs;
+
+ bool mIsDirty;
+
+ struct IsNotInFavorites
+ {
+ IsNotInFavorites(const LLInventoryModel::item_array_t& items)
+ : mFavoriteItems(items)
+ {
+
+ }
+
+ /**
+ * 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;
+
+ LLInventoryModel::item_array_t::const_iterator found_it =
+ std::find(mFavoriteItems.begin(), mFavoriteItems.end(), item);
+
+ return found_it == mFavoriteItems.end();
+ }
+ private:
+ LLInventoryModel::item_array_t mFavoriteItems;
+ };
+
+};
#endif // LL_LLFAVORITESBARCTRL_H
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index 393f8b9d46..a4cadcd5dc 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -57,6 +57,7 @@
#include "lldxhardware.h"
#endif
+#define LL_EXPORT_GPU_TABLE 0
#if LL_DARWIN
const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt";
@@ -386,6 +387,13 @@ void LLFeatureManager::parseGPUTable(std::string filename)
*i = tolower(*i);
}
+#if LL_EXPORT_GPU_TABLE
+ llofstream json;
+ json.open("gpu_table.json");
+
+ json << "var gpu_table = [" << std::endl;
+#endif
+
bool gpuFound;
U32 lineNumber;
for (gpuFound = false, lineNumber = 0; !gpuFound && !file.eof(); lineNumber++)
@@ -411,7 +419,7 @@ void LLFeatureManager::parseGPUTable(std::string filename)
// setup the tokenizer
std::string buf(buffer);
- std::string cls, label, expr, supported;
+ std::string cls, label, expr, supported, stats_based, expected_gl_version;
boost_tokenizer tokens(buf, boost::char_separator<char>("\t\n"));
boost_tokenizer::iterator token_iter = tokens.begin();
@@ -432,13 +440,29 @@ void LLFeatureManager::parseGPUTable(std::string filename)
{
supported = *token_iter++;
}
+ if (token_iter != tokens.end())
+ {
+ stats_based = *token_iter++;
+ }
+ if (token_iter != tokens.end())
+ {
+ expected_gl_version = *token_iter++;
+ }
if (label.empty() || expr.empty() || cls.empty() || supported.empty())
{
LL_WARNS("RenderInit") << "invald gpu_table.txt:" << lineNumber << ": '" << buffer << "'" << LL_ENDL;
continue;
}
-
+#if LL_EXPORT_GPU_TABLE
+ json << "{'label' : '" << label << "',\n" <<
+ "'regexp' : '" << expr << "',\n" <<
+ "'class' : '" << cls << "',\n" <<
+ "'supported' : '" << supported << "',\n" <<
+ "'stats_based' : " << stats_based << ",\n" <<
+ "'gl_version' : " << expected_gl_version << "\n},\n";
+#endif
+
for (U32 i = 0; i < expr.length(); i++) /*Flawfinder: ignore*/
{
expr[i] = tolower(expr[i]);
@@ -449,12 +473,19 @@ void LLFeatureManager::parseGPUTable(std::string filename)
if(boost::regex_search(renderer, re))
{
// if we found it, stop!
+#if !LL_EXPORT_GPU_TABLE
gpuFound = true;
+#endif
mGPUString = label;
mGPUClass = (EGPUClass) strtol(cls.c_str(), NULL, 10);
mGPUSupported = (BOOL) strtol(supported.c_str(), NULL, 10);
+ sscanf(expected_gl_version.c_str(), "%f", &mExpectedGLVersion);
}
}
+#if LL_EXPORT_GPU_TABLE
+ json << "];\n\n";
+ json.close();
+#endif
file.close();
if ( gpuFound )
@@ -469,6 +500,10 @@ void LLFeatureManager::parseGPUTable(std::string filename)
{
LL_WARNS("RenderInit") << "GPU '" << rawRenderer << "' not recognized" << LL_ENDL;
}
+
+#if LL_DARWIN // never go over "Mid" settings by default on OS X
+ mGPUClass = llmin(mGPUClass, GPU_CLASS_2);
+#endif
}
// responder saves table into file
@@ -585,7 +620,7 @@ void LLFeatureManager::applyRecommendedSettings()
{
// apply saved settings
// cap the level at 2 (high)
- S32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_2));
+ S32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_5));
llinfos << "Applying Recommended Features" << llendl;
@@ -680,12 +715,21 @@ void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures)
}
break;
case 1:
- maskFeatures("Mid");
+ maskFeatures("LowMid");
break;
case 2:
- maskFeatures("High");
+ maskFeatures("Mid");
break;
case 3:
+ maskFeatures("MidHigh");
+ break;
+ case 4:
+ maskFeatures("High");
+ break;
+ case 5:
+ maskFeatures("HighUltra");
+ break;
+ case 6:
maskFeatures("Ultra");
break;
default:
@@ -715,14 +759,16 @@ void LLFeatureManager::applyBaseMasks()
mFeatures = maskp->getFeatures();
// mask class
- if (mGPUClass >= 0 && mGPUClass < 4)
+ if (mGPUClass >= 0 && mGPUClass < 6)
{
const char* class_table[] =
{
"Class0",
"Class1",
"Class2",
- "Class3"
+ "Class3",
+ "Class4",
+ "Class5",
};
LL_INFOS("RenderInit") << "Setting GPU Class to " << class_table[mGPUClass] << LL_ENDL;
diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h
index c9cb397fcc..ad72c16743 100644
--- a/indra/newview/llfeaturemanager.h
+++ b/indra/newview/llfeaturemanager.h
@@ -39,7 +39,9 @@ typedef enum EGPUClass
GPU_CLASS_0 = 0,
GPU_CLASS_1 = 1,
GPU_CLASS_2 = 2,
- GPU_CLASS_3 = 3
+ GPU_CLASS_3 = 3,
+ GPU_CLASS_4 = 4,
+ GPU_CLASS_5 = 5
} EGPUClass;
@@ -101,7 +103,8 @@ public:
mTableVersion(0),
mSafe(FALSE),
mGPUClass(GPU_CLASS_UNKNOWN),
- mGPUSupported(FALSE)
+ mExpectedGLVersion(0.f),
+ mGPUSupported(FALSE)
{
}
~LLFeatureManager() {cleanupFeatureTables();}
@@ -116,6 +119,7 @@ public:
EGPUClass getGPUClass() { return mGPUClass; }
std::string& getGPUString() { return mGPUString; }
BOOL isGPUSupported() { return mGPUSupported; }
+ F32 getExpectedGLVersion() { return mExpectedGLVersion; }
void cleanupFeatureTables();
@@ -155,6 +159,7 @@ protected:
S32 mTableVersion;
BOOL mSafe; // Reinitialize everything to the "safe" mask
EGPUClass mGPUClass;
+ F32 mExpectedGLVersion; //expected GL version according to gpu table
std::string mGPUString;
BOOL mGPUSupported;
};
diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h
index 55c665b9c7..4f602f63f1 100644
--- a/indra/newview/llfilepicker.h
+++ b/indra/newview/llfilepicker.h
@@ -39,8 +39,8 @@
#include <Carbon/Carbon.h>
// AssertMacros.h does bad things.
+#include "fix_macros.h"
#undef verify
-#undef check
#undef require
#include <vector>
diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp
index a9f52282a5..e2850f5181 100644
--- a/indra/newview/llfirstuse.cpp
+++ b/indra/newview/llfirstuse.cpp
@@ -74,7 +74,7 @@ void LLFirstUse::resetFirstUse()
// static
void LLFirstUse::otherAvatarChatFirst(bool enable)
{
- firstUseNotification("FirstOtherChatBeforeUser", enable, "HintChat", LLSD(), LLSD().with("target", "chat_bar").with("direction", "top_right").with("distance", 24));
+ firstUseNotification("FirstOtherChatBeforeUser", enable, "HintChat", LLSD(), LLSD().with("target", "nearby_chat").with("direction", "top_right").with("distance", 24));
}
// static
diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp
index ef412a6bbf..a5ee4607a1 100644
--- a/indra/newview/llflexibleobject.cpp
+++ b/indra/newview/llflexibleobject.cpp
@@ -48,7 +48,7 @@ std::vector<LLVolumeImplFlexible*> LLVolumeImplFlexible::sInstanceList;
std::vector<S32> LLVolumeImplFlexible::sUpdateDelay;
static LLFastTimer::DeclareTimer FTM_FLEXIBLE_REBUILD("Rebuild");
-static LLFastTimer::DeclareTimer FTM_DO_FLEXIBLE_UPDATE("Update");
+static LLFastTimer::DeclareTimer FTM_DO_FLEXIBLE_UPDATE("Flexible Update");
// LLFlexibleObjectData::pack/unpack now in llprimitive.cpp
@@ -66,7 +66,7 @@ LLVolumeImplFlexible::LLVolumeImplFlexible(LLViewerObject* vo, LLFlexibleObjectD
mSimulateRes = 0;
mFrameNum = 0;
mCollisionSphereRadius = 0.f;
- mRenderRes = 1;
+ mRenderRes = -1;
if(mVO->mDrawable.notNull())
{
@@ -342,29 +342,32 @@ void LLVolumeImplFlexible::doIdleUpdate()
if (drawablep)
{
//LLFastTimer ftm(FTM_FLEXIBLE_UPDATE);
-
+
//ensure drawable is active
drawablep->makeActive();
-
+
if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_FLEXIBLE))
{
bool visible = drawablep->isVisible();
- if ((mSimulateRes == 0) && visible)
+ if (mRenderRes == -1)
{
updateRenderRes();
gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE);
+ sUpdateDelay[mInstanceIndex] = 0;
}
else
{
F32 pixel_area = mVO->getPixelArea();
- U32 update_period = (U32) (LLViewerCamera::getInstance()->getScreenPixelArea()*0.01f/(pixel_area*(sUpdateFactor+1.f)))+1;
+ U32 update_period = (U32) (llmax((S32) (LLViewerCamera::getInstance()->getScreenPixelArea()*0.01f/(pixel_area*(sUpdateFactor+1.f))),0)+1);
+ // MAINT-1890 Clamp the update period to ensure that the update_period is no greater than 32 frames
+ update_period = llclamp(update_period, 0U, 32U);
if (visible)
{
if (!drawablep->isState(LLDrawable::IN_REBUILD_Q1) &&
- mVO->getPixelArea() > 256.f)
+ pixel_area > 256.f)
{
U32 id;
@@ -378,21 +381,31 @@ void LLVolumeImplFlexible::doIdleUpdate()
id = parent->getVolumeInterfaceID();
}
- if ((LLDrawable::getCurrentFrame()+id)%update_period == 0)
- {
+ if (mVO->isRootEdit())
+ {
+ id = mID;
+ }
+ else
+ {
+ LLVOVolume* parent = (LLVOVolume*) mVO->getParent();
+ id = parent->getVolumeInterfaceID();
+ }
+
+ if ((LLDrawable::getCurrentFrame()+id)%update_period == 0)
+ {
sUpdateDelay[mInstanceIndex] = (S32) update_period-1;
- updateRenderRes();
+ updateRenderRes();
- gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE);
- }
- }
+ gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE);
}
+ }
+ }
else
{
sUpdateDelay[mInstanceIndex] = (S32) update_period;
- }
- }
+ }
+}
}
}
@@ -417,7 +430,6 @@ void LLVolumeImplFlexible::doFlexibleUpdate()
if ((mSimulateRes == 0 || !mInitialized) && mVO->mDrawable->isVisible())
{
BOOL force_update = mSimulateRes == 0 ? TRUE : FALSE;
-
doIdleUpdate();
if (!force_update || !gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_FLEXIBLE))
@@ -431,6 +443,15 @@ void LLVolumeImplFlexible::doFlexibleUpdate()
//the object is not visible
return ;
}
+
+ // Fix for MAINT-1894
+ // Skipping the flexible update if render res is negative. If we were to continue with a negative value,
+ // the subsequent S32 num_render_sections = 1<<mRenderRes; code will specify a really large number of
+ // render sections which will then create a length exception in the std::vector::resize() method.
+ if (mRenderRes < 0)
+ {
+ return;
+ }
S32 num_sections = 1 << mSimulateRes;
@@ -639,6 +660,7 @@ void LLVolumeImplFlexible::doFlexibleUpdate()
mSection[i].mdPosition = (mSection[i].mPosition - mSection[i-1].mPosition) * inv_section_length;
// Create points
+ llassert(mRenderRes > -1)
S32 num_render_sections = 1<<mRenderRes;
if (path->getPathLength() != num_render_sections+1)
{
diff --git a/indra/newview/llfloaterautoreplacesettings.cpp b/indra/newview/llfloaterautoreplacesettings.cpp
index 7d1bcba978..6e56e929df 100644
--- a/indra/newview/llfloaterautoreplacesettings.cpp
+++ b/indra/newview/llfloaterautoreplacesettings.cpp
@@ -478,14 +478,25 @@ bool LLFloaterAutoReplaceSettings::callbackNewListName(const LLSD& notification,
bool LLFloaterAutoReplaceSettings::callbackListNameConflict(const LLSD& notification, const LLSD& response)
{
LLSD newList = notification["payload"]["list"];
-
+ std::string listName = LLAutoReplaceSettings::getListName(newList);
+
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch ( option )
{
case 0:
// Replace current list
- LL_INFOS("AutoReplace")<<"option 'replace current list' selected"<<LL_ENDL;
-
+ if ( LLAutoReplaceSettings::AddListOk == mSettings.replaceList(newList) )
+ {
+ LL_INFOS("AutoReplace") << "replaced list '"<<listName<<"'"<<LL_ENDL;
+ mSelectedListName = listName;
+ updateListNames();
+ updateListNamesControls();
+ updateReplacementsList();
+ }
+ else
+ {
+ LL_WARNS("AutoReplace")<<"failed to replace list '"<<listName<<"'"<<LL_ENDL;
+ }
break;
case 1:
@@ -503,14 +514,27 @@ bool LLFloaterAutoReplaceSettings::callbackListNameConflict(const LLSD& notifica
void LLFloaterAutoReplaceSettings::onDeleteList()
{
- std::string listName= mListNames->getFirstSelected()->getColumn(0)->getValue().asString();
- mSettings.removeReplacementList(listName); // remove from the copy of settings
- mReplacementsList->deleteSelectedItems(); // remove from the scrolling list
-
- mSelectedListName.clear();
- updateListNames();
- updateListNamesControls();
- updateReplacementsList();
+ std::string listName = mListNames->getSelectedValue().asString();
+ if ( ! listName.empty() )
+ {
+ if ( mSettings.removeReplacementList(listName) )
+ {
+ LL_INFOS("AutoReplace")<<"deleted list '"<<listName<<"'"<<LL_ENDL;
+ mReplacementsList->deleteSelectedItems(); // remove from the scrolling list
+ mSelectedListName.clear();
+ updateListNames();
+ updateListNamesControls();
+ updateReplacementsList();
+ }
+ else
+ {
+ LL_WARNS("AutoReplace")<<"failed to delete list '"<<listName<<"'"<<LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_DEBUGS("AutoReplace")<<"no list selected for delete"<<LL_ENDL;
+ }
}
void LLFloaterAutoReplaceSettings::onExportList()
diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp
index 0290e7cdf0..f7dd4a4a6b 100644
--- a/indra/newview/llfloateravatarpicker.cpp
+++ b/indra/newview/llfloateravatarpicker.cpp
@@ -49,6 +49,8 @@
#include "llscrolllistcell.h"
#include "lltabcontainer.h"
#include "lluictrlfactory.h"
+#include "llfocusmgr.h"
+#include "lldraghandle.h"
#include "message.h"
//#include "llsdserialize.h"
@@ -58,11 +60,14 @@ static std::map<LLUUID, LLAvatarName> sAvatarNameMap;
LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(select_callback_t callback,
BOOL allow_multiple,
- BOOL closeOnSelect)
+ BOOL closeOnSelect,
+ BOOL skip_agent,
+ const std::string& name,
+ LLView * frustumOrigin)
{
// *TODO: Use a key to allow this not to be an effective singleton
LLFloaterAvatarPicker* floater =
- LLFloaterReg::showTypedInstance<LLFloaterAvatarPicker>("avatar_picker");
+ LLFloaterReg::showTypedInstance<LLFloaterAvatarPicker>("avatar_picker", LLSD(name));
if (!floater)
{
llwarns << "Cannot instantiate avatar picker" << llendl;
@@ -73,6 +78,7 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(select_callback_t callback,
floater->setAllowMultiple(allow_multiple);
floater->mNearMeListComplete = FALSE;
floater->mCloseOnSelect = closeOnSelect;
+ floater->mExcludeAgentFromSearchResults = skip_agent;
if (!closeOnSelect)
{
@@ -83,6 +89,11 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(select_callback_t callback,
floater->getChild<LLButton>("cancel_btn")->setLabel(close_string);
}
+ if(frustumOrigin)
+ {
+ floater->mFrustumOrigin = frustumOrigin->getHandle();
+ }
+
return floater;
}
@@ -91,9 +102,17 @@ LLFloaterAvatarPicker::LLFloaterAvatarPicker(const LLSD& key)
: LLFloater(key),
mNumResultsReturned(0),
mNearMeListComplete(FALSE),
- mCloseOnSelect(FALSE)
+ mCloseOnSelect(FALSE),
+ mContextConeOpacity (0.f),
+ mContextConeInAlpha(0.f),
+ mContextConeOutAlpha(0.f),
+ mContextConeFadeTime(0.f)
{
mCommitCallbackRegistrar.add("Refresh.FriendList", boost::bind(&LLFloaterAvatarPicker::populateFriend, this));
+
+ mContextConeInAlpha = gSavedSettings.getF32("ContextConeInAlpha");
+ mContextConeOutAlpha = gSavedSettings.getF32("ContextConeOutAlpha");
+ mContextConeFadeTime = gSavedSettings.getF32("ContextConeFadeTime");
}
BOOL LLFloaterAvatarPicker::postBuild()
@@ -288,9 +307,9 @@ void LLFloaterAvatarPicker::populateNearMe()
else
{
element["columns"][0]["column"] = "name";
- element["columns"][0]["value"] = av_name.mDisplayName;
+ element["columns"][0]["value"] = av_name.getDisplayName();
element["columns"][1]["column"] = "username";
- element["columns"][1]["value"] = av_name.mUsername;
+ element["columns"][1]["value"] = av_name.getUserName();
sAvatarNameMap[av] = av_name;
}
@@ -338,8 +357,67 @@ void LLFloaterAvatarPicker::populateFriend()
friends_scroller->sortByColumnIndex(0, TRUE);
}
+void LLFloaterAvatarPicker::drawFrustum()
+{
+ if(mFrustumOrigin.get())
+ {
+ LLView * frustumOrigin = mFrustumOrigin.get();
+ LLRect origin_rect;
+ frustumOrigin->localRectToOtherView(frustumOrigin->getLocalRect(), &origin_rect, this);
+ // draw context cone connecting color picker with color swatch in parent floater
+ LLRect local_rect = getLocalRect();
+ if (hasFocus() && frustumOrigin->isInVisibleChain() && mContextConeOpacity > 0.001f)
+ {
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ LLGLEnable(GL_CULL_FACE);
+ gGL.begin(LLRender::QUADS);
+ {
+ gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
+ gGL.vertex2i(origin_rect.mLeft, origin_rect.mTop);
+ gGL.vertex2i(origin_rect.mRight, origin_rect.mTop);
+ gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
+ gGL.vertex2i(local_rect.mRight, local_rect.mTop);
+ gGL.vertex2i(local_rect.mLeft, local_rect.mTop);
+
+ gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
+ gGL.vertex2i(local_rect.mLeft, local_rect.mTop);
+ gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);
+ gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
+ gGL.vertex2i(origin_rect.mLeft, origin_rect.mBottom);
+ gGL.vertex2i(origin_rect.mLeft, origin_rect.mTop);
+
+ gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
+ gGL.vertex2i(local_rect.mRight, local_rect.mBottom);
+ gGL.vertex2i(local_rect.mRight, local_rect.mTop);
+ gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
+ gGL.vertex2i(origin_rect.mRight, origin_rect.mTop);
+ gGL.vertex2i(origin_rect.mRight, origin_rect.mBottom);
+
+ gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
+ gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);
+ gGL.vertex2i(local_rect.mRight, local_rect.mBottom);
+ gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
+ gGL.vertex2i(origin_rect.mRight, origin_rect.mBottom);
+ gGL.vertex2i(origin_rect.mLeft, origin_rect.mBottom);
+ }
+ gGL.end();
+ }
+
+ if (gFocusMgr.childHasMouseCapture(getDragHandle()))
+ {
+ mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"), LLCriticalDamp::getInterpolant(mContextConeFadeTime));
+ }
+ else
+ {
+ mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLCriticalDamp::getInterpolant(mContextConeFadeTime));
+ }
+ }
+}
+
void LLFloaterAvatarPicker::draw()
{
+ drawFrustum();
+
// sometimes it is hard to determine when Select/Ok button should be disabled (see LLAvatarActions::shareWithAvatars).
// lets check this via mOkButtonValidateSignal callback periodically.
static LLFrameTimer timer;
@@ -382,8 +460,9 @@ class LLAvatarPickerResponder : public LLHTTPClient::Responder
{
public:
LLUUID mQueryID;
+ std::string mName;
- LLAvatarPickerResponder(const LLUUID& id) : mQueryID(id) { }
+ LLAvatarPickerResponder(const LLUUID& id, const std::string& name) : mQueryID(id), mName(name) { }
/*virtual*/ void completed(U32 status, const std::string& reason, const LLSD& content)
{
@@ -396,7 +475,7 @@ public:
if (isGoodStatus(status) || status == 400)
{
LLFloaterAvatarPicker* floater =
- LLFloaterReg::findTypedInstance<LLFloaterAvatarPicker>("avatar_picker");
+ LLFloaterReg::findTypedInstance<LLFloaterAvatarPicker>("avatar_picker", mName);
if (floater)
{
floater->processResponse(mQueryID, content);
@@ -426,9 +505,7 @@ void LLFloaterAvatarPicker::find()
LLViewerRegion* region = gAgent.getRegion();
url = region->getCapability("AvatarPickerSearch");
// Prefer use of capabilities to search on both SLID and display name
- // but allow display name search to be manually turned off for test
- if (!url.empty()
- && LLAvatarNameCache::useDisplayNames())
+ if (!url.empty())
{
// capability urls don't end in '/', but we need one to parse
// query parameters correctly
@@ -439,7 +516,7 @@ void LLFloaterAvatarPicker::find()
url += "?page_size=100&names=";
url += LLURI::escape(text);
llinfos << "avatar picker " << url << llendl;
- LLHTTPClient::get(url, new LLAvatarPickerResponder(mQueryID));
+ LLHTTPClient::get(url, new LLAvatarPickerResponder(mQueryID, getKey().asString()));
}
else
{
@@ -581,35 +658,36 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void*
msg->getUUIDFast( _PREHASH_Data,_PREHASH_AvatarID, avatar_id, i);
msg->getStringFast(_PREHASH_Data,_PREHASH_FirstName, first_name, i);
msg->getStringFast(_PREHASH_Data,_PREHASH_LastName, last_name, i);
-
- std::string avatar_name;
- if (avatar_id.isNull())
- {
- LLStringUtil::format_map_t map;
- map["[TEXT]"] = floater->getChild<LLUICtrl>("Edit")->getValue().asString();
- avatar_name = floater->getString("not_found", map);
- search_results->setEnabled(FALSE);
- floater->getChildView("ok_btn")->setEnabled(FALSE);
- }
- else
+
+ if (avatar_id != agent_id || !floater->isExcludeAgentFromSearchResults()) // exclude agent from search results?
{
- avatar_name = LLCacheName::buildFullName(first_name, last_name);
- search_results->setEnabled(TRUE);
- found_one = TRUE;
+ std::string avatar_name;
+ if (avatar_id.isNull())
+ {
+ LLStringUtil::format_map_t map;
+ map["[TEXT]"] = floater->getChild<LLUICtrl>("Edit")->getValue().asString();
+ avatar_name = floater->getString("not_found", map);
+ search_results->setEnabled(FALSE);
+ floater->getChildView("ok_btn")->setEnabled(FALSE);
+ }
+ else
+ {
+ avatar_name = LLCacheName::buildFullName(first_name, last_name);
+ search_results->setEnabled(TRUE);
+ found_one = TRUE;
- LLAvatarName av_name;
- av_name.mLegacyFirstName = first_name;
- av_name.mLegacyLastName = last_name;
- av_name.mDisplayName = avatar_name;
- const LLUUID& agent_id = avatar_id;
- sAvatarNameMap[agent_id] = av_name;
+ LLAvatarName av_name;
+ av_name.fromString(avatar_name);
+ const LLUUID& agent_id = avatar_id;
+ sAvatarNameMap[agent_id] = av_name;
+ }
+ LLSD element;
+ element["id"] = avatar_id; // value
+ element["columns"][0]["column"] = "name";
+ element["columns"][0]["value"] = avatar_name;
+ search_results->addElement(element);
}
- LLSD element;
- element["id"] = avatar_id; // value
- element["columns"][0]["column"] = "name";
- element["columns"][0]["value"] = avatar_name;
- search_results->addElement(element);
}
if (found_one)
@@ -624,52 +702,58 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void*
void LLFloaterAvatarPicker::processResponse(const LLUUID& query_id, const LLSD& content)
{
// Check for out-of-date query
- if (query_id != mQueryID) return;
+ if (query_id == mQueryID)
+ {
+ LLScrollListCtrl* search_results = getChild<LLScrollListCtrl>("SearchResults");
- LLScrollListCtrl* search_results = getChild<LLScrollListCtrl>("SearchResults");
+ LLSD agents = content["agents"];
+
+ // clear "Searching" label on first results
+ search_results->deleteAllItems();
- LLSD agents = content["agents"];
- if (agents.size() == 0)
- {
- LLStringUtil::format_map_t map;
- map["[TEXT]"] = childGetText("Edit");
LLSD item;
- item["id"] = LLUUID::null;
- item["columns"][0]["column"] = "name";
- item["columns"][0]["value"] = getString("not_found", map);
- search_results->addElement(item);
- search_results->setEnabled(false);
- getChildView("ok_btn")->setEnabled(false);
- return;
- }
+ LLSD::array_const_iterator it = agents.beginArray();
+ for ( ; it != agents.endArray(); ++it)
+ {
+ const LLSD& row = *it;
+ if (row["id"].asUUID() != gAgent.getID() || !mExcludeAgentFromSearchResults)
+ {
+ item["id"] = row["id"];
+ LLSD& columns = item["columns"];
+ columns[0]["column"] = "name";
+ columns[0]["value"] = row["display_name"];
+ columns[1]["column"] = "username";
+ columns[1]["value"] = row["username"];
+ search_results->addElement(item);
+
+ // add the avatar name to our list
+ LLAvatarName avatar_name;
+ avatar_name.fromLLSD(row);
+ sAvatarNameMap[row["id"].asUUID()] = avatar_name;
+ }
+ }
- // clear "Searching" label on first results
- search_results->deleteAllItems();
-
- LLSD item;
- LLSD::array_const_iterator it = agents.beginArray();
- for ( ; it != agents.endArray(); ++it)
- {
- const LLSD& row = *it;
- item["id"] = row["id"];
- LLSD& columns = item["columns"];
- columns[0]["column"] = "name";
- columns[0]["value"] = row["display_name"];
- columns[1]["column"] = "username";
- columns[1]["value"] = row["username"];
- search_results->addElement(item);
-
- // add the avatar name to our list
- LLAvatarName avatar_name;
- avatar_name.fromLLSD(row);
- sAvatarNameMap[row["id"].asUUID()] = avatar_name;
- }
-
- getChildView("ok_btn")->setEnabled(true);
- search_results->setEnabled(true);
- search_results->selectFirstItem();
- onList();
- search_results->setFocus(TRUE);
+ if (search_results->isEmpty())
+ {
+ LLStringUtil::format_map_t map;
+ map["[TEXT]"] = childGetText("Edit");
+ LLSD item;
+ item["id"] = LLUUID::null;
+ item["columns"][0]["column"] = "name";
+ item["columns"][0]["value"] = getString("not_found", map);
+ search_results->addElement(item);
+ search_results->setEnabled(false);
+ getChildView("ok_btn")->setEnabled(false);
+ }
+ else
+ {
+ getChildView("ok_btn")->setEnabled(true);
+ search_results->setEnabled(true);
+ search_results->selectFirstItem();
+ onList();
+ search_results->setFocus(TRUE);
+ }
+ }
}
//static
diff --git a/indra/newview/llfloateravatarpicker.h b/indra/newview/llfloateravatarpicker.h
index 96c039443a..ed3e51c56f 100644
--- a/indra/newview/llfloateravatarpicker.h
+++ b/indra/newview/llfloateravatarpicker.h
@@ -34,7 +34,7 @@
class LLAvatarName;
class LLScrollListCtrl;
-class LLFloaterAvatarPicker : public LLFloater
+class LLFloaterAvatarPicker :public LLFloater
{
public:
typedef boost::signals2::signal<bool(const uuid_vec_t&), boost_boolean_combiner> validate_signal_t;
@@ -45,7 +45,10 @@ public:
// Call this to select an avatar.
static LLFloaterAvatarPicker* show(select_callback_t callback,
BOOL allow_multiple = FALSE,
- BOOL closeOnSelect = FALSE);
+ BOOL closeOnSelect = FALSE,
+ BOOL skip_agent = FALSE,
+ const std::string& name = "",
+ LLView * frustumOrigin = NULL);
LLFloaterAvatarPicker(const LLSD& key);
virtual ~LLFloaterAvatarPicker();
@@ -63,6 +66,7 @@ public:
std::string& tooltip_msg);
void openFriendsTab();
+ BOOL isExcludeAgentFromSearchResults() {return mExcludeAgentFromSearchResults;}
private:
void editKeystroke(class LLLineEditor* caller, void* user_data);
@@ -84,13 +88,20 @@ private:
void setAllowMultiple(BOOL allow_multiple);
LLScrollListCtrl* getActiveList();
+ void drawFrustum();
virtual void draw();
virtual BOOL handleKeyHere(KEY key, MASK mask);
LLUUID mQueryID;
- int mNumResultsReturned;
+ int mNumResultsReturned;
BOOL mNearMeListComplete;
BOOL mCloseOnSelect;
+ BOOL mExcludeAgentFromSearchResults;
+ LLHandle <LLView> mFrustumOrigin;
+ F32 mContextConeOpacity;
+ F32 mContextConeInAlpha;
+ F32 mContextConeOutAlpha;
+ F32 mContextConeFadeTime;
validate_signal_t mOkButtonValidateSignal;
select_callback_t mSelectionCallback;
diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp
index 90f40628a8..76f62a7880 100644
--- a/indra/newview/llfloaterbulkpermission.cpp
+++ b/indra/newview/llfloaterbulkpermission.cpp
@@ -57,6 +57,7 @@ LLFloaterBulkPermission::LLFloaterBulkPermission(const LLSD& seed)
mDone(FALSE)
{
mID.generate();
+ mCommitCallbackRegistrar.add("BulkPermission.Ok", boost::bind(&LLFloaterBulkPermission::onOkBtn, this));
mCommitCallbackRegistrar.add("BulkPermission.Apply", boost::bind(&LLFloaterBulkPermission::onApplyBtn, this));
mCommitCallbackRegistrar.add("BulkPermission.Close", boost::bind(&LLFloaterBulkPermission::onCloseBtn, this));
mCommitCallbackRegistrar.add("BulkPermission.CheckAll", boost::bind(&LLFloaterBulkPermission::onCheckAll, this));
@@ -66,6 +67,21 @@ LLFloaterBulkPermission::LLFloaterBulkPermission(const LLSD& seed)
BOOL LLFloaterBulkPermission::postBuild()
{
+ mBulkChangeIncludeAnimations = gSavedSettings.getBOOL("BulkChangeIncludeAnimations");
+ mBulkChangeIncludeBodyParts = gSavedSettings.getBOOL("BulkChangeIncludeBodyParts");
+ mBulkChangeIncludeClothing = gSavedSettings.getBOOL("BulkChangeIncludeClothing");
+ mBulkChangeIncludeGestures = gSavedSettings.getBOOL("BulkChangeIncludeGestures");
+ mBulkChangeIncludeNotecards = gSavedSettings.getBOOL("BulkChangeIncludeNotecards");
+ mBulkChangeIncludeObjects = gSavedSettings.getBOOL("BulkChangeIncludeObjects");
+ mBulkChangeIncludeScripts = gSavedSettings.getBOOL("BulkChangeIncludeScripts");
+ mBulkChangeIncludeSounds = gSavedSettings.getBOOL("BulkChangeIncludeSounds");
+ mBulkChangeIncludeTextures = gSavedSettings.getBOOL("BulkChangeIncludeTextures");
+ mBulkChangeShareWithGroup = gSavedSettings.getBOOL("BulkChangeShareWithGroup");
+ mBulkChangeEveryoneCopy = gSavedSettings.getBOOL("BulkChangeEveryoneCopy");
+ mBulkChangeNextOwnerModify = gSavedSettings.getBOOL("BulkChangeNextOwnerModify");
+ mBulkChangeNextOwnerCopy = gSavedSettings.getBOOL("BulkChangeNextOwnerCopy");
+ mBulkChangeNextOwnerTransfer = gSavedSettings.getBOOL("BulkChangeNextOwnerTransfer");
+
return TRUE;
}
@@ -144,6 +160,12 @@ void LLFloaterBulkPermission::inventoryChanged(LLViewerObject* viewer_object,
}
}
+void LLFloaterBulkPermission::onOkBtn()
+{
+ doApply();
+ closeFloater();
+}
+
void LLFloaterBulkPermission::onApplyBtn()
{
doApply();
@@ -151,6 +173,20 @@ void LLFloaterBulkPermission::onApplyBtn()
void LLFloaterBulkPermission::onCloseBtn()
{
+ gSavedSettings.setBOOL("BulkChangeIncludeAnimations", mBulkChangeIncludeAnimations);
+ gSavedSettings.setBOOL("BulkChangeIncludeBodyParts", mBulkChangeIncludeBodyParts);
+ gSavedSettings.setBOOL("BulkChangeIncludeClothing", mBulkChangeIncludeClothing);
+ gSavedSettings.setBOOL("BulkChangeIncludeGestures", mBulkChangeIncludeGestures);
+ gSavedSettings.setBOOL("BulkChangeIncludeNotecards", mBulkChangeIncludeNotecards);
+ gSavedSettings.setBOOL("BulkChangeIncludeObjects", mBulkChangeIncludeObjects);
+ gSavedSettings.setBOOL("BulkChangeIncludeScripts", mBulkChangeIncludeScripts);
+ gSavedSettings.setBOOL("BulkChangeIncludeSounds", mBulkChangeIncludeSounds);
+ gSavedSettings.setBOOL("BulkChangeIncludeTextures", mBulkChangeIncludeTextures);
+ gSavedSettings.setBOOL("BulkChangeShareWithGroup", mBulkChangeShareWithGroup);
+ gSavedSettings.setBOOL("BulkChangeEveryoneCopy", mBulkChangeEveryoneCopy);
+ gSavedSettings.setBOOL("BulkChangeNextOwnerModify", mBulkChangeNextOwnerModify);
+ gSavedSettings.setBOOL("BulkChangeNextOwnerCopy", mBulkChangeNextOwnerCopy);
+ gSavedSettings.setBOOL("BulkChangeNextOwnerTransfer", mBulkChangeNextOwnerTransfer);
closeFloater();
}
@@ -336,8 +372,6 @@ void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, LLInve
void LLFloaterBulkPermission::updateInventory(LLViewerObject* object, LLViewerInventoryItem* item, U8 key, bool is_new)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
-
// This slices the object into what we're concerned about on the viewer.
// The simulator will take the permissions and transfer ownership.
LLPointer<LLViewerInventoryItem> task_item =
diff --git a/indra/newview/llfloaterbulkpermission.h b/indra/newview/llfloaterbulkpermission.h
index 7dd05df7ee..25e76eca65 100644
--- a/indra/newview/llfloaterbulkpermission.h
+++ b/indra/newview/llfloaterbulkpermission.h
@@ -72,6 +72,7 @@ private:
bool is_new);
void onCloseBtn();
+ void onOkBtn();
void onApplyBtn();
void onCommitCopy();
void onCheckAll() { doCheckUncheckAll(TRUE); }
@@ -94,6 +95,21 @@ private:
LLUUID mCurrentObjectID;
BOOL mDone;
+ bool mBulkChangeIncludeAnimations;
+ bool mBulkChangeIncludeBodyParts;
+ bool mBulkChangeIncludeClothing;
+ bool mBulkChangeIncludeGestures;
+ bool mBulkChangeIncludeNotecards;
+ bool mBulkChangeIncludeObjects;
+ bool mBulkChangeIncludeScripts;
+ bool mBulkChangeIncludeSounds;
+ bool mBulkChangeIncludeTextures;
+ bool mBulkChangeShareWithGroup;
+ bool mBulkChangeEveryoneCopy;
+ bool mBulkChangeNextOwnerModify;
+ bool mBulkChangeNextOwnerCopy;
+ bool mBulkChangeNextOwnerTransfer;
+
LLUUID mID;
const char* mStartString;
diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp
index 809d344d01..fffd724b22 100644
--- a/indra/newview/llfloaterbuycontents.cpp
+++ b/indra/newview/llfloaterbuycontents.cpp
@@ -80,6 +80,7 @@ BOOL LLFloaterBuyContents::postBuild()
LLFloaterBuyContents::~LLFloaterBuyContents()
{
+ removeVOInventoryListener();
}
@@ -147,23 +148,26 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,
return;
}
- if (!inv)
+ LLScrollListCtrl* item_list = getChild<LLScrollListCtrl>("item_list");
+ if (!item_list)
{
- llwarns << "No inventory in LLFloaterBuyContents::inventoryChanged"
- << llendl;
removeVOInventoryListener();
return;
}
- LLCtrlListInterface *item_list = childGetListInterface("item_list");
- if (!item_list)
+ item_list->deleteAllItems();
+
+ if (!inv)
{
- removeVOInventoryListener();
+ llwarns << "No inventory in LLFloaterBuyContents::inventoryChanged"
+ << llendl;
+
return;
}
// default to turning off the buy button.
- getChildView("buy_btn")->setEnabled(FALSE);
+ LLView* buy_btn = getChildView("buy_btn");
+ buy_btn->setEnabled(FALSE);
LLUUID owner_id;
BOOL is_group_owned;
@@ -204,15 +208,15 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,
// There will be at least one item shown in the display, so go
// ahead and enable the buy button.
- getChildView("buy_btn")->setEnabled(TRUE);
+ buy_btn->setEnabled(TRUE);
// Create the line in the list
LLSD row;
BOOL item_is_multi = FALSE;
if ((inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED
- || inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS)
- && !(inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK))
+ || inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS)
+ && !(inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK))
{
item_is_multi = TRUE;
}
@@ -255,8 +259,6 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,
getChildView("wear_check")->setEnabled(TRUE);
getChild<LLUICtrl>("wear_check")->setValue(LLSD(false) );
}
-
- removeVOInventoryListener();
}
diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp
index fa0ad20fdb..62848586cd 100644
--- a/indra/newview/llfloaterbvhpreview.cpp
+++ b/indra/newview/llfloaterbvhpreview.cpp
@@ -422,13 +422,14 @@ void LLFloaterBvhPreview::resetMotion()
LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
BOOL paused = avatarp->areAnimationsPaused();
- // *TODO: Fix awful casting hack
- LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
-
- // Set emotion
- std::string emote = getChild<LLUICtrl>("emote_combo")->getValue().asString();
- motionp->setEmote(mIDList[emote]);
-
+ LLKeyframeMotion* motionp = dynamic_cast<LLKeyframeMotion*>(avatarp->findMotion(mMotionID));
+ if( motionp )
+ {
+ // Set emotion
+ std::string emote = getChild<LLUICtrl>("emote_combo")->getValue().asString();
+ motionp->setEmote(mIDList[emote]);
+ }
+
LLUUID base_id = mIDList[getChild<LLUICtrl>("preview_base_anim")->getValue().asString()];
avatarp->deactivateAllMotions();
avatarp->startMotion(mMotionID, 0.0f);
@@ -438,8 +439,12 @@ void LLFloaterBvhPreview::resetMotion()
// Set pose
std::string handpose = getChild<LLUICtrl>("hand_pose_combo")->getValue().asString();
avatarp->startMotion( ANIM_AGENT_HAND_MOTION, 0.0f );
- motionp->setHandPose(LLHandMotion::getHandPose(handpose));
+ if( motionp )
+ {
+ motionp->setHandPose(LLHandMotion::getHandPose(handpose));
+ }
+
if (paused)
{
mPauseRequest = avatarp->requestPause();
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index 21b58d3e3d..c85d048c5a 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -330,6 +330,10 @@ void LLFloaterCamera::onClose(bool app_quitting)
//We don't care of camera mode if app is quitting
if(app_quitting)
return;
+ // It is necessary to reset mCurrMode to CAMERA_CTRL_MODE_PAN so
+ // to avoid seeing an empty floater when reopening the control.
+ if (mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA)
+ mCurrMode = CAMERA_CTRL_MODE_PAN;
// When mCurrMode is in CAMERA_CTRL_MODE_PAN
// switchMode won't modify mPrevMode, so force it here.
// It is needed to correctly return to previous mode on open, see EXT-2727.
diff --git a/indra/newview/llfloaterchatvoicevolume.cpp b/indra/newview/llfloaterchatvoicevolume.cpp
new file mode 100644
index 0000000000..3c76a3a43c
--- /dev/null
+++ b/indra/newview/llfloaterchatvoicevolume.cpp
@@ -0,0 +1,44 @@
+/**
+ * @file llfloaterchatvoicevolume.cpp
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterchatvoicevolume.h"
+
+LLFloaterChatVoiceVolume::LLFloaterChatVoiceVolume(const LLSD& key)
+: LLInspect(key)
+{
+}
+
+void LLFloaterChatVoiceVolume::onOpen(const LLSD& key)
+{
+ LLInspect::onOpen(key);
+ LLUI::positionViewNearMouse(this);
+}
+
+LLFloaterChatVoiceVolume::~LLFloaterChatVoiceVolume()
+{
+ LLTransientFloaterMgr::getInstance()->removeControlView(this);
+};
diff --git a/indra/newview/llfloaterchatvoicevolume.h b/indra/newview/llfloaterchatvoicevolume.h
new file mode 100644
index 0000000000..61ad92b6da
--- /dev/null
+++ b/indra/newview/llfloaterchatvoicevolume.h
@@ -0,0 +1,44 @@
+/**
+ * @file llfloaterchatvoicevolume.h
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LLFLOATERCHATVOICEVOLUME_H_
+#define LLFLOATERCHATVOICEVOLUME_H_
+
+#include "llinspect.h"
+#include "lltransientfloatermgr.h"
+
+class LLFloaterChatVoiceVolume : public LLInspect, LLTransientFloater
+{
+public:
+
+ LLFloaterChatVoiceVolume(const LLSD& key);
+ virtual ~LLFloaterChatVoiceVolume();
+
+ virtual void onOpen(const LLSD& key);
+
+ /*virtual*/ LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::GLOBAL; }
+};
+
+#endif /* LLFLOATERCHATVOICEVOLUME_H_ */
diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp
index 05d73c2416..a03425649f 100644
--- a/indra/newview/llfloatercolorpicker.cpp
+++ b/indra/newview/llfloatercolorpicker.cpp
@@ -62,10 +62,6 @@
#include <sstream>
#include <iomanip>
-const F32 CONTEXT_CONE_IN_ALPHA = 0.0f;
-const F32 CONTEXT_CONE_OUT_ALPHA = 1.f;
-const F32 CONTEXT_FADE_TIME = 0.08f;
-
//////////////////////////////////////////////////////////////////////////////
//
// Class LLFloaterColorPicker
@@ -105,7 +101,10 @@ LLFloaterColorPicker::LLFloaterColorPicker (LLColorSwatchCtrl* swatch, BOOL show
mSwatch ( swatch ),
mActive ( TRUE ),
mCanApplyImmediately ( show_apply_immediate ),
- mContextConeOpacity ( 0.f )
+ mContextConeOpacity ( 0.f ),
+ mContextConeInAlpha ( 0.f ),
+ mContextConeOutAlpha ( 0.f ),
+ mContextConeFadeTime ( 0.f )
{
buildFromFile ( "floater_color_picker.xml");
@@ -117,6 +116,10 @@ LLFloaterColorPicker::LLFloaterColorPicker (LLColorSwatchCtrl* swatch, BOOL show
mApplyImmediateCheck->setEnabled(FALSE);
mApplyImmediateCheck->set(FALSE);
}
+
+ mContextConeInAlpha = gSavedSettings.getF32("ContextConeInAlpha");
+ mContextConeOutAlpha = gSavedSettings.getF32("ContextConeOutAlpha");
+ mContextConeFadeTime = gSavedSettings.getF32("ContextConeFadeTime");
}
LLFloaterColorPicker::~LLFloaterColorPicker()
@@ -172,9 +175,9 @@ void LLFloaterColorPicker::createUI ()
//
void LLFloaterColorPicker::showUI ()
{
+ openFloater(getKey());
setVisible ( TRUE );
setFocus ( TRUE );
- openFloater(getKey());
// HACK: if system color picker is required - close the SL one we made and use default system dialog
if ( gSavedSettings.getBOOL ( "UseDefaultColorPicker" ) )
@@ -486,37 +489,37 @@ void LLFloaterColorPicker::draw()
mSwatch->localRectToOtherView(mSwatch->getLocalRect(), &swatch_rect, this);
// draw context cone connecting color picker with color swatch in parent floater
LLRect local_rect = getLocalRect();
- if (gFocusMgr.childHasKeyboardFocus(this) && mSwatch->isInVisibleChain() && mContextConeOpacity > 0.001f)
+ if (hasFocus() && mSwatch->isInVisibleChain() && mContextConeOpacity > 0.001f)
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
LLGLEnable(GL_CULL_FACE);
gGL.begin(LLRender::QUADS);
{
- gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
+ gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mTop);
gGL.vertex2i(swatch_rect.mRight, swatch_rect.mTop);
- gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity);
+ gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
gGL.vertex2i(local_rect.mRight, local_rect.mTop);
gGL.vertex2i(local_rect.mLeft, local_rect.mTop);
- gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity);
+ gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
gGL.vertex2i(local_rect.mLeft, local_rect.mTop);
gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);
- gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
+ gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mBottom);
gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mTop);
- gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity);
+ gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
gGL.vertex2i(local_rect.mRight, local_rect.mBottom);
gGL.vertex2i(local_rect.mRight, local_rect.mTop);
- gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
+ gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
gGL.vertex2i(swatch_rect.mRight, swatch_rect.mTop);
gGL.vertex2i(swatch_rect.mRight, swatch_rect.mBottom);
- gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity);
+ gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);
gGL.vertex2i(local_rect.mRight, local_rect.mBottom);
- gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
+ gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
gGL.vertex2i(swatch_rect.mRight, swatch_rect.mBottom);
gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mBottom);
}
@@ -525,11 +528,12 @@ void LLFloaterColorPicker::draw()
if (gFocusMgr.childHasMouseCapture(getDragHandle()))
{
- mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"), LLCriticalDamp::getInterpolant(CONTEXT_FADE_TIME));
+ mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"),
+ LLCriticalDamp::getInterpolant(mContextConeFadeTime));
}
else
{
- mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLCriticalDamp::getInterpolant(CONTEXT_FADE_TIME));
+ mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLCriticalDamp::getInterpolant(mContextConeFadeTime));
}
mPipetteBtn->setToggleState(LLToolMgr::getInstance()->getCurrentTool() == LLToolPipette::getInstance());
diff --git a/indra/newview/llfloatercolorpicker.h b/indra/newview/llfloatercolorpicker.h
index 8e387c4f7c..bab0617712 100644
--- a/indra/newview/llfloatercolorpicker.h
+++ b/indra/newview/llfloatercolorpicker.h
@@ -189,6 +189,10 @@ class LLFloaterColorPicker
LLButton* mPipetteBtn;
F32 mContextConeOpacity;
+ F32 mContextConeInAlpha;
+ F32 mContextConeOutAlpha;
+ F32 mContextConeFadeTime;
+
};
#endif // LL_LLFLOATERCOLORPICKER_H
diff --git a/indra/newview/llfloaterconversationlog.cpp b/indra/newview/llfloaterconversationlog.cpp
new file mode 100644
index 0000000000..4c910c5655
--- /dev/null
+++ b/indra/newview/llfloaterconversationlog.cpp
@@ -0,0 +1,134 @@
+/**
+ * @file llfloaterconversationlog.cpp
+ * @brief Functionality of the "conversation log" floater
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+#include "llviewerprecompiledheaders.h"
+
+#include "llconversationloglist.h"
+#include "llfiltereditor.h"
+#include "llfloaterconversationlog.h"
+#include "llfloaterreg.h"
+#include "llmenubutton.h"
+
+LLFloaterConversationLog::LLFloaterConversationLog(const LLSD& key)
+: LLFloater(key),
+ mConversationLogList(NULL)
+{
+ mCommitCallbackRegistrar.add("CallLog.Action", boost::bind(&LLFloaterConversationLog::onCustomAction, this, _2));
+ mEnableCallbackRegistrar.add("CallLog.Check", boost::bind(&LLFloaterConversationLog::isActionChecked, this, _2));
+}
+
+BOOL LLFloaterConversationLog::postBuild()
+{
+ mConversationLogList = getChild<LLConversationLogList>("conversation_log_list");
+
+ switch (gSavedSettings.getU32("CallLogSortOrder"))
+ {
+ case LLConversationLogList::E_SORT_BY_NAME:
+ mConversationLogList->sortByName();
+ break;
+
+ case LLConversationLogList::E_SORT_BY_DATE:
+ mConversationLogList->sortByDate();
+ break;
+ }
+
+ // Use the context menu of the Conversation list for the Conversation tab gear menu.
+ LLToggleableMenu* conversations_gear_menu = mConversationLogList->getContextMenu();
+ if (conversations_gear_menu)
+ {
+ getChild<LLMenuButton>("conversations_gear_btn")->setMenu(conversations_gear_menu, LLMenuButton::MP_BOTTOM_LEFT);
+ }
+
+ getChild<LLFilterEditor>("people_filter_input")->setCommitCallback(boost::bind(&LLFloaterConversationLog::onFilterEdit, this, _2));
+
+ return LLFloater::postBuild();
+}
+
+void LLFloaterConversationLog::draw()
+{
+ getChild<LLMenuButton>("conversations_gear_btn")->setEnabled(mConversationLogList->getSelectedItem() != NULL);
+ LLFloater::draw();
+}
+
+void LLFloaterConversationLog::onFilterEdit(const std::string& search_string)
+{
+ std::string filter = search_string;
+ LLStringUtil::trimHead(filter);
+
+ mConversationLogList->setNameFilter(filter);
+}
+
+
+void LLFloaterConversationLog::onCustomAction (const LLSD& userdata)
+{
+ const std::string command_name = userdata.asString();
+
+ if ("sort_by_name" == command_name)
+ {
+ mConversationLogList->sortByName();
+ gSavedSettings.setU32("CallLogSortOrder", LLConversationLogList::E_SORT_BY_NAME);
+ }
+ else if ("sort_by_date" == command_name)
+ {
+ mConversationLogList->sortByDate();
+ gSavedSettings.setU32("CallLogSortOrder", LLConversationLogList::E_SORT_BY_DATE);
+ }
+ else if ("sort_friends_on_top" == command_name)
+ {
+ mConversationLogList->toggleSortFriendsOnTop();
+ }
+ else if ("view_nearby_chat_history" == command_name)
+ {
+ LLFloaterReg::showInstance("preview_conversation", LLSD(LLUUID::null), true);
+ }
+}
+
+bool LLFloaterConversationLog::isActionEnabled(const LLSD& userdata)
+{
+ return true;
+}
+
+bool LLFloaterConversationLog::isActionChecked(const LLSD& userdata)
+{
+ const std::string command_name = userdata.asString();
+
+ U32 sort_order = gSavedSettings.getU32("CallLogSortOrder");
+
+ if ("sort_by_name" == command_name)
+ {
+ return sort_order == LLConversationLogList::E_SORT_BY_NAME;
+ }
+ else if ("sort_by_date" == command_name)
+ {
+ return sort_order == LLConversationLogList::E_SORT_BY_DATE;
+ }
+ else if ("sort_friends_on_top" == command_name)
+ {
+ return gSavedSettings.getBOOL("SortFriendsFirst");
+ }
+
+ return false;
+}
+
diff --git a/indra/newview/llmemoryview.h b/indra/newview/llfloaterconversationlog.h
index dc4849a9c4..e971330f3d 100644
--- a/indra/newview/llmemoryview.h
+++ b/indra/newview/llfloaterconversationlog.h
@@ -1,62 +1,56 @@
-/**
- * @file llmemoryview.h
- * @brief LLMemoryView class definition
+/**
+ * @file llfloaterconversationlog.h
*
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
* Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-#ifndef LL_LLMEMORYVIEW_H
-#define LL_LLMEMORYVIEW_H
+#ifndef LL_LLFLOATERCONVERSATIONLOG_H_
+#define LL_LLFLOATERCONVERSATIONLOG_H_
-#include "llview.h"
+#include "llfloater.h"
-class LLAllocator;
+class LLConversationLogList;
-class LLMemoryView : public LLView
+class LLFloaterConversationLog : public LLFloater
{
public:
- struct Params : public LLInitParam::Block<Params, LLView::Params>
- {
- Params()
- {
- changeDefault(mouse_opaque, true);
- changeDefault(visible, false);
- }
- };
- LLMemoryView(const LLMemoryView::Params&);
- virtual ~LLMemoryView();
-
- 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);
+
+ LLFloaterConversationLog(const LLSD& key);
+ virtual ~LLFloaterConversationLog(){};
+
+ virtual BOOL postBuild();
+
virtual void draw();
- void refreshProfile();
+ void onFilterEdit(const std::string& search_string);
private:
- std::vector<LLWString> mLines;
- LLAllocator* mAlloc;
- BOOL mPaused ;
+ void onCustomAction (const LLSD& userdata);
+ bool isActionEnabled(const LLSD& userdata);
+ bool isActionChecked(const LLSD& userdata);
+
+ LLConversationLogList* mConversationLogList;
};
-#endif
+
+#endif /* LLFLOATERCONVERSATIONLOG_H_ */
diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp
new file mode 100644
index 0000000000..a3d715530d
--- /dev/null
+++ b/indra/newview/llfloaterconversationpreview.cpp
@@ -0,0 +1,186 @@
+/**
+ * @file llfloaterconversationpreview.cpp
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llconversationlog.h"
+#include "llfloaterconversationpreview.h"
+#include "llimview.h"
+#include "lllineeditor.h"
+#include "llfloaterimnearbychat.h"
+#include "llspinctrl.h"
+#include "lltrans.h"
+
+const std::string LL_FCP_COMPLETE_NAME("complete_name");
+const std::string LL_FCP_ACCOUNT_NAME("user_name");
+
+LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_id)
+: LLFloater(session_id),
+ mChatHistory(NULL),
+ mSessionID(session_id.asUUID()),
+ mCurrentPage(0),
+ mPageSize(gSavedSettings.getS32("ConversationHistoryPageSize")),
+ mAccountName(session_id[LL_FCP_ACCOUNT_NAME]),
+ mCompleteName(session_id[LL_FCP_COMPLETE_NAME])
+{
+}
+
+BOOL LLFloaterConversationPreview::postBuild()
+{
+ mChatHistory = getChild<LLChatHistory>("chat_history");
+
+ const LLConversation* conv = LLConversationLog::instance().getConversation(mSessionID);
+ std::string name;
+ std::string file;
+
+ if (mAccountName != "")
+ {
+ name = mCompleteName;
+ file = mAccountName;
+ }
+ else if (mSessionID != LLUUID::null && conv)
+ {
+ name = conv->getConversationName();
+ file = conv->getHistoryFileName();
+ }
+ else
+ {
+ name = LLTrans::getString("NearbyChatTitle");
+ file = "chat";
+ }
+
+ LLStringUtil::format_map_t args;
+ args["[NAME]"] = name;
+ std::string title = getString("Title", args);
+ setTitle(title);
+
+ LLSD load_params;
+ load_params["load_all_history"] = true;
+ load_params["cut_off_todays_date"] = false;
+
+ LLLogChat::loadChatHistory(file, mMessages, load_params);
+ mCurrentPage = mMessages.size() / mPageSize;
+
+ mPageSpinner = getChild<LLSpinCtrl>("history_page_spin");
+ mPageSpinner->setCommitCallback(boost::bind(&LLFloaterConversationPreview::onMoreHistoryBtnClick, this));
+ mPageSpinner->setMinValue(1);
+ mPageSpinner->setMaxValue(mCurrentPage + 1);
+ mPageSpinner->set(mCurrentPage + 1);
+
+ std::string total_page_num = llformat("/ %d", mCurrentPage + 1);
+ getChild<LLTextBox>("page_num_label")->setValue(total_page_num);
+
+ return LLFloater::postBuild();
+}
+
+void LLFloaterConversationPreview::draw()
+{
+ LLFloater::draw();
+}
+
+void LLFloaterConversationPreview::onOpen(const LLSD& key)
+{
+ showHistory();
+}
+
+void LLFloaterConversationPreview::showHistory()
+{
+ if (!mMessages.size())
+ {
+ return;
+ }
+
+ mChatHistory->clear();
+
+ std::ostringstream message;
+ std::list<LLSD>::const_iterator iter = mMessages.begin();
+
+ int delta = 0;
+ if (mCurrentPage)
+ {
+ int remainder = mMessages.size() % mPageSize;
+ delta = (remainder == 0) ? 0 : (mPageSize - remainder);
+ }
+
+ std::advance(iter, (mCurrentPage * mPageSize) - delta);
+
+ for (int msg_num = 0; (iter != mMessages.end() && msg_num < mPageSize); ++iter, ++msg_num)
+ {
+ LLSD msg = *iter;
+
+ LLUUID from_id = LLUUID::null;
+ std::string time = msg["time"].asString();
+ std::string from = msg["from"].asString();
+ std::string message = msg["message"].asString();
+
+ if (msg["from_id"].isDefined())
+ {
+ from_id = msg["from_id"].asUUID();
+ }
+ else
+ {
+ std::string legacy_name = gCacheName->buildLegacyName(from);
+ gCacheName->getUUID(legacy_name, from_id);
+ }
+
+ LLChat chat;
+ chat.mFromID = from_id;
+ chat.mSessionID = mSessionID;
+ chat.mFromName = from;
+ chat.mTimeStr = time;
+ chat.mChatStyle = CHAT_STYLE_HISTORY;
+ chat.mText = message;
+
+ if (from_id.isNull() && SYSTEM_FROM == from)
+ {
+ chat.mSourceType = CHAT_SOURCE_SYSTEM;
+
+ }
+ else if (from_id.isNull())
+ {
+ chat.mSourceType = LLFloaterIMNearbyChat::isWordsName(from) ? CHAT_SOURCE_UNKNOWN : CHAT_SOURCE_OBJECT;
+ }
+
+ LLSD chat_args;
+ chat_args["use_plain_text_chat_history"] =
+ gSavedSettings.getBOOL("PlainTextChatHistory");
+ chat_args["show_time"] = gSavedSettings.getBOOL("IMShowTime");
+ chat_args["show_names_for_p2p_conv"] = gSavedSettings.getBOOL("IMShowNamesForP2PConv");
+
+ mChatHistory->appendMessage(chat,chat_args);
+ }
+
+}
+
+void LLFloaterConversationPreview::onMoreHistoryBtnClick()
+{
+ mCurrentPage = (int)(mPageSpinner->getValueF32());
+ if (--mCurrentPage < 0)
+ {
+ return;
+ }
+
+ showHistory();
+}
diff --git a/indra/newview/llfloaterconversationpreview.h b/indra/newview/llfloaterconversationpreview.h
new file mode 100644
index 0000000000..b17ae84b63
--- /dev/null
+++ b/indra/newview/llfloaterconversationpreview.h
@@ -0,0 +1,64 @@
+/**
+ * @file llfloaterconversationpreview.h
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LLFLOATERCONVERSATIONPREVIEW_H_
+#define LLFLOATERCONVERSATIONPREVIEW_H_
+
+#include "llchathistory.h"
+#include "llfloater.h"
+
+extern const std::string LL_FCP_COMPLETE_NAME; //"complete_name"
+extern const std::string LL_FCP_ACCOUNT_NAME; //"user_name"
+
+class LLSpinCtrl;
+
+class LLFloaterConversationPreview : public LLFloater
+{
+public:
+
+ LLFloaterConversationPreview(const LLSD& session_id);
+ virtual ~LLFloaterConversationPreview(){};
+
+ virtual BOOL postBuild();
+
+ virtual void draw();
+ virtual void onOpen(const LLSD& key);
+
+private:
+ void onMoreHistoryBtnClick();
+ void showHistory();
+
+ LLSpinCtrl* mPageSpinner;
+ LLChatHistory* mChatHistory;
+ LLUUID mSessionID;
+ int mCurrentPage;
+ int mPageSize;
+
+ std::list<LLSD> mMessages;
+ std::string mAccountName;
+ std::string mCompleteName;
+};
+
+#endif /* LLFLOATERCONVERSATIONPREVIEW_H_ */
diff --git a/indra/newview/llfloaterdisplayname.cpp b/indra/newview/llfloaterdisplayname.cpp
index ac8f107928..e2cef5630b 100644
--- a/indra/newview/llfloaterdisplayname.cpp
+++ b/indra/newview/llfloaterdisplayname.cpp
@@ -44,7 +44,7 @@ class LLFloaterDisplayName : public LLFloater
{
public:
LLFloaterDisplayName(const LLSD& key);
- virtual ~LLFloaterDisplayName() {};
+ virtual ~LLFloaterDisplayName() { }
/*virtual*/ BOOL postBuild();
void onSave();
void onReset();
@@ -58,8 +58,8 @@ private:
const LLSD& content);
};
-LLFloaterDisplayName::LLFloaterDisplayName(const LLSD& key)
- : LLFloater(key)
+LLFloaterDisplayName::LLFloaterDisplayName(const LLSD& key) :
+ LLFloater(key)
{
}
@@ -122,10 +122,6 @@ void LLFloaterDisplayName::onCacheSetName(bool success,
LLSD args;
args["DISPLAY_NAME"] = content["display_name"];
LLNotificationsUtil::add("SetDisplayNameSuccess", args);
-
- // Re-fetch my name, as it may have been sanitized by the service
- //LLAvatarNameCache::get(getAvatarId(),
- // boost::bind(&LLPanelMyProfileEdit::onNameCache, this, _1, _2));
return;
}
@@ -164,10 +160,9 @@ void LLFloaterDisplayName::onCancel()
void LLFloaterDisplayName::onReset()
{
- if (LLAvatarNameCache::useDisplayNames())
+ if (LLAvatarNameCache::hasNameLookupURL())
{
- LLViewerDisplayName::set("",
- boost::bind(&LLFloaterDisplayName::onCacheSetName, this, _1, _2, _3));
+ LLViewerDisplayName::set("",boost::bind(&LLFloaterDisplayName::onCacheSetName, this, _1, _2, _3));
}
else
{
@@ -199,10 +194,9 @@ void LLFloaterDisplayName::onSave()
return;
}
- if (LLAvatarNameCache::useDisplayNames())
+ if (LLAvatarNameCache::hasNameLookupURL())
{
- LLViewerDisplayName::set(display_name_utf8,
- boost::bind(&LLFloaterDisplayName::onCacheSetName, this, _1, _2, _3));
+ LLViewerDisplayName::set(display_name_utf8,boost::bind(&LLFloaterDisplayName::onCacheSetName, this, _1, _2, _3));
}
else
{
diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp
index fb905eae11..38abdcc830 100644
--- a/indra/newview/llfloatergodtools.cpp
+++ b/indra/newview/llfloatergodtools.cpp
@@ -1123,11 +1123,13 @@ bool LLPanelObjectTools::callbackSimWideDeletes( const LLSD& notification, const
void LLPanelObjectTools::onClickSet()
{
- LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelObjectTools::callbackAvatarID, this, _1,_2));
+ LLView * button = findChild<LLButton>("Set Target");
+ LLFloater * root_floater = gFloaterView->getParentFloater(this);
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelObjectTools::callbackAvatarID, this, _1,_2), FALSE, FALSE, FALSE, root_floater->getName(), button);
// grandparent is a floater, which can have a dependent
if (picker)
{
- gFloaterView->getParentFloater(this)->addDependentFloater(picker);
+ root_floater->addDependentFloater(picker);
}
}
diff --git a/indra/newview/llfloaterhelpbrowser.cpp b/indra/newview/llfloaterhelpbrowser.cpp
index fd9c37ae73..4cb632bd6a 100644
--- a/indra/newview/llfloaterhelpbrowser.cpp
+++ b/indra/newview/llfloaterhelpbrowser.cpp
@@ -77,15 +77,7 @@ void LLFloaterHelpBrowser::onOpen(const LLSD& key)
gSavedSettings.setBOOL("HelpFloaterOpen", TRUE);
std::string topic = key.asString();
-
- if (topic == "__local")
- {
- mBrowser->navigateToLocalPage( "help-offline" , "index.html" );
- }
- else
- {
- mBrowser->navigateTo(LLViewerHelp::instance().getURL(topic));
- }
+ mBrowser->navigateTo(LLViewerHelp::instance().getURL(topic));
}
//virtual
diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp
index 6b2492d927..2575f6f817 100644
--- a/indra/newview/llfloaterimagepreview.cpp
+++ b/indra/newview/llfloaterimagepreview.cpp
@@ -901,11 +901,13 @@ BOOL LLImagePreviewSculpted::render()
{
gObjectPreviewProgram.bind();
}
+ gPipeline.enableLightsPreview();
+
gGL.pushMatrix();
const F32 SCALE = 1.25f;
gGL.scalef(SCALE, SCALE, SCALE);
const F32 BRIGHTNESS = 0.9f;
- gGL.color3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);
+ gGL.diffuseColor3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);
mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0);
mVertexBuffer->draw(LLRender::TRIANGLES, num_indices, 0);
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
new file mode 100644
index 0000000000..5e0cd8ef78
--- /dev/null
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -0,0 +1,1982 @@
+/**
+ * @file llfloaterimcontainer.cpp
+ * @brief Multifloater containing active IM sessions in separate tab container tabs
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterimsession.h"
+#include "llfloaterimcontainer.h"
+
+#include "llfloaterreg.h"
+#include "lllayoutstack.h"
+#include "llfloaterimnearbychat.h"
+
+#include "llagent.h"
+#include "llavataractions.h"
+#include "llavatariconctrl.h"
+#include "llavatarnamecache.h"
+#include "llcallbacklist.h"
+#include "lldonotdisturbnotificationstorage.h"
+#include "llgroupactions.h"
+#include "llgroupiconctrl.h"
+#include "llflashtimer.h"
+#include "llfloateravatarpicker.h"
+#include "llfloaterpreference.h"
+#include "llimview.h"
+#include "llnotificationsutil.h"
+#include "lltransientfloatermgr.h"
+#include "llviewercontrol.h"
+#include "llconversationview.h"
+#include "llcallbacklist.h"
+#include "llworld.h"
+#include "llsdserialize.h"
+#include "llviewerobjectlist.h"
+
+//
+// LLFloaterIMContainer
+//
+LLFloaterIMContainer::LLFloaterIMContainer(const LLSD& seed, const Params& params /*= getDefaultParams()*/)
+: LLMultiFloater(seed, params),
+ mExpandCollapseBtn(NULL),
+ mConversationsRoot(NULL),
+ mConversationsEventStream("ConversationsEvents"),
+ mInitialized(false)
+{
+ mEnableCallbackRegistrar.add("IMFloaterContainer.Check", boost::bind(&LLFloaterIMContainer::isActionChecked, this, _2));
+ mCommitCallbackRegistrar.add("IMFloaterContainer.Action", boost::bind(&LLFloaterIMContainer::onCustomAction, this, _2));
+
+ mEnableCallbackRegistrar.add("Avatar.CheckItem", boost::bind(&LLFloaterIMContainer::checkContextMenuItem, this, _2));
+ mEnableCallbackRegistrar.add("Avatar.EnableItem", boost::bind(&LLFloaterIMContainer::enableContextMenuItem, this, _2));
+ mEnableCallbackRegistrar.add("Avatar.VisibleItem", boost::bind(&LLFloaterIMContainer::visibleContextMenuItem, this, _2));
+ mCommitCallbackRegistrar.add("Avatar.DoToSelected", boost::bind(&LLFloaterIMContainer::doToSelected, this, _2));
+
+ mCommitCallbackRegistrar.add("Group.DoToSelected", boost::bind(&LLFloaterIMContainer::doToSelectedGroup, this, _2));
+
+ // Firstly add our self to IMSession observers, so we catch session events
+ LLIMMgr::getInstance()->addSessionObserver(this);
+
+ mAutoResize = FALSE;
+ LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, this);
+}
+
+LLFloaterIMContainer::~LLFloaterIMContainer()
+{
+ mConversationsEventStream.stopListening("ConversationsRefresh");
+
+ gIdleCallbacks.deleteFunction(idle, this);
+
+ mNewMessageConnection.disconnect();
+ LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this);
+
+ if (mMicroChangedSignal.connected())
+ {
+ mMicroChangedSignal.disconnect();
+ }
+
+ gSavedPerAccountSettings.setBOOL("ConversationsListPaneCollapsed", mConversationsPane->isCollapsed());
+ gSavedPerAccountSettings.setBOOL("ConversationsMessagePaneCollapsed", mMessagesPane->isCollapsed());
+
+ if (!LLSingleton<LLIMMgr>::destroyed())
+ {
+ LLIMMgr::getInstance()->removeSessionObserver(this);
+ }
+}
+
+void LLFloaterIMContainer::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id, BOOL has_offline_msg)
+{
+ addConversationListItem(session_id);
+ LLFloaterIMSessionTab::addToHost(session_id);
+}
+
+void LLFloaterIMContainer::sessionActivated(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
+{
+ selectConversationPair(session_id, true);
+ collapseMessagesPane(false);
+}
+
+void LLFloaterIMContainer::sessionVoiceOrIMStarted(const LLUUID& session_id)
+{
+ addConversationListItem(session_id);
+ LLFloaterIMSessionTab::addToHost(session_id);
+}
+
+void LLFloaterIMContainer::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id)
+{
+ // The general strategy when a session id is modified is to delete all related objects and create them anew.
+
+ // Note however that the LLFloaterIMSession has its session id updated through a call to sessionInitReplyReceived()
+ // and do not need to be deleted and recreated (trying this creates loads of problems). We do need however to suppress
+ // its related mSessions record as it's indexed with the wrong id.
+ // Grabbing the updated LLFloaterIMSession and readding it in mSessions will eventually be done by addConversationListItem().
+ mSessions.erase(old_session_id);
+
+ // Delete the model and participants related to the old session
+ bool change_focus = removeConversationListItem(old_session_id);
+
+ // Create a new conversation with the new id
+ addConversationListItem(new_session_id, change_focus);
+ LLFloaterIMSessionTab::addToHost(new_session_id);
+}
+
+void LLFloaterIMContainer::sessionRemoved(const LLUUID& session_id)
+{
+ removeConversationListItem(session_id);
+}
+
+// static
+void LLFloaterIMContainer::onCurrentChannelChanged(const LLUUID& session_id)
+{
+ if (session_id != LLUUID::null)
+ {
+ LLFloaterIMContainer::getInstance()->showConversation(session_id);
+ }
+}
+
+BOOL LLFloaterIMContainer::postBuild()
+{
+ mOrigMinWidth = getMinWidth();
+ mOrigMinHeight = getMinHeight();
+
+ mNewMessageConnection = LLIMModel::instance().mNewMsgSignal.connect(boost::bind(&LLFloaterIMContainer::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()
+
+ setTabContainer(getChild<LLTabContainer>("im_box_tab_container"));
+ mStubPanel = getChild<LLPanel>("stub_panel");
+ mStubTextBox = getChild<LLTextBox>("stub_textbox");
+ mStubTextBox->setURLClickedCallback(boost::bind(&LLFloaterIMContainer::returnFloaterToHost, this));
+
+ mConversationsStack = getChild<LLLayoutStack>("conversations_stack");
+ mConversationsPane = getChild<LLLayoutPanel>("conversations_layout_panel");
+ mMessagesPane = getChild<LLLayoutPanel>("messages_layout_panel");
+
+ mConversationsListPanel = getChild<LLPanel>("conversations_list_panel");
+
+ // Open IM session with selected participant on double click event
+ mConversationsListPanel->setDoubleClickCallback(boost::bind(&LLFloaterIMContainer::doToSelected, this, LLSD("im")));
+
+ // The resize limits for LLFloaterIMContainer should be updated, based on current values of width of conversation and message panels
+ mConversationsPane->getResizeBar()->setResizeListener(boost::bind(&LLFloaterIMContainer::assignResizeLimits, this));
+
+ // Create the root model and view for all conversation sessions
+ LLConversationItem* base_item = new LLConversationItem(getRootViewModel());
+
+ LLFolderView::Params p(LLUICtrlFactory::getDefaultParams<LLFolderView>());
+ p.name = getName();
+ p.title = getLabel();
+ p.rect = LLRect(0, 0, getRect().getWidth(), 0);
+ p.parent_panel = mConversationsListPanel;
+ p.tool_tip = p.name;
+ p.listener = base_item;
+ p.view_model = &mConversationViewModel;
+ p.root = NULL;
+ p.use_ellipses = true;
+ p.options_menu = "menu_conversation.xml";
+ mConversationsRoot = LLUICtrlFactory::create<LLFolderView>(p);
+ mConversationsRoot->setCallbackRegistrar(&mCommitCallbackRegistrar);
+
+ // Add listener to conversation model events
+ mConversationsEventStream.listen("ConversationsRefresh", boost::bind(&LLFloaterIMContainer::onConversationModelEvent, this, _1));
+
+ // a scroller for folder view
+ LLRect scroller_view_rect = mConversationsListPanel->getRect();
+ scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
+ LLScrollContainer::Params scroller_params(LLUICtrlFactory::getDefaultParams<LLFolderViewScrollContainer>());
+ scroller_params.rect(scroller_view_rect);
+
+ LLScrollContainer* scroller = LLUICtrlFactory::create<LLFolderViewScrollContainer>(scroller_params);
+ scroller->setFollowsAll();
+ mConversationsListPanel->addChild(scroller);
+ scroller->addChild(mConversationsRoot);
+ mConversationsRoot->setScrollContainer(scroller);
+ mConversationsRoot->setFollowsAll();
+ mConversationsRoot->addChild(mConversationsRoot->mStatusTextBox);
+
+ addConversationListItem(LLUUID()); // manually add nearby chat
+
+ mExpandCollapseBtn = getChild<LLButton>("expand_collapse_btn");
+ mExpandCollapseBtn->setClickedCallback(boost::bind(&LLFloaterIMContainer::onExpandCollapseButtonClicked, this));
+ mStubCollapseBtn = getChild<LLButton>("stub_collapse_btn");
+ mStubCollapseBtn->setClickedCallback(boost::bind(&LLFloaterIMContainer::onStubCollapseButtonClicked, this));
+ getChild<LLButton>("speak_btn")->setClickedCallback(boost::bind(&LLFloaterIMContainer::onSpeakButtonClicked, this));
+
+ childSetAction("add_btn", boost::bind(&LLFloaterIMContainer::onAddButtonClicked, this));
+
+ collapseMessagesPane(gSavedPerAccountSettings.getBOOL("ConversationsMessagePaneCollapsed"));
+ collapseConversationsPane(gSavedPerAccountSettings.getBOOL("ConversationsListPaneCollapsed"), false);
+ LLAvatarNameCache::addUseDisplayNamesCallback(boost::bind(&LLFloaterIMSessionTab::processChatHistoryStyleUpdate, false));
+ mMicroChangedSignal = LLVoiceClient::getInstance()->MicroChangedCallback(boost::bind(&LLFloaterIMContainer::updateSpeakBtnState, this));
+
+ if (! mMessagesPane->isCollapsed() && ! mConversationsPane->isCollapsed())
+ {
+ S32 conversations_panel_width = gSavedPerAccountSettings.getS32("ConversationsListPaneWidth");
+ LLRect conversations_panel_rect = mConversationsPane->getRect();
+ conversations_panel_rect.mRight = conversations_panel_rect.mLeft + conversations_panel_width;
+ mConversationsPane->handleReshape(conversations_panel_rect, TRUE);
+ }
+
+ // Init the sort order now that the root had been created
+ setSortOrder(LLConversationSort(gSavedSettings.getU32("ConversationSortOrder")));
+
+ // Keep the xml set title around for when we have to overwrite it
+ mGeneralTitle = getTitle();
+
+ mInitialized = true;
+
+ // Add callbacks:
+ // We'll take care of view updates on idle
+ gIdleCallbacks.addFunction(idle, this);
+ // When display name option change, we need to reload all participant names
+ LLAvatarNameCache::addUseDisplayNamesCallback(boost::bind(&LLFloaterIMContainer::processParticipantsStyleUpdate, this));
+
+ return TRUE;
+}
+
+void LLFloaterIMContainer::onOpen(const LLSD& key)
+{
+ LLMultiFloater::onOpen(key);
+ openNearbyChat();
+ reSelectConversation();
+ assignResizeLimits();
+}
+
+// virtual
+void LLFloaterIMContainer::addFloater(LLFloater* floaterp,
+ BOOL select_added_floater,
+ LLTabContainer::eInsertionPoint insertion_point)
+{
+ if(!floaterp) return;
+
+ // already here
+ if (floaterp->getHost() == this)
+ {
+ openFloater(floaterp->getKey());
+ return;
+ }
+
+ LLUUID session_id = floaterp->getKey();
+
+ // Add the floater
+ LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point);
+
+
+
+ LLIconCtrl* icon = 0;
+
+ if(gAgent.isInGroup(session_id, TRUE))
+ {
+ LLGroupIconCtrl::Params icon_params;
+ icon_params.group_id = session_id;
+ icon = LLUICtrlFactory::instance().create<LLGroupIconCtrl>(icon_params);
+
+ mSessions[session_id] = floaterp;
+ floaterp->mCloseSignal.connect(boost::bind(&LLFloaterIMContainer::onCloseFloater, this, session_id));
+ }
+ else
+ { LLUUID avatar_id = session_id.notNull()?
+ LLIMModel::getInstance()->getOtherParticipantID(session_id) : LLUUID();
+
+ LLAvatarIconCtrl::Params icon_params;
+ icon_params.avatar_id = avatar_id;
+ icon = LLUICtrlFactory::instance().create<LLAvatarIconCtrl>(icon_params);
+
+ mSessions[session_id] = floaterp;
+ floaterp->mCloseSignal.connect(boost::bind(&LLFloaterIMContainer::onCloseFloater, this, session_id));
+ }
+
+ // forced resize of the floater
+ LLRect wrapper_rect = this->mTabContainer->getLocalRect();
+ floaterp->setRect(wrapper_rect);
+
+ mTabContainer->setTabImage(floaterp, icon);
+}
+
+
+void LLFloaterIMContainer::onCloseFloater(LLUUID& id)
+{
+ mSessions.erase(id);
+ setFocus(TRUE);
+}
+
+void LLFloaterIMContainer::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);
+ }
+}
+
+void LLFloaterIMContainer::onStubCollapseButtonClicked()
+{
+ collapseMessagesPane(true);
+}
+
+void LLFloaterIMContainer::onSpeakButtonClicked()
+{
+ LLAgent::toggleMicrophone("speak");
+ updateSpeakBtnState();
+}
+void LLFloaterIMContainer::onExpandCollapseButtonClicked()
+{
+ if (mConversationsPane->isCollapsed() && mMessagesPane->isCollapsed()
+ && gSavedPerAccountSettings.getBOOL("ConversationsExpandMessagePaneFirst"))
+ {
+ // Expand the messages pane from ultra minimized state
+ // if it was collapsed last in order.
+ collapseMessagesPane(false);
+ }
+ else
+ {
+ collapseConversationsPane(!mConversationsPane->isCollapsed());
+ }
+ reSelectConversation();
+}
+
+LLFloaterIMContainer* LLFloaterIMContainer::findInstance()
+{
+ return LLFloaterReg::findTypedInstance<LLFloaterIMContainer>("im_container");
+}
+
+LLFloaterIMContainer* LLFloaterIMContainer::getInstance()
+{
+ return LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container");
+}
+
+// Update all participants in the conversation lists
+void LLFloaterIMContainer::processParticipantsStyleUpdate()
+{
+ // On each session in mConversationsItems
+ for (conversations_items_map::iterator it_session = mConversationsItems.begin(); it_session != mConversationsItems.end(); it_session++)
+ {
+ // Get the current session descriptors
+ LLConversationItem* session_model = it_session->second;
+ // Iterate through each model participant child
+ LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = session_model->getChildrenBegin();
+ LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = session_model->getChildrenEnd();
+ while (current_participant_model != end_participant_model)
+ {
+ LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model);
+ // Get the avatar name for this participant id from the cache and update the model
+ participant_model->updateName();
+ // Next participant
+ current_participant_model++;
+ }
+ }
+}
+
+// static
+void LLFloaterIMContainer::idle(void* user_data)
+{
+ LLFloaterIMContainer* self = static_cast<LLFloaterIMContainer*>(user_data);
+
+ // Update the distance to agent in the nearby chat session if required
+ // Note: it makes no sense of course to update the distance in other session
+ if (self->mConversationViewModel.getSorter().getSortOrderParticipants() == LLConversationFilter::SO_DISTANCE)
+ {
+ self->setNearbyDistances();
+ }
+ self->mConversationsRoot->update();
+}
+
+bool LLFloaterIMContainer::onConversationModelEvent(const LLSD& event)
+{
+ // For debug only
+ //std::ostringstream llsd_value;
+ //llsd_value << LLSDOStreamer<LLSDNotationFormatter>(event) << std::endl;
+ //llinfos << "LLFloaterIMContainer::onConversationModelEvent, event = " << llsd_value.str() << llendl;
+ // end debug
+
+ // Note: In conversations, the model is not responsible for creating the view, which is a good thing. This means that
+ // the model could change substantially and the view could echo only a portion of this model (though currently the
+ // conversation view does echo the conversation model 1 to 1).
+ // Consequently, the participant views need to be created either by the session view or by the container panel.
+ // For the moment, we create them here, at the container level, to conform to the pattern implemented in llinventorypanel.cpp
+ // (see LLInventoryPanel::buildNewViews()).
+
+ std::string type = event.get("type").asString();
+ LLUUID session_id = event.get("session_uuid").asUUID();
+ LLUUID participant_id = event.get("participant_uuid").asUUID();
+
+ LLConversationViewSession* session_view = dynamic_cast<LLConversationViewSession*>(get_ptr_in_map(mConversationsWidgets,session_id));
+ if (!session_view)
+ {
+ // We skip events that are not associated with a session
+ return false;
+ }
+ LLConversationViewParticipant* participant_view = session_view->findParticipant(participant_id);
+ LLFloaterIMSessionTab *conversation_floater = (session_id.isNull() ?
+ (LLFloaterIMSessionTab*)(LLFloaterReg::findTypedInstance<LLFloaterIMNearbyChat>("nearby_chat"))
+ : (LLFloaterIMSessionTab*)(LLFloaterIMSession::findInstance(session_id)));
+
+ if (type == "remove_participant")
+ {
+ // Remove a participant view from the hierarchical conversation list
+ if (participant_view)
+ {
+ session_view->extractItem(participant_view);
+ delete participant_view;
+ session_view->refresh();
+ mConversationsRoot->arrangeAll();
+ }
+ // Remove a participant view from the conversation floater
+ if (conversation_floater)
+ {
+ conversation_floater->removeConversationViewParticipant(participant_id);
+ }
+ }
+ else if (type == "add_participant")
+ {
+ LLConversationItemSession* session_model = dynamic_cast<LLConversationItemSession*>(mConversationsItems[session_id]);
+ LLConversationItemParticipant* participant_model = (session_model ? session_model->findParticipant(participant_id) : NULL);
+ if (!participant_view && session_model && participant_model)
+ {
+ LLIMModel::LLIMSession * im_sessionp = LLIMModel::getInstance()->findIMSession(session_id);
+ if (session_id.isNull() || (im_sessionp && !im_sessionp->isP2PSessionType()))
+ {
+ participant_view = createConversationViewParticipant(participant_model);
+ participant_view->addToFolder(session_view);
+ participant_view->setVisible(TRUE);
+ }
+ }
+ // Add a participant view to the conversation floater
+ if (conversation_floater && participant_model)
+ {
+ conversation_floater->addConversationViewParticipant(participant_model);
+ }
+ }
+ else if (type == "update_participant")
+ {
+ // Update the participant view in the hierarchical conversation list
+ if (participant_view)
+ {
+ participant_view->refresh();
+ }
+ // Update the participant view in the conversation floater
+ if (conversation_floater)
+ {
+ conversation_floater->updateConversationViewParticipant(participant_id);
+ }
+ }
+ else if (type == "update_session")
+ {
+ session_view->refresh();
+ }
+
+ mConversationViewModel.requestSortAll();
+ mConversationsRoot->arrangeAll();
+ if (conversation_floater)
+ {
+ conversation_floater->refreshConversation();
+ }
+
+ return false;
+}
+
+void LLFloaterIMContainer::draw()
+{
+ if (mTabContainer->getTabCount() == 0)
+ {
+ // Do not close the container when every conversation is torn off because the user
+ // still needs the conversation list. Simply collapse the message pane in that case.
+ collapseMessagesPane(true);
+ }
+
+ const LLConversationItem *current_session = getCurSelectedViewModelItem();
+ if (current_session)
+ {
+ // Update moderator options visibility
+ LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = current_session->getChildrenBegin();
+ LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = current_session->getChildrenEnd();
+ while (current_participant_model != end_participant_model)
+ {
+ LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model);
+ participant_model->setModeratorOptionsVisible(isGroupModerator() && participant_model->getUUID() != gAgentID);
+
+ current_participant_model++;
+ }
+ // Update floater's title as required by the currently selected session or use the default title
+ LLFloaterIMSession * conversation_floaterp = LLFloaterIMSession::findInstance(current_session->getUUID());
+ setTitle(conversation_floaterp && conversation_floaterp->needsTitleOverwrite() ? conversation_floaterp->getTitle() : mGeneralTitle);
+ }
+
+ // "Manually" resize of mConversationsPane: same as temporarity cancellation of the flag "auto_resize=false" for it
+ if (!mConversationsPane->isCollapsed() && mMessagesPane->isCollapsed())
+ {
+ LLRect stack_rect = mConversationsStack->getRect();
+ mConversationsPane->reshape(stack_rect.getWidth(), stack_rect.getHeight(), true);
+ }
+
+ LLFloater::draw();
+}
+
+void LLFloaterIMContainer::tabClose()
+{
+ if (mTabContainer->getTabCount() == 0)
+ {
+ // Do not close the container when every conversation is torn off because the user
+ // still needs the conversation list. Simply collapse the message pane in that case.
+ collapseMessagesPane(true);
+ }
+}
+
+//Shows/hides the stub panel when a conversation floater is torn off
+void LLFloaterIMContainer::showStub(bool stub_is_visible)
+{
+ S32 tabCount = 0;
+ LLPanel * tabPanel = NULL;
+
+ if(stub_is_visible)
+ {
+ tabCount = mTabContainer->getTabCount();
+
+ //Hide all tabs even stub
+ for(S32 i = 0; i < tabCount; ++i)
+ {
+ tabPanel = mTabContainer->getPanelByIndex(i);
+
+ if(tabPanel)
+ {
+ tabPanel->setVisible(false);
+ }
+ }
+
+ //Set the index to the stub panel since we will be showing the stub
+ mTabContainer->setCurrentPanelIndex(0);
+ }
+
+ //Now show/hide the stub
+ mStubPanel->setVisible(stub_is_visible);
+}
+
+// listener for click on mStubTextBox2
+void LLFloaterIMContainer::returnFloaterToHost()
+{
+ LLUUID session_id = this->getSelectedSession();
+ LLFloaterIMSessionTab* floater = LLFloaterIMSessionTab::getConversation(session_id);
+ floater->onTearOffClicked();
+}
+
+void LLFloaterIMContainer::setVisible(BOOL visible)
+{ LLFloaterIMNearbyChat* nearby_chat;
+ if (visible)
+ {
+ // Make sure we have the Nearby Chat present when showing the conversation container
+ nearby_chat = LLFloaterReg::findTypedInstance<LLFloaterIMNearbyChat>("nearby_chat");
+ if (nearby_chat == NULL)
+ {
+ // If not found, force the creation of the nearby chat conversation panel
+ // *TODO: find a way to move this to XML as a default panel or something like that
+ LLSD name("nearby_chat");
+ LLFloaterReg::toggleInstanceOrBringToFront(name);
+ setSelectedSession(LLUUID(NULL));
+ }
+ openNearbyChat();
+ selectConversationPair(getSelectedSession(), false, false);
+ }
+
+ nearby_chat = LLFloaterReg::findTypedInstance<LLFloaterIMNearbyChat>("nearby_chat");
+ if (nearby_chat)
+ {
+ LLFloaterIMSessionTab::addToHost(LLUUID());
+ }
+
+ // We need to show/hide all the associated conversations that have been torn off
+ // (and therefore, are not longer managed by the multifloater),
+ // so that they show/hide with the conversations manager.
+ conversations_widgets_map::iterator widget_it = mConversationsWidgets.begin();
+ for (;widget_it != mConversationsWidgets.end(); ++widget_it)
+ {
+ LLConversationViewSession* widget = dynamic_cast<LLConversationViewSession*>(widget_it->second);
+ if (widget)
+ {
+ widget->setVisibleIfDetached(visible);
+ }
+ }
+
+ // Now, do the normal multifloater show/hide
+ LLMultiFloater::setVisible(visible);
+}
+
+void LLFloaterIMContainer::updateResizeLimits()
+{
+ LLMultiFloater::updateResizeLimits();
+ assignResizeLimits();
+}
+
+void LLFloaterIMContainer::collapseMessagesPane(bool collapse)
+{
+ if (mMessagesPane->isCollapsed() == collapse)
+ {
+ return;
+ }
+
+ // Save current width of panels before collapsing/expanding right pane.
+ S32 conv_pane_width = mConversationsPane->getRect().getWidth();
+ S32 msg_pane_width = mMessagesPane->getRect().getWidth();
+
+ if (collapse)
+ {
+ // Save the messages pane width before collapsing it.
+ gSavedPerAccountSettings.setS32("ConversationsMessagePaneWidth", msg_pane_width);
+
+ // Save the order in which the panels are closed to reverse user's last action.
+ gSavedPerAccountSettings.setBOOL("ConversationsExpandMessagePaneFirst", mConversationsPane->isCollapsed());
+ }
+
+ mConversationsPane->setIgnoreReshape(collapse);
+
+ // Show/hide the messages pane.
+ mConversationsStack->collapsePanel(mMessagesPane, collapse);
+
+ // Make sure layout is updated before resizing conversation pane.
+ mConversationsStack->updateLayout();
+
+ reshapeFloaterAndSetResizeLimits(collapse, gSavedPerAccountSettings.getS32("ConversationsMessagePaneWidth"));
+
+ if (!collapse)
+ {
+ // Restore conversation's pane previous width after expanding messages pane.
+ mConversationsPane->setTargetDim(conv_pane_width);
+ }
+}
+
+void LLFloaterIMContainer::collapseConversationsPane(bool collapse, bool save_is_allowed /*=true*/)
+{
+ if (mConversationsPane->isCollapsed() == collapse)
+ {
+ return;
+ }
+
+ LLView* button_panel = getChild<LLView>("conversations_pane_buttons_expanded");
+ button_panel->setVisible(!collapse);
+ mExpandCollapseBtn->setImageOverlay(getString(collapse ? "expand_icon" : "collapse_icon"));
+
+ // Save current width of Conversation panel before collapsing/expanding right pane.
+ S32 conv_pane_width = mConversationsPane->getRect().getWidth();
+
+ if (collapse && save_is_allowed)
+ {
+ // Save the conversations pane width before collapsing it.
+ gSavedPerAccountSettings.setS32("ConversationsListPaneWidth", conv_pane_width);
+
+ // Save the order in which the panels are closed to reverse user's last action.
+ gSavedPerAccountSettings.setBOOL("ConversationsExpandMessagePaneFirst", !mMessagesPane->isCollapsed());
+ }
+
+ mConversationsStack->collapsePanel(mConversationsPane, collapse);
+ if (!collapse)
+ {
+ // Make sure layout is updated before resizing conversation pane.
+ mConversationsStack->updateLayout();
+ // Restore conversation's pane previous width.
+ mConversationsPane->setTargetDim(gSavedPerAccountSettings.getS32("ConversationsListPaneWidth"));
+ }
+
+ S32 delta_width =
+ gSavedPerAccountSettings.getS32("ConversationsListPaneWidth") - mConversationsPane->getMinDim();
+
+ reshapeFloaterAndSetResizeLimits(collapse, delta_width);
+
+ for (conversations_widgets_map::iterator widget_it = mConversationsWidgets.begin();
+ widget_it != mConversationsWidgets.end(); ++widget_it)
+ {
+ LLConversationViewSession* widget = dynamic_cast<LLConversationViewSession*>(widget_it->second);
+ if (widget)
+ {
+ widget->toggleCollapsedMode(collapse);
+
+ // force closing all open conversations when collapsing to minimized state
+ if (collapse)
+ {
+ widget->setOpen(false);
+ }
+ widget->requestArrange();
+ }
+ }
+}
+
+void LLFloaterIMContainer::reshapeFloaterAndSetResizeLimits(bool collapse, S32 delta_width)
+{
+ LLRect floater_rect = getRect();
+ floater_rect.mRight += ((collapse ? -1 : 1) * delta_width);
+
+ // Set by_user = true so that reshaped rect is saved in user_settings.
+ setShape(floater_rect, true);
+ updateResizeLimits();
+
+ bool at_least_one_panel_is_expanded =
+ ! (mConversationsPane->isCollapsed() && mMessagesPane->isCollapsed());
+
+ setCanResize(at_least_one_panel_is_expanded);
+ setCanMinimize(at_least_one_panel_is_expanded);
+
+ assignResizeLimits();
+
+ // force set correct size for the title after show/hide minimize button
+ LLRect cur_rect = getRect();
+ LLRect force_rect = cur_rect;
+ force_rect.mRight = cur_rect.mRight + 1;
+ setRect(force_rect);
+ setRect(cur_rect);
+}
+
+void LLFloaterIMContainer::assignResizeLimits()
+{
+ bool is_conv_pane_expanded = !mConversationsPane->isCollapsed();
+ bool is_msg_pane_expanded = !mMessagesPane->isCollapsed();
+
+ // With two panels visible number of borders is three, because the borders
+ // between the panels are merged into one
+ S32 number_of_visible_borders = llmin((is_conv_pane_expanded? 2 : 0) + (is_msg_pane_expanded? 2 : 0), 3);
+ S32 summary_width_of_visible_borders = number_of_visible_borders * LLPANEL_BORDER_WIDTH;
+ S32 conv_pane_target_width = is_conv_pane_expanded?
+ (is_msg_pane_expanded?
+ mConversationsPane->getRect().getWidth()
+ : mConversationsPane->getExpandedMinDim())
+ : mConversationsPane->getMinDim();
+ S32 msg_pane_min_width = is_msg_pane_expanded ? mMessagesPane->getExpandedMinDim() : 0;
+ S32 new_min_width = conv_pane_target_width + msg_pane_min_width + summary_width_of_visible_borders;
+
+ setResizeLimits(new_min_width, getMinHeight());
+
+ mConversationsStack->updateLayout();
+}
+
+void LLFloaterIMContainer::onAddButtonClicked()
+{
+ LLView * button = findChild<LLView>("conversations_pane_buttons_expanded")->findChild<LLButton>("add_btn");
+ LLFloater* root_floater = gFloaterView->getParentFloater(this);
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLFloaterIMContainer::onAvatarPicked, this, _1), TRUE, TRUE, TRUE, root_floater->getName(), button);
+
+ if (picker && root_floater)
+ {
+ root_floater->addDependentFloater(picker);
+ }
+}
+
+void LLFloaterIMContainer::onAvatarPicked(const uuid_vec_t& ids)
+{
+ if (ids.size() == 1)
+ {
+ LLAvatarActions::startIM(ids.back());
+ }
+ else
+ {
+ LLAvatarActions::startConference(ids);
+ }
+}
+
+void LLFloaterIMContainer::onCustomAction(const LLSD& userdata)
+{
+ std::string command = userdata.asString();
+
+ if ("sort_sessions_by_type" == command)
+ {
+ setSortOrderSessions(LLConversationFilter::SO_SESSION_TYPE);
+ }
+ if ("sort_sessions_by_name" == command)
+ {
+ setSortOrderSessions(LLConversationFilter::SO_NAME);
+ }
+ if ("sort_sessions_by_recent" == command)
+ {
+ setSortOrderSessions(LLConversationFilter::SO_DATE);
+ }
+ if ("sort_participants_by_name" == command)
+ {
+ setSortOrderParticipants(LLConversationFilter::SO_NAME);
+ }
+ if ("sort_participants_by_recent" == command)
+ {
+ setSortOrderParticipants(LLConversationFilter::SO_DATE);
+ }
+ if ("sort_participants_by_distance" == command)
+ {
+ setSortOrderParticipants(LLConversationFilter::SO_DISTANCE);
+ }
+ if ("chat_preferences" == command)
+ {
+ LLFloaterPreference * floater_prefp = LLFloaterReg::showTypedInstance<LLFloaterPreference>("preferences");
+ if (floater_prefp)
+ {
+ floater_prefp->selectChatPanel();
+ }
+ }
+ if ("privacy_preferences" == command)
+ {
+ LLFloaterPreference * floater_prefp = LLFloaterReg::showTypedInstance<LLFloaterPreference>("preferences");
+ if (floater_prefp)
+ {
+ floater_prefp->selectPrivacyPanel();
+ }
+ }
+ if ("Translating.Toggle" == command)
+ {
+ gSavedSettings.setBOOL("TranslateChat", !gSavedSettings.getBOOL("TranslateChat"));
+ }
+}
+
+BOOL LLFloaterIMContainer::isActionChecked(const LLSD& userdata)
+{
+ LLConversationSort order = mConversationViewModel.getSorter();
+ std::string command = userdata.asString();
+ if ("sort_sessions_by_type" == command)
+ {
+ return (order.getSortOrderSessions() == LLConversationFilter::SO_SESSION_TYPE);
+ }
+ if ("sort_sessions_by_name" == command)
+ {
+ return (order.getSortOrderSessions() == LLConversationFilter::SO_NAME);
+ }
+ if ("sort_sessions_by_recent" == command)
+ {
+ return (order.getSortOrderSessions() == LLConversationFilter::SO_DATE);
+ }
+ if ("sort_participants_by_name" == command)
+ {
+ return (order.getSortOrderParticipants() == LLConversationFilter::SO_NAME);
+ }
+ if ("sort_participants_by_recent" == command)
+ {
+ return (order.getSortOrderParticipants() == LLConversationFilter::SO_DATE);
+ }
+ if ("sort_participants_by_distance" == command)
+ {
+ return (order.getSortOrderParticipants() == LLConversationFilter::SO_DISTANCE);
+ }
+ if ("Translating.Enabled" == command)
+ {
+ return gSavedPerAccountSettings.getBOOL("TranslatingEnabled");
+ }
+ if ("Translating.On" == command)
+ {
+ return gSavedSettings.getBOOL("TranslateChat");
+ }
+ return FALSE;
+}
+
+void LLFloaterIMContainer::setSortOrderSessions(const LLConversationFilter::ESortOrderType order)
+{
+ LLConversationSort old_order = mConversationViewModel.getSorter();
+ if (order != old_order.getSortOrderSessions())
+ {
+ old_order.setSortOrderSessions(order);
+ setSortOrder(old_order);
+ }
+}
+
+void LLFloaterIMContainer::setSortOrderParticipants(const LLConversationFilter::ESortOrderType order)
+{
+ LLConversationSort old_order = mConversationViewModel.getSorter();
+ if (order != old_order.getSortOrderParticipants())
+ {
+ old_order.setSortOrderParticipants(order);
+ setSortOrder(old_order);
+ }
+}
+
+void LLFloaterIMContainer::setSortOrder(const LLConversationSort& order)
+{
+ mConversationViewModel.setSorter(order);
+ mConversationsRoot->arrangeAll();
+ // try to keep selection onscreen, even if it wasn't to start with
+ mConversationsRoot->scrollToShowSelection();
+
+ // Notify all conversation (torn off or not) of the change to the sort order
+ // Note: For the moment, the sort order is *unique* across all conversations. That might change in the future.
+ for (conversations_items_map::iterator it_session = mConversationsItems.begin(); it_session != mConversationsItems.end(); it_session++)
+ {
+ LLUUID session_id = it_session->first;
+ LLFloaterIMSessionTab *conversation_floater = (session_id.isNull() ? (LLFloaterIMSessionTab*)(LLFloaterReg::findTypedInstance<LLFloaterIMNearbyChat>("nearby_chat")) : (LLFloaterIMSessionTab*)(LLFloaterIMSession::findInstance(session_id)));
+ if (conversation_floater)
+ {
+ conversation_floater->setSortOrder(order);
+ }
+ }
+
+ gSavedSettings.setU32("ConversationSortOrder", (U32)order);
+}
+
+void LLFloaterIMContainer::getSelectedUUIDs(uuid_vec_t& selected_uuids)
+{
+ const std::set<LLFolderViewItem*> selectedItems = mConversationsRoot->getSelectionList();
+
+ std::set<LLFolderViewItem*>::const_iterator it = selectedItems.begin();
+ const std::set<LLFolderViewItem*>::const_iterator it_end = selectedItems.end();
+ LLConversationItem * conversationItem;
+
+ for (; it != it_end; ++it)
+ {
+ conversationItem = static_cast<LLConversationItem *>((*it)->getViewModelItem());
+
+ //When a one-on-one conversation exists, retrieve the participant id from the conversation floater
+ if(conversationItem->getType() == LLConversationItem::CONV_SESSION_1_ON_1)
+ {
+ LLFloaterIMSession * conversation_floaterp = LLFloaterIMSession::findInstance(conversationItem->getUUID());
+ LLUUID participant_id = conversation_floaterp->getOtherParticipantUUID();
+ selected_uuids.push_back(participant_id);
+ }
+ else
+ {
+ selected_uuids.push_back(conversationItem->getUUID());
+ }
+ }
+}
+
+const LLConversationItem * LLFloaterIMContainer::getCurSelectedViewModelItem()
+{
+ LLConversationItem * conversation_item = NULL;
+
+ if(mConversationsRoot &&
+ mConversationsRoot->getCurSelectedItem() &&
+ mConversationsRoot->getCurSelectedItem()->getViewModelItem())
+ {
+ LLFloaterIMSessionTab *selected_session_floater = LLFloaterIMSessionTab::getConversation(mSelectedSession);
+ if (selected_session_floater && !selected_session_floater->getHost() && selected_session_floater->getCurSelectedViewModelItem())
+ {
+ conversation_item = selected_session_floater->getCurSelectedViewModelItem();
+ }
+ else
+ {
+ conversation_item = static_cast<LLConversationItem *>(mConversationsRoot->getCurSelectedItem()->getViewModelItem());
+ }
+ }
+
+ return conversation_item;
+}
+
+void LLFloaterIMContainer::getParticipantUUIDs(uuid_vec_t& selected_uuids)
+{
+ //Find the conversation floater associated with the selected id
+ const LLConversationItem * conversation_item = getCurSelectedViewModelItem();
+
+ if (NULL == conversation_item)
+ {
+ return;
+ }
+
+ getSelectedUUIDs(selected_uuids);
+}
+
+void LLFloaterIMContainer::doToParticipants(const std::string& command, uuid_vec_t& selectedIDS)
+{
+ if (selectedIDS.size() == 1)
+ {
+ const LLUUID& userID = selectedIDS.front();
+ if ("view_profile" == command)
+ {
+ LLAvatarActions::showProfile(userID);
+ }
+ else if ("im" == command)
+ {
+ if (gAgent.getID() != userID)
+ {
+ LLAvatarActions::startIM(userID);
+ }
+ }
+ else if ("offer_teleport" == command)
+ {
+ LLAvatarActions::offerTeleport(selectedIDS);
+ }
+ else if ("voice_call" == command)
+ {
+ LLAvatarActions::startCall(userID);
+ }
+ else if ("chat_history" == command)
+ {
+ LLAvatarActions::viewChatHistory(userID);
+ }
+ else if ("add_friend" == command)
+ {
+ LLAvatarActions::requestFriendshipDialog(userID);
+ }
+ else if ("remove_friend" == command)
+ {
+ LLAvatarActions::removeFriendDialog(userID);
+ }
+ else if ("invite_to_group" == command)
+ {
+ LLAvatarActions::inviteToGroup(userID);
+ }
+ else if ("zoom_in" == command)
+ {
+ handle_zoom_to_object(userID);
+ }
+ else if ("map" == command)
+ {
+ LLAvatarActions::showOnMap(userID);
+ }
+ else if ("share" == command)
+ {
+ LLAvatarActions::share(userID);
+ }
+ else if ("pay" == command)
+ {
+ LLAvatarActions::pay(userID);
+ }
+ else if ("block_unblock" == command)
+ {
+ toggleMute(userID, LLMute::flagVoiceChat);
+ }
+ else if ("mute_unmute" == command)
+ {
+ toggleMute(userID, LLMute::flagTextChat);
+ }
+ else if ("selected" == command || "mute_all" == command || "unmute_all" == command)
+ {
+ moderateVoice(command, userID);
+ }
+ else if ("toggle_allow_text_chat" == command)
+ {
+ toggleAllowTextChat(userID);
+ }
+ }
+ else if (selectedIDS.size() > 1)
+ {
+ if ("im" == command)
+ {
+ LLAvatarActions::startConference(selectedIDS);
+ }
+ else if ("offer_teleport" == command)
+ {
+ LLAvatarActions::offerTeleport(selectedIDS);
+ }
+ else if ("voice_call" == command)
+ {
+ LLAvatarActions::startAdhocCall(selectedIDS);
+ }
+ else if ("remove_friend" == command)
+ {
+ LLAvatarActions::removeFriendsDialog(selectedIDS);
+ }
+ }
+}
+
+void LLFloaterIMContainer::doToSelectedConversation(const std::string& command, uuid_vec_t& selectedIDS)
+{
+ //Find the conversation floater associated with the selected id
+ const LLConversationItem * conversationItem = getCurSelectedViewModelItem();
+ LLFloaterIMSession *conversationFloater = LLFloaterIMSession::findInstance(conversationItem->getUUID());
+
+ if(conversationFloater)
+ {
+ //Close the selected conversation
+ if("close_conversation" == command)
+ {
+ LLFloater::onClickClose(conversationFloater);
+ }
+ else if("open_voice_conversation" == command)
+ {
+ gIMMgr->startCall(conversationItem->getUUID());
+ }
+ else if("disconnect_from_voice" == command)
+ {
+ gIMMgr->endCall(conversationItem->getUUID());
+ }
+ else if("chat_history" == command)
+ {
+ if (selectedIDS.size() > 0)
+ {
+ LLAvatarActions::viewChatHistory(selectedIDS.front());
+ }
+ }
+ else
+ {
+ if(conversationItem->getType() == LLConversationItem::CONV_SESSION_1_ON_1)
+ {
+ doToParticipants(command, selectedIDS);
+ }
+ }
+ }
+}
+
+void LLFloaterIMContainer::doToSelected(const LLSD& userdata)
+{
+ std::string command = userdata.asString();
+ const LLConversationItem * conversationItem = getCurSelectedViewModelItem();
+ uuid_vec_t selected_uuids;
+
+ if(conversationItem != NULL)
+ {
+ getParticipantUUIDs(selected_uuids);
+
+ if(conversationItem->getType() == LLConversationItem::CONV_PARTICIPANT)
+ {
+ doToParticipants(command, selected_uuids);
+ }
+ else
+ {
+ doToSelectedConversation(command, selected_uuids);
+ }
+ }
+}
+
+void LLFloaterIMContainer::doToSelectedGroup(const LLSD& userdata)
+{
+ std::string action = userdata.asString();
+
+ if (action == "group_profile")
+ {
+ LLGroupActions::show(mSelectedSession);
+ }
+ else if (action == "activate_group")
+ {
+ LLGroupActions::activate(mSelectedSession);
+ }
+ else if (action == "leave_group")
+ {
+ LLGroupActions::leave(mSelectedSession);
+ }
+}
+
+bool LLFloaterIMContainer::enableContextMenuItem(const LLSD& userdata)
+{
+ const std::string& item = userdata.asString();
+ uuid_vec_t uuids;
+ getParticipantUUIDs(uuids);
+
+ if ("conversation_log" == item)
+ {
+ return gSavedPerAccountSettings.getS32("KeepConversationLogTranscripts") > 0;
+ }
+
+ //Enable Chat history item for ad-hoc and group conversations
+ if ("can_chat_history" == item && uuids.size() > 0)
+ {
+ return LLLogChat::isTranscriptExist(uuids.front());
+ }
+
+ // If nothing is selected(and selected item is not group chat), everything needs to be disabled
+ if (uuids.size() <= 0)
+ {
+ if(getCurSelectedViewModelItem())
+ {
+ return getCurSelectedViewModelItem()->getType() == LLConversationItem::CONV_SESSION_GROUP;
+ }
+ return false;
+ }
+
+ if("can_activate_group" == item)
+ {
+ LLUUID selected_group_id = getCurSelectedViewModelItem()->getUUID();
+ return gAgent.getGroupID() != selected_group_id;
+ }
+
+ return enableContextMenuItem(item, uuids);
+}
+
+bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_vec_t& uuids)
+{
+ // Extract the single select info
+ bool is_single_select = (uuids.size() == 1);
+ const LLUUID& single_id = uuids.front();
+
+ // Handle options that are applicable to all including the user agent
+ if ("can_view_profile" == item)
+ {
+ return is_single_select;
+ }
+
+ // Beyond that point, if only the user agent is selected, everything is disabled
+ if (is_single_select && (single_id == gAgentID))
+ {
+ return false;
+ }
+
+ // If the user agent is selected with others, everything is disabled
+ for (uuid_vec_t::const_iterator id = uuids.begin(); id != uuids.end(); ++id)
+ {
+ if (gAgent.getID() == *id)
+ {
+ return false;
+ }
+ }
+
+ // Handle all other options
+ if (("can_invite" == item) || ("can_chat_history" == item) || ("can_share" == item) || ("can_pay" == item))
+ {
+ // Those menu items are enable only if a single avatar is selected
+ return is_single_select;
+ }
+ else if ("can_block" == item)
+ {
+ return (is_single_select ? LLAvatarActions::canBlock(single_id) : false);
+ }
+ else if ("can_add" == item)
+ {
+ // We can add friends if:
+ // - there is only 1 selected avatar (EXT-7389)
+ // - this avatar is not already a friend
+ return (is_single_select ? !LLAvatarActions::isFriend(single_id) : false);
+ }
+ else if ("can_delete" == item)
+ {
+ // We can remove friends if there are only friends among the selection
+ bool result = true;
+ for (uuid_vec_t::const_iterator id = uuids.begin(); id != uuids.end(); ++id)
+ {
+ result &= LLAvatarActions::isFriend(*id);
+ }
+ return result;
+ }
+ else if ("can_call" == item)
+ {
+ return LLAvatarActions::canCall();
+ }
+ else if ("can_zoom_in" == item)
+ {
+ return is_single_select && gObjectList.findObject(single_id);
+ }
+ else if ("can_show_on_map" == item)
+ {
+ return (is_single_select ? (LLAvatarTracker::instance().isBuddyOnline(single_id) && is_agent_mappable(single_id)) || gAgent.isGodlike() : false);
+ }
+ else if ("can_offer_teleport" == item)
+ {
+ return LLAvatarActions::canOfferTeleport(uuids);
+ }
+ else if (("can_moderate_voice" == item) || ("can_allow_text_chat" == item) || ("can_mute" == item) || ("can_unmute" == item))
+ {
+ // *TODO : get that out of here...
+ return enableModerateContextMenuItem(item);
+ }
+
+ // By default, options that not explicitely disabled are enabled
+ return true;
+}
+
+bool LLFloaterIMContainer::checkContextMenuItem(const LLSD& userdata)
+{
+ std::string item = userdata.asString();
+ uuid_vec_t uuids;
+ getParticipantUUIDs(uuids);
+
+ return checkContextMenuItem(item, uuids);
+}
+
+bool LLFloaterIMContainer::checkContextMenuItem(const std::string& item, uuid_vec_t& uuids)
+{
+ if (uuids.size() == 1)
+ {
+ if ("is_blocked" == item)
+ {
+ return LLMuteList::getInstance()->isMuted(uuids.front(), LLMute::flagVoiceChat);
+ }
+ else if (item == "is_muted")
+ {
+ return LLMuteList::getInstance()->isMuted(uuids.front(), LLMute::flagTextChat);
+ }
+ else if ("is_allowed_text_chat" == item)
+ {
+ const LLSpeaker * speakerp = getSpeakerOfSelectedParticipant(getSpeakerMgrForSelectedParticipant());
+
+ if (NULL != speakerp)
+ {
+ return !speakerp->mModeratorMutedText;
+ }
+ }
+ }
+
+ return false;
+}
+
+bool LLFloaterIMContainer::visibleContextMenuItem(const LLSD& userdata)
+{
+ const std::string& item = userdata.asString();
+
+ if ("show_mute" == item)
+ {
+ return !isMuted(getCurSelectedViewModelItem()->getUUID());
+ }
+ else if ("show_unmute" == item)
+ {
+ return isMuted(getCurSelectedViewModelItem()->getUUID());
+ }
+
+ return true;
+}
+
+void LLFloaterIMContainer::showConversation(const LLUUID& session_id)
+{
+ setVisibleAndFrontmost(false);
+ selectConversationPair(session_id, true);
+
+ LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(session_id);
+ session_floater->restoreFloater();
+}
+
+void LLFloaterIMContainer::clearAllFlashStates()
+{
+ conversations_widgets_map::iterator widget_it = mConversationsWidgets.begin();
+ for (;widget_it != mConversationsWidgets.end(); ++widget_it)
+ {
+ LLConversationViewSession* widget = dynamic_cast<LLConversationViewSession*>(widget_it->second);
+ if (widget)
+ {
+ widget->setFlashState(false);
+ }
+ }
+}
+
+void LLFloaterIMContainer::selectConversation(const LLUUID& session_id)
+{
+ selectConversationPair(session_id, true);
+}
+
+// Select the conversation *after* (or before if none after) the passed uuid conversation
+// Used to change the selection on key hits
+void LLFloaterIMContainer::selectNextConversationByID(const LLUUID& uuid)
+{
+ bool new_selection = false;
+ selectConversation(uuid);
+ new_selection = selectNextorPreviousConversation(true);
+ if (!new_selection)
+ {
+ selectNextorPreviousConversation(false);
+ }
+}
+
+// Synchronous select the conversation item and the conversation floater
+BOOL LLFloaterIMContainer::selectConversationPair(const LLUUID& session_id, bool select_widget, bool focus_floater/*=true*/)
+{
+ BOOL handled = TRUE;
+ LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(session_id);
+
+ /* widget processing */
+ if (select_widget && mConversationsRoot->getSelectedCount() <= 1)
+ {
+ LLFolderViewItem* widget = get_ptr_in_map(mConversationsWidgets,session_id);
+ if (widget && widget->getParentFolder())
+ {
+ widget->getParentFolder()->setSelection(widget, FALSE, FALSE);
+ mConversationsRoot->scrollToShowSelection();
+ }
+
+ //When in DND mode, remove stored IM notifications
+ //Nearby chat (Null) IMs are not stored while in DND mode, so can ignore removal
+ if(gAgent.isDoNotDisturb() && session_id.notNull())
+ {
+ LLDoNotDisturbNotificationStorage::getInstance()->removeNotification(LLDoNotDisturbNotificationStorage::toastName, session_id);
+ }
+ }
+
+ /* floater processing */
+
+ if (NULL != session_floater)
+ {
+ if (session_id != getSelectedSession())
+ {
+ // Store the active session
+ setSelectedSession(session_id);
+
+
+
+ if (session_floater->getHost())
+ {
+ // Always expand the message pane if the panel is hosted by the container
+ collapseMessagesPane(false);
+ // Switch to the conversation floater that is being selected
+ selectFloater(session_floater);
+ }
+ else
+ {
+ showStub(true);
+ }
+ }
+
+ // Set the focus on the selected floater
+ if (!session_floater->hasFocus())
+ {
+ BOOL is_minimized = session_floater->isMinimized();
+ session_floater->setFocus(focus_floater);
+ session_floater->setMinimized(is_minimized);
+ }
+ }
+ flashConversationItemWidget(session_id,false);
+ return handled;
+}
+
+void LLFloaterIMContainer::setTimeNow(const LLUUID& session_id, const LLUUID& participant_id)
+{
+ LLConversationItemSession* item = dynamic_cast<LLConversationItemSession*>(get_ptr_in_map(mConversationsItems,session_id));
+ if (item)
+ {
+ item->setTimeNow(participant_id);
+ mConversationViewModel.requestSortAll();
+ mConversationsRoot->arrangeAll();
+ }
+}
+
+void LLFloaterIMContainer::setNearbyDistances()
+{
+ // Get the nearby chat session: that's the one with uuid nul
+ LLConversationItemSession* item = dynamic_cast<LLConversationItemSession*>(get_ptr_in_map(mConversationsItems,LLUUID()));
+ if (item)
+ {
+ // Get the positions of the nearby avatars and their ids
+ std::vector<LLVector3d> positions;
+ uuid_vec_t avatar_ids;
+ LLWorld::getInstance()->getAvatars(&avatar_ids, &positions, gAgent.getPositionGlobal(), gSavedSettings.getF32("NearMeRange"));
+ // Get the position of the agent
+ const LLVector3d& me_pos = gAgent.getPositionGlobal();
+ // For each nearby avatar, compute and update the distance
+ int avatar_count = positions.size();
+ for (int i = 0; i < avatar_count; i++)
+ {
+ F64 dist = dist_vec_squared(positions[i], me_pos);
+ item->setDistance(avatar_ids[i],dist);
+ }
+ // Also does it for the agent itself
+ item->setDistance(gAgent.getID(),0.0f);
+ // Request resort
+ mConversationViewModel.requestSortAll();
+ mConversationsRoot->arrangeAll();
+ }
+}
+
+LLConversationItem* LLFloaterIMContainer::addConversationListItem(const LLUUID& uuid, bool isWidgetSelected /*= false*/)
+{
+ bool is_nearby_chat = uuid.isNull();
+
+ // Stores the display name for the conversation line item
+ std::string display_name = is_nearby_chat ? LLTrans::getString("NearbyChatLabel") : LLIMModel::instance().getName(uuid);
+
+ // Check if the item is not already in the list, exit (nothing to do)
+ // Note: this happens often, when reattaching a torn off conversation for instance
+ conversations_items_map::iterator item_it = mConversationsItems.find(uuid);
+ if (item_it != mConversationsItems.end())
+ {
+ return item_it->second;
+ }
+
+ // Create a conversation session model
+ LLConversationItemSession* item = NULL;
+ LLSpeakerMgr* speaker_manager = (is_nearby_chat ? (LLSpeakerMgr*)(LLLocalSpeakerMgr::getInstance()) : LLIMModel::getInstance()->getSpeakerManager(uuid));
+ if (speaker_manager)
+ {
+ item = new LLParticipantList(speaker_manager, getRootViewModel());
+ }
+ if (!item)
+ {
+ llwarns << "Couldn't create conversation session item : " << display_name << llendl;
+ return NULL;
+ }
+ item->renameItem(display_name);
+ item->updateName(NULL);
+
+ mConversationsItems[uuid] = item;
+
+ // Create a widget from it
+ LLConversationViewSession* widget = createConversationItemWidget(item);
+ mConversationsWidgets[uuid] = widget;
+
+ // Add a new conversation widget to the root folder of the folder view
+ widget->addToFolder(mConversationsRoot);
+ widget->requestArrange();
+
+ LLIMModel::LLIMSession * im_sessionp = LLIMModel::getInstance()->findIMSession(uuid);
+
+ // Create the participants widgets now
+ // Note: usually, we do not get an updated avatar list at that point
+ if (uuid.isNull() || im_sessionp && !im_sessionp->isP2PSessionType())
+ {
+ LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = item->getChildrenBegin();
+ LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = item->getChildrenEnd();
+ while (current_participant_model != end_participant_model)
+ {
+ LLConversationItem* participant_model = dynamic_cast<LLConversationItem*>(*current_participant_model);
+ LLConversationViewParticipant* participant_view = createConversationViewParticipant(participant_model);
+ participant_view->addToFolder(widget);
+ current_participant_model++;
+ }
+ }
+
+ if (uuid.notNull() && im_sessionp->isP2PSessionType())
+ {
+ item->fetchAvatarName(false);
+ }
+
+ // Do that too for the conversation dialog
+ LLFloaterIMSessionTab *conversation_floater = (uuid.isNull() ? (LLFloaterIMSessionTab*)(LLFloaterReg::findTypedInstance<LLFloaterIMNearbyChat>("nearby_chat")) : (LLFloaterIMSessionTab*)(LLFloaterIMSession::findInstance(uuid)));
+ if (conversation_floater)
+ {
+ conversation_floater->buildConversationViewParticipant();
+ }
+
+ // set the widget to minimized mode if conversations pane is collapsed
+ widget->toggleCollapsedMode(mConversationsPane->isCollapsed());
+
+ if (isWidgetSelected || 0 == mConversationsRoot->getSelectedCount())
+ {
+ selectConversationPair(uuid, true);
+ widget->requestArrange();
+
+ // scroll to newly added item
+ mConversationsRoot->scrollToShowSelection();
+ }
+
+ return item;
+}
+
+bool LLFloaterIMContainer::removeConversationListItem(const LLUUID& uuid, bool change_focus)
+{
+ // Delete the widget and the associated conversation item
+ // Note : since the mConversationsItems is also the listener to the widget, deleting
+ // the widget will also delete its listener
+ bool is_widget_selected = false;
+ LLFolderViewItem* new_selection = NULL;
+ LLFolderViewItem* widget = get_ptr_in_map(mConversationsWidgets,uuid);
+ if (widget)
+ {
+ is_widget_selected = widget->isSelected();
+ new_selection = mConversationsRoot->getNextFromChild(widget, FALSE);
+ if (!new_selection)
+ {
+ new_selection = mConversationsRoot->getPreviousFromChild(widget, FALSE);
+ }
+ widget->destroyView();
+ }
+
+ // Suppress the conversation items and widgets from their respective maps
+ mConversationsItems.erase(uuid);
+ mConversationsWidgets.erase(uuid);
+
+ // Don't let the focus fall IW, select and refocus on the first conversation in the list
+ if (change_focus)
+ {
+ setFocus(TRUE);
+ if (new_selection)
+ {
+ if (mConversationsWidgets.size() == 1)
+ {
+ // If only one widget is left, it has to be the Nearby Chat. Select it directly.
+ selectConversationPair(LLUUID(NULL), true);
+ }
+ else
+ {
+ LLConversationItem* vmi = dynamic_cast<LLConversationItem*>(new_selection->getViewModelItem());
+ if (vmi)
+ {
+ selectConversationPair(vmi->getUUID(), true);
+ }
+ }
+ }
+ }
+ return is_widget_selected;
+}
+
+LLConversationViewSession* LLFloaterIMContainer::createConversationItemWidget(LLConversationItem* item)
+{
+ LLConversationViewSession::Params params;
+
+ params.name = item->getDisplayName();
+ params.root = mConversationsRoot;
+ params.listener = item;
+ params.tool_tip = params.name;
+ params.container = this;
+
+ //Indentation for aligning the p2p converstation image with the nearby chat arrow
+ if(item->getType() == LLConversationItem::CONV_SESSION_1_ON_1)
+ {
+ params.folder_indentation = 3;
+ }
+
+ return LLUICtrlFactory::create<LLConversationViewSession>(params);
+}
+
+LLConversationViewParticipant* LLFloaterIMContainer::createConversationViewParticipant(LLConversationItem* item)
+{
+ LLConversationViewParticipant::Params params;
+ LLRect panel_rect = mConversationsListPanel->getRect();
+
+ params.name = item->getDisplayName();
+ params.root = mConversationsRoot;
+ params.listener = item;
+
+ //24 is the the current hight of an item (itemHeight) loaded from conversation_view_participant.xml.
+ params.rect = LLRect (0, 24, panel_rect.getWidth(), 0);
+ params.tool_tip = params.name;
+ params.participant_id = item->getUUID();
+ params.folder_indentation = 27;
+
+ return LLUICtrlFactory::create<LLConversationViewParticipant>(params);
+}
+
+bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& userdata)
+{
+ // only group moderators can perform actions related to this "enable callback"
+ if (!isGroupModerator())
+ {
+ return false;
+ }
+
+ LLSpeaker * speakerp = getSpeakerOfSelectedParticipant(getSpeakerMgrForSelectedParticipant());
+ if (NULL == speakerp)
+ {
+ return false;
+ }
+
+ bool voice_channel = speakerp->isInVoiceChannel();
+
+ if ("can_moderate_voice" == userdata)
+ {
+ return voice_channel;
+ }
+ else if ("can_mute" == userdata)
+ {
+ return voice_channel && !isMuted(getCurSelectedViewModelItem()->getUUID());
+ }
+ else if ("can_unmute" == userdata)
+ {
+ return voice_channel && isMuted(getCurSelectedViewModelItem()->getUUID());
+ }
+
+ // The last invoke is used to check whether the "can_allow_text_chat" will enabled
+ return LLVoiceClient::getInstance()->isParticipantAvatar(getCurSelectedViewModelItem()->getUUID());
+}
+
+bool LLFloaterIMContainer::isGroupModerator()
+{
+ LLSpeakerMgr * speaker_manager = getSpeakerMgrForSelectedParticipant();
+ if (NULL == speaker_manager)
+ {
+ llwarns << "Speaker manager is missing" << llendl;
+ return false;
+ }
+
+ // Is session a group call/chat?
+ if(gAgent.isInGroup(speaker_manager->getSessionID()))
+ {
+ LLSpeaker * speaker = speaker_manager->findSpeaker(gAgentID).get();
+
+ // Is agent a moderator?
+ return speaker && speaker->mIsModerator;
+ }
+
+ return false;
+}
+
+void LLFloaterIMContainer::moderateVoice(const std::string& command, const LLUUID& userID)
+{
+ if (!gAgent.getRegion()) return;
+
+ if (command.compare("selected"))
+ {
+ moderateVoiceAllParticipants(command.compare("mute_all"));
+ }
+ else
+ {
+ moderateVoiceParticipant(userID, isMuted(userID));
+ }
+}
+
+bool LLFloaterIMContainer::isMuted(const LLUUID& avatar_id)
+{
+ const LLSpeaker * speakerp = getSpeakerOfSelectedParticipant(getSpeakerMgrForSelectedParticipant());
+ return NULL == speakerp ? true : speakerp->mStatus == LLSpeaker::STATUS_MUTED;
+}
+
+void LLFloaterIMContainer::moderateVoiceAllParticipants(bool unmute)
+{
+ LLIMSpeakerMgr * speaker_managerp = dynamic_cast<LLIMSpeakerMgr*>(getSpeakerMgrForSelectedParticipant());
+
+ if (NULL != speaker_managerp)
+ {
+ if (!unmute)
+ {
+ LLSD payload;
+ payload["session_id"] = speaker_managerp->getSessionID();
+ LLNotificationsUtil::add("ConfirmMuteAll", LLSD(), payload, confirmMuteAllCallback);
+ return;
+ }
+
+ speaker_managerp->moderateVoiceAllParticipants(unmute);
+ }
+}
+
+// static
+void LLFloaterIMContainer::confirmMuteAllCallback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ // if Cancel pressed
+ if (option == 1)
+ {
+ return;
+ }
+
+ const LLSD& payload = notification["payload"];
+ const LLUUID& session_id = payload["session_id"];
+
+ LLIMSpeakerMgr * speaker_manager = dynamic_cast<LLIMSpeakerMgr*> (
+ LLIMModel::getInstance()->getSpeakerManager(session_id));
+ if (speaker_manager)
+ {
+ speaker_manager->moderateVoiceAllParticipants(false);
+ }
+
+ return;
+}
+
+void LLFloaterIMContainer::moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute)
+{
+ LLIMSpeakerMgr * speaker_managerp = dynamic_cast<LLIMSpeakerMgr *>(getSpeakerMgrForSelectedParticipant());
+
+ if (NULL != speaker_managerp)
+ {
+ speaker_managerp->moderateVoiceParticipant(avatar_id, unmute);
+ }
+}
+
+LLSpeakerMgr * LLFloaterIMContainer::getSpeakerMgrForSelectedParticipant()
+{
+ LLFolderViewItem *selectedItem = mConversationsRoot->getCurSelectedItem();
+ if (NULL == selectedItem)
+ {
+ llwarns << "Current selected item is null" << llendl;
+ return NULL;
+ }
+
+ conversations_widgets_map::const_iterator iter = mConversationsWidgets.begin();
+ conversations_widgets_map::const_iterator end = mConversationsWidgets.end();
+ const LLUUID * conversation_uuidp = NULL;
+ while(iter != end)
+ {
+ if (iter->second == selectedItem || iter->second == selectedItem->getParentFolder())
+ {
+ conversation_uuidp = &iter->first;
+ break;
+ }
+ ++iter;
+ }
+ if (NULL == conversation_uuidp)
+ {
+ llwarns << "Cannot find conversation item widget" << llendl;
+ return NULL;
+ }
+
+ return conversation_uuidp->isNull() ? (LLSpeakerMgr *)LLLocalSpeakerMgr::getInstance()
+ : LLIMModel::getInstance()->getSpeakerManager(*conversation_uuidp);
+}
+
+LLSpeaker * LLFloaterIMContainer::getSpeakerOfSelectedParticipant(LLSpeakerMgr * speaker_managerp)
+{
+ if (NULL == speaker_managerp)
+ {
+ llwarns << "Speaker manager is missing" << llendl;
+ return NULL;
+ }
+
+ const LLConversationItem * participant_itemp = getCurSelectedViewModelItem();
+ if (NULL == participant_itemp)
+ {
+ llwarns << "Cannot evaluate current selected view model item" << llendl;
+ return NULL;
+ }
+
+ return speaker_managerp->findSpeaker(participant_itemp->getUUID());
+}
+
+void LLFloaterIMContainer::toggleAllowTextChat(const LLUUID& participant_uuid)
+{
+ LLIMSpeakerMgr * speaker_managerp = dynamic_cast<LLIMSpeakerMgr*>(getSpeakerMgrForSelectedParticipant());
+ if (NULL != speaker_managerp)
+ {
+ speaker_managerp->toggleAllowTextChat(participant_uuid);
+ }
+}
+
+void LLFloaterIMContainer::toggleMute(const LLUUID& participant_id, U32 flags)
+{
+ BOOL is_muted = LLMuteList::getInstance()->isMuted(participant_id, flags);
+ std::string name;
+ gCacheName->getFullName(participant_id, name);
+ LLMute mute(participant_id, name, LLMute::AGENT);
+
+ if (!is_muted)
+ {
+ LLMuteList::getInstance()->add(mute, flags);
+ }
+ else
+ {
+ LLMuteList::getInstance()->remove(mute, flags);
+ }
+}
+
+void LLFloaterIMContainer::openNearbyChat()
+{
+ // If there's only one conversation in the container and that conversation is the nearby chat
+ //(which it should be...), open it so to make the list of participants visible. This happens to be the most common case when opening the Chat floater.
+ if((mConversationsItems.size() == 1)&&(!mConversationsPane->isCollapsed()))
+ {
+ LLConversationViewSession* nearby_chat = dynamic_cast<LLConversationViewSession*>(get_ptr_in_map(mConversationsWidgets,LLUUID()));
+ if (nearby_chat)
+ {
+ reSelectConversation();
+ nearby_chat->setOpen(TRUE);
+ }
+ }
+}
+
+void LLFloaterIMContainer::onNearbyChatClosed()
+{
+ // If nearby chat is the only remaining conversation and it is closed, close whole conversation floater as well
+ if (mConversationsItems.size() == 1)
+ closeFloater();
+}
+
+void LLFloaterIMContainer::reSelectConversation()
+{
+ LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(mSelectedSession);
+ if (session_floater->getHost())
+ {
+ selectFloater(session_floater);
+ }
+}
+
+void LLFloaterIMContainer::updateSpeakBtnState()
+{
+ LLButton* mSpeakBtn = getChild<LLButton>("speak_btn");
+ mSpeakBtn->setToggleState(LLVoiceClient::getInstance()->getUserPTTState());
+ mSpeakBtn->setEnabled(LLAgent::isActionAllowed("speak"));
+}
+
+bool LLFloaterIMContainer::isConversationLoggingAllowed()
+{
+ return gSavedPerAccountSettings.getS32("KeepConversationLogTranscripts") > 0;
+}
+
+void LLFloaterIMContainer::flashConversationItemWidget(const LLUUID& session_id, bool is_flashes)
+{
+ //Finds the conversation line item to flash using the session_id
+ LLConversationViewSession * widget = dynamic_cast<LLConversationViewSession *>(get_ptr_in_map(mConversationsWidgets,session_id));
+
+ if (widget)
+ {
+ widget->setFlashState(is_flashes);
+ }
+}
+
+bool LLFloaterIMContainer::isScrolledOutOfSight(LLConversationViewSession* conversation_item_widget)
+{
+ llassert(conversation_item_widget != NULL);
+
+ // make sure the widget is actually in the right spot first
+ mConversationsRoot->arrange(NULL, NULL);
+
+ // check whether the widget is in the visible portion of the scroll container
+ LLRect widget_rect;
+ conversation_item_widget->localRectToOtherView(conversation_item_widget->getLocalRect(), &widget_rect, mConversationsRoot);
+ return !mConversationsRoot->getVisibleRect().overlaps(widget_rect);
+}
+
+BOOL LLFloaterIMContainer::handleKeyHere(KEY key, MASK mask )
+{
+ if(mask == MASK_ALT)
+ {
+ if (KEY_RETURN == key )
+ {
+ expandConversation();
+ }
+
+ if ((KEY_DOWN == key ) || (KEY_RIGHT == key))
+ {
+ selectNextorPreviousConversation(true);
+ }
+ if ((KEY_UP == key) || (KEY_LEFT == key))
+ {
+ selectNextorPreviousConversation(false);
+ }
+ }
+ return TRUE;
+}
+
+bool LLFloaterIMContainer::selectAdjacentConversation(bool focus_selected)
+{
+ bool selectedAdjacentConversation = selectNextorPreviousConversation(true, focus_selected);
+
+ if(!selectedAdjacentConversation)
+ {
+ selectedAdjacentConversation = selectNextorPreviousConversation(false, focus_selected);
+ }
+
+ return selectedAdjacentConversation;
+}
+
+bool LLFloaterIMContainer::selectNextorPreviousConversation(bool select_next, bool focus_selected)
+{
+ if (mConversationsWidgets.size() > 1)
+ {
+ LLFolderViewItem* new_selection = NULL;
+ LLFolderViewItem* widget = get_ptr_in_map(mConversationsWidgets,getSelectedSession());
+ if (widget)
+ {
+ if(select_next)
+ {
+ new_selection = mConversationsRoot->getNextFromChild(widget, FALSE);
+ }
+ else
+ {
+ new_selection = mConversationsRoot->getPreviousFromChild(widget, FALSE);
+ }
+ if (new_selection)
+ {
+ LLConversationItem* vmi = dynamic_cast<LLConversationItem*>(new_selection->getViewModelItem());
+ if (vmi)
+ {
+ selectConversationPair(vmi->getUUID(), true, focus_selected);
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+void LLFloaterIMContainer::expandConversation()
+{
+ LLConversationViewSession* widget = dynamic_cast<LLConversationViewSession*>(get_ptr_in_map(mConversationsWidgets,getSelectedSession()));
+ if (widget)
+ {
+ widget->setOpen(!widget->isOpen());
+ }
+}
+
+void LLFloaterIMContainer::closeFloater(bool app_quitting/* = false*/)
+{
+ // Always unminimize before trying to close.
+ // Most of the time the user will never see this state.
+ setMinimized(FALSE);
+
+ LLFloater::closeFloater(app_quitting);
+}
+
+// EOF
diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h
new file mode 100644
index 0000000000..2cbc1e99f9
--- /dev/null
+++ b/indra/newview/llfloaterimcontainer.h
@@ -0,0 +1,209 @@
+/**
+ * @file llfloaterimcontainer.h
+ * @brief Multifloater containing active IM sessions in separate tab container tabs
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERIMCONTAINER_H
+#define LL_LLFLOATERIMCONTAINER_H
+
+#include <map>
+#include <vector>
+
+#include "llimview.h"
+#include "llevents.h"
+#include "../llui/llfloater.h"
+#include "../llui/llmultifloater.h"
+#include "llavatarpropertiesprocessor.h"
+#include "llgroupmgr.h"
+#include "../llui/lltrans.h"
+#include "llconversationmodel.h"
+#include "llconversationview.h"
+
+class LLButton;
+class LLLayoutPanel;
+class LLLayoutStack;
+class LLTabContainer;
+class LLFloaterIMContainer;
+class LLSpeaker;
+class LLSpeakerMgr;
+
+class LLFloaterIMContainer
+ : public LLMultiFloater
+ , public LLIMSessionObserver
+{
+public:
+ LLFloaterIMContainer(const LLSD& seed, const Params& params = getDefaultParams());
+ virtual ~LLFloaterIMContainer();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void draw();
+ /*virtual*/ void setVisible(BOOL visible);
+ /*virtual*/ void updateResizeLimits();
+ void onCloseFloater(LLUUID& id);
+
+ /*virtual*/ void addFloater(LLFloater* floaterp,
+ BOOL select_added_floater,
+ LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END);
+ void returnFloaterToHost();
+ void showConversation(const LLUUID& session_id);
+ void selectConversation(const LLUUID& session_id);
+ void selectNextConversationByID(const LLUUID& session_id);
+ BOOL selectConversationPair(const LLUUID& session_id, bool select_widget, bool focus_floater = true);
+ void clearAllFlashStates();
+ bool selectAdjacentConversation(bool focus_selected);
+ bool selectNextorPreviousConversation(bool select_next, bool focus_selected = true);
+ void expandConversation();
+
+ /*virtual*/ void tabClose();
+ void showStub(bool visible);
+
+ static LLFloater* getCurrentVoiceFloater();
+ static LLFloaterIMContainer* findInstance();
+ static LLFloaterIMContainer* getInstance();
+
+ static void onCurrentChannelChanged(const LLUUID& session_id);
+
+ void collapseMessagesPane(bool collapse);
+
+ // Callbacks
+ static void idle(void* user_data);
+
+ // LLIMSessionObserver observe triggers
+ /*virtual*/ void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id, BOOL has_offline_msg);
+ /*virtual*/ void sessionActivated(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id);
+ /*virtual*/ void sessionVoiceOrIMStarted(const LLUUID& session_id);
+ /*virtual*/ void sessionRemoved(const LLUUID& session_id);
+ /*virtual*/ void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
+
+ LLConversationViewModel& getRootViewModel() { return mConversationViewModel; }
+ LLUUID getSelectedSession() { return mSelectedSession; }
+ void setSelectedSession(LLUUID sessionID) { mSelectedSession = sessionID; }
+ LLConversationItem* getSessionModel(const LLUUID& session_id) { return get_ptr_in_map(mConversationsItems,session_id); }
+ LLConversationSort& getSortOrder() { return mConversationViewModel.getSorter(); }
+
+ void onNearbyChatClosed();
+
+ // Handling of lists of participants is public so to be common with llfloatersessiontab
+ // *TODO : Find a better place for this.
+ bool checkContextMenuItem(const std::string& item, uuid_vec_t& selectedIDS);
+ bool enableContextMenuItem(const std::string& item, uuid_vec_t& selectedIDS);
+ void doToParticipants(const std::string& item, uuid_vec_t& selectedIDS);
+
+ void assignResizeLimits();
+ virtual BOOL handleKeyHere(KEY key, MASK mask );
+ /*virtual*/ void closeFloater(bool app_quitting = false);
+
+private:
+ typedef std::map<LLUUID,LLFloater*> avatarID_panel_map_t;
+ avatarID_panel_map_t mSessions;
+ boost::signals2::connection mNewMessageConnection;
+
+ /*virtual*/ void computeResizeLimits(S32& new_min_width, S32& new_min_height) {}
+
+ void onNewMessageReceived(const LLSD& data);
+
+ void onExpandCollapseButtonClicked();
+ void onStubCollapseButtonClicked();
+ void processParticipantsStyleUpdate();
+ void onSpeakButtonClicked();
+
+ void collapseConversationsPane(bool collapse, bool save_is_allowed=true);
+
+ void reshapeFloaterAndSetResizeLimits(bool collapse, S32 delta_width);
+
+ void onAddButtonClicked();
+ void onAvatarPicked(const uuid_vec_t& ids);
+
+ BOOL isActionChecked(const LLSD& userdata);
+ void onCustomAction (const LLSD& userdata);
+ void setSortOrderSessions(const LLConversationFilter::ESortOrderType order);
+ void setSortOrderParticipants(const LLConversationFilter::ESortOrderType order);
+ void setSortOrder(const LLConversationSort& order);
+
+ void getSelectedUUIDs(uuid_vec_t& selected_uuids);
+ const LLConversationItem * getCurSelectedViewModelItem();
+ void getParticipantUUIDs(uuid_vec_t& selected_uuids);
+ void doToSelected(const LLSD& userdata);
+ bool checkContextMenuItem(const LLSD& userdata);
+ bool enableContextMenuItem(const LLSD& userdata);
+ bool visibleContextMenuItem(const LLSD& userdata);
+ void doToSelectedConversation(const std::string& command, uuid_vec_t& selectedIDS);
+ void doToSelectedGroup(const LLSD& userdata);
+
+ static void confirmMuteAllCallback(const LLSD& notification, const LLSD& response);
+ bool enableModerateContextMenuItem(const std::string& userdata);
+ LLSpeaker * getSpeakerOfSelectedParticipant(LLSpeakerMgr * speaker_managerp);
+ LLSpeakerMgr * getSpeakerMgrForSelectedParticipant();
+ bool isGroupModerator();
+ bool isMuted(const LLUUID& avatar_id);
+ void moderateVoice(const std::string& command, const LLUUID& userID);
+ void moderateVoiceAllParticipants(bool unmute);
+ void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute);
+ void toggleAllowTextChat(const LLUUID& participant_uuid);
+ void toggleMute(const LLUUID& participant_id, U32 flags);
+ void openNearbyChat();
+
+ LLButton* mExpandCollapseBtn;
+ LLButton* mStubCollapseBtn;
+ LLPanel* mStubPanel;
+ LLTextBox* mStubTextBox;
+ LLLayoutPanel* mMessagesPane;
+ LLLayoutPanel* mConversationsPane;
+ LLLayoutStack* mConversationsStack;
+
+ bool mInitialized;
+
+ LLUUID mSelectedSession;
+ std::string mGeneralTitle;
+
+ // Conversation list implementation
+public:
+ bool removeConversationListItem(const LLUUID& uuid, bool change_focus = true);
+ LLConversationItem* addConversationListItem(const LLUUID& uuid, bool isWidgetSelected = false);
+ void setTimeNow(const LLUUID& session_id, const LLUUID& participant_id);
+ void setNearbyDistances();
+ void reSelectConversation();
+ void updateSpeakBtnState();
+ static bool isConversationLoggingAllowed();
+ void flashConversationItemWidget(const LLUUID& session_id, bool is_flashes);
+ bool isScrolledOutOfSight(LLConversationViewSession* conversation_item_widget);
+ boost::signals2::connection mMicroChangedSignal;
+ S32 getConversationListItemSize() { return mConversationsWidgets.size(); }
+
+private:
+ LLConversationViewSession* createConversationItemWidget(LLConversationItem* item);
+ LLConversationViewParticipant* createConversationViewParticipant(LLConversationItem* item);
+ bool onConversationModelEvent(const LLSD& event);
+
+ // Conversation list data
+ LLPanel* mConversationsListPanel; // This is the main widget we add conversation widget to
+ conversations_items_map mConversationsItems;
+ conversations_widgets_map mConversationsWidgets;
+ LLConversationViewModel mConversationViewModel;
+ LLFolderView* mConversationsRoot;
+ LLEventStream mConversationsEventStream;
+};
+
+#endif // LL_LLFLOATERIMCONTAINER_H
diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp
new file mode 100644
index 0000000000..b287950c21
--- /dev/null
+++ b/indra/newview/llfloaterimnearbychat.cpp
@@ -0,0 +1,881 @@
+/**
+ * @file LLFloaterIMNearbyChat.cpp
+ * @brief LLFloaterIMNearbyChat class implementation
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "message.h"
+
+#include "lliconctrl.h"
+#include "llappviewer.h"
+#include "llchatentry.h"
+#include "llfloaterreg.h"
+#include "lltrans.h"
+#include "llfloaterimcontainer.h"
+#include "llfloatersidepanelcontainer.h"
+#include "llfocusmgr.h"
+#include "lllogchat.h"
+#include "llresizebar.h"
+#include "llresizehandle.h"
+#include "lldraghandle.h"
+#include "llmenugl.h"
+#include "llviewermenu.h" // for gMenuHolder
+#include "llfloaterimnearbychathandler.h"
+#include "llchannelmanager.h"
+#include "llchathistory.h"
+#include "llstylemap.h"
+#include "llavatarnamecache.h"
+#include "llfloaterreg.h"
+#include "lltrans.h"
+
+#include "llfirstuse.h"
+#include "llfloaterimnearbychat.h"
+#include "llagent.h" // gAgent
+#include "llgesturemgr.h"
+#include "llmultigesture.h"
+#include "llkeyboard.h"
+#include "llanimationstates.h"
+#include "llviewerstats.h"
+#include "llcommandhandler.h"
+#include "llviewercontrol.h"
+#include "llnavigationbar.h"
+#include "llwindow.h"
+#include "llviewerwindow.h"
+#include "llrootview.h"
+#include "llviewerchat.h"
+#include "lltranslate.h"
+#include "llautoreplace.h"
+
+S32 LLFloaterIMNearbyChat::sLastSpecialChatChannel = 0;
+
+const S32 EXPANDED_HEIGHT = 266;
+const S32 COLLAPSED_HEIGHT = 60;
+const S32 EXPANDED_MIN_HEIGHT = 150;
+
+// legacy callback glue
+void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel);
+
+struct LLChatTypeTrigger {
+ std::string name;
+ EChatType type;
+};
+
+static LLChatTypeTrigger sChatTypeTriggers[] = {
+ { "/whisper" , CHAT_TYPE_WHISPER},
+ { "/shout" , CHAT_TYPE_SHOUT}
+};
+
+
+LLFloaterIMNearbyChat::LLFloaterIMNearbyChat(const LLSD& llsd)
+: LLFloaterIMSessionTab(llsd),
+ //mOutputMonitor(NULL),
+ mSpeakerMgr(NULL),
+ mExpandedHeight(COLLAPSED_HEIGHT + EXPANDED_HEIGHT)
+{
+ mIsP2PChat = false;
+ mIsNearbyChat = true;
+ mSpeakerMgr = LLLocalSpeakerMgr::getInstance();
+ mSessionID = LLUUID();
+}
+
+//static
+LLFloaterIMNearbyChat* LLFloaterIMNearbyChat::buildFloater(const LLSD& key)
+{
+ LLFloaterReg::getInstance("im_container");
+ return new LLFloaterIMNearbyChat(key);
+}
+
+//virtual
+BOOL LLFloaterIMNearbyChat::postBuild()
+{
+ setIsSingleInstance(TRUE);
+ BOOL result = LLFloaterIMSessionTab::postBuild();
+
+ mInputEditor->setAutoreplaceCallback(boost::bind(&LLAutoReplace::autoreplaceCallback, LLAutoReplace::getInstance(), _1, _2, _3, _4, _5));
+ mInputEditor->setCommitCallback(boost::bind(&LLFloaterIMNearbyChat::onChatBoxCommit, this));
+ mInputEditor->setKeystrokeCallback(boost::bind(&LLFloaterIMNearbyChat::onChatBoxKeystroke, this));
+ mInputEditor->setFocusLostCallback(boost::bind(&LLFloaterIMNearbyChat::onChatBoxFocusLost, this));
+ mInputEditor->setFocusReceivedCallback(boost::bind(&LLFloaterIMNearbyChat::onChatBoxFocusReceived, this));
+ mInputEditor->setLabel(LLTrans::getString("NearbyChatTitle"));
+
+ // Title must be defined BEFORE call to addConversationListItem() because
+ // it is used to show the item's name in the conversations list
+ setTitle(LLTrans::getString("NearbyChatTitle"));
+
+ // obsolete, but may be needed for backward compatibility?
+ gSavedSettings.declareS32("nearbychat_showicons_and_names", 2, "NearByChat header settings", true);
+
+ if (gSavedPerAccountSettings.getBOOL("LogShowHistory"))
+ {
+ loadHistory();
+ }
+
+ return result;
+}
+
+// virtual
+void LLFloaterIMNearbyChat::closeHostedFloater()
+{
+ // Should check how many conversations are ongoing. Close all if 1 only (the Nearby Chat), select next one otherwise
+ LLFloaterIMContainer* floater_container = LLFloaterIMContainer::getInstance();
+ if (floater_container->getConversationListItemSize() == 1)
+ {
+ floater_container->closeFloater();
+ }
+ else
+ {
+ if (!getHost())
+ {
+ setVisible(FALSE);
+ }
+ floater_container->selectNextConversationByID(LLUUID());
+ }
+}
+
+// virtual
+void LLFloaterIMNearbyChat::refresh()
+{
+ displaySpeakingIndicator();
+ updateCallBtnState(LLVoiceClient::getInstance()->getUserPTTState());
+
+ // *HACK: Update transparency type depending on whether our children have focus.
+ // This is needed because this floater is chrome and thus cannot accept focus, so
+ // the transparency type setting code from LLFloater::setFocus() isn't reached.
+ if (getTransparencyType() != TT_DEFAULT)
+ {
+ setTransparencyType(hasFocus() ? TT_ACTIVE : TT_INACTIVE);
+ }
+}
+
+void LLFloaterIMNearbyChat::reloadMessages(bool clean_messages/* = false*/)
+{
+ if (clean_messages)
+ {
+ mMessageArchive.clear();
+ loadHistory();
+ }
+
+ mChatHistory->clear();
+
+ LLSD do_not_log;
+ do_not_log["do_not_log"] = true;
+ for(std::vector<LLChat>::iterator it = mMessageArchive.begin();it!=mMessageArchive.end();++it)
+ {
+ // Update the messages without re-writing them to a log file.
+ addMessage(*it,false, do_not_log);
+ }
+}
+
+void LLFloaterIMNearbyChat::loadHistory()
+{
+ LLSD do_not_log;
+ do_not_log["do_not_log"] = true;
+
+ std::list<LLSD> history;
+ LLLogChat::loadChatHistory("chat", history);
+
+ std::list<LLSD>::const_iterator it = history.begin();
+ while (it != history.end())
+ {
+ const LLSD& msg = *it;
+
+ std::string from = msg[LL_IM_FROM];
+ LLUUID from_id;
+ if (msg[LL_IM_FROM_ID].isDefined())
+ {
+ from_id = msg[LL_IM_FROM_ID].asUUID();
+ }
+ else
+ {
+ std::string legacy_name = gCacheName->buildLegacyName(from);
+ gCacheName->getUUID(legacy_name, from_id);
+ }
+
+ LLChat chat;
+ chat.mFromName = from;
+ chat.mFromID = from_id;
+ chat.mText = msg[LL_IM_TEXT].asString();
+ chat.mTimeStr = msg[LL_IM_TIME].asString();
+ chat.mChatStyle = CHAT_STYLE_HISTORY;
+
+ chat.mSourceType = CHAT_SOURCE_AGENT;
+ if (from_id.isNull() && SYSTEM_FROM == from)
+ {
+ chat.mSourceType = CHAT_SOURCE_SYSTEM;
+
+ }
+ else if (from_id.isNull())
+ {
+ chat.mSourceType = isWordsName(from) ? CHAT_SOURCE_UNKNOWN : CHAT_SOURCE_OBJECT;
+ }
+
+ addMessage(chat, true, do_not_log);
+
+ it++;
+ }
+}
+
+void LLFloaterIMNearbyChat::removeScreenChat()
+{
+ LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID")));
+ if(chat_channel)
+ {
+ chat_channel->removeToastsFromChannel();
+ }
+}
+
+
+void LLFloaterIMNearbyChat::setVisible(BOOL visible)
+{
+ LLFloaterIMSessionTab::setVisible(visible);
+
+ if(visible)
+ {
+ removeScreenChat();
+ }
+}
+
+
+void LLFloaterIMNearbyChat::setVisibleAndFrontmost(BOOL take_focus, const LLSD& key)
+{
+ LLFloaterIMSessionTab::setVisibleAndFrontmost(take_focus, key);
+
+ if(!isTornOff() && matchesKey(key))
+ {
+ LLFloaterIMContainer::getInstance()->selectConversationPair(mSessionID, true, false);
+ }
+}
+
+// virtual
+void LLFloaterIMNearbyChat::onTearOffClicked()
+{
+ LLFloaterIMSessionTab::onTearOffClicked();
+
+ // see CHUI-170: Save torn-off state of the nearby chat between sessions
+ BOOL in_the_multifloater = (BOOL)getHost();
+ gSavedPerAccountSettings.setBOOL("NearbyChatIsNotTornOff", in_the_multifloater);
+}
+
+
+// virtual
+void LLFloaterIMNearbyChat::onOpen(const LLSD& key)
+{
+ LLFloaterIMSessionTab::onOpen(key);
+ showTranslationCheckbox(LLTranslate::isTranslationConfigured());
+}
+
+// virtual
+void LLFloaterIMNearbyChat::onClose(bool app_quitting)
+{
+ // Override LLFloaterIMSessionTab::onClose() so that Nearby Chat is not removed from the conversation floater
+ LLFloaterIMSessionTab::restoreFloater();
+ onClickCloseBtn();
+}
+
+// virtual
+void LLFloaterIMNearbyChat::onClickCloseBtn()
+{
+ if (!isTornOff())
+ {
+ return;
+ }
+ LLFloaterIMSessionTab::onTearOffClicked();
+
+ LLFloaterIMContainer *im_box = LLFloaterIMContainer::findInstance();
+ if (im_box)
+ {
+ im_box->onNearbyChatClosed();
+ }
+}
+
+void LLFloaterIMNearbyChat::onChatFontChange(LLFontGL* fontp)
+{
+ // Update things with the new font whohoo
+ if (mInputEditor)
+ {
+ mInputEditor->setFont(fontp);
+ }
+}
+
+
+void LLFloaterIMNearbyChat::show()
+{
+ if (isChatMultiTab())
+ {
+ openFloater(getKey());
+ }
+}
+
+bool LLFloaterIMNearbyChat::isChatVisible() const
+{
+ bool isVisible = false;
+ LLFloaterIMContainer* im_box = LLFloaterIMContainer::getInstance();
+ // Is the IM floater container ever null?
+ llassert(im_box != NULL);
+ if (im_box != NULL)
+ {
+ isVisible =
+ isChatMultiTab() && gSavedPerAccountSettings.getBOOL("NearbyChatIsNotTornOff")?
+ im_box->getVisible() && !im_box->isMinimized() :
+ getVisible() && !isMinimized();
+ }
+
+ return isVisible;
+}
+
+void LLFloaterIMNearbyChat::showHistory()
+{
+ openFloater();
+ if(!isMessagePaneExpanded())
+ {
+ restoreFloater();
+ setFocus(true);
+ }
+ setResizeLimits(getMinWidth(), EXPANDED_MIN_HEIGHT);
+}
+
+std::string LLFloaterIMNearbyChat::getCurrentChat()
+{
+ return mInputEditor ? mInputEditor->getText() : LLStringUtil::null;
+}
+
+// virtual
+BOOL LLFloaterIMNearbyChat::handleKeyHere( KEY key, MASK mask )
+{
+ BOOL handled = FALSE;
+
+ if( KEY_RETURN == key && mask == MASK_CONTROL)
+ {
+ // shout
+ sendChat(CHAT_TYPE_SHOUT);
+ handled = TRUE;
+ }
+ else if (KEY_RETURN == key && mask == MASK_SHIFT)
+ {
+ // whisper
+ sendChat(CHAT_TYPE_WHISPER);
+ handled = TRUE;
+ }
+
+
+ if((mask == MASK_ALT) && isTornOff())
+ {
+ LLFloaterIMContainer* floater_container = LLFloaterIMContainer::getInstance();
+ if ((KEY_UP == key) || (KEY_LEFT == key))
+ {
+ floater_container->selectNextorPreviousConversation(false);
+ handled = TRUE;
+ }
+ if ((KEY_DOWN == key ) || (KEY_RIGHT == key))
+ {
+ floater_container->selectNextorPreviousConversation(true);
+ handled = TRUE;
+ }
+ }
+
+ return handled;
+}
+
+BOOL LLFloaterIMNearbyChat::matchChatTypeTrigger(const std::string& in_str, std::string* out_str)
+{
+ U32 in_len = in_str.length();
+ S32 cnt = sizeof(sChatTypeTriggers) / sizeof(*sChatTypeTriggers);
+
+ bool string_was_found = false;
+
+ for (S32 n = 0; n < cnt && !string_was_found; n++)
+ {
+ if (in_len <= sChatTypeTriggers[n].name.length())
+ {
+ std::string trigger_trunc = sChatTypeTriggers[n].name;
+ LLStringUtil::truncate(trigger_trunc, in_len);
+
+ if (!LLStringUtil::compareInsensitive(in_str, trigger_trunc))
+ {
+ *out_str = sChatTypeTriggers[n].name;
+ string_was_found = true;
+ }
+ }
+ }
+
+ return string_was_found;
+}
+
+void LLFloaterIMNearbyChat::onChatBoxKeystroke()
+{
+ LLFloaterIMContainer* im_box = LLFloaterIMContainer::findInstance();
+ if (im_box)
+ {
+ im_box->flashConversationItemWidget(mSessionID,false);
+ }
+
+ LLFirstUse::otherAvatarChatFirst(false);
+
+ LLWString raw_text = mInputEditor->getWText();
+
+ // Can't trim the end, because that will cause autocompletion
+ // to eat trailing spaces that might be part of a gesture.
+ LLWStringUtil::trimHead(raw_text);
+
+ S32 length = raw_text.length();
+
+ if( (length > 0) && (raw_text[0] != '/') ) // forward slash is used for escape (eg. emote) sequences
+ {
+ gAgent.startTyping();
+ }
+ else
+ {
+ gAgent.stopTyping();
+ }
+
+ /* Doesn't work -- can't tell the difference between a backspace
+ that killed the selection vs. backspace at the end of line.
+ if (length > 1
+ && text[0] == '/'
+ && key == KEY_BACKSPACE)
+ {
+ // the selection will already be deleted, but we need to trim
+ // off the character before
+ std::string new_text = raw_text.substr(0, length-1);
+ mInputEditor->setText( new_text );
+ mInputEditor->setCursorToEnd();
+ length = length - 1;
+ }
+ */
+
+ KEY key = gKeyboard->currentKey();
+
+ // Ignore "special" keys, like backspace, arrows, etc.
+ if (length > 1
+ && raw_text[0] == '/'
+ && key < KEY_SPECIAL)
+ {
+ // we're starting a gesture, attempt to autocomplete
+
+ std::string utf8_trigger = wstring_to_utf8str(raw_text);
+ std::string utf8_out_str(utf8_trigger);
+
+ if (LLGestureMgr::instance().matchPrefix(utf8_trigger, &utf8_out_str))
+ {
+ std::string rest_of_match = utf8_out_str.substr(utf8_trigger.size());
+ mInputEditor->setText(utf8_trigger + rest_of_match); // keep original capitalization for user-entered part
+
+ // Select to end of line, starting from the character
+ // after the last one the user typed.
+ mInputEditor->selectNext(rest_of_match, false);
+ }
+ else if (matchChatTypeTrigger(utf8_trigger, &utf8_out_str))
+ {
+ std::string rest_of_match = utf8_out_str.substr(utf8_trigger.size());
+ mInputEditor->setText(utf8_trigger + rest_of_match + " "); // keep original capitalization for user-entered part
+ mInputEditor->endOfDoc();
+ }
+
+ //llinfos << "GESTUREDEBUG " << trigger
+ // << " len " << length
+ // << " outlen " << out_str.getLength()
+ // << llendl;
+ }
+}
+
+// static
+void LLFloaterIMNearbyChat::onChatBoxFocusLost()
+{
+ // stop typing animation
+ gAgent.stopTyping();
+}
+
+void LLFloaterIMNearbyChat::onChatBoxFocusReceived()
+{
+ mInputEditor->setEnabled(!gDisconnected);
+}
+
+EChatType LLFloaterIMNearbyChat::processChatTypeTriggers(EChatType type, std::string &str)
+{
+ U32 length = str.length();
+ S32 cnt = sizeof(sChatTypeTriggers) / sizeof(*sChatTypeTriggers);
+
+ for (S32 n = 0; n < cnt; n++)
+ {
+ if (length >= sChatTypeTriggers[n].name.length())
+ {
+ std::string trigger = str.substr(0, sChatTypeTriggers[n].name.length());
+
+ if (!LLStringUtil::compareInsensitive(trigger, sChatTypeTriggers[n].name))
+ {
+ U32 trigger_length = sChatTypeTriggers[n].name.length();
+
+ // It's to remove space after trigger name
+ if (length > trigger_length && str[trigger_length] == ' ')
+ trigger_length++;
+
+ str = str.substr(trigger_length, length);
+
+ if (CHAT_TYPE_NORMAL == type)
+ return sChatTypeTriggers[n].type;
+ else
+ break;
+ }
+ }
+ }
+
+ return type;
+}
+
+void LLFloaterIMNearbyChat::sendChat( EChatType type )
+{
+ if (mInputEditor)
+ {
+ LLWString text = mInputEditor->getWText();
+ LLWStringUtil::trim(text);
+ LLWStringUtil::replaceChar(text,182,'\n'); // Convert paragraph symbols back into newlines.
+ if (!text.empty())
+ {
+ // Check if this is destined for another channel
+ S32 channel = 0;
+ stripChannelNumber(text, &channel);
+
+ std::string utf8text = wstring_to_utf8str(text);
+ // Try to trigger a gesture, if not chat to a script.
+ std::string utf8_revised_text;
+ if (0 == channel)
+ {
+ // discard returned "found" boolean
+ LLGestureMgr::instance().triggerAndReviseString(utf8text, &utf8_revised_text);
+ }
+ else
+ {
+ utf8_revised_text = utf8text;
+ }
+
+ utf8_revised_text = utf8str_trim(utf8_revised_text);
+
+ type = processChatTypeTriggers(type, utf8_revised_text);
+
+ if (!utf8_revised_text.empty())
+ {
+ // Chat with animation
+ sendChatFromViewer(utf8_revised_text, type, TRUE);
+ }
+ }
+
+ mInputEditor->setText(LLStringExplicit(""));
+ }
+
+ gAgent.stopTyping();
+
+ // If the user wants to stop chatting on hitting return, lose focus
+ // and go out of chat mode.
+ if (gSavedSettings.getBOOL("CloseChatOnReturn"))
+ {
+ stopChat();
+ }
+}
+
+void LLFloaterIMNearbyChat::addMessage(const LLChat& chat,bool archive,const LLSD &args)
+{
+ appendMessage(chat, args);
+
+ if(archive)
+ {
+ mMessageArchive.push_back(chat);
+ if(mMessageArchive.size() > 200)
+ {
+ mMessageArchive.erase(mMessageArchive.begin());
+ }
+ }
+
+ // logging
+ if (!args["do_not_log"].asBoolean() && gSavedPerAccountSettings.getS32("KeepConversationLogTranscripts") > 1)
+ {
+ std::string from_name = chat.mFromName;
+
+ if (chat.mSourceType == CHAT_SOURCE_AGENT)
+ {
+ // if the chat is coming from an agent, log the complete name
+ LLAvatarName av_name;
+ LLAvatarNameCache::get(chat.mFromID, &av_name);
+
+ if (!av_name.isDisplayNameDefault())
+ {
+ from_name = av_name.getCompleteName();
+ }
+ }
+
+ LLLogChat::saveHistory("chat", from_name, chat.mFromID, chat.mText);
+ }
+}
+
+
+void LLFloaterIMNearbyChat::onChatBoxCommit()
+{
+ if (mInputEditor->getText().length() > 0)
+ {
+ sendChat(CHAT_TYPE_NORMAL);
+ }
+
+ gAgent.stopTyping();
+}
+
+void LLFloaterIMNearbyChat::displaySpeakingIndicator()
+{
+ LLSpeakerMgr::speaker_list_t speaker_list;
+ LLUUID id;
+
+ id.setNull();
+ mSpeakerMgr->update(FALSE);
+ mSpeakerMgr->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)
+ {
+ id = s->mID;
+ break;
+ }
+ }
+}
+
+void LLFloaterIMNearbyChat::sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate)
+{
+ sendChatFromViewer(utf8str_to_wstring(utf8text), type, animate);
+}
+
+void LLFloaterIMNearbyChat::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate)
+{
+ // Look for "/20 foo" channel chats.
+ S32 channel = 0;
+ LLWString out_text = stripChannelNumber(wtext, &channel);
+ std::string utf8_out_text = wstring_to_utf8str(out_text);
+ std::string utf8_text = wstring_to_utf8str(wtext);
+
+ utf8_text = utf8str_trim(utf8_text);
+ if (!utf8_text.empty())
+ {
+ utf8_text = utf8str_truncate(utf8_text, MAX_STRING - 1);
+ }
+
+ // Don't animate for chats people can't hear (chat to scripts)
+ if (animate && (channel == 0))
+ {
+ if (type == CHAT_TYPE_WHISPER)
+ {
+ lldebugs << "You whisper " << utf8_text << llendl;
+ gAgent.sendAnimationRequest(ANIM_AGENT_WHISPER, ANIM_REQUEST_START);
+ }
+ else if (type == CHAT_TYPE_NORMAL)
+ {
+ lldebugs << "You say " << utf8_text << llendl;
+ gAgent.sendAnimationRequest(ANIM_AGENT_TALK, ANIM_REQUEST_START);
+ }
+ else if (type == CHAT_TYPE_SHOUT)
+ {
+ lldebugs << "You shout " << utf8_text << llendl;
+ gAgent.sendAnimationRequest(ANIM_AGENT_SHOUT, ANIM_REQUEST_START);
+ }
+ else
+ {
+ llinfos << "send_chat_from_viewer() - invalid volume" << llendl;
+ return;
+ }
+ }
+ else
+ {
+ if (type != CHAT_TYPE_START && type != CHAT_TYPE_STOP)
+ {
+ lldebugs << "Channel chat: " << utf8_text << llendl;
+ }
+ }
+
+ send_chat_from_viewer(utf8_out_text, type, channel);
+}
+
+// static
+bool LLFloaterIMNearbyChat::isWordsName(const std::string& name)
+{
+ // checking to see if it's display name plus username in parentheses
+ S32 open_paren = name.find(" (", 0);
+ S32 close_paren = name.find(')', 0);
+
+ if (open_paren != std::string::npos &&
+ close_paren == name.length()-1)
+ {
+ return true;
+ }
+ else
+ {
+ //checking for a single space
+ S32 pos = name.find(' ', 0);
+ return std::string::npos != pos && name.rfind(' ', name.length()) == pos && 0 != pos && name.length()-1 != pos;
+ }
+}
+
+// static
+void LLFloaterIMNearbyChat::startChat(const char* line)
+{
+ LLFloaterIMNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat");
+ if (nearby_chat)
+ {
+ if(!nearby_chat->isTornOff())
+ {
+ nearby_chat->show();
+ }
+ if(nearby_chat->isMinimized())
+ {
+ nearby_chat->setMinimized(false);
+ }
+ nearby_chat->setVisible(TRUE);
+ nearby_chat->setFocus(TRUE);
+ nearby_chat->mInputEditor->setFocus(TRUE);
+
+ if (line)
+ {
+ std::string line_string(line);
+ nearby_chat->mInputEditor->setText(line_string);
+ }
+
+ nearby_chat->mInputEditor->endOfDoc();
+ }
+}
+
+// Exit "chat mode" and do the appropriate focus changes
+// static
+void LLFloaterIMNearbyChat::stopChat()
+{
+ LLFloaterIMNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat");
+ if (nearby_chat)
+ {
+ nearby_chat->mInputEditor->setFocus(FALSE);
+ gAgent.stopTyping();
+ }
+}
+
+// If input of the form "/20foo" or "/20 foo", returns "foo" and channel 20.
+// Otherwise returns input and channel 0.
+LLWString LLFloaterIMNearbyChat::stripChannelNumber(const LLWString &mesg, S32* channel)
+{
+ if (mesg[0] == '/'
+ && mesg[1] == '/')
+ {
+ // This is a "repeat channel send"
+ *channel = sLastSpecialChatChannel;
+ return mesg.substr(2, mesg.length() - 2);
+ }
+ else if (mesg[0] == '/'
+ && mesg[1]
+ && LLStringOps::isDigit(mesg[1]))
+ {
+ // This a special "/20" speak on a channel
+ S32 pos = 0;
+
+ // Copy the channel number into a string
+ LLWString channel_string;
+ llwchar c;
+ do
+ {
+ c = mesg[pos+1];
+ channel_string.push_back(c);
+ pos++;
+ }
+ while(c && pos < 64 && LLStringOps::isDigit(c));
+
+ // Move the pointer forward to the first non-whitespace char
+ // Check isspace before looping, so we can handle "/33foo"
+ // as well as "/33 foo"
+ while(c && iswspace(c))
+ {
+ c = mesg[pos+1];
+ pos++;
+ }
+
+ sLastSpecialChatChannel = strtol(wstring_to_utf8str(channel_string).c_str(), NULL, 10);
+ *channel = sLastSpecialChatChannel;
+ return mesg.substr(pos, mesg.length() - pos);
+ }
+ else
+ {
+ // This is normal chat.
+ *channel = 0;
+ return mesg;
+ }
+}
+
+void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel)
+{
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_ChatFromViewer);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ChatData);
+ msg->addStringFast(_PREHASH_Message, utf8_out_text);
+ msg->addU8Fast(_PREHASH_Type, type);
+ msg->addS32("Channel", channel);
+
+ gAgent.sendReliableMessage();
+
+ LLViewerStats::getInstance()->incStat(LLViewerStats::ST_CHAT_COUNT);
+}
+
+class LLChatCommandHandler : public LLCommandHandler
+{
+public:
+ // not allowed from outside the app
+ LLChatCommandHandler() : LLCommandHandler("chat", UNTRUSTED_BLOCK) { }
+
+ // Your code here
+ bool handle(const LLSD& tokens, const LLSD& query_map,
+ LLMediaCtrl* web)
+ {
+ bool retval = false;
+ // Need at least 2 tokens to have a valid message.
+ if (tokens.size() < 2)
+ {
+ retval = false;
+ }
+ else
+ {
+ S32 channel = tokens[0].asInteger();
+ // VWR-19499 Restrict function to chat channels greater than 0.
+ if ((channel > 0) && (channel < CHAT_CHANNEL_DEBUG))
+ {
+ retval = true;
+ // Send unescaped message, see EXT-6353.
+ std::string unescaped_mesg (LLURI::unescape(tokens[1].asString()));
+ send_chat_from_viewer(unescaped_mesg, CHAT_TYPE_NORMAL, channel);
+ }
+ else
+ {
+ retval = false;
+ // Tell us this is an unsupported SLurl.
+ }
+ }
+ return retval;
+ }
+};
+
+// Creating the object registers with the dispatcher.
+LLChatCommandHandler gChatHandler;
diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llfloaterimnearbychat.h
index 662496d338..05b48cccb0 100644
--- a/indra/newview/llnearbychatbar.h
+++ b/indra/newview/llfloaterimnearbychat.h
@@ -1,6 +1,6 @@
/**
- * @file llnearbychatbar.h
- * @brief LLNearbyChatBar class definition
+ * @file llfloaterimnearbychat.h
+ * @brief LLFloaterIMNearbyChat class definition
*
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -24,38 +24,54 @@
* $/LicenseInfo$
*/
-#ifndef LL_LLNEARBYCHATBAR_H
-#define LL_LLNEARBYCHATBAR_H
+#ifndef LL_LLFLOATERIMNEARBYCHAT_H
+#define LL_LLFLOATERIMNEARBYCHAT_H
-#include "llfloater.h"
+#include "llfloaterimsessiontab.h"
#include "llcombobox.h"
#include "llgesturemgr.h"
#include "llchat.h"
#include "llvoiceclient.h"
#include "lloutputmonitorctrl.h"
#include "llspeakers.h"
+#include "llscrollbar.h"
+#include "llviewerchat.h"
+#include "llpanel.h"
-class LLNearbyChatBarListener;
+class LLResizeBar;
-class LLNearbyChatBar : public LLFloater
+class LLFloaterIMNearbyChat
+ : public LLFloaterIMSessionTab
{
- LOG_CLASS(LLNearbyChatBar);
-
public:
// constructor for inline chat-bars (e.g. hosted in chat history window)
- LLNearbyChatBar(const LLSD& key);
- ~LLNearbyChatBar() {}
+ LLFloaterIMNearbyChat(const LLSD& key = LLSD(LLUUID()));
+ ~LLFloaterIMNearbyChat() {}
+
+ static LLFloaterIMNearbyChat* buildFloater(const LLSD& key);
- virtual BOOL postBuild();
+ /*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
+ /*virtual*/ void setVisible(BOOL visible);
+ /*virtual*/ void setVisibleAndFrontmost(BOOL take_focus=TRUE, const LLSD& key = LLSD());
+ /*virtual*/ void closeHostedFloater();
- static LLNearbyChatBar* getInstance();
+ void loadHistory();
+ void reloadMessages(bool clean_messages = false);
+ void removeScreenChat();
- LLLineEditor* getChatBox() { return mChatBox; }
+ void show();
+ bool isChatVisible() const;
- virtual void draw();
+ /** @param archive true - to save a message to the chat history log */
+ void addMessage (const LLChat& message,bool archive = true, const LLSD &args = LLSD());
+
+ LLChatEntry* getChatBox() { return mInputEditor; }
std::string getCurrentChat();
+ S32 getMessageArchiveLength() {return mMessageArchive.size();}
+
virtual BOOL handleKeyHere( KEY key, MASK mask );
static void startChat(const char* line);
@@ -64,24 +80,22 @@ public:
static void sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate);
static void sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate);
+ static bool isWordsName(const std::string& name);
+
void showHistory();
- void showTranslationCheckbox(BOOL show);
- /*virtual*/void setMinimized(BOOL b);
protected:
static BOOL matchChatTypeTrigger(const std::string& in_str, std::string* out_str);
- static void onChatBoxKeystroke(LLLineEditor* caller, void* userdata);
- static void onChatBoxFocusLost(LLFocusableElement* caller, void* userdata);
+ void onChatBoxKeystroke();
+ void onChatBoxFocusLost();
void onChatBoxFocusReceived();
void sendChat( EChatType type );
void onChatBoxCommit();
void onChatFontChange(LLFontGL* fontp);
- /* virtual */ bool applyRectControl();
-
- void showNearbyChatPanel(bool show);
- void onToggleNearbyChatPanel();
+ /*virtual*/ void onTearOffClicked();
+ /*virtual*/ void onClickCloseBtn();
static LLWString stripChannelNumber(const LLWString &mesg, S32* channel);
EChatType processChatTypeTriggers(EChatType type, std::string &str);
@@ -91,14 +105,15 @@ protected:
// Which non-zero channel did we last chat on?
static S32 sLastSpecialChatChannel;
- LLLineEditor* mChatBox;
- LLView* mNearbyChat;
LLOutputMonitorCtrl* mOutputMonitor;
LLLocalSpeakerMgr* mSpeakerMgr;
S32 mExpandedHeight;
- boost::shared_ptr<LLNearbyChatBarListener> mListener;
+private:
+ /*virtual*/ void refresh();
+
+ std::vector<LLChat> mMessageArchive;
};
-#endif
+#endif // LL_LLFLOATERIMNEARBYCHAT_H
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llfloaterimnearbychathandler.cpp
index 600fd395fb..7afcf288ce 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llfloaterimnearbychathandler.cpp
@@ -1,6 +1,6 @@
/**
- * @file LLNearbyChatHandler.cpp
- * @brief Nearby chat notification managment
+ * @file LLFloaterIMNearbyChatHandler.cpp
+ * @brief Nearby chat chat managment
*
* $LicenseInfo:firstyear=2009&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -27,43 +27,46 @@
#include "llviewerprecompiledheaders.h"
#include "llagentdata.h" // for gAgentID
-#include "llnearbychathandler.h"
+#include "llfloaterimnearbychathandler.h"
#include "llchatitemscontainerctrl.h"
#include "llfirstuse.h"
#include "llfloaterscriptdebug.h"
#include "llhints.h"
-#include "llnearbychat.h"
+#include "llfloaterimnearbychat.h"
#include "llrecentpeople.h"
#include "llviewercontrol.h"
#include "llfloaterreg.h"//for LLFloaterReg::getTypedInstance
#include "llviewerwindow.h"//for screen channel position
-#include "llnearbychatbar.h"
+#include "llfloaterimnearbychat.h"
+#include "llfloaterimcontainer.h"
#include "llrootview.h"
#include "lllayoutstack.h"
-//add LLNearbyChatHandler to LLNotificationsUI namespace
+//add LLFloaterIMNearbyChatHandler to LLNotificationsUI namespace
using namespace LLNotificationsUI;
-//-----------------------------------------------------------------------------------------------
-//LLNearbyChatScreenChannel
-//-----------------------------------------------------------------------------------------------
-LLToastPanelBase* createToastPanel()
+static LLFloaterIMNearbyChatToastPanel* createToastPanel()
{
- LLNearbyChatToastPanel* item = LLNearbyChatToastPanel::createInstance();
+ LLFloaterIMNearbyChatToastPanel* item = LLFloaterIMNearbyChatToastPanel::createInstance();
return item;
}
-class LLNearbyChatScreenChannel: public LLScreenChannelBase
+
+//-----------------------------------------------------------------------------------------------
+//LLFloaterIMNearbyChatScreenChannel
+//-----------------------------------------------------------------------------------------------
+
+class LLFloaterIMNearbyChatScreenChannel: public LLScreenChannelBase
{
- LOG_CLASS(LLNearbyChatScreenChannel);
+ LOG_CLASS(LLFloaterIMNearbyChatScreenChannel);
public:
typedef std::vector<LLHandle<LLToast> > toast_vec_t;
typedef std::list<LLHandle<LLToast> > toast_list_t;
- LLNearbyChatScreenChannel(const Params& p)
+ LLFloaterIMNearbyChatScreenChannel(const Params& p)
: LLScreenChannelBase(p)
{
mStopProcessing = false;
@@ -71,20 +74,20 @@ public:
LLControlVariable* ctrl = gSavedSettings.getControl("NearbyToastLifeTime").get();
if (ctrl)
{
- ctrl->getSignal()->connect(boost::bind(&LLNearbyChatScreenChannel::updateToastsLifetime, this));
+ ctrl->getSignal()->connect(boost::bind(&LLFloaterIMNearbyChatScreenChannel::updateToastsLifetime, this));
}
ctrl = gSavedSettings.getControl("NearbyToastFadingTime").get();
if (ctrl)
{
- ctrl->getSignal()->connect(boost::bind(&LLNearbyChatScreenChannel::updateToastFadingTime, this));
+ ctrl->getSignal()->connect(boost::bind(&LLFloaterIMNearbyChatScreenChannel::updateToastFadingTime, this));
}
}
- void addNotification (LLSD& notification);
+ void addChat (LLSD& chat);
void arrangeToasts ();
- typedef boost::function<LLToastPanelBase* (void )> create_toast_panel_callback_t;
+ typedef boost::function<LLFloaterIMNearbyChatToastPanel* (void )> create_toast_panel_callback_t;
void setCreatePanelCallback(create_toast_panel_callback_t value) { m_create_toast_panel_callback_t = value;}
void onToastDestroyed (LLToast* toast, bool app_quitting);
@@ -152,17 +155,19 @@ protected:
bool mChannelRect;
};
+
+
//-----------------------------------------------------------------------------------------------
-// LLNearbyChatToast
+// LLFloaterIMNearbyChatToast
//-----------------------------------------------------------------------------------------------
// We're deriving from LLToast to be able to override onClose()
// in order to handle closing nearby chat toasts properly.
-class LLNearbyChatToast : public LLToast
+class LLFloaterIMNearbyChatToast : public LLToast
{
- LOG_CLASS(LLNearbyChatToast);
+ LOG_CLASS(LLFloaterIMNearbyChatToast);
public:
- LLNearbyChatToast(const LLToast::Params& p, LLNearbyChatScreenChannel* nc_channelp)
+ LLFloaterIMNearbyChatToast(const LLToast::Params& p, LLFloaterIMNearbyChatScreenChannel* nc_channelp)
: LLToast(p),
mNearbyChatScreenChannelp(nc_channelp)
{
@@ -171,14 +176,14 @@ public:
/*virtual*/ void onClose(bool app_quitting);
private:
- LLNearbyChatScreenChannel* mNearbyChatScreenChannelp;
+ LLFloaterIMNearbyChatScreenChannel* mNearbyChatScreenChannelp;
};
//-----------------------------------------------------------------------------------------------
-// LLNearbyChatScreenChannel
+// LLFloaterIMNearbyChatScreenChannel
//-----------------------------------------------------------------------------------------------
-void LLNearbyChatScreenChannel::deactivateToast(LLToast* toast)
+void LLFloaterIMNearbyChatScreenChannel::deactivateToast(LLToast* toast)
{
toast_vec_t::iterator pos = std::find(m_active_toasts.begin(), m_active_toasts.end(), toast->getHandle());
@@ -192,12 +197,12 @@ void LLNearbyChatScreenChannel::deactivateToast(LLToast* toast)
m_active_toasts.erase(pos);
}
-void LLNearbyChatScreenChannel::createOverflowToast(S32 bottom, F32 timer)
+void LLFloaterIMNearbyChatScreenChannel::createOverflowToast(S32 bottom, F32 timer)
{
//we don't need overflow toast in nearby chat
}
-void LLNearbyChatScreenChannel::onToastDestroyed(LLToast* toast, bool app_quitting)
+void LLFloaterIMNearbyChatScreenChannel::onToastDestroyed(LLToast* toast, bool app_quitting)
{
LL_DEBUGS("NearbyChat") << "Toast destroyed (app_quitting=" << app_quitting << ")" << llendl;
@@ -216,7 +221,7 @@ void LLNearbyChatScreenChannel::onToastDestroyed(LLToast* toast, bool app_quitti
}
}
-void LLNearbyChatScreenChannel::onToastFade(LLToast* toast)
+void LLFloaterIMNearbyChatScreenChannel::onToastFade(LLToast* toast)
{
LL_DEBUGS("NearbyChat") << "Toast fading" << llendl;
@@ -231,7 +236,7 @@ void LLNearbyChatScreenChannel::onToastFade(LLToast* toast)
arrangeToasts();
}
-void LLNearbyChatScreenChannel::updateToastsLifetime()
+void LLFloaterIMNearbyChatScreenChannel::updateToastsLifetime()
{
S32 seconds = gSavedSettings.getS32("NearbyToastLifeTime");
toast_list_t::iterator it;
@@ -242,7 +247,7 @@ void LLNearbyChatScreenChannel::updateToastsLifetime()
}
}
-void LLNearbyChatScreenChannel::updateToastFadingTime()
+void LLFloaterIMNearbyChatScreenChannel::updateToastFadingTime()
{
S32 seconds = gSavedSettings.getS32("NearbyToastFadingTime");
toast_list_t::iterator it;
@@ -253,9 +258,9 @@ void LLNearbyChatScreenChannel::updateToastFadingTime()
}
}
-bool LLNearbyChatScreenChannel::createPoolToast()
+bool LLFloaterIMNearbyChatScreenChannel::createPoolToast()
{
- LLToastPanelBase* panel= m_create_toast_panel_callback_t();
+ LLFloaterIMNearbyChatToastPanel* panel= m_create_toast_panel_callback_t();
if(!panel)
return false;
@@ -264,20 +269,20 @@ bool LLNearbyChatScreenChannel::createPoolToast()
p.lifetime_secs = gSavedSettings.getS32("NearbyToastLifeTime");
p.fading_time_secs = gSavedSettings.getS32("NearbyToastFadingTime");
- LLToast* toast = new LLNearbyChatToast(p, this);
+ LLToast* toast = new LLFloaterIMNearbyChatToast(p, this);
- toast->setOnFadeCallback(boost::bind(&LLNearbyChatScreenChannel::onToastFade, this, _1));
+ toast->setOnFadeCallback(boost::bind(&LLFloaterIMNearbyChatScreenChannel::onToastFade, this, _1));
// If the toast gets somehow prematurely destroyed, deactivate it to prevent crash (STORM-1352).
- toast->setOnToastDestroyedCallback(boost::bind(&LLNearbyChatScreenChannel::onToastDestroyed, this, _1, false));
+ toast->setOnToastDestroyedCallback(boost::bind(&LLFloaterIMNearbyChatScreenChannel::onToastDestroyed, this, _1, false));
LL_DEBUGS("NearbyChat") << "Creating and pooling toast" << llendl;
m_toast_pool.push_back(toast->getHandle());
return true;
}
-void LLNearbyChatScreenChannel::addNotification(LLSD& notification)
+void LLFloaterIMNearbyChatScreenChannel::addChat(LLSD& chat)
{
//look in pool. if there is any message
if(mStopProcessing)
@@ -289,16 +294,16 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)
if(m_active_toasts.size())
{
- LLUUID fromID = notification["from_id"].asUUID(); // agent id or object id
- std::string from = notification["from"].asString();
+ LLUUID fromID = chat["from_id"].asUUID(); // agent id or object id
+ std::string from = chat["from"].asString();
LLToast* toast = m_active_toasts[0].get();
if (toast)
{
- LLNearbyChatToastPanel* panel = dynamic_cast<LLNearbyChatToastPanel*>(toast->getPanel());
+ LLFloaterIMNearbyChatToastPanel* panel = dynamic_cast<LLFloaterIMNearbyChatToastPanel*>(toast->getPanel());
if(panel && panel->messageID() == fromID && panel->getFromName() == from && panel->canAddText())
{
- panel->addMessage(notification);
+ panel->addMessage(chat);
toast->reshapeToPanel();
toast->startTimer();
@@ -316,11 +321,11 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)
LL_DEBUGS("NearbyChat") << "Empty pool" << llendl;
if(!createPoolToast())//created toast will go to pool. so next call will find it
return;
- addNotification(notification);
+ addChat(chat);
return;
}
- int chat_type = notification["chat_type"].asInteger();
+ int chat_type = chat["chat_type"].asInteger();
if( ((EChatType)chat_type == CHAT_TYPE_DEBUG_MSG))
{
@@ -339,10 +344,10 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)
m_toast_pool.pop_back();
- LLToastPanelBase* panel = dynamic_cast<LLToastPanelBase*>(toast->getPanel());
+ LLFloaterIMNearbyChatToastPanel* panel = dynamic_cast<LLFloaterIMNearbyChatToastPanel*>(toast->getPanel());
if(!panel)
return;
- panel->init(notification);
+ panel->init(chat);
toast->reshapeToPanel();
toast->startTimer();
@@ -361,7 +366,7 @@ static bool sort_toasts_predicate(LLHandle<LLToast> first, LLHandle<LLToast> sec
return v1 > v2;
}
-void LLNearbyChatScreenChannel::arrangeToasts()
+void LLFloaterIMNearbyChatScreenChannel::arrangeToasts()
{
if(mStopProcessing || isHovering())
return;
@@ -441,20 +446,18 @@ void LLNearbyChatScreenChannel::arrangeToasts()
//-----------------------------------------------------------------------------------------------
-//LLNearbyChatHandler
+//LLFloaterIMNearbyChatHandler
//-----------------------------------------------------------------------------------------------
-boost::scoped_ptr<LLEventPump> LLNearbyChatHandler::sChatWatcher(new LLEventStream("LLChat"));
+boost::scoped_ptr<LLEventPump> LLFloaterIMNearbyChatHandler::sChatWatcher(new LLEventStream("LLChat"));
-LLNearbyChatHandler::LLNearbyChatHandler(e_notification_type type, const LLSD& id)
+LLFloaterIMNearbyChatHandler::LLFloaterIMNearbyChatHandler()
{
- mType = type;
-
// Getting a Channel for our notifications
- LLNearbyChatScreenChannel::Params p;
+ LLFloaterIMNearbyChatScreenChannel::Params p;
p.id = LLUUID(gSavedSettings.getString("NearByChatChannelUUID"));
- LLNearbyChatScreenChannel* channel = new LLNearbyChatScreenChannel(p);
+ LLFloaterIMNearbyChatScreenChannel* channel = new LLFloaterIMNearbyChatScreenChannel(p);
- LLNearbyChatScreenChannel::create_toast_panel_callback_t callback = createToastPanel;
+ LLFloaterIMNearbyChatScreenChannel::create_toast_panel_callback_t callback = createToastPanel;
channel->setCreatePanelCallback(callback);
@@ -463,12 +466,12 @@ LLNearbyChatHandler::LLNearbyChatHandler(e_notification_type type, const LLSD& i
mChannel = channel->getHandle();
}
-LLNearbyChatHandler::~LLNearbyChatHandler()
+LLFloaterIMNearbyChatHandler::~LLFloaterIMNearbyChatHandler()
{
}
-void LLNearbyChatHandler::initChannel()
+void LLFloaterIMNearbyChatHandler::initChannel()
{
//LLRect snap_rect = gFloaterView->getSnapRect();
//mChannel->init(snap_rect.mLeft, snap_rect.mLeft + 200);
@@ -476,7 +479,7 @@ void LLNearbyChatHandler::initChannel()
-void LLNearbyChatHandler::processChat(const LLChat& chat_msg,
+void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg,
const LLSD &args)
{
if(chat_msg.mMuted == TRUE)
@@ -485,28 +488,27 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg,
if(chat_msg.mText.empty())
return;//don't process empty messages
- LLFloater* chat_bar = LLFloaterReg::getInstance("chat_bar");
-
- LLNearbyChat* nearby_chat = chat_bar->findChild<LLNearbyChat>("nearby_chat");
+ LLFloaterReg::getInstance("im_container");
+ LLFloaterIMNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat");
// Build notification data
- 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;
- notification["chat_type"] = (S32)chat_msg.mChatType;
- notification["chat_style"] = (S32)chat_msg.mChatStyle;
+ LLSD chat;
+ chat["message"] = chat_msg.mText;
+ chat["from"] = chat_msg.mFromName;
+ chat["from_id"] = chat_msg.mFromID;
+ chat["time"] = chat_msg.mTime;
+ chat["source"] = (S32)chat_msg.mSourceType;
+ chat["chat_type"] = (S32)chat_msg.mChatType;
+ chat["chat_style"] = (S32)chat_msg.mChatStyle;
// Pass sender info so that it can be rendered properly (STORM-1021).
- notification["sender_slurl"] = LLViewerChat::getSenderSLURL(chat_msg, args);
+ chat["sender_slurl"] = LLViewerChat::getSenderSLURL(chat_msg, args);
if (chat_msg.mChatType == CHAT_TYPE_DIRECT &&
chat_msg.mText.length() > 0 &&
chat_msg.mText[0] == '@')
{
// Send event on to LLEventStream and exit
- sChatWatcher->post(notification);
+ sChatWatcher->post(chat);
return;
}
@@ -553,15 +555,18 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg,
}
// Send event on to LLEventStream
- sChatWatcher->post(notification);
+ sChatWatcher->post(chat);
+ LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container");
- if( !chat_bar->isMinimized()
- && nearby_chat->isInVisibleChain()
+ if(( nearby_chat->hasFocus()
+ || im_box->hasFocus()
|| ( chat_msg.mSourceType == CHAT_SOURCE_AGENT
&& gSavedSettings.getBOOL("UseChatBubbles") )
|| mChannel.isDead()
- || !mChannel.get()->getShowToasts() ) // to prevent toasts in Busy mode
+ || !mChannel.get()->getShowToasts() )
+ && nearby_chat->isMessagePaneExpanded())
+ // to prevent toasts in Do Not Disturb mode
return;//no need in toast if chat is visible or if bubble chat is enabled
// arrange a channel on a screen
@@ -582,7 +587,7 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg,
}
*/
- LLNearbyChatScreenChannel* channel = dynamic_cast<LLNearbyChatScreenChannel*>(mChannel.get());
+ LLFloaterIMNearbyChatScreenChannel* channel = dynamic_cast<LLFloaterIMNearbyChatScreenChannel*>(mChannel.get());
if(channel)
{
@@ -601,33 +606,43 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg,
toast_msg = chat_msg.mText;
}
- // Add a nearby chat toast.
- LLUUID id;
- id.generate();
- notification["id"] = id;
- 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() ;
- notification["message"] = toast_msg;
- channel->addNotification(notification);
- }
-}
+ //Don't show nearby toast, if conversation is visible but not focused
+ LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(LLUUID());
+ if (session_floater && session_floater->isMessagePaneExpanded()
+ && session_floater->isInVisibleChain() && !session_floater->isMinimized()
+ && !(session_floater->getHost() && session_floater->getHost()->isMinimized()))
+ {
+ return;
+ }
-void LLNearbyChatHandler::onDeleteToast(LLToast* toast)
-{
+ //Will show toast when chat preference is set
+ if((gSavedSettings.getString("NotificationNearbyChatOptions") == "toast") || !session_floater->isMessagePaneExpanded())
+ {
+ // Add a nearby chat toast.
+ LLUUID id;
+ id.generate();
+ chat["id"] = id;
+ std::string r_color_name = "White";
+ F32 r_color_alpha = 1.0f;
+ LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha);
+
+ chat["text_color"] = r_color_name;
+ chat["color_alpha"] = r_color_alpha;
+ chat["font_size"] = (S32)LLViewerChat::getChatFontSize() ;
+ chat["message"] = toast_msg;
+ channel->addChat(chat);
+ }
+
+ }
}
//-----------------------------------------------------------------------------------------------
-// LLNearbyChatToast
+// LLFloaterIMNearbyChatToast
//-----------------------------------------------------------------------------------------------
// virtual
-void LLNearbyChatToast::onClose(bool app_quitting)
+void LLFloaterIMNearbyChatToast::onClose(bool app_quitting)
{
mNearbyChatScreenChannelp->onToastDestroyed(this, app_quitting);
}
diff --git a/indra/newview/llnearbychathandler.h b/indra/newview/llfloaterimnearbychathandler.h
index b0e4f62d51..5e6f8cde30 100644
--- a/indra/newview/llnearbychathandler.h
+++ b/indra/newview/llfloaterimnearbychathandler.h
@@ -1,5 +1,5 @@
/**
- * @file llnearbychathandler.h
+ * @file llfloaterimnearbychathandler.h
* @brief nearby chat notify
*
* $LicenseInfo:firstyear=2004&license=viewerlgpl$
@@ -24,27 +24,26 @@
* $/LicenseInfo$
*/
-#ifndef LL_LLNEARBYCHATHANDLER_H
-#define LL_LLNEARBYCHATHANDLER_H
+#ifndef LL_LLFLOATERIMNEARBYCHATHANDLER_H
+#define LL_LLFLOATERIMNEARBYCHATHANDLER_H
#include "llnotificationhandler.h"
class LLEventPump;
-//add LLNearbyChatHandler to LLNotificationsUI namespace
+//add LLFloaterIMNearbyChatHandler to LLNotificationsUI namespace
namespace LLNotificationsUI{
-class LLNearbyChatHandler : public LLChatHandler
+class LLFloaterIMNearbyChatHandler : public LLChatHandler
{
public:
- LLNearbyChatHandler(e_notification_type type,const LLSD& id);
- virtual ~LLNearbyChatHandler();
+ LLFloaterIMNearbyChatHandler();
+ virtual ~LLFloaterIMNearbyChatHandler();
virtual void processChat(const LLChat& chat_msg, const LLSD &args);
protected:
- virtual void onDeleteToast(LLToast* toast);
virtual void initChannel();
static boost::scoped_ptr<LLEventPump> sChatWatcher;
@@ -52,4 +51,4 @@ protected:
}
-#endif /* LL_LLNEARBYCHATHANDLER_H */
+#endif /* LL_LLFLOATERIMNEARBYCHATHANDLER_H */
diff --git a/indra/newview/llnearbychatbarlistener.cpp b/indra/newview/llfloaterimnearbychatlistener.cpp
index a63e1fb76e..14a22bcd84 100644
--- a/indra/newview/llnearbychatbarlistener.cpp
+++ b/indra/newview/llfloaterimnearbychatlistener.cpp
@@ -1,8 +1,8 @@
/**
- * @file llnearbychatbarlistener.cpp
+ * @file llfloaterimnearbychatlistener.cpp
* @author Dave Simmons
* @date 2011-03-15
- * @brief Implementation for LLNearbyChatBarListener.
+ * @brief Implementation for LLFloaterIMNearbyChatListener.
*
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -28,15 +28,15 @@
#include "llviewerprecompiledheaders.h"
-#include "llnearbychatbarlistener.h"
-#include "llnearbychatbar.h"
+#include "llfloaterimnearbychatlistener.h"
+#include "llfloaterimnearbychat.h"
#include "llagent.h"
#include "llchat.h"
-LLNearbyChatBarListener::LLNearbyChatBarListener(LLNearbyChatBar & chatbar)
+LLFloaterIMNearbyChatListener::LLFloaterIMNearbyChatListener(LLFloaterIMNearbyChat & chatbar)
: LLEventAPI("LLChatBar",
"LLChatBar listener to (e.g.) sendChat, etc."),
mChatbar(chatbar)
@@ -46,12 +46,12 @@ LLNearbyChatBarListener::LLNearbyChatBarListener(LLNearbyChatBar & chatbar)
"[\"message\"] chat message text [required]\n"
"[\"channel\"] chat channel number [default = 0]\n"
"[\"type\"] chat type \"whisper\", \"normal\", \"shout\" [default = \"normal\"]",
- &LLNearbyChatBarListener::sendChat);
+ &LLFloaterIMNearbyChatListener::sendChat);
}
// "sendChat" command
-void LLNearbyChatBarListener::sendChat(LLSD const & chat_data) const
+void LLFloaterIMNearbyChatListener::sendChat(LLSD const & chat_data) const
{
// Extract the data
std::string chat_text = chat_data["message"].asString();
diff --git a/indra/newview/llnearbychatbarlistener.h b/indra/newview/llfloaterimnearbychatlistener.h
index 9af9bc1f7b..1470a6dc1e 100644
--- a/indra/newview/llnearbychatbarlistener.h
+++ b/indra/newview/llfloaterimnearbychatlistener.h
@@ -1,8 +1,8 @@
/**
- * @file llnearbychatbarlistener.h
+ * @file llfloaterimnearbychatlistener.h
* @author Dave Simmons
* @date 2011-03-15
- * @brief Class definition for LLNearbyChatBarListener.
+ * @brief Class definition for LLFloaterIMNearbyChatListener.
*
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -27,24 +27,24 @@
*/
-#ifndef LL_LLNEARBYCHATBARLISTENER_H
-#define LL_LLNEARBYCHATBARLISTENER_H
+#ifndef LL_LLFLOATERIMNEARBYCHATLISTENER_H
+#define LL_LLFLOATERIMNEARBYCHATLISTENER_H
#include "lleventapi.h"
class LLSD;
-class LLNearbyChatBar;
+class LLFloaterIMNearbyChat;
-class LLNearbyChatBarListener : public LLEventAPI
+class LLFloaterIMNearbyChatListener : public LLEventAPI
{
public:
- LLNearbyChatBarListener(LLNearbyChatBar & chatbar);
+ LLFloaterIMNearbyChatListener(LLFloaterIMNearbyChat & chatbar);
private:
void sendChat(LLSD const & chat_data) const;
- LLNearbyChatBar & mChatbar;
+ LLFloaterIMNearbyChat & mChatbar;
};
-#endif // LL_LLNEARBYCHATBARLISTENER_H
+#endif // LL_LLFLOATERIMNEARBYCHATLISTENER_H
diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp
new file mode 100644
index 0000000000..73adfd0eda
--- /dev/null
+++ b/indra/newview/llfloaterimsession.cpp
@@ -0,0 +1,1274 @@
+/**
+ * @file llfloaterimsession.cpp
+ * @brief LLFloaterIMSession class definition
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterimsession.h"
+
+#include "lldraghandle.h"
+#include "llnotificationsutil.h"
+
+#include "llagent.h"
+#include "llappviewer.h"
+#include "llavataractions.h"
+#include "llavatarnamecache.h"
+#include "llbutton.h"
+#include "llchannelmanager.h"
+#include "llchiclet.h"
+#include "llchicletbar.h"
+#include "llfloaterreg.h"
+#include "llfloateravatarpicker.h"
+#include "llfloaterimcontainer.h" // to replace separate IM Floaters with multifloater container
+#include "llinventoryfunctions.h"
+//#include "lllayoutstack.h"
+#include "llchatentry.h"
+#include "lllogchat.h"
+#include "llscreenchannel.h"
+#include "llsyswellwindow.h"
+#include "lltrans.h"
+#include "llchathistory.h"
+#include "llnotifications.h"
+#include "llviewerwindow.h"
+#include "lltransientfloatermgr.h"
+#include "llinventorymodel.h"
+#include "llrootview.h"
+#include "llspeakers.h"
+#include "llviewerchat.h"
+#include "llnotificationmanager.h"
+#include "llautoreplace.h"
+
+floater_showed_signal_t LLFloaterIMSession::sIMFloaterShowedSignal;
+
+LLFloaterIMSession::LLFloaterIMSession(const LLUUID& session_id)
+ : LLFloaterIMSessionTab(session_id),
+ mLastMessageIndex(-1),
+ mDialog(IM_NOTHING_SPECIAL),
+ mTypingStart(),
+ mShouldSendTypingState(false),
+ mMeTyping(false),
+ mOtherTyping(false),
+ mSessionNameUpdatedForTyping(false),
+ mTypingTimer(),
+ mTypingTimeoutTimer(),
+ mPositioned(false),
+ mSessionInitialized(false)
+{
+ mIsNearbyChat = false;
+
+ initIMSession(session_id);
+
+ setOverlapsScreenChannel(true);
+
+ LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, this);
+ mEnableCallbackRegistrar.add("Avatar.EnableGearItem", boost::bind(&LLFloaterIMSession::enableGearMenuItem, this, _2));
+ mCommitCallbackRegistrar.add("Avatar.GearDoToSelected", boost::bind(&LLFloaterIMSession::GearDoToSelected, this, _2));
+ mEnableCallbackRegistrar.add("Avatar.CheckGearItem", boost::bind(&LLFloaterIMSession::checkGearMenuItem, this, _2));
+
+ setDocked(true);
+}
+
+
+// virtual
+void LLFloaterIMSession::refresh()
+{
+ if (mMeTyping)
+{
+ // Time out if user hasn't typed for a while.
+ if (mTypingTimeoutTimer.getElapsedTimeF32() > LLAgent::TYPING_TIMEOUT_SECS)
+ {
+ setTyping(false);
+ }
+ }
+}
+
+// virtual
+void LLFloaterIMSession::onTearOffClicked()
+{
+ LLFloaterIMSessionTab::onTearOffClicked();
+
+ if(mIsP2PChat)
+ {
+ if(isTornOff())
+ {
+ mSpeakingIndicator->setSpeakerId(mOtherParticipantUUID, mSessionID);
+ }
+ else
+ {
+ mSpeakingIndicator->setSpeakerId(LLUUID::null);
+ }
+ }
+}
+
+// virtual
+void LLFloaterIMSession::onClickCloseBtn()
+{
+ LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(mSessionID);
+
+ if (session != NULL)
+ {
+ bool is_call_with_chat = session->isGroupSessionType()
+ || session->isAdHocSessionType() || session->isP2PSessionType();
+
+ LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
+
+ if (is_call_with_chat && voice_channel != NULL
+ && voice_channel->isActive())
+ {
+ LLSD payload;
+ payload["session_id"] = mSessionID;
+ LLNotificationsUtil::add("ConfirmLeaveCall", LLSD(), payload, confirmLeaveCallCallback);
+ return;
+ }
+ }
+ else
+ {
+ llwarns << "Empty session with id: " << (mSessionID.asString()) << llendl;
+ return;
+ }
+
+ LLFloaterIMSessionTab::onClickCloseBtn();
+}
+
+/* static */
+void LLFloaterIMSession::newIMCallback(const LLSD& data)
+{
+ if (data["num_unread"].asInteger() > 0 || data["from_id"].asUUID().isNull())
+ {
+ LLUUID session_id = data["session_id"].asUUID();
+
+ LLFloaterIMSession* floater = LLFloaterReg::findTypedInstance<LLFloaterIMSession>("impanel", session_id);
+
+ // update if visible, otherwise will be updated when opened
+ if (floater && floater->isInVisibleChain())
+ {
+ floater->updateMessages();
+ }
+ }
+}
+
+void LLFloaterIMSession::onVisibilityChange(const LLSD& new_visibility)
+{
+ bool visible = new_visibility.asBoolean();
+
+ LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
+
+ if (visible && voice_channel &&
+ voice_channel->getState() == LLVoiceChannel::STATE_CONNECTED)
+ {
+ LLFloaterReg::showInstance("voice_call", mSessionID);
+ }
+ else
+ {
+ LLFloaterReg::hideInstance("voice_call", mSessionID);
+ }
+}
+
+void LLFloaterIMSession::onSendMsg( LLUICtrl* ctrl, void* userdata )
+{
+ LLFloaterIMSession* self = (LLFloaterIMSession*) userdata;
+ self->sendMsgFromInputEditor();
+ self->setTyping(false);
+}
+
+bool LLFloaterIMSession::enableGearMenuItem(const LLSD& userdata)
+{
+ std::string command = userdata.asString();
+ uuid_vec_t selected_uuids;
+ selected_uuids.push_back(mOtherParticipantUUID);
+
+ LLFloaterIMContainer* floater_container = LLFloaterIMContainer::getInstance();
+ return floater_container->enableContextMenuItem(command, selected_uuids);
+}
+
+void LLFloaterIMSession::GearDoToSelected(const LLSD& userdata)
+{
+ std::string command = userdata.asString();
+ uuid_vec_t selected_uuids;
+ selected_uuids.push_back(mOtherParticipantUUID);
+
+ LLFloaterIMContainer* floater_container = LLFloaterIMContainer::getInstance();
+ floater_container->doToParticipants(command, selected_uuids);
+}
+
+bool LLFloaterIMSession::checkGearMenuItem(const LLSD& userdata)
+{
+ std::string command = userdata.asString();
+ uuid_vec_t selected_uuids;
+ selected_uuids.push_back(mOtherParticipantUUID);
+
+ LLFloaterIMContainer* floater_container = LLFloaterIMContainer::getInstance();
+ return floater_container->checkContextMenuItem(command, selected_uuids);
+}
+
+void LLFloaterIMSession::sendMsgFromInputEditor()
+{
+ if (gAgent.isGodlike()
+ || (mDialog != IM_NOTHING_SPECIAL)
+ || !mOtherParticipantUUID.isNull())
+ {
+ if (mInputEditor)
+ {
+ LLWString text = mInputEditor->getWText();
+ LLWStringUtil::trim(text);
+ LLWStringUtil::replaceChar(text,182,'\n'); // Convert paragraph symbols back into newlines.
+ if(!text.empty())
+ {
+ // Truncate and convert to UTF8 for transport
+ std::string utf8_text = wstring_to_utf8str(text);
+
+ sendMsg(utf8_text);
+
+ mInputEditor->setText(LLStringUtil::null);
+ }
+ }
+ }
+ else
+ {
+ llinfos << "Cannot send IM to everyone unless you're a god." << llendl;
+ }
+}
+
+void LLFloaterIMSession::sendMsg(const std::string& msg)
+{
+ const std::string utf8_text = utf8str_truncate(msg, MAX_MSG_BUF_SIZE - 1);
+
+ if (mSessionInitialized)
+ {
+ LLIMModel::sendMessage(utf8_text, mSessionID, mOtherParticipantUUID, mDialog);
+ }
+ else
+ {
+ //queue up the message to send once the session is initialized
+ mQueuedMsgsForInit.append(utf8_text);
+ }
+
+ updateMessages();
+}
+
+LLFloaterIMSession::~LLFloaterIMSession()
+{
+ mVoiceChannelStateChangeConnection.disconnect();
+ if(LLVoiceClient::instanceExists())
+ {
+ LLVoiceClient::getInstance()->removeObserver(this);
+ }
+
+ LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this);
+}
+
+
+void LLFloaterIMSession::initIMSession(const LLUUID& session_id)
+{
+ // Change the floater key to bind it to a new session.
+ setKey(session_id);
+
+ mSessionID = session_id;
+ mSession = LLIMModel::getInstance()->findIMSession(mSessionID);
+
+ if (mSession)
+ {
+ mIsP2PChat = mSession->isP2PSessionType();
+ mSessionInitialized = mSession->mSessionInitialized;
+ mDialog = mSession->mType;
+ }
+}
+
+void LLFloaterIMSession::initIMFloater()
+{
+ const LLUUID& other_party_id =
+ LLIMModel::getInstance()->getOtherParticipantID(mSessionID);
+ if (other_party_id.notNull())
+ {
+ mOtherParticipantUUID = other_party_id;
+ }
+
+ boundVoiceChannel();
+
+ mTypingStart = LLTrans::getString("IM_typing_start_string");
+
+ // Show control panel in torn off floaters only.
+ mParticipantListPanel->setVisible(!getHost() && gSavedSettings.getBOOL("IMShowControlPanel"));
+
+ // Disable input editor if session cannot accept text
+ if ( mSession && !mSession->mTextIMPossible )
+ {
+ mInputEditor->setEnabled(FALSE);
+ mInputEditor->setLabel(LLTrans::getString("IM_unavailable_text_label"));
+ }
+
+ if (!mIsP2PChat)
+ {
+ std::string session_name(LLIMModel::instance().getName(mSessionID));
+ updateSessionName(session_name);
+ }
+}
+
+//virtual
+BOOL LLFloaterIMSession::postBuild()
+{
+ BOOL result = LLFloaterIMSessionTab::postBuild();
+
+ mInputEditor->setMaxTextLength(1023);
+ mInputEditor->setAutoreplaceCallback(boost::bind(&LLAutoReplace::autoreplaceCallback, LLAutoReplace::getInstance(), _1, _2, _3, _4, _5));
+ mInputEditor->setFocusReceivedCallback( boost::bind(onInputEditorFocusReceived, _1, this) );
+ mInputEditor->setFocusLostCallback( boost::bind(onInputEditorFocusLost, _1, this) );
+ mInputEditor->setKeystrokeCallback( boost::bind(onInputEditorKeystroke, _1, this) );
+ mInputEditor->setCommitCallback(boost::bind(onSendMsg, _1, this));
+
+ setDocked(true);
+
+ LLButton* add_btn = getChild<LLButton>("add_btn");
+
+ // Allow to add chat participants depending on the session type
+ add_btn->setEnabled(isInviteAllowed());
+ add_btn->setClickedCallback(boost::bind(&LLFloaterIMSession::onAddButtonClicked, this));
+
+ childSetAction("voice_call_btn", boost::bind(&LLFloaterIMSession::onCallButtonClicked, this));
+
+ LLVoiceClient::getInstance()->addObserver(this);
+
+ //*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)
+
+ initIMFloater();
+
+ return result;
+}
+
+void LLFloaterIMSession::onAddButtonClicked()
+{
+ LLView * button = findChild<LLView>("toolbar_panel")->findChild<LLButton>("add_btn");
+ LLFloater* root_floater = gFloaterView->getParentFloater(this);
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLFloaterIMSession::addSessionParticipants, this, _1), TRUE, TRUE, FALSE, root_floater->getName(), button);
+ if (!picker)
+ {
+ return;
+ }
+
+ // Need to disable 'ok' button when selected users are already in conversation.
+ picker->setOkBtnEnableCb(boost::bind(&LLFloaterIMSession::canAddSelectedToChat, this, _1));
+
+ if (root_floater)
+ {
+ root_floater->addDependentFloater(picker);
+ }
+}
+
+bool LLFloaterIMSession::canAddSelectedToChat(const uuid_vec_t& uuids)
+{
+ if (!mSession
+ || mDialog == IM_SESSION_GROUP_START
+ || mDialog == IM_SESSION_INVITE && gAgent.isInGroup(mSessionID))
+ {
+ return false;
+ }
+
+ if (mIsP2PChat)
+ {
+ // For a P2P session just check if we are not adding the other participant.
+
+ for (uuid_vec_t::const_iterator id = uuids.begin();
+ id != uuids.end(); ++id)
+ {
+ if (*id == mOtherParticipantUUID)
+ {
+ return false;
+ }
+ }
+ }
+ else
+ {
+ // For a conference session we need to check against the list from LLSpeakerMgr,
+ // because this list may change when participants join or leave the session.
+
+ LLSpeakerMgr::speaker_list_t speaker_list;
+ LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+ if (speaker_mgr)
+ {
+ speaker_mgr->getSpeakerList(&speaker_list, true);
+ }
+
+ for (uuid_vec_t::const_iterator id = uuids.begin();
+ id != uuids.end(); ++id)
+ {
+ for (LLSpeakerMgr::speaker_list_t::const_iterator it = speaker_list.begin();
+ it != speaker_list.end(); ++it)
+ {
+ const LLPointer<LLSpeaker>& speaker = *it;
+ if (*id == speaker->mID)
+ {
+ return false;
+ }
+ }
+ }
+ }
+
+ return true;
+}
+
+void LLFloaterIMSession::addSessionParticipants(const uuid_vec_t& uuids)
+{
+ if (mIsP2PChat)
+ {
+ LLSD payload;
+ LLSD args;
+
+ LLNotificationsUtil::add("ConfirmAddingChatParticipants", args, payload,
+ boost::bind(&LLFloaterIMSession::addP2PSessionParticipants, this, _1, _2, uuids));
+ }
+ else
+ {
+ // remember whom we have invited, to notify others later, when the invited ones actually join
+ mInvitedParticipants.insert(mInvitedParticipants.end(), uuids.begin(), uuids.end());
+
+ inviteToSession(uuids);
+ }
+}
+
+void LLFloaterIMSession::addP2PSessionParticipants(const LLSD& notification, const LLSD& response, const uuid_vec_t& uuids)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option != 0)
+ {
+ return;
+ }
+
+ LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
+
+ // first check whether this is a voice session
+ bool is_voice_call = voice_channel != NULL && voice_channel->isActive();
+
+ uuid_vec_t temp_ids;
+
+ // Add the initial participant of a P2P session
+ temp_ids.push_back(mOtherParticipantUUID);
+ temp_ids.insert(temp_ids.end(), uuids.begin(), uuids.end());
+
+ // then we can close the current session
+ onClose(false);
+
+ // we start a new session so reset the initialization flag
+ mSessionInitialized = false;
+
+ // remember whom we have invited, to notify others later, when the invited ones actually join
+ mInvitedParticipants.insert(mInvitedParticipants.end(), uuids.begin(), uuids.end());
+
+ // Start a new ad hoc voice call if we invite new participants to a P2P call,
+ // or start a text chat otherwise.
+ if (is_voice_call)
+ {
+ LLAvatarActions::startAdhocCall(temp_ids, mSessionID);
+ }
+ else
+ {
+ LLAvatarActions::startConference(temp_ids, mSessionID);
+ }
+}
+
+void LLFloaterIMSession::sendParticipantsAddedNotification(const uuid_vec_t& uuids)
+{
+ std::string names_string;
+ LLAvatarActions::buildResidentsString(uuids, names_string);
+ LLStringUtil::format_map_t args;
+ args["[NAME]"] = names_string;
+
+ sendMsg(getString(uuids.size() > 1 ? "multiple_participants_added" : "participant_added", args));
+}
+
+void LLFloaterIMSession::boundVoiceChannel()
+{
+ LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
+ if(voice_channel)
+ {
+ mVoiceChannelStateChangeConnection = voice_channel->setStateChangedCallback(
+ boost::bind(&LLFloaterIMSession::onVoiceChannelStateChanged, this, _1, _2));
+
+ //call (either p2p, group or ad-hoc) can be already in started state
+ bool callIsActive = voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED;
+ updateCallBtnState(callIsActive);
+ }
+}
+
+void LLFloaterIMSession::onCallButtonClicked()
+{
+ LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
+ if (voice_channel)
+ {
+ bool is_call_active = voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED;
+ if (is_call_active)
+ {
+ gIMMgr->endCall(mSessionID);
+ }
+ else
+ {
+ gIMMgr->startCall(mSessionID);
+ }
+ }
+}
+
+void LLFloaterIMSession::onChange(EStatusType status, const std::string &channelURI, bool proximal)
+{
+ if(status != STATUS_JOINING && status != STATUS_LEFT_CHANNEL)
+ {
+ enableDisableCallBtn();
+ }
+}
+
+void LLFloaterIMSession::onVoiceChannelStateChanged(
+ const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
+{
+ bool callIsActive = new_state >= LLVoiceChannel::STATE_CALL_STARTED;
+ updateCallBtnState(callIsActive);
+}
+
+void LLFloaterIMSession::updateSessionName(const std::string& name)
+{
+ if (!name.empty())
+ {
+ LLFloaterIMSessionTab::updateSessionName(name);
+ mTypingStart.setArg("[NAME]", name);
+ setTitle (mOtherTyping ? mTypingStart.getString() : name);
+ mSessionNameUpdatedForTyping = mOtherTyping;
+ }
+}
+
+//static
+LLFloaterIMSession* LLFloaterIMSession::show(const LLUUID& session_id)
+{
+ closeHiddenIMToasts();
+
+ if (!gIMMgr->hasSession(session_id))
+ return NULL;
+
+ // Test the existence of the floater before we try to create it
+ bool exist = findInstance(session_id);
+
+ // Get the floater: this will create the instance if it didn't exist
+ LLFloaterIMSession* floater = getInstance(session_id);
+ if (!floater)
+ return NULL;
+
+ LLFloaterIMContainer* floater_container = LLFloaterIMContainer::getInstance();
+
+ // Do not add again existing floaters
+ if (!exist)
+ {
+ // 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);
+ }
+ }
+
+ floater->openFloater(floater->getKey());
+
+ floater->setVisible(TRUE);
+
+ return floater;
+}
+//static
+LLFloaterIMSession* LLFloaterIMSession::findInstance(const LLUUID& session_id)
+{
+ LLFloaterIMSession* conversation =
+ LLFloaterReg::findTypedInstance<LLFloaterIMSession>("impanel", session_id);
+
+ return conversation;
+}
+
+LLFloaterIMSession* LLFloaterIMSession::getInstance(const LLUUID& session_id)
+{
+ LLFloaterIMSession* conversation =
+ LLFloaterReg::getTypedInstance<LLFloaterIMSession>("impanel", session_id);
+
+ return conversation;
+}
+
+void LLFloaterIMSession::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);
+ LLFloaterIMSessionTab::restoreFloater();
+ // Clean up the conversation *after* the session has been ended
+ LLFloaterIMSessionTab::onClose(app_quitting);
+}
+
+void LLFloaterIMSession::setDocked(bool docked, bool pop_on_undock)
+{
+ // update notification channel state
+ LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*>
+ (LLNotificationsUI::LLChannelManager::getInstance()->
+ findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
+
+ if(!isChatMultiTab())
+ {
+ LLTransientDockableFloater::setDocked(docked, pop_on_undock);
+ }
+
+ // update notification channel state
+ if(channel)
+ {
+ channel->updateShowToastsState();
+ channel->redrawToasts();
+ }
+}
+
+void LLFloaterIMSession::setVisible(BOOL visible)
+{
+ LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*>
+ (LLNotificationsUI::LLChannelManager::getInstance()->
+ findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
+
+ LLFloaterIMSessionTab::setVisible(visible);
+
+ // update notification channel state
+ if(channel)
+ {
+ channel->updateShowToastsState();
+ channel->redrawToasts();
+ }
+
+ if(!visible)
+ {
+ LLChicletPanel * chiclet_panelp = LLChicletBar::getInstance()->getChicletPanel();
+ if (NULL != chiclet_panelp)
+ {
+ LLIMChiclet * chicletp = chiclet_panelp->findChiclet<LLIMChiclet>(mSessionID);
+ if(NULL != chicletp)
+ {
+ chicletp->setToggleState(false);
+ }
+ }
+ }
+
+ if (visible && isInVisibleChain())
+ {
+ sIMFloaterShowedSignal(mSessionID);
+
+ }
+
+}
+
+BOOL LLFloaterIMSession::getVisible()
+{
+ bool visible;
+
+ if(isChatMultiTab())
+ {
+ LLFloaterIMContainer* im_container =
+ LLFloaterIMContainer::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)
+ {
+ visible = LLTransientDockableFloater::getVisible();
+ }
+ else
+ {
+ // getVisible() returns TRUE when Tabbed IM window is minimized.
+ visible = is_active && !im_container->isMinimized()
+ && im_container->getVisible();
+ }
+ }
+ else
+ {
+ visible = LLTransientDockableFloater::getVisible();
+ }
+
+ return visible;
+}
+
+//static
+bool LLFloaterIMSession::toggle(const LLUUID& session_id)
+{
+ if(!isChatMultiTab())
+ {
+ LLFloaterIMSession* floater = LLFloaterReg::findTypedInstance<LLFloaterIMSession>(
+ "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;
+}
+
+void LLFloaterIMSession::sessionInitReplyReceived(const LLUUID& im_session_id)
+{
+ mSessionInitialized = true;
+
+ //will be different only for an ad-hoc im session
+ if (mSessionID != im_session_id)
+ {
+ initIMSession(im_session_id);
+ buildConversationViewParticipant();
+ }
+
+ initIMFloater();
+ LLFloaterIMSessionTab::updateGearBtn();
+ //*TODO here we should remove "starting session..." warning message if we added it in postBuild() (IB)
+
+ //need to send delayed messages collected while waiting for session initialization
+ if (mQueuedMsgsForInit.size())
+ {
+ LLSD::array_iterator iter;
+ for ( iter = mQueuedMsgsForInit.beginArray();
+ iter != mQueuedMsgsForInit.endArray(); ++iter)
+ {
+ LLIMModel::sendMessage(iter->asString(), mSessionID,
+ mOtherParticipantUUID, mDialog);
+ }
+
+ mQueuedMsgsForInit.clear();
+ }
+}
+
+void LLFloaterIMSession::updateMessages()
+{
+ std::list<LLSD> messages;
+
+ // we shouldn't reset unread message counters if IM floater doesn't have focus
+ LLIMModel::instance().getMessages(
+ mSessionID, messages, mLastMessageIndex + 1, hasFocus());
+
+ if (messages.size())
+ {
+ std::ostringstream message;
+ std::list<LLSD>::const_reverse_iterator iter = messages.rbegin();
+ std::list<LLSD>::const_reverse_iterator iter_end = messages.rend();
+ for (; iter != iter_end; ++iter)
+ {
+ LLSD msg = *iter;
+
+ std::string time = msg["time"].asString();
+ LLUUID from_id = msg["from_id"].asUUID();
+ std::string from = msg["from"].asString();
+ std::string message = msg["message"].asString();
+ bool is_history = msg["is_history"].asBoolean();
+
+ LLChat chat;
+ chat.mFromID = from_id;
+ chat.mSessionID = mSessionID;
+ chat.mFromName = from;
+ chat.mTimeStr = time;
+ chat.mChatStyle = is_history ? CHAT_STYLE_HISTORY : chat.mChatStyle;
+
+ // process offer notification
+ if (msg.has("notification_id"))
+ {
+ chat.mNotifId = msg["notification_id"].asUUID();
+ // if notification exists - embed it
+ if (LLNotificationsUtil::find(chat.mNotifId) != NULL)
+ {
+ // remove embedded notification from channel
+ LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*>
+ (LLNotificationsUI::LLChannelManager::getInstance()->
+ findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
+ if (getVisible())
+ {
+ // toast will be automatically closed since it is not storable toast
+ channel->hideToast(chat.mNotifId);
+ }
+ }
+ // if notification doesn't exist - try to use next message which should be log entry
+ else
+ {
+ continue;
+ }
+ }
+ //process text message
+ else
+ {
+ chat.mText = message;
+ }
+
+ // Add the message to the chat log
+ appendMessage(chat);
+ mLastMessageIndex = msg["index"].asInteger();
+
+ // if it is a notification - next message is a notification history log, so skip it
+ if (chat.mNotifId.notNull() && LLNotificationsUtil::find(chat.mNotifId) != NULL)
+ {
+ if (++iter == iter_end)
+ {
+ break;
+ }
+ else
+ {
+ mLastMessageIndex++;
+ }
+ }
+ }
+ }
+}
+
+void LLFloaterIMSession::reloadMessages(bool clean_messages/* = false*/)
+{
+ if (clean_messages)
+ {
+ LLIMModel::LLIMSession * sessionp = LLIMModel::instance().findIMSession(mSessionID);
+
+ if (NULL != sessionp)
+ {
+ sessionp->loadHistory();
+ }
+ }
+
+ mChatHistory->clear();
+ mLastMessageIndex = -1;
+ updateMessages();
+ mInputEditor->setFont(LLViewerChat::getChatFont());
+}
+
+// static
+void LLFloaterIMSession::onInputEditorFocusReceived( LLFocusableElement* caller, void* userdata )
+{
+ LLFloaterIMSession* self= (LLFloaterIMSession*) userdata;
+
+ // Allow enabling the LLFloaterIMSession input editor only if session can accept text
+ LLIMModel::LLIMSession* im_session =
+ LLIMModel::instance().findIMSession(self->mSessionID);
+ //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);
+ }
+}
+
+// static
+void LLFloaterIMSession::onInputEditorFocusLost(LLFocusableElement* caller, void* userdata)
+{
+ LLFloaterIMSession* self = (LLFloaterIMSession*) userdata;
+ self->setTyping(false);
+}
+
+// static
+void LLFloaterIMSession::onInputEditorKeystroke(LLTextEditor* caller, void* userdata)
+{
+ LLFloaterIMSession* self = (LLFloaterIMSession*)userdata;
+ LLFloaterIMContainer* im_box = LLFloaterIMContainer::findInstance();
+ if (im_box)
+ {
+ im_box->flashConversationItemWidget(self->mSessionID,false);
+ }
+ std::string text = self->mInputEditor->getText();
+
+ // Deleting all text counts as stopping typing.
+ self->setTyping(!text.empty());
+}
+
+void LLFloaterIMSession::setTyping(bool typing)
+{
+ if ( typing )
+ {
+ // Started or proceeded typing, reset the typing timeout timer
+ mTypingTimeoutTimer.reset();
+ }
+
+ if ( mMeTyping != typing )
+ {
+ // Typing state is changed
+ mMeTyping = typing;
+ // So, should send current state
+ mShouldSendTypingState = true;
+ // In case typing is started, send state after some delay
+ mTypingTimer.reset();
+ }
+
+ // Don't want to send typing indicators to multiple people, potentially too
+ // much network traffic. Only send in person-to-person IMs.
+ if ( mShouldSendTypingState && mDialog == IM_NOTHING_SPECIAL )
+ {
+ // Still typing, send 'start typing' notification or
+ // send 'stop typing' notification immediately
+ if (!mMeTyping || mTypingTimer.getElapsedTimeF32() > 1.f)
+ {
+ LLIMModel::instance().sendTypingState(mSessionID,
+ mOtherParticipantUUID, mMeTyping);
+ mShouldSendTypingState = false;
+ }
+ }
+
+ if (!mIsNearbyChat)
+ {
+ LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+ if (speaker_mgr)
+ {
+ speaker_mgr->setSpeakerTyping(gAgent.getID(), FALSE);
+ }
+ }
+}
+
+void LLFloaterIMSession::processIMTyping(const LLIMInfo* im_info, BOOL typing)
+{
+ if ( typing )
+ {
+ // other user started typing
+ addTypingIndicator(im_info);
+ }
+ else
+ {
+ // other user stopped typing
+ removeTypingIndicator(im_info);
+ }
+}
+
+void LLFloaterIMSession::processAgentListUpdates(const LLSD& body)
+{
+ uuid_vec_t joined_uuids;
+
+ if (body.isMap() && body.has("agent_updates") && body["agent_updates"].isMap())
+ {
+ LLSD::map_const_iterator update_it;
+ for(update_it = body["agent_updates"].beginMap();
+ update_it != body["agent_updates"].endMap();
+ ++update_it)
+ {
+ LLUUID agent_id(update_it->first);
+ LLSD agent_data = update_it->second;
+
+ if (agent_data.isMap())
+ {
+ // store the new participants in joined_uuids
+ if (agent_data.has("transition") && agent_data["transition"].asString() == "ENTER")
+ {
+ joined_uuids.push_back(agent_id);
+ }
+
+ // process the moderator mutes
+ if (agent_id == gAgentID && agent_data.has("info") && agent_data["info"].has("mutes"))
+ {
+ BOOL moderator_muted_text = agent_data["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");
+ }
+ }
+ }
+ }
+
+ // the vectors need to be sorted for computing the intersection and difference
+ std::sort(mInvitedParticipants.begin(), mInvitedParticipants.end());
+ std::sort(joined_uuids.begin(), joined_uuids.end());
+
+ uuid_vec_t intersection; // uuids of invited residents who have joined the conversation
+ std::set_intersection(mInvitedParticipants.begin(), mInvitedParticipants.end(),
+ joined_uuids.begin(), joined_uuids.end(),
+ std::back_inserter(intersection));
+
+ if (intersection.size() > 0)
+ {
+ sendParticipantsAddedNotification(intersection);
+ }
+
+ // Remove all joined participants from invited array.
+ // The difference between the two vectors (the elements in mInvitedParticipants which are not in joined_uuids)
+ // is placed at the beginning of mInvitedParticipants, then all other elements are erased.
+ mInvitedParticipants.erase(std::set_difference(mInvitedParticipants.begin(), mInvitedParticipants.end(),
+ joined_uuids.begin(), joined_uuids.end(),
+ mInvitedParticipants.begin()),
+ mInvitedParticipants.end());
+}
+
+void LLFloaterIMSession::processSessionUpdate(const LLSD& session_update)
+{
+ // *TODO : verify following code when moderated mode will be implemented
+ if ( false && session_update.has("moderated_mode") &&
+ session_update["moderated_mode"].has("voice") )
+ {
+ BOOL voice_moderated = session_update["moderated_mode"]["voice"];
+ const std::string session_label = LLIMModel::instance().getName(mSessionID);
+
+ if (voice_moderated)
+ {
+ setTitle(session_label + std::string(" ")
+ + LLTrans::getString("IM_moderated_chat_label"));
+ }
+ else
+ {
+ setTitle(session_label);
+ }
+
+ // *TODO : uncomment this when/if LLPanelActiveSpeakers panel will be added
+ //update the speakers dropdown too
+ //mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated);
+ }
+}
+
+// virtual
+void LLFloaterIMSession::draw()
+{
+ // add people who were added via dropPerson()
+ if (!mPendingParticipants.empty())
+ {
+ addSessionParticipants(mPendingParticipants);
+ mPendingParticipants.clear();
+ }
+
+ LLFloaterIMSessionTab::draw();
+}
+
+// virtual
+BOOL LLFloaterIMSession::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ if (cargo_type == DAD_PERSON)
+ {
+ if (dropPerson(static_cast<LLUUID*>(cargo_data), drop))
+ {
+ *accept = ACCEPT_YES_MULTI;
+ }
+ else
+ {
+ *accept = ACCEPT_NO;
+ }
+ }
+ else if (mDialog == IM_NOTHING_SPECIAL)
+ {
+ LLToolDragAndDrop::handleGiveDragAndDrop(mOtherParticipantUUID, mSessionID, drop,
+ cargo_type, cargo_data, accept);
+ }
+
+ return TRUE;
+}
+
+bool LLFloaterIMSession::dropPerson(LLUUID* person_id, bool drop)
+{
+ bool res = person_id && person_id->notNull();
+ if(res)
+ {
+ uuid_vec_t ids;
+ ids.push_back(*person_id);
+
+ res = canAddSelectedToChat(ids);
+ if(res && drop)
+ {
+ // these people will be added during the next draw() call
+ // (so they can be added all at once)
+ mPendingParticipants.push_back(*person_id);
+ }
+ }
+
+ return res;
+}
+
+BOOL LLFloaterIMSession::isInviteAllowed() const
+{
+ return ( (IM_SESSION_CONFERENCE_START == mDialog)
+ || (IM_SESSION_INVITE == mDialog && !gAgent.isInGroup(mSessionID))
+ || mIsP2PChat);
+}
+
+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 LLFloaterIMSession::inviteToSession(const uuid_vec_t& ids)
+{
+ LLViewerRegion* region = gAgent.getRegion();
+ bool is_region_exist = region != NULL;
+
+ if (is_region_exist)
+ {
+ S32 count = ids.size();
+
+ if( isInviteAllowed() && (count > 0) )
+ {
+ llinfos << "LLFloaterIMSession::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 << "LLFloaterIMSession::inviteToSession -"
+ << " no need to invite agents for "
+ << mDialog << llendl;
+ // successful add, because everyone that needed to get added
+ // was added.
+ }
+ }
+
+ return is_region_exist;
+}
+
+void LLFloaterIMSession::addTypingIndicator(const LLIMInfo* im_info)
+{
+ // We may have lost a "stop-typing" packet, don't add it twice
+ if (im_info && !mOtherTyping)
+ {
+ mOtherTyping = true;
+
+ // Update speaker
+ LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+ if ( speaker_mgr )
+ {
+ speaker_mgr->setSpeakerTyping(im_info->mFromID, TRUE);
+ }
+ }
+}
+
+void LLFloaterIMSession::removeTypingIndicator(const LLIMInfo* im_info)
+{
+ if (mOtherTyping)
+ {
+ mOtherTyping = false;
+
+ if (im_info)
+ {
+ // Update speaker
+ LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+ if (speaker_mgr)
+ {
+ speaker_mgr->setSpeakerTyping(im_info->mFromID, FALSE);
+ }
+ }
+ }
+}
+
+// static
+void LLFloaterIMSession::closeHiddenIMToasts()
+{
+ class IMToastMatcher: public LLNotificationsUI::LLScreenChannel::Matcher
+ {
+ public:
+ bool matches(const LLNotificationPtr notification) const
+ {
+ // "notifytoast" type of notifications is reserved for IM notifications
+ return "notifytoast" == notification->getType();
+ }
+ };
+
+ LLNotificationsUI::LLScreenChannel* channel =
+ LLNotificationsUI::LLChannelManager::getNotificationScreenChannel();
+ if (channel != NULL)
+ {
+ channel->closeHiddenToasts(IMToastMatcher());
+ }
+}
+// static
+void LLFloaterIMSession::confirmLeaveCallCallback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ const LLSD& payload = notification["payload"];
+ LLUUID session_id = payload["session_id"];
+
+ LLFloater* im_floater = findInstance(session_id);
+ if (option == 0 && im_floater != NULL)
+ {
+ im_floater->closeFloater();
+ }
+
+ return;
+}
+
+// static
+void LLFloaterIMSession::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;
+
+ LLFloaterIMSession* floater = LLFloaterIMSession::findInstance(session_id);
+ if (!floater)
+ return;
+
+ if (IM_NOTHING_SPECIAL != floater->mDialog)
+ return;
+
+ floater->removeTypingIndicator();
+}
+
+// static
+void LLFloaterIMSession::onIMChicletCreated( const LLUUID& session_id )
+{
+ LLFloaterIMSession::addToHost(session_id);
+}
+
+boost::signals2::connection LLFloaterIMSession::setIMFloaterShowedCallback(const floater_showed_signal_t::slot_type& cb)
+{
+ return LLFloaterIMSession::sIMFloaterShowedSignal.connect(cb);
+}
diff --git a/indra/newview/llimfloater.h b/indra/newview/llfloaterimsession.h
index f7cd35b5eb..cb330bca0f 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llfloaterimsession.h
@@ -1,6 +1,6 @@
/**
- * @file llimfloater.h
- * @brief LLIMFloater class definition
+ * @file llfloaterimsession.h
+ * @brief LLFloaterIMSession class definition
*
* $LicenseInfo:firstyear=2009&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -24,62 +24,79 @@
* $/LicenseInfo$
*/
-#ifndef LL_IMFLOATER_H
-#define LL_IMFLOATER_H
+#ifndef LL_FLOATERIMSESSION_H
+#define LL_FLOATERIMSESSION_H
+#include "llimview.h"
+#include "llfloaterimsessiontab.h"
#include "llinstantmessage.h"
#include "lllogchat.h"
#include "lltooldraganddrop.h"
-#include "lltransientdockablefloater.h"
+#include "llvoicechannel.h"
+#include "llvoiceclient.h"
class LLAvatarName;
-class LLLineEditor;
+class LLButton;
+class LLChatEntry;
+class LLTextEditor;
class LLPanelChatControlPanel;
class LLChatHistory;
class LLInventoryItem;
class LLInventoryCategory;
+typedef boost::signals2::signal<void(const LLUUID& session_id)> floater_showed_signal_t;
+
/**
* Individual IM window that appears at the bottom of the screen,
* optionally "docked" to the bottom tray.
*/
-class LLIMFloater : public LLTransientDockableFloater
+class LLFloaterIMSession
+ : public LLVoiceClientStatusObserver
+ , public LLFloaterIMSessionTab
{
- LOG_CLASS(LLIMFloater);
+ LOG_CLASS(LLFloaterIMSession);
public:
- LLIMFloater(const LLUUID& session_id);
+ LLFloaterIMSession(const LLUUID& session_id);
+
+ virtual ~LLFloaterIMSession();
+
+ void initIMSession(const LLUUID& session_id);
+ void initIMFloater();
- virtual ~LLIMFloater();
-
// LLView overrides
/*virtual*/ BOOL postBuild();
/*virtual*/ void setVisible(BOOL visible);
/*virtual*/ BOOL getVisible();
// Check typing timeout timer.
+
/*virtual*/ void draw();
+ /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
+
+ static LLFloaterIMSession* findInstance(const LLUUID& session_id);
+ static LLFloaterIMSession* getInstance(const LLUUID& session_id);
// LLFloater overrides
/*virtual*/ void onClose(bool app_quitting);
/*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
-
// Make IM conversion visible and update the message history
- static LLIMFloater* show(const LLUUID& session_id);
+ static LLFloaterIMSession* show(const LLUUID& session_id);
// Toggle panel specified by session_id
// Returns true iff panel became visible
static bool toggle(const LLUUID& session_id);
- 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();
+ /*virtual*/ void updateMessages();
+ void reloadMessages(bool clean_messages = false);
+ static void onSendMsg(LLUICtrl*, void*);
+ void sendMsgFromInputEditor();
+ void sendMsg(const std::string& msg);
// callback for LLIMModel on new messages
// route to specific floater if it is visible
@@ -89,62 +106,61 @@ public:
void setPositioned(bool b) { mPositioned = b; };
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);
+ bool enableGearMenuItem(const LLSD& userdata);
+ void GearDoToSelected(const LLSD& userdata);
+ bool checkGearMenuItem(const LLSD& userdata);
- void updateChatHistoryStyle();
- static void processChatHistoryStyleUpdate(const LLSD& newvalue);
+ // Implements LLVoiceClientStatusObserver::onChange() to enable the call
+ // button when voice is available
+ void onChange(EStatusType status, const std::string &channelURI,
+ bool proximal);
- 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();
+ virtual LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; }
+ virtual void onVoiceChannelStateChanged(
+ const LLVoiceChannel::EState& old_state,
+ const LLVoiceChannel::EState& new_state);
- static void initIMFloater();
+ void processIMTyping(const LLIMInfo* im_info, BOOL typing);
+ void processAgentListUpdates(const LLSD& body);
+ void processSessionUpdate(const LLSD& session_update);
//used as a callback on receiving new IM message
static void sRemoveTypingIndicator(const LLSD& data);
-
static void onIMChicletCreated(const LLUUID& session_id);
+ const LLUUID& getOtherParticipantUUID() {return mOtherParticipantUUID;}
- virtual LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; }
-
-protected:
- /* virtual */
- void onClickCloseBtn();
+ static boost::signals2::connection setIMFloaterShowedCallback(const floater_showed_signal_t::slot_type& cb);
+ static floater_showed_signal_t sIMFloaterShowedSignal;
+ bool needsTitleOverwrite() { return mSessionNameUpdatedForTyping && mOtherTyping; }
+ S32 getLastChatMessageIndex() {return mLastMessageIndex;}
private:
- // process focus events to set a currently active session
- /* virtual */ void onFocusLost();
- /* virtual */ void onFocusReceived();
-
- // Update the window title, input field help text, etc.
- void updateSessionName(const std::string& ui_title, const std::string& ui_label);
-
- // For display name lookups for IM window titles
- void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
-
- BOOL dropCallingCard(LLInventoryItem* item, BOOL drop);
- BOOL dropCategory(LLInventoryCategory* category, BOOL drop);
+
+ /*virtual*/ void refresh();
+
+ /*virtual*/ void onTearOffClicked();
+ /*virtual*/ void onClickCloseBtn();
+
+ // Update the window title and input field help text
+ /*virtual*/ void updateSessionName(const std::string& name);
+
+ bool dropPerson(LLUUID* person_id, bool drop);
BOOL isInviteAllowed() const;
BOOL inviteToSession(const uuid_vec_t& agent_ids);
-
- static void onInputEditorFocusReceived( LLFocusableElement* caller, void* userdata );
- static void onInputEditorFocusLost(LLFocusableElement* caller, void* userdata);
- static void onInputEditorKeystroke(LLLineEditor* caller, void* userdata);
- void setTyping(bool typing);
- void onSlide();
- static void* createPanelIMControl(void* userdata);
- static void* createPanelGroupControl(void* userdata);
- static void* createPanelAdHocControl(void* userdata);
+ static void onInputEditorFocusReceived( LLFocusableElement* caller,void* userdata );
+ static void onInputEditorFocusLost(LLFocusableElement* caller, void* userdata);
+ static void onInputEditorKeystroke(LLTextEditor* caller, void* userdata);
+ void setTyping(bool typing);
+ void onAddButtonClicked();
+ void addSessionParticipants(const uuid_vec_t& uuids);
+ void addP2PSessionParticipants(const LLSD& notification, const LLSD& response, const uuid_vec_t& uuids);
+ void sendParticipantsAddedNotification(const uuid_vec_t& uuids);
+ bool canAddSelectedToChat(const uuid_vec_t& uuids);
+
+ void onCallButtonClicked();
+
+ void boundVoiceChannel();
// Add the "User is typing..." indicator.
void addTypingIndicator(const LLIMInfo* im_info);
@@ -156,27 +172,28 @@ private:
static void confirmLeaveCallCallback(const LLSD& notification, const LLSD& response);
- LLPanelChatControlPanel* mControlPanel;
- LLUUID mSessionID;
S32 mLastMessageIndex;
EInstantMessage mDialog;
LLUUID mOtherParticipantUUID;
- LLChatHistory* mChatHistory;
- LLLineEditor* mInputEditor;
bool mPositioned;
- std::string mSavedTitle;
LLUIString mTypingStart;
bool mMeTyping;
bool mOtherTyping;
bool mShouldSendTypingState;
LLFrameTimer mTypingTimer;
LLFrameTimer mTypingTimeoutTimer;
+ bool mSessionNameUpdatedForTyping;
bool mSessionInitialized;
LLSD mQueuedMsgsForInit;
-};
+ uuid_vec_t mInvitedParticipants;
+ uuid_vec_t mPendingParticipants;
+
+ // connection to voice channel state change signal
+ boost::signals2::connection mVoiceChannelStateChangeConnection;
+};
-#endif // LL_IMFLOATER_H
+#endif // LL_FLOATERIMSESSION_H
diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp
new file mode 100644
index 0000000000..eab2ce7798
--- /dev/null
+++ b/indra/newview/llfloaterimsessiontab.cpp
@@ -0,0 +1,1082 @@
+/**
+ * @file llfloaterimsessiontab.cpp
+ * @brief LLFloaterIMSessionTab class implements the common behavior of LNearbyChatBar
+ * @brief and LLFloaterIMSession for hosting both in LLIMContainer
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterimsessiontab.h"
+
+#include "llagent.h"
+#include "llagentcamera.h"
+#include "llavataractions.h"
+#include "llchatentry.h"
+#include "llchathistory.h"
+#include "llchiclet.h"
+#include "llchicletbar.h"
+#include "lldraghandle.h"
+#include "llfloaterreg.h"
+#include "llfloaterimsession.h"
+#include "llfloaterimcontainer.h" // to replace separate IM Floaters with multifloater container
+#include "lllayoutstack.h"
+#include "lltoolbarview.h"
+#include "llfloaterimnearbychat.h"
+
+const F32 REFRESH_INTERVAL = 1.0f;
+
+LLFloaterIMSessionTab::LLFloaterIMSessionTab(const LLSD& session_id)
+ : LLTransientDockableFloater(NULL, true, session_id)
+ , mIsP2PChat(false)
+ , mExpandCollapseBtn(NULL)
+ , mTearOffBtn(NULL)
+ , mCloseBtn(NULL)
+ , mSessionID(session_id.asUUID())
+ , mConversationsRoot(NULL)
+ , mScroller(NULL)
+ , mSpeakingIndicator(NULL)
+ , mChatHistory(NULL)
+ , mInputEditor(NULL)
+ , mInputEditorPad(0)
+ , mRefreshTimer(new LLTimer())
+ , mIsHostAttached(false)
+ , mHasVisibleBeenInitialized(false)
+ , mIsParticipantListExpanded(true)
+ , mChatLayoutPanel(NULL)
+{
+ setAutoFocus(FALSE);
+ mSession = LLIMModel::getInstance()->findIMSession(mSessionID);
+
+ mCommitCallbackRegistrar.add("IMSession.Menu.Action",
+ boost::bind(&LLFloaterIMSessionTab::onIMSessionMenuItemClicked, this, _2));
+ mEnableCallbackRegistrar.add("IMSession.Menu.CompactExpandedModes.CheckItem",
+ boost::bind(&LLFloaterIMSessionTab::onIMCompactExpandedMenuItemCheck, this, _2));
+ mEnableCallbackRegistrar.add("IMSession.Menu.ShowModes.CheckItem",
+ boost::bind(&LLFloaterIMSessionTab::onIMShowModesMenuItemCheck, this, _2));
+ mEnableCallbackRegistrar.add("IMSession.Menu.ShowModes.Enable",
+ boost::bind(&LLFloaterIMSessionTab::onIMShowModesMenuItemEnable, this, _2));
+
+ // Right click menu handling
+ mEnableCallbackRegistrar.add("Avatar.CheckItem", boost::bind(&LLFloaterIMSessionTab::checkContextMenuItem, this, _2));
+ mEnableCallbackRegistrar.add("Avatar.EnableItem", boost::bind(&LLFloaterIMSessionTab::enableContextMenuItem, this, _2));
+ mCommitCallbackRegistrar.add("Avatar.DoToSelected", boost::bind(&LLFloaterIMSessionTab::doToSelected, this, _2));
+}
+
+LLFloaterIMSessionTab::~LLFloaterIMSessionTab()
+{
+ delete mRefreshTimer;
+}
+
+//static
+LLFloaterIMSessionTab* LLFloaterIMSessionTab::findConversation(const LLUUID& uuid)
+{
+ LLFloaterIMSessionTab* conv;
+
+ if (uuid.isNull())
+ {
+ conv = LLFloaterReg::findTypedInstance<LLFloaterIMSessionTab>("nearby_chat");
+ }
+ else
+ {
+ conv = LLFloaterReg::findTypedInstance<LLFloaterIMSessionTab>("impanel", LLSD(uuid));
+ }
+
+ return conv;
+};
+
+//static
+LLFloaterIMSessionTab* LLFloaterIMSessionTab::getConversation(const LLUUID& uuid)
+{
+ LLFloaterIMSessionTab* conv;
+
+ if (uuid.isNull())
+ {
+ conv = LLFloaterReg::getTypedInstance<LLFloaterIMSessionTab>("nearby_chat");
+ }
+ else
+ {
+ conv = LLFloaterReg::getTypedInstance<LLFloaterIMSessionTab>("impanel", LLSD(uuid));
+ }
+
+ return conv;
+};
+
+void LLFloaterIMSessionTab::setVisible(BOOL visible)
+{
+ if(visible && !mHasVisibleBeenInitialized)
+ {
+ mHasVisibleBeenInitialized = true;
+ if(!gAgentCamera.cameraMouselook())
+ {
+ LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container")->setVisible(true);
+ }
+ LLFloaterIMSessionTab::addToHost(mSessionID);
+ mInputButtonPanel->setVisible(isTornOff());
+ }
+
+ LLTransientDockableFloater::setVisible(visible);
+}
+
+/*virtual*/
+void LLFloaterIMSessionTab::setFocus(BOOL focus)
+{
+ LLTransientDockableFloater::setFocus(focus);
+
+ //Redirect focus to input editor
+ if (focus)
+ {
+ updateMessages();
+
+ if (mInputEditor)
+ {
+ mInputEditor->setFocus(TRUE);
+ }
+ }
+}
+
+
+void LLFloaterIMSessionTab::addToHost(const LLUUID& session_id)
+{
+ if ((session_id.notNull() && !gIMMgr->hasSession(session_id))
+ || !LLFloaterIMSessionTab::isChatMultiTab())
+ {
+ return;
+ }
+
+ // Get the floater: this will create the instance if it didn't exist
+ LLFloaterIMSessionTab* conversp = LLFloaterIMSessionTab::getConversation(session_id);
+ if (conversp)
+ {
+ LLFloaterIMContainer* floater_container = LLFloaterIMContainer::getInstance();
+
+ // Do not add again existing floaters
+ if (floater_container && !conversp->isHostAttached())
+ {
+ conversp->setHostAttached(true);
+
+ if (!conversp->isNearbyChat()
+ || gSavedPerAccountSettings.getBOOL("NearbyChatIsNotTornOff"))
+ {
+ floater_container->addFloater(conversp, false, LLTabContainer::RIGHT_OF_CURRENT);
+ }
+ else
+ {
+ // setting of the "potential" host for Nearby Chat: this sequence sets
+ // LLFloater::mHostHandle = NULL (a current host), but
+ // LLFloater::mLastHostHandle = floater_container (a "future" host)
+ conversp->setHost(floater_container);
+ conversp->setHost(NULL);
+
+ conversp->forceReshape();
+ }
+ // Added floaters share some state (like sort order) with their host
+ conversp->setSortOrder(floater_container->getSortOrder());
+ }
+ }
+}
+
+void LLFloaterIMSessionTab::assignResizeLimits()
+{
+ bool is_participants_pane_collapsed = mParticipantListPanel->isCollapsed();
+
+ // disable a layoutstack's functionality when participant list panel is collapsed
+ mRightPartPanel->setIgnoreReshape(is_participants_pane_collapsed);
+
+ S32 participants_pane_target_width = is_participants_pane_collapsed?
+ 0 : (mParticipantListPanel->getRect().getWidth() + LLPANEL_BORDER_WIDTH);
+
+ S32 new_min_width = participants_pane_target_width + mRightPartPanel->getExpandedMinDim() + mFloaterExtraWidth;
+
+ setResizeLimits(new_min_width, getMinHeight());
+
+ this->mParticipantListAndHistoryStack->updateLayout();
+}
+
+BOOL LLFloaterIMSessionTab::postBuild()
+{
+ BOOL result;
+
+ mBodyStack = getChild<LLLayoutStack>("main_stack");
+ mParticipantListAndHistoryStack = getChild<LLLayoutStack>("im_panels");
+
+ mCloseBtn = getChild<LLButton>("close_btn");
+ mCloseBtn->setCommitCallback(boost::bind(&LLFloater::onClickClose, this));
+
+ mExpandCollapseBtn = getChild<LLButton>("expand_collapse_btn");
+ mExpandCollapseBtn->setClickedCallback(boost::bind(&LLFloaterIMSessionTab::onSlide, this));
+
+ mExpandCollapseLineBtn = getChild<LLButton>("minz_btn");
+ mExpandCollapseLineBtn->setClickedCallback(boost::bind(&LLFloaterIMSessionTab::onCollapseToLine, this));
+
+ mTearOffBtn = getChild<LLButton>("tear_off_btn");
+ mTearOffBtn->setCommitCallback(boost::bind(&LLFloaterIMSessionTab::onTearOffClicked, this));
+
+ mGearBtn = getChild<LLButton>("gear_btn");
+
+ mParticipantListPanel = getChild<LLLayoutPanel>("speakers_list_panel");
+ mRightPartPanel = getChild<LLLayoutPanel>("right_part_holder");
+
+ mToolbarPanel = getChild<LLLayoutPanel>("toolbar_panel");
+ mContentPanel = getChild<LLLayoutPanel>("body_panel");
+ mInputButtonPanel = getChild<LLLayoutPanel>("input_button_layout_panel");
+ mInputButtonPanel->setVisible(false);
+ // Add a scroller for the folder (participant) view
+ LLRect scroller_view_rect = mParticipantListPanel->getRect();
+ scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
+ LLScrollContainer::Params scroller_params(LLUICtrlFactory::getDefaultParams<LLFolderViewScrollContainer>());
+ scroller_params.rect(scroller_view_rect);
+ mScroller = LLUICtrlFactory::create<LLFolderViewScrollContainer>(scroller_params);
+ mScroller->setFollowsAll();
+
+ mSpeakingIndicator = getChild<LLOutputMonitorCtrl>("speaking_indicator");
+
+ // Insert that scroller into the panel widgets hierarchy
+ mParticipantListPanel->addChild(mScroller);
+
+ mChatHistory = getChild<LLChatHistory>("chat_history");
+
+ mInputEditor = getChild<LLChatEntry>("chat_editor");
+
+ mChatLayoutPanel = getChild<LLLayoutPanel>("chat_layout_panel");
+
+ mInputEditor->setTextExpandedCallback(boost::bind(&LLFloaterIMSessionTab::reshapeChatLayoutPanel, this));
+ mInputEditor->setCommitOnFocusLost( FALSE );
+ mInputEditor->setPassDelete(TRUE);
+ mInputEditor->setFont(LLViewerChat::getChatFont());
+
+ mInputEditorPad = mChatLayoutPanel->getRect().getHeight() - mInputEditor->getRect().getHeight();
+
+ setOpenPositioning(LLFloaterEnums::POSITIONING_RELATIVE);
+
+ mSaveRect = isNearbyChat()
+ && !gSavedPerAccountSettings.getBOOL("NearbyChatIsNotTornOff");
+ initRectControl();
+
+ if (isChatMultiTab())
+ {
+ result = LLFloater::postBuild();
+ }
+ else
+ {
+ result = LLDockableFloater::postBuild();
+ }
+
+ // Create the root using an ad-hoc base item
+ LLConversationItem* base_item = new LLConversationItem(mSessionID, mConversationViewModel);
+ LLFolderView::Params p(LLUICtrlFactory::getDefaultParams<LLFolderView>());
+ p.rect = LLRect(0, 0, getRect().getWidth(), 0);
+ p.parent_panel = mParticipantListPanel;
+ p.listener = base_item;
+ p.view_model = &mConversationViewModel;
+ p.root = NULL;
+ p.use_ellipses = true;
+ p.options_menu = "menu_conversation.xml";
+ p.name = "root";
+ mConversationsRoot = LLUICtrlFactory::create<LLFolderView>(p);
+ mConversationsRoot->setCallbackRegistrar(&mCommitCallbackRegistrar);
+ // Attach that root to the scroller
+ mScroller->addChild(mConversationsRoot);
+ mConversationsRoot->setScrollContainer(mScroller);
+ mConversationsRoot->setFollowsAll();
+ mConversationsRoot->addChild(mConversationsRoot->mStatusTextBox);
+
+ setMessagePaneExpanded(true);
+
+ buildConversationViewParticipant();
+ refreshConversation();
+
+ // Zero expiry time is set only once to allow initial update.
+ mRefreshTimer->setTimerExpirySec(0);
+ mRefreshTimer->start();
+ initBtns();
+
+ if (mIsParticipantListExpanded != (bool)gSavedSettings.getBOOL("IMShowControlPanel"))
+ {
+ LLFloaterIMSessionTab::onSlide(this);
+ }
+
+ // The resize limits for LLFloaterIMSessionTab should be updated, based on current values of width of conversation and message panels
+ mParticipantListPanel->getResizeBar()->setResizeListener(boost::bind(&LLFloaterIMSessionTab::assignResizeLimits, this));
+ mFloaterExtraWidth =
+ getRect().getWidth()
+ - mParticipantListAndHistoryStack->getRect().getWidth()
+ - (mParticipantListPanel->isCollapsed()? 0 : LLPANEL_BORDER_WIDTH);
+
+ assignResizeLimits();
+
+ return result;
+}
+
+LLParticipantList* LLFloaterIMSessionTab::getParticipantList()
+{
+ return dynamic_cast<LLParticipantList*>(LLFloaterIMContainer::getInstance()->getSessionModel(mSessionID));
+}
+
+void LLFloaterIMSessionTab::draw()
+{
+ if (mRefreshTimer->hasExpired())
+ {
+ LLParticipantList* item = getParticipantList();
+ if (item)
+ {
+ // Update all model items
+ item->update();
+ // If the model and view list diverge in count, rebuild
+ // Note: this happens sometimes right around init (add participant events fire but get dropped) and is the cause
+ // of missing participants, often, the user agent itself. As there will be no other event fired, there's
+ // no other choice but get those inconsistencies regularly (and lightly) checked and scrubbed.
+ if (item->getChildrenCount() != mConversationsWidgets.size())
+ {
+ buildConversationViewParticipant();
+ }
+ refreshConversation();
+ }
+
+ // Restart the refresh timer
+ mRefreshTimer->setTimerExpirySec(REFRESH_INTERVAL);
+ }
+
+ LLTransientDockableFloater::draw();
+}
+
+void LLFloaterIMSessionTab::enableDisableCallBtn()
+{
+ getChildView("voice_call_btn")->setEnabled(
+ mSessionID.notNull()
+ && mSession
+ && mSession->mSessionInitialized
+ && LLVoiceClient::getInstance()->voiceEnabled()
+ && LLVoiceClient::getInstance()->isVoiceWorking()
+ && mSession->mCallBackEnabled);
+}
+
+void LLFloaterIMSessionTab::onFocusReceived()
+{
+ setBackgroundOpaque(true);
+
+ if (mSessionID.notNull() && isInVisibleChain())
+ {
+ LLIMModel::instance().sendNoUnreadMessages(mSessionID);
+ }
+
+ LLTransientDockableFloater::onFocusReceived();
+}
+
+void LLFloaterIMSessionTab::onFocusLost()
+{
+ setBackgroundOpaque(false);
+ LLTransientDockableFloater::onFocusLost();
+}
+
+std::string LLFloaterIMSessionTab::appendTime()
+{
+ time_t utc_time;
+ utc_time = time_corrected();
+ std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
+ +LLTrans::getString("TimeMin")+"]";
+
+ LLSD substitution;
+
+ substitution["datetime"] = (S32) utc_time;
+ LLStringUtil::format (timeStr, substitution);
+
+ return timeStr;
+}
+
+void LLFloaterIMSessionTab::appendMessage(const LLChat& chat, const LLSD &args)
+{
+
+ // Update the participant activity time
+ LLFloaterIMContainer* im_box = LLFloaterIMContainer::findInstance();
+ if (im_box)
+ {
+ im_box->setTimeNow(mSessionID,chat.mFromID);
+ }
+
+
+ LLChat& tmp_chat = const_cast<LLChat&>(chat);
+
+ if(tmp_chat.mTimeStr.empty())
+ tmp_chat.mTimeStr = appendTime();
+
+ if (!chat.mMuted)
+ {
+ tmp_chat.mFromName = chat.mFromName;
+ LLSD chat_args;
+ if (args) chat_args = args;
+ chat_args["use_plain_text_chat_history"] =
+ gSavedSettings.getBOOL("PlainTextChatHistory");
+ chat_args["show_time"] = gSavedSettings.getBOOL("IMShowTime");
+ chat_args["show_names_for_p2p_conv"] =
+ !mIsP2PChat || gSavedSettings.getBOOL("IMShowNamesForP2PConv");
+
+ if (mChatHistory)
+ {
+ mChatHistory->appendMessage(chat, chat_args);
+ }
+ }
+}
+
+
+void LLFloaterIMSessionTab::buildConversationViewParticipant()
+{
+ // Clear the widget list since we are rebuilding afresh from the model
+ conversations_widgets_map::iterator widget_it = mConversationsWidgets.begin();
+ while (widget_it != mConversationsWidgets.end())
+ {
+ removeConversationViewParticipant(widget_it->first);
+ // Iterators are invalidated by erase so we need to pick begin again
+ widget_it = mConversationsWidgets.begin();
+ }
+
+ // Get the model list
+ LLParticipantList* item = getParticipantList();
+ if (!item)
+ {
+ // Nothing to do if the model list is inexistent
+ return;
+ }
+
+ // Create the participants widgets now
+ LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = item->getChildrenBegin();
+ LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = item->getChildrenEnd();
+ while (current_participant_model != end_participant_model)
+ {
+ LLConversationItem* participant_model = dynamic_cast<LLConversationItem*>(*current_participant_model);
+ addConversationViewParticipant(participant_model);
+ current_participant_model++;
+ }
+}
+
+void LLFloaterIMSessionTab::addConversationViewParticipant(LLConversationItem* participant_model)
+{
+ // Check if the model already has an associated view
+ LLUUID uuid = participant_model->getUUID();
+ LLFolderViewItem* widget = get_ptr_in_map(mConversationsWidgets,uuid);
+
+ // If not already present, create the participant view and attach it to the root, otherwise, just refresh it
+ if (widget)
+ {
+ updateConversationViewParticipant(uuid); // overkill?
+ }
+ else
+ {
+ LLConversationViewParticipant* participant_view = createConversationViewParticipant(participant_model);
+ mConversationsWidgets[uuid] = participant_view;
+ participant_view->addToFolder(mConversationsRoot);
+ participant_view->addToSession(mSessionID);
+ participant_view->setVisible(TRUE);
+ }
+}
+
+void LLFloaterIMSessionTab::removeConversationViewParticipant(const LLUUID& participant_id)
+{
+ LLFolderViewItem* widget = get_ptr_in_map(mConversationsWidgets,participant_id);
+ if (widget)
+ {
+ mConversationsRoot->extractItem(widget);
+ delete widget;
+ mConversationsWidgets.erase(participant_id);
+ }
+}
+
+void LLFloaterIMSessionTab::updateConversationViewParticipant(const LLUUID& participant_id)
+{
+ LLFolderViewItem* widget = get_ptr_in_map(mConversationsWidgets,participant_id);
+ if (widget)
+ {
+ widget->refresh();
+ }
+}
+
+void LLFloaterIMSessionTab::refreshConversation()
+{
+ // Note: We collect participants names to change the session name only in the case of ad-hoc conversations
+ bool is_ad_hoc = (mSession ? mSession->isAdHocSessionType() : false);
+ uuid_vec_t participants_uuids; // uuids vector for building the added participants name string
+ // For P2P chat, we still need to update the session name who may have changed (switch display name for instance)
+ if (mIsP2PChat && mSession)
+ {
+ participants_uuids.push_back(mSession->mOtherParticipantID);
+ }
+
+ conversations_widgets_map::iterator widget_it = mConversationsWidgets.begin();
+ while (widget_it != mConversationsWidgets.end())
+ {
+ // Add the participant to the list except if it's the agent itself (redundant)
+ if (is_ad_hoc && (widget_it->first != gAgentID))
+ {
+ participants_uuids.push_back(widget_it->first);
+ }
+ widget_it->second->refresh();
+ widget_it->second->setVisible(TRUE);
+ ++widget_it;
+ }
+ if (is_ad_hoc || mIsP2PChat)
+ {
+ // Build the session name and update it
+ std::string session_name;
+ if (participants_uuids.size() != 0)
+ {
+ LLAvatarActions::buildResidentsString(participants_uuids, session_name);
+ }
+ else
+ {
+ session_name = LLIMModel::instance().getName(mSessionID);
+ }
+ updateSessionName(session_name);
+ }
+
+ if (mSessionID.notNull())
+ {
+ LLParticipantList* participant_list = getParticipantList();
+ if (participant_list)
+ {
+ LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = participant_list->getChildrenBegin();
+ LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = participant_list->getChildrenEnd();
+ LLIMSpeakerMgr *speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+ while (current_participant_model != end_participant_model)
+ {
+ LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model);
+ if (speaker_mgr && participant_model)
+ {
+ LLSpeaker *participant_speaker = speaker_mgr->findSpeaker(participant_model->getUUID());
+ LLSpeaker *agent_speaker = speaker_mgr->findSpeaker(gAgentID);
+ if (participant_speaker && agent_speaker)
+ {
+ participant_model->setDisplayModeratorRole(agent_speaker->mIsModerator && participant_speaker->mIsModerator);
+ }
+ }
+ current_participant_model++;
+ }
+ }
+ }
+
+ mConversationViewModel.requestSortAll();
+ if(mConversationsRoot != NULL)
+ {
+ mConversationsRoot->arrangeAll();
+ mConversationsRoot->update();
+ }
+ updateHeaderAndToolbar();
+ refresh();
+}
+
+// Copied from LLFloaterIMContainer::createConversationViewParticipant(). Refactor opportunity!
+LLConversationViewParticipant* LLFloaterIMSessionTab::createConversationViewParticipant(LLConversationItem* item)
+{
+ LLRect panel_rect = mParticipantListPanel->getRect();
+
+ LLConversationViewParticipant::Params params;
+ params.name = item->getDisplayName();
+ params.root = mConversationsRoot;
+ params.listener = item;
+ params.rect = LLRect (0, 24, panel_rect.getWidth(), 0); // *TODO: use conversation_view_participant.xml itemHeight value in lieu of 24
+ params.tool_tip = params.name;
+ params.participant_id = item->getUUID();
+
+ return LLUICtrlFactory::create<LLConversationViewParticipant>(params);
+}
+
+void LLFloaterIMSessionTab::setSortOrder(const LLConversationSort& order)
+{
+ mConversationViewModel.setSorter(order);
+ mConversationsRoot->arrangeAll();
+ refreshConversation();
+}
+
+void LLFloaterIMSessionTab::onIMSessionMenuItemClicked(const LLSD& userdata)
+{
+ std::string item = userdata.asString();
+
+ if (item == "compact_view" || item == "expanded_view")
+ {
+ gSavedSettings.setBOOL("PlainTextChatHistory", item == "compact_view");
+ }
+ else
+ {
+ bool prev_value = gSavedSettings.getBOOL(item);
+ gSavedSettings.setBOOL(item, !prev_value);
+ }
+
+ LLFloaterIMSessionTab::processChatHistoryStyleUpdate();
+}
+
+bool LLFloaterIMSessionTab::onIMCompactExpandedMenuItemCheck(const LLSD& userdata)
+{
+ std::string item = userdata.asString();
+ bool is_plain_text_mode = gSavedSettings.getBOOL("PlainTextChatHistory");
+
+ return is_plain_text_mode? item == "compact_view" : item == "expanded_view";
+}
+
+
+bool LLFloaterIMSessionTab::onIMShowModesMenuItemCheck(const LLSD& userdata)
+{
+ return gSavedSettings.getBOOL(userdata.asString());
+}
+
+// enable/disable states for the "show time" and "show names" items of the show-modes menu
+bool LLFloaterIMSessionTab::onIMShowModesMenuItemEnable(const LLSD& userdata)
+{
+ std::string item = userdata.asString();
+ bool plain_text = gSavedSettings.getBOOL("PlainTextChatHistory");
+ bool is_not_names = (item != "IMShowNamesForP2PConv");
+ return (plain_text && (is_not_names || mIsP2PChat));
+}
+
+void LLFloaterIMSessionTab::hideOrShowTitle()
+{
+ const LLFloater::Params& default_params = LLFloater::getDefaultParams();
+ S32 floater_header_size = default_params.header_height;
+ LLView* floater_contents = getChild<LLView>("contents_view");
+
+ LLRect floater_rect = getLocalRect();
+ S32 top_border_of_contents = floater_rect.mTop - (isTornOff()? floater_header_size : 0);
+ LLRect handle_rect (0, floater_rect.mTop, floater_rect.mRight, top_border_of_contents);
+ LLRect contents_rect (0, top_border_of_contents, floater_rect.mRight, floater_rect.mBottom);
+ mDragHandle->setShape(handle_rect);
+ mDragHandle->setVisible(isTornOff());
+ floater_contents->setShape(contents_rect);
+}
+
+void LLFloaterIMSessionTab::updateSessionName(const std::string& name)
+{
+ mInputEditor->setLabel(LLTrans::getString("IM_to_label") + " " + name);
+}
+
+void LLFloaterIMSessionTab::hideAllStandardButtons()
+{
+ for (S32 i = 0; i < BUTTON_COUNT; i++)
+ {
+ if (mButtons[i])
+ {
+ // Hide the standard header buttons in a docked IM floater.
+ mButtons[i]->setVisible(false);
+ }
+ }
+}
+
+void LLFloaterIMSessionTab::updateHeaderAndToolbar()
+{
+ // prevent start conversation before its container
+ LLFloaterIMContainer::getInstance();
+
+ bool is_not_torn_off = !checkIfTornOff();
+ if (is_not_torn_off)
+ {
+ hideAllStandardButtons();
+ }
+
+ hideOrShowTitle();
+
+ // Participant list should be visible only in torn off floaters.
+ bool is_participant_list_visible =
+ !is_not_torn_off
+ && mIsParticipantListExpanded
+ && !mIsP2PChat;
+
+ mParticipantListAndHistoryStack->collapsePanel(mParticipantListPanel, !is_participant_list_visible);
+
+ // Display collapse image (<<) if the floater is hosted
+ // or if it is torn off but has an open control panel.
+ bool is_expanded = is_not_torn_off || is_participant_list_visible;
+ mExpandCollapseBtn->setImageOverlay(getString(is_expanded ? "collapse_icon" : "expand_icon"));
+ mExpandCollapseBtn->setToolTip(
+ is_not_torn_off?
+ getString("expcol_button_not_tearoff_tooltip") :
+ (is_expanded?
+ getString("expcol_button_tearoff_and_expanded_tooltip") :
+ getString("expcol_button_tearoff_and_collapsed_tooltip")));
+
+ // toggle floater's drag handle and title visibility
+ if (mDragHandle)
+ {
+ mDragHandle->setTitleVisible(!is_not_torn_off);
+ }
+
+ // The button (>>) should be disabled for torn off P2P conversations.
+ mExpandCollapseBtn->setEnabled(is_not_torn_off || !mIsP2PChat);
+
+ mTearOffBtn->setImageOverlay(getString(is_not_torn_off? "tear_off_icon" : "return_icon"));
+ mTearOffBtn->setToolTip(getString(is_not_torn_off? "tooltip_to_separate_window" : "tooltip_to_main_window"));
+
+
+ mCloseBtn->setVisible(is_not_torn_off && !mIsNearbyChat);
+
+ enableDisableCallBtn();
+
+ showTranslationCheckbox();
+}
+
+void LLFloaterIMSessionTab::forceReshape()
+{
+ LLRect floater_rect = getRect();
+ reshape(llmax(floater_rect.getWidth(), this->getMinWidth()),
+ llmax(floater_rect.getHeight(), this->getMinHeight()),
+ true);
+}
+
+
+void LLFloaterIMSessionTab::reshapeChatLayoutPanel()
+{
+ LLRect chat_layout_panel_rect = mChatLayoutPanel->getRect();
+ LLRect input_rect = mInputEditor->getRect();
+ mChatLayoutPanel->reshape(chat_layout_panel_rect.getWidth(), input_rect.getHeight() + mInputEditorPad, FALSE);
+}
+
+void LLFloaterIMSessionTab::showTranslationCheckbox(BOOL show)
+{
+ getChild<LLUICtrl>("translate_chat_checkbox_lp")->setVisible(mIsNearbyChat? show : FALSE);
+}
+
+// static
+void LLFloaterIMSessionTab::processChatHistoryStyleUpdate(bool clean_messages/* = false*/)
+{
+ 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)
+ {
+ LLFloaterIMSession* floater = dynamic_cast<LLFloaterIMSession*>(*iter);
+ if (floater)
+ {
+ floater->reloadMessages(clean_messages);
+ }
+ }
+
+ LLFloaterIMNearbyChat* nearby_chat = LLFloaterReg::findTypedInstance<LLFloaterIMNearbyChat>("nearby_chat");
+ if (nearby_chat)
+ {
+ nearby_chat->reloadMessages(clean_messages);
+ }
+}
+
+// static
+void LLFloaterIMSessionTab::reloadEmptyFloaters()
+{
+ 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)
+ {
+ LLFloaterIMSession* floater = dynamic_cast<LLFloaterIMSession*>(*iter);
+ if (floater && floater->getLastChatMessageIndex() == -1)
+ {
+ floater->reloadMessages(true);
+ }
+ }
+
+ LLFloaterIMNearbyChat* nearby_chat = LLFloaterReg::findTypedInstance<LLFloaterIMNearbyChat>("nearby_chat");
+ if (nearby_chat && nearby_chat->getMessageArchiveLength() == 0)
+ {
+ nearby_chat->reloadMessages(true);
+ }
+}
+
+void LLFloaterIMSessionTab::updateCallBtnState(bool callIsActive)
+{
+ LLButton* voiceButton = getChild<LLButton>("voice_call_btn");
+ voiceButton->setImageOverlay(
+ callIsActive? getString("call_btn_stop") : getString("call_btn_start"));
+
+ voiceButton->setToolTip(
+ callIsActive? getString("end_call_button_tooltip") : getString("start_call_button_tooltip"));
+
+ enableDisableCallBtn();
+
+}
+
+void LLFloaterIMSessionTab::onSlide(LLFloaterIMSessionTab* self)
+{
+ LLFloaterIMContainer* host_floater = dynamic_cast<LLFloaterIMContainer*>(self->getHost());
+ if (host_floater)
+ {
+ // Hide the messages pane if a floater is hosted in the Conversations
+ host_floater->collapseMessagesPane(true);
+ }
+ else ///< floater is torn off
+ {
+ if (!self->mIsP2PChat)
+ {
+ bool should_be_expanded = self->mParticipantListPanel->isCollapsed();
+
+ // Expand/collapse the participant list panel
+ self->mParticipantListAndHistoryStack->collapsePanel(self->mParticipantListPanel, !should_be_expanded);
+ self->mParticipantListPanel->setVisible(should_be_expanded);
+ gSavedSettings.setBOOL("IMShowControlPanel", should_be_expanded);
+ self->mIsParticipantListExpanded = should_be_expanded;
+ self->mExpandCollapseBtn->setImageOverlay(self->getString(should_be_expanded ? "collapse_icon" : "expand_icon"));
+ }
+ }
+
+ self->assignResizeLimits();
+}
+
+void LLFloaterIMSessionTab::onCollapseToLine(LLFloaterIMSessionTab* self)
+{
+ LLFloaterIMContainer* host_floater = dynamic_cast<LLFloaterIMContainer*>(self->getHost());
+ if (!host_floater)
+ {
+ bool expand = self->isMessagePaneExpanded();
+ self->mExpandCollapseLineBtn->setImageOverlay(self->getString(expand ? "collapseline_icon" : "expandline_icon"));
+ self->mContentPanel->setVisible(!expand);
+ self->mToolbarPanel->setVisible(!expand);
+ self->reshapeFloater(expand);
+ self->setMessagePaneExpanded(!expand);
+ }
+}
+
+void LLFloaterIMSessionTab::reshapeFloater(bool collapse)
+{
+ LLRect floater_rect = getRect();
+
+ if(collapse)
+ {
+ mFloaterHeight = floater_rect.getHeight();
+ S32 height = mContentPanel->getRect().getHeight() + mToolbarPanel->getRect().getHeight();
+ floater_rect.mTop -= height;
+ enableResizeCtrls(true, true, false);
+ }
+ else
+ {
+ floater_rect.mTop = floater_rect.mBottom + mFloaterHeight;
+ enableResizeCtrls(true, true, true);
+
+ }
+
+ setShape(floater_rect, true);
+ mBodyStack->updateLayout();
+
+}
+
+void LLFloaterIMSessionTab::restoreFloater()
+{
+ if(!isMessagePaneExpanded())
+ {
+ if(isMinimized())
+ {
+ setMinimized(false);
+ }
+ mContentPanel->setVisible(true);
+ mToolbarPanel->setVisible(true);
+ LLRect floater_rect = getRect();
+ floater_rect.mTop = floater_rect.mBottom + mFloaterHeight;
+ setShape(floater_rect, true);
+ mBodyStack->updateLayout();
+ mExpandCollapseLineBtn->setImageOverlay(getString("expandline_icon"));
+ setMessagePaneExpanded(true);
+ enableResizeCtrls(true, true, true);
+ }
+}
+
+/*virtual*/
+void LLFloaterIMSessionTab::onOpen(const LLSD& key)
+{
+ if (!checkIfTornOff())
+ {
+ LLFloaterIMContainer* host_floater = dynamic_cast<LLFloaterIMContainer*>(getHost());
+ // Show the messages pane when opening a floater hosted in the Conversations
+ host_floater->collapseMessagesPane(false);
+ }
+
+ mInputButtonPanel->setVisible(isTornOff());
+}
+
+
+void LLFloaterIMSessionTab::onTearOffClicked()
+{
+ restoreFloater();
+ setFollows(isTornOff()? FOLLOWS_ALL : FOLLOWS_NONE);
+ mSaveRect = isTornOff();
+ initRectControl();
+ LLFloater::onClickTearOff(this);
+ LLFloaterIMContainer* container = LLFloaterReg::findTypedInstance<LLFloaterIMContainer>("im_container");
+
+ if (isTornOff())
+ {
+ container->selectAdjacentConversation(false);
+ forceReshape();
+ }
+ //Upon re-docking the torn off floater, select the corresponding conversation line item
+ else
+ {
+ container->selectConversation(mSessionID);
+
+ }
+ mInputButtonPanel->setVisible(isTornOff());
+
+ refreshConversation();
+ updateGearBtn();
+}
+
+void LLFloaterIMSessionTab::updateGearBtn()
+{
+
+ BOOL prevVisibility = mGearBtn->getVisible();
+ mGearBtn->setVisible(checkIfTornOff() && mIsP2PChat);
+
+
+ // Move buttons if Gear button changed visibility
+ if(prevVisibility != mGearBtn->getVisible())
+ {
+ LLRect gear_btn_rect = mGearBtn->getRect();
+ LLRect add_btn_rect = getChild<LLButton>("add_btn")->getRect();
+ LLRect call_btn_rect = getChild<LLButton>("voice_call_btn")->getRect();
+ S32 gap_width = call_btn_rect.mLeft - add_btn_rect.mRight;
+ S32 right_shift = gear_btn_rect.getWidth() + gap_width;
+ if(mGearBtn->getVisible())
+ {
+ // Move buttons to the right to give space for Gear button
+ add_btn_rect.translate(right_shift,0);
+ call_btn_rect.translate(right_shift,0);
+ }
+ else
+ {
+ add_btn_rect.translate(-right_shift,0);
+ call_btn_rect.translate(-right_shift,0);
+ }
+ getChild<LLButton>("add_btn")->setRect(add_btn_rect);
+ getChild<LLButton>("voice_call_btn")->setRect(call_btn_rect);
+ }
+}
+
+void LLFloaterIMSessionTab::initBtns()
+{
+ LLRect gear_btn_rect = mGearBtn->getRect();
+ LLRect add_btn_rect = getChild<LLButton>("add_btn")->getRect();
+ LLRect call_btn_rect = getChild<LLButton>("voice_call_btn")->getRect();
+ S32 gap_width = call_btn_rect.mLeft - add_btn_rect.mRight;
+ S32 right_shift = gear_btn_rect.getWidth() + gap_width;
+
+ add_btn_rect.translate(-right_shift,0);
+ call_btn_rect.translate(-right_shift,0);
+
+ getChild<LLButton>("add_btn")->setRect(add_btn_rect);
+ getChild<LLButton>("voice_call_btn")->setRect(call_btn_rect);
+}
+
+// static
+bool LLFloaterIMSessionTab::isChatMultiTab()
+{
+ // Restart is required in order to change chat window type.
+ return true;
+}
+
+bool LLFloaterIMSessionTab::checkIfTornOff()
+{
+ bool isTorn = !getHost();
+
+ if (isTorn != isTornOff())
+ {
+ setTornOff(isTorn);
+ refreshConversation();
+ }
+
+ return isTorn;
+}
+
+void LLFloaterIMSessionTab::doToSelected(const LLSD& userdata)
+{
+ // Get the list of selected items in the tab
+ std::string command = userdata.asString();
+ uuid_vec_t selected_uuids;
+ getSelectedUUIDs(selected_uuids);
+
+ // Perform the command (IM, profile, etc...) on the list using the general conversation container method
+ LLFloaterIMContainer* floater_container = LLFloaterIMContainer::getInstance();
+ // Note: By construction, those can only be participants so we can call doToParticipants() directly
+ floater_container->doToParticipants(command, selected_uuids);
+}
+
+bool LLFloaterIMSessionTab::enableContextMenuItem(const LLSD& userdata)
+{
+ // Get the list of selected items in the tab
+ std::string command = userdata.asString();
+ uuid_vec_t selected_uuids;
+ getSelectedUUIDs(selected_uuids);
+
+ // Perform the item enable test on the list using the general conversation container method
+ LLFloaterIMContainer* floater_container = LLFloaterIMContainer::getInstance();
+ return floater_container->enableContextMenuItem(command, selected_uuids);
+}
+
+bool LLFloaterIMSessionTab::checkContextMenuItem(const LLSD& userdata)
+{
+ // Get the list of selected items in the tab
+ std::string command = userdata.asString();
+ uuid_vec_t selected_uuids;
+ getSelectedUUIDs(selected_uuids);
+
+ // Perform the item check on the list using the general conversation container method
+ LLFloaterIMContainer* floater_container = LLFloaterIMContainer::getInstance();
+ return floater_container->checkContextMenuItem(command, selected_uuids);
+}
+
+void LLFloaterIMSessionTab::getSelectedUUIDs(uuid_vec_t& selected_uuids)
+{
+ const std::set<LLFolderViewItem*> selected_items = mConversationsRoot->getSelectionList();
+
+ std::set<LLFolderViewItem*>::const_iterator it = selected_items.begin();
+ const std::set<LLFolderViewItem*>::const_iterator it_end = selected_items.end();
+
+ for (; it != it_end; ++it)
+ {
+ LLConversationItem* conversation_item = static_cast<LLConversationItem *>((*it)->getViewModelItem());
+ selected_uuids.push_back(conversation_item->getUUID());
+ }
+}
+
+LLConversationItem* LLFloaterIMSessionTab::getCurSelectedViewModelItem()
+{
+ LLConversationItem *conversationItem = NULL;
+
+ if(mConversationsRoot &&
+ mConversationsRoot->getCurSelectedItem() &&
+ mConversationsRoot->getCurSelectedItem()->getViewModelItem())
+ {
+ conversationItem = static_cast<LLConversationItem *>(mConversationsRoot->getCurSelectedItem()->getViewModelItem()) ;
+ }
+
+ return conversationItem;
+}
+
+BOOL LLFloaterIMSessionTab::handleKeyHere(KEY key, MASK mask )
+{
+ if(mask == MASK_ALT)
+ {
+ LLFloaterIMContainer* floater_container = LLFloaterIMContainer::getInstance();
+ if (KEY_RETURN == key && !isTornOff())
+ {
+ floater_container->expandConversation();
+ }
+ if ((KEY_UP == key) || (KEY_LEFT == key))
+ {
+ floater_container->selectNextorPreviousConversation(false);
+ }
+ if ((KEY_DOWN == key ) || (KEY_RIGHT == key))
+ {
+ floater_container->selectNextorPreviousConversation(true);
+ }
+ }
+ return TRUE;
+}
diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h
new file mode 100644
index 0000000000..f0899a3c09
--- /dev/null
+++ b/indra/newview/llfloaterimsessiontab.h
@@ -0,0 +1,214 @@
+/**
+ * @file llfloaterimsessiontab.h
+ * @brief LLFloaterIMSessionTab class implements the common behavior of LNearbyChatBar
+ * @brief and LLFloaterIMSession for hosting both in LLIMContainer
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_FLOATERIMSESSIONTAB_H
+#define LL_FLOATERIMSESSIONTAB_H
+
+#include "lllayoutstack.h"
+#include "llparticipantlist.h"
+#include "lltransientdockablefloater.h"
+#include "llviewercontrol.h"
+#include "lleventtimer.h"
+#include "llimview.h"
+#include "llconversationmodel.h"
+#include "llconversationview.h"
+#include "lltexteditor.h"
+
+class LLPanelChatControlPanel;
+class LLChatEntry;
+class LLChatHistory;
+
+class LLFloaterIMSessionTab
+ : public LLTransientDockableFloater
+{
+
+public:
+ LOG_CLASS(LLFloaterIMSessionTab);
+
+ LLFloaterIMSessionTab(const LLSD& session_id);
+ ~LLFloaterIMSessionTab();
+
+ // reload all message with new settings of visual modes
+ static void processChatHistoryStyleUpdate(bool clean_messages = false);
+ static void reloadEmptyFloaters();
+
+ /**
+ * Returns true if chat is displayed in multi tabbed floater
+ * false if chat is displayed in multiple windows
+ */
+ static bool isChatMultiTab();
+
+ // add conversation to container
+ static void addToHost(const LLUUID& session_id);
+
+ bool isHostAttached() {return mIsHostAttached;}
+ void setHostAttached(bool is_attached) {mIsHostAttached = is_attached;}
+
+ static LLFloaterIMSessionTab* findConversation(const LLUUID& uuid);
+ static LLFloaterIMSessionTab* getConversation(const LLUUID& uuid);
+
+ // show/hide the translation check box
+ void showTranslationCheckbox(const BOOL visible = FALSE);
+
+ bool isNearbyChat() {return mIsNearbyChat;}
+
+ // LLFloater overrides
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void draw();
+ /*virtual*/ void setVisible(BOOL visible);
+ /*virtual*/ void setFocus(BOOL focus);
+
+ // Handle the left hand participant list widgets
+ void addConversationViewParticipant(LLConversationItem* item);
+ void removeConversationViewParticipant(const LLUUID& participant_id);
+ void updateConversationViewParticipant(const LLUUID& participant_id);
+ void refreshConversation();
+ void buildConversationViewParticipant();
+
+ void setSortOrder(const LLConversationSort& order);
+ virtual void onTearOffClicked();
+ void updateGearBtn();
+ void initBtns();
+ virtual void updateMessages() {}
+ LLConversationItem* getCurSelectedViewModelItem();
+ void forceReshape();
+ virtual BOOL handleKeyHere( KEY key, MASK mask );
+ bool isMessagePaneExpanded(){return mMessagePaneExpanded;}
+ void setMessagePaneExpanded(bool expanded){mMessagePaneExpanded = expanded;}
+ void restoreFloater();
+
+protected:
+
+ // callback for click on any items of the visual states menu
+ void onIMSessionMenuItemClicked(const LLSD& userdata);
+
+ // callback for check/uncheck of the expanded/collapse mode's switcher
+ bool onIMCompactExpandedMenuItemCheck(const LLSD& userdata);
+
+ //
+ bool onIMShowModesMenuItemCheck(const LLSD& userdata);
+ bool onIMShowModesMenuItemEnable(const LLSD& userdata);
+ static void onSlide(LLFloaterIMSessionTab *self);
+ static void onCollapseToLine(LLFloaterIMSessionTab *self);
+ void reshapeFloater(bool collapse);
+
+ // refresh a visual state of the Call button
+ void updateCallBtnState(bool callIsActive);
+
+ void hideOrShowTitle(); // toggle the floater's drag handle
+ void hideAllStandardButtons();
+
+ /// Update floater header and toolbar buttons when hosted/torn off state is toggled.
+ void updateHeaderAndToolbar();
+
+ // Update the input field help text and other places that need the session name
+ virtual void updateSessionName(const std::string& name);
+
+ // set the enable/disable state for the Call button
+ virtual void enableDisableCallBtn();
+
+ // process focus events to set a currently active session
+ /* virtual */ void onFocusLost();
+ /* virtual */ void onFocusReceived();
+
+ // prepare chat's params and out one message to chatHistory
+ void appendMessage(const LLChat& chat, const LLSD &args = 0);
+
+ std::string appendTime();
+ void assignResizeLimits();
+
+ S32 mFloaterExtraWidth;
+
+ bool mIsNearbyChat;
+ bool mIsP2PChat;
+
+ bool mMessagePaneExpanded;
+ bool mIsParticipantListExpanded;
+
+
+ LLIMModel::LLIMSession* mSession;
+
+ // Participants list: model and view
+ LLConversationViewParticipant* createConversationViewParticipant(LLConversationItem* item);
+
+ LLUUID mSessionID;
+ LLLayoutStack* mBodyStack;
+ LLLayoutStack* mParticipantListAndHistoryStack;
+ LLLayoutPanel* mParticipantListPanel; // add the widgets to that see mConversationsListPanel
+ LLLayoutPanel* mRightPartPanel;
+ LLLayoutPanel* mContentPanel;
+ LLLayoutPanel* mToolbarPanel;
+ LLLayoutPanel* mInputButtonPanel;
+ LLParticipantList* getParticipantList();
+ conversations_widgets_map mConversationsWidgets;
+ LLConversationViewModel mConversationViewModel;
+ LLFolderView* mConversationsRoot;
+ LLScrollContainer* mScroller;
+
+ LLOutputMonitorCtrl* mSpeakingIndicator;
+ LLChatHistory* mChatHistory;
+ LLChatEntry* mInputEditor;
+ LLLayoutPanel * mChatLayoutPanel;
+ int mInputEditorPad; // padding between input field and chat history
+
+ LLButton* mExpandCollapseLineBtn;
+ LLButton* mExpandCollapseBtn;
+ LLButton* mTearOffBtn;
+ LLButton* mCloseBtn;
+ LLButton* mGearBtn;
+
+ S32 mFloaterHeight;
+
+
+private:
+ // Handling selection and contextual menu
+ void doToSelected(const LLSD& userdata);
+ bool enableContextMenuItem(const LLSD& userdata);
+ bool checkContextMenuItem(const LLSD& userdata);
+
+ void getSelectedUUIDs(uuid_vec_t& selected_uuids);
+
+ /// Refreshes the floater at a constant rate.
+ virtual void refresh() = 0;
+
+ /**
+ * Adjusts chat history height to fit vertically with input chat field
+ * and avoid overlapping, since input chat field can be vertically expanded.
+ * Implementation: chat history bottom "follows" top+top_pad of input chat field
+ */
+ void reshapeChatLayoutPanel();
+
+ bool checkIfTornOff();
+ bool mIsHostAttached;
+ bool mHasVisibleBeenInitialized;
+
+ LLTimer* mRefreshTimer; ///< Defines the rate at which refresh() is called.
+};
+
+
+#endif /* LL_FLOATERIMSESSIONTAB_H */
diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp
index cece8d299c..5a1dfc99ab 100644
--- a/indra/newview/llfloaterinspect.cpp
+++ b/indra/newview/llfloaterinspect.cpp
@@ -46,7 +46,9 @@
LLFloaterInspect::LLFloaterInspect(const LLSD& key)
: LLFloater(key),
- mDirty(FALSE)
+ mDirty(FALSE),
+ mOwnerNameCacheConnection(),
+ mCreatorNameCacheConnection()
{
mCommitCallbackRegistrar.add("Inspect.OwnerProfile", boost::bind(&LLFloaterInspect::onClickOwnerProfile, this));
mCommitCallbackRegistrar.add("Inspect.CreatorProfile", boost::bind(&LLFloaterInspect::onClickCreatorProfile, this));
@@ -67,6 +69,14 @@ BOOL LLFloaterInspect::postBuild()
LLFloaterInspect::~LLFloaterInspect(void)
{
+ if (mOwnerNameCacheConnection.connected())
+ {
+ mOwnerNameCacheConnection.disconnect();
+ }
+ if (mCreatorNameCacheConnection.connected())
+ {
+ mCreatorNameCacheConnection.disconnect();
+ }
if(!LLFloaterReg::instanceVisible("build"))
{
if(LLToolMgr::getInstance()->getBaseTool() == LLToolCompInspect::getInstance())
@@ -80,7 +90,6 @@ LLFloaterInspect::~LLFloaterInspect(void)
{
LLFloaterReg::showInstance("build", LLSD(), TRUE);
}
- //sInstance = NULL;
}
void LLFloaterInspect::onOpen(const LLSD& key)
@@ -167,15 +176,6 @@ LLUUID LLFloaterInspect::getSelectedUUID()
return LLUUID::null;
}
-void LLFloaterInspect::onGetAvNameCallback(const LLUUID& idCreator, const LLAvatarName& av_name, void* FloaterPtr)
-{
- if (FloaterPtr)
- {
- LLFloaterInspect* floater = (LLFloaterInspect*)FloaterPtr;
- floater->dirty();
- }
-}
-
void LLFloaterInspect::refresh()
{
LLUUID creator_id;
@@ -229,7 +229,11 @@ void LLFloaterInspect::refresh()
else
{
owner_name = LLTrans::getString("RetrievingData");
- LLAvatarNameCache::get(idOwner, boost::bind(&LLFloaterInspect::onGetAvNameCallback, _1, _2, this));
+ if (mOwnerNameCacheConnection.connected())
+ {
+ mOwnerNameCacheConnection.disconnect();
+ }
+ mOwnerNameCacheConnection = LLAvatarNameCache::get(idOwner, boost::bind(&LLFloaterInspect::onGetOwnerNameCallback, this));
}
if (LLAvatarNameCache::get(idCreator, &av_name))
@@ -239,7 +243,11 @@ void LLFloaterInspect::refresh()
else
{
creator_name = LLTrans::getString("RetrievingData");
- LLAvatarNameCache::get(idCreator, boost::bind(&LLFloaterInspect::onGetAvNameCallback, _1, _2, this));
+ if (mCreatorNameCacheConnection.connected())
+ {
+ mCreatorNameCacheConnection.disconnect();
+ }
+ mCreatorNameCacheConnection = LLAvatarNameCache::get(idCreator, boost::bind(&LLFloaterInspect::onGetCreatorNameCallback, this));
}
row["id"] = obj->getObject()->getID();
@@ -289,6 +297,18 @@ void LLFloaterInspect::dirty()
setDirty();
}
+void LLFloaterInspect::onGetOwnerNameCallback()
+{
+ mOwnerNameCacheConnection.disconnect();
+ setDirty();
+}
+
+void LLFloaterInspect::onGetCreatorNameCallback()
+{
+ mCreatorNameCacheConnection.disconnect();
+ setDirty();
+}
+
void LLFloaterInspect::draw()
{
if (mDirty)
diff --git a/indra/newview/llfloaterinspect.h b/indra/newview/llfloaterinspect.h
index 7ee83ccdb4..44381eac96 100644
--- a/indra/newview/llfloaterinspect.h
+++ b/indra/newview/llfloaterinspect.h
@@ -55,8 +55,6 @@ public:
void onClickOwnerProfile();
void onSelectObject();
- static void onGetAvNameCallback(const LLUUID& idCreator, const LLAvatarName& av_name, void* FloaterPtr);
-
LLScrollListCtrl* mObjectList;
protected:
// protected members
@@ -64,13 +62,15 @@ protected:
bool mDirty;
private:
+ void onGetOwnerNameCallback();
+ void onGetCreatorNameCallback();
LLFloaterInspect(const LLSD& key);
virtual ~LLFloaterInspect(void);
- // static data
-// static LLFloaterInspect* sInstance;
LLSafeHandle<LLObjectSelection> mObjectSelection;
+ boost::signals2::connection mOwnerNameCacheConnection;
+ boost::signals2::connection mCreatorNameCacheConnection;
};
#endif //LL_LLFLOATERINSPECT_H
diff --git a/indra/newview/llfloaterjoystick.cpp b/indra/newview/llfloaterjoystick.cpp
index c37798c330..d0c22d25f2 100644
--- a/indra/newview/llfloaterjoystick.cpp
+++ b/indra/newview/llfloaterjoystick.cpp
@@ -33,6 +33,7 @@
#include "llerror.h"
#include "llrect.h"
#include "llstring.h"
+#include "llstat.h"
// project includes
#include "lluictrlfactory.h"
@@ -83,7 +84,8 @@ BOOL LLFloaterJoystick::postBuild()
for (U32 i = 0; i < 6; i++)
{
- mAxisStats[i] = new LLStat(4);
+ std::string stat_name(llformat("Joystick axis %d", i));
+ mAxisStats[i] = new LLStat(stat_name, 4);
std::string axisname = llformat("axis%d", i);
mAxisStatsBar[i] = getChild<LLStatBar>(axisname);
if (mAxisStatsBar[i])
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 55f3d548ec..0a30fef768 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -783,8 +783,9 @@ void LLPanelLandGeneral::refresh()
mBtnReleaseLand->setEnabled( can_release );
}
- BOOL use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST) && !LLViewerParcelMgr::getInstance()->isCollisionBanned();;
+ BOOL use_pass = parcel->getOwnerID()!= gAgent.getID() && parcel->getParcelFlag(PF_USE_PASS_LIST) && !LLViewerParcelMgr::getInstance()->isCollisionBanned();;
mBtnBuyPass->setEnabled(use_pass);
+
}
}
@@ -1045,6 +1046,8 @@ void LLPanelLandGeneral::onCommitAny(LLUICtrl *ctrl, void *userdata)
void LLPanelLandGeneral::onClickSellLand(void* data)
{
LLViewerParcelMgr::getInstance()->startSellLand();
+ LLPanelLandGeneral *panelp = (LLPanelLandGeneral *)data;
+ panelp->refresh();
}
// static
@@ -2733,11 +2736,13 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
void LLPanelLandAccess::onClickAddAccess()
{
+ LLView * button = findChild<LLButton>("add_allowed");
+ LLFloater * root_floater = gFloaterView->getParentFloater(this);
LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(
- boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1));
+ boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1), FALSE, FALSE, FALSE, root_floater->getName(), button);
if (picker)
{
- gFloaterView->getParentFloater(this)->addDependentFloater(picker);
+ root_floater->addDependentFloater(picker);
}
}
@@ -2782,11 +2787,13 @@ void LLPanelLandAccess::onClickRemoveAccess(void* data)
// static
void LLPanelLandAccess::onClickAddBanned()
{
+ LLView * button = findChild<LLButton>("add_banned");
+ LLFloater * root_floater = gFloaterView->getParentFloater(this);
LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(
- boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1));
+ boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1), FALSE, FALSE, FALSE, root_floater->getName(), button);
if (picker)
{
- gFloaterView->getParentFloater(this)->addDependentFloater(picker);
+ root_floater->addDependentFloater(picker);
}
}
diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp
index a65e9e911a..473e2938be 100644
--- a/indra/newview/llfloatermap.cpp
+++ b/indra/newview/llfloatermap.cpp
@@ -122,16 +122,13 @@ BOOL LLFloaterMap::handleDoubleClick(S32 x, S32 y, MASK mask)
LLVector3d pos_global = mMap->viewPosToGlobal(x, y);
- // If we're not tracking a beacon already, double-click will set one
- if (!LLTracker::isTracking(NULL))
+ LLTracker::stopTracking(NULL);
+ LLFloaterWorldMap* world_map = LLFloaterWorldMap::getInstance();
+ if (world_map)
{
- LLFloaterWorldMap* world_map = LLFloaterWorldMap::getInstance();
- if (world_map)
- {
- world_map->trackLocation(pos_global);
- }
+ world_map->trackLocation(pos_global);
}
-
+
if (gSavedSettings.getBOOL("DoubleClickTeleport"))
{
// If DoubleClickTeleport is on, double clicking the minimap will teleport there
@@ -249,3 +246,8 @@ void LLFloaterMap::handleZoom(const LLSD& userdata)
mMap->setScale(scale);
}
}
+
+LLFloaterMap* LLFloaterMap::getInstance()
+{
+ return LLFloaterReg::getTypedInstance<LLFloaterMap>("mini_map");
+}
diff --git a/indra/newview/llfloatermap.h b/indra/newview/llfloatermap.h
index 8a1b965e62..ff2fb20535 100644
--- a/indra/newview/llfloatermap.h
+++ b/indra/newview/llfloatermap.h
@@ -39,6 +39,7 @@ class LLFloaterMap : public LLFloater
{
public:
LLFloaterMap(const LLSD& key);
+ static LLFloaterMap* getInstance();
virtual ~LLFloaterMap();
/*virtual*/ BOOL postBuild();
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index a071f338ba..ea839e6f5a 100755
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -737,6 +737,20 @@ void LLFloaterModelPreview::onAutoFillCommit(LLUICtrl* ctrl, void* userdata)
void LLFloaterModelPreview::onLODParamCommit(S32 lod, bool enforce_tri_limit)
{
mModelPreview->onLODParamCommit(lod, enforce_tri_limit);
+
+ //refresh LoDs that reference this one
+ for (S32 i = lod - 1; i >= 0; --i)
+ {
+ LLComboBox* lod_source_combo = getChild<LLComboBox>("lod_source_" + lod_name[i]);
+ if (lod_source_combo->getCurrentIndex() == LLModelPreview::USE_LOD_ABOVE)
+ {
+ onLoDSourceCommit(i);
+ }
+ else
+ {
+ break;
+ }
+ }
}
@@ -3870,15 +3884,30 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
U32 triangle_count = 0;
- for (LLModelLoader::model_list::iterator iter = mBaseModel.begin(); iter != mBaseModel.end(); ++iter)
+ U32 instanced_triangle_count = 0;
+
+ //get the triangle count for the whole scene
+ for (LLModelLoader::scene::iterator iter = mBaseScene.begin(), endIter = mBaseScene.end(); iter != endIter; ++iter)
{
- LLModel* mdl = *iter;
- for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
+ for (LLModelLoader::model_instance_list::iterator instance = iter->second.begin(), end_instance = iter->second.end(); instance != end_instance; ++instance)
{
- triangle_count += mdl->getVolumeFace(i).mNumIndices/3;
+ LLModel* mdl = instance->mModel;
+ if (mdl)
+ {
+ instanced_triangle_count += mdl->getNumTriangles();
+ }
}
}
+ //get the triangle count for the non-instanced set of models
+ for (U32 i = 0; i < mBaseModel.size(); ++i)
+ {
+ triangle_count += mBaseModel[i]->getNumTriangles();
+ }
+
+ //get ratio of uninstanced triangles to instanced triangles
+ F32 triangle_ratio = (F32) triangle_count / (F32) instanced_triangle_count;
+
U32 base_triangle_count = triangle_count;
U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
@@ -3912,6 +3941,8 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
if (which_lod > -1 && which_lod < NUM_LOD)
{
limit = mFMP->childGetValue("lod_triangle_limit_" + lod_name[which_lod]).asInteger();
+ //convert from "scene wide" to "non-instanced" triangle limit
+ limit = (S32) ( (F32) limit*triangle_ratio );
}
}
else
@@ -4017,7 +4048,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
U32 actual_verts = 0;
U32 submeshes = 0;
- mRequestedTriangleCount[lod] = triangle_count;
+ mRequestedTriangleCount[lod] = (S32) ( (F32) triangle_count / triangle_ratio );
mRequestedErrorThreshold[lod] = lod_error_threshold;
glodGroupParameteri(mGroup, GLOD_ADAPT_MODE, lod_mode);
@@ -4199,28 +4230,36 @@ void LLModelPreview::updateStatusMessages()
//initialize total for this lod to 0
total_tris[lod] = total_verts[lod] = total_submeshes[lod] = 0;
- for (U32 i = 0; i < mModel[lod].size(); ++i)
- { //for each model in the lod
- S32 cur_tris = 0;
- S32 cur_verts = 0;
- S32 cur_submeshes = mModel[lod][i]->getNumVolumeFaces();
-
- for (S32 j = 0; j < cur_submeshes; ++j)
- { //for each submesh (face), add triangles and vertices to current total
- const LLVolumeFace& face = mModel[lod][i]->getVolumeFace(j);
- cur_tris += face.mNumIndices/3;
- cur_verts += face.mNumVertices;
- }
+ for (LLModelLoader::scene::iterator iter = mScene[lod].begin(), endIter = mScene[lod].end(); iter != endIter; ++iter)
+ {
+ for (LLModelLoader::model_instance_list::iterator instance = iter->second.begin(), end_instance = iter->second.end(); instance != end_instance; ++instance)
+ {
+ LLModel* model = instance->mModel;
+ if (model)
+ {
+ //for each model in the lod
+ S32 cur_tris = 0;
+ S32 cur_verts = 0;
+ S32 cur_submeshes = model->getNumVolumeFaces();
+
+ for (S32 j = 0; j < cur_submeshes; ++j)
+ { //for each submesh (face), add triangles and vertices to current total
+ const LLVolumeFace& face = model->getVolumeFace(j);
+ cur_tris += face.mNumIndices/3;
+ cur_verts += face.mNumVertices;
+ }
- //add this model to the lod total
- total_tris[lod] += cur_tris;
- total_verts[lod] += cur_verts;
- total_submeshes[lod] += cur_submeshes;
+ //add this model to the lod total
+ total_tris[lod] += cur_tris;
+ total_verts[lod] += cur_verts;
+ total_submeshes[lod] += cur_submeshes;
- //store this model's counts to asset data
- tris[lod].push_back(cur_tris);
- verts[lod].push_back(cur_verts);
- submeshes[lod].push_back(cur_submeshes);
+ //store this model's counts to asset data
+ tris[lod].push_back(cur_tris);
+ verts[lod].push_back(cur_verts);
+ submeshes[lod].push_back(cur_submeshes);
+ }
+ }
}
}
@@ -4397,34 +4436,38 @@ void LLModelPreview::updateStatusMessages()
}
//add up physics triangles etc
- S32 start = 0;
- S32 end = mModel[LLModel::LOD_PHYSICS].size();
-
S32 phys_tris = 0;
S32 phys_hulls = 0;
S32 phys_points = 0;
- for (S32 i = start; i < end; ++i)
- { //add up hulls and points and triangles for selected mesh(es)
- LLModel* model = mModel[LLModel::LOD_PHYSICS][i];
- S32 cur_submeshes = model->getNumVolumeFaces();
-
- LLModel::convex_hull_decomposition& decomp = model->mPhysics.mHull;
-
- if (!decomp.empty())
+ //get the triangle count for the whole scene
+ for (LLModelLoader::scene::iterator iter = mScene[LLModel::LOD_PHYSICS].begin(), endIter = mScene[LLModel::LOD_PHYSICS].end(); iter != endIter; ++iter)
+ {
+ for (LLModelLoader::model_instance_list::iterator instance = iter->second.begin(), end_instance = iter->second.end(); instance != end_instance; ++instance)
{
- phys_hulls += decomp.size();
- for (U32 i = 0; i < decomp.size(); ++i)
+ LLModel* model = instance->mModel;
+ if (model)
{
- phys_points += decomp[i].size();
- }
- }
- else
- { //choose physics shape OR decomposition, can't use both
- for (S32 j = 0; j < cur_submeshes; ++j)
- { //for each submesh (face), add triangles and vertices to current total
- const LLVolumeFace& face = model->getVolumeFace(j);
- phys_tris += face.mNumIndices/3;
+ S32 cur_submeshes = model->getNumVolumeFaces();
+
+ LLModel::convex_hull_decomposition& decomp = model->mPhysics.mHull;
+
+ if (!decomp.empty())
+ {
+ phys_hulls += decomp.size();
+ for (U32 i = 0; i < decomp.size(); ++i)
+ {
+ phys_points += decomp[i].size();
+ }
+ }
+ else
+ { //choose physics shape OR decomposition, can't use both
+ for (S32 j = 0; j < cur_submeshes; ++j)
+ { //for each submesh (face), add triangles and vertices to current total
+ const LLVolumeFace& face = model->getVolumeFace(j);
+ phys_tris += face.mNumIndices/3;
+ }
+ }
}
}
}
@@ -4588,7 +4631,7 @@ void LLModelPreview::updateLodControls(S32 lod)
if (!lod_combo) return;
S32 lod_mode = lod_combo->getCurrentIndex();
- if (lod_mode == 0) // LoD from file
+ if (lod_mode == LOD_FROM_FILE) // LoD from file
{
fmp->mLODMode[lod] = 0;
for (U32 i = 0; i < num_file_controls; ++i)
@@ -4601,7 +4644,7 @@ void LLModelPreview::updateLodControls(S32 lod)
mFMP->childHide(lod_controls[i] + lod_name[lod]);
}
}
- else if (lod_mode == 2) // use LoD above
+ else if (lod_mode == USE_LOD_ABOVE) // use LoD above
{
fmp->mLODMode[lod] = 2;
for (U32 i = 0; i < num_file_controls; ++i)
@@ -5073,6 +5116,11 @@ BOOL LLModelPreview::render()
refresh();
}
+ if (use_shaders)
+ {
+ gObjectPreviewProgram.bind();
+ }
+
gGL.loadIdentity();
gPipeline.enableLightsPreview();
@@ -5098,11 +5146,6 @@ BOOL LLModelPreview::render()
const U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
- if (use_shaders)
- {
- gObjectPreviewProgram.bind();
- }
-
LLGLEnable normalize(GL_NORMALIZE);
if (!mBaseModel.empty() && mVertexBuffer[5].empty())
@@ -5291,7 +5334,7 @@ BOOL LLModelPreview::render()
hull_colors.push_back(LLColor4U(rand()%128+127, rand()%128+127, rand()%128+127, 128));
}
- glColor4ubv(hull_colors[i].mV);
+ gGL.diffuseColor4ubv(hull_colors[i].mV);
LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals);
if (explode > 0.f)
@@ -5762,6 +5805,12 @@ void LLFloaterModelPreview::onLoDSourceCommit(S32 lod)
{
mModelPreview->updateLodControls(lod);
refresh();
+
+ LLComboBox* lod_source_combo = getChild<LLComboBox>("lod_source_" + lod_name[lod]);
+ if (lod_source_combo->getCurrentIndex() == LLModelPreview::GENERATE)
+ { //rebuild LoD to update triangle counts
+ onLODParamCommit(lod, true);
+ }
}
void LLFloaterModelPreview::resetDisplayOptions()
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index ab319c30d5..e588418f7b 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -311,6 +311,15 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
typedef boost::signals2::signal<void (bool)> model_updated_signal_t;
public:
+
+ typedef enum
+ {
+ LOD_FROM_FILE = 0,
+ GENERATE,
+ USE_LOD_ABOVE,
+ } eLoDMode;
+
+public:
LLModelPreview(S32 width, S32 height, LLFloater* fmp);
virtual ~LLModelPreview();
diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp
index 2681d4b34d..4f35c325a8 100644
--- a/indra/newview/llfloaternotificationsconsole.cpp
+++ b/indra/newview/llfloaternotificationsconsole.cpp
@@ -44,21 +44,16 @@ public:
BOOL postBuild();
private:
- bool update(const LLSD& payload, bool passed_filter);
+ bool update(const LLSD& payload);
static void toggleClick(void* user_data);
static void onClickNotification(void* user_data);
- static void onClickNotificationReject(void* user_data);
LLNotificationChannelPtr mChannelPtr;
- LLNotificationChannelPtr mChannelRejectsPtr;
};
LLNotificationChannelPanel::LLNotificationChannelPanel(const LLNotificationChannelPanel::Params& p)
: LLLayoutPanel(p)
{
mChannelPtr = LLNotifications::instance().getChannel(p.name);
- mChannelRejectsPtr = LLNotificationChannelPtr(
- LLNotificationChannel::buildChannel(p.name() + "rejects", mChannelPtr->getParentChannelName(),
- !boost::bind(mChannelPtr->getFilter(), _1)));
buildFromFile( "panel_notifications_channel.xml");
}
@@ -68,15 +63,11 @@ BOOL LLNotificationChannelPanel::postBuild()
header_button->setLabel(mChannelPtr->getName());
header_button->setClickedCallback(toggleClick, this);
- mChannelPtr->connectChanged(boost::bind(&LLNotificationChannelPanel::update, this, _1, true));
- mChannelRejectsPtr->connectChanged(boost::bind(&LLNotificationChannelPanel::update, this, _1, false));
+ mChannelPtr->connectChanged(boost::bind(&LLNotificationChannelPanel::update, this, _1));
LLScrollListCtrl* scroll = getChild<LLScrollListCtrl>("notifications_list");
scroll->setDoubleClickCallback(onClickNotification, this);
scroll->setRect(LLRect( getRect().mLeft, getRect().mTop, getRect().mRight, 0));
- scroll = getChild<LLScrollListCtrl>("notification_rejects_list");
- scroll->setDoubleClickCallback(onClickNotificationReject, this);
- scroll->setRect(LLRect( getRect().mLeft, getRect().mTop, getRect().mRight, 0));
return TRUE;
}
@@ -97,8 +88,6 @@ void LLNotificationChannelPanel::toggleClick(void *user_data)
// turn off tab stop for collapsed panel
self->getChild<LLScrollListCtrl>("notifications_list")->setTabStop(!header_button->getToggleState());
self->getChild<LLScrollListCtrl>("notifications_list")->setVisible(!header_button->getToggleState());
- self->getChild<LLScrollListCtrl>("notification_rejects_list")->setTabStop(!header_button->getToggleState());
- self->getChild<LLScrollListCtrl>("notification_rejects_list")->setVisible(!header_button->getToggleState());
}
/*static*/
@@ -118,24 +107,7 @@ void LLNotificationChannelPanel::onClickNotification(void* user_data)
}
}
-/*static*/
-void LLNotificationChannelPanel::onClickNotificationReject(void* user_data)
-{
- LLNotificationChannelPanel* self = (LLNotificationChannelPanel*)user_data;
- if (!self) return;
- LLScrollListItem* firstselected = self->getChild<LLScrollListCtrl>("notification_rejects_list")->getFirstSelected();
- llassert(firstselected);
- if (firstselected)
- {
- void* data = firstselected->getUserdata();
- if (data)
- {
- gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE);
- }
- }
-}
-
-bool LLNotificationChannelPanel::update(const LLSD& payload, bool passed_filter)
+bool LLNotificationChannelPanel::update(const LLSD& payload)
{
LLNotificationPtr notification = LLNotifications::instance().find(payload["id"].asUUID());
if (notification)
@@ -151,9 +123,7 @@ bool LLNotificationChannelPanel::update(const LLSD& payload, bool passed_filter)
row["columns"][2]["column"] = "date";
row["columns"][2]["type"] = "date";
- LLScrollListItem* sli = passed_filter ?
- getChild<LLScrollListCtrl>("notifications_list")->addElement(row) :
- getChild<LLScrollListCtrl>("notification_rejects_list")->addElement(row);
+ LLScrollListItem* sli = getChild<LLScrollListCtrl>("notifications_list")->addElement(row);
sli->setUserdata(&(*notification));
}
diff --git a/indra/newview/llfloateroutbox.cpp b/indra/newview/llfloateroutbox.cpp
index 540f977305..29a3e6ac3a 100644
--- a/indra/newview/llfloateroutbox.cpp
+++ b/indra/newview/llfloateroutbox.cpp
@@ -44,14 +44,17 @@
#include "llviewernetwork.h"
#include "llwindowshade.h"
-#define USE_WINDOWSHADE_DIALOGS 0
-
///----------------------------------------------------------------------------
/// LLOutboxNotification class
///----------------------------------------------------------------------------
-bool LLNotificationsUI::LLOutboxNotification::processNotification(const LLSD& notify)
+LLNotificationsUI::LLOutboxNotification::LLOutboxNotification()
+ : LLSystemNotificationHandler("Outbox", "outbox")
+{
+}
+
+bool LLNotificationsUI::LLOutboxNotification::processNotification(const LLNotificationPtr& notify)
{
LLFloaterOutbox* outbox_floater = LLFloaterReg::getTypedInstance<LLFloaterOutbox>("outbox");
@@ -60,6 +63,14 @@ bool LLNotificationsUI::LLOutboxNotification::processNotification(const LLSD& no
return false;
}
+void LLNotificationsUI::LLOutboxNotification::onDelete(LLNotificationPtr p)
+{
+ LLNotificationsUI::LLNotificationHandler * notification_handler = dynamic_cast<LLNotificationsUI::LLNotificationHandler*>(LLNotifications::instance().getChannel("AlertModal").get());
+ if (notification_handler)
+ {
+ notification_handler->onDelete(p);
+ }
+}
///----------------------------------------------------------------------------
/// LLOutboxAddedObserver helper class
@@ -168,9 +179,8 @@ void LLFloaterOutbox::onOpen(const LLSD& key)
if (mOutboxId.isNull())
{
const bool do_not_create_folder = false;
- const bool do_not_find_in_library = false;
- const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, do_not_create_folder, do_not_find_in_library);
+ const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, do_not_create_folder);
if (outbox_id.isNull())
{
@@ -244,8 +254,9 @@ void LLFloaterOutbox::setupOutbox(const LLUUID& outboxId)
mOutboxInventoryPanel->setShape(inventory_placeholder_rect);
// Set the sort order newest to oldest
- mOutboxInventoryPanel->setSortOrder(LLInventoryFilter::SO_FOLDERS_BY_NAME);
- mOutboxInventoryPanel->getFilter()->markDefault();
+
+ mOutboxInventoryPanel->getFolderViewModel()->setSorter(LLInventoryFilter::SO_FOLDERS_BY_NAME);
+ mOutboxInventoryPanel->getFilter().markDefault();
fetchOutboxContents();
@@ -380,7 +391,7 @@ BOOL LLFloaterOutbox::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
// Determine if the mouse is inside the inventory panel itself or just within the floater
bool pointInInventoryPanel = false;
bool pointInInventoryPanelChild = false;
- LLFolderView * root_folder = mOutboxInventoryPanel->getRootFolder();
+ LLFolderView* root_folder = mOutboxInventoryPanel->getRootFolder();
if (mOutboxInventoryPanel->getVisible())
{
S32 inv_x, inv_y;
@@ -437,10 +448,10 @@ void LLFloaterOutbox::onOutboxChanged()
{
llassert(!mOutboxId.isNull());
- if (mOutboxInventoryPanel)
- {
- mOutboxInventoryPanel->requestSort();
- }
+ //if (mOutboxInventoryPanel)
+ //{
+ // mOutboxInventoryPanel->requestSort();
+ //}
fetchOutboxContents();
@@ -516,52 +527,11 @@ void LLFloaterOutbox::initializationReportError(U32 status, const LLSD& content)
updateView();
}
-void LLFloaterOutbox::showNotification(const LLSD& notify)
+void LLFloaterOutbox::showNotification(const LLNotificationPtr& notification)
{
- LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());
-
- if (!notification)
- {
- llerrs << "Unable to find outbox notification!" << notify.asString() << llendl;
-
- return;
- }
-
-#if USE_WINDOWSHADE_DIALOGS
-
- if (mWindowShade)
- {
- delete mWindowShade;
- }
-
- LLRect floater_rect = getLocalRect();
- floater_rect.mTop -= getHeaderHeight();
- floater_rect.stretch(-5, 0);
-
- LLWindowShade::Params params;
- params.name = "notification_shade";
- params.rect = floater_rect;
- params.follows.flags = FOLLOWS_ALL;
- params.modal = true;
- params.can_close = false;
- params.shade_color = LLColor4::white % 0.25f;
- params.text_color = LLColor4::white;
-
- mWindowShade = LLUICtrlFactory::create<LLWindowShade>(params);
-
- addChild(mWindowShade);
- mWindowShade->show(notification);
-
-#else
-
- LLNotificationsUI::LLEventHandler * handler =
- LLNotificationsUI::LLNotificationManager::instance().getHandlerForNotification("alertmodal");
-
- LLNotificationsUI::LLSysHandler * sys_handler = dynamic_cast<LLNotificationsUI::LLSysHandler *>(handler);
- llassert(sys_handler);
-
- sys_handler->processNotification(notify);
+ LLNotificationsUI::LLNotificationHandler * notification_handler = dynamic_cast<LLNotificationsUI::LLNotificationHandler*>(LLNotifications::instance().getChannel("AlertModal").get());
+ llassert(notification_handler);
-#endif
+ notification_handler->processNotification(notification);
}
diff --git a/indra/newview/llfloateroutbox.h b/indra/newview/llfloateroutbox.h
index 18baccf1c9..a91d8c1139 100644
--- a/indra/newview/llfloateroutbox.h
+++ b/indra/newview/llfloateroutbox.h
@@ -64,7 +64,7 @@ public:
EAcceptance* accept,
std::string& tooltip_msg);
- void showNotification(const LLSD& notify);
+ void showNotification(const LLNotificationPtr& notification);
BOOL handleHover(S32 x, S32 y, MASK mask);
void onMouseLeave(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/llfloaterpathfindinglinksets.cpp b/indra/newview/llfloaterpathfindinglinksets.cpp
index 0fe0e151fb..1e46d7a402 100644
--- a/indra/newview/llfloaterpathfindinglinksets.cpp
+++ b/indra/newview/llfloaterpathfindinglinksets.cpp
@@ -98,7 +98,11 @@ LLFloaterPathfindingLinksets::LLFloaterPathfindingLinksets(const LLSD& pSeed)
mLabelSuggestedUseD(NULL),
mEditD(NULL),
mApplyEditsButton(NULL),
- mBeaconColor()
+ mBeaconColor(),
+ mPreviousValueA(LLPathfindingLinkset::MAX_WALKABILITY_VALUE),
+ mPreviousValueB(LLPathfindingLinkset::MAX_WALKABILITY_VALUE),
+ mPreviousValueC(LLPathfindingLinkset::MAX_WALKABILITY_VALUE),
+ mPreviousValueD(LLPathfindingLinkset::MAX_WALKABILITY_VALUE)
{
}
@@ -168,7 +172,7 @@ BOOL LLFloaterPathfindingLinksets::postBuild()
mEditA = findChild<LLLineEditor>("edit_a_value");
llassert(mEditA != NULL);
mEditA->setPrevalidate(LLTextValidate::validateNonNegativeS32);
- mEditA->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1));
+ mEditA->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1, mPreviousValueA));
mLabelEditB = findChild<LLTextBase>("edit_b_label");
llassert(mLabelEditB != NULL);
@@ -179,7 +183,7 @@ BOOL LLFloaterPathfindingLinksets::postBuild()
mEditB = findChild<LLLineEditor>("edit_b_value");
llassert(mEditB != NULL);
mEditB->setPrevalidate(LLTextValidate::validateNonNegativeS32);
- mEditB->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1));
+ mEditB->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1, mPreviousValueB));
mLabelEditC = findChild<LLTextBase>("edit_c_label");
llassert(mLabelEditC != NULL);
@@ -190,7 +194,7 @@ BOOL LLFloaterPathfindingLinksets::postBuild()
mEditC = findChild<LLLineEditor>("edit_c_value");
llassert(mEditC != NULL);
mEditC->setPrevalidate(LLTextValidate::validateNonNegativeS32);
- mEditC->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1));
+ mEditC->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1, mPreviousValueC));
mLabelEditD = findChild<LLTextBase>("edit_d_label");
llassert(mLabelEditD != NULL);
@@ -201,7 +205,7 @@ BOOL LLFloaterPathfindingLinksets::postBuild()
mEditD = findChild<LLLineEditor>("edit_d_value");
llassert(mEditD != NULL);
mEditD->setPrevalidate(LLTextValidate::validateNonNegativeS32);
- mEditD->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1));
+ mEditD->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1, mPreviousValueD));
mApplyEditsButton = findChild<LLButton>("apply_edit_values");
llassert(mApplyEditsButton != NULL);
@@ -323,26 +327,38 @@ void LLFloaterPathfindingLinksets::onClearFiltersClicked()
rebuildObjectsScrollList();
}
-void LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered(LLUICtrl *pUICtrl)
+void LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered(LLUICtrl *pUICtrl, LLSD &pPreviousValue)
{
LLLineEditor *pLineEditor = static_cast<LLLineEditor *>(pUICtrl);
llassert(pLineEditor != NULL);
const std::string &valueString = pLineEditor->getText();
- S32 value;
- if (LLStringUtil::convertToS32(valueString, value))
+ S32 intValue;
+ LLSD value;
+ bool doResetValue = false;
+
+ if (valueString.empty())
{
- if ((value < LLPathfindingLinkset::MIN_WALKABILITY_VALUE) || (value > LLPathfindingLinkset::MAX_WALKABILITY_VALUE))
- {
- value = llclamp(value, LLPathfindingLinkset::MIN_WALKABILITY_VALUE, LLPathfindingLinkset::MAX_WALKABILITY_VALUE);
- pLineEditor->setValue(LLSD(value));
- }
+ value = pPreviousValue;
+ doResetValue = true;
+ }
+ else if (LLStringUtil::convertToS32(valueString, intValue))
+ {
+ doResetValue = ((intValue < LLPathfindingLinkset::MIN_WALKABILITY_VALUE) || (intValue > LLPathfindingLinkset::MAX_WALKABILITY_VALUE));
+ value = LLSD(llclamp(intValue, LLPathfindingLinkset::MIN_WALKABILITY_VALUE, LLPathfindingLinkset::MAX_WALKABILITY_VALUE));
}
else
{
- pLineEditor->setValue(LLSD(LLPathfindingLinkset::MAX_WALKABILITY_VALUE));
+ value = LLSD(LLPathfindingLinkset::MAX_WALKABILITY_VALUE);
+ doResetValue = true;
+ }
+
+ if (doResetValue)
+ {
+ pLineEditor->setValue(value);
}
+ pPreviousValue = value;
}
void LLFloaterPathfindingLinksets::onApplyChangesClicked()
@@ -376,10 +392,14 @@ void LLFloaterPathfindingLinksets::updateEditFieldValues()
const LLPathfindingLinkset *linkset = dynamic_cast<const LLPathfindingLinkset *>(firstSelectedObjectPtr.get());
setEditLinksetUse(linkset->getLinksetUse());
- mEditA->setValue(LLSD(linkset->getWalkabilityCoefficientA()));
- mEditB->setValue(LLSD(linkset->getWalkabilityCoefficientB()));
- mEditC->setValue(LLSD(linkset->getWalkabilityCoefficientC()));
- mEditD->setValue(LLSD(linkset->getWalkabilityCoefficientD()));
+ mPreviousValueA = LLSD(linkset->getWalkabilityCoefficientA());
+ mPreviousValueB = LLSD(linkset->getWalkabilityCoefficientB());
+ mPreviousValueC = LLSD(linkset->getWalkabilityCoefficientC());
+ mPreviousValueD = LLSD(linkset->getWalkabilityCoefficientD());
+ mEditA->setValue(mPreviousValueA);
+ mEditB->setValue(mPreviousValueB);
+ mEditC->setValue(mPreviousValueC);
+ mEditD->setValue(mPreviousValueD);
}
}
diff --git a/indra/newview/llfloaterpathfindinglinksets.h b/indra/newview/llfloaterpathfindinglinksets.h
index 6538308122..7149da9215 100644
--- a/indra/newview/llfloaterpathfindinglinksets.h
+++ b/indra/newview/llfloaterpathfindinglinksets.h
@@ -74,7 +74,7 @@ private:
void onApplyAllFilters();
void onClearFiltersClicked();
- void onWalkabilityCoefficientEntered(LLUICtrl *pUICtrl);
+ void onWalkabilityCoefficientEntered(LLUICtrl *pUICtrl, LLSD &pPreviousValue);
void onApplyChangesClicked();
void clearFilters();
@@ -132,6 +132,11 @@ private:
LLButton *mApplyEditsButton;
LLColor4 mBeaconColor;
+
+ LLSD mPreviousValueA;
+ LLSD mPreviousValueB;
+ LLSD mPreviousValueC;
+ LLSD mPreviousValueD;
};
#endif // LL_LLFLOATERPATHFINDINGLINKSETS_H
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 5752f839ce..a28af2101b 100755
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -51,11 +51,11 @@
#include "llfloaterabout.h"
#include "llfloaterhardwaresettings.h"
#include "llfloatersidepanelcontainer.h"
-#include "llimfloater.h"
+#include "llfloaterimsession.h"
#include "llkeyboard.h"
#include "llmodaldialog.h"
#include "llnavigationbar.h"
-#include "llnearbychat.h"
+#include "llfloaterimnearbychat.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "llnotificationtemplate.h"
@@ -306,7 +306,8 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mAvatarDataInitialized(false),
mClickActionDirty(false)
{
-
+ LLConversationLog::instance().addObserver(this);
+
//Build Floater is now Called from LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
static bool registered_dialog = false;
@@ -329,8 +330,6 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.VoiceSetKey", boost::bind(&LLFloaterPreference::onClickSetKey, this));
mCommitCallbackRegistrar.add("Pref.VoiceSetMiddleMouse", boost::bind(&LLFloaterPreference::onClickSetMiddleMouse, this));
mCommitCallbackRegistrar.add("Pref.SetSounds", boost::bind(&LLFloaterPreference::onClickSetSounds, 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));
@@ -351,13 +350,16 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
sSkin = gSavedSettings.getString("SkinCurrent");
- mCommitCallbackRegistrar.add("Pref.ClickActionChange", boost::bind(&LLFloaterPreference::onClickActionChange, this));
+ mCommitCallbackRegistrar.add("Pref.ClickActionChange", boost::bind(&LLFloaterPreference::onClickActionChange, this));
gSavedSettings.getControl("NameTagShowUsernames")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2));
gSavedSettings.getControl("NameTagShowFriends")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2));
gSavedSettings.getControl("UseDisplayNames")->getCommitSignal()->connect(boost::bind(&handleDisplayNamesOptionChanged, _2));
LLAvatarPropertiesProcessor::getInstance()->addObserver( gAgent.getID(), this );
+
+ mCommitCallbackRegistrar.add("Pref.ClearLog", boost::bind(&LLConversationLog::onClearLog, &LLConversationLog::instance()));
+ mCommitCallbackRegistrar.add("Pref.DeleteTranscripts", boost::bind(&LLFloaterPreference::onDeleteTranscripts, this));
}
void LLFloaterPreference::processProperties( void* pData, EAvatarProcessorType type )
@@ -425,13 +427,7 @@ void LLFloaterPreference::saveAvatarProperties( void )
BOOL LLFloaterPreference::postBuild()
{
- gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&LLIMFloater::processChatHistoryStyleUpdate, _2));
-
- gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&LLNearbyChat::processChatHistoryStyleUpdate, _2));
-
- gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLIMFloater::processChatHistoryStyleUpdate, _2));
-
- gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLNearbyChat::processChatHistoryStyleUpdate, _2));
+ gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLFloaterIMSessionTab::processChatHistoryStyleUpdate, false));
gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLViewerChat::signalChatFontChanged));
@@ -447,28 +443,45 @@ BOOL LLFloaterPreference::postBuild()
std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");
setCacheLocation(cache_location);
+ getChild<LLUICtrl>("log_path_string")->setEnabled(FALSE); // make it read-only but selectable
+
getChild<LLComboBox>("language_combobox")->setCommitCallback(boost::bind(&LLFloaterPreference::onLanguageChange, this));
- // if floater is opened before login set default localized busy message
+ getChild<LLComboBox>("FriendIMOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"FriendIMOptions"));
+ getChild<LLComboBox>("NonFriendIMOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"NonFriendIMOptions"));
+ getChild<LLComboBox>("ConferenceIMOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"ConferenceIMOptions"));
+ getChild<LLComboBox>("GroupChatOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"GroupChatOptions"));
+ getChild<LLComboBox>("NearbyChatOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"NearbyChatOptions"));
+
+ // if floater is opened before login set default localized do not disturb message
if (LLStartUp::getStartupState() < STATE_STARTED)
{
- gSavedPerAccountSettings.setString("BusyModeResponse", LLTrans::getString("BusyModeResponseDefault"));
+ gSavedPerAccountSettings.setString("DoNotDisturbModeResponse", LLTrans::getString("DoNotDisturbModeResponseDefault"));
}
+ // set 'enable' property for 'Clear log...' button
+ changed();
+
+ LLLogChat::setSaveHistorySignal(boost::bind(&LLFloaterPreference::onLogChatHistorySaved, this));
+
return TRUE;
}
-void LLFloaterPreference::onBusyResponseChanged()
+void LLFloaterPreference::updateDeleteTranscriptsButton()
{
- // set "BusyResponseChanged" TRUE if user edited message differs from default, FALSE otherwise
- if (LLTrans::getString("BusyModeResponseDefault") != getChild<LLUICtrl>("busy_response")->getValue().asString())
- {
- gSavedPerAccountSettings.setBOOL("BusyResponseChanged", TRUE );
- }
- else
- {
- gSavedPerAccountSettings.setBOOL("BusyResponseChanged", FALSE );
- }
+ std::vector<std::string> list_of_transcriptions_file_names;
+ LLLogChat::getListOfTranscriptFiles(list_of_transcriptions_file_names);
+ getChild<LLButton>("delete_transcripts")->setEnabled(list_of_transcriptions_file_names.size() > 0);
+}
+
+void LLFloaterPreference::onDoNotDisturbResponseChanged()
+{
+ // set "DoNotDisturbResponseChanged" TRUE if user edited message differs from default, FALSE otherwise
+ bool response_changed_flag =
+ LLTrans::getString("DoNotDisturbModeResponseDefault")
+ != getChild<LLUICtrl>("do_not_disturb_response")->getValue().asString();
+
+ gSavedPerAccountSettings.setBOOL("DoNotDisturbResponseChanged", response_changed_flag );
}
LLFloaterPreference::~LLFloaterPreference()
@@ -479,6 +492,8 @@ LLFloaterPreference::~LLFloaterPreference()
{
ctrl_window_size->setCurrentByIndex(i);
}
+
+ LLConversationLog::instance().removeObserver(this);
}
void LLFloaterPreference::draw()
@@ -551,14 +566,8 @@ void LLFloaterPreference::apply()
LLViewerMedia::setProxyConfig(proxy_enable, proxy_address, proxy_port);
}
-// LLWString busy_response = utf8str_to_wstring(getChild<LLUICtrl>("busy_response")->getValue().asString());
-// LLWStringUtil::replaceTabsWithSpaces(busy_response, 4);
-
- gSavedSettings.setBOOL("PlainTextChatHistory", getChild<LLUICtrl>("plain_text_chat_history")->getValue().asBoolean());
-
if (mGotPersonalInfo)
{
-// gSavedSettings.setString("BusyModeResponse2", std::string(wstring_to_utf8str(busy_response)));
bool new_im_via_email = getChild<LLUICtrl>("send_im_to_email")->getValue().asBoolean();
bool new_hide_online = getChild<LLUICtrl>("online_visibility")->getValue().asBoolean();
@@ -644,21 +653,21 @@ void LLFloaterPreference::cancel()
void LLFloaterPreference::onOpen(const LLSD& key)
{
- // this variable and if that follows it are used to properly handle busy mode response message
+ // this variable and if that follows it are used to properly handle do not disturb mode response message
static bool initialized = FALSE;
- // if user is logged in and we haven't initialized busy_response yet, do it
+ // if user is logged in and we haven't initialized do not disturb mode response yet, do it
if (!initialized && LLStartUp::getStartupState() == STATE_STARTED)
{
- // Special approach is used for busy response localization, because "BusyModeResponse" is
+ // Special approach is used for do not disturb response localization, because "DoNotDisturbModeResponse" is
// in non-localizable xml, and also because it may be changed by user and in this case it shouldn't be localized.
- // To keep track of whether busy response is default or changed by user additional setting BusyResponseChanged
+ // To keep track of whether do not disturb response is default or changed by user additional setting DoNotDisturbResponseChanged
// was added into per account settings.
// initialization should happen once,so setting variable to TRUE
initialized = TRUE;
- // this connection is needed to properly set "BusyResponseChanged" setting when user makes changes in
- // busy response message.
- gSavedPerAccountSettings.getControl("BusyModeResponse")->getSignal()->connect(boost::bind(&LLFloaterPreference::onBusyResponseChanged, this));
+ // this connection is needed to properly set "DoNotDisturbResponseChanged" setting when user makes changes in
+ // do not disturb response message.
+ gSavedPerAccountSettings.getControl("DoNotDisturbModeResponse")->getSignal()->connect(boost::bind(&LLFloaterPreference::onDoNotDisturbResponseChanged, this));
}
gAgent.sendAgentUserInfoRequest();
@@ -705,6 +714,14 @@ void LLFloaterPreference::onOpen(const LLSD& key)
// while preferences floater was closed.
buildPopupLists();
+
+ //get the options that were checked
+ onNotificationsChange("FriendIMOptions");
+ onNotificationsChange("NonFriendIMOptions");
+ onNotificationsChange("ConferenceIMOptions");
+ onNotificationsChange("GroupChatOptions");
+ onNotificationsChange("NearbyChatOptions");
+
LLPanelLogin::setAlwaysRefresh(true);
refresh();
@@ -720,12 +737,12 @@ void LLFloaterPreference::onVertexShaderEnable()
}
//static
-void LLFloaterPreference::initBusyResponse()
+void LLFloaterPreference::initDoNotDisturbResponse()
{
- if (!gSavedPerAccountSettings.getBOOL("BusyResponseChanged"))
+ if (!gSavedPerAccountSettings.getBOOL("DoNotDisturbResponseChanged"))
{
- //LLTrans::getString("BusyModeResponseDefault") is used here for localization (EXT-5885)
- gSavedPerAccountSettings.setString("BusyModeResponse", LLTrans::getString("BusyModeResponseDefault"));
+ //LLTrans::getString("DoNotDisturbModeResponseDefault") is used here for localization (EXT-5885)
+ gSavedPerAccountSettings.setString("DoNotDisturbModeResponse", LLTrans::getString("DoNotDisturbModeResponseDefault"));
}
}
@@ -750,7 +767,10 @@ void LLFloaterPreference::onClose(bool app_quitting)
{
gSavedSettings.setS32("LastPrefTab", getChild<LLTabContainer>("pref core")->getCurrentPanelIndex());
LLPanelLogin::setAlwaysRefresh(false);
- cancel();
+ if (!app_quitting)
+ {
+ cancel();
+ }
}
void LLFloaterPreference::onOpenHardwareSettings()
@@ -777,8 +797,31 @@ void LLFloaterPreference::onBtnOK()
apply();
closeFloater(false);
+ //Conversation transcript and log path changed so reload conversations based on new location
+ if(mPriorInstantMessageLogPath.length())
+ {
+ if(moveTranscriptsAndLog())
+ {
+ //When floaters are empty but have a chat history files, reload chat history into them
+ LLFloaterIMSessionTab::reloadEmptyFloaters();
+ }
+ //Couldn't move files so restore the old path and show a notification
+ else
+ {
+ gSavedPerAccountSettings.setString("InstantMessageLogPath", mPriorInstantMessageLogPath);
+ LLNotificationsUtil::add("PreferenceChatPathChanged");
+ }
+ mPriorInstantMessageLogPath.clear();
+ }
+
LLUIColorTable::instance().saveUserSettings();
gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);
+
+ //Only save once logged in and loaded per account settings
+ if(mGotPersonalInfo)
+ {
+ gSavedPerAccountSettings.saveToFile(gSavedSettings.getString("PerAccountSettingsFile"), TRUE);
+ }
}
else
{
@@ -831,12 +874,12 @@ void LLFloaterPreference::onBtnCancel()
}
// static
-void LLFloaterPreference::updateUserInfo(const std::string& visibility, bool im_via_email, const std::string& email)
+void LLFloaterPreference::updateUserInfo(const std::string& visibility, bool im_via_email)
{
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
if (instance)
{
- instance->setPersonalInfo(visibility, im_via_email, email);
+ instance->setPersonalInfo(visibility, im_via_email);
}
}
@@ -878,6 +921,23 @@ void LLFloaterPreference::onLanguageChange()
}
}
+void LLFloaterPreference::onNotificationsChange(const std::string& OptionName)
+{
+ mNotificationOptions[OptionName] = getChild<LLComboBox>(OptionName)->getSelectedItemLabel();
+
+ bool show_notifications_alert = true;
+ for (notifications_map::iterator it_notification = mNotificationOptions.begin(); it_notification != mNotificationOptions.end(); it_notification++)
+ {
+ if(it_notification->second != "None")
+ {
+ show_notifications_alert = false;
+ break;
+ }
+ }
+
+ getChild<LLTextBox>("notifications_alert")->setVisible(show_notifications_alert);
+}
+
void LLFloaterPreference::onNameTagOpacityChange(const LLSD& newvalue)
{
LLColorSwatchCtrl* color_swatch = findChild<LLColorSwatchCtrl>("background");
@@ -1399,17 +1459,94 @@ void LLFloaterPreference::setAllIgnored()
void LLFloaterPreference::onClickLogPath()
{
std::string proposed_name(gSavedPerAccountSettings.getString("InstantMessageLogPath"));
+ mPriorInstantMessageLogPath.clear();
LLDirPicker& picker = LLDirPicker::instance();
+ //Launches a directory picker and waits for feedback
if (!picker.getDir(&proposed_name ) )
{
return; //Canceled!
}
- gSavedPerAccountSettings.setString("InstantMessageLogPath", picker.getDirName());
+ //Gets the path from the directory picker
+ std::string dir_name = picker.getDirName();
+
+ //Path changed
+ if(proposed_name != dir_name)
+ {
+ gSavedPerAccountSettings.setString("InstantMessageLogPath", dir_name);
+ mPriorInstantMessageLogPath = proposed_name;
+
+ // enable/disable 'Delete transcripts button
+ updateDeleteTranscriptsButton();
+}
}
-void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email)
+bool LLFloaterPreference::moveTranscriptsAndLog()
+{
+ std::string instantMessageLogPath(gSavedPerAccountSettings.getString("InstantMessageLogPath"));
+ std::string chatLogPath = gDirUtilp->add(instantMessageLogPath, gDirUtilp->getUserName());
+
+ bool madeDirectory = false;
+
+ //Does the directory really exist, if not then make it
+ if(!LLFile::isdir(chatLogPath))
+ {
+ //mkdir success is defined as zero
+ if(LLFile::mkdir(chatLogPath) != 0)
+ {
+ return false;
+ }
+ madeDirectory = true;
+ }
+
+ std::string originalConversationLogDir = LLConversationLog::instance().getFileName();
+ std::string targetConversationLogDir = gDirUtilp->add(chatLogPath, "conversation.log");
+ //Try to move the conversation log
+ if(!LLConversationLog::instance().moveLog(originalConversationLogDir, targetConversationLogDir))
+ {
+ //Couldn't move the log and created a new directory so remove the new directory
+ if(madeDirectory)
+ {
+ LLFile::rmdir(chatLogPath);
+ }
+ return false;
+ }
+
+ //Attempt to move transcripts
+ std::vector<std::string> listOfTranscripts;
+ std::vector<std::string> listOfFilesMoved;
+
+ LLLogChat::getListOfTranscriptFiles(listOfTranscripts);
+
+ if(!LLLogChat::moveTranscripts(gDirUtilp->getChatLogsDir(),
+ instantMessageLogPath,
+ listOfTranscripts,
+ listOfFilesMoved))
+ {
+ //Couldn't move all the transcripts so restore those that moved back to their old location
+ LLLogChat::moveTranscripts(instantMessageLogPath,
+ gDirUtilp->getChatLogsDir(),
+ listOfFilesMoved);
+
+ //Move the conversation log back
+ LLConversationLog::instance().moveLog(targetConversationLogDir, originalConversationLogDir);
+
+ if(madeDirectory)
+ {
+ LLFile::rmdir(chatLogPath);
+ }
+
+ return false;
+ }
+
+ gDirUtilp->setChatLogsDir(instantMessageLogPath);
+ gDirUtilp->updatePerAccountChatLogsDir();
+
+ return true;
+}
+
+void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im_via_email)
{
mGotPersonalInfo = true;
mOriginalIMViaEmail = im_via_email;
@@ -1431,37 +1568,14 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
}
getChild<LLUICtrl>("online_searchresults")->setEnabled(TRUE);
-
- getChildView("include_im_in_chat_history")->setEnabled(TRUE);
- getChildView("show_timestamps_check_im")->setEnabled(TRUE);
getChildView("friends_online_notify_checkbox")->setEnabled(TRUE);
-
getChild<LLUICtrl>("online_visibility")->setValue(mOriginalHideOnlineStatus);
getChild<LLUICtrl>("online_visibility")->setLabelArg("[DIR_VIS]", mDirectoryVisibility);
getChildView("send_im_to_email")->setEnabled(TRUE);
getChild<LLUICtrl>("send_im_to_email")->setValue(im_via_email);
- getChildView("plain_text_chat_history")->setEnabled(TRUE);
- getChild<LLUICtrl>("plain_text_chat_history")->setValue(gSavedSettings.getBOOL("PlainTextChatHistory"));
- getChildView("log_instant_messages")->setEnabled(TRUE);
-// getChildView("log_chat")->setEnabled(TRUE);
-// getChildView("busy_response")->setEnabled(TRUE);
-// getChildView("log_instant_messages_timestamp")->setEnabled(TRUE);
-// getChildView("log_chat_timestamp")->setEnabled(TRUE);
- getChildView("log_chat_IM")->setEnabled(TRUE);
- getChildView("log_date_timestamp")->setEnabled(TRUE);
-
-// getChild<LLUICtrl>("busy_response")->setValue(gSavedSettings.getString("BusyModeResponse2"));
-
getChildView("favorites_on_login_check")->setEnabled(TRUE);
- getChildView("log_nearby_chat")->setEnabled(TRUE);
- getChildView("log_instant_messages")->setEnabled(TRUE);
- getChildView("show_timestamps_check_im")->setEnabled(TRUE);
- getChildView("log_path_string")->setEnabled(FALSE);// LineEditor becomes readonly in this case.
getChildView("log_path_button")->setEnabled(TRUE);
- childEnable("logfile_name_datestamp");
- std::string display_email(email);
- getChild<LLUICtrl>("email_address")->setValue(display_email);
-
+ getChildView("chat_font_size")->setEnabled(TRUE);
}
void LLFloaterPreference::onUpdateSliderText(LLUICtrl* ctrl, const LLSD& name)
@@ -1523,7 +1637,8 @@ void LLFloaterPreference::onChangeMaturity()
// but the UI for this will still be enabled
void LLFloaterPreference::onClickBlockList()
{
- LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD());
+ LLFloaterSidePanelContainer::showPanel("people", "panel_people",
+ LLSD().with("people_panel_tab_name", "blocked_panel"));
}
void LLFloaterPreference::onClickProxySettings()
@@ -1551,6 +1666,33 @@ void LLFloaterPreference::onClickActionChange()
mClickActionDirty = true;
}
+void LLFloaterPreference::onDeleteTranscripts()
+{
+ LLSD args;
+ args["FOLDER"] = gDirUtilp->getUserName();
+
+ LLNotificationsUtil::add("PreferenceChatDeleteTranscripts", args, LLSD(), boost::bind(&LLFloaterPreference::onDeleteTranscriptsResponse, this, _1, _2));
+}
+
+void LLFloaterPreference::onDeleteTranscriptsResponse(const LLSD& notification, const LLSD& response)
+{
+ if (0 == LLNotificationsUtil::getSelectedOption(notification, response))
+ {
+ LLLogChat::deleteTranscripts();
+ updateDeleteTranscriptsButton();
+ }
+}
+
+void LLFloaterPreference::onLogChatHistorySaved()
+{
+ LLButton * delete_transcripts_buttonp = getChild<LLButton>("delete_transcripts");
+
+ if (!delete_transcripts_buttonp->getEnabled())
+ {
+ delete_transcripts_buttonp->setEnabled(true);
+ }
+}
+
void LLFloaterPreference::updateClickActionSettings()
{
const int single_clk_action = getChild<LLComboBox>("single_click_action_combo")->getValue().asInteger();
@@ -1589,6 +1731,35 @@ void LLFloaterPreference::setCacheLocation(const LLStringExplicit& location)
cache_location_editor->setToolTip(location);
}
+void LLFloaterPreference::selectPanel(const LLSD& name)
+{
+ LLTabContainer * tab_containerp = getChild<LLTabContainer>("pref core");
+ LLPanel * panel = tab_containerp->getPanelByName(name);
+ if (NULL != panel)
+ {
+ tab_containerp->selectTabPanel(panel);
+ }
+}
+
+void LLFloaterPreference::selectPrivacyPanel()
+{
+ selectPanel("im");
+}
+
+void LLFloaterPreference::selectChatPanel()
+{
+ selectPanel("chat");
+}
+
+void LLFloaterPreference::changed()
+{
+ getChild<LLButton>("clear_log")->setEnabled(LLConversationLog::instance().getConversations().size() > 0);
+
+ // set 'enable' property for 'Delete transcripts...' button
+ updateDeleteTranscriptsButton();
+
+}
+
//------------------------------Updater---------------------------------------
static bool handleBandwidthChanged(const LLSD& newvalue)
@@ -1647,6 +1818,17 @@ LLPanelPreference::LLPanelPreference()
//virtual
BOOL LLPanelPreference::postBuild()
{
+ ////////////////////// PanelGeneral ///////////////////
+ if (hasChild("display_names_check"))
+ {
+ BOOL use_people_api = gSavedSettings.getBOOL("UsePeopleAPI");
+ LLCheckBoxCtrl* ctrl_display_name = getChild<LLCheckBoxCtrl>("display_names_check");
+ ctrl_display_name->setEnabled(use_people_api);
+ if (!use_people_api)
+ {
+ ctrl_display_name->setValue(FALSE);
+ }
+ }
////////////////////// PanelVoice ///////////////////
if (hasChild("voice_unavailable"))
@@ -1671,12 +1853,6 @@ BOOL LLPanelPreference::postBuild()
}
- if (hasChild("online_visibility") && hasChild("send_im_to_email"))
- {
- getChild<LLUICtrl>("email_address")->setValue(getString("log_in_to_change") );
-// getChild<LLUICtrl>("busy_response")->setValue(getString("log_in_to_change"));
- }
-
//////////////////////PanelPrivacy ///////////////////
if (hasChild("media_enabled"))
{
@@ -1698,7 +1874,7 @@ BOOL LLPanelPreference::postBuild()
getChild<LLCheckBoxCtrl>("favorites_on_login_check")->setCommitCallback(boost::bind(&showFavoritesOnLoginWarning, _1, _2));
}
- // Panel Advanced
+ //////////////////////PanelAdvanced ///////////////////
if (hasChild("modifier_combo"))
{
//localizing if push2talk button is set to middle mouse
@@ -1853,7 +2029,7 @@ public:
for (control_values_map_t::iterator it = mSavedValues.begin(); it != mSavedValues.end(); )
{
const std::string setting = it->first->getName();
- if (std::find(mAccountIndependentSettings.begin(),
+ if (find(mAccountIndependentSettings.begin(),
mAccountIndependentSettings.end(), setting) == mAccountIndependentSettings.end())
{
mSavedValues.erase(it++);
@@ -2142,4 +2318,4 @@ void LLFloaterPreferenceProxy::onChangeSocksSettings()
otherHttpProxy->selectFirstItem();
}
-};
+}
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index b71f7c647b..22e80a21cb 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -35,7 +35,9 @@
#include "llfloater.h"
#include "llavatarpropertiesprocessor.h"
+#include "llconversationlog.h"
+class LLConversationLogObserver;
class LLPanelPreference;
class LLPanelLCD;
class LLPanelDebug;
@@ -45,6 +47,8 @@ class LLSliderCtrl;
class LLSD;
class LLTextBox;
+typedef std::map<std::string, std::string> notifications_map;
+
typedef enum
{
GS_LOW_GRAPHICS,
@@ -56,7 +60,7 @@ typedef enum
// Floater to control preferences (display, audio, bandwidth, general.
-class LLFloaterPreference : public LLFloater, public LLAvatarPropertiesObserver
+class LLFloaterPreference : public LLFloater, public LLAvatarPropertiesObserver, public LLConversationLogObserver
{
public:
LLFloaterPreference(const LLSD& key);
@@ -68,20 +72,24 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
/*virtual*/ void onClose(bool app_quitting);
+ /*virtual*/ void changed();
+ /*virtual*/ void changed(const LLUUID& session_id, U32 mask) {};
// static data update, called from message handler
- static void updateUserInfo(const std::string& visibility, bool im_via_email, const std::string& email);
+ static void updateUserInfo(const std::string& visibility, bool im_via_email);
// refresh all the graphics preferences menus
static void refreshEnabledGraphics();
- // translate user's busy response message according to current locale if message is default, otherwise do nothing
- static void initBusyResponse();
+ // translate user's do not disturb response message according to current locale if message is default, otherwise do nothing
+ static void initDoNotDisturbResponse();
void processProperties( void* pData, EAvatarProcessorType type );
void processProfileProperties(const LLAvatarData* pAvatarData );
void storeAvatarProperties( const LLAvatarData* pAvatarData );
void saveAvatarProperties( void );
+ void selectPrivacyPanel();
+ void selectChatPanel();
protected:
void onBtnOK();
@@ -91,11 +99,12 @@ protected:
void onClickClearCache(); // Clear viewer texture cache, vfs, and VO cache on next startup
void onClickBrowserClearCache(); // Clear web history and caches as well as viewer caches above
void onLanguageChange();
+ void onNotificationsChange(const std::string& OptionName);
void onNameTagOpacityChange(const LLSD& newvalue);
- // set value of "BusyResponseChanged" in account settings depending on whether busy response
+ // set value of "DoNotDisturbResponseChanged" in account settings depending on whether do not disturb response
// string differs from default after user changes.
- void onBusyResponseChanged();
+ void onDoNotDisturbResponseChanged();
// if the custom settings box is clicked
void onChangeCustom();
void updateMeterText(LLUICtrl* ctrl);
@@ -129,15 +138,14 @@ public:
void setKey(KEY key);
void onClickSetMiddleMouse();
void onClickSetSounds();
-// void onClickSkipDialogs();
-// void onClickResetDialogs();
void onClickEnablePopup();
void onClickDisablePopup();
void resetAllIgnored();
void setAllIgnored();
- void onClickLogPath();
+ void onClickLogPath();
+ bool moveTranscriptsAndLog();
void enableHistory();
- void setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email);
+ void setPersonalInfo(const std::string& visibility, bool im_via_email);
void refreshEnabledState();
void disableUnavailableSettings();
void onCommitWindowedMode();
@@ -161,16 +169,25 @@ public:
void onClickSpellChecker();
void applyUIColor(LLUICtrl* ctrl, const LLSD& param);
void getUIColor(LLUICtrl* ctrl, const LLSD& param);
-
+ void onLogChatHistorySaved();
void buildPopupLists();
static void refreshSkin(void* data);
+ void selectPanel(const LLSD& name);
+
private:
+
+ void onDeleteTranscripts();
+ void onDeleteTranscriptsResponse(const LLSD& notification, const LLSD& response);
+ void updateDeleteTranscriptsButton();
+
static std::string sSkin;
+ notifications_map mNotificationOptions;
bool mClickActionDirty; ///< Set to true when the click/double-click options get changed by user.
bool mGotPersonalInfo;
bool mOriginalIMViaEmail;
bool mLanguageChanged;
bool mAvatarDataInitialized;
+ std::string mPriorInstantMessageLogPath;
bool mOriginalHideOnlineStatus;
std::string mDirectoryVisibility;
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index fe29bb38c7..e6b76159a1 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -647,8 +647,10 @@ void LLPanelRegionGeneralInfo::onClickKick()
// this depends on the grandparent view being a floater
// in order to set up floater dependency
+ LLView * button = findChild<LLButton>("kick_btn");
LLFloater* parent_floater = gFloaterView->getParentFloater(this);
- LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelRegionGeneralInfo::onKickCommit, this, _1), FALSE, TRUE);
+ LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelRegionGeneralInfo::onKickCommit, this, _1),
+ FALSE, TRUE, FALSE, parent_floater->getName(), button);
if (child_floater)
{
parent_floater->addDependentFloater(child_floater);
@@ -924,7 +926,14 @@ BOOL LLPanelRegionDebugInfo::sendUpdate()
void LLPanelRegionDebugInfo::onClickChooseAvatar()
{
- LLFloaterAvatarPicker::show(boost::bind(&LLPanelRegionDebugInfo::callbackAvatarID, this, _1, _2), FALSE, TRUE);
+ LLView * button = findChild<LLButton>("choose_avatar_btn");
+ LLFloater* parent_floater = gFloaterView->getParentFloater(this);
+ LLFloater * child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelRegionDebugInfo::callbackAvatarID, this, _1, _2),
+ FALSE, TRUE, FALSE, parent_floater->getName(), button);
+ if (child_floater)
+ {
+ parent_floater->addDependentFloater(child_floater);
+ }
}
@@ -1470,8 +1479,10 @@ void LLPanelEstateInfo::onClickKickUser()
{
// this depends on the grandparent view being a floater
// in order to set up floater dependency
+ LLView * button = findChild<LLButton>("kick_user_from_estate_btn");
LLFloater* parent_floater = gFloaterView->getParentFloater(this);
- LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::onKickUserCommit, this, _1), FALSE, TRUE);
+ LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::onKickUserCommit, this, _1),
+ FALSE, TRUE, FALSE, parent_floater->getName(), button);
if (child_floater)
{
parent_floater->addDependentFloater(child_floater);
@@ -1646,8 +1657,39 @@ bool LLPanelEstateInfo::accessAddCore2(const LLSD& notification, const LLSD& res
}
LLEstateAccessChangeInfo* change_info = new LLEstateAccessChangeInfo(notification["payload"]);
+ //Get parent floater name
+ LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
+ LLFloater* parent_floater = panel ? gFloaterView->getParentFloater(panel) : NULL;
+ const std::string& parent_floater_name = parent_floater ? parent_floater->getName() : "";
+
+ //Determine the button that triggered opening of the avatar picker
+ //(so that a shadow frustum from the button to the avatar picker can be created)
+ LLView * button = NULL;
+ switch(change_info->mOperationFlag)
+ {
+ case ESTATE_ACCESS_ALLOWED_AGENT_ADD:
+ button = panel->findChild<LLButton>("add_allowed_avatar_btn");
+ break;
+
+ case ESTATE_ACCESS_BANNED_AGENT_ADD:
+ button = panel->findChild<LLButton>("add_banned_avatar_btn");
+ break;
+
+ case ESTATE_ACCESS_MANAGER_ADD:
+ button = panel->findChild<LLButton>("add_estate_manager_btn");
+ break;
+ }
+
// avatar picker yes multi-select, yes close-on-select
- LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::accessAddCore3, _1, (void*)change_info), TRUE, TRUE);
+ LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::accessAddCore3, _1, (void*)change_info),
+ TRUE, TRUE, FALSE, parent_floater_name, button);
+
+ //Allows the closed parent floater to close the child floater (avatar picker)
+ if (child_floater)
+ {
+ parent_floater->addDependentFloater(child_floater);
+ }
+
return false;
}
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index 3ec1e372eb..0e4c7406c5 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -103,7 +103,8 @@ LLFloaterReporter::LLFloaterReporter(const LLSD& key)
mPicking( FALSE),
mPosition(),
mCopyrightWarningSeen( FALSE ),
- mResourceDatap(new LLResourceData())
+ mResourceDatap(new LLResourceData()),
+ mAvatarNameCacheConnection()
{
}
@@ -187,6 +188,11 @@ BOOL LLFloaterReporter::postBuild()
// virtual
LLFloaterReporter::~LLFloaterReporter()
{
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+
// child views automatically deleted
mObjectID = LLUUID::null;
@@ -285,10 +291,13 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)
void LLFloaterReporter::onClickSelectAbuser()
{
- LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLFloaterReporter::callbackAvatarID, this, _1, _2), FALSE, TRUE );
+ LLView * button = findChild<LLButton>("select_abuser", TRUE);
+
+ LLFloater * root_floater = gFloaterView->getParentFloater(this);
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLFloaterReporter::callbackAvatarID, this, _1, _2), FALSE, TRUE, FALSE, root_floater->getName(), button);
if (picker)
{
- gFloaterView->getParentFloater(this)->addDependentFloater(picker);
+ root_floater->addDependentFloater(picker);
}
}
@@ -310,11 +319,17 @@ void LLFloaterReporter::setFromAvatarID(const LLUUID& avatar_id)
std::string avatar_link = LLSLURL("agent", mObjectID, "inspect").getSLURLString();
getChild<LLUICtrl>("owner_name")->setValue(avatar_link);
- LLAvatarNameCache::get(avatar_id, boost::bind(&LLFloaterReporter::onAvatarNameCache, this, _1, _2));
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+ mAvatarNameCacheConnection = LLAvatarNameCache::get(avatar_id, boost::bind(&LLFloaterReporter::onAvatarNameCache, this, _1, _2));
}
void LLFloaterReporter::onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name)
{
+ mAvatarNameCacheConnection.disconnect();
+
if (mObjectID == avatar_id)
{
mOwnerName = av_name.getCompleteName();
diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h
index 7d68431710..d54e7f6ab0 100644
--- a/indra/newview/llfloaterreporter.h
+++ b/indra/newview/llfloaterreporter.h
@@ -137,6 +137,7 @@ private:
std::list<LLMeanCollisionData*> mMCDList;
std::string mDefaultSummary;
LLResourceData* mResourceDatap;
+ boost::signals2::connection mAvatarNameCacheConnection;
};
#endif
diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp
index a50907601c..8d8bba7b17 100644
--- a/indra/newview/llfloaterscriptlimits.cpp
+++ b/indra/newview/llfloaterscriptlimits.cpp
@@ -602,15 +602,7 @@ void LLPanelScriptLimitsRegionMemory::onNameCache(
return;
}
- std::string name;
- if (LLAvatarNameCache::useDisplayNames())
- {
- name = LLCacheName::buildUsername(full_name);
- }
- else
- {
- name = full_name;
- }
+ std::string name = LLCacheName::buildUsername(full_name);
std::vector<LLSD>::iterator id_itor;
for (id_itor = mObjectListItems.begin(); id_itor != mObjectListItems.end(); ++id_itor)
@@ -713,10 +705,7 @@ void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content)
else
{
name_is_cached = gCacheName->getFullName(owner_id, owner_buf); // username
- if (LLAvatarNameCache::useDisplayNames())
- {
- owner_buf = LLCacheName::buildUsername(owner_buf);
- }
+ owner_buf = LLCacheName::buildUsername(owner_buf);
}
if(!name_is_cached)
{
diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp
index 64c0dfa023..0cb37dabe7 100644
--- a/indra/newview/llfloatersellland.cpp
+++ b/indra/newview/llfloatersellland.cpp
@@ -81,6 +81,7 @@ private:
LLUUID mAuthorizedBuyer;
bool mParcelSoldWithObjects;
SelectionObserver mParcelSelectionObserver;
+ boost::signals2::connection mAvatarNameCacheConnection;
void updateParcelInfo();
void refreshUI();
@@ -129,13 +130,18 @@ LLFloater* LLFloaterSellLand::buildFloater(const LLSD& key)
LLFloaterSellLandUI::LLFloaterSellLandUI(const LLSD& key)
: LLFloater(key),
mParcelSelectionObserver(this),
- mRegion(0)
+ mRegion(0),
+ mAvatarNameCacheConnection()
{
LLViewerParcelMgr::getInstance()->addObserver(&mParcelSelectionObserver);
}
LLFloaterSellLandUI::~LLFloaterSellLandUI()
{
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
LLViewerParcelMgr::getInstance()->removeObserver(&mParcelSelectionObserver);
}
@@ -230,15 +236,20 @@ void LLFloaterSellLandUI::updateParcelInfo()
if(mSellToBuyer)
{
- LLAvatarNameCache::get(mAuthorizedBuyer,
- boost::bind(&LLFloaterSellLandUI::onBuyerNameCache, this, _2));
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+ mAvatarNameCacheConnection = LLAvatarNameCache::get(mAuthorizedBuyer, boost::bind(&LLFloaterSellLandUI::onBuyerNameCache, this, _2));
}
}
void LLFloaterSellLandUI::onBuyerNameCache(const LLAvatarName& av_name)
{
+ mAvatarNameCacheConnection.disconnect();
+
getChild<LLUICtrl>("sell_to_agent")->setValue(av_name.getCompleteName());
- getChild<LLUICtrl>("sell_to_agent")->setToolTip(av_name.mUsername);
+ getChild<LLUICtrl>("sell_to_agent")->setToolTip(av_name.getUserName());
}
void LLFloaterSellLandUI::setBadge(const char* id, Badge badge)
@@ -392,7 +403,8 @@ void LLFloaterSellLandUI::onChangeValue(LLUICtrl *ctrl, void *userdata)
void LLFloaterSellLandUI::doSelectAgent()
{
- LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLFloaterSellLandUI::callbackAvatarPick, this, _1, _2), FALSE, TRUE);
+ LLView * button = findChild<LLView>("sell_to_select_agent");
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLFloaterSellLandUI::callbackAvatarPick, this, _1, _2), FALSE, TRUE, FALSE, this->getName(), button);
// grandparent is a floater, in order to set up dependency
if (picker)
{
diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp
index 5385977d95..96b5c6b09b 100644
--- a/indra/newview/llfloatersidepanelcontainer.cpp
+++ b/indra/newview/llfloatersidepanelcontainer.cpp
@@ -61,7 +61,7 @@ LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_na
if (!getVisible())
{
- openFloater();
+ openFloater();
}
LLPanel* panel = NULL;
@@ -69,10 +69,7 @@ LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_na
LLSideTrayPanelContainer* container = dynamic_cast<LLSideTrayPanelContainer*>(view->getParent());
if (container)
{
- LLSD new_params = params;
- new_params[LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME] = panel_name;
- container->onOpen(new_params);
-
+ container->openPanel(panel_name, params);
panel = container->getCurrentPanel();
}
else if ((panel = dynamic_cast<LLPanel*>(view)) != NULL)
diff --git a/indra/newview/llfloatertexturefetchdebugger.cpp b/indra/newview/llfloatertexturefetchdebugger.cpp
index 9157389187..9a23d99802 100644
--- a/indra/newview/llfloatertexturefetchdebugger.cpp
+++ b/indra/newview/llfloatertexturefetchdebugger.cpp
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * Copyright (C) 2012, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 48484786f6..14923eec3c 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -657,8 +657,8 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
mBtnEdit ->setToggleState( edit_visible );
mRadioGroupEdit->setVisible( edit_visible );
- bool linked_parts = gSavedSettings.getBOOL("EditLinkedParts");
- getChildView("RenderingCost")->setVisible( !linked_parts && (edit_visible || focus_visible || move_visible) && sShowObjectCost);
+ //bool linked_parts = gSavedSettings.getBOOL("EditLinkedParts");
+ //getChildView("RenderingCost")->setVisible( !linked_parts && (edit_visible || focus_visible || move_visible) && sShowObjectCost);
mBtnLink->setVisible(edit_visible);
mBtnUnlink->setVisible(edit_visible);
@@ -1055,6 +1055,17 @@ void commit_grid_mode(LLUICtrl *ctrl)
LLSelectMgr::getInstance()->setGridMode((EGridMode)combo->getCurrentIndex());
}
+// static
+void LLFloaterTools::setGridMode(S32 mode)
+{
+ LLFloaterTools* tools_floater = LLFloaterReg::getTypedInstance<LLFloaterTools>("build");
+ if (!tools_floater || !tools_floater->mComboGridMode)
+ {
+ return;
+ }
+
+ tools_floater->mComboGridMode->setCurrentByIndex(mode);
+}
void LLFloaterTools::onClickGridOptions()
{
diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h
index 7a19d093a4..ecb0092a6f 100644
--- a/indra/newview/llfloatertools.h
+++ b/indra/newview/llfloatertools.h
@@ -107,6 +107,8 @@ public:
bool selectedMediaEditable();
void updateLandImpacts();
+ static void setGridMode(S32 mode);
+
private:
void refresh();
void refreshMedia();
diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp
index 2d91a61b54..7530c72dd2 100644
--- a/indra/newview/llfloatertopobjects.cpp
+++ b/indra/newview/llfloatertopobjects.cpp
@@ -199,17 +199,9 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
// Owner names can have trailing spaces sent from server
LLStringUtil::trim(owner_buf);
- if (LLAvatarNameCache::useDisplayNames())
- {
- // ...convert hard-coded name from server to a username
- // *TODO: Send owner_id from server and look up display name
- owner_buf = LLCacheName::buildUsername(owner_buf);
- }
- else
- {
- // ...just strip out legacy "Resident" name
- owner_buf = LLCacheName::cleanFullName(owner_buf);
- }
+ // *TODO: Send owner_id from server and look up display name
+ owner_buf = LLCacheName::buildUsername(owner_buf);
+
columns[column_num]["column"] = "owner";
columns[column_num]["value"] = owner_buf;
columns[column_num++]["font"] = "SANSSERIF";
diff --git a/indra/newview/llfloatertos.cpp b/indra/newview/llfloatertos.cpp
index c5df7e16e9..a242b224cd 100644
--- a/indra/newview/llfloatertos.cpp
+++ b/indra/newview/llfloatertos.cpp
@@ -71,9 +71,9 @@ class LLIamHere : public LLHTTPClient::Responder
public:
- static boost::intrusive_ptr< LLIamHere > build( LLFloaterTOS* parent )
+ static LLIamHere* build( LLFloaterTOS* parent )
{
- return boost::intrusive_ptr< LLIamHere >( new LLIamHere( parent ) );
+ return new LLIamHere( parent );
};
virtual void setParent( LLFloaterTOS* parentIn )
@@ -102,7 +102,7 @@ class LLIamHere : public LLHTTPClient::Responder
// this is global and not a class member to keep crud out of the header file
namespace {
- boost::intrusive_ptr< LLIamHere > gResponsePtr = 0;
+ LLPointer< LLIamHere > gResponsePtr = 0;
};
BOOL LLFloaterTOS::postBuild()
diff --git a/indra/newview/llfloatertranslationsettings.cpp b/indra/newview/llfloatertranslationsettings.cpp
index 1a17183efd..33f2c35239 100644
--- a/indra/newview/llfloatertranslationsettings.cpp
+++ b/indra/newview/llfloatertranslationsettings.cpp
@@ -29,7 +29,7 @@
#include "llfloatertranslationsettings.h"
// Viewer includes
-#include "llnearbychatbar.h"
+#include "llfloaterimnearbychat.h"
#include "lltranslate.h"
#include "llviewercontrol.h" // for gSavedSettings
@@ -225,11 +225,10 @@ void LLFloaterTranslationSettings::updateControlsEnabledState()
mGoogleVerifyBtn->setEnabled(on && google_selected &&
!mGoogleKeyVerified && !getEnteredGoogleKey().empty());
- mOKBtn->setEnabled(
- !on || (
- (bing_selected && mBingKeyVerified) ||
- (google_selected && mGoogleKeyVerified)
- ));
+ bool service_verified = (bing_selected && mBingKeyVerified) || (google_selected && mGoogleKeyVerified);
+ gSavedPerAccountSettings.setBOOL("TranslatingEnabled", service_verified);
+
+ mOKBtn->setEnabled(!on || service_verified);
}
void LLFloaterTranslationSettings::verifyKey(int service, const std::string& key, bool alert)
@@ -285,7 +284,16 @@ void LLFloaterTranslationSettings::onBtnGoogleVerify()
verifyKey(LLTranslate::SERVICE_GOOGLE, key);
}
}
+void LLFloaterTranslationSettings::onClose(bool app_quitting)
+{
+ std::string service = gSavedSettings.getString("TranslationService");
+ bool bing_selected = service == "bing";
+ bool google_selected = service == "google";
+
+ bool service_verified = (bing_selected && mBingKeyVerified) || (google_selected && mGoogleKeyVerified);
+ gSavedPerAccountSettings.setBOOL("TranslatingEnabled", service_verified);
+}
void LLFloaterTranslationSettings::onBtnOK()
{
gSavedSettings.setBOOL("TranslateChat", mMachineTranslationCB->getValue().asBoolean());
@@ -293,6 +301,7 @@ void LLFloaterTranslationSettings::onBtnOK()
gSavedSettings.setString("TranslationService", getSelectedService());
gSavedSettings.setString("BingTranslateAPIKey", getEnteredBingKey());
gSavedSettings.setString("GoogleTranslateAPIKey", getEnteredGoogleKey());
- LLNearbyChatBar::getInstance()->showTranslationCheckbox(LLTranslate::isTranslationConfigured());
+ (LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat"))->
+ showTranslationCheckbox(LLTranslate::isTranslationConfigured());
closeFloater(false);
}
diff --git a/indra/newview/llfloatertranslationsettings.h b/indra/newview/llfloatertranslationsettings.h
index 9b47ad72ed..b9bfd6265a 100644
--- a/indra/newview/llfloatertranslationsettings.h
+++ b/indra/newview/llfloatertranslationsettings.h
@@ -44,6 +44,7 @@ public:
void setBingVerified(bool ok, bool alert);
void setGoogleVerified(bool ok, bool alert);
+ void onClose(bool app_quitting);
private:
std::string getSelectedService() const;
diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index d741b5b133..15e0b89f6c 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -137,7 +137,7 @@ public:
virtual ~LLFloaterUIPreview();
std::string getLocStr(S32 ID); // fetches the localization string based on what is selected in the drop-down menu
- void displayFloater(BOOL click, S32 ID, bool save = false); // needs to be public so live file can call it when it finds an update
+ void displayFloater(BOOL click, S32 ID); // needs to be public so live file can call it when it finds an update
/*virtual*/ BOOL postBuild();
/*virtual*/ void onClose(bool app_quitting);
@@ -291,7 +291,8 @@ LLLocalizationResetForcer::LLLocalizationResetForcer(LLFloaterUIPreview* floater
{
mSavedLocalization = LLUI::sSettingGroups["config"]->getString("Language"); // save current localization setting
LLUI::sSettingGroups["config"]->setString("Language", floater->getLocStr(ID));// hack language to be the one we want to preview floaters in
- LLUI::setupPaths(); // forcibly reset XUI paths with this new language
+ // forcibly reset XUI paths with this new language
+ gDirUtilp->setSkinFolder(gDirUtilp->getSkinFolder(), floater->getLocStr(ID));
}
// Actually reset in destructor
@@ -299,7 +300,8 @@ LLLocalizationResetForcer::LLLocalizationResetForcer(LLFloaterUIPreview* floater
LLLocalizationResetForcer::~LLLocalizationResetForcer()
{
LLUI::sSettingGroups["config"]->setString("Language", mSavedLocalization); // reset language to what it was before we changed it
- LLUI::setupPaths(); // forcibly reset XUI paths with this new language
+ // forcibly reset XUI paths with this new language
+ gDirUtilp->setSkinFolder(gDirUtilp->getSkinFolder(), mSavedLocalization);
}
// Live file constructor
@@ -488,7 +490,7 @@ BOOL LLFloaterUIPreview::postBuild()
{
if((found = iter.next(language_directory))) // get next directory
{
- std::string full_path = xui_dir + language_directory;
+ std::string full_path = gDirUtilp->add(xui_dir, language_directory);
if(LLFile::isfile(full_path.c_str())) // if it's not a directory, skip it
{
continue;
@@ -773,7 +775,8 @@ void LLFloaterUIPreview::onClickDisplayFloater(S32 caller_id)
// Saves the current floater/panel
void LLFloaterUIPreview::onClickSaveFloater(S32 caller_id)
{
- displayFloater(TRUE, caller_id, true);
+ displayFloater(TRUE, caller_id);
+ popupAndPrintWarning("Save-floater functionality removed, use XML schema to clean up XUI files");
}
// Saves all floater/panels
@@ -784,25 +787,15 @@ void LLFloaterUIPreview::onClickSaveAll(S32 caller_id)
for (int index = 0; index < listSize; index++)
{
mFileList->selectNthItem(index);
- displayFloater(TRUE, caller_id, true);
+ displayFloater(TRUE, caller_id);
}
-}
-
-// Given path to floater or panel XML file "filename.xml",
-// returns "filename_new.xml"
-static std::string append_new_to_xml_filename(const std::string& path)
-{
- std::string full_filename = gDirUtilp->findSkinnedFilename(LLUI::getLocalizedSkinPath(), path);
- std::string::size_type extension_pos = full_filename.rfind(".xml");
- full_filename.resize(extension_pos);
- full_filename += "_new.xml";
- return full_filename;
+ popupAndPrintWarning("Save-floater functionality removed, use XML schema to clean up XUI files");
}
// Actually display the floater
// Only set up a new live file if this came from a click (at which point there should be no existing live file), rather than from the live file's update itself;
// otherwise, we get an infinite loop as the live file keeps recreating itself. That means this function is generally called twice.
-void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID, bool save)
+void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID)
{
// Convince UI that we're in a different language (the one selected on the drop-down menu)
LLLocalizationResetForcer reset_forcer(this, ID); // save old language in reset forcer object (to be reset upon destruction when it falls out of scope)
@@ -843,48 +836,13 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID, bool save)
if(!strncmp(path.c_str(),"floater_",8)
|| !strncmp(path.c_str(), "inspect_", 8)) // if it's a floater
{
- if (save)
- {
- LLXMLNodePtr floater_write = new LLXMLNode();
- (*floaterp)->buildFromFile(path, floater_write); // just build it
-
- if (!floater_write->isNull())
- {
- std::string full_filename = append_new_to_xml_filename(path);
- LLFILE* floater_temp = LLFile::fopen(full_filename.c_str(), "w");
- LLXMLNode::writeHeaderToFile(floater_temp);
- const bool use_type_decorations = false;
- floater_write->writeToFile(floater_temp, std::string(), use_type_decorations);
- fclose(floater_temp);
- }
- }
- else
- {
- (*floaterp)->buildFromFile(path); // just build it
- (*floaterp)->openFloater((*floaterp)->getKey());
- (*floaterp)->setCanResize((*floaterp)->isResizable());
- }
-
+ (*floaterp)->buildFromFile(path); // just build it
+ (*floaterp)->openFloater((*floaterp)->getKey());
+ (*floaterp)->setCanResize((*floaterp)->isResizable());
}
else if (!strncmp(path.c_str(),"menu_",5)) // if it's a menu
{
- if (save)
- {
- LLXMLNodePtr menu_write = new LLXMLNode();
- LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>(path, gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance(), menu_write);
-
- if (!menu_write->isNull())
- {
- std::string full_filename = append_new_to_xml_filename(path);
- LLFILE* menu_temp = LLFile::fopen(full_filename.c_str(), "w");
- LLXMLNode::writeHeaderToFile(menu_temp);
- const bool use_type_decorations = false;
- menu_write->writeToFile(menu_temp, std::string(), use_type_decorations);
- fclose(menu_temp);
- }
-
- delete menu;
- }
+ // former 'save' processing excised
}
else // if it is a panel...
{
@@ -896,39 +854,21 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID, bool save)
LLPanel::Params panel_params;
LLPanel* panel = LLUICtrlFactory::create<LLPanel>(panel_params); // create a new panel
- if (save)
- {
- LLXMLNodePtr panel_write = new LLXMLNode();
- panel->buildFromFile(path, panel_write); // build it
-
- if (!panel_write->isNull())
- {
- std::string full_filename = append_new_to_xml_filename(path);
- LLFILE* panel_temp = LLFile::fopen(full_filename.c_str(), "w");
- LLXMLNode::writeHeaderToFile(panel_temp);
- const bool use_type_decorations = false;
- panel_write->writeToFile(panel_temp, std::string(), use_type_decorations);
- fclose(panel_temp);
- }
- }
- else
- {
- panel->buildFromFile(path); // build it
- LLRect new_size = panel->getRect(); // get its rectangle
- panel->setOrigin(2,2); // reset its origin point so it's not offset by -left or other XUI attributes
- (*floaterp)->setTitle(path); // use the file name as its title, since panels have no guaranteed meaningful name attribute
- panel->setUseBoundingRect(TRUE); // enable the use of its outer bounding rect (normally disabled because it's O(n) on the number of sub-elements)
- panel->updateBoundingRect(); // update bounding rect
- LLRect bounding_rect = panel->getBoundingRect(); // get the bounding rect
- LLRect new_rect = panel->getRect(); // get the panel's rect
- new_rect.unionWith(bounding_rect); // union them to make sure we get the biggest one possible
- LLRect floater_rect = new_rect;
- floater_rect.stretch(4, 4);
- (*floaterp)->reshape(floater_rect.getWidth(), floater_rect.getHeight() + floater_header_size); // reshape floater to match the union rect's dimensions
- panel->reshape(new_rect.getWidth(), new_rect.getHeight()); // reshape panel to match the union rect's dimensions as well (both are needed)
- (*floaterp)->addChild(panel); // add panel as child
- (*floaterp)->openFloater(); // open floater (needed?)
- }
+ panel->buildFromFile(path); // build it
+ LLRect new_size = panel->getRect(); // get its rectangle
+ panel->setOrigin(2,2); // reset its origin point so it's not offset by -left or other XUI attributes
+ (*floaterp)->setTitle(path); // use the file name as its title, since panels have no guaranteed meaningful name attribute
+ panel->setUseBoundingRect(TRUE); // enable the use of its outer bounding rect (normally disabled because it's O(n) on the number of sub-elements)
+ panel->updateBoundingRect(); // update bounding rect
+ LLRect bounding_rect = panel->getBoundingRect(); // get the bounding rect
+ LLRect new_rect = panel->getRect(); // get the panel's rect
+ new_rect.unionWith(bounding_rect); // union them to make sure we get the biggest one possible
+ LLRect floater_rect = new_rect;
+ floater_rect.stretch(4, 4);
+ (*floaterp)->reshape(floater_rect.getWidth(), floater_rect.getHeight() + floater_header_size); // reshape floater to match the union rect's dimensions
+ panel->reshape(new_rect.getWidth(), new_rect.getHeight()); // reshape panel to match the union rect's dimensions as well (both are needed)
+ (*floaterp)->addChild(panel); // add panel as child
+ (*floaterp)->openFloater(); // open floater (needed?)
}
if(ID == 1)
@@ -964,7 +904,7 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID, bool save)
(*floaterp)->center();
addDependentFloater(*floaterp);
- if(click && ID == 1 && !save)
+ if(click && ID == 1)
{
// set up live file to track it
if(mLiveFile)
diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp
index 151cd2a1cd..e85d849c9a 100644
--- a/indra/newview/llfloaterurlentry.cpp
+++ b/indra/newview/llfloaterurlentry.cpp
@@ -219,7 +219,8 @@ void LLFloaterURLEntry::onBtnOK( void* userdata )
}
// Discover the MIME type only for "http" scheme.
- if(scheme == "http" || scheme == "https")
+ if(!media_url.empty() &&
+ (scheme == "http" || scheme == "https"))
{
LLHTTPClient::getHeaderOnly( media_url,
new LLMediaTypeResponder(self->getHandle()));
diff --git a/indra/newview/llfloatervoicevolume.cpp b/indra/newview/llfloatervoicevolume.cpp
new file mode 100644
index 0000000000..38446e46df
--- /dev/null
+++ b/indra/newview/llfloatervoicevolume.cpp
@@ -0,0 +1,220 @@
+/**
+ * @file llfloatervoicevolume.cpp
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatervoicevolume.h"
+
+// Linden libraries
+#include "llavatarname.h"
+#include "llavatarnamecache.h"
+#include "llfloater.h"
+#include "llfloaterreg.h"
+#include "lltextbox.h"
+
+// viewer files
+#include "llagent.h"
+#include "llavataractions.h"
+#include "llinspect.h"
+#include "lltransientfloatermgr.h"
+#include "llvoiceclient.h"
+
+class LLAvatarName;
+
+//////////////////////////////////////////////////////////////////////////////
+// LLFloaterVoiceVolume
+//////////////////////////////////////////////////////////////////////////////
+
+// 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 LLFloaterVoiceVolume : public LLInspect, LLTransientFloater
+{
+ friend class LLFloaterReg;
+
+public:
+ // avatar_id - Avatar ID for which to show information
+ // Inspector will be positioned relative to current mouse position
+ LLFloaterVoiceVolume(const LLSD& avatar_id);
+ virtual ~LLFloaterVoiceVolume();
+
+ /*virtual*/ BOOL postBuild(void);
+
+ // Because floater is single instance, need to re-parse data on each spawn
+ // (for example, inspector about same avatar but in different position)
+ /*virtual*/ void onOpen(const LLSD& avatar_id);
+
+ /*virtual*/ LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::GLOBAL; }
+
+private:
+ // Set the volume slider to this user's current client-side volume setting,
+ // hiding/disabling if the user is not nearby.
+ void updateVolumeControls();
+
+ void onClickMuteVolume();
+ void onVolumeChange(const LLSD& data);
+ void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
+
+private:
+ LLUUID mAvatarID;
+ // Need avatar name information to spawn friend add request
+ LLAvatarName mAvatarName;
+ boost::signals2::connection mAvatarNameCacheConnection;
+};
+
+LLFloaterVoiceVolume::LLFloaterVoiceVolume(const LLSD& sd)
+: LLInspect(LLSD()) // single_instance, doesn't really need key
+, mAvatarID() // set in onOpen() *Note: we used to show partner's name but we dont anymore --angela 3rd Dec*
+, mAvatarName()
+, mAvatarNameCacheConnection()
+{
+ LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::GLOBAL, this);
+ LLTransientFloater::init(this);
+}
+
+LLFloaterVoiceVolume::~LLFloaterVoiceVolume()
+{
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+ LLTransientFloaterMgr::getInstance()->removeControlView(this);
+}
+
+/*virtual*/
+BOOL LLFloaterVoiceVolume::postBuild(void)
+{
+ getChild<LLUICtrl>("mute_btn")->setCommitCallback(
+ boost::bind(&LLFloaterVoiceVolume::onClickMuteVolume, this) );
+
+ getChild<LLUICtrl>("volume_slider")->setCommitCallback(
+ boost::bind(&LLFloaterVoiceVolume::onVolumeChange, this, _2));
+
+ return TRUE;
+}
+
+
+// Multiple calls to showInstance("floater_voice_volume", foo) will provide different
+// LLSD for foo, which we will catch here.
+//virtual
+void LLFloaterVoiceVolume::onOpen(const LLSD& data)
+{
+ // Start open animation
+ LLInspect::onOpen(data);
+
+ // Extract appropriate avatar id
+ mAvatarID = data["avatar_id"];
+
+ LLUI::positionViewNearMouse(this);
+
+ getChild<LLUICtrl>("avatar_name")->setValue("");
+ updateVolumeControls();
+
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+ mAvatarNameCacheConnection = LLAvatarNameCache::get(mAvatarID, boost::bind(&LLFloaterVoiceVolume::onAvatarNameCache, this, _1, _2));
+}
+
+void LLFloaterVoiceVolume::updateVolumeControls()
+{
+ bool voice_enabled = LLVoiceClient::getInstance()->getVoiceEnabled(mAvatarID);
+
+ LLUICtrl* mute_btn = getChild<LLUICtrl>("mute_btn");
+ LLUICtrl* volume_slider = getChild<LLUICtrl>("volume_slider");
+
+ // 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()))
+ {
+ mute_btn->setVisible(false);
+ volume_slider->setVisible(false);
+ }
+ else
+ {
+ mute_btn->setVisible(true);
+ volume_slider->setVisible(true);
+
+ // By convention, we only display and toggle voice mutes, not all mutes
+ bool is_muted = LLAvatarActions::isVoiceMuted(mAvatarID);
+ bool is_linden = LLStringUtil::endsWith(mAvatarName.getUserName(), " Linden");
+
+ mute_btn->setEnabled(!is_linden);
+ mute_btn->setValue(is_muted);
+
+ volume_slider->setEnabled(!is_muted);
+
+ F32 volume;
+ if (is_muted)
+ {
+ // it's clearer to display their volume as zero
+ volume = 0.f;
+ }
+ else
+ {
+ // actual volume
+ volume = LLVoiceClient::getInstance()->getUserVolume(mAvatarID);
+ }
+ volume_slider->setValue((F64)volume);
+ }
+
+}
+
+void LLFloaterVoiceVolume::onClickMuteVolume()
+{
+ LLAvatarActions::toggleMuteVoice(mAvatarID);
+ updateVolumeControls();
+}
+
+void LLFloaterVoiceVolume::onVolumeChange(const LLSD& data)
+{
+ F32 volume = (F32)data.asReal();
+ LLVoiceClient::getInstance()->setUserVolume(mAvatarID, volume);
+}
+
+void LLFloaterVoiceVolume::onAvatarNameCache(
+ const LLUUID& agent_id,
+ const LLAvatarName& av_name)
+{
+ mAvatarNameCacheConnection.disconnect();
+
+ if (agent_id != mAvatarID)
+ {
+ return;
+ }
+
+ getChild<LLUICtrl>("avatar_name")->setValue(av_name.getCompleteName());
+ mAvatarName = av_name;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// LLFloaterVoiceVolumeUtil
+//////////////////////////////////////////////////////////////////////////////
+void LLFloaterVoiceVolumeUtil::registerFloater()
+{
+ LLFloaterReg::add("floater_voice_volume", "floater_voice_volume.xml",
+ &LLFloaterReg::build<LLFloaterVoiceVolume>);
+}
diff --git a/indra/newview/llfloatervoicevolume.h b/indra/newview/llfloatervoicevolume.h
new file mode 100644
index 0000000000..8fcf7f250b
--- /dev/null
+++ b/indra/newview/llfloatervoicevolume.h
@@ -0,0 +1,35 @@
+/**
+ * @file llfloatervoicevolume.h
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERVOICEVOLUME_H
+#define LL_LLFLOATERVOICEVOLUME_H
+
+namespace LLFloaterVoiceVolumeUtil
+{
+ // Register with LLFloaterReg
+ void registerFloater();
+}
+
+#endif // LL_LLFLOATERVOICEVOLUME_H
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
deleted file mode 100644
index d4080ab3f7..0000000000
--- a/indra/newview/llfolderview.cpp
+++ /dev/null
@@ -1,2641 +0,0 @@
-/**
- * @file llfolderview.cpp
- * @brief Implementation of the folder view collection of classes.
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfolderview.h"
-
-#include "llcallbacklist.h"
-#include "llinventorybridge.h"
-#include "llclipboard.h" // *TODO: remove this once hack below gone.
-#include "llinventoryfilter.h"
-#include "llinventoryfunctions.h"
-#include "llinventorymodelbackgroundfetch.h"
-#include "llinventorypanel.h"
-#include "llfoldertype.h"
-#include "llfloaterinventory.h"// hacked in for the bonus context menu items.
-#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"
-#include "lltrans.h"
-#include "llui.h"
-#include "llviewertexture.h"
-#include "llviewertexturelist.h"
-#include "llviewerjointattachment.h"
-#include "llviewermenu.h"
-#include "lluictrlfactory.h"
-#include "llviewercontrol.h"
-#include "llviewerfoldertype.h"
-#include "llviewerwindow.h"
-#include "llvoavatar.h"
-#include "llfloaterproperties.h"
-#include "llnotificationsutil.h"
-
-// Linden library includes
-#include "lldbstrings.h"
-#include "llfocusmgr.h"
-#include "llfontgl.h"
-#include "llgl.h"
-#include "llrender.h"
-#include "llinventory.h"
-
-// Third-party library includes
-#include <algorithm>
-
-///----------------------------------------------------------------------------
-/// Local function declarations, constants, enums, and typedefs
-///----------------------------------------------------------------------------
-
-const S32 RENAME_WIDTH_PAD = 4;
-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
- + LLFolderViewItem::ARROW_SIZE
- + LLFolderViewItem::TEXT_PAD
- + /*first few characters*/ 40;
-const S32 MINIMUM_RENAMER_WIDTH = 80;
-
-// *TODO: move in params in xml if necessary. Requires modification of LLFolderView & LLInventoryPanel Params.
-const S32 STATUS_TEXT_HPAD = 6;
-const S32 STATUS_TEXT_VPAD = 8;
-
-enum {
- SIGNAL_NO_KEYBOARD_FOCUS = 1,
- SIGNAL_KEYBOARD_FOCUS = 2
-};
-
-F32 LLFolderView::sAutoOpenTime = 1.f;
-
-void delete_selected_item(void* user_data);
-void copy_selected_item(void* user_data);
-void open_selected_items(void* user_data);
-void properties_selected_items(void* user_data);
-void paste_items(void* user_data);
-
-
-//---------------------------------------------------------------------------
-
-// Tells all folders in a folderview to sort their items
-// (and only their items, not folders) by a certain function.
-class LLSetItemSortFunction : public LLFolderViewFunctor
-{
-public:
- LLSetItemSortFunction(U32 ordering)
- : mSortOrder(ordering) {}
- virtual ~LLSetItemSortFunction() {}
- virtual void doFolder(LLFolderViewFolder* folder);
- virtual void doItem(LLFolderViewItem* item);
-
- U32 mSortOrder;
-};
-
-
-// Set the sort order.
-void LLSetItemSortFunction::doFolder(LLFolderViewFolder* folder)
-{
- folder->setItemSortOrder(mSortOrder);
-}
-
-// Do nothing.
-void LLSetItemSortFunction::doItem(LLFolderViewItem* item)
-{
- return;
-}
-
-//---------------------------------------------------------------------------
-
-// Tells all folders in a folderview to close themselves
-// For efficiency, calls setOpenArrangeRecursively().
-// The calling function must then call:
-// LLFolderView* root = getRoot();
-// if( root )
-// {
-// root->arrange( NULL, NULL );
-// root->scrollToShowSelection();
-// }
-// to patch things up.
-class LLCloseAllFoldersFunctor : public LLFolderViewFunctor
-{
-public:
- LLCloseAllFoldersFunctor(BOOL close) { mOpen = !close; }
- virtual ~LLCloseAllFoldersFunctor() {}
- virtual void doFolder(LLFolderViewFolder* folder);
- virtual void doItem(LLFolderViewItem* item);
-
- BOOL mOpen;
-};
-
-
-// Set the sort order.
-void LLCloseAllFoldersFunctor::doFolder(LLFolderViewFolder* folder)
-{
- folder->setOpenArrangeRecursively(mOpen);
-}
-
-// Do nothing.
-void LLCloseAllFoldersFunctor::doItem(LLFolderViewItem* item)
-{ }
-
-///----------------------------------------------------------------------------
-/// Class LLFolderViewScrollContainer
-///----------------------------------------------------------------------------
-
-// virtual
-const LLRect LLFolderViewScrollContainer::getScrolledViewRect() const
-{
- LLRect rect = LLRect::null;
- if (mScrolledView)
- {
- LLFolderView* folder_view = dynamic_cast<LLFolderView*>(mScrolledView);
- if (folder_view)
- {
- S32 height = folder_view->mRunningHeight;
-
- rect = mScrolledView->getRect();
- rect.setLeftTopAndSize(rect.mLeft, rect.mTop, rect.getWidth(), height);
- }
- }
-
- return rect;
-}
-
-LLFolderViewScrollContainer::LLFolderViewScrollContainer(const LLScrollContainer::Params& p)
-: LLScrollContainer(p)
-{}
-
-///----------------------------------------------------------------------------
-/// Class LLFolderView
-///----------------------------------------------------------------------------
-LLFolderView::Params::Params()
-: task_id("task_id"),
- title("title"),
- use_label_suffix("use_label_suffix"),
- allow_multiselect("allow_multiselect", true),
- show_empty_message("show_empty_message", true),
- show_load_status("show_load_status", true),
- use_ellipses("use_ellipses", false)
-{
-}
-
-
-// Default constructor
-LLFolderView::LLFolderView(const Params& p)
-: LLFolderViewFolder(p),
- mRunningHeight(0),
- mScrollContainer( NULL ),
- mPopupMenuHandle(),
- mAllowMultiSelect(p.allow_multiselect),
- mShowEmptyMessage(p.show_empty_message),
- mShowFolderHierarchy(FALSE),
- mSourceID(p.task_id),
- mRenameItem( NULL ),
- mNeedsScroll( FALSE ),
- mUseLabelSuffix(p.use_label_suffix),
- mPinningSelectedItem(FALSE),
- mNeedsAutoSelect( FALSE ),
- mAutoSelectOverride(FALSE),
- mNeedsAutoRename(FALSE),
- mDebugFilters(FALSE),
- mSortOrder(LLInventoryFilter::SO_FOLDERS_BY_NAME), // This gets overridden by a pref immediately
- mFilter( new LLInventoryFilter(p.title) ),
- mShowSelectionContext(FALSE),
- mShowSingleSelection(FALSE),
- mArrangeGeneration(0),
- mSignalSelectCallback(0),
- mMinWidth(0),
- mDragAndDropThisFrame(FALSE),
- mCallbackRegistrar(NULL),
- mParentPanel(p.parent_panel),
- mUseEllipses(p.use_ellipses),
- mDraggingOverItem(NULL),
- mStatusTextBox(NULL)
-{
- mRoot = this;
-
- mShowLoadStatus = p.show_load_status();
-
- LLRect rect = p.rect;
- LLRect new_rect(rect.mLeft, rect.mBottom + getRect().getHeight(), rect.mLeft + getRect().getWidth(), rect.mBottom);
- setRect( rect );
- reshape(rect.getWidth(), rect.getHeight());
- mIsOpen = TRUE; // this view is always open.
- mAutoOpenItems.setDepth(AUTO_OPEN_STACK_DEPTH);
- mAutoOpenCandidate = NULL;
- mAutoOpenTimer.stop();
- mKeyboardSelection = FALSE;
- 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
- // go ahead and render root folder as usual
- // just make sure the label ("Inventory Folder") never shows up
- mLabel = LLStringUtil::null;
-
- //mRenamer->setWriteableBgColor(LLColor4::white);
- // Escape is handled by reverting the rename, not commiting it (default behavior)
- LLLineEditor::Params params;
- params.name("ren");
- 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(&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 - font->getLineHeight());
- text_p.rect(new_r);
- text_p.name(std::string(p.name));
- text_p.font(font);
- text_p.visible(false);
- text_p.parse_urls(true);
- text_p.wrap(true); // allow multiline text. See EXT-7564, EXT-7047
- // set text padding the same as in People panel. EXT-7047, EXT-4837
- text_p.h_pad(STATUS_TEXT_HPAD);
- text_p.v_pad(STATUS_TEXT_VPAD);
- mStatusTextBox = LLUICtrlFactory::create<LLTextBox> (text_p);
- mStatusTextBox->setFollowsLeft();
- mStatusTextBox->setFollowsTop();
- //addChild(mStatusTextBox);
-
-
- // make the popup menu available
- LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- if (!menu)
- {
- menu = LLUICtrlFactory::getDefaultWidget<LLMenuGL>("inventory_menu");
- }
- menu->setBackgroundColor(LLUIColorTable::instance().getColor("MenuPopupBgColor"));
- mPopupMenuHandle = menu->getHandle();
-
- mListener->openItem();
-}
-
-// Destroys the object
-LLFolderView::~LLFolderView( void )
-{
- closeRenamer();
-
- // The release focus call can potentially call the
- // scrollcontainer, which can potentially be called with a partly
- // destroyed scollcontainer. Just null it out here, and no worries
- // about calling into the invalid scroll container.
- // Same with the renamer.
- mScrollContainer = NULL;
- mRenameItem = NULL;
- mRenamer = NULL;
- mStatusTextBox = NULL;
-
- mAutoOpenItems.removeAllNodes();
- gIdleCallbacks.deleteFunction(idle, this);
-
- if (mPopupMenuHandle.get()) mPopupMenuHandle.get()->die();
-
- mAutoOpenItems.removeAllNodes();
- clearSelection();
- mItems.clear();
- mFolders.clear();
-
- mItemMap.clear();
-
- delete mFilter;
- mFilter = NULL;
-}
-
-BOOL LLFolderView::canFocusChildren() const
-{
- return FALSE;
-}
-
-static LLFastTimer::DeclareTimer FTM_SORT("Sort Inventory");
-
-void LLFolderView::setSortOrder(U32 order)
-{
- if (order != mSortOrder)
- {
- LLFastTimer t(FTM_SORT);
-
- mSortOrder = order;
-
- sortBy(order);
- arrangeAll();
- }
-}
-
-
-U32 LLFolderView::getSortOrder() const
-{
- return mSortOrder;
-}
-
-BOOL LLFolderView::addFolder( LLFolderViewFolder* folder)
-{
- // enforce sort order of My Inventory followed by Library
- if (folder->getListener()->getUUID() == gInventory.getLibraryRootFolderID())
- {
- mFolders.push_back(folder);
- }
- else
- {
- mFolders.insert(mFolders.begin(), folder);
- }
- folder->setShowLoadStatus(mShowLoadStatus);
- folder->setOrigin(0, 0);
- folder->reshape(getRect().getWidth(), 0);
- folder->setVisible(FALSE);
- addChild( folder );
- folder->dirtyFilter();
- folder->requestArrange();
- return TRUE;
-}
-
-void LLFolderView::closeAllFolders()
-{
- // Close all the folders
- setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_DOWN);
- arrangeAll();
-}
-
-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
- LLFolderViewFolder::setOpenArrangeRecursively(openitem, recurse);
- // make sure root folder is always open
- mIsOpen = TRUE;
-}
-
-static LLFastTimer::DeclareTimer FTM_ARRANGE("Arrange");
-
-// This view grows and shrinks to enclose all of its children items and folders.
-S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_generation )
-{
- if (getListener()->getUUID().notNull())
- {
- if (mNeedsSort)
- {
- mFolders.sort(mSortFunction);
- mItems.sort(mSortFunction);
- mNeedsSort = false;
- }
- }
-
- LLFastTimer t2(FTM_ARRANGE);
-
- filter_generation = mFilter->getMinRequiredGeneration();
- mMinWidth = 0;
-
- mHasVisibleChildren = hasFilteredDescendants(filter_generation);
- // arrange always finishes, so optimistically set the arrange generation to the most current
- mLastArrangeGeneration = getRoot()->getArrangeGeneration();
-
- LLInventoryFilter::EFolderShow show_folder_state =
- getRoot()->getFilter()->getShowFolderState();
-
- S32 total_width = LEFT_PAD;
- S32 running_height = mDebugFilters ? LLFontGL::getFontMonospace()->getLineHeight() : 0;
- S32 target_height = running_height;
- S32 parent_item_height = getRect().getHeight();
-
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
- {
- folders_t::iterator fit = iter++;
- LLFolderViewFolder* folderp = (*fit);
- if (getDebugFilters())
- {
- folderp->setVisible(TRUE);
- }
- else
- {
- folderp->setVisible((show_folder_state == LLInventoryFilter::SHOW_ALL_FOLDERS || // always show folders?
- (folderp->getFiltered(filter_generation) || folderp->hasFilteredDescendants(filter_generation))));
- }
-
- if (folderp->getVisible())
- {
- S32 child_height = 0;
- S32 child_width = 0;
- S32 child_top = parent_item_height - running_height;
-
- target_height += folderp->arrange( &child_width, &child_height, filter_generation );
-
- mMinWidth = llmax(mMinWidth, child_width);
- total_width = llmax( total_width, child_width );
- running_height += child_height;
- folderp->setOrigin( ICON_PAD, child_top - (*fit)->getRect().getHeight() );
- }
- }
-
- for (items_t::iterator iter = mItems.begin();
- iter != mItems.end();)
- {
- items_t::iterator iit = iter++;
- LLFolderViewItem* itemp = (*iit);
- itemp->setVisible(itemp->getFiltered(filter_generation));
-
- if (itemp->getVisible())
- {
- S32 child_width = 0;
- S32 child_height = 0;
- S32 child_top = parent_item_height - running_height;
-
- target_height += itemp->arrange( &child_width, &child_height, filter_generation );
- itemp->reshape(itemp->getRect().getWidth(), child_height);
-
- mMinWidth = llmax(mMinWidth, child_width);
- total_width = llmax( total_width, child_width );
- running_height += child_height;
- itemp->setOrigin( ICON_PAD, child_top - itemp->getRect().getHeight() );
- }
- }
-
- if(!mHasVisibleChildren)// is there any filtered items ?
- {
- //Nope. We need to display status textbox, let's reserve some place for it
- running_height = mStatusTextBox->getTextPixelHeight();
- target_height = running_height;
- }
-
- mRunningHeight = running_height;
- LLRect scroll_rect = mScrollContainer->getContentWindowRect();
- reshape( llmax(scroll_rect.getWidth(), total_width), running_height );
-
- LLRect new_scroll_rect = mScrollContainer->getContentWindowRect();
- if (new_scroll_rect.getWidth() != scroll_rect.getWidth())
- {
- reshape( llmax(scroll_rect.getWidth(), total_width), running_height );
- }
-
- // move item renamer text field to item's new position
- updateRenamerPosition();
-
- mTargetHeight = (F32)target_height;
- return llround(mTargetHeight);
-}
-
-const std::string LLFolderView::getFilterSubString(BOOL trim)
-{
- return mFilter->getFilterSubString(trim);
-}
-
-static LLFastTimer::DeclareTimer FTM_FILTER("Filter Inventory");
-
-void LLFolderView::filter( LLInventoryFilter& filter )
-{
- LLFastTimer t2(FTM_FILTER);
- filter.setFilterCount(llclamp(gSavedSettings.getS32("FilterItemsPerFrame"), 1, 5000));
-
- if (getCompletedFilterGeneration() < filter.getCurrentGeneration())
- {
- mPassedFilter = FALSE;
- mMinWidth = 0;
- LLFolderViewFolder::filter(filter);
- }
- else
- {
- mPassedFilter = TRUE;
- }
-}
-
-void LLFolderView::reshape(S32 width, S32 height, BOOL called_from_parent)
-{
- LLRect scroll_rect;
- if (mScrollContainer)
- {
- LLView::reshape(width, height, called_from_parent);
- scroll_rect = mScrollContainer->getContentWindowRect();
- }
- width = llmax(mMinWidth, scroll_rect.getWidth());
- height = llmax(mRunningHeight, scroll_rect.getHeight());
-
- // Restrict width within scroll container's width
- if (mUseEllipses && mScrollContainer)
- {
- width = scroll_rect.getWidth();
- }
- LLView::reshape(width, height, called_from_parent);
- mReshapeSignal(mSelectedItems, FALSE);
-}
-
-void LLFolderView::addToSelectionList(LLFolderViewItem* item)
-{
- if (item->isSelected())
- {
- removeFromSelectionList(item);
- }
- if (mSelectedItems.size())
- {
- mSelectedItems.back()->setIsCurSelection(FALSE);
- }
- item->setIsCurSelection(TRUE);
- mSelectedItems.push_back(item);
-}
-
-void LLFolderView::removeFromSelectionList(LLFolderViewItem* item)
-{
- if (mSelectedItems.size())
- {
- mSelectedItems.back()->setIsCurSelection(FALSE);
- }
-
- selected_items_t::iterator item_iter;
- for (item_iter = mSelectedItems.begin(); item_iter != mSelectedItems.end();)
- {
- if (*item_iter == item)
- {
- item_iter = mSelectedItems.erase(item_iter);
- }
- else
- {
- ++item_iter;
- }
- }
- if (mSelectedItems.size())
- {
- mSelectedItems.back()->setIsCurSelection(TRUE);
- }
-}
-
-LLFolderViewItem* LLFolderView::getCurSelectedItem( void )
-{
- if(mSelectedItems.size())
- {
- LLFolderViewItem* itemp = mSelectedItems.back();
- llassert(itemp->getIsCurSelection());
- return itemp;
- }
- return NULL;
-}
-
-
-// Record the selected item and pass it down the hierachy.
-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;
- }
-
- if( selection && take_keyboard_focus)
- {
- mParentPanel->setFocus(TRUE);
- }
-
- // clear selection down here because change of keyboard focus can potentially
- // affect selection
- clearSelection();
-
- if(selection)
- {
- addToSelectionList(selection);
- }
-
- BOOL rv = LLFolderViewFolder::setSelection(selection, openitem, take_keyboard_focus);
- if(openitem && selection)
- {
- selection->getParentFolder()->requestArrange();
- }
-
- llassert(mSelectedItems.size() <= 1);
-
- return rv;
-}
-
-void LLFolderView::setSelectionByID(const LLUUID& obj_id, BOOL take_keyboard_focus)
-{
- LLFolderViewItem* itemp = getItemByID(obj_id);
- if(itemp && itemp->getListener())
- {
- itemp->arrangeAndSet(TRUE, take_keyboard_focus);
- mSelectThisID.setNull();
- return;
- }
- else
- {
- // save the desired item to be selected later (if/when ready)
- mSelectThisID = obj_id;
- }
-}
-
-void LLFolderView::updateSelection()
-{
- if (mSelectThisID.notNull())
- {
- setSelectionByID(mSelectThisID, false);
- }
-}
-
-BOOL LLFolderView::changeSelection(LLFolderViewItem* selection, BOOL selected)
-{
- BOOL rv = FALSE;
-
- // can't select root folder
- if(!selection || selection == this)
- {
- return FALSE;
- }
-
- if (!mAllowMultiSelect)
- {
- clearSelection();
- }
-
- selected_items_t::iterator item_iter;
- for (item_iter = mSelectedItems.begin(); item_iter != mSelectedItems.end(); ++item_iter)
- {
- if (*item_iter == selection)
- {
- break;
- }
- }
-
- BOOL on_list = (item_iter != mSelectedItems.end());
-
- if(selected && !on_list)
- {
- addToSelectionList(selection);
- }
- if(!selected && on_list)
- {
- removeFromSelectionList(selection);
- }
-
- rv = LLFolderViewFolder::changeSelection(selection, selected);
-
- mSignalSelectCallback = SIGNAL_KEYBOARD_FOCUS;
-
- return rv;
-}
-
-static LLFastTimer::DeclareTimer FTM_SANITIZE_SELECTION("Sanitize Selection");
-void LLFolderView::sanitizeSelection()
-{
- LLFastTimer _(FTM_SANITIZE_SELECTION);
- // store off current item in case it is automatically deselected
- // and we want to preserve context
- LLFolderViewItem* original_selected_item = getCurSelectedItem();
-
- // Cache "Show all folders" filter setting
- BOOL show_all_folders = (getRoot()->getFilter()->getShowFolderState() == LLInventoryFilter::SHOW_ALL_FOLDERS);
-
- std::vector<LLFolderViewItem*> items_to_remove;
- selected_items_t::iterator item_iter;
- for (item_iter = mSelectedItems.begin(); item_iter != mSelectedItems.end(); ++item_iter)
- {
- LLFolderViewItem* item = *item_iter;
-
- // ensure that each ancestor is open and potentially passes filtering
- BOOL visible = item->potentiallyVisible(); // initialize from filter state for this item
- // modify with parent open and filters states
- LLFolderViewFolder* parent_folder = item->getParentFolder();
- if ( parent_folder )
- {
- if ( show_all_folders )
- { // "Show all folders" is on, so this folder is visible
- visible = TRUE;
- }
- else
- { // Move up through parent folders and see what's visible
- while(parent_folder)
- {
- visible = visible && parent_folder->isOpen() && parent_folder->potentiallyVisible();
- parent_folder = parent_folder->getParentFolder();
- }
- }
- }
-
- // deselect item if any ancestor is closed or didn't pass filter requirements.
- if (!visible)
- {
- items_to_remove.push_back(item);
- }
-
- // disallow nested selections (i.e. folder items plus one or more ancestors)
- // could check cached mum selections count and only iterate if there are any
- // but that may be a premature optimization.
- selected_items_t::iterator other_item_iter;
- for (other_item_iter = mSelectedItems.begin(); other_item_iter != mSelectedItems.end(); ++other_item_iter)
- {
- LLFolderViewItem* other_item = *other_item_iter;
- for( parent_folder = other_item->getParentFolder(); parent_folder; parent_folder = parent_folder->getParentFolder())
- {
- if (parent_folder == item)
- {
- // this is a descendent of the current folder, remove from list
- items_to_remove.push_back(other_item);
- break;
- }
- }
- }
-
- // Don't allow invisible items (such as root folders) to be selected.
- if (item == getRoot())
- {
- items_to_remove.push_back(item);
- }
- }
-
- std::vector<LLFolderViewItem*>::iterator item_it;
- for (item_it = items_to_remove.begin(); item_it != items_to_remove.end(); ++item_it )
- {
- changeSelection(*item_it, FALSE); // toggle selection (also removes from list)
- }
-
- // if nothing selected after prior constraints...
- if (mSelectedItems.empty())
- {
- // ...select first available parent of original selection
- LLFolderViewItem* new_selection = NULL;
- if (original_selected_item)
- {
- for(LLFolderViewFolder* parent_folder = original_selected_item->getParentFolder();
- parent_folder;
- parent_folder = parent_folder->getParentFolder())
- {
- if (parent_folder->potentiallyVisible())
- {
- // give initial selection to first ancestor folder that potentially passes the filter
- if (!new_selection)
- {
- new_selection = parent_folder;
- }
-
- // if any ancestor folder of original item is closed, move the selection up
- // to the highest closed
- if (!parent_folder->isOpen())
- {
- new_selection = parent_folder;
- }
- }
- }
- }
- else
- {
- new_selection = NULL;
- }
-
- if (new_selection)
- {
- setSelection(new_selection, FALSE, FALSE);
- }
- }
-}
-
-void LLFolderView::clearSelection()
-{
- for (selected_items_t::const_iterator item_it = mSelectedItems.begin();
- item_it != mSelectedItems.end();
- ++item_it)
- {
- (*item_it)->setUnselected();
- }
-
- mSelectedItems.clear();
- mSelectThisID.setNull();
-}
-
-std::set<LLUUID> LLFolderView::getSelectionList() const
-{
- std::set<LLUUID> selection;
- for (selected_items_t::const_iterator item_it = mSelectedItems.begin();
- item_it != mSelectedItems.end();
- ++item_it)
- {
- selection.insert((*item_it)->getListener()->getUUID());
- }
- return selection;
-}
-
-BOOL LLFolderView::startDrag(LLToolDragAndDrop::ESource source)
-{
- std::vector<EDragAndDropType> types;
- uuid_vec_t cargo_ids;
- selected_items_t::iterator item_it;
- BOOL can_drag = TRUE;
- if (!mSelectedItems.empty())
- {
- for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
- {
- EDragAndDropType type = DAD_NONE;
- LLUUID id = LLUUID::null;
- can_drag = can_drag && (*item_it)->getListener()->startDrag(&type, &id);
-
- types.push_back(type);
- cargo_ids.push_back(id);
- }
-
- LLToolDragAndDrop::getInstance()->beginMultiDrag(types, cargo_ids, source, mSourceID);
- }
- return can_drag;
-}
-
-void LLFolderView::commitRename( const LLSD& data )
-{
- finishRenamingItem();
-}
-
-void LLFolderView::draw()
-{
- static LLUIColor sSearchStatusColor = LLUIColorTable::instance().getColor("InventorySearchStatusColor", LLColor4::white);
- if (mDebugFilters)
- {
- std::string current_filter_string = llformat("Current Filter: %d, Least Filter: %d, Auto-accept Filter: %d",
- mFilter->getCurrentGeneration(), mFilter->getMinRequiredGeneration(), mFilter->getMustPassGeneration());
- 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);
-
- // if cursor has moved off of me during drag and drop
- // close all auto opened folders
- if (!mDragAndDropThisFrame)
- {
- closeAutoOpenedFolders();
- }
-
- // while dragging, update selection rendering to reflect single/multi drag status
- if (LLToolDragAndDrop::getInstance()->hasMouseCapture())
- {
- EAcceptance last_accept = LLToolDragAndDrop::getInstance()->getLastAccept();
- if (last_accept == ACCEPT_YES_SINGLE || last_accept == ACCEPT_YES_COPY_SINGLE)
- {
- setShowSingleSelection(TRUE);
- }
- else
- {
- setShowSingleSelection(FALSE);
- }
- }
- else
- {
- setShowSingleSelection(FALSE);
- }
-
-
- if (mSearchTimer.getElapsedTimeF32() > gSavedSettings.getF32("TypeAheadTimeout") || !mSearchString.size())
- {
- mSearchString.clear();
- }
-
- if (hasVisibleChildren()
- || mFilter->getShowFolderState() == LLInventoryFilter::SHOW_ALL_FOLDERS)
- {
- mStatusText.clear();
- mStatusTextBox->setVisible( FALSE );
- }
- else if (mShowEmptyMessage)
- {
- if (LLInventoryModelBackgroundFetch::instance().folderFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration())
- {
- mStatusText = LLTrans::getString("Searching");
- }
- else
- {
- if (getFilter())
- {
- LLStringUtil::format_map_t args;
- args["[SEARCH_TERM]"] = LLURI::escape(getFilter()->getFilterSubStringOrig());
- mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage(), args);
- }
- }
- mStatusTextBox->setValue(mStatusText);
- mStatusTextBox->setVisible( TRUE );
-
- // firstly reshape message textbox with current size. This is necessary to
- // LLTextBox::getTextPixelHeight works properly
- const LLRect local_rect = getLocalRect();
- mStatusTextBox->setShape(local_rect);
-
- // get preferable text height...
- S32 pixel_height = mStatusTextBox->getTextPixelHeight();
- bool height_changed = local_rect.getHeight() != pixel_height;
- if (height_changed)
- {
- // ... if it does not match current height, lets rearrange current view.
- // This will indirectly call ::arrange and reshape of the status textbox.
- // We should call this method to also notify parent about required rect.
- // See EXT-7564, EXT-7047.
- arrangeFromRoot();
- LLUI::popMatrix();
- LLUI::pushMatrix();
- LLUI::translate((F32)getRect().mLeft, (F32)getRect().mBottom);
- }
- }
-
- // skip over LLFolderViewFolder::draw since we don't want the folder icon, label,
- // and arrow for the root folder
- LLView::draw();
-
- mDragAndDropThisFrame = FALSE;
-}
-
-void LLFolderView::finishRenamingItem( void )
-{
- if(!mRenamer)
- {
- return;
- }
- if( mRenameItem )
- {
- mRenameItem->rename( mRenamer->getText() );
- }
-
- closeRenamer();
-
- // List is re-sorted alphabeticly, so scroll to make sure the selected item is visible.
- scrollToShowSelection();
-}
-
-void LLFolderView::closeRenamer( void )
-{
- if (mRenamer && mRenamer->getVisible())
- {
- // Triggers onRenamerLost() that actually closes the renamer.
- gViewerWindow->removePopup(mRenamer);
- }
-}
-
-void LLFolderView::removeSelectedItems( void )
-{
- if (mSelectedItems.empty()) return;
- LLSD args;
- args["QUESTION"] = LLTrans::getString(mSelectedItems.size() > 1 ? "DeleteItems" : "DeleteItem");
- LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&LLFolderView::onItemsRemovalConfirmation, this, _1, _2));
-}
-
-bool isDescendantOfASelectedItem(LLFolderViewItem* item, const std::vector<LLFolderViewItem*>& selectedItems)
-{
- LLFolderViewItem* item_parent = dynamic_cast<LLFolderViewItem*>(item->getParent());
-
- if (item_parent)
- {
- for(std::vector<LLFolderViewItem*>::const_iterator it = selectedItems.begin(); it != selectedItems.end(); ++it)
- {
- const LLFolderViewItem* const selected_item = (*it);
-
- LLFolderViewItem* parent = item_parent;
-
- while (parent)
- {
- if (selected_item == parent)
- {
- return true;
- }
-
- parent = dynamic_cast<LLFolderViewItem*>(parent->getParent());
- }
- }
- }
-
- return false;
-}
-
-// static
-void LLFolderView::removeCutItems()
-{
- // There's no item in "cut" mode on the clipboard -> exit
- if (!LLClipboard::instance().isCutMode())
- return;
-
- // Get the list of clipboard item uuids and iterate through them
- LLDynamicArray<LLUUID> objects;
- LLClipboard::instance().pasteFromClipboard(objects);
- for (LLDynamicArray<LLUUID>::const_iterator iter = objects.begin();
- iter != objects.end();
- ++iter)
- {
- gInventory.removeObject(*iter);
- }
-}
-
-void LLFolderView::onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if (option != 0) return; // canceled
-
- if(getVisible() && getEnabled())
- {
- // just in case we're removing the renaming item.
- mRenameItem = NULL;
-
- // create a temporary structure which we will use to remove
- // items, since the removal will futz with internal data
- // structures.
- std::vector<LLFolderViewItem*> items;
- S32 count = mSelectedItems.size();
- if(count == 0) return;
- LLFolderViewItem* item = NULL;
- selected_items_t::iterator item_it;
- for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
- {
- item = *item_it;
- if (item && item->isRemovable())
- {
- items.push_back(item);
- }
- else
- {
- llinfos << "Cannot delete " << item->getName() << llendl;
- return;
- }
- }
-
- // iterate through the new container.
- count = items.size();
- LLUUID new_selection_id;
- if(count == 1)
- {
- LLFolderViewItem* item_to_delete = items[0];
- LLFolderViewFolder* parent = item_to_delete->getParentFolder();
- LLFolderViewItem* new_selection = item_to_delete->getNextOpenNode(FALSE);
- if (!new_selection)
- {
- new_selection = item_to_delete->getPreviousOpenNode(FALSE);
- }
- if(parent)
- {
- if (parent->removeItem(item_to_delete))
- {
- // change selection on successful delete
- if (new_selection)
- {
- setSelectionFromRoot(new_selection, new_selection->isOpen(), mParentPanel->hasFocus());
- }
- else
- {
- setSelectionFromRoot(NULL, mParentPanel->hasFocus());
- }
- }
- }
- arrangeAll();
- }
- else if (count > 1)
- {
- LLDynamicArray<LLFolderViewEventListener*> listeners;
- LLFolderViewEventListener* listener;
- LLFolderViewItem* last_item = items[count - 1];
- LLFolderViewItem* new_selection = last_item->getNextOpenNode(FALSE);
- while(new_selection && new_selection->isSelected())
- {
- new_selection = new_selection->getNextOpenNode(FALSE);
- }
- if (!new_selection)
- {
- new_selection = last_item->getPreviousOpenNode(FALSE);
- while (new_selection && (new_selection->isSelected() || isDescendantOfASelectedItem(new_selection, items)))
- {
- new_selection = new_selection->getPreviousOpenNode(FALSE);
- }
- }
- if (new_selection)
- {
- setSelectionFromRoot(new_selection, new_selection->isOpen(), mParentPanel->hasFocus());
- }
- else
- {
- setSelectionFromRoot(NULL, mParentPanel->hasFocus());
- }
-
- for(S32 i = 0; i < count; ++i)
- {
- listener = items[i]->getListener();
- if(listener && (listeners.find(listener) == LLDynamicArray<LLFolderViewEventListener*>::FAIL))
- {
- listeners.put(listener);
- }
- }
- listener = listeners.get(0);
- if(listener)
- {
- listener->removeBatch(listeners);
- }
- }
- arrangeAll();
- scrollToShowSelection();
- }
-}
-
-// open the selected item.
-void LLFolderView::openSelectedItems( void )
-{
- if(getVisible() && getEnabled())
- {
- if (mSelectedItems.size() == 1)
- {
- mSelectedItems.front()->openItem();
- }
- else
- {
- LLMultiPreview* multi_previewp = new LLMultiPreview();
- LLMultiProperties* multi_propertiesp = new LLMultiProperties();
-
- selected_items_t::iterator item_it;
- for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
- {
- // IT_{OBJECT,ATTACHMENT} creates LLProperties
- // floaters; others create LLPreviews. Put
- // each one in the right type of container.
- LLFolderViewEventListener* listener = (*item_it)->getListener();
- bool is_prop = listener && (listener->getInventoryType() == LLInventoryType::IT_OBJECT || listener->getInventoryType() == LLInventoryType::IT_ATTACHMENT);
- if (is_prop)
- LLFloater::setFloaterHost(multi_propertiesp);
- else
- LLFloater::setFloaterHost(multi_previewp);
- (*item_it)->openItem();
- }
-
- LLFloater::setFloaterHost(NULL);
- // *NOTE: LLMulti* will safely auto-delete when open'd
- // without any children.
- multi_previewp->openFloater(LLSD());
- multi_propertiesp->openFloater(LLSD());
- }
- }
-}
-
-void LLFolderView::propertiesSelectedItems( void )
-{
- if(getVisible() && getEnabled())
- {
- if (mSelectedItems.size() == 1)
- {
- LLFolderViewItem* folder_item = mSelectedItems.front();
- if(!folder_item) return;
- folder_item->getListener()->showProperties();
- }
- else
- {
- LLMultiProperties* multi_propertiesp = new LLMultiProperties();
-
- LLFloater::setFloaterHost(multi_propertiesp);
-
- selected_items_t::iterator item_it;
- for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
- {
- (*item_it)->getListener()->showProperties();
- }
-
- LLFloater::setFloaterHost(NULL);
- multi_propertiesp->openFloater(LLSD());
- }
- }
-}
-
-void LLFolderView::changeType(LLInventoryModel *model, LLFolderType::EType new_folder_type)
-{
- LLFolderBridge *folder_bridge = LLFolderBridge::sSelf.get();
-
- if (!folder_bridge) return;
- LLViewerInventoryCategory *cat = folder_bridge->getCategory();
- if (!cat) return;
- cat->changeType(new_folder_type);
-}
-
-void LLFolderView::autoOpenItem( LLFolderViewFolder* item )
-{
- if ((mAutoOpenItems.check() == item) ||
- (mAutoOpenItems.getDepth() >= (U32)AUTO_OPEN_STACK_DEPTH) ||
- item->isOpen())
- {
- return;
- }
-
- // close auto-opened folders
- LLFolderViewFolder* close_item = mAutoOpenItems.check();
- while (close_item && close_item != item->getParentFolder())
- {
- mAutoOpenItems.pop();
- close_item->setOpenArrangeRecursively(FALSE);
- close_item = mAutoOpenItems.check();
- }
-
- item->requestArrange();
-
- mAutoOpenItems.push(item);
-
- item->setOpen(TRUE);
- LLRect content_rect = mScrollContainer->getContentWindowRect();
- LLRect constraint_rect(0,content_rect.getHeight(), content_rect.getWidth(), 0);
- scrollToShowItem(item, constraint_rect);
-}
-
-void LLFolderView::closeAutoOpenedFolders()
-{
- while (mAutoOpenItems.check())
- {
- LLFolderViewFolder* close_item = mAutoOpenItems.pop();
- close_item->setOpen(FALSE);
- }
-
- if (mAutoOpenCandidate)
- {
- mAutoOpenCandidate->setAutoOpenCountdown(0.f);
- }
- mAutoOpenCandidate = NULL;
- mAutoOpenTimer.stop();
-}
-
-BOOL LLFolderView::autoOpenTest(LLFolderViewFolder* folder)
-{
- if (folder && mAutoOpenCandidate == folder)
- {
- if (mAutoOpenTimer.getStarted())
- {
- if (!mAutoOpenCandidate->isOpen())
- {
- mAutoOpenCandidate->setAutoOpenCountdown(clamp_rescale(mAutoOpenTimer.getElapsedTimeF32(), 0.f, sAutoOpenTime, 0.f, 1.f));
- }
- if (mAutoOpenTimer.getElapsedTimeF32() > sAutoOpenTime)
- {
- autoOpenItem(folder);
- mAutoOpenTimer.stop();
- return TRUE;
- }
- }
- return FALSE;
- }
-
- // otherwise new candidate, restart timer
- if (mAutoOpenCandidate)
- {
- mAutoOpenCandidate->setAutoOpenCountdown(0.f);
- }
- mAutoOpenCandidate = folder;
- mAutoOpenTimer.start();
- return FALSE;
-}
-
-BOOL LLFolderView::canCopy() const
-{
- if (!(getVisible() && getEnabled() && (mSelectedItems.size() > 0)))
- {
- return FALSE;
- }
-
- for (selected_items_t::const_iterator selected_it = mSelectedItems.begin(); selected_it != mSelectedItems.end(); ++selected_it)
- {
- const LLFolderViewItem* item = *selected_it;
- if (!item->getListener()->isItemCopyable())
- {
- return FALSE;
- }
- }
- return TRUE;
-}
-
-// copy selected item
-void LLFolderView::copy()
-{
- // *NOTE: total hack to clear the inventory clipboard
- LLClipboard::instance().reset();
- S32 count = mSelectedItems.size();
- if(getVisible() && getEnabled() && (count > 0))
- {
- LLFolderViewEventListener* listener = NULL;
- selected_items_t::iterator item_it;
- for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
- {
- listener = (*item_it)->getListener();
- if(listener)
- {
- listener->copyToClipboard();
- }
- }
- }
- mSearchString.clear();
-}
-
-BOOL LLFolderView::canCut() const
-{
- if (!(getVisible() && getEnabled() && (mSelectedItems.size() > 0)))
- {
- return FALSE;
- }
-
- for (selected_items_t::const_iterator selected_it = mSelectedItems.begin(); selected_it != mSelectedItems.end(); ++selected_it)
- {
- const LLFolderViewItem* item = *selected_it;
- const LLFolderViewEventListener* listener = item->getListener();
-
- if (!listener || !listener->isItemRemovable())
- {
- return FALSE;
- }
- }
- return TRUE;
-}
-
-void LLFolderView::cut()
-{
- // clear the inventory clipboard
- LLClipboard::instance().reset();
- S32 count = mSelectedItems.size();
- if(getVisible() && getEnabled() && (count > 0))
- {
- LLFolderViewEventListener* listener = NULL;
- selected_items_t::iterator item_it;
- for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
- {
- listener = (*item_it)->getListener();
- if(listener)
- {
- listener->cutToClipboard();
- }
- }
- LLFolderView::removeCutItems();
- }
- mSearchString.clear();
-}
-
-BOOL LLFolderView::canPaste() const
-{
- if (mSelectedItems.empty())
- {
- return FALSE;
- }
-
- if(getVisible() && getEnabled())
- {
- for (selected_items_t::const_iterator item_it = mSelectedItems.begin();
- item_it != mSelectedItems.end(); ++item_it)
- {
- // *TODO: only check folders and parent folders of items
- const LLFolderViewItem* item = (*item_it);
- const LLFolderViewEventListener* listener = item->getListener();
- if(!listener || !listener->isClipboardPasteable())
- {
- const LLFolderViewFolder* folderp = item->getParentFolder();
- listener = folderp->getListener();
- if (!listener || !listener->isClipboardPasteable())
- {
- return FALSE;
- }
- }
- }
- return TRUE;
- }
- return FALSE;
-}
-
-// paste selected item
-void LLFolderView::paste()
-{
- if(getVisible() && getEnabled())
- {
- // find set of unique folders to paste into
- std::set<LLFolderViewItem*> folder_set;
-
- selected_items_t::iterator selected_it;
- for (selected_it = mSelectedItems.begin(); selected_it != mSelectedItems.end(); ++selected_it)
- {
- LLFolderViewItem* item = *selected_it;
- LLFolderViewEventListener* listener = item->getListener();
- if (listener->getInventoryType() != LLInventoryType::IT_CATEGORY)
- {
- item = item->getParentFolder();
- }
- folder_set.insert(item);
- }
-
- std::set<LLFolderViewItem*>::iterator set_iter;
- for(set_iter = folder_set.begin(); set_iter != folder_set.end(); ++set_iter)
- {
- LLFolderViewEventListener* listener = (*set_iter)->getListener();
- if(listener && listener->isClipboardPasteable())
- {
- listener->pasteFromClipboard();
- }
- }
- }
- mSearchString.clear();
-}
-
-// public rename functionality - can only start the process
-void LLFolderView::startRenamingSelectedItem( void )
-{
- // make sure selection is visible
- scrollToShowSelection();
-
- S32 count = mSelectedItems.size();
- LLFolderViewItem* item = NULL;
- if(count > 0)
- {
- item = mSelectedItems.front();
- }
- if(getVisible() && getEnabled() && (count == 1) && item && item->getListener() &&
- item->getListener()->isItemRenameable())
- {
- mRenameItem = item;
-
- updateRenamerPosition();
-
-
- mRenamer->setText(item->getName());
- mRenamer->selectAll();
- mRenamer->setVisible( TRUE );
- // set focus will fail unless item is visible
- mRenamer->setFocus( TRUE );
- mRenamer->setTopLostCallback(boost::bind(&LLFolderView::onRenamerLost, this));
- gViewerWindow->addPopup(mRenamer);
- }
-}
-
-BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
-{
- BOOL handled = FALSE;
-
- // SL-51858: Key presses are not being passed to the Popup menu.
- // A proper fix is non-trivial so instead just close the menu.
- LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
- if (menu && menu->isOpen())
- {
- LLMenuGL::sMenuContainer->hideMenus();
- }
-
- LLView *item = NULL;
- if (getChildCount() > 0)
- {
- item = *(getChildList()->begin());
- }
-
- switch( key )
- {
- case KEY_F2:
- mSearchString.clear();
- startRenamingSelectedItem();
- handled = TRUE;
- break;
-
- case KEY_RETURN:
- if (mask == MASK_NONE)
- {
- if( mRenameItem && mRenamer->getVisible() )
- {
- finishRenamingItem();
- mSearchString.clear();
- handled = TRUE;
- }
- else
- {
- LLFolderView::openSelectedItems();
- handled = TRUE;
- }
- }
- break;
-
- case KEY_ESCAPE:
- if( mRenameItem && mRenamer->getVisible() )
- {
- closeRenamer();
- handled = TRUE;
- }
- mSearchString.clear();
- break;
-
- case KEY_PAGE_UP:
- mSearchString.clear();
- mScrollContainer->pageUp(30);
- handled = TRUE;
- break;
-
- case KEY_PAGE_DOWN:
- mSearchString.clear();
- mScrollContainer->pageDown(30);
- handled = TRUE;
- break;
-
- case KEY_HOME:
- mSearchString.clear();
- mScrollContainer->goToTop();
- handled = TRUE;
- break;
-
- case KEY_END:
- mSearchString.clear();
- mScrollContainer->goToBottom();
- break;
-
- case KEY_DOWN:
- if((mSelectedItems.size() > 0) && mScrollContainer)
- {
- LLFolderViewItem* last_selected = getCurSelectedItem();
-
- if (!mKeyboardSelection)
- {
- setSelection(last_selected, FALSE, TRUE);
- mKeyboardSelection = TRUE;
- }
-
- LLFolderViewItem* next = NULL;
- if (mask & MASK_SHIFT)
- {
- // don't shift select down to children of folders (they are implicitly selected through parent)
- next = last_selected->getNextOpenNode(FALSE);
- if (next)
- {
- if (next->isSelected())
- {
- // shrink selection
- changeSelectionFromRoot(last_selected, FALSE);
- }
- else if (last_selected->getParentFolder() == next->getParentFolder())
- {
- // grow selection
- changeSelectionFromRoot(next, TRUE);
- }
- }
- }
- else
- {
- next = last_selected->getNextOpenNode();
- if( next )
- {
- 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();
- handled = TRUE;
- }
- break;
-
- case KEY_UP:
- if((mSelectedItems.size() > 0) && mScrollContainer)
- {
- LLFolderViewItem* last_selected = mSelectedItems.back();
-
- if (!mKeyboardSelection)
- {
- setSelection(last_selected, FALSE, TRUE);
- mKeyboardSelection = TRUE;
- }
-
- LLFolderViewItem* prev = NULL;
- if (mask & MASK_SHIFT)
- {
- // don't shift select down to children of folders (they are implicitly selected through parent)
- prev = last_selected->getPreviousOpenNode(FALSE);
- if (prev)
- {
- if (prev->isSelected())
- {
- // shrink selection
- changeSelectionFromRoot(last_selected, FALSE);
- }
- else if (last_selected->getParentFolder() == prev->getParentFolder())
- {
- // grow selection
- changeSelectionFromRoot(prev, TRUE);
- }
- }
- }
- else
- {
- prev = last_selected->getPreviousOpenNode();
- if( prev )
- {
- 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 );
- }
- }
- scrollToShowSelection();
- mSearchString.clear();
-
- handled = TRUE;
- }
- break;
-
- case KEY_RIGHT:
- if(mSelectedItems.size())
- {
- LLFolderViewItem* last_selected = getCurSelectedItem();
- last_selected->setOpen( TRUE );
- mSearchString.clear();
- handled = TRUE;
- }
- break;
-
- case KEY_LEFT:
- if(mSelectedItems.size())
- {
- LLFolderViewItem* last_selected = getCurSelectedItem();
- LLFolderViewItem* parent_folder = last_selected->getParentFolder();
- if (!last_selected->isOpen() && parent_folder && parent_folder->getParentFolder())
- {
- setSelection(parent_folder, FALSE, TRUE);
- }
- else
- {
- last_selected->setOpen( FALSE );
- }
- mSearchString.clear();
- scrollToShowSelection();
- handled = TRUE;
- }
- break;
- }
-
- if (!handled && mParentPanel->hasFocus())
- {
- if (key == KEY_BACKSPACE)
- {
- mSearchTimer.reset();
- if (mSearchString.size())
- {
- mSearchString.erase(mSearchString.size() - 1, 1);
- }
- search(getCurSelectedItem(), mSearchString, FALSE);
- handled = TRUE;
- }
- }
-
- return handled;
-}
-
-
-BOOL LLFolderView::handleUnicodeCharHere(llwchar uni_char)
-{
- if ((uni_char < 0x20) || (uni_char == 0x7F)) // Control character or DEL
- {
- return FALSE;
- }
-
- if (uni_char > 0x7f)
- {
- llwarns << "LLFolderView::handleUnicodeCharHere - Don't handle non-ascii yet, aborting" << llendl;
- return FALSE;
- }
-
- BOOL handled = FALSE;
- if (mParentPanel->hasFocus())
- {
- // SL-51858: Key presses are not being passed to the Popup menu.
- // A proper fix is non-trivial so instead just close the menu.
- LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
- if (menu && menu->isOpen())
- {
- LLMenuGL::sMenuContainer->hideMenus();
- }
-
- //do text search
- if (mSearchTimer.getElapsedTimeF32() > gSavedSettings.getF32("TypeAheadTimeout"))
- {
- mSearchString.clear();
- }
- mSearchTimer.reset();
- if (mSearchString.size() < 128)
- {
- mSearchString += uni_char;
- }
- search(getCurSelectedItem(), mSearchString, FALSE);
-
- handled = TRUE;
- }
-
- return handled;
-}
-
-
-BOOL LLFolderView::canDoDelete() const
-{
- if (mSelectedItems.size() == 0) return FALSE;
-
- for (selected_items_t::const_iterator item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
- {
- if (!(*item_it)->getListener()->isItemRemovable())
- {
- return FALSE;
- }
- }
- return TRUE;
-}
-
-void LLFolderView::doDelete()
-{
- if(mSelectedItems.size() > 0)
- {
- removeSelectedItems();
- }
-}
-
-
-BOOL LLFolderView::handleMouseDown( S32 x, S32 y, MASK mask )
-{
- mKeyboardSelection = FALSE;
- mSearchString.clear();
-
- mParentPanel->setFocus(TRUE);
-
- LLEditMenuHandler::gEditMenuHandler = this;
-
- return LLView::handleMouseDown( x, y, mask );
-}
-
-BOOL LLFolderView::search(LLFolderViewItem* first_item, const std::string &search_string, BOOL backward)
-{
- // get first selected item
- LLFolderViewItem* search_item = first_item;
-
- // make sure search string is upper case
- std::string upper_case_string = search_string;
- LLStringUtil::toUpper(upper_case_string);
-
- // if nothing selected, select first item in folder
- if (!search_item)
- {
- // start from first item
- search_item = getNextFromChild(NULL);
- }
-
- // search over all open nodes for first substring match (with wrapping)
- BOOL found = FALSE;
- LLFolderViewItem* original_search_item = search_item;
- do
- {
- // wrap at end
- if (!search_item)
- {
- if (backward)
- {
- search_item = getPreviousFromChild(NULL);
- }
- else
- {
- search_item = getNextFromChild(NULL);
- }
- if (!search_item || search_item == original_search_item)
- {
- break;
- }
- }
-
- const std::string current_item_label(search_item->getSearchableLabel());
- S32 search_string_length = llmin(upper_case_string.size(), current_item_label.size());
- if (!current_item_label.compare(0, search_string_length, upper_case_string))
- {
- found = TRUE;
- break;
- }
- if (backward)
- {
- search_item = search_item->getPreviousOpenNode();
- }
- else
- {
- search_item = search_item->getNextOpenNode();
- }
-
- } while(search_item != original_search_item);
-
-
- if (found)
- {
- setSelection(search_item, FALSE, TRUE);
- scrollToShowSelection();
- }
-
- return found;
-}
-
-BOOL LLFolderView::handleDoubleClick( S32 x, S32 y, MASK mask )
-{
- // skip LLFolderViewFolder::handleDoubleClick()
- return LLView::handleDoubleClick( x, y, mask );
-}
-
-BOOL LLFolderView::handleRightMouseDown( S32 x, S32 y, MASK mask )
-{
- // all user operations move keyboard focus to inventory
- // this way, we know when to stop auto-updating a search
- mParentPanel->setFocus(TRUE);
-
- BOOL handled = childrenHandleRightMouseDown(x, y, mask) != NULL;
- S32 count = mSelectedItems.size();
- LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
- if ( handled
- && ( count > 0 && (hasVisibleChildren() || mFilter->getShowFolderState() == LLInventoryFilter::SHOW_ALL_FOLDERS) ) // show menu only if selected items are visible
- && menu )
- {
- if (mCallbackRegistrar)
- mCallbackRegistrar->pushScope();
-
- updateMenuOptions(menu);
-
- menu->updateParent(LLMenuGL::sMenuContainer);
- LLMenuGL::showPopup(this, menu, x, y);
- if (mCallbackRegistrar)
- mCallbackRegistrar->popScope();
- }
- else
- {
- if (menu && menu->getVisible())
- {
- menu->setVisible(FALSE);
- }
- setSelection(NULL, FALSE, TRUE);
- }
- return handled;
-}
-
-// Add "--no options--" if the menu is completely blank.
-BOOL LLFolderView::addNoOptions(LLMenuGL* menu) const
-{
- const std::string nooptions_str = "--no options--";
- LLView *nooptions_item = NULL;
-
- const LLView::child_list_t *list = menu->getChildList();
- for (LLView::child_list_t::const_iterator itor = list->begin();
- itor != list->end();
- ++itor)
- {
- LLView *menu_item = (*itor);
- if (menu_item->getVisible())
- {
- return FALSE;
- }
- std::string name = menu_item->getName();
- if (menu_item->getName() == nooptions_str)
- {
- nooptions_item = menu_item;
- }
- }
- if (nooptions_item)
- {
- nooptions_item->setVisible(TRUE);
- nooptions_item->setEnabled(FALSE);
- return TRUE;
- }
- return FALSE;
-}
-
-BOOL LLFolderView::handleHover( S32 x, S32 y, MASK mask )
-{
- return LLView::handleHover( x, y, mask );
-}
-
-BOOL LLFolderView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg)
-{
- mDragAndDropThisFrame = TRUE;
- // have children handle it first
- BOOL handled = LLView::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data,
- accept, tooltip_msg);
-
- // when drop is not handled by child, it should be handled
- // by the folder which is the hierarchy root.
- if (!handled)
- {
- if (getListener()->getUUID().notNull())
- {
- handled = LLFolderViewFolder::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
- }
- else
- {
- if (!mFolders.empty())
- {
- // dispatch to last folder as a hack to support "Contents" folder in object inventory
- handled = mFolders.back()->handleDragAndDropFromChild(mask,drop,cargo_type,cargo_data,accept,tooltip_msg);
- }
- }
- }
-
- if (handled)
- {
- lldebugst(LLERR_USER_INPUT) << "dragAndDrop handled by LLFolderView" << llendl;
- }
-
- return handled;
-}
-
-void LLFolderView::deleteAllChildren()
-{
- closeRenamer();
- if (mPopupMenuHandle.get()) mPopupMenuHandle.get()->die();
- mPopupMenuHandle = LLHandle<LLView>();
- mScrollContainer = NULL;
- mRenameItem = NULL;
- mRenamer = NULL;
- mStatusTextBox = NULL;
-
- clearSelection();
- LLView::deleteAllChildren();
-}
-
-void LLFolderView::scrollToShowSelection()
-{
- if ( mSelectedItems.size() )
- {
- mNeedsScroll = TRUE;
- }
-}
-
-// If the parent is scroll container, scroll it to make the selection
-// is maximally visible.
-void LLFolderView::scrollToShowItem(LLFolderViewItem* item, const LLRect& constraint_rect)
-{
- if (!mScrollContainer) return;
-
- // don't scroll to items when mouse is being used to scroll/drag and drop
- if (gFocusMgr.childHasMouseCapture(mScrollContainer))
- {
- mNeedsScroll = FALSE;
- return;
- }
-
- // if item exists and is in visible portion of parent folder...
- if(item)
- {
- LLRect local_rect = item->getLocalRect();
- LLRect item_scrolled_rect; // item position relative to display area of scroller
- LLRect visible_doc_rect = mScrollContainer->getVisibleContentRect();
-
- S32 icon_height = mIcon.isNull() ? 0 : mIcon->getHeight();
- S32 label_height = getLabelFontForStyle(mLabelStyle)->getLineHeight();
- // 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(),
- local_rect.getHeight(),
- llmin(MIN_ITEM_WIDTH_VISIBLE, local_rect.getWidth()),
- llmax(0, local_rect.getHeight() - max_height_to_show));
-
- LLRect item_doc_rect;
-
- item->localRectToOtherView(item_local_rect, &item_doc_rect, this);
-
- mScrollContainer->scrollToShowRect( item_doc_rect, constraint_rect );
-
- }
-}
-
-LLRect LLFolderView::getVisibleRect()
-{
- S32 visible_height = mScrollContainer->getRect().getHeight();
- S32 visible_width = mScrollContainer->getRect().getWidth();
- LLRect visible_rect;
- visible_rect.setLeftTopAndSize(-getRect().mLeft, visible_height - getRect().mBottom, visible_width, visible_height);
- return visible_rect;
-}
-
-BOOL LLFolderView::getShowSelectionContext()
-{
- if (mShowSelectionContext)
- {
- return TRUE;
- }
- LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
- if (menu && menu->getVisible())
- {
- return TRUE;
- }
- return FALSE;
-}
-
-void LLFolderView::setShowSingleSelection(BOOL show)
-{
- if (show != mShowSingleSelection)
- {
- mMultiSelectionFadeTimer.reset();
- mShowSingleSelection = show;
- }
-}
-
-void LLFolderView::addItemID(const LLUUID& id, LLFolderViewItem* itemp)
-{
- mItemMap[id] = itemp;
-}
-
-void LLFolderView::removeItemID(const LLUUID& id)
-{
- mItemMap.erase(id);
-}
-
-LLFastTimer::DeclareTimer FTM_GET_ITEM_BY_ID("Get FolderViewItem by ID");
-LLFolderViewItem* LLFolderView::getItemByID(const LLUUID& id)
-{
- LLFastTimer _(FTM_GET_ITEM_BY_ID);
- if (id == getListener()->getUUID())
- {
- return this;
- }
-
- std::map<LLUUID, LLFolderViewItem*>::iterator map_it;
- map_it = mItemMap.find(id);
- if (map_it != mItemMap.end())
- {
- return map_it->second;
- }
-
- return NULL;
-}
-
-LLFolderViewFolder* LLFolderView::getFolderByID(const LLUUID& id)
-{
- if (id == getListener()->getUUID())
- {
- 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();
-
- if ("rename" == action)
- {
- startRenamingSelectedItem();
- return true;
- }
- if ("delete" == action)
- {
- removeSelectedItems();
- return true;
- }
- if (("copy" == action) || ("cut" == action))
- {
- // Clear the clipboard before we start adding things on it
- LLClipboard::instance().reset();
- }
-
- static const std::string change_folder_string = "change_folder_type_";
- if (action.length() > change_folder_string.length() &&
- (action.compare(0,change_folder_string.length(),"change_folder_type_") == 0))
- {
- LLFolderType::EType new_folder_type = LLViewerFolderType::lookupTypeFromXUIName(action.substr(change_folder_string.length()));
- changeType(model, new_folder_type);
- return true;
- }
-
-
- std::set<LLUUID> selected_items = getSelectionList();
-
- LLMultiPreview* multi_previewp = NULL;
- LLMultiProperties* multi_propertiesp = NULL;
-
- if (("task_open" == action || "open" == action) && selected_items.size() > 1)
- {
- multi_previewp = new LLMultiPreview();
- gFloaterView->addChild(multi_previewp);
-
- LLFloater::setFloaterHost(multi_previewp);
-
- }
- else if (("task_properties" == action || "properties" == action) && selected_items.size() > 1)
- {
- multi_propertiesp = new LLMultiProperties();
- gFloaterView->addChild(multi_propertiesp);
-
- LLFloater::setFloaterHost(multi_propertiesp);
- }
-
- std::set<LLUUID>::iterator set_iter;
-
- for (set_iter = selected_items.begin(); set_iter != selected_items.end(); ++set_iter)
- {
- LLFolderViewItem* folder_item = getItemByID(*set_iter);
- if(!folder_item) continue;
- LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener();
- if(!bridge) continue;
- bridge->performAction(model, action);
- }
-
- LLFloater::setFloaterHost(NULL);
- if (multi_previewp)
- {
- multi_previewp->openFloater(LLSD());
- }
- else if (multi_propertiesp)
- {
- multi_propertiesp->openFloater(LLSD());
- }
-
- return true;
-}
-
-static LLFastTimer::DeclareTimer FTM_AUTO_SELECT("Open and Select");
-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");
- if (debug_filters != getDebugFilters())
- {
- mDebugFilters = debug_filters;
- arrangeAll();
- }
-
- BOOL filter_modified_and_active = mFilter->isModified() && mFilter->isNotDefault();
- mNeedsAutoSelect = filter_modified_and_active &&
- !(gFocusMgr.childHasKeyboardFocus(this) || gFocusMgr.getMouseCapture());
- mFilter->clearModified();
-
- // filter to determine visibility before arranging
- filterFromRoot();
-
- // automatically show matching items, and select first one if we had a selection
- if (mNeedsAutoSelect)
- {
- LLFastTimer t3(FTM_AUTO_SELECT);
- // select new item only if a filtered item not currently selected
- LLFolderViewItem* selected_itemp = mSelectedItems.empty() ? NULL : mSelectedItems.back();
- if (!mAutoSelectOverride && (!selected_itemp || !selected_itemp->potentiallyVisible()))
- {
- // these are named variables to get around gcc not binding non-const references to rvalues
- // and functor application is inherently non-const to allow for stateful functors
- LLSelectFirstFilteredItem functor;
- applyFunctorRecursively(functor);
- }
-
- // Open filtered folders for folder views with mAutoSelectOverride=TRUE.
- // Used by LLPlacesFolderView.
- if (!mFilter->getFilterSubString().empty())
- {
- // these are named variables to get around gcc not binding non-const references to rvalues
- // and functor application is inherently non-const to allow for stateful functors
- LLOpenFilteredFolders functor;
- applyFunctorRecursively(functor);
- }
-
- scrollToShowSelection();
- }
-
- BOOL filter_finished = mCompletedFilterGeneration >= mFilter->getCurrentGeneration()
- && !LLInventoryModelBackgroundFetch::instance().folderFetchActive();
- if (filter_finished
- || gFocusMgr.childHasKeyboardFocus(inventory_panel)
- || gFocusMgr.childHasMouseCapture(inventory_panel))
- {
- // finishing the filter process, giving focus to the folder view, or dragging the scrollbar all stop the auto select process
- mNeedsAutoSelect = FALSE;
- }
-
-
- // during filtering process, try to pin selected item's location on screen
- // this will happen when searching your inventory and when new items arrive
- if (!filter_finished)
- {
- // calculate rectangle to pin item to at start of animated rearrange
- if (!mPinningSelectedItem && !mSelectedItems.empty())
- {
- // lets pin it!
- mPinningSelectedItem = TRUE;
-
- LLRect visible_content_rect = mScrollContainer->getVisibleContentRect();
- LLFolderViewItem* selected_item = mSelectedItems.back();
-
- LLRect item_rect;
- selected_item->localRectToOtherView(selected_item->getLocalRect(), &item_rect, this);
- // if item is visible in scrolled region
- if (visible_content_rect.overlaps(item_rect))
- {
- // then attempt to keep it in same place on screen
- mScrollConstraintRect = item_rect;
- mScrollConstraintRect.translate(-visible_content_rect.mLeft, -visible_content_rect.mBottom);
- }
- else
- {
- // otherwise we just want it onscreen somewhere
- LLRect content_rect = mScrollContainer->getContentWindowRect();
- mScrollConstraintRect.setOriginAndSize(0, 0, content_rect.getWidth(), content_rect.getHeight());
- }
- }
- }
- else
- {
- // stop pinning selected item after folders stop rearranging
- if (!needsArrange())
- {
- mPinningSelectedItem = FALSE;
- }
- }
-
- LLRect constraint_rect;
- if (mPinningSelectedItem)
- {
- // use last known constraint rect for pinned item
- constraint_rect = mScrollConstraintRect;
- }
- else
- {
- // during normal use (page up/page down, etc), just try to fit item on screen
- LLRect content_rect = mScrollContainer->getContentWindowRect();
- constraint_rect.setOriginAndSize(0, 0, content_rect.getWidth(), content_rect.getHeight());
- }
-
-
- BOOL is_visible = isInVisibleChain();
-
- if ( is_visible )
- {
- sanitizeSelection();
- if( needsArrange() )
- {
- arrangeFromRoot();
- }
- }
-
- if (mSelectedItems.size() && mNeedsScroll)
- {
- scrollToShowItem(mSelectedItems.back(), constraint_rect);
- // continue scrolling until animated layout change is done
- if (filter_finished
- && (!needsArrange() || !is_visible))
- {
- mNeedsScroll = FALSE;
- }
- }
-
- if (mSignalSelectCallback)
- {
- //RN: we use keyboard focus as a proxy for user-explicit actions
- BOOL take_keyboard_focus = (mSignalSelectCallback == SIGNAL_KEYBOARD_FOCUS);
- mSelectSignal(mSelectedItems, take_keyboard_focus);
- }
- mSignalSelectCallback = FALSE;
-}
-
-
-//static
-void LLFolderView::idle(void* user_data)
-{
- LLFolderView* self = (LLFolderView*)user_data;
- if ( self )
- { // Do the real idle
- self->doIdle();
- }
-}
-
-void LLFolderView::dumpSelectionInformation()
-{
- llinfos << "LLFolderView::dumpSelectionInformation()" << llendl;
- llinfos << "****************************************" << llendl;
- selected_items_t::iterator item_it;
- for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
- {
- llinfos << " " << (*item_it)->getName() << llendl;
- }
- llinfos << "****************************************" << llendl;
-}
-
-void LLFolderView::updateRenamerPosition()
-{
- if(mRenameItem)
- {
- // 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->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 = mRenameItem->getItemHeight() - RENAME_HEIGHT_PAD;
- mRenamer->reshape( width, height, TRUE );
- }
-}
-
-// Update visibility and availability (i.e. enabled/disabled) of context menu items.
-void LLFolderView::updateMenuOptions(LLMenuGL* menu)
-{
- const LLView::child_list_t *list = menu->getChildList();
-
- LLView::child_list_t::const_iterator menu_itor;
- for (menu_itor = list->begin(); menu_itor != list->end(); ++menu_itor)
- {
- (*menu_itor)->setVisible(FALSE);
- (*menu_itor)->pushVisible(TRUE);
- (*menu_itor)->setEnabled(TRUE);
- }
-
- // Successively filter out invalid options
-
- U32 flags = FIRST_SELECTED_ITEM;
- for (selected_items_t::iterator item_itor = mSelectedItems.begin();
- item_itor != mSelectedItems.end();
- ++item_itor)
- {
- LLFolderViewItem* selected_item = (*item_itor);
- selected_item->buildContextMenu(*menu, flags);
- flags = 0x0;
- }
-
- addNoOptions(menu);
-}
-
-// Refresh the context menu (that is already shown).
-void LLFolderView::updateMenu()
-{
- LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
- if (menu && menu->getVisible())
- {
- updateMenuOptions(menu);
- menu->needsArrange(); // update menu height if needed
- }
-}
-
-bool LLFolderView::selectFirstItem()
-{
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();++iter)
- {
- 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();++iter)
- {
- 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();
- scrollToShowSelection();
- return 1;
-
- }
- else if(str_action == "select_last")
- {
- setFocus(true);
- selectLastItem();
- scrollToShowSelection();
- return 1;
- }
- }
- return 0;
-}
-
-
-///----------------------------------------------------------------------------
-/// Local function definitions
-///----------------------------------------------------------------------------
-
-void LLFolderView::onRenamerLost()
-{
- if (mRenamer && mRenamer->getVisible())
- {
- mRenamer->setVisible(FALSE);
-
- // will commit current name (which could be same as original name)
- mRenamer->setFocus(FALSE);
- }
-
- if( mRenameItem )
- {
- setSelectionFromRoot( mRenameItem, TRUE );
- mRenameItem = NULL;
- }
-}
-
-LLFolderViewItem* LLFolderView::getNextUnselectedItem()
-{
- LLFolderViewItem* last_item = *mSelectedItems.rbegin();
- LLFolderViewItem* new_selection = last_item->getNextOpenNode(FALSE);
- while(new_selection && new_selection->isSelected())
- {
- new_selection = new_selection->getNextOpenNode(FALSE);
- }
- if (!new_selection)
- {
- new_selection = last_item->getPreviousOpenNode(FALSE);
- while (new_selection && (new_selection->isInSelection()))
- {
- new_selection = new_selection->getPreviousOpenNode(FALSE);
- }
- }
- return new_selection;
-}
-
-LLInventoryFilter* LLFolderView::getFilter()
-{
- return mFilter;
-}
-
-void LLFolderView::setFilterPermMask( PermissionMask filter_perm_mask )
-{
- mFilter->setFilterPermissions(filter_perm_mask);
-}
-
-U32 LLFolderView::getFilterObjectTypes() const
-{
- return mFilter->getFilterObjectTypes();
-}
-
-PermissionMask LLFolderView::getFilterPermissions() const
-{
- return mFilter->getFilterPermissions();
-}
-
-BOOL LLFolderView::isFilterModified()
-{
- return mFilter->isNotDefault();
-}
-
-void delete_selected_item(void* user_data)
-{
- if(user_data)
- {
- LLFolderView* fv = reinterpret_cast<LLFolderView*>(user_data);
- fv->removeSelectedItems();
- }
-}
-
-void copy_selected_item(void* user_data)
-{
- if(user_data)
- {
- LLFolderView* fv = reinterpret_cast<LLFolderView*>(user_data);
- fv->copy();
- }
-}
-
-void paste_items(void* user_data)
-{
- if(user_data)
- {
- LLFolderView* fv = reinterpret_cast<LLFolderView*>(user_data);
- fv->paste();
- }
-}
-
-void open_selected_items(void* user_data)
-{
- if(user_data)
- {
- LLFolderView* fv = reinterpret_cast<LLFolderView*>(user_data);
- fv->openSelectedItems();
- }
-}
-
-void properties_selected_items(void* user_data)
-{
- if(user_data)
- {
- LLFolderView* fv = reinterpret_cast<LLFolderView*>(user_data);
- fv->propertiesSelectedItems();
- }
-}
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
deleted file mode 100644
index 3f78312a98..0000000000
--- a/indra/newview/llfolderview.h
+++ /dev/null
@@ -1,377 +0,0 @@
-/**
- * @file llfolderview.h
- * @brief Definition of the folder view collection of classes.
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-/**
- *
- * The folder view collection of classes provides an interface for
- * making a 'folder view' similar to the way the a single pane file
- * folder interface works.
- *
- */
-
-#ifndef LL_LLFOLDERVIEW_H
-#define LL_LLFOLDERVIEW_H
-
-#include "llfolderviewitem.h" // because LLFolderView is-a LLFolderViewFolder
-
-#include "lluictrl.h"
-#include "v4color.h"
-#include "lldarray.h"
-#include "stdenums.h"
-#include "lldepthstack.h"
-#include "lleditmenuhandler.h"
-#include "llfontgl.h"
-#include "llscrollcontainer.h"
-#include "lltooldraganddrop.h"
-#include "llviewertexture.h"
-
-class LLFolderViewEventListener;
-class LLFolderViewFolder;
-class LLFolderViewItem;
-class LLInventoryModel;
-class LLPanel;
-class LLLineEditor;
-class LLMenuGL;
-class LLUICtrl;
-class LLTextBox;
-
-/**
- * Class LLFolderViewScrollContainer
- *
- * A scroll container which provides the information about the height
- * of currently displayed folder view contents.
- * Used for updating vertical scroll bar visibility in inventory panel.
- * See LLScrollContainer::calcVisibleSize().
- */
-class LLFolderViewScrollContainer : public LLScrollContainer
-{
-public:
- /*virtual*/ ~LLFolderViewScrollContainer() {};
- /*virtual*/ const LLRect getScrolledViewRect() const;
-
-protected:
- LLFolderViewScrollContainer(const LLScrollContainer::Params& p);
- friend class LLUICtrlFactory;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLFolderView
-//
-// The LLFolderView represents the root level folder view object.
-// It manages the screen region of the folder view.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLFolderView : public LLFolderViewFolder, public LLEditMenuHandler
-{
-public:
- struct Params : public LLInitParam::Block<Params, LLFolderViewFolder::Params>
- {
- Mandatory<LLPanel*> parent_panel;
- Optional<LLUUID> task_id;
- Optional<std::string> title;
- Optional<bool> use_label_suffix,
- allow_multiselect,
- show_empty_message,
- show_load_status,
- use_ellipses;
-
- Params();
- };
-
- friend class LLFolderViewScrollContainer;
-
- LLFolderView(const Params&);
- virtual ~LLFolderView( void );
-
- virtual BOOL canFocusChildren() const;
-
- virtual LLFolderView* getRoot() { return this; }
-
- // FolderViews default to sort by name. This will change that,
- // and resort the items if necessary.
- void setSortOrder(U32 order);
- void setFilterPermMask(PermissionMask filter_perm_mask);
-
- typedef boost::signals2::signal<void (const std::deque<LLFolderViewItem*>& items, BOOL user_action)> signal_t;
- void setSelectCallback(const signal_t::slot_type& cb) { mSelectSignal.connect(cb); }
- void setReshapeCallback(const signal_t::slot_type& cb) { mReshapeSignal.connect(cb); }
-
- // filter is never null
- LLInventoryFilter* getFilter();
- const std::string getFilterSubString(BOOL trim = FALSE);
- U32 getFilterObjectTypes() const;
- PermissionMask getFilterPermissions() const;
- // *NOTE: use getFilter()->getShowFolderState();
- //LLInventoryFilter::EFolderShow getShowFolderState();
- U32 getSortOrder() const;
- BOOL isFilterModified();
-
- bool getAllowMultiSelect() { return mAllowMultiSelect; }
-
- // Close all folders in the view
- void closeAllFolders();
- void openTopLevelFolders();
-
- virtual void toggleOpen() {};
- virtual void setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse);
- virtual BOOL addFolder( LLFolderViewFolder* folder);
-
- // Find width and height of this object and its children. Also
- // makes sure that this view and its children are the right size.
- virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
-
- void arrangeAll() { mArrangeGeneration++; }
- S32 getArrangeGeneration() { return mArrangeGeneration; }
-
- // Apply filters to control visibility of inventory items
- virtual void filter( LLInventoryFilter& filter);
-
- // Get the last selected item
- virtual LLFolderViewItem* getCurSelectedItem( void );
-
- // Record the selected item and pass it down the hierarchy.
- virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem,
- BOOL take_keyboard_focus);
-
- // Used by menu callbacks
- void setSelectionByID(const LLUUID& obj_id, BOOL take_keyboard_focus);
-
- // Called once a frame to update the selection if mSelectThisID has been set
- void updateSelection();
-
- // This method is used to toggle the selection of an item.
- // Walks children and keeps track of selected objects.
- virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
-
- virtual std::set<LLUUID> getSelectionList() const;
-
- // Make sure if ancestor is selected, descendents are not
- void sanitizeSelection();
- void clearSelection();
- void addToSelectionList(LLFolderViewItem* item);
- void removeFromSelectionList(LLFolderViewItem* item);
-
- BOOL startDrag(LLToolDragAndDrop::ESource source);
- void setDragAndDropThisFrame() { mDragAndDropThisFrame = TRUE; }
- void setDraggingOverItem(LLFolderViewItem* item) { mDraggingOverItem = item; }
- LLFolderViewItem* getDraggingOverItem() { return mDraggingOverItem; }
-
- // Deletion functionality
- void removeSelectedItems();
- static void removeCutItems();
-
- // Open the selected item
- void openSelectedItems( void );
- void propertiesSelectedItems( void );
-
- // Change the folder type
- void changeType(LLInventoryModel *model, LLFolderType::EType new_folder_type);
-
- void autoOpenItem(LLFolderViewFolder* item);
- void closeAutoOpenedFolders();
- BOOL autoOpenTest(LLFolderViewFolder* item);
-
- // Copy & paste
- virtual void copy();
- virtual BOOL canCopy() const;
-
- virtual void cut();
- virtual BOOL canCut() const;
-
- virtual void paste();
- virtual BOOL canPaste() const;
-
- virtual void doDelete();
- virtual BOOL canDoDelete() const;
-
- LLFolderViewItem* getNextUnselectedItem();
-
- // Public rename functionality - can only start the process
- void startRenamingSelectedItem( void );
-
- // These functions were used when there was only one folderview,
- // and relied on that concept. This functionality is now handled
- // by the listeners and the lldraganddroptool.
- //LLFolderViewItem* getMovingItem() { return mMovingItem; }
- //void setMovingItem( LLFolderViewItem* item ) { mMovingItem = item; }
- //void dragItemIntoFolder( LLFolderViewItem* moving_item, LLFolderViewFolder* dst_folder, BOOL drop, BOOL* accept );
- //void dragFolderIntoFolder( LLFolderViewFolder* moving_folder, LLFolderViewFolder* dst_folder, BOOL drop, BOOL* accept );
-
- // LLView functionality
- ///*virtual*/ BOOL handleKey( KEY key, MASK mask, BOOL called_from_parent );
- /*virtual*/ BOOL handleKeyHere( KEY key, MASK mask );
- /*virtual*/ BOOL handleUnicodeCharHere(llwchar uni_char);
- /*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask );
- /*virtual*/ BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
- /*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
- /*virtual*/ BOOL handleHover( S32 x, S32 y, 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);
- /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
- /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask) { setShowSelectionContext(FALSE); }
- virtual void draw();
- virtual void deleteAllChildren();
-
- void scrollToShowSelection();
- void scrollToShowItem(LLFolderViewItem* item, const LLRect& constraint_rect);
- void setScrollContainer( LLScrollContainer* parent ) { mScrollContainer = parent; }
- LLRect getVisibleRect();
-
- BOOL search(LLFolderViewItem* first_item, const std::string &search_string, BOOL backward);
- void setShowSelectionContext(BOOL show) { mShowSelectionContext = show; }
- BOOL getShowSelectionContext();
- void setShowSingleSelection(BOOL show);
- BOOL getShowSingleSelection() { return mShowSingleSelection; }
- F32 getSelectionFadeElapsedTime() { return mMultiSelectionFadeTimer.getElapsedTimeF32(); }
- bool getUseEllipses() { return mUseEllipses; }
-
- 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);
-
- void doIdle(); // Real idle routine
- static void idle(void* user_data); // static glue to doIdle()
-
- BOOL needsAutoSelect() { return mNeedsAutoSelect && !mAutoSelectOverride; }
- BOOL needsAutoRename() { return mNeedsAutoRename; }
- void setNeedsAutoRename(BOOL val) { mNeedsAutoRename = val; }
- void setPinningSelectedItem(BOOL val) { mPinningSelectedItem = val; }
- void setAutoSelectOverride(BOOL val) { mAutoSelectOverride = val; }
-
- void setCallbackRegistrar(LLUICtrl::CommitCallbackRegistry::ScopedRegistrar* registrar) { mCallbackRegistrar = registrar; }
-
- BOOL getDebugFilters() { return mDebugFilters; }
-
- LLPanel* getParentPanel() { return mParentPanel; }
- // DEBUG only
- void dumpSelectionInformation();
-
- virtual S32 notify(const LLSD& info) ;
-
- bool useLabelSuffix() { return mUseLabelSuffix; }
- void updateMenu();
-
-private:
- void updateMenuOptions(LLMenuGL* menu);
- void updateRenamerPosition();
-
-protected:
- LLScrollContainer* mScrollContainer; // NULL if this is not a child of a scroll container.
-
- void commitRename( const LLSD& data );
- void onRenamerLost();
-
- void finishRenamingItem( void );
- void closeRenamer( void );
-
- bool selectFirstItem();
- bool selectLastItem();
-
- BOOL addNoOptions(LLMenuGL* menu) const;
-
- void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response);
-
-protected:
- LLHandle<LLView> mPopupMenuHandle;
-
- typedef std::deque<LLFolderViewItem*> selected_items_t;
- selected_items_t mSelectedItems;
- BOOL mKeyboardSelection;
- BOOL mAllowMultiSelect;
- BOOL mShowEmptyMessage;
- BOOL mShowFolderHierarchy;
- LLUUID mSourceID;
-
- // Renaming variables and methods
- LLFolderViewItem* mRenameItem; // The item currently being renamed
- LLLineEditor* mRenamer;
-
- BOOL mNeedsScroll;
- BOOL mPinningSelectedItem;
- LLRect mScrollConstraintRect;
- BOOL mNeedsAutoSelect;
- BOOL mAutoSelectOverride;
- BOOL mNeedsAutoRename;
- bool mUseLabelSuffix;
-
- BOOL mDebugFilters;
- U32 mSortOrder;
- LLDepthStack<LLFolderViewFolder> mAutoOpenItems;
- LLFolderViewFolder* mAutoOpenCandidate;
- LLFrameTimer mAutoOpenTimer;
- LLFrameTimer mSearchTimer;
- std::string mSearchString;
- LLInventoryFilter* mFilter;
- BOOL mShowSelectionContext;
- BOOL mShowSingleSelection;
- LLFrameTimer mMultiSelectionFadeTimer;
- S32 mArrangeGeneration;
-
- signal_t mSelectSignal;
- signal_t mReshapeSignal;
- S32 mSignalSelectCallback;
- S32 mMinWidth;
- S32 mRunningHeight;
- std::map<LLUUID, LLFolderViewItem*> mItemMap;
- BOOL mDragAndDropThisFrame;
-
- LLUUID mSelectThisID; // if non null, select this item
-
- LLPanel* mParentPanel;
-
- /**
- * Is used to determine if we need to cut text In LLFolderViewItem to avoid horizontal scroll.
- * NOTE: For now it's used only to cut LLFolderViewItem::mLabel text for Landmarks in Places Panel.
- */
- bool mUseEllipses; // See EXT-719
-
- /**
- * Contains item under mouse pointer while dragging
- */
- LLFolderViewItem* mDraggingOverItem; // See EXT-719
-
- LLUICtrl::CommitCallbackRegistry::ScopedRegistrar* mCallbackRegistrar;
-
-public:
- static F32 sAutoOpenTime;
- LLTextBox* mStatusTextBox;
-
-};
-
-bool sort_item_name(LLFolderViewItem* a, LLFolderViewItem* b);
-bool sort_item_date(LLFolderViewItem* a, LLFolderViewItem* b);
-
-// Flags for buildContextMenu()
-const U32 SUPPRESS_OPEN_ITEM = 0x1;
-const U32 FIRST_SELECTED_ITEM = 0x2;
-
-#endif // LL_LLFOLDERVIEW_H
diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h
deleted file mode 100644
index 06682dcbf1..0000000000
--- a/indra/newview/llfoldervieweventlistener.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- * @file llfoldervieweventlistener.h
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-#ifndef LLFOLDERVIEWEVENTLISTENER_H
-#define LLFOLDERVIEWEVENTLISTENER_H
-
-#include "lldarray.h" // *TODO: convert to std::vector
-#include "llfoldertype.h"
-#include "llfontgl.h" // just for StyleFlags enum
-#include "llinventorytype.h"
-#include "llpermissionsflags.h"
-#include "llpointer.h"
-#include "llwearabletype.h"
-
-
-class LLFolderViewItem;
-class LLFolderView;
-class LLFontGL;
-class LLInventoryModel;
-class LLMenuGL;
-class LLScrollContainer;
-class LLUIImage;
-class LLUUID;
-
-// This is an abstract base class that users of the folderview classes
-// would use to catch the useful events emitted from the folder
-// views.
-class LLFolderViewEventListener
-{
-public:
- virtual ~LLFolderViewEventListener( void ) {}
- virtual const std::string& getName() const = 0;
- virtual const std::string& getDisplayName() const = 0;
- virtual const LLUUID& getUUID() const = 0;
- virtual time_t getCreationDate() const = 0; // UTC seconds
- virtual PermissionMask getPermissionMask() 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;
- virtual void closeItem( void ) = 0;
- virtual void previewItem( void ) = 0;
- virtual void selectItem(void) = 0;
- virtual void showProperties(void) = 0;
- 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 ) 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;
- virtual BOOL isItemCopyable() const = 0;
- virtual BOOL copyToClipboard() const = 0;
- virtual BOOL cutToClipboard() const = 0;
- virtual BOOL isClipboardPasteable() const = 0;
- virtual void pasteFromClipboard() = 0;
- virtual void pasteLinkFromClipboard() = 0;
- virtual void buildContextMenu(LLMenuGL& menu, U32 flags) = 0;
- virtual BOOL isUpToDate() const = 0;
- virtual BOOL hasChildren() const = 0;
- virtual LLInventoryType::EType getInventoryType() const = 0;
- virtual void performAction(LLInventoryModel* model, std::string action) = 0;
- virtual LLWearableType::EType getWearableType() const = 0;
-
- // This method should be called when a drag begins. returns TRUE
- // if the drag can begin, otherwise FALSE.
- virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const = 0;
-
- // This method will be called to determine if a drop can be
- // performed, and will set drop to TRUE if a drop is
- // requested. Returns TRUE if a drop is possible/happened,
- // otherwise FALSE.
- virtual BOOL dragOrDrop(MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- std::string& tooltip_msg) = 0;
-};
-
-#endif
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
deleted file mode 100644
index 3aa16b4413..0000000000
--- a/indra/newview/llfolderviewitem.cpp
+++ /dev/null
@@ -1,2901 +0,0 @@
-/**
-* @file llfolderviewitem.cpp
-* @brief Items and folders that can appear in a hierarchical folder view
-*
-* $LicenseInfo:firstyear=2001&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2010, Linden Research, Inc.
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation;
-* version 2.1 of the License only.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*
-* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-* $/LicenseInfo$
-*/
-#include "llviewerprecompiledheaders.h"
-
-#include "llfolderviewitem.h"
-
-// viewer includes
-#include "llfolderview.h" // Items depend extensively on LLFolderViews
-#include "llfoldervieweventlistener.h"
-#include "llviewerfoldertype.h"
-#include "llinventorybridge.h" // for LLItemBridge in LLInventorySort::operator()
-#include "llinventoryfilter.h"
-#include "llinventoryfunctions.h"
-#include "llinventorymodelbackgroundfetch.h"
-#include "llpanel.h"
-#include "llviewercontrol.h" // gSavedSettings
-#include "llviewerwindow.h" // Argh, only for setCursor()
-
-// linden library includes
-#include "llclipboard.h"
-#include "llfocusmgr.h" // gFocusMgr
-#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
-
-// only integers can be initialized in header
-const F32 LLFolderViewItem::FOLDER_CLOSE_TIME_CONSTANT = 0.02f;
-const F32 LLFolderViewItem::FOLDER_OPEN_TIME_CONSTANT = 0.03f;
-
-const LLColor4U DEFAULT_WHITE(255, 255, 255);
-
-
-//static
-LLFontGL* LLFolderViewItem::getLabelFontForStyle(U8 style)
-{
- LLFontGL* rtn = sFonts[style];
- if (!rtn) // grab label font with this style, lazily
- {
- LLFontDescriptor labelfontdesc("SansSerif", "Small", style);
- rtn = LLFontGL::getFont(labelfontdesc);
- if (!rtn)
- {
- rtn = LLFontGL::getFontDefault();
- }
- sFonts[style] = rtn;
- }
- return rtn;
-}
-
-//static
-void LLFolderViewItem::initClass()
-{
-}
-
-//static
-void LLFolderViewItem::cleanupClass()
-{
- sFonts.clear();
-}
-
-
-// NOTE: Optimize this, we call it a *lot* when opening a large inventory
-LLFolderViewItem::Params::Params()
-: icon(),
- icon_open(),
- icon_overlay(),
- 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()
-{}
-
-// Default constructor
-LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
-: LLView(p),
- mLabelWidth(0),
- mLabelWidthDirty(false),
- mParentFolder( NULL ),
- mIsSelected( FALSE ),
- mIsCurSelection( FALSE ),
- mSelectPending(FALSE),
- mLabelStyle( LLFontGL::NORMAL ),
- mHasVisibleChildren(FALSE),
- mIndentation(0),
- mItemHeight(p.item_height),
- mPassedFilter(FALSE),
- mLastFilterGeneration(-1),
- mStringMatchOffset(std::string::npos),
- mControlLabelRotation(0.f),
- mDragAndDropTarget(FALSE),
- mIsLoading(FALSE),
- mLabel(p.name),
- mRoot(p.root),
- mCreationDate(p.creation_date),
- mIcon(p.icon),
- mIconOpen(p.icon_open),
- mIconOverlay(p.icon_overlay),
- mListener(p.listener),
- mShowLoadStatus(false),
- mIsMouseOverTitle(false)
-{
-}
-
-BOOL LLFolderViewItem::postBuild()
-{
- refresh();
- return TRUE;
-}
-
-// Destroys the object
-LLFolderViewItem::~LLFolderViewItem( void )
-{
- delete mListener;
- mListener = NULL;
-}
-
-LLFolderView* LLFolderViewItem::getRoot()
-{
- return mRoot;
-}
-
-// Returns true if this object is a child (or grandchild, etc.) of potential_ancestor.
-BOOL LLFolderViewItem::isDescendantOf( const LLFolderViewFolder* potential_ancestor )
-{
- LLFolderViewItem* root = this;
- while( root->mParentFolder )
- {
- if( root->mParentFolder == potential_ancestor )
- {
- return TRUE;
- }
- root = root->mParentFolder;
- }
- return FALSE;
-}
-
-LLFolderViewItem* LLFolderViewItem::getNextOpenNode(BOOL include_children)
-{
- if (!mParentFolder)
- {
- return NULL;
- }
-
- LLFolderViewItem* itemp = mParentFolder->getNextFromChild( this, include_children );
- while(itemp && !itemp->getVisible())
- {
- LLFolderViewItem* next_itemp = itemp->mParentFolder->getNextFromChild( itemp, include_children );
- if (itemp == next_itemp)
- {
- // hit last item
- return itemp->getVisible() ? itemp : this;
- }
- itemp = next_itemp;
- }
-
- return itemp;
-}
-
-LLFolderViewItem* LLFolderViewItem::getPreviousOpenNode(BOOL include_children)
-{
- if (!mParentFolder)
- {
- return NULL;
- }
-
- LLFolderViewItem* itemp = mParentFolder->getPreviousFromChild( this, include_children );
-
- // Skip over items that are invisible or are hidden from the UI.
- while(itemp && !itemp->getVisible())
- {
- LLFolderViewItem* next_itemp = itemp->mParentFolder->getPreviousFromChild( itemp, include_children );
- if (itemp == next_itemp)
- {
- // hit first item
- return itemp->getVisible() ? itemp : this;
- }
- itemp = next_itemp;
- }
-
- return itemp;
-}
-
-// is this item something we think we should be showing?
-// for example, if we haven't gotten around to filtering it yet, then the answer is yes
-// until we find out otherwise
-BOOL LLFolderViewItem::potentiallyVisible()
-{
- // we haven't been checked against min required filter
- // or we have and we passed
- return potentiallyFiltered();
-}
-
-BOOL LLFolderViewItem::potentiallyFiltered()
-{
- return getLastFilterGeneration() < getRoot()->getFilter()->getMinRequiredGeneration() || getFiltered();
-}
-
-BOOL LLFolderViewItem::getFiltered()
-{
- return mPassedFilter && mLastFilterGeneration >= getRoot()->getFilter()->getMinRequiredGeneration();
-}
-
-BOOL LLFolderViewItem::getFiltered(S32 filter_generation)
-{
- return mPassedFilter && mLastFilterGeneration >= filter_generation;
-}
-
-void LLFolderViewItem::setFiltered(BOOL filtered, S32 filter_generation)
-{
- mPassedFilter = filtered;
- mLastFilterGeneration = filter_generation;
-}
-
-void LLFolderViewItem::setIcon(LLUIImagePtr icon)
-{
- mIcon = icon;
-}
-
-// refresh information from the listener
-void LLFolderViewItem::refreshFromListener()
-{
- if(mListener)
- {
- mLabel = mListener->getDisplayName();
- 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
-
- // HACK: EXT - 6028 ([HARD CODED]? Inventory > Library > "Accessories" folder)
- // Translation of Accessories folder in Library inventory folder
- bool accessories = false;
- if(mLabel == std::string("Accessories"))
- {
- //To ensure that Accessories folder is in Library we have to check its parent folder.
- //Due to parent LLFolderViewFloder is not set to this item yet we have to check its parent via Inventory Model
- LLInventoryCategory* cat = gInventory.getCategory(mListener->getUUID());
- if(cat)
- {
- const LLUUID& parent_folder_id = cat->getParentUUID();
- accessories = (parent_folder_id == gInventory.getLibraryRootFolderID());
- }
- }
-
- //"Accessories" inventory category has folder type FT_NONE. So, this folder
- //can not be detected as protected with LLFolderType::lookupIsProtectedType
- if (accessories || LLFolderType::lookupIsProtectedType(preferred_type))
- {
- LLTrans::findString(mLabel, "InvFolder " + mLabel);
- };
-
- setToolTip(mLabel);
- setIcon(mListener->getIcon());
- time_t creation_date = mListener->getCreationDate();
- if ((creation_date > 0) && (mCreationDate != creation_date))
- {
- setCreationDate(creation_date);
- dirtyFilter();
- }
- if (mRoot->useLabelSuffix())
- {
- mLabelStyle = mListener->getLabelStyle();
- mLabelSuffix = mListener->getLabelSuffix();
- }
- }
-}
-
-void LLFolderViewItem::refresh()
-{
- refreshFromListener();
-
- std::string searchable_label(mLabel);
- searchable_label.append(mLabelSuffix);
- LLStringUtil::toUpper(searchable_label);
-
- if (mSearchableLabel.compare(searchable_label))
- {
- mSearchableLabel.assign(searchable_label);
- dirtyFilter();
- // some part of label has changed, so overall width has potentially changed, and sort order too
- if (mParentFolder)
- {
- mParentFolder->requestSort();
- mParentFolder->requestArrange();
- }
- }
-
- mLabelWidthDirty = true;
-}
-
-void LLFolderViewItem::applyListenerFunctorRecursively(LLFolderViewListenerFunctor& functor)
-{
- functor(mListener);
-}
-
-// This function is called when items are added or view filters change. It's
-// implemented here but called by derived classes when folding the
-// views.
-void LLFolderViewItem::filterFromRoot( void )
-{
- LLFolderViewItem* root = getRoot();
-
- root->filter(*((LLFolderView*)root)->getFilter());
-}
-
-// This function is called when the folder view is dirty. It's
-// implemented here but called by derived classes when folding the
-// views.
-void LLFolderViewItem::arrangeFromRoot()
-{
- LLFolderViewItem* root = getRoot();
-
- S32 height = 0;
- S32 width = 0;
- S32 total_height = root->arrange( &width, &height, 0 );
-
- LLSD params;
- params["action"] = "size_changes";
- params["height"] = total_height;
- getParent()->notifyParent(params);
-}
-
-// Utility function for LLFolderView
-void LLFolderViewItem::arrangeAndSet(BOOL set_selection,
- BOOL take_keyboard_focus)
-{
- LLFolderView* root = getRoot();
- if (getParentFolder())
- {
- getParentFolder()->requestArrange();
- }
- if(set_selection)
- {
- setSelectionFromRoot(this, TRUE, take_keyboard_focus);
- if(root)
- {
- root->scrollToShowSelection();
- }
- }
-}
-
-// This function clears the currently selected item, and records the
-// specified selected item appropriately for display and use in the
-// UI. If open is TRUE, then folders are opened up along the way to
-// the selection.
-void LLFolderViewItem::setSelectionFromRoot(LLFolderViewItem* selection,
- BOOL openitem,
- BOOL take_keyboard_focus)
-{
- getRoot()->setSelection(selection, openitem, take_keyboard_focus);
-}
-
-// helper function to change the selection from the root.
-void LLFolderViewItem::changeSelectionFromRoot(LLFolderViewItem* selection, BOOL selected)
-{
- getRoot()->changeSelection(selection, selected);
-}
-
-std::set<LLUUID> LLFolderViewItem::getSelectionList() const
-{
- std::set<LLUUID> selection;
- return selection;
-}
-
-EInventorySortGroup LLFolderViewItem::getSortGroup() const
-{
- return SG_ITEM;
-}
-
-// addToFolder() returns TRUE if it succeeds. FALSE otherwise
-BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* root)
-{
- if (!folder)
- {
- return FALSE;
- }
- mParentFolder = folder;
- root->addItemID(getListener()->getUUID(), this);
- return folder->addItem(this);
-}
-
-
-// Finds width and height of this object and its children. Also
-// makes sure that this view and its children are the right size.
-S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)
-{
- 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(mLabel) + getLabelFontForStyle(mLabelStyle)->getWidth(mLabelSuffix) + TEXT_PAD_RIGHT;
- mLabelWidthDirty = false;
- }
-
- *width = llmax(*width, mLabelWidth + mIndentation);
-
- // determine if we need to use ellipses to avoid horizontal scroll. EXT-719
- bool use_ellipses = getRoot()->getUseEllipses();
- if (use_ellipses)
- {
- // limit to set rect to avoid horizontal scrollbar
- *width = llmin(*width, getRoot()->getRect().getWidth());
- }
- *height = getItemHeight();
- return *height;
-}
-
-S32 LLFolderViewItem::getItemHeight()
-{
- return mItemHeight;
-}
-
-void LLFolderViewItem::filter( LLInventoryFilter& filter)
-{
- const BOOL previous_passed_filter = mPassedFilter;
- const BOOL passed_filter = filter.check(this);
-
- // If our visibility will change as a result of this filter, then
- // we need to be rearranged in our parent folder
- if (mParentFolder)
- {
- if (getVisible() != passed_filter
- || previous_passed_filter != passed_filter )
- mParentFolder->requestArrange();
- }
-
- setFiltered(passed_filter, filter.getCurrentGeneration());
- mStringMatchOffset = filter.getStringMatchOffset();
- filter.decrementFilterCount();
-
- if (getRoot()->getDebugFilters())
- {
- mStatusText = llformat("%d", mLastFilterGeneration);
- }
-}
-
-void LLFolderViewItem::dirtyFilter()
-{
- mLastFilterGeneration = -1;
- // bubble up dirty flag all the way to root
- if (getParentFolder())
- {
- getParentFolder()->setCompletedFilterGeneration(-1, TRUE);
- }
-}
-
-// *TODO: This can be optimized a lot by simply recording that it is
-// selected in the appropriate places, and assuming that set selection
-// means 'deselect' for a leaf item. Do this optimization after
-// multiple selection is implemented to make sure it all plays nice
-// together.
-BOOL LLFolderViewItem::setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus)
-{
- if (selection == this && !mIsSelected)
- {
- selectItem();
- }
- else if (mIsSelected) // Deselect everything else.
- {
- deselectItem();
- }
- return mIsSelected;
-}
-
-BOOL LLFolderViewItem::changeSelection(LLFolderViewItem* selection, BOOL selected)
-{
- if (selection == this)
- {
- if (mIsSelected)
- {
- deselectItem();
- }
- else
- {
- selectItem();
- }
- return TRUE;
- }
- return FALSE;
-}
-
-void LLFolderViewItem::deselectItem(void)
-{
- mIsSelected = FALSE;
-}
-
-void LLFolderViewItem::selectItem(void)
-{
- if (mIsSelected == FALSE)
- {
- if (mListener)
- {
- mListener->selectItem();
- }
- mIsSelected = TRUE;
- }
-}
-
-BOOL LLFolderViewItem::isMovable()
-{
- if( mListener )
- {
- return mListener->isItemMovable();
- }
- else
- {
- return TRUE;
- }
-}
-
-BOOL LLFolderViewItem::isRemovable()
-{
- if( mListener )
- {
- return mListener->isItemRemovable();
- }
- else
- {
- return TRUE;
- }
-}
-
-void LLFolderViewItem::destroyView()
-{
- if (mParentFolder)
- {
- // removeView deletes me
- mParentFolder->removeView(this);
- }
-}
-
-// Call through to the viewed object and return true if it can be
-// removed.
-//BOOL LLFolderViewItem::removeRecursively(BOOL single_item)
-BOOL LLFolderViewItem::remove()
-{
- if(!isRemovable())
- {
- return FALSE;
- }
- if(mListener)
- {
- return mListener->removeItem();
- }
- return TRUE;
-}
-
-// Build an appropriate context menu for the item.
-void LLFolderViewItem::buildContextMenu(LLMenuGL& menu, U32 flags)
-{
- if(mListener)
- {
- mListener->buildContextMenu(menu, flags);
- }
-}
-
-void LLFolderViewItem::openItem( void )
-{
- if( mListener )
- {
- mListener->openItem();
- }
-}
-
-void LLFolderViewItem::preview( void )
-{
- if (mListener)
- {
- mListener->previewItem();
- }
-}
-
-void LLFolderViewItem::rename(const std::string& new_name)
-{
- if( !new_name.empty() )
- {
- if( mListener )
- {
- mListener->renameItem(new_name);
-
- if(mParentFolder)
- {
- mParentFolder->requestSort();
- }
- }
- }
-}
-
-const std::string& LLFolderViewItem::getSearchableLabel() const
-{
- return mSearchableLabel;
-}
-
-LLViewerInventoryItem * LLFolderViewItem::getInventoryItem(void)
-{
- if (!getListener()) return NULL;
- return gInventory.getItem(getListener()->getUUID());
-}
-
-const std::string& LLFolderViewItem::getName( void ) const
-{
- if(mListener)
- {
- return mListener->getName();
- }
- return mLabel;
-}
-
-// LLView functionality
-BOOL LLFolderViewItem::handleRightMouseDown( S32 x, S32 y, MASK mask )
-{
- if(!mIsSelected)
- {
- setSelectionFromRoot(this, FALSE);
- }
- make_ui_sound("UISndClick");
- return TRUE;
-}
-
-BOOL LLFolderViewItem::handleMouseDown( S32 x, S32 y, MASK mask )
-{
- if (LLView::childrenHandleMouseDown(x, y, mask))
- {
- return TRUE;
- }
-
- // No handler needed for focus lost since this class has no
- // state that depends on it.
- gFocusMgr.setMouseCapture( this );
-
- if (!mIsSelected)
- {
- if(mask & MASK_CONTROL)
- {
- changeSelectionFromRoot(this, !mIsSelected);
- }
- else if (mask & MASK_SHIFT)
- {
- getParentFolder()->extendSelectionTo(this);
- }
- else
- {
- setSelectionFromRoot(this, FALSE);
- }
- make_ui_sound("UISndClick");
- }
- else
- {
- mSelectPending = TRUE;
- }
-
- if( isMovable() )
- {
- S32 screen_x;
- S32 screen_y;
- localPointToScreen(x, y, &screen_x, &screen_y );
- LLToolDragAndDrop::getInstance()->setDragStart( screen_x, screen_y );
- }
- return TRUE;
-}
-
-BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask )
-{
- mIsMouseOverTitle = (y > (getRect().getHeight() - mItemHeight));
-
- if( hasMouseCapture() && isMovable() )
- {
- S32 screen_x;
- S32 screen_y;
- localPointToScreen(x, y, &screen_x, &screen_y );
- BOOL can_drag = TRUE;
- if( LLToolDragAndDrop::getInstance()->isOverThreshold( screen_x, screen_y ) )
- {
- LLFolderView* root = getRoot();
-
- if(root->getCurSelectedItem())
- {
- LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_WORLD;
-
- // *TODO: push this into listener and remove
- // dependency on llagent
- if (mListener
- && gInventory.isObjectDescendentOf(mListener->getUUID(), gInventory.getRootFolderID()))
- {
- src = LLToolDragAndDrop::SOURCE_AGENT;
- }
- else if (mListener
- && gInventory.isObjectDescendentOf(mListener->getUUID(), gInventory.getLibraryRootFolderID()))
- {
- src = LLToolDragAndDrop::SOURCE_LIBRARY;
- }
-
- can_drag = root->startDrag(src);
- if (can_drag)
- {
- // if (mListener) mListener->startDrag();
- // RN: when starting drag and drop, clear out last auto-open
- root->autoOpenTest(NULL);
- root->setShowSelectionContext(TRUE);
-
- // Release keyboard focus, so that if stuff is dropped into the
- // world, pressing the delete key won't blow away the inventory
- // item.
- gFocusMgr.setKeyboardFocus(NULL);
-
- return LLToolDragAndDrop::getInstance()->handleHover( x, y, mask );
- }
- }
- }
-
- if (can_drag)
- {
- gViewerWindow->setCursor(UI_CURSOR_ARROW);
- }
- else
- {
- gViewerWindow->setCursor(UI_CURSOR_NOLOCKED);
- }
- return TRUE;
- }
- else
- {
- getRoot()->setShowSelectionContext(FALSE);
- gViewerWindow->setCursor(UI_CURSOR_ARROW);
- // let parent handle this then...
- return FALSE;
- }
-}
-
-
-BOOL LLFolderViewItem::handleDoubleClick( S32 x, S32 y, MASK mask )
-{
- preview();
- return TRUE;
-}
-
-BOOL LLFolderViewItem::handleMouseUp( S32 x, S32 y, MASK mask )
-{
- if (LLView::childrenHandleMouseUp(x, y, mask))
- {
- return TRUE;
- }
-
- // if mouse hasn't moved since mouse down...
- if ( pointInView(x, y) && mSelectPending )
- {
- //...then select
- if(mask & MASK_CONTROL)
- {
- changeSelectionFromRoot(this, !mIsSelected);
- }
- else if (mask & MASK_SHIFT)
- {
- getParentFolder()->extendSelectionTo(this);
- }
- else
- {
- setSelectionFromRoot(this, FALSE);
- }
- }
-
- mSelectPending = FALSE;
-
- if( hasMouseCapture() )
- {
- getRoot()->setShowSelectionContext(FALSE);
- gFocusMgr.setMouseCapture( NULL );
- }
- return TRUE;
-}
-
-void LLFolderViewItem::onMouseLeave(S32 x, S32 y, MASK mask)
-{
- mIsMouseOverTitle = false;
-}
-
-BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg)
-{
- BOOL accepted = FALSE;
- BOOL handled = FALSE;
- if(mListener)
- {
- accepted = mListener->dragOrDrop(mask,drop,cargo_type,cargo_data, tooltip_msg);
- handled = accepted;
- if (accepted)
- {
- mDragAndDropTarget = TRUE;
- *accept = ACCEPT_YES_MULTI;
- }
- else
- {
- *accept = ACCEPT_NO;
- }
- }
- if(mParentFolder && !handled)
- {
- // store this item to get it in LLFolderBridge::dragItemIntoFolder on drop event.
- mRoot->setDraggingOverItem(this);
- handled = mParentFolder->handleDragAndDropFromChild(mask,drop,cargo_type,cargo_data,accept,tooltip_msg);
- mRoot->setDraggingOverItem(NULL);
- }
- if (handled)
- {
- lldebugst(LLERR_USER_INPUT) << "dragAndDrop handled by LLFolderViewItem" << llendl;
- }
-
- return handled;
-}
-
-void LLFolderViewItem::draw()
-{
- 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("InventoryItemColor", DEFAULT_WHITE);
- static LLUIColor sLibraryColor = LLUIColorTable::instance().getColor("InventoryItemLibraryColor", DEFAULT_WHITE);
- static LLUIColor sLinkColor = LLUIColorTable::instance().getColor("InventoryItemLinkColor", DEFAULT_WHITE);
- static LLUIColor sSearchStatusColor = LLUIColorTable::instance().getColor("InventorySearchStatusColor", DEFAULT_WHITE);
- static LLUIColor sMouseOverColor = LLUIColorTable::instance().getColor("InventoryMouseOverColor", DEFAULT_WHITE);
-
- const Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
- const S32 TOP_PAD = default_params.item_top_pad;
- const S32 FOCUS_LEFT = 1;
- const LLFontGL* font = getLabelFontForStyle(mLabelStyle);
-
- const BOOL in_inventory = getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(), gInventory.getRootFolderID());
- const BOOL in_library = getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(), gInventory.getLibraryRootFolderID());
-
- //--------------------------------------------------------------------------------//
- // Draw open folder arrow
- //
- const bool up_to_date = mListener && mListener->isUpToDate();
- const bool possibly_has_children = ((up_to_date && hasVisibleChildren()) // we fetched our children and some of them have passed the filter...
- || (!up_to_date && mListener && mListener->hasChildren())); // ...or we know we have children but haven't fetched them (doesn't obey filter)
- if (possibly_has_children)
- {
- LLUIImage* arrow_image = default_params.folder_arrow_image;
- gl_draw_scaled_rotated_image(
- mIndentation, getRect().getHeight() - ARROW_SIZE - TEXT_PAD - TOP_PAD,
- ARROW_SIZE, ARROW_SIZE, mControlLabelRotation, arrow_image->getImage(), sFgColor);
- }
-
-
- //--------------------------------------------------------------------------------//
- // Draw highlight for selected items
- //
- const BOOL show_context = getRoot()->getShowSelectionContext();
- const BOOL filled = show_context || (getRoot()->getParentPanel()->hasFocus()); // If we have keyboard focus, draw selection filled
- const S32 focus_top = getRect().getHeight();
- const S32 focus_bottom = getRect().getHeight() - mItemHeight;
- const bool folder_open = (getRect().getHeight() > mItemHeight + 4);
- if (mIsSelected) // always render "current" item. Only render other selected items if mShowSingleSelection is FALSE
- {
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- LLColor4 bg_color = sHighlightBgColor;
- if (!mIsCurSelection)
- {
- // do time-based fade of extra objects
- F32 fade_time = getRoot()->getSelectionFadeElapsedTime();
- if (getRoot()->getShowSingleSelection())
- {
- // fading out
- bg_color.mV[VALPHA] = clamp_rescale(fade_time, 0.f, 0.4f, bg_color.mV[VALPHA], 0.f);
- }
- else
- {
- // fading in
- bg_color.mV[VALPHA] = clamp_rescale(fade_time, 0.f, 0.4f, 0.f, bg_color.mV[VALPHA]);
- }
- }
- gl_rect_2d(FOCUS_LEFT,
- focus_top,
- getRect().getWidth() - 2,
- focus_bottom,
- bg_color, filled);
- if (mIsCurSelection)
- {
- gl_rect_2d(FOCUS_LEFT,
- focus_top,
- getRect().getWidth() - 2,
- focus_bottom,
- sFocusOutlineColor, FALSE);
- }
- if (folder_open)
- {
- gl_rect_2d(FOCUS_LEFT,
- focus_bottom + 1, // overlap with bottom edge of above rect
- getRect().getWidth() - 2,
- 0,
- sFocusOutlineColor, FALSE);
- if (show_context)
- {
- gl_rect_2d(FOCUS_LEFT,
- focus_bottom + 1,
- getRect().getWidth() - 2,
- 0,
- sHighlightBgColor, TRUE);
- }
- }
- }
- else if (mIsMouseOverTitle)
- {
- gl_rect_2d(FOCUS_LEFT,
- focus_top,
- getRect().getWidth() - 2,
- focus_bottom,
- sMouseOverColor, FALSE);
- }
-
- //--------------------------------------------------------------------------------//
- // Draw DragNDrop highlight
- //
- if (mDragAndDropTarget)
- {
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gl_rect_2d(FOCUS_LEFT,
- focus_top,
- getRect().getWidth() - 2,
- focus_bottom,
- sHighlightBgColor, FALSE);
- if (folder_open)
- {
- gl_rect_2d(FOCUS_LEFT,
- focus_bottom + 1, // overlap with bottom edge of above rect
- getRect().getWidth() - 2,
- 0,
- sHighlightBgColor, FALSE);
- }
- mDragAndDropTarget = FALSE;
- }
-
- const LLViewerInventoryItem *item = getInventoryItem();
- const BOOL highlight_link = mIconOverlay && item && item->getIsLinkType();
- //--------------------------------------------------------------------------------//
- // Draw open icon
- //
- const S32 icon_x = mIndentation + ARROW_SIZE + TEXT_PAD;
- if (!mIconOpen.isNull() && (llabs(mControlLabelRotation) > 80)) // For open folders
- {
- mIconOpen->draw(icon_x, getRect().getHeight() - mIconOpen->getHeight() - TOP_PAD + 1);
- }
- else if (mIcon)
- {
- mIcon->draw(icon_x, getRect().getHeight() - mIcon->getHeight() - TOP_PAD + 1);
- }
-
- if (highlight_link)
- {
- mIconOverlay->draw(icon_x, getRect().getHeight() - mIcon->getHeight() - TOP_PAD + 1);
- }
-
- //--------------------------------------------------------------------------------//
- // Exit if no label to draw
- //
- if (mLabel.empty())
- {
- return;
- }
-
- LLColor4 color = (mIsSelected && filled) ? sHighlightFgColor : sFgColor;
- if (highlight_link) color = sLinkColor;
- if (in_library) color = sLibraryColor;
-
- F32 right_x = 0;
- F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
- F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation);
-
- //--------------------------------------------------------------------------------//
- // Highlight filtered text
- //
- if (getRoot()->getDebugFilters())
- {
- if (!getFiltered() && !possibly_has_children)
- {
- color.mV[VALPHA] *= 0.5f;
- }
- LLColor4 filter_color = mLastFilterGeneration >= getRoot()->getFilter()->getCurrentGeneration() ?
- LLColor4(0.5f, 0.8f, 0.5f, 1.f) :
- LLColor4(0.8f, 0.5f, 0.5f, 1.f);
- LLFontGL::getFontMonospace()->renderUTF8(mStatusText, 0, text_left, y, filter_color,
- LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
- S32_MAX, S32_MAX, &right_x, FALSE );
- text_left = right_x;
- }
- //--------------------------------------------------------------------------------//
- // Draw the actual label text
- //
- font->renderUTF8(mLabel, 0, text_left, y, color,
- LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
- S32_MAX, getRect().getWidth() - (S32) text_left, &right_x, TRUE);
-
- //--------------------------------------------------------------------------------//
- // Draw "Loading..." text
- //
- bool root_is_loading = false;
- if (in_inventory)
- {
- root_is_loading = LLInventoryModelBackgroundFetch::instance().inventoryFetchInProgress();
- }
- if (in_library)
- {
- root_is_loading = LLInventoryModelBackgroundFetch::instance().libraryFetchInProgress();
- }
- if ((mIsLoading
- && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime"))
- || (LLInventoryModelBackgroundFetch::instance().folderFetchActive()
- && root_is_loading
- && mShowLoadStatus))
- {
- std::string load_string = " ( " + LLTrans::getString("LoadingData") + " ) ";
- font->renderUTF8(load_string, 0, right_x, y, sSearchStatusColor,
- LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
- S32_MAX, S32_MAX, &right_x, FALSE);
- }
-
- //--------------------------------------------------------------------------------//
- // Draw label suffix
- //
- if (!mLabelSuffix.empty())
- {
- font->renderUTF8( mLabelSuffix, 0, right_x, y, sSuffixColor,
- LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
- S32_MAX, S32_MAX, &right_x, FALSE );
- }
-
- //--------------------------------------------------------------------------------//
- // Highlight string match
- //
- if (mStringMatchOffset != std::string::npos)
- {
- // don't draw backgrounds for zero-length strings
- S32 filter_string_length = getRoot()->getFilterSubString().size();
- if (filter_string_length > 0)
- {
- std::string combined_string = mLabel + mLabelSuffix;
- S32 left = llround(text_left) + font->getWidth(combined_string, 0, mStringMatchOffset) - 1;
- S32 right = left + font->getWidth(combined_string, mStringMatchOffset, filter_string_length) + 2;
- S32 bottom = llfloor(getRect().getHeight() - font->getLineHeight() - 3 - TOP_PAD);
- S32 top = getRect().getHeight() - TOP_PAD;
-
- LLUIImage* box_image = default_params.selection_image;
- LLRect box_rect(left, top, right, bottom);
- box_image->draw(box_rect, sFilterBGColor);
- F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, mStringMatchOffset);
- F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
- font->renderUTF8( combined_string, mStringMatchOffset, match_string_left, yy,
- sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
- filter_string_length, S32_MAX, &right_x, FALSE );
- }
- }
-}
-
-bool LLFolderViewItem::isInSelection() const
-{
- return mIsSelected || (mParentFolder && mParentFolder->isInSelection());
-}
-
-///----------------------------------------------------------------------------
-/// Class LLFolderViewFolder
-///----------------------------------------------------------------------------
-
-LLFolderViewFolder::LLFolderViewFolder( const LLFolderViewItem::Params& p ):
- LLFolderViewItem( p ), // 0 = no create time
- mIsOpen(FALSE),
- mExpanderHighlighted(FALSE),
- mCurHeight(0.f),
- mTargetHeight(0.f),
- mAutoOpenCountdown(0.f),
- mSubtreeCreationDate(0),
- mAmTrash(LLFolderViewFolder::UNKNOWN),
- mLastArrangeGeneration( -1 ),
- mLastCalculatedWidth(0),
- mCompletedFilterGeneration(-1),
- mMostFilteredDescendantGeneration(-1),
- mNeedsSort(false),
- mPassedFolderFilter(FALSE)
-{
-}
-
-// Destroys the object
-LLFolderViewFolder::~LLFolderViewFolder( void )
-{
- // The LLView base class takes care of object destruction. make sure that we
- // don't have mouse or keyboard focus
- gFocusMgr.releaseFocusIfNeeded( this ); // calls onCommit()
-}
-
-void LLFolderViewFolder::setFilteredFolder(bool filtered, S32 filter_generation)
-{
- mPassedFolderFilter = filtered;
- mLastFilterGeneration = filter_generation;
-}
-
-bool LLFolderViewFolder::getFilteredFolder(S32 filter_generation)
-{
- return mPassedFolderFilter && mLastFilterGeneration >= getRoot()->getFilter()->getMinRequiredGeneration();
-}
-
-// addToFolder() returns TRUE if it succeeds. FALSE otherwise
-BOOL LLFolderViewFolder::addToFolder(LLFolderViewFolder* folder, LLFolderView* root)
-{
- if (!folder)
- {
- return FALSE;
- }
- mParentFolder = folder;
- root->addItemID(getListener()->getUUID(), this);
- return folder->addFolder(this);
-}
-
-// Finds width and height of this object and its children. Also
-// makes sure that this view and its children are the right size.
-S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)
-{
- // sort before laying out contents
- if (mNeedsSort)
- {
- mFolders.sort(mSortFunction);
- mItems.sort(mSortFunction);
- mNeedsSort = false;
- }
-
- // evaluate mHasVisibleChildren
- mHasVisibleChildren = false;
- if (hasFilteredDescendants(filter_generation))
- {
- // We have to verify that there's at least one child that's not filtered out
- bool found = false;
- // Try the items first
- for (items_t::iterator iit = mItems.begin(); iit != mItems.end(); ++iit)
- {
- LLFolderViewItem* itemp = (*iit);
- found = (itemp->getFiltered(filter_generation));
- if (found)
- break;
- }
- if (!found)
- {
- // If no item found, try the folders
- for (folders_t::iterator fit = mFolders.begin(); fit != mFolders.end(); ++fit)
- {
- LLFolderViewFolder* folderp = (*fit);
- found = ( folderp->getListener()
- && (folderp->getFiltered(filter_generation)
- || (folderp->getFilteredFolder(filter_generation)
- && folderp->hasFilteredDescendants(filter_generation))));
- if (found)
- break;
- }
- }
-
- mHasVisibleChildren = found;
- }
-
- // calculate height as a single item (without any children), and reshapes rectangle to match
- LLFolderViewItem::arrange( width, height, filter_generation );
-
- // clamp existing animated height so as to never get smaller than a single item
- mCurHeight = llmax((F32)*height, mCurHeight);
-
- // initialize running height value as height of single item in case we have no children
- *height = getItemHeight();
- F32 running_height = (F32)*height;
- F32 target_height = (F32)*height;
-
- // are my children visible?
- if (needsArrange())
- {
- // set last arrange generation first, in case children are animating
- // and need to be arranged again
- mLastArrangeGeneration = getRoot()->getArrangeGeneration();
- if (mIsOpen)
- {
- // Add sizes of children
- S32 parent_item_height = getRect().getHeight();
-
- for(folders_t::iterator fit = mFolders.begin(); fit != mFolders.end(); ++fit)
- {
- LLFolderViewFolder* folderp = (*fit);
- if (getRoot()->getDebugFilters())
- {
- folderp->setVisible(TRUE);
- }
- else
- {
- folderp->setVisible( folderp->getListener()
- && (folderp->getFiltered(filter_generation)
- || (folderp->getFilteredFolder(filter_generation)
- && folderp->hasFilteredDescendants(filter_generation)))); // passed filter or has descendants that passed filter
- }
-
- if (folderp->getVisible())
- {
- S32 child_width = *width;
- S32 child_height = 0;
- S32 child_top = parent_item_height - llround(running_height);
-
- target_height += folderp->arrange( &child_width, &child_height, filter_generation );
-
- running_height += (F32)child_height;
- *width = llmax(*width, child_width);
- folderp->setOrigin( 0, child_top - folderp->getRect().getHeight() );
- }
- }
- for(items_t::iterator iit = mItems.begin();
- iit != mItems.end(); ++iit)
- {
- LLFolderViewItem* itemp = (*iit);
- if (getRoot()->getDebugFilters())
- {
- itemp->setVisible(TRUE);
- }
- else
- {
- itemp->setVisible(itemp->getFiltered(filter_generation));
- }
-
- if (itemp->getVisible())
- {
- S32 child_width = *width;
- S32 child_height = 0;
- S32 child_top = parent_item_height - llround(running_height);
-
- target_height += itemp->arrange( &child_width, &child_height, filter_generation );
- // don't change width, as this item is as wide as its parent folder by construction
- itemp->reshape( itemp->getRect().getWidth(), child_height);
-
- running_height += (F32)child_height;
- *width = llmax(*width, child_width);
- itemp->setOrigin( 0, child_top - itemp->getRect().getHeight() );
- }
- }
- }
-
- mTargetHeight = target_height;
- // cache this width so next time we can just return it
- mLastCalculatedWidth = *width;
- }
- else
- {
- // just use existing width
- *width = mLastCalculatedWidth;
- }
-
- // animate current height towards target height
- if (llabs(mCurHeight - mTargetHeight) > 1.f)
- {
- mCurHeight = lerp(mCurHeight, mTargetHeight, LLCriticalDamp::getInterpolant(mIsOpen ? FOLDER_OPEN_TIME_CONSTANT : FOLDER_CLOSE_TIME_CONSTANT));
-
- requestArrange();
-
- // hide child elements that fall out of current animated height
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
- {
- folders_t::iterator fit = iter++;
- // number of pixels that bottom of folder label is from top of parent folder
- if (getRect().getHeight() - (*fit)->getRect().mTop + (*fit)->getItemHeight()
- > llround(mCurHeight) + MAX_FOLDER_ITEM_OVERLAP)
- {
- // hide if beyond current folder height
- (*fit)->setVisible(FALSE);
- }
- }
-
- for (items_t::iterator iter = mItems.begin();
- iter != mItems.end();)
- {
- items_t::iterator iit = iter++;
- // number of pixels that bottom of item label is from top of parent folder
- if (getRect().getHeight() - (*iit)->getRect().mBottom
- > llround(mCurHeight) + MAX_FOLDER_ITEM_OVERLAP)
- {
- (*iit)->setVisible(FALSE);
- }
- }
- }
- else
- {
- mCurHeight = mTargetHeight;
- }
-
- // don't change width as this item is already as wide as its parent folder
- reshape(getRect().getWidth(),llround(mCurHeight));
-
- // pass current height value back to parent
- *height = llround(mCurHeight);
-
- return llround(mTargetHeight);
-}
-
-BOOL LLFolderViewFolder::needsArrange()
-{
- return mLastArrangeGeneration < getRoot()->getArrangeGeneration();
-}
-
-void LLFolderViewFolder::requestSort()
-{
- mNeedsSort = true;
- // whenever item order changes, we need to lay things out again
- requestArrange();
-}
-
-void LLFolderViewFolder::setCompletedFilterGeneration(S32 generation, BOOL recurse_up)
-{
- //mMostFilteredDescendantGeneration = llmin(mMostFilteredDescendantGeneration, generation);
- mCompletedFilterGeneration = generation;
- // only aggregate up if we are a lower (older) value
- if (recurse_up
- && mParentFolder
- && generation < mParentFolder->getCompletedFilterGeneration())
- {
- mParentFolder->setCompletedFilterGeneration(generation, TRUE);
- }
-}
-
-void LLFolderViewFolder::filter( LLInventoryFilter& filter)
-{
- S32 filter_generation = filter.getCurrentGeneration();
- // if failed to pass filter newer than must_pass_generation
- // you will automatically fail this time, so we only
- // check against items that have passed the filter
- S32 must_pass_generation = filter.getMustPassGeneration();
-
- bool autoopen_folders = (filter.hasFilterString());
-
- // if we have already been filtered against this generation, skip out
- if (getCompletedFilterGeneration() >= filter_generation)
- {
- return;
- }
-
- // filter folder itself
- if (getLastFilterGeneration() < filter_generation)
- {
- if (getLastFilterGeneration() >= must_pass_generation // folder has been compared to a valid precursor filter
- && !mPassedFilter) // and did not pass the filter
- {
- // go ahead and flag this folder as done
- mLastFilterGeneration = filter_generation;
- mStringMatchOffset = std::string::npos;
- }
- else // filter self only on first pass through
- {
- // filter against folder rules
- filterFolder(filter);
- // and then item rules
- LLFolderViewItem::filter( filter );
- }
- }
-
- if (getRoot()->getDebugFilters())
- {
- mStatusText = llformat("%d", mLastFilterGeneration);
- mStatusText += llformat("(%d)", mCompletedFilterGeneration);
- mStatusText += llformat("+%d", mMostFilteredDescendantGeneration);
- }
-
- // all descendants have been filtered later than must pass generation
- // but none passed
- if(getCompletedFilterGeneration() >= must_pass_generation && !hasFilteredDescendants(must_pass_generation))
- {
- // don't traverse children if we've already filtered them since must_pass_generation
- // and came back with nothing
- return;
- }
-
- // we entered here with at least one filter iteration left
- // check to see if we have any more before continuing on to children
- if (filter.getFilterCount() < 0)
- {
- return;
- }
-
- // when applying a filter, matching folders get their contents downloaded first
- if (filter.isNotDefault()
- && getFiltered(filter.getMinRequiredGeneration())
- && (mListener
- && !gInventory.isCategoryComplete(mListener->getUUID())))
- {
- LLInventoryModelBackgroundFetch::instance().start(mListener->getUUID());
- }
-
- // now query children
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();
- ++iter)
- {
- LLFolderViewFolder* folder = (*iter);
- // have we run out of iterations this frame?
- if (filter.getFilterCount() < 0)
- {
- break;
- }
-
- // 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 (folder->getCompletedFilterGeneration() >= filter_generation)
- {
- // track latest generation to pass any child items
- if (folder->getFiltered() || folder->hasFilteredDescendants(filter.getMinRequiredGeneration()))
- {
- mMostFilteredDescendantGeneration = filter_generation;
- requestArrange();
- }
- // just skip it, it has already been filtered
- continue;
- }
-
- // update this folders filter status (and children)
- folder->filter( filter );
-
- // track latest generation to pass any child items
- if (folder->getFiltered() || folder->hasFilteredDescendants(filter_generation))
- {
- mMostFilteredDescendantGeneration = filter_generation;
- requestArrange();
- if (getRoot()->needsAutoSelect() && autoopen_folders)
- {
- folder->setOpenArrangeRecursively(TRUE);
- }
- }
- }
-
- for (items_t::iterator iter = mItems.begin();
- iter != mItems.end();
- ++iter)
- {
- LLFolderViewItem* item = (*iter);
- if (filter.getFilterCount() < 0)
- {
- break;
- }
- if (item->getLastFilterGeneration() >= filter_generation)
- {
- if (item->getFiltered())
- {
- mMostFilteredDescendantGeneration = filter_generation;
- requestArrange();
- }
- continue;
- }
-
- 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
- item->setFiltered(FALSE, filter_generation);
- continue;
- }
-
- item->filter( filter );
-
- if (item->getFiltered(filter.getMinRequiredGeneration()))
- {
- mMostFilteredDescendantGeneration = filter_generation;
- requestArrange();
- }
- }
-
- // if we didn't use all filter iterations
- // that means we filtered all of our descendants
- // instead of exhausting the filter count for this frame
- if (filter.getFilterCount() > 0)
- {
- // flag this folder as having completed filter pass for all descendants
- setCompletedFilterGeneration(filter_generation, FALSE/*dont recurse up to root*/);
- }
-}
-
-void LLFolderViewFolder::filterFolder(LLInventoryFilter& filter)
-{
- const BOOL previous_passed_filter = mPassedFolderFilter;
- const BOOL passed_filter = filter.checkFolder(this);
-
- // If our visibility will change as a result of this filter, then
- // we need to be rearranged in our parent folder
- if (mParentFolder)
- {
- if (getVisible() != passed_filter
- || previous_passed_filter != passed_filter )
- {
- mParentFolder->requestArrange();
- }
- }
-
- setFilteredFolder(passed_filter, filter.getCurrentGeneration());
- filter.decrementFilterCount();
-
- if (getRoot()->getDebugFilters())
- {
- mStatusText = llformat("%d", mLastFilterGeneration);
- }
-}
-
-void LLFolderViewFolder::setFiltered(BOOL filtered, S32 filter_generation)
-{
- // if this folder is now filtered, but wasn't before
- // (it just passed)
- if (filtered && !mPassedFilter)
- {
- // reset current height, because last time we drew it
- // it might have had more visible items than now
- mCurHeight = 0.f;
- }
-
- LLFolderViewItem::setFiltered(filtered, filter_generation);
-}
-
-void LLFolderViewFolder::dirtyFilter()
-{
- // we're a folder, so invalidate our completed generation
- setCompletedFilterGeneration(-1, FALSE);
- LLFolderViewItem::dirtyFilter();
-}
-
-BOOL LLFolderViewFolder::getFiltered()
-{
- return getFilteredFolder(getRoot()->getFilter()->getMinRequiredGeneration())
- && LLFolderViewItem::getFiltered();
-}
-
-BOOL LLFolderViewFolder::getFiltered(S32 filter_generation)
-{
- return getFilteredFolder(filter_generation) && LLFolderViewItem::getFiltered(filter_generation);
-}
-
-BOOL LLFolderViewFolder::hasFilteredDescendants(S32 filter_generation)
-{
- return mMostFilteredDescendantGeneration >= filter_generation;
-}
-
-
-BOOL LLFolderViewFolder::hasFilteredDescendants()
-{
- return mMostFilteredDescendantGeneration >= getRoot()->getFilter()->getCurrentGeneration();
-}
-
-// Passes selection information on to children and record selection
-// information if necessary.
-BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem,
- BOOL take_keyboard_focus)
-{
- BOOL rv = FALSE;
- if (selection == this)
- {
- if (!isSelected())
- {
- selectItem();
- }
- rv = TRUE;
- }
- else
- {
- if (isSelected())
- {
- deselectItem();
- }
- rv = FALSE;
- }
- BOOL child_selected = FALSE;
-
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
- {
- folders_t::iterator fit = iter++;
- if((*fit)->setSelection(selection, openitem, take_keyboard_focus))
- {
- rv = TRUE;
- child_selected = TRUE;
- }
- }
- for (items_t::iterator iter = mItems.begin();
- iter != mItems.end();)
- {
- items_t::iterator iit = iter++;
- if((*iit)->setSelection(selection, openitem, take_keyboard_focus))
- {
- rv = TRUE;
- child_selected = TRUE;
- }
- }
- if(openitem && child_selected)
- {
- setOpenArrangeRecursively(TRUE);
- }
- return rv;
-}
-
-// This method is used to change the selection of an item.
-// Recursively traverse all children; if 'selection' is 'this' then change
-// the select status if necessary.
-// Returns TRUE if the selection state of this folder, or of a child, was changed.
-BOOL LLFolderViewFolder::changeSelection(LLFolderViewItem* selection, BOOL selected)
-{
- BOOL rv = FALSE;
- if(selection == this)
- {
- if (isSelected() != selected)
- {
- rv = TRUE;
- if (selected)
- {
- selectItem();
- }
- else
- {
- deselectItem();
- }
- }
- }
-
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
- {
- folders_t::iterator fit = iter++;
- if((*fit)->changeSelection(selection, selected))
- {
- rv = TRUE;
- }
- }
- for (items_t::iterator iter = mItems.begin();
- iter != mItems.end();)
- {
- items_t::iterator iit = iter++;
- if((*iit)->changeSelection(selection, selected))
- {
- rv = TRUE;
- }
- }
- return rv;
-}
-
-LLFolderViewFolder* LLFolderViewFolder::getCommonAncestor(LLFolderViewItem* item_a, LLFolderViewItem* item_b, bool& reverse)
-{
- if (!item_a->getParentFolder() || !item_b->getParentFolder()) return NULL;
-
- std::deque<LLFolderViewFolder*> item_a_ancestors;
-
- LLFolderViewFolder* parent = item_a->getParentFolder();
- while(parent)
- {
- item_a_ancestors.push_back(parent);
- parent = parent->getParentFolder();
- }
-
- std::deque<LLFolderViewFolder*> item_b_ancestors;
-
- parent = item_b->getParentFolder();
- while(parent)
- {
- item_b_ancestors.push_back(parent);
- parent = parent->getParentFolder();
- }
-
- LLFolderViewFolder* common_ancestor = item_a->getRoot();
-
- while(item_a_ancestors.size() > item_b_ancestors.size())
- {
- item_a = item_a_ancestors.front();
- item_a_ancestors.pop_front();
- }
-
- while(item_b_ancestors.size() > item_a_ancestors.size())
- {
- item_b = item_b_ancestors.front();
- item_b_ancestors.pop_front();
- }
-
- while(item_a_ancestors.size())
- {
- common_ancestor = item_a_ancestors.front();
-
- if (item_a_ancestors.front() == item_b_ancestors.front())
- {
- // which came first, sibling a or sibling b?
- for (folders_t::iterator it = common_ancestor->mFolders.begin(), end_it = common_ancestor->mFolders.end();
- it != end_it;
- ++it)
- {
- LLFolderViewItem* item = *it;
-
- if (item == item_a)
- {
- reverse = false;
- return common_ancestor;
- }
- if (item == item_b)
- {
- reverse = true;
- return common_ancestor;
- }
- }
-
- for (items_t::iterator it = common_ancestor->mItems.begin(), end_it = common_ancestor->mItems.end();
- it != end_it;
- ++it)
- {
- LLFolderViewItem* item = *it;
-
- if (item == item_a)
- {
- reverse = false;
- return common_ancestor;
- }
- if (item == item_b)
- {
- reverse = true;
- return common_ancestor;
- }
- }
- break;
- }
-
- item_a = item_a_ancestors.front();
- item_a_ancestors.pop_front();
- item_b = item_b_ancestors.front();
- item_b_ancestors.pop_front();
- }
-
- return NULL;
-}
-
-void LLFolderViewFolder::gatherChildRangeExclusive(LLFolderViewItem* start, LLFolderViewItem* end, bool reverse, std::vector<LLFolderViewItem*>& items)
-{
- bool selecting = start == NULL;
- if (reverse)
- {
- for (items_t::reverse_iterator it = mItems.rbegin(), end_it = mItems.rend();
- it != end_it;
- ++it)
- {
- if (*it == end)
- {
- return;
- }
- if (selecting)
- {
- items.push_back(*it);
- }
-
- if (*it == start)
- {
- selecting = true;
- }
- }
- for (folders_t::reverse_iterator it = mFolders.rbegin(), end_it = mFolders.rend();
- it != end_it;
- ++it)
- {
- if (*it == end)
- {
- return;
- }
-
- if (selecting)
- {
- items.push_back(*it);
- }
-
- if (*it == start)
- {
- selecting = true;
- }
- }
- }
- else
- {
- for (folders_t::iterator it = mFolders.begin(), end_it = mFolders.end();
- it != end_it;
- ++it)
- {
- if (*it == end)
- {
- return;
- }
-
- if (selecting)
- {
- items.push_back(*it);
- }
-
- if (*it == start)
- {
- selecting = true;
- }
- }
- for (items_t::iterator it = mItems.begin(), end_it = mItems.end();
- it != end_it;
- ++it)
- {
- if (*it == end)
- {
- return;
- }
-
- if (selecting)
- {
- items.push_back(*it);
- }
-
- if (*it == start)
- {
- selecting = true;
- }
- }
- }
-}
-
-void LLFolderViewFolder::extendSelectionTo(LLFolderViewItem* new_selection)
-{
- if (getRoot()->getAllowMultiSelect() == FALSE) return;
-
- LLFolderViewItem* cur_selected_item = getRoot()->getCurSelectedItem();
- if (cur_selected_item == NULL)
- {
- cur_selected_item = new_selection;
- }
-
-
- bool reverse = false;
- LLFolderViewFolder* common_ancestor = getCommonAncestor(cur_selected_item, new_selection, reverse);
- if (!common_ancestor) return;
-
- LLFolderViewItem* last_selected_item_from_cur = cur_selected_item;
- LLFolderViewFolder* cur_folder = cur_selected_item->getParentFolder();
-
- std::vector<LLFolderViewItem*> items_to_select_forward;
-
- while(cur_folder != common_ancestor)
- {
- cur_folder->gatherChildRangeExclusive(last_selected_item_from_cur, NULL, reverse, items_to_select_forward);
-
- last_selected_item_from_cur = cur_folder;
- cur_folder = cur_folder->getParentFolder();
- }
-
- std::vector<LLFolderViewItem*> items_to_select_reverse;
-
- LLFolderViewItem* last_selected_item_from_new = new_selection;
- cur_folder = new_selection->getParentFolder();
- while(cur_folder != common_ancestor)
- {
- cur_folder->gatherChildRangeExclusive(last_selected_item_from_new, NULL, !reverse, items_to_select_reverse);
-
- last_selected_item_from_new = cur_folder;
- cur_folder = cur_folder->getParentFolder();
- }
-
- common_ancestor->gatherChildRangeExclusive(last_selected_item_from_cur, last_selected_item_from_new, reverse, items_to_select_forward);
-
- for (std::vector<LLFolderViewItem*>::reverse_iterator it = items_to_select_reverse.rbegin(), end_it = items_to_select_reverse.rend();
- it != end_it;
- ++it)
- {
- items_to_select_forward.push_back(*it);
- }
-
- LLFolderView* root = getRoot();
-
- for (std::vector<LLFolderViewItem*>::iterator it = items_to_select_forward.begin(), end_it = items_to_select_forward.end();
- it != end_it;
- ++it)
- {
- LLFolderViewItem* item = *it;
- if (item->isSelected())
- {
- root->removeFromSelectionList(item);
- }
- else
- {
- item->selectItem();
- }
- root->addToSelectionList(item);
- }
-
- if (new_selection->isSelected())
- {
- root->removeFromSelectionList(new_selection);
- }
- else
- {
- new_selection->selectItem();
- }
- root->addToSelectionList(new_selection);
-}
-
-
-void LLFolderViewFolder::destroyView()
-{
- for (items_t::iterator iter = mItems.begin();
- iter != mItems.end();)
- {
- items_t::iterator iit = iter++;
- LLFolderViewItem* item = (*iit);
- getRoot()->removeItemID(item->getListener()->getUUID());
- }
-
- std::for_each(mItems.begin(), mItems.end(), DeletePointer());
- mItems.clear();
-
- while (!mFolders.empty())
- {
- LLFolderViewFolder *folderp = mFolders.back();
- folderp->destroyView(); // removes entry from mFolders
- }
-
- //deleteAllChildren();
-
- if (mParentFolder)
- {
- mParentFolder->removeView(this);
- }
-}
-
-// remove the specified item (and any children) if possible. Return
-// TRUE if the item was deleted.
-BOOL LLFolderViewFolder::removeItem(LLFolderViewItem* item)
-{
- if(item->remove())
- {
- return TRUE;
- }
- return FALSE;
-}
-
-// simply remove the view (and any children) Don't bother telling the
-// listeners.
-void LLFolderViewFolder::removeView(LLFolderViewItem* item)
-{
- if (!item || item->getParentFolder() != this)
- {
- return;
- }
- // deselect without traversing hierarchy
- if (item->isSelected())
- {
- item->deselectItem();
- }
- getRoot()->removeFromSelectionList(item);
- extractItem(item);
- delete item;
-}
-
-// extractItem() removes the specified item from the folder, but
-// doesn't delete it.
-void LLFolderViewFolder::extractItem( LLFolderViewItem* item )
-{
- items_t::iterator it = std::find(mItems.begin(), mItems.end(), item);
- if(it == mItems.end())
- {
- // This is an evil downcast. However, it's only doing
- // pointer comparison to find if (which it should be ) the
- // item is in the container, so it's pretty safe.
- LLFolderViewFolder* f = static_cast<LLFolderViewFolder*>(item);
- folders_t::iterator ft;
- ft = std::find(mFolders.begin(), mFolders.end(), f);
- if (ft != mFolders.end())
- {
- mFolders.erase(ft);
- }
- }
- else
- {
- mItems.erase(it);
- }
- //item has been removed, need to update filter
- dirtyFilter();
- //because an item is going away regardless of filter status, force rearrange
- requestArrange();
- getRoot()->removeItemID(item->getListener()->getUUID());
- removeChild(item);
-}
-
-bool LLFolderViewFolder::isTrash() const
-{
- if (mAmTrash == LLFolderViewFolder::UNKNOWN)
- {
- mAmTrash = mListener->getUUID() == gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH, false) ? LLFolderViewFolder::TRASH : LLFolderViewFolder::NOT_TRASH;
- }
- return mAmTrash == LLFolderViewFolder::TRASH;
-}
-
-void LLFolderViewFolder::sortBy(U32 order)
-{
- if (!mSortFunction.updateSort(order))
- {
- // No changes.
- return;
- }
-
- // Propagate this change to sub folders
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
- {
- folders_t::iterator fit = iter++;
- (*fit)->sortBy(order);
- }
-
- // Don't sort the topmost folders (My Inventory and Library)
- if (mListener->getUUID().notNull())
- {
- mFolders.sort(mSortFunction);
- mItems.sort(mSortFunction);
- }
-
- if (order & LLInventoryFilter::SO_DATE)
- {
- time_t latest = 0;
-
- if (!mItems.empty())
- {
- LLFolderViewItem* item = *(mItems.begin());
- latest = item->getCreationDate();
- }
-
- if (!mFolders.empty())
- {
- LLFolderViewFolder* folder = *(mFolders.begin());
- if (folder->getCreationDate() > latest)
- {
- latest = folder->getCreationDate();
- }
- }
- mSubtreeCreationDate = latest;
- }
-}
-
-void LLFolderViewFolder::setItemSortOrder(U32 ordering)
-{
- if (mSortFunction.updateSort(ordering))
- {
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
- {
- folders_t::iterator fit = iter++;
- (*fit)->setItemSortOrder(ordering);
- }
-
- mFolders.sort(mSortFunction);
- mItems.sort(mSortFunction);
- }
-}
-
-EInventorySortGroup LLFolderViewFolder::getSortGroup() const
-{
- if (isTrash())
- {
- return SG_TRASH_FOLDER;
- }
-
- if( mListener )
- {
- if(LLFolderType::lookupIsProtectedType(mListener->getPreferredType()))
- {
- return SG_SYSTEM_FOLDER;
- }
- }
-
- return SG_NORMAL_FOLDER;
-}
-
-BOOL LLFolderViewFolder::isMovable()
-{
- if( mListener )
- {
- if( !(mListener->isItemMovable()) )
- {
- return FALSE;
- }
-
- for (items_t::iterator iter = mItems.begin();
- iter != mItems.end();)
- {
- items_t::iterator iit = iter++;
- if(!(*iit)->isMovable())
- {
- return FALSE;
- }
- }
-
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
- {
- folders_t::iterator fit = iter++;
- if(!(*fit)->isMovable())
- {
- return FALSE;
- }
- }
- }
- return TRUE;
-}
-
-
-BOOL LLFolderViewFolder::isRemovable()
-{
- if( mListener )
- {
- if( !(mListener->isItemRemovable()) )
- {
- return FALSE;
- }
-
- for (items_t::iterator iter = mItems.begin();
- iter != mItems.end();)
- {
- items_t::iterator iit = iter++;
- if(!(*iit)->isRemovable())
- {
- return FALSE;
- }
- }
-
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
- {
- folders_t::iterator fit = iter++;
- if(!(*fit)->isRemovable())
- {
- return FALSE;
- }
- }
- }
- return TRUE;
-}
-
-// this is an internal method used for adding items to folders.
-BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item)
-{
- mItems.push_back(item);
-
- item->setRect(LLRect(0, 0, getRect().getWidth(), 0));
- item->setVisible(FALSE);
-
- addChild(item);
-
- item->dirtyFilter();
-
- // Update the folder creation date if the child is newer than our current date
- setCreationDate(llmax<time_t>(mCreationDate, item->getCreationDate()));
-
- // Handle sorting
- requestArrange();
- requestSort();
-
- // Traverse parent folders and update creation date and resort, if necessary
- LLFolderViewFolder* parentp = getParentFolder();
- while (parentp)
- {
- // Update the folder creation date if the child is newer than our current date
- parentp->setCreationDate(llmax<time_t>(parentp->mCreationDate, item->getCreationDate()));
-
- if (parentp->mSortFunction.isByDate())
- {
- // parent folder doesn't have a time stamp yet, so get it from us
- parentp->requestSort();
- }
-
- parentp = parentp->getParentFolder();
- }
-
- return TRUE;
-}
-
-// this is an internal method used for adding items to folders.
-BOOL LLFolderViewFolder::addFolder(LLFolderViewFolder* folder)
-{
- mFolders.push_back(folder);
- folder->setOrigin(0, 0);
- folder->reshape(getRect().getWidth(), 0);
- folder->setVisible(FALSE);
- addChild( folder );
- folder->dirtyFilter();
- // rearrange all descendants too, as our indentation level might have changed
- folder->requestArrange(TRUE);
- requestSort();
- LLFolderViewFolder* parentp = getParentFolder();
- while (parentp && !parentp->mSortFunction.isByDate())
- {
- // parent folder doesn't have a time stamp yet, so get it from us
- parentp->requestSort();
- parentp = parentp->getParentFolder();
- }
- return TRUE;
-}
-
-void LLFolderViewFolder::requestArrange(BOOL include_descendants)
-{
- mLastArrangeGeneration = -1;
- // flag all items up to root
- if (mParentFolder)
- {
- mParentFolder->requestArrange();
- }
-
- if (include_descendants)
- {
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();
- ++iter)
- {
- (*iter)->requestArrange(TRUE);
- }
- }
-}
-
-void LLFolderViewFolder::toggleOpen()
-{
- setOpen(!mIsOpen);
-}
-
-// Force a folder open or closed
-void LLFolderViewFolder::setOpen(BOOL openitem)
-{
- setOpenArrangeRecursively(openitem);
-}
-
-void LLFolderViewFolder::setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse)
-{
- BOOL was_open = mIsOpen;
- mIsOpen = openitem;
- if (mListener)
- {
- if(!was_open && openitem)
- {
- mListener->openItem();
- }
- else if(was_open && !openitem)
- {
- mListener->closeItem();
- }
- }
-
- if (recurse == RECURSE_DOWN || recurse == RECURSE_UP_DOWN)
- {
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
- {
- folders_t::iterator fit = iter++;
- (*fit)->setOpenArrangeRecursively(openitem, RECURSE_DOWN); /* Flawfinder: ignore */
- }
- }
- if (mParentFolder
- && (recurse == RECURSE_UP
- || recurse == RECURSE_UP_DOWN))
- {
- mParentFolder->setOpenArrangeRecursively(openitem, RECURSE_UP);
- }
-
- if (was_open != mIsOpen)
- {
- requestArrange();
- }
-}
-
-BOOL LLFolderViewFolder::handleDragAndDropFromChild(MASK mask,
- BOOL drop,
- EDragAndDropType c_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg)
-{
- BOOL accepted = mListener && mListener->dragOrDrop(mask,drop,c_type,cargo_data, tooltip_msg);
- if (accepted)
- {
- mDragAndDropTarget = TRUE;
- *accept = ACCEPT_YES_MULTI;
- }
- else
- {
- *accept = ACCEPT_NO;
- }
-
- // drag and drop to child item, so clear pending auto-opens
- getRoot()->autoOpenTest(NULL);
-
- return TRUE;
-}
-
-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);
-
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
- {
- folders_t::iterator fit = iter++;
- (*fit)->applyFunctorRecursively(functor);
- }
- for (items_t::iterator iter = mItems.begin();
- iter != mItems.end();)
- {
- items_t::iterator iit = iter++;
- functor.doItem((*iit));
- }
-}
-
-void LLFolderViewFolder::applyListenerFunctorRecursively(LLFolderViewListenerFunctor& functor)
-{
- functor(mListener);
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
- {
- folders_t::iterator fit = iter++;
- (*fit)->applyListenerFunctorRecursively(functor);
- }
- for (items_t::iterator iter = mItems.begin();
- iter != mItems.end();)
- {
- items_t::iterator iit = iter++;
- (*iit)->applyListenerFunctorRecursively(functor);
- }
-}
-
-// LLView functionality
-BOOL LLFolderViewFolder::handleDragAndDrop(S32 x, S32 y, MASK mask,
- BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg)
-{
- BOOL handled = FALSE;
-
- if (mIsOpen)
- {
- handled = (childrenHandleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg) != NULL);
- }
-
- if (!handled)
- {
- handleDragAndDropToThisFolder(mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
-
- lldebugst(LLERR_USER_INPUT) << "dragAndDrop handled by LLFolderViewFolder" << llendl;
- }
-
- return TRUE;
-}
-
-BOOL LLFolderViewFolder::handleDragAndDropToThisFolder(MASK mask,
- BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg)
-{
- BOOL accepted = mListener && mListener->dragOrDrop(mask, drop, cargo_type, cargo_data, tooltip_msg);
-
- if (accepted)
- {
- mDragAndDropTarget = TRUE;
- *accept = ACCEPT_YES_MULTI;
- }
- else
- {
- *accept = ACCEPT_NO;
- }
-
- if (!drop && accepted)
- {
- getRoot()->autoOpenTest(this);
- }
-
- return TRUE;
-}
-
-
-BOOL LLFolderViewFolder::handleRightMouseDown( S32 x, S32 y, MASK mask )
-{
- BOOL handled = FALSE;
- // fetch contents of this folder, as context menu can depend on contents
- // still, user would have to open context menu again to see the changes
- gInventory.fetchDescendentsOf(mListener->getUUID());
-
- if( mIsOpen )
- {
- handled = childrenHandleRightMouseDown( x, y, mask ) != NULL;
- }
- if (!handled)
- {
- handled = LLFolderViewItem::handleRightMouseDown( x, y, mask );
- }
- return handled;
-}
-
-
-BOOL LLFolderViewFolder::handleHover(S32 x, S32 y, MASK mask)
-{
- mIsMouseOverTitle = (y > (getRect().getHeight() - mItemHeight));
-
- BOOL handled = LLView::handleHover(x, y, mask);
-
- if (!handled)
- {
- // this doesn't do child processing
- handled = LLFolderViewItem::handleHover(x, y, mask);
- }
-
- return handled;
-}
-
-BOOL LLFolderViewFolder::handleMouseDown( S32 x, S32 y, MASK mask )
-{
- BOOL handled = FALSE;
- if( mIsOpen )
- {
- handled = childrenHandleMouseDown(x,y,mask) != NULL;
- }
- if( !handled )
- {
- if(mIndentation < x && x < mIndentation + ARROW_SIZE + TEXT_PAD)
- {
- toggleOpen();
- handled = TRUE;
- }
- else
- {
- // do normal selection logic
- handled = LLFolderViewItem::handleMouseDown(x, y, mask);
- }
- }
-
- return handled;
-}
-
-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() == LLFolderType::FT_OUTFIT)
- {
- getListener()->performAction(NULL, NULL,"replaceoutfit");
- return TRUE;
- }
- */
-
- BOOL handled = FALSE;
- if( mIsOpen )
- {
- handled = childrenHandleDoubleClick( x, y, mask ) != NULL;
- }
- if( !handled )
- {
- 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
- toggleOpen();
- }
- else
- {
- setSelectionFromRoot(this, FALSE);
- toggleOpen();
- }
- handled = TRUE;
- }
- return handled;
-}
-
-void LLFolderViewFolder::draw()
-{
- if (mAutoOpenCountdown != 0.f)
- {
- mControlLabelRotation = mAutoOpenCountdown * -90.f;
- }
- else if (mIsOpen)
- {
- mControlLabelRotation = lerp(mControlLabelRotation, -90.f, LLCriticalDamp::getInterpolant(0.04f));
- }
- else
- {
- mControlLabelRotation = lerp(mControlLabelRotation, 0.f, LLCriticalDamp::getInterpolant(0.025f));
- }
-
- bool possibly_has_children = false;
- bool up_to_date = mListener && mListener->isUpToDate();
- if(!up_to_date
- && mListener->hasChildren()) // we know we have children but haven't fetched them (doesn't obey filter)
- {
- possibly_has_children = true;
- }
-
-
- BOOL loading = (mIsOpen
- && possibly_has_children
- && !up_to_date );
-
- if ( loading && !mIsLoading )
- {
- // Measure how long we've been in the loading state
- mTimeSinceRequestStart.reset();
- }
-
- mIsLoading = loading;
-
- LLFolderViewItem::draw();
-
- // draw children if root folder, or any other folder that is open or animating to closed state
- if( getRoot() == this || (mIsOpen || mCurHeight != mTargetHeight ))
- {
- LLView::draw();
- }
-
- mExpanderHighlighted = FALSE;
-}
-
-time_t LLFolderViewFolder::getCreationDate() const
-{
- return llmax<time_t>(mCreationDate, mSubtreeCreationDate);
-}
-
-
-BOOL LLFolderViewFolder::potentiallyVisible()
-{
- // folder should be visible by it's own filter status
- return LLFolderViewItem::potentiallyVisible()
- // or one or more of its descendants have passed the minimum filter requirement
- || hasFilteredDescendants(getRoot()->getFilter()->getMinRequiredGeneration())
- // or not all of its descendants have been checked against minimum filter requirement
- || getCompletedFilterGeneration() < getRoot()->getFilter()->getMinRequiredGeneration();
-}
-
-// this does prefix traversal, as folders are listed above their contents
-LLFolderViewItem* LLFolderViewFolder::getNextFromChild( LLFolderViewItem* item, BOOL include_children )
-{
- BOOL found_item = FALSE;
-
- LLFolderViewItem* result = NULL;
- // when not starting from a given item, start at beginning
- if(item == NULL)
- {
- found_item = TRUE;
- }
-
- // find current item among children
- folders_t::iterator fit = mFolders.begin();
- folders_t::iterator fend = mFolders.end();
-
- items_t::iterator iit = mItems.begin();
- items_t::iterator iend = mItems.end();
-
- // if not trivially starting at the beginning, we have to find the current item
- if (!found_item)
- {
- // first, look among folders, since they are always above items
- for(; fit != fend; ++fit)
- {
- if(item == (*fit))
- {
- found_item = TRUE;
- // if we are on downwards traversal
- if (include_children && (*fit)->isOpen())
- {
- // look for first descendant
- return (*fit)->getNextFromChild(NULL, TRUE);
- }
- // otherwise advance to next folder
- ++fit;
- include_children = TRUE;
- break;
- }
- }
-
- // didn't find in folders? Check items...
- if (!found_item)
- {
- for(; iit != iend; ++iit)
- {
- if(item == (*iit))
- {
- found_item = TRUE;
- // point to next item
- ++iit;
- break;
- }
- }
- }
- }
-
- if (!found_item)
- {
- // you should never call this method with an item that isn't a child
- // so we should always find something
- llassert(FALSE);
- return NULL;
- }
-
- // at this point, either iit or fit point to a candidate "next" item
- // if both are out of range, we need to punt up to our parent
-
- // now, starting from found folder, continue through folders
- // searching for next visible folder
- while(fit != fend && !(*fit)->getVisible())
- {
- // turn on downwards traversal for next folder
- ++fit;
- }
-
- if (fit != fend)
- {
- result = (*fit);
- }
- else
- {
- // otherwise, scan for next visible item
- while(iit != iend && !(*iit)->getVisible())
- {
- ++iit;
- }
-
- // check to see if we have a valid item
- if (iit != iend)
- {
- result = (*iit);
- }
- }
-
- if( !result && mParentFolder )
- {
- // If there are no siblings or children to go to, recurse up one level in the tree
- // and skip children for this folder, as we've already discounted them
- result = mParentFolder->getNextFromChild(this, FALSE);
- }
-
- return result;
-}
-
-// this does postfix traversal, as folders are listed above their contents
-LLFolderViewItem* LLFolderViewFolder::getPreviousFromChild( LLFolderViewItem* item, BOOL include_children )
-{
- BOOL found_item = FALSE;
-
- LLFolderViewItem* result = NULL;
- // when not starting from a given item, start at end
- if(item == NULL)
- {
- found_item = TRUE;
- }
-
- // find current item among children
- folders_t::reverse_iterator fit = mFolders.rbegin();
- folders_t::reverse_iterator fend = mFolders.rend();
-
- items_t::reverse_iterator iit = mItems.rbegin();
- items_t::reverse_iterator iend = mItems.rend();
-
- // if not trivially starting at the end, we have to find the current item
- if (!found_item)
- {
- // first, look among items, since they are always below the folders
- for(; iit != iend; ++iit)
- {
- if(item == (*iit))
- {
- found_item = TRUE;
- // point to next item
- ++iit;
- break;
- }
- }
-
- // didn't find in items? Check folders...
- if (!found_item)
- {
- for(; fit != fend; ++fit)
- {
- if(item == (*fit))
- {
- found_item = TRUE;
- // point to next folder
- ++fit;
- break;
- }
- }
- }
- }
-
- if (!found_item)
- {
- // you should never call this method with an item that isn't a child
- // so we should always find something
- llassert(FALSE);
- return NULL;
- }
-
- // at this point, either iit or fit point to a candidate "next" item
- // if both are out of range, we need to punt up to our parent
-
- // now, starting from found item, continue through items
- // searching for next visible item
- while(iit != iend && !(*iit)->getVisible())
- {
- ++iit;
- }
-
- if (iit != iend)
- {
- // we found an appropriate item
- result = (*iit);
- }
- else
- {
- // otherwise, scan for next visible folder
- while(fit != fend && !(*fit)->getVisible())
- {
- ++fit;
- }
-
- // check to see if we have a valid folder
- if (fit != fend)
- {
- // try selecting child element of this folder
- if ((*fit)->isOpen())
- {
- result = (*fit)->getPreviousFromChild(NULL);
- }
- else
- {
- result = (*fit);
- }
- }
- }
-
- if( !result )
- {
- // If there are no siblings or children to go to, recurse up one level in the tree
- // which gets back to this folder, which will only be visited if it is a valid, visible item
- result = this;
- }
-
- return result;
-}
-
-
-bool LLInventorySort::updateSort(U32 order)
-{
- if (order != mSortOrder)
- {
- mSortOrder = order;
- mByDate = (order & LLInventoryFilter::SO_DATE);
- mSystemToTop = (order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP);
- mFoldersByName = (order & LLInventoryFilter::SO_FOLDERS_BY_NAME);
- return true;
- }
- return false;
-}
-
-bool LLInventorySort::operator()(const LLFolderViewItem* const& a, const LLFolderViewItem* const& b)
-{
- // ignore sort order for landmarks in the Favorites folder.
- // they should be always sorted as in Favorites bar. See EXT-719
- if (a->getSortGroup() == SG_ITEM
- && b->getSortGroup() == SG_ITEM
- && a->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK
- && b->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK)
- {
-
- 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))
- {
- // *TODO: mantipov: probably it is better to add an appropriate method to LLFolderViewItem
- // or to LLInvFVBridge
- 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;
- }
- }
-
- // We sort by name if we aren't sorting by date
- // OR if these are folders and we are sorting folders by name.
- bool by_name = (!mByDate
- || (mFoldersByName
- && (a->getSortGroup() != SG_ITEM)));
-
- if (a->getSortGroup() != b->getSortGroup())
- {
- if (mSystemToTop)
- {
- // Group order is System Folders, Trash, Normal Folders, Items
- return (a->getSortGroup() < b->getSortGroup());
- }
- else if (mByDate)
- {
- // Trash needs to go to the bottom if we are sorting by date
- if ( (a->getSortGroup() == SG_TRASH_FOLDER)
- || (b->getSortGroup() == SG_TRASH_FOLDER))
- {
- return (b->getSortGroup() == SG_TRASH_FOLDER);
- }
- }
- }
-
- if (by_name)
- {
- S32 compare = LLStringUtil::compareDict(a->getLabel(), b->getLabel());
- if (0 == compare)
- {
- return (a->getCreationDate() > b->getCreationDate());
- }
- else
- {
- return (compare < 0);
- }
- }
- else
- {
- // BUG: This is very very slow. The getCreationDate() is log n in number
- // of inventory items.
- time_t first_create = a->getCreationDate();
- time_t second_create = b->getCreationDate();
- if (first_create == second_create)
- {
- return (LLStringUtil::compareDict(a->getLabel(), b->getLabel()) < 0);
- }
- else
- {
- return (first_create > second_create);
- }
- }
-}
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
deleted file mode 100644
index 577b6b54a2..0000000000
--- a/indra/newview/llfolderviewitem.h
+++ /dev/null
@@ -1,577 +0,0 @@
-/**
-* @file llfolderviewitem.h
-* @brief Items and folders that can appear in a hierarchical folder view
-*
-* $LicenseInfo:firstyear=2001&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2010, Linden Research, Inc.
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation;
-* version 2.1 of the License only.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*
-* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-* $/LicenseInfo$
-*/
-#ifndef LLFOLDERVIEWITEM_H
-#define LLFOLDERVIEWITEM_H
-
-#include "llview.h"
-#include "lldarray.h" // *TODO: Eliminate, forward declare
-#include "lluiimage.h"
-
-class LLFontGL;
-class LLFolderView;
-class LLFolderViewEventListener;
-class LLFolderViewFolder;
-class LLFolderViewFunctor;
-class LLFolderViewItem;
-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.
-enum EInventorySortGroup
-{
- SG_SYSTEM_FOLDER,
- SG_TRASH_FOLDER,
- SG_NORMAL_FOLDER,
- SG_ITEM
-};
-
-// *TODO: do we really need one sort object per folder?
-// can we just have one of these per LLFolderView ?
-class LLInventorySort
-{
-public:
- LLInventorySort()
- : mSortOrder(0),
- mByDate(false),
- mSystemToTop(false),
- mFoldersByName(false) { }
-
- // Returns true if order has changed
- bool updateSort(U32 order);
- U32 getSort() { return mSortOrder; }
- bool isByDate() { return mByDate; }
-
- bool operator()(const LLFolderViewItem* const& a, const LLFolderViewItem* const& b);
-private:
- U32 mSortOrder;
- bool mByDate;
- bool mSystemToTop;
- bool mFoldersByName;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLFolderViewItem
-//
-// An instance of this class represents a single item in a folder view
-// such as an inventory item or a file.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLFolderViewItem : public LLView
-{
-public:
- static void initClass();
- static void cleanupClass();
-
- struct Params : public LLInitParam::Block<Params, LLView::Params>
- {
- Optional<LLUIImage*> icon;
- Optional<LLUIImage*> icon_open; // used for folders
- Optional<LLUIImage*> icon_overlay; // for links
- Optional<LLFolderView*> root;
- Mandatory<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
-
- Params();
- };
-
- // layout constants
- static const S32 LEFT_PAD = 5;
- // 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;
- static const S32 TEXT_PAD_RIGHT = 4;
- static const S32 ARROW_SIZE = 12;
- static const S32 MAX_FOLDER_ITEM_OVERLAP = 2;
- // animation parameters
- 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; }
-
- BOOL isLoading() const { return mIsLoading; }
-
-private:
- BOOL mIsSelected;
-
-protected:
- friend class LLUICtrlFactory;
- friend class LLFolderViewEventListener;
-
- LLFolderViewItem(const Params& p);
-
- std::string mLabel;
- std::string mSearchableLabel;
- S32 mLabelWidth;
- bool mLabelWidthDirty;
- time_t mCreationDate;
- LLFolderViewFolder* mParentFolder;
- LLFolderViewEventListener* mListener;
- BOOL mIsCurSelection;
- BOOL mSelectPending;
- LLFontGL::StyleFlags mLabelStyle;
- std::string mLabelSuffix;
- LLUIImagePtr mIcon;
- std::string mStatusText;
- LLUIImagePtr mIconOpen;
- LLUIImagePtr mIconOverlay;
- BOOL mHasVisibleChildren;
- S32 mIndentation;
- S32 mItemHeight;
- BOOL mPassedFilter;
- S32 mLastFilterGeneration;
- std::string::size_type mStringMatchOffset;
- F32 mControlLabelRotation;
- LLFolderView* mRoot;
- BOOL mDragAndDropTarget;
- BOOL mIsLoading;
- LLTimer mTimeSinceRequestStart;
- bool mShowLoadStatus;
- bool mIsMouseOverTitle;
-
- // helper function to change the selection from the root.
- void changeSelectionFromRoot(LLFolderViewItem* selection, BOOL selected);
-
- // this is an internal method used for adding items to folders. A
- // no-op at this level, but reimplemented in derived classes.
- virtual BOOL addItem(LLFolderViewItem*) { return FALSE; }
- virtual BOOL addFolder(LLFolderViewFolder*) { return FALSE; }
-
- static LLFontGL* getLabelFontForStyle(U8 style);
-
- virtual void setCreationDate(time_t creation_date_utc) { mCreationDate = creation_date_utc; }
-
-public:
- BOOL postBuild();
-
- // This function clears the currently selected item, and records
- // the specified selected item appropriately for display and use
- // in the UI. If open is TRUE, then folders are opened up along
- // the way to the selection.
- void setSelectionFromRoot(LLFolderViewItem* selection, BOOL openitem,
- BOOL take_keyboard_focus = TRUE);
-
- // This function is called when the folder view is dirty. It's
- // implemented here but called by derived classes when folding the
- // views.
- void arrangeFromRoot();
- void filterFromRoot( void );
-
- void arrangeAndSet(BOOL set_selection, BOOL take_keyboard_focus);
-
- virtual ~LLFolderViewItem( void );
-
- // addToFolder() returns TRUE if it succeeds. FALSE otherwise
- enum { ARRANGE = TRUE, DO_NOT_ARRANGE = FALSE };
- virtual BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root);
-
- virtual EInventorySortGroup getSortGroup() const;
-
- // Finds width and height of this object and it's children. Also
- // 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();
-
- // applies filters to control visibility of inventory items
- virtual void filter( LLInventoryFilter& filter);
-
- // updates filter serial number and optionally propagated value up to root
- S32 getLastFilterGeneration() { return mLastFilterGeneration; }
-
- virtual void dirtyFilter();
-
- // If 'selection' is 'this' then note that otherwise ignore.
- // Returns TRUE if this item ends up being selected.
- virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus);
-
- // This method is used to set the selection state of an item.
- // If 'selection' is 'this' then note selection.
- // Returns TRUE if the selection state of this item was changed.
- virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
-
- // this method is used to deselect this element
- void deselectItem();
-
- // this method is used to select this element
- virtual void selectItem();
-
- // gets multiple-element selection
- virtual std::set<LLUUID> getSelectionList() const;
-
- // Returns true is this object and all of its children can be removed (deleted by user)
- virtual BOOL isRemovable();
-
- // Returns true is this object and all of its children can be moved
- virtual BOOL isMovable();
-
- // destroys this item recursively
- virtual void destroyView();
-
- BOOL isSelected() const { return mIsSelected; }
- bool isInSelection() const;
-
- void setUnselected() { mIsSelected = FALSE; }
-
- void setIsCurSelection(BOOL select) { mIsCurSelection = select; }
-
- 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.
- //virtual BOOL removeRecursively(BOOL single_item);
- BOOL remove();
-
- // Build an appropriate context menu for the item. Flags unused.
- void buildContextMenu(LLMenuGL& menu, U32 flags);
-
- // This method returns the actual name of the thing being
- // viewed. This method will ask the viewed object itself.
- const std::string& getName( void ) const;
-
- const std::string& getSearchableLabel( void ) const;
-
- // This method returns the label displayed on the view. This
- // method was primarily added to allow sorting on the folder
- // contents possible before the entire view has been constructed.
- const std::string& getLabel() const { return mLabel; }
-
- // Used for sorting, like getLabel() above.
- virtual time_t getCreationDate() const { return mCreationDate; }
-
- LLFolderViewFolder* getParentFolder( void ) { return mParentFolder; }
- const LLFolderViewFolder* getParentFolder( void ) const { return mParentFolder; }
-
- LLFolderViewItem* getNextOpenNode( BOOL include_children = TRUE );
- LLFolderViewItem* getPreviousOpenNode( BOOL include_children = TRUE );
-
- 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);
-
- // open
- virtual void openItem( void );
- virtual void preview(void);
-
- // Show children (unfortunate that this is called "open")
- virtual void setOpen(BOOL open = TRUE) {};
-
- virtual BOOL isOpen() const { return FALSE; }
-
- virtual LLFolderView* getRoot();
- BOOL isDescendantOf( const LLFolderViewFolder* potential_ancestor );
- S32 getIndentation() { return mIndentation; }
-
- virtual BOOL potentiallyVisible(); // do we know for a fact that this item won't be displayed?
- virtual BOOL potentiallyFiltered(); // do we know for a fact that this item has been filtered out?
-
- virtual BOOL getFiltered();
- virtual BOOL getFiltered(S32 filter_generation);
- virtual void setFiltered(BOOL filtered, S32 filter_generation);
-
- // change the icon
- void setIcon(LLUIImagePtr icon);
-
- // refresh information from the object being viewed.
- void refreshFromListener();
- virtual void refresh();
-
- virtual void applyListenerFunctorRecursively(LLFolderViewListenerFunctor& functor);
-
- // LLView functionality
- virtual BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
- virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask );
- 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 void onMouseLeave(S32 x, S32 y, MASK mask);
-
- virtual LLView* findChildView(const std::string& name, BOOL recurse) const { return NULL; }
-
- // virtual void handleDropped();
- virtual void draw();
- virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg);
-
-private:
- static std::map<U8, LLFontGL*> sFonts; // map of styles to fonts
-};
-
-
-// function used for sorting.
-typedef bool (*sort_order_f)(LLFolderViewItem* a, LLFolderViewItem* b);
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLFolderViewFolder
-//
-// 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.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLFolderViewFolder : public LLFolderViewItem
-{
-protected:
- LLFolderViewFolder( const LLFolderViewItem::Params& );
- friend class LLUICtrlFactory;
-
-public:
- typedef enum e_trash
- {
- UNKNOWN, TRASH, NOT_TRASH
- } ETrash;
-
- typedef std::list<LLFolderViewItem*> items_t;
- typedef std::list<LLFolderViewFolder*> folders_t;
-
-protected:
- items_t mItems;
- folders_t mFolders;
- LLInventorySort mSortFunction;
-
- BOOL mIsOpen;
- BOOL mExpanderHighlighted;
- F32 mCurHeight;
- F32 mTargetHeight;
- F32 mAutoOpenCountdown;
- time_t mSubtreeCreationDate;
- mutable ETrash mAmTrash;
- S32 mLastArrangeGeneration;
- S32 mLastCalculatedWidth;
- S32 mCompletedFilterGeneration;
- S32 mMostFilteredDescendantGeneration;
- bool mNeedsSort;
- bool mPassedFolderFilter;
-
-public:
- typedef enum e_recurse_type
- {
- RECURSE_NO,
- RECURSE_UP,
- RECURSE_DOWN,
- RECURSE_UP_DOWN
- } ERecurseType;
-
-
- virtual ~LLFolderViewFolder( void );
-
- virtual BOOL potentiallyVisible();
-
- LLFolderViewItem* getNextFromChild( LLFolderViewItem*, BOOL include_children = TRUE );
- LLFolderViewItem* getPreviousFromChild( LLFolderViewItem*, BOOL include_children = TRUE );
-
- // addToFolder() returns TRUE if it succeeds. FALSE otherwise
- virtual BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root);
-
- // Finds width and height of this object and it's children. Also
- // makes sure that this view and it's children are the right size.
- virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
-
- BOOL needsArrange();
- void requestSort();
-
- // Returns the sort group (system, trash, folder) for this folder.
- virtual EInventorySortGroup getSortGroup() const;
-
- virtual void setCompletedFilterGeneration(S32 generation, BOOL recurse_up);
- virtual S32 getCompletedFilterGeneration() { return mCompletedFilterGeneration; }
-
- BOOL hasFilteredDescendants(S32 filter_generation);
- BOOL hasFilteredDescendants();
-
- // applies filters to control visibility of inventory items
- virtual void filter( LLInventoryFilter& filter);
- virtual void setFiltered(BOOL filtered, S32 filter_generation);
- virtual BOOL getFiltered();
- virtual BOOL getFiltered(S32 filter_generation);
-
- virtual void dirtyFilter();
-
- // folder-specific filtering (filter status propagates top down instead of bottom up)
- void filterFolder(LLInventoryFilter& filter);
- void setFilteredFolder(bool filtered, S32 filter_generation);
- bool getFilteredFolder(S32 filter_generation);
-
- // Passes selection information on to children and record
- // selection information if necessary.
- // Returns TRUE if this object (or a child) ends up being selected.
- // If 'openitem' is TRUE then folders are opened up along the way to the selection.
- virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus);
-
- // This method is used to change the selection of an item.
- // Recursively traverse all children; if 'selection' is 'this' then change
- // the select status if necessary.
- // Returns TRUE if the selection state of this folder, or of a child, was changed.
- virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
-
- // this method is used to group select items
- void extendSelectionTo(LLFolderViewItem* selection);
-
- // Returns true is this object and all of its children can be removed.
- virtual BOOL isRemovable();
-
- // Returns true is this object and all of its children can be moved
- virtual BOOL isMovable();
-
- // destroys this folder, and all children
- virtual void destroyView();
-
- // If this folder can be removed, remove all children that can be
- // removed, return TRUE if this is empty after the operation and
- // it's viewed folder object can be removed.
- //virtual BOOL removeRecursively(BOOL single_item);
- //virtual BOOL remove();
-
- // remove the specified item (and any children) if
- // possible. Return TRUE if the item was deleted.
- BOOL removeItem(LLFolderViewItem* item);
-
- // simply remove the view (and any children) Don't bother telling
- // the listeners.
- void removeView(LLFolderViewItem* item);
-
- // extractItem() removes the specified item from the folder, but
- // doesn't delete it.
- void extractItem( LLFolderViewItem* item );
-
- // This function is called by a child that needs to be resorted.
- void resort(LLFolderViewItem* item);
-
- void setItemSortOrder(U32 ordering);
- void sortBy(U32);
- //BOOL (*func)(LLFolderViewItem* a, LLFolderViewItem* b));
-
- void setAutoOpenCountdown(F32 countdown) { mAutoOpenCountdown = countdown; }
-
- // folders can be opened. This will usually be called by internal
- // methods.
- virtual void toggleOpen();
-
- // Force a folder open or closed
- virtual void setOpen(BOOL openitem = TRUE);
-
- // Called when a child is refreshed.
- // don't rearrange child folder contents unless explicitly requested
- virtual void requestArrange(BOOL include_descendants = FALSE);
-
- // internal method which doesn't update the entire view. This
- // method was written because the list iterators destroy the state
- // of other iterations, thus, we can't arrange while iterating
- // through the children (such as when setting which is selected.
- virtual void setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse = RECURSE_NO);
-
- // Get the current state of the folder.
- virtual BOOL isOpen() const { return mIsOpen; }
-
- // special case if an object is dropped on the child.
- BOOL handleDragAndDropFromChild(MASK mask,
- BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg);
-
- 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);
-
- // LLView functionality
- virtual BOOL handleHover(S32 x, S32 y, MASK mask);
- virtual BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
- virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask );
- virtual BOOL handleDoubleClick( S32 x, S32 y, 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);
- BOOL handleDragAndDropToThisFolder(MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg);
- virtual void draw();
-
- time_t getCreationDate() const;
- bool isTrash() const;
-
- folders_t::const_iterator getFoldersBegin() const { return mFolders.begin(); }
- folders_t::const_iterator getFoldersEnd() const { return mFolders.end(); }
- folders_t::size_type getFoldersCount() const { return mFolders.size(); }
-
- items_t::const_iterator getItemsBegin() const { return mItems.begin(); }
- items_t::const_iterator getItemsEnd() const { return mItems.end(); }
- items_t::size_type getItemsCount() const { return mItems.size(); }
- LLFolderViewFolder* getCommonAncestor(LLFolderViewItem* item_a, LLFolderViewItem* item_b, bool& reverse);
- void gatherChildRangeExclusive(LLFolderViewItem* start, LLFolderViewItem* end, bool reverse, std::vector<LLFolderViewItem*>& items);
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLFolderViewListenerFunctor
-//
-// This simple abstract base class can be used to applied to all
-// listeners in a hierarchy.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLFolderViewListenerFunctor
-{
-public:
- virtual ~LLFolderViewListenerFunctor() {}
- virtual void operator()(LLFolderViewEventListener* listener) = 0;
-};
-
-#endif // LLFOLDERVIEWITEM_H
diff --git a/indra/newview/llfolderviewmodelinventory.cpp b/indra/newview/llfolderviewmodelinventory.cpp
new file mode 100644
index 0000000000..586965e5a0
--- /dev/null
+++ b/indra/newview/llfolderviewmodelinventory.cpp
@@ -0,0 +1,314 @@
+/*
+ * @file llfolderviewmodelinventory.cpp
+ * @brief Implementation of the inventory-specific view model
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llfolderviewmodelinventory.h"
+#include "llinventorymodelbackgroundfetch.h"
+#include "llinventorypanel.h"
+#include "lltooldraganddrop.h"
+#include "llfavoritesbar.h"
+
+//
+// class LLFolderViewModelInventory
+//
+static LLFastTimer::DeclareTimer FTM_INVENTORY_SORT("Sort");
+
+bool LLFolderViewModelInventory::startDrag(std::vector<LLFolderViewModelItem*>& items)
+{
+ std::vector<EDragAndDropType> types;
+ uuid_vec_t cargo_ids;
+ std::vector<LLFolderViewModelItem*>::iterator item_it;
+ bool can_drag = true;
+ if (!items.empty())
+ {
+ for (item_it = items.begin(); item_it != items.end(); ++item_it)
+ {
+ EDragAndDropType type = DAD_NONE;
+ LLUUID id = LLUUID::null;
+ can_drag = can_drag && static_cast<LLFolderViewModelItemInventory*>(*item_it)->startDrag(&type, &id);
+
+ types.push_back(type);
+ cargo_ids.push_back(id);
+ }
+
+ LLToolDragAndDrop::getInstance()->beginMultiDrag(types, cargo_ids,
+ static_cast<LLFolderViewModelItemInventory*>(items.front())->getDragSource(), mTaskID);
+ }
+ return can_drag;
+}
+
+
+void LLFolderViewModelInventory::sort( LLFolderViewFolder* folder )
+{
+ LLFastTimer _(FTM_INVENTORY_SORT);
+
+ if (!needsSort(folder->getViewModelItem())) return;
+
+ LLFolderViewModelItemInventory* modelp = static_cast<LLFolderViewModelItemInventory*>(folder->getViewModelItem());
+ if (modelp->getUUID().isNull()) return;
+
+ for (std::list<LLFolderViewFolder*>::iterator it = folder->getFoldersBegin(), end_it = folder->getFoldersEnd();
+ it != end_it;
+ ++it)
+ {
+ LLFolderViewFolder* child_folderp = *it;
+ sort(child_folderp);
+
+ if (child_folderp->getFoldersCount() > 0)
+ {
+ time_t most_recent_folder_time =
+ static_cast<LLFolderViewModelItemInventory*>((*child_folderp->getFoldersBegin())->getViewModelItem())->getCreationDate();
+ LLFolderViewModelItemInventory* modelp = static_cast<LLFolderViewModelItemInventory*>(child_folderp->getViewModelItem());
+ if (most_recent_folder_time > modelp->getCreationDate())
+ {
+ modelp->setCreationDate(most_recent_folder_time);
+ }
+ }
+ if (child_folderp->getItemsCount() > 0)
+ {
+ time_t most_recent_item_time =
+ static_cast<LLFolderViewModelItemInventory*>((*child_folderp->getItemsBegin())->getViewModelItem())->getCreationDate();
+
+ LLFolderViewModelItemInventory* modelp = static_cast<LLFolderViewModelItemInventory*>(child_folderp->getViewModelItem());
+ if (most_recent_item_time > modelp->getCreationDate())
+ {
+ modelp->setCreationDate(most_recent_item_time);
+ }
+ }
+ }
+ base_t::sort(folder);
+}
+
+bool LLFolderViewModelInventory::contentsReady()
+{
+ return !LLInventoryModelBackgroundFetch::instance().folderFetchActive();
+}
+
+void LLFolderViewModelItemInventory::requestSort()
+{
+ LLFolderViewModelItemCommon::requestSort();
+ LLFolderViewFolder* folderp = dynamic_cast<LLFolderViewFolder*>(mFolderViewItem);
+ if (folderp)
+ {
+ folderp->requestArrange();
+ }
+ if (static_cast<LLFolderViewModelInventory&>(mRootViewModel).getSorter().isByDate())
+ {
+ // sort by date potentially affects parent folders which use a date
+ // derived from newest item in them
+ if (mParent)
+ {
+ mParent->requestSort();
+ }
+ }
+}
+
+void LLFolderViewModelItemInventory::setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset, std::string::size_type string_size)
+{
+ LLFolderViewModelItemCommon::setPassedFilter(passed, filter_generation, string_offset, string_size);
+
+ bool passed_filter_before = mPrevPassedAllFilters;
+ mPrevPassedAllFilters = passedFilter(filter_generation);
+
+ if (passed_filter_before != mPrevPassedAllFilters)
+ {
+ LLFolderViewFolder* parent_folder = mFolderViewItem->getParentFolder();
+ if (parent_folder)
+ {
+ parent_folder->requestArrange();
+ }
+ }
+}
+
+bool LLFolderViewModelItemInventory::filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter )
+{
+ S32 filter_generation = filter.getCurrentGeneration();
+
+ bool continue_filtering = true;
+ if (item->getLastFilterGeneration() < filter_generation)
+ {
+ // recursive application of the filter for child items
+ continue_filtering = item->filter( filter );
+ }
+
+ // track latest generation to pass any child items, for each folder up to root
+ if (item->passedFilter())
+ {
+ LLFolderViewModelItemInventory* view_model = this;
+
+ while(view_model && view_model->mMostFilteredDescendantGeneration < filter_generation)
+ {
+ view_model->mMostFilteredDescendantGeneration = filter_generation;
+ view_model = static_cast<LLFolderViewModelItemInventory*>(view_model->mParent);
+ }
+ }
+
+ return continue_filtering;
+}
+
+bool LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)
+{
+ const S32 filter_generation = filter.getCurrentGeneration();
+ const S32 must_pass_generation = filter.getFirstRequiredGeneration();
+
+ if (getLastFilterGeneration() >= must_pass_generation
+ && getLastFolderFilterGeneration() >= must_pass_generation
+ && !passedFilter(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
+ setPassedFilter(false, filter_generation);
+ setPassedFolderFilter(false, filter_generation);
+ return true;
+ }
+
+ const bool passed_filter_folder = (getInventoryType() == LLInventoryType::IT_CATEGORY)
+ ? filter.checkFolder(this)
+ : true;
+ setPassedFolderFilter(passed_filter_folder, filter_generation);
+
+ if(!mChildren.empty()
+ && (getLastFilterGeneration() < must_pass_generation // haven't checked descendants against minimum required generation to pass
+ || descendantsPassedFilter(must_pass_generation))) // or at least one descendant has passed the minimum requirement
+ {
+ // now query children
+ for (child_list_t::iterator iter = mChildren.begin(), end_iter = mChildren.end();
+ iter != end_iter && filter.getFilterCount() > 0;
+ ++iter)
+ {
+ if (!filterChildItem((*iter), filter))
+ {
+ break;
+ }
+ }
+ }
+
+ // if we didn't use all filter iterations
+ // that means we filtered all of our descendants
+ // so filter ourselves now
+ if (filter.getFilterCount() > 0)
+ {
+ filter.decrementFilterCount();
+
+ const bool passed_filter = filter.check(this);
+ setPassedFilter(passed_filter, filter_generation, filter.getStringMatchOffset(this), filter.getFilterStringSize());
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+LLFolderViewModelInventory* LLInventoryPanel::getFolderViewModel()
+{
+ return &mInventoryViewModel;
+}
+
+
+const LLFolderViewModelInventory* LLInventoryPanel::getFolderViewModel() const
+{
+ return &mInventoryViewModel;
+}
+
+bool LLInventorySort::operator()(const LLFolderViewModelItemInventory* const& a, const LLFolderViewModelItemInventory* const& b) const
+{
+ // Ignore sort order for landmarks in the Favorites folder.
+ // In that folder, landmarks should be always sorted as in the Favorites bar. See EXT-719
+ if (a->getSortGroup() == SG_ITEM
+ && b->getSortGroup() == SG_ITEM
+ && a->getInventoryType() == LLInventoryType::IT_LANDMARK
+ && b->getInventoryType() == LLInventoryType::IT_LANDMARK)
+ {
+ static const LLUUID& favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
+ // If both landmarks are in the Favorites folder...
+ if (gInventory.isObjectDescendentOf(a->getUUID(), favorites_folder_id) && gInventory.isObjectDescendentOf(b->getUUID(), favorites_folder_id))
+ {
+ // Get their index in that folder
+ S32 a_sort = LLFavoritesOrderStorage::instance().getSortIndex(a->getUUID());
+ S32 b_sort = LLFavoritesOrderStorage::instance().getSortIndex(b->getUUID());
+ // Note: this test is a bit overkill: since they are both in the Favorites folder, we shouldn't get negative index values...
+ if (!((a_sort < 0) && (b_sort < 0)))
+ {
+ return a_sort < b_sort;
+ }
+ }
+ }
+
+ // We sort by name if we aren't sorting by date
+ // OR if these are folders and we are sorting folders by name.
+ bool by_name = (!mByDate || (mFoldersByName && (a->getSortGroup() != SG_ITEM)));
+
+ if (a->getSortGroup() != b->getSortGroup())
+ {
+ if (mSystemToTop)
+ {
+ // Group order is System Folders, Trash, Normal Folders, Items
+ return (a->getSortGroup() < b->getSortGroup());
+ }
+ else if (mByDate)
+ {
+ // Trash needs to go to the bottom if we are sorting by date
+ if ( (a->getSortGroup() == SG_TRASH_FOLDER)
+ || (b->getSortGroup() == SG_TRASH_FOLDER))
+ {
+ return (b->getSortGroup() == SG_TRASH_FOLDER);
+ }
+ }
+ }
+
+ if (by_name)
+ {
+ S32 compare = LLStringUtil::compareDict(a->getDisplayName(), b->getDisplayName());
+ if (0 == compare)
+ {
+ return (a->getCreationDate() > b->getCreationDate());
+ }
+ else
+ {
+ return (compare < 0);
+ }
+ }
+ else
+ {
+ time_t first_create = a->getCreationDate();
+ time_t second_create = b->getCreationDate();
+ if (first_create == second_create)
+ {
+ return (LLStringUtil::compareDict(a->getDisplayName(), b->getDisplayName()) < 0);
+ }
+ else
+ {
+ return (first_create > second_create);
+ }
+ }
+}
+
+LLFolderViewModelItemInventory::LLFolderViewModelItemInventory( class LLFolderViewModelInventory& root_view_model )
+ : LLFolderViewModelItemCommon(root_view_model),
+ mPrevPassedAllFilters(false)
+{
+}
diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h
new file mode 100644
index 0000000000..890d03d1c9
--- /dev/null
+++ b/indra/newview/llfolderviewmodelinventory.h
@@ -0,0 +1,118 @@
+/**
+ * @file llfolderviewmodelinventory.h
+ * @brief view model implementation specific to inventory
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFOLDERVIEWMODELINVENTORY_H
+#define LL_LLFOLDERVIEWMODELINVENTORY_H
+
+#include "llinventoryfilter.h"
+#include "llinventory.h"
+#include "llwearabletype.h"
+#include "lltooldraganddrop.h"
+
+class LLFolderViewModelItemInventory
+ : public LLFolderViewModelItemCommon
+{
+public:
+ LLFolderViewModelItemInventory(class LLFolderViewModelInventory& root_view_model);
+ virtual const LLUUID& getUUID() const = 0;
+ virtual time_t getCreationDate() const = 0; // UTC seconds
+ virtual void setCreationDate(time_t creation_date_utc) = 0;
+ virtual PermissionMask getPermissionMask() const = 0;
+ virtual LLFolderType::EType getPreferredType() const = 0;
+ virtual void showProperties(void) = 0;
+ virtual BOOL isItemInTrash( void) const { return FALSE; } // TODO: make into pure virtual.
+ virtual BOOL isUpToDate() const = 0;
+ virtual bool hasChildren() const = 0;
+ virtual LLInventoryType::EType getInventoryType() const = 0;
+ virtual void performAction(LLInventoryModel* model, std::string action) = 0;
+ virtual LLWearableType::EType getWearableType() const = 0;
+ virtual EInventorySortGroup getSortGroup() const = 0;
+ virtual LLInventoryObject* getInventoryObject() const = 0;
+ virtual void requestSort();
+ virtual void setPassedFilter(bool filtered, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0);
+ virtual bool filter( LLFolderViewFilter& filter);
+ virtual bool filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter);
+
+ virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const = 0;
+ virtual LLToolDragAndDrop::ESource getDragSource() const = 0;
+
+protected:
+ bool mPrevPassedAllFilters;
+};
+
+class LLInventorySort
+{
+public:
+ struct Params : public LLInitParam::Block<Params>
+ {
+ Optional<S32> order;
+
+ Params()
+ : order("order", 0)
+ {}
+ };
+
+ LLInventorySort(S32 order = 0)
+ {
+ fromParams(Params().order(order));
+ }
+
+ bool isByDate() const { return mByDate; }
+ U32 getSortOrder() const { return mSortOrder; }
+ void toParams(Params& p) { p.order(mSortOrder);}
+ void fromParams(Params& p)
+ {
+ mSortOrder = p.order;
+ mByDate = (mSortOrder & LLInventoryFilter::SO_DATE);
+ mSystemToTop = (mSortOrder & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP);
+ mFoldersByName = (mSortOrder & LLInventoryFilter::SO_FOLDERS_BY_NAME);
+ }
+
+ bool operator()(const LLFolderViewModelItemInventory* const& a, const LLFolderViewModelItemInventory* const& b) const;
+private:
+ U32 mSortOrder;
+ bool mByDate;
+ bool mSystemToTop;
+ bool mFoldersByName;
+};
+
+class LLFolderViewModelInventory
+ : public LLFolderViewModel<LLInventorySort, LLFolderViewModelItemInventory, LLFolderViewModelItemInventory, LLInventoryFilter>
+{
+public:
+ typedef LLFolderViewModel<LLInventorySort, LLFolderViewModelItemInventory, LLFolderViewModelItemInventory, LLInventoryFilter> base_t;
+
+ void setTaskID(const LLUUID& id) {mTaskID = id;}
+
+ void sort(LLFolderViewFolder* folder);
+ bool contentsReady();
+ bool startDrag(std::vector<LLFolderViewModelItem*>& items);
+
+private:
+ LLUUID mTaskID;
+};
+#endif // LL_LLFOLDERVIEWMODELINVENTORY_H
diff --git a/indra/newview/llfollowcam.cpp b/indra/newview/llfollowcam.cpp
index b670af1782..47612fe25c 100644
--- a/indra/newview/llfollowcam.cpp
+++ b/indra/newview/llfollowcam.cpp
@@ -38,7 +38,6 @@ std::vector<LLFollowCamParams*> LLFollowCamMgr::sParamStack;
//-------------------------------------------------------
// constants
//-------------------------------------------------------
-const F32 ONE_HALF = 0.5;
const F32 FOLLOW_CAM_ZOOM_FACTOR = 0.1f;
const F32 FOLLOW_CAM_MIN_ZOOM_AMOUNT = 0.1f;
const F32 DISTANCE_EPSILON = 0.0001f;
diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp
index 11401d6c68..a4dfd94496 100644
--- a/indra/newview/llfriendcard.cpp
+++ b/indra/newview/llfriendcard.cpp
@@ -47,13 +47,13 @@ static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "All";
// helper functions
// NOTE: For now Friends & All folders are created as protected folders of the LLFolderType::FT_CALLINGCARD type.
-// So, their names will be processed in the LLFolderViewItem::refreshFromListener() to be localized
+// So, their names will be processed in the LLFolderViewItem::refresh() to be localized
// using "InvFolder LABEL_NAME" as LLTrans::findString argument.
// We must use in this file their hard-coded names to ensure found them on different locales. EXT-5829.
// These hard-coded names will be stored in InventoryItems but shown localized in FolderViewItems
-// If hack in the LLFolderViewItem::refreshFromListener() to localize protected folder is removed
+// If hack in the LLFolderViewItem::refresh() to localize protected folder is removed
// or these folders are not protected these names should be localized in another place/way.
inline const std::string get_friend_folder_name()
{
@@ -533,7 +533,7 @@ void LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
bool shouldBeAdded = true;
LLAvatarName av_name;
LLAvatarNameCache::get(avatarID, &av_name);
- const std::string& name = av_name.mUsername;
+ const std::string& name = av_name.getAccountName();
lldebugs << "Processing buddy name: " << name
<< ", id: " << avatarID
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 66ca76bfb0..f307505ff8 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -35,6 +35,7 @@
// library
#include "llaudioengine.h"
#include "lldatapacker.h"
+#include "llfloaterreg.h"
#include "llinventory.h"
#include "llkeyframemotion.h"
#include "llmultigesture.h"
@@ -51,7 +52,7 @@
#include "llviewermessage.h"
#include "llvoavatarself.h"
#include "llviewerstats.h"
-#include "llnearbychatbar.h"
+#include "llfloaterimnearbychat.h"
#include "llappearancemgr.h"
#include "llgesturelistener.h"
@@ -997,7 +998,8 @@ void LLGestureMgr::runStep(LLMultiGesture* gesture, LLGestureStep* step)
const BOOL animate = FALSE;
- LLNearbyChatBar::getInstance()->sendChatFromViewer(chat_text, CHAT_TYPE_NORMAL, animate);
+ (LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat"))->
+ sendChatFromViewer(chat_text, CHAT_TYPE_NORMAL, animate);
gesture->mCurrentStep++;
break;
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index 623ebb76f2..a0f2918bd7 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -36,10 +36,10 @@
#include "llfloaterreg.h"
#include "llfloatersidepanelcontainer.h"
#include "llgroupmgr.h"
+#include "llfloaterimcontainer.h"
#include "llimview.h" // for gIMMgr
#include "llnotificationsutil.h"
#include "llstatusbar.h" // can_afford_transaction()
-#include "llimfloater.h"
#include "groupchatlistener.h"
//
@@ -335,7 +335,7 @@ LLUUID LLGroupActions::startIM(const LLUUID& group_id)
group_id);
if (session_id != LLUUID::null)
{
- LLIMFloater::show(session_id);
+ LLFloaterIMContainer::getInstance()->showConversation(session_id);
}
make_ui_sound("UISndStartIM");
return session_id;
diff --git a/indra/newview/llgroupiconctrl.cpp b/indra/newview/llgroupiconctrl.cpp
index 2f9810775b..188c4bcf25 100644
--- a/indra/newview/llgroupiconctrl.cpp
+++ b/indra/newview/llgroupiconctrl.cpp
@@ -38,7 +38,7 @@
#include "llcachename.h"
#include "llagentdata.h"
-#include "llimfloater.h"
+#include "llfloaterimsession.h"
*/
static LLDefaultChildRegistry::Register<LLGroupIconCtrl> g_i("group_icon");
diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp
index 129cddda45..aba3d74d87 100644
--- a/indra/newview/llgrouplist.cpp
+++ b/indra/newview/llgrouplist.cpp
@@ -86,7 +86,7 @@ LLGroupList::LLGroupList(const Params& p)
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",
+ LLToggleableMenu* context_menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_people_groups.xml",
gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
if(context_menu)
mContextMenuHandle = context_menu->getHandle();
@@ -112,7 +112,7 @@ BOOL LLGroupList::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask);
- LLMenuGL* context_menu = (LLMenuGL*)mContextMenuHandle.get();
+ LLToggleableMenu* context_menu = mContextMenuHandle.get();
if (context_menu && size() > 0)
{
context_menu->buildDrawLabels();
@@ -406,7 +406,7 @@ void LLGroupListItem::setActive(bool active)
// *BUG: setName() overrides the style params.
// Active group should be bold.
- LLFontDescriptor new_desc(mGroupNameBox->getDefaultFont()->getFontDesc());
+ LLFontDescriptor new_desc(mGroupNameBox->getFont()->getFontDesc());
// *NOTE dzaporozhan
// On Windows LLFontGL::NORMAL will not remove LLFontGL::BOLD if font
diff --git a/indra/newview/llgrouplist.h b/indra/newview/llgrouplist.h
index 8abf14b3d0..e96a720886 100644
--- a/indra/newview/llgrouplist.h
+++ b/indra/newview/llgrouplist.h
@@ -28,10 +28,13 @@
#define LL_LLGROUPLIST_H
#include "llevent.h"
+#include "llpointer.h"
+
#include "llflatlistview.h"
#include "llpanel.h"
-#include "llpointer.h"
#include "llstyle.h"
+#include "lltoggleablemenu.h"
+
#include "llgroupmgr.h"
/**
@@ -45,6 +48,10 @@ class LLGroupList: public LLFlatListViewEx, public LLOldEvents::LLSimpleListener
{
LOG_CLASS(LLGroupList);
public:
+ struct Params : public LLInitParam::Block<Params, LLFlatListViewEx::Params>
+ {
+ Params(){};
+ };
LLGroupList(const Params& p);
virtual ~LLGroupList();
@@ -57,6 +64,8 @@ public:
void toggleIcons();
bool getIconsVisible() const { return mShowIcons; }
+ LLToggleableMenu* getContextMenu() const { return mContextMenuHandle.get(); }
+
private:
void setDirty(bool val = true) { mDirty = val; }
void refresh();
@@ -66,7 +75,7 @@ private:
bool onContextMenuItemClick(const LLSD& userdata);
bool onContextMenuItemEnable(const LLSD& userdata);
- LLHandle<LLView> mContextMenuHandle;
+ LLHandle<LLToggleableMenu> mContextMenuHandle;
bool mShowIcons;
bool mDirty;
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index aceb7f0614..81eb1d397e 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -36,6 +36,7 @@
#include <vector>
#include <algorithm>
+#include "llappviewer.h"
#include "llagent.h"
#include "llui.h"
#include "message.h"
@@ -237,6 +238,7 @@ LLGroupMgrGroupData::LLGroupMgrGroupData(const LLUUID& id) :
mPendingRoleMemberRequest(FALSE),
mAccessTime(0.0f)
{
+ mMemberVersion.generate();
}
void LLGroupMgrGroupData::setAccessed()
@@ -317,14 +319,14 @@ void LLGroupMgrGroupData::setRoleData(const LLUUID& role_id, LLRoleData role_dat
role_data.mChangeType = RC_UPDATE_DATA;
}
else
- {
+ {
role_data.mChangeType = RC_UPDATE_POWERS;
}
mRoleChanges[role_id] = role_data;
}
else
- {
+ {
llwarns << "Change being made to non-existant role " << role_id << llendl;
}
}
@@ -423,6 +425,7 @@ void LLGroupMgrGroupData::removeMemberData()
}
mMembers.clear();
mMemberDataComplete = FALSE;
+ mMemberVersion.generate();
}
void LLGroupMgrGroupData::removeRoleData()
@@ -745,6 +748,7 @@ void LLGroupMgrGroupData::cancelRoleChanges()
LLGroupMgr::LLGroupMgr()
{
+ mLastGroupMembersRequestFrame = 0;
}
LLGroupMgr::~LLGroupMgr()
@@ -943,6 +947,8 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
}
}
+ group_datap->mMemberVersion.generate();
+
if (group_datap->mMembers.size() == (U32)group_datap->mMemberCount)
{
group_datap->mMemberDataComplete = TRUE;
@@ -1500,6 +1506,7 @@ void LLGroupMgr::sendGroupMembersRequest(const LLUUID& group_id)
}
}
+
void LLGroupMgr::sendGroupRoleDataRequest(const LLUUID& group_id)
{
lldebugs << "LLGroupMgr::sendGroupRoleDataRequest" << llendl;
@@ -1768,8 +1775,6 @@ 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;
@@ -1830,8 +1835,193 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,
{
gAgent.sendReliableMessage();
}
+
+ group_datap->mMemberVersion.generate();
+}
+
+
+// Responder class for capability group management
+class GroupMemberDataResponder : public LLHTTPClient::Responder
+{
+public:
+ GroupMemberDataResponder() {}
+ virtual ~GroupMemberDataResponder() {}
+ virtual void result(const LLSD& pContent);
+ virtual void error(U32 pStatus, const std::string& pReason);
+private:
+ LLSD mMemberData;
+};
+
+void GroupMemberDataResponder::error(U32 pStatus, const std::string& pReason)
+{
+ LL_WARNS("GrpMgr") << "Error receiving group member data." << LL_ENDL;
+}
+
+void GroupMemberDataResponder::result(const LLSD& content)
+{
+ LLGroupMgr::processCapGroupMembersRequest(content);
+}
+
+
+// static
+void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id)
+{
+ // Have we requested the information already this frame?
+ if(mLastGroupMembersRequestFrame == gFrameCount)
+ return;
+
+ LLViewerRegion* currentRegion = gAgent.getRegion();
+ // Thank you FS:Ansariel!
+ if(!currentRegion)
+ {
+ LL_WARNS("GrpMgr") << "Agent does not have a current region. Uh-oh!" << LL_ENDL;
+ return;
+ }
+
+ // Check to make sure we have our capabilities
+ if(!currentRegion->capabilitiesReceived())
+ {
+ LL_WARNS("GrpMgr") << " Capabilities not received!" << LL_ENDL;
+ return;
+ }
+
+ // Get our capability
+ std::string cap_url = currentRegion->getCapability("GroupMemberData");
+
+ // Thank you FS:Ansariel!
+ if(cap_url.empty())
+ {
+ LL_INFOS("GrpMgr") << "Region has no GroupMemberData capability. Falling back to UDP fetch." << LL_ENDL;
+ sendGroupMembersRequest(group_id);
+ return;
+ }
+
+ // Post to our service. Add a body containing the group_id.
+ LLSD body = LLSD::emptyMap();
+ body["group_id"] = group_id;
+
+ LLHTTPClient::ResponderPtr grp_data_responder = new GroupMemberDataResponder();
+
+ // This could take a while to finish, timeout after 5 minutes.
+ LLHTTPClient::post(cap_url, body, grp_data_responder, LLSD(), 300);
+
+ mLastGroupMembersRequestFrame = gFrameCount;
+}
+
+
+// static
+void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
+{
+ // Did we get anything in content?
+ if(!content.size())
+ {
+ LL_DEBUGS("GrpMgr") << "No group member data received." << LL_ENDL;
+ return;
+ }
+
+ // If we have no members, there's no reason to do anything else
+ S32 num_members = content["member_count"];
+ if(num_members < 1)
+ return;
+
+ LLUUID group_id = content["group_id"].asUUID();
+
+ LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id);
+ if(!group_datap)
+ {
+ LL_WARNS("GrpMgr") << "Received incorrect, possibly stale, group or request id" << LL_ENDL;
+ return;
+ }
+
+ group_datap->mMemberCount = num_members;
+
+ LLSD member_list = content["members"];
+ LLSD titles = content["titles"];
+ LLSD defaults = content["defaults"];
+
+ std::string online_status;
+ std::string title;
+ S32 contribution;
+ U64 member_powers;
+ // If this is changed to a bool, make sure to change the LLGroupMemberData constructor
+ BOOL is_owner;
+
+ // Compute this once, rather than every time.
+ U64 default_powers = llstrtou64(defaults["default_powers"].asString().c_str(), NULL, 16);
+
+ LLSD::map_const_iterator member_iter_start = member_list.beginMap();
+ LLSD::map_const_iterator member_iter_end = member_list.endMap();
+ for( ; member_iter_start != member_iter_end; ++member_iter_start)
+ {
+ // Reset defaults
+ online_status = "unknown";
+ title = titles[0].asString();
+ contribution = 0;
+ member_powers = default_powers;
+ is_owner = false;
+
+ const LLUUID member_id(member_iter_start->first);
+ LLSD member_info = member_iter_start->second;
+
+ if(member_info.has("last_login"))
+ {
+ online_status = member_info["last_login"].asString();
+ if(online_status == "Online")
+ online_status = LLTrans::getString("group_member_status_online");
+ else
+ formatDateString(online_status);
+ }
+
+ if(member_info.has("title"))
+ title = titles[member_info["title"].asInteger()].asString();
+
+ if(member_info.has("powers"))
+ member_powers = llstrtou64(member_info["powers"].asString().c_str(), NULL, 16);
+
+ if(member_info.has("donated_square_meters"))
+ contribution = member_info["donated_square_meters"];
+
+ if(member_info.has("owner"))
+ is_owner = true;
+
+ LLGroupMemberData* data = new LLGroupMemberData(member_id,
+ contribution,
+ member_powers,
+ title,
+ online_status,
+ is_owner);
+
+ group_datap->mMembers[member_id] = data;
+ }
+
+ group_datap->mMemberVersion.generate();
+
+ // Technically, we have this data, but to prevent completely overhauling
+ // this entire system (it would be nice, but I don't have the time),
+ // I'm going to be dumb and just call services I most likely don't need
+ // with the thought being that the system might need it to be done.
+ //
+ // TODO:
+ // Refactor to reduce multiple calls for data we already have.
+ if(group_datap->mTitles.size() < 1)
+ LLGroupMgr::getInstance()->sendGroupTitlesRequest(group_id);
+
+
+ group_datap->mMemberDataComplete = TRUE;
+ group_datap->mMemberRequestID.setNull();
+ // Make the role-member data request
+ if (group_datap->mPendingRoleMemberRequest)
+ {
+ group_datap->mPendingRoleMemberRequest = FALSE;
+ LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(group_id);
+ }
+
+ group_datap->mChanged = TRUE;
+ LLGroupMgr::getInstance()->notifyObservers(GC_MEMBER_DATA);
+
}
+
void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id)
{
lldebugs << "LLGroupMgr::sendGroupRoleChanges" << llendl;
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index df3cd17e03..d8c1ab7ef5 100644
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -236,6 +236,8 @@ public:
F32 getAccessTime() const { return mAccessTime; }
void setAccessed();
+ const LLUUID& getMemberVersion() const { return mMemberVersion; }
+
public:
typedef std::map<LLUUID,LLGroupMemberData*> member_list_t;
typedef std::map<LLUUID,LLGroupRoleData*> role_list_t;
@@ -284,6 +286,9 @@ private:
BOOL mPendingRoleMemberRequest;
F32 mAccessTime;
+
+ // Generate a new ID every time mMembers
+ LLUUID mMemberVersion;
};
struct LLRoleAction
@@ -340,6 +345,10 @@ public:
static void sendGroupMemberEjects(const LLUUID& group_id,
uuid_vec_t& member_ids);
+ // BAKER
+ void sendCapGroupMembersRequest(const LLUUID& group_id);
+ static void processCapGroupMembersRequest(const LLSD& content);
+
void cancelGroupRoleChanges(const LLUUID& group_id);
static void processGroupPropertiesReply(LLMessageSystem* msg, void** data);
@@ -375,6 +384,8 @@ private:
typedef std::set<LLParticularGroupObserver*> observer_set_t;
typedef std::map<LLUUID,observer_set_t> observer_map_t;
observer_map_t mParticularObservers;
+
+ S32 mLastGroupMembersRequestFrame;
};
diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp
index e15862e2a4..197408b40e 100644
--- a/indra/newview/llhints.cpp
+++ b/indra/newview/llhints.cpp
@@ -171,12 +171,12 @@ LLHintPopup::LLHintPopup(const LLHintPopup::Params& p)
}
if (p.hint_image.isProvided())
{
- buildFromFile("panel_hint_image.xml", NULL, p);
+ buildFromFile("panel_hint_image.xml", p);
getChild<LLIconCtrl>("hint_image")->setImage(p.hint_image());
}
else
{
- buildFromFile( "panel_hint.xml", NULL, p);
+ buildFromFile( "panel_hint.xml", p);
}
}
diff --git a/indra/newview/llhudnametag.cpp b/indra/newview/llhudnametag.cpp
index 482294c8a6..3336097955 100644
--- a/indra/newview/llhudnametag.cpp
+++ b/indra/newview/llhudnametag.cpp
@@ -166,7 +166,6 @@ BOOL LLHUDNameTag::lineSegmentIntersect(const LLVector3& start, const LLVector3&
}
// scale screen size of borders down
- //RN: for now, text on hud objects is never occluded
LLVector3 x_pixel_vec;
LLVector3 y_pixel_vec;
@@ -187,45 +186,29 @@ BOOL LLHUDNameTag::lineSegmentIntersect(const LLVector3& start, const LLVector3&
+ (y_pixel_vec * screen_offset.mV[VY]);
- //if (mUseBubble)
+ LLVector3 bg_pos = render_position
+ + (F32)mOffsetY * y_pixel_vec
+ - (width_vec / 2.f)
+ - (height_vec);
+
+ LLVector3 v[] =
{
- LLVector3 bg_pos = render_position
- + (F32)mOffsetY * y_pixel_vec
- - (width_vec / 2.f)
- - (height_vec);
- //LLUI::translate(bg_pos.mV[VX], bg_pos.mV[VY], bg_pos.mV[VZ]);
+ bg_pos,
+ bg_pos + width_vec,
+ bg_pos + width_vec + height_vec,
+ bg_pos + height_vec,
+ };
- LLVector3 v[] =
- {
- bg_pos,
- bg_pos + width_vec,
- bg_pos + width_vec + height_vec,
- bg_pos + height_vec,
- };
+ LLVector3 dir = end-start;
+ F32 a, b, t;
- if (debug_render)
+ if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, a, b, t, FALSE) ||
+ LLTriangleRayIntersect(v[2], v[3], v[0], start, dir, a, b, t, FALSE) )
+ {
+ if (t <= 1.f)
{
- gGL.begin(LLRender::LINE_STRIP);
- gGL.vertex3fv(v[0].mV);
- gGL.vertex3fv(v[1].mV);
- gGL.vertex3fv(v[2].mV);
- gGL.vertex3fv(v[3].mV);
- gGL.vertex3fv(v[0].mV);
- gGL.vertex3fv(v[2].mV);
- gGL.end();
- }
-
- LLVector3 dir = end-start;
- F32 a, b, t;
-
- if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, a, b, t, FALSE) ||
- LLTriangleRayIntersect(v[2], v[3], v[0], start, dir, a, b, t, FALSE) )
- {
- if (t <= 1.f)
- {
- intersection = start + dir*t;
- return TRUE;
- }
+ intersection = start + dir*t;
+ return TRUE;
}
}
@@ -241,12 +224,6 @@ void LLHUDNameTag::render()
}
}
-void LLHUDNameTag::renderForSelect()
-{
- LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
- renderText(TRUE);
-}
-
void LLHUDNameTag::renderText(BOOL for_select)
{
if (!mVisible || mHidden)
@@ -299,24 +276,6 @@ void LLHUDNameTag::renderText(BOOL for_select)
LLColor4 bg_color = LLUIColorTable::instance().getColor("NameTagBackground");
bg_color.setAlpha(gSavedSettings.getF32("ChatBubbleOpacity") * alpha_factor);
- // maybe a no-op?
- //const S32 border_height = 16;
- //const S32 border_width = 16;
- const S32 border_height = 8;
- const S32 border_width = 8;
-
- // *TODO move this into helper function
- F32 border_scale = 1.f;
-
- if (border_height * 2 > mHeight)
- {
- border_scale = (F32)mHeight / ((F32)border_height * 2.f);
- }
- if (border_width * 2 > mWidth)
- {
- border_scale = llmin(border_scale, (F32)mWidth / ((F32)border_width * 2.f));
- }
-
// scale screen size of borders down
//RN: for now, text on hud objects is never occluded
@@ -325,152 +284,34 @@ void LLHUDNameTag::renderText(BOOL for_select)
LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec);
- LLVector2 border_scale_vec((F32)border_width / (F32)imagep->getTextureWidth(), (F32)border_height / (F32)imagep->getTextureHeight());
LLVector3 width_vec = mWidth * x_pixel_vec;
LLVector3 height_vec = mHeight * y_pixel_vec;
- LLVector3 scaled_border_width = (F32)llfloor(border_scale * (F32)border_width) * x_pixel_vec;
- LLVector3 scaled_border_height = (F32)llfloor(border_scale * (F32)border_height) * y_pixel_vec;
mRadius = (width_vec + height_vec).magVec() * 0.5f;
LLCoordGL screen_pos;
LLViewerCamera::getInstance()->projectPosAgentToScreen(mPositionAgent, screen_pos, FALSE);
- LLVector2 screen_offset;
-// if (!mUseBubble)
-// {
-// screen_offset = mPositionOffset;
-// }
-// else
-// {
- screen_offset = updateScreenPos(mPositionOffset);
-// }
+ LLVector2 screen_offset = updateScreenPos(mPositionOffset);
LLVector3 render_position = mPositionAgent
+ (x_pixel_vec * screen_offset.mV[VX])
+ (y_pixel_vec * screen_offset.mV[VY]);
-// if (mUseBubble)
+ LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
+ LLRect screen_rect;
+ screen_rect.setCenterAndSize(0, static_cast<S32>(lltrunc(-mHeight / 2 + mOffsetY)), static_cast<S32>(lltrunc(mWidth)), static_cast<S32>(lltrunc(mHeight)));
+ imagep->draw3D(render_position, x_pixel_vec, y_pixel_vec, screen_rect, bg_color);
+ if (mLabelSegments.size())
{
- LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
- LLUI::pushMatrix();
- {
- LLVector3 bg_pos = render_position
- + (F32)mOffsetY * y_pixel_vec
- - (width_vec / 2.f)
- - (height_vec);
- LLUI::translate(bg_pos.mV[VX], bg_pos.mV[VY], bg_pos.mV[VZ]);
-
- if (for_select)
- {
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- S32 name = mSourceObject->mGLName;
- LLColor4U coloru((U8)(name >> 16), (U8)(name >> 8), (U8)name);
- gGL.color4ubv(coloru.mV);
- gl_segmented_rect_3d_tex(border_scale_vec, scaled_border_width, scaled_border_height, width_vec, height_vec);
- LLUI::popMatrix();
- return;
- }
- else
- {
- gGL.getTexUnit(0)->bind(imagep->getImage());
-
- gGL.color4fv(bg_color.mV);
- gl_segmented_rect_3d_tex(border_scale_vec, scaled_border_width, scaled_border_height, width_vec, height_vec);
-
- if ( mLabelSegments.size())
- {
- LLUI::pushMatrix();
- {
- gGL.color4f(text_color.mV[VX], text_color.mV[VY], text_color.mV[VZ], gSavedSettings.getF32("ChatBubbleOpacity") * alpha_factor);
- LLVector3 label_height = (mFontp->getLineHeight() * mLabelSegments.size() + (VERTICAL_PADDING / 3.f)) * y_pixel_vec;
- LLVector3 label_offset = height_vec - label_height;
- LLUI::translate(label_offset.mV[VX], label_offset.mV[VY], label_offset.mV[VZ]);
- gl_segmented_rect_3d_tex_top(border_scale_vec, scaled_border_width, scaled_border_height, width_vec, label_height);
- }
- LLUI::popMatrix();
- }
- }
-
- BOOL outside_width = llabs(mPositionOffset.mV[VX]) > mWidth * 0.5f;
- BOOL outside_height = llabs(mPositionOffset.mV[VY] + (mVertAlignment == ALIGN_VERT_TOP ? mHeight * 0.5f : 0.f)) > mHeight * (mVertAlignment == ALIGN_VERT_TOP ? mHeight * 0.75f : 0.5f);
+ LLUIImagePtr rect_top_image = LLUI::getUIImage("Rounded_Rect_Top");
+ LLRect label_top_rect = screen_rect;
+ const S32 label_height = llround((mFontp->getLineHeight() * (F32)mLabelSegments.size() + (VERTICAL_PADDING / 3.f)));
+ label_top_rect.mBottom = label_top_rect.mTop - label_height;
+ LLColor4 label_top_color = text_color;
+ label_top_color.mV[VALPHA] = gSavedSettings.getF32("ChatBubbleOpacity") * alpha_factor;
- // draw line segments pointing to parent object
- if (!mOffscreen && (outside_width || outside_height))
- {
- LLUI::pushMatrix();
- {
- gGL.color4fv(bg_color.mV);
- LLVector3 target_pos = -1.f * (mPositionOffset.mV[VX] * x_pixel_vec + mPositionOffset.mV[VY] * y_pixel_vec);
- target_pos += (width_vec / 2.f);
- target_pos += mVertAlignment == ALIGN_VERT_CENTER ? (height_vec * 0.5f) : LLVector3::zero;
- target_pos -= 3.f * x_pixel_vec;
- target_pos -= 6.f * y_pixel_vec;
- LLUI::translate(target_pos.mV[VX], target_pos.mV[VY], target_pos.mV[VZ]);
- gl_segmented_rect_3d_tex(border_scale_vec, 3.f * x_pixel_vec, 3.f * y_pixel_vec, 6.f * x_pixel_vec, 6.f * y_pixel_vec);
- }
- LLUI::popMatrix();
-
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- LLGLDepthTest gls_depth(mZCompare ? GL_TRUE : GL_FALSE, GL_FALSE);
-
- LLVector3 box_center_offset;
- box_center_offset = (width_vec * 0.5f) + (height_vec * 0.5f);
- LLUI::translate(box_center_offset.mV[VX], box_center_offset.mV[VY], box_center_offset.mV[VZ]);
- gGL.color4fv(bg_color.mV);
- LLUI::setLineWidth(2.0);
- gGL.begin(LLRender::LINES);
- {
- if (outside_width)
- {
- LLVector3 vert;
- // draw line in x then y
- if (mPositionOffset.mV[VX] < 0.f)
- {
- // start at right edge
- vert = width_vec * 0.5f;
- gGL.vertex3fv(vert.mV);
- }
- else
- {
- // start at left edge
- vert = width_vec * -0.5f;
- gGL.vertex3fv(vert.mV);
- }
- vert = -mPositionOffset.mV[VX] * x_pixel_vec;
- gGL.vertex3fv(vert.mV);
- gGL.vertex3fv(vert.mV);
- vert -= mPositionOffset.mV[VY] * y_pixel_vec;
- vert -= ((mVertAlignment == ALIGN_VERT_TOP) ? (height_vec * 0.5f) : LLVector3::zero);
- gGL.vertex3fv(vert.mV);
- }
- else
- {
- LLVector3 vert;
- // draw line in y then x
- if (mPositionOffset.mV[VY] < 0.f)
- {
- // start at top edge
- vert = (height_vec * 0.5f) - (mPositionOffset.mV[VX] * x_pixel_vec);
- gGL.vertex3fv(vert.mV);
- }
- else
- {
- // start at bottom edge
- vert = (height_vec * -0.5f) - (mPositionOffset.mV[VX] * x_pixel_vec);
- gGL.vertex3fv(vert.mV);
- }
- vert = -mPositionOffset.mV[VY] * y_pixel_vec - mPositionOffset.mV[VX] * x_pixel_vec;
- vert -= ((mVertAlignment == ALIGN_VERT_TOP) ? (height_vec * 0.5f) : LLVector3::zero);
- gGL.vertex3fv(vert.mV);
- }
- }
- gGL.end();
- LLUI::setLineWidth(1.0);
-
- }
- }
- LLUI::popMatrix();
+ rect_top_image->draw3D(render_position, x_pixel_vec, y_pixel_vec, label_top_rect, label_top_color);
}
F32 y_offset = (F32)mOffsetY;
@@ -874,29 +715,26 @@ void LLHUDNameTag::updateAll()
for (r_it = sVisibleTextObjects.rbegin(); r_it != sVisibleTextObjects.rend(); ++r_it)
{
LLHUDNameTag* textp = (*r_it);
-// if (textp->mUseBubble)
-// {
- if (current_screen_area / screen_area > LOD_2_SCREEN_COVERAGE)
- {
- textp->setLOD(3);
- }
- else if (current_screen_area / screen_area > LOD_1_SCREEN_COVERAGE)
- {
- textp->setLOD(2);
- }
- else if (current_screen_area / screen_area > LOD_0_SCREEN_COVERAGE)
- {
- textp->setLOD(1);
- }
- else
- {
- textp->setLOD(0);
- }
- textp->updateSize();
- // find on-screen position and initialize collision rectangle
- textp->mTargetPositionOffset = textp->updateScreenPos(LLVector2::zero);
- current_screen_area += (F32)(textp->mSoftScreenRect.getWidth() * textp->mSoftScreenRect.getHeight());
-// }
+ if (current_screen_area / screen_area > LOD_2_SCREEN_COVERAGE)
+ {
+ textp->setLOD(3);
+ }
+ else if (current_screen_area / screen_area > LOD_1_SCREEN_COVERAGE)
+ {
+ textp->setLOD(2);
+ }
+ else if (current_screen_area / screen_area > LOD_0_SCREEN_COVERAGE)
+ {
+ textp->setLOD(1);
+ }
+ else
+ {
+ textp->setLOD(0);
+ }
+ textp->updateSize();
+ // find on-screen position and initialize collision rectangle
+ textp->mTargetPositionOffset = textp->updateScreenPos(LLVector2::zero);
+ current_screen_area += (F32)(textp->mSoftScreenRect.getWidth() * textp->mSoftScreenRect.getHeight());
}
LLStat* camera_vel_stat = LLViewerCamera::getInstance()->getVelocityStat();
@@ -914,20 +752,12 @@ void LLHUDNameTag::updateAll()
{
LLHUDNameTag* src_textp = (*src_it);
-// if (!src_textp->mUseBubble)
-// {
-// continue;
-// }
VisibleTextObjectIterator dst_it = src_it;
++dst_it;
for (; dst_it != sVisibleTextObjects.end(); ++dst_it)
{
LLHUDNameTag* dst_textp = (*dst_it);
-// if (!dst_textp->mUseBubble)
-// {
-// continue;
-// }
if (src_textp->mSoftScreenRect.overlaps(dst_textp->mSoftScreenRect))
{
LLRectf intersect_rect = src_textp->mSoftScreenRect;
@@ -976,10 +806,6 @@ void LLHUDNameTag::updateAll()
VisibleTextObjectIterator this_object_it;
for (this_object_it = sVisibleTextObjects.begin(); this_object_it != sVisibleTextObjects.end(); ++this_object_it)
{
-// if (!(*this_object_it)->mUseBubble)
-// {
-// continue;
-// }
(*this_object_it)->mPositionOffset = lerp((*this_object_it)->mPositionOffset, (*this_object_it)->mTargetPositionOffset, LLCriticalDamp::getInterpolant(POSITION_DAMPING_TC));
}
}
@@ -1037,10 +863,6 @@ void LLHUDNameTag::addPickable(std::set<LLViewerObject*> &pick_list)
VisibleTextObjectIterator text_it;
for (text_it = sVisibleTextObjects.begin(); text_it != sVisibleTextObjects.end(); ++text_it)
{
-// if (!(*text_it)->mUseBubble)
-// {
-// continue;
-// }
pick_list.insert((*text_it)->mSourceObject);
}
}
diff --git a/indra/newview/llhudnametag.h b/indra/newview/llhudnametag.h
index 3325c22def..72647d5b26 100644
--- a/indra/newview/llhudnametag.h
+++ b/indra/newview/llhudnametag.h
@@ -118,7 +118,6 @@ public:
/*virtual*/ void markDead();
friend class LLHUDObject;
/*virtual*/ F32 getDistance() const { return mLastDistance; }
- //void setUseBubble(BOOL use_bubble) { mUseBubble = use_bubble; }
S32 getLOD() { return mLOD; }
BOOL getVisible() { return mVisible; }
BOOL getHidden() const { return mHidden; }
@@ -136,7 +135,6 @@ protected:
LLHUDNameTag(const U8 type);
/*virtual*/ void render();
- /*virtual*/ void renderForSelect();
void renderText(BOOL for_select);
static void updateAll();
void setLOD(S32 lod);
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
deleted file mode 100644
index 63eedcdfea..0000000000
--- a/indra/newview/llimfloater.cpp
+++ /dev/null
@@ -1,1195 +0,0 @@
-/**
- * @file llimfloater.cpp
- * @brief LLIMFloater class definition
- *
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llimfloater.h"
-
-#include "llnotificationsutil.h"
-
-#include "llagent.h"
-#include "llappviewer.h"
-#include "llavatarnamecache.h"
-#include "llbutton.h"
-#include "llchannelmanager.h"
-#include "llchiclet.h"
-#include "llchicletbar.h"
-#include "llfloaterreg.h"
-#include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container
-#include "llinventoryfunctions.h"
-#include "lllayoutstack.h"
-#include "lllineeditor.h"
-#include "lllogchat.h"
-#include "llpanelimcontrolpanel.h"
-#include "llscreenchannel.h"
-#include "llsyswellwindow.h"
-#include "lltrans.h"
-#include "llchathistory.h"
-#include "llnotifications.h"
-#include "llviewerwindow.h"
-#include "llvoicechannel.h"
-#include "lltransientfloatermgr.h"
-#include "llinventorymodel.h"
-#include "llrootview.h"
-#include "llspeakers.h"
-#include "llviewerchat.h"
-#include "llautoreplace.h"
-
-LLIMFloater::LLIMFloater(const LLUUID& session_id)
- : LLTransientDockableFloater(NULL, true, session_id),
- mControlPanel(NULL),
- mSessionID(session_id),
- mLastMessageIndex(-1),
- mDialog(IM_NOTHING_SPECIAL),
- mChatHistory(NULL),
- mInputEditor(NULL),
- mSavedTitle(),
- mTypingStart(),
- mShouldSendTypingState(false),
- mMeTyping(false),
- mOtherTyping(false),
- mTypingTimer(),
- mTypingTimeoutTimer(),
- mPositioned(false),
- mSessionInitialized(false)
-{
- LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mSessionID);
- if (im_session)
- {
- mSessionInitialized = im_session->mSessionInitialized;
-
- mDialog = im_session->mType;
- switch(mDialog){
- case IM_NOTHING_SPECIAL:
- case IM_SESSION_P2P_INVITE:
- mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelIMControl, this);
- break;
- case IM_SESSION_CONFERENCE_START:
- mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelAdHocControl, this);
- break;
- 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);
-
- setDocked(true);
-}
-
-void LLIMFloater::onFocusLost()
-{
- LLIMModel::getInstance()->resetActiveSessionID();
-
- LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, false);
-}
-
-void LLIMFloater::onFocusReceived()
-{
- LLIMModel::getInstance()->setActiveSessionID(mSessionID);
-
- LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, true);
-
- if (getVisible())
- {
- LLIMModel::instance().sendNoUnreadMessages(mSessionID);
- }
-}
-
-// 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 || data["from_id"].asUUID().isNull())
- {
- LLUUID session_id = data["session_id"].asUUID();
-
- LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
- if (floater == NULL) return;
-
- // update if visible, otherwise will be updated when opened
- if (floater->getVisible())
- {
- floater->updateMessages();
- }
- }
-}
-
-void LLIMFloater::onVisibilityChange(const LLSD& new_visibility)
-{
- bool visible = new_visibility.asBoolean();
-
- LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
-
- if (visible && voice_channel &&
- voice_channel->getState() == LLVoiceChannel::STATE_CONNECTED)
- {
- LLFloaterReg::showInstance("voice_call", mSessionID);
- }
- else
- {
- LLFloaterReg::hideInstance("voice_call", mSessionID);
- }
-}
-
-void LLIMFloater::onSendMsg( LLUICtrl* ctrl, void* userdata )
-{
- LLIMFloater* self = (LLIMFloater*) userdata;
- self->sendMsg();
- self->setTyping(false);
-}
-
-void LLIMFloater::sendMsg()
-{
- if (!gAgent.isGodlike()
- && (mDialog == IM_NOTHING_SPECIAL)
- && mOtherParticipantUUID.isNull())
- {
- llinfos << "Cannot send IM to everyone unless you're a god." << llendl;
- return;
- }
-
- if (mInputEditor)
- {
- LLWString text = mInputEditor->getConvertedText();
- if(!text.empty())
- {
- // Truncate and convert to UTF8 for transport
- std::string utf8_text = wstring_to_utf8str(text);
- utf8_text = utf8str_truncate(utf8_text, MAX_MSG_BUF_SIZE - 1);
-
- if (mSessionInitialized)
- {
- LLIMModel::sendMessage(utf8_text, mSessionID,
- mOtherParticipantUUID,mDialog);
- }
- else
- {
- //queue up the message to send once the session is initialized
- mQueuedMsgsForInit.append(utf8_text);
- }
-
- mInputEditor->setText(LLStringUtil::null);
-
- updateMessages();
- }
- }
-}
-
-
-
-LLIMFloater::~LLIMFloater()
-{
- LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this);
-}
-
-//virtual
-BOOL LLIMFloater::postBuild()
-{
- const LLUUID& other_party_id = LLIMModel::getInstance()->getOtherParticipantID(mSessionID);
- if (other_party_id.notNull())
- {
- mOtherParticipantUUID = other_party_id;
- }
-
- mControlPanel->setSessionId(mSessionID);
- mControlPanel->getParent()->setVisible(gSavedSettings.getBOOL("IMShowControlPanel"));
-
- LLButton* slide_left = getChild<LLButton>("slide_left_btn");
- slide_left->setVisible(mControlPanel->getParent()->getVisible());
- slide_left->setClickedCallback(boost::bind(&LLIMFloater::onSlide, this));
-
- LLButton* slide_right = getChild<LLButton>("slide_right_btn");
- slide_right->setVisible(!mControlPanel->getParent()->getVisible());
- slide_right->setClickedCallback(boost::bind(&LLIMFloater::onSlide, this));
-
- mInputEditor = getChild<LLLineEditor>("chat_editor");
- mInputEditor->setMaxTextLength(1023);
- // enable line history support for instant message bar
- mInputEditor->setEnableLineHistory(TRUE);
- // *TODO Establish LineEditor with autoreplace callback
- mInputEditor->setAutoreplaceCallback(boost::bind(&LLAutoReplace::autoreplaceCallback, LLAutoReplace::getInstance(), _1, _2));
-
- LLFontGL* font = LLViewerChat::getChatFont();
- mInputEditor->setFont(font);
-
- 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 );
-
- childSetCommitCallback("chat_editor", onSendMsg, this);
-
- mChatHistory = getChild<LLChatHistory>("chat_history");
-
- setDocked(true);
-
- mTypingStart = LLTrans::getString("IM_typing_start_string");
-
- // Disable input editor if session cannot accept text
- LLIMModel::LLIMSession* im_session =
- LLIMModel::instance().findIMSession(mSessionID);
- if( im_session && !im_session->mTextIMPossible )
- {
- mInputEditor->setEnabled(FALSE);
- mInputEditor->setLabel(LLTrans::getString("IM_unavailable_text_label"));
- }
-
- if ( im_session && im_session->isP2PSessionType())
- {
- // look up display name for window title
- LLAvatarNameCache::get(im_session->mOtherParticipantID,
- boost::bind(&LLIMFloater::onAvatarNameCache,
- this, _1, _2));
- }
- else
- {
- std::string session_name(LLIMModel::instance().getName(mSessionID));
- updateSessionName(session_name, session_name);
- }
-
- //*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)
-
- if(isChatMultiTab())
- {
- return LLFloater::postBuild();
- }
- else
- {
- return LLDockableFloater::postBuild();
- }
-}
-
-void LLIMFloater::updateSessionName(const std::string& ui_title,
- const std::string& ui_label)
-{
- mInputEditor->setLabel(LLTrans::getString("IM_to_label") + " " + ui_label);
- setTitle(ui_title);
-}
-
-void LLIMFloater::onAvatarNameCache(const LLUUID& agent_id,
- const LLAvatarName& av_name)
-{
- // Use display name only for labels, as the extended name will be in the
- // floater title
- std::string ui_title = av_name.getCompleteName();
- updateSessionName(ui_title, av_name.mDisplayName);
- mTypingStart.setArg("[NAME]", ui_title);
-}
-
-// virtual
-void LLIMFloater::draw()
-{
- if ( mMeTyping )
- {
- // Time out if user hasn't typed for a while.
- if ( mTypingTimeoutTimer.getElapsedTimeF32() > LLAgent::TYPING_TIMEOUT_SECS )
- {
- setTyping(false);
- }
- }
-
- LLTransientDockableFloater::draw();
-}
-
-
-// static
-void* LLIMFloater::createPanelIMControl(void* userdata)
-{
- LLIMFloater *self = (LLIMFloater*)userdata;
- self->mControlPanel = new LLPanelIMControlPanel();
- self->mControlPanel->setXMLFilename("panel_im_control_panel.xml");
- return self->mControlPanel;
-}
-
-
-// static
-void* LLIMFloater::createPanelGroupControl(void* userdata)
-{
- LLIMFloater *self = (LLIMFloater*)userdata;
- self->mControlPanel = new LLPanelGroupControlPanel(self->mSessionID);
- self->mControlPanel->setXMLFilename("panel_group_control_panel.xml");
- return self->mControlPanel;
-}
-
-// static
-void* LLIMFloater::createPanelAdHocControl(void* userdata)
-{
- LLIMFloater *self = (LLIMFloater*)userdata;
- self->mControlPanel = new LLPanelAdHocControlPanel(self->mSessionID);
- self->mControlPanel->setXMLFilename("panel_adhoc_control_panel.xml");
- return self->mControlPanel;
-}
-
-void LLIMFloater::onSlide()
-{
- mControlPanel->getParent()->setVisible(!mControlPanel->getParent()->getVisible());
-
- gSavedSettings.setBOOL("IMShowControlPanel", mControlPanel->getParent()->getVisible());
-
- getChild<LLButton>("slide_left_btn")->setVisible(mControlPanel->getParent()->getVisible());
- getChild<LLButton>("slide_right_btn")->setVisible(!mControlPanel->getParent()->getVisible());
-}
-
-//static
-LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
-{
- closeHiddenIMToasts();
-
- if (!gIMMgr->hasSession(session_id)) return NULL;
-
- if(!isChatMultiTab())
- {
- //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)
- {
- LLIMFloater* floater = dynamic_cast<LLIMFloater*>(*iter);
- if (floater && floater->isDocked())
- {
- floater->setVisible(false);
- }
- }
- }
-
- bool exist = findInstance(session_id);
-
- LLIMFloater* floater = getInstance(session_id);
- if (!floater) return NULL;
-
- if(isChatMultiTab())
- {
- LLIMFloaterContainer* floater_container = LLIMFloaterContainer::getInstance();
-
- // do not add existed floaters to avoid adding torn off instances
- if (!exist)
- {
- // 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);
- }
- }
-
- 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)
- {
- LLChiclet* chiclet =
- LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(
- session_id);
- if (chiclet == NULL)
- {
- llerror("Dock chiclet for LLIMFloater doesn't exists", 0);
- }
- else
- {
- LLChicletBar::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
- }
-
- floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(),
- LLDockControl::BOTTOM));
- }
-
- // window is positioned, now we can show it.
- }
- floater->setVisible(TRUE);
-
- return floater;
-}
-
-void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
-{
- // update notification channel state
- LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*>
- (LLNotificationsUI::LLChannelManager::getInstance()->
- findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
-
- if(!isChatMultiTab())
- {
- LLTransientDockableFloater::setDocked(docked, pop_on_undock);
- }
-
- // update notification channel state
- if(channel)
- {
- channel->updateShowToastsState();
- channel->redrawToasts();
- }
-}
-
-void LLIMFloater::setVisible(BOOL visible)
-{
- LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*>
- (LLNotificationsUI::LLChannelManager::getInstance()->
- findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
- LLTransientDockableFloater::setVisible(visible);
-
- // update notification channel state
- 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 stealing focus when opening a background IM tab (EXT-5387, checking focus for EXT-6781)
- if (!isChatMultiTab() || hasFocus())
- {
- mInputEditor->setFocus(TRUE);
- }
- }
-
- if(!visible)
- {
- LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(mSessionID);
- if(chiclet)
- {
- chiclet->setToggleState(false);
- }
- }
-}
-
-BOOL LLIMFloater::getVisible()
-{
- if(isChatMultiTab())
- {
- LLIMFloaterContainer* im_container = LLIMFloaterContainer::getInstance();
-
- // Treat inactive floater as invisible.
- bool is_active = im_container->getActiveFloater() == this;
-
- //torn off floater is always inactive
- if (!is_active && getHost() != im_container)
- {
- return LLTransientDockableFloater::getVisible();
- }
-
- // getVisible() returns TRUE when Tabbed IM window is minimized.
- return is_active && !im_container->isMinimized() && im_container->getVisible();
- }
- else
- {
- return LLTransientDockableFloater::getVisible();
- }
-}
-
-//static
-bool LLIMFloater::toggle(const LLUUID& session_id)
-{
- if(!isChatMultiTab())
- {
- 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
-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;
-
- //will be different only for an ad-hoc im session
- if (mSessionID != im_session_id)
- {
- mSessionID = 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)
-
-
- //need to send delayed messaged collected while waiting for session initialization
- if (!mQueuedMsgsForInit.size()) return;
- LLSD::array_iterator iter;
- for ( iter = mQueuedMsgsForInit.beginArray();
- iter != mQueuedMsgsForInit.endArray();
- ++iter)
- {
- LLIMModel::sendMessage(iter->asString(), mSessionID,
- mOtherParticipantUUID, mDialog);
- }
-}
-
-void LLIMFloater::updateMessages()
-{
- bool use_plain_text_chat_history = gSavedSettings.getBOOL("PlainTextChatHistory");
-
- std::list<LLSD> messages;
-
- // we shouldn't reset unread message counters if IM floater doesn't have focus
- if (hasFocus())
- {
- LLIMModel::instance().getMessages(mSessionID, messages, mLastMessageIndex+1);
- }
- else
- {
- LLIMModel::instance().getMessagesSilently(mSessionID, messages, mLastMessageIndex+1);
- }
-
- if (messages.size())
- {
- 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();
- std::list<LLSD>::const_reverse_iterator iter_end = messages.rend();
- for (; iter != iter_end; ++iter)
- {
- LLSD msg = *iter;
-
- std::string time = msg["time"].asString();
- LLUUID from_id = msg["from_id"].asUUID();
- std::string from = msg["from"].asString();
- std::string message = msg["message"].asString();
- bool is_history = msg["is_history"].asBoolean();
-
- LLChat chat;
- chat.mFromID = from_id;
- chat.mSessionID = mSessionID;
- chat.mFromName = from;
- chat.mTimeStr = time;
- chat.mChatStyle = is_history ? CHAT_STYLE_HISTORY : chat.mChatStyle;
-
- // process offer notification
- if (msg.has("notification_id"))
- {
- chat.mNotifId = msg["notification_id"].asUUID();
- // if notification exists - embed it
- if (LLNotificationsUtil::find(chat.mNotifId) != NULL)
- {
- // remove embedded notification from channel
- LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*>
- (LLNotificationsUI::LLChannelManager::getInstance()->
- findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
- if (getVisible())
- {
- // toast will be automatically closed since it is not storable toast
- channel->hideToast(chat.mNotifId);
- }
- }
- // if notification doesn't exist - try to use next message which should be log entry
- else
- {
- continue;
- }
- }
- //process text message
- else
- {
- chat.mText = message;
- }
-
- mChatHistory->appendMessage(chat, chat_args);
- mLastMessageIndex = msg["index"].asInteger();
-
- // if it is a notification - next message is a notification history log, so skip it
- if (chat.mNotifId.notNull() && LLNotificationsUtil::find(chat.mNotifId) != NULL)
- {
- if (++iter == iter_end)
- {
- break;
- }
- else
- {
- mLastMessageIndex++;
- }
- }
- }
- }
-}
-
-void LLIMFloater::reloadMessages()
-{
- mChatHistory->clear();
- mLastMessageIndex = -1;
- updateMessages();
-}
-
-// static
-void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void* userdata )
-{
- LLIMFloater* self= (LLIMFloater*) userdata;
-
- // Allow enabling the LLIMFloater input editor only if session can accept text
- LLIMModel::LLIMSession* im_session =
- LLIMModel::instance().findIMSession(self->mSessionID);
- //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);
- }
-}
-
-// static
-void LLIMFloater::onInputEditorFocusLost(LLFocusableElement* caller, void* userdata)
-{
- LLIMFloater* self = (LLIMFloater*) userdata;
- self->setTyping(false);
-}
-
-// static
-void LLIMFloater::onInputEditorKeystroke(LLLineEditor* caller, void* userdata)
-{
- LLIMFloater* self = (LLIMFloater*)userdata;
- std::string text = self->mInputEditor->getText();
- if (!text.empty())
- {
- self->setTyping(true);
- }
- else
- {
- // Deleting all text counts as stopping typing.
- self->setTyping(false);
- }
-}
-
-void LLIMFloater::setTyping(bool typing)
-{
- if ( typing )
- {
- // Started or proceeded typing, reset the typing timeout timer
- mTypingTimeoutTimer.reset();
- }
-
- if ( mMeTyping != typing )
- {
- // Typing state is changed
- mMeTyping = typing;
- // So, should send current state
- mShouldSendTypingState = true;
- // In case typing is started, send state after some delay
- mTypingTimer.reset();
- }
-
- // Don't want to send typing indicators to multiple people, potentially too
- // much network traffic. Only send in person-to-person IMs.
- if ( mShouldSendTypingState && mDialog == IM_NOTHING_SPECIAL )
- {
- if ( mMeTyping )
- {
- if ( mTypingTimer.getElapsedTimeF32() > 1.f )
- {
- // Still typing, send 'start typing' notification
- LLIMModel::instance().sendTypingState(mSessionID, mOtherParticipantUUID, TRUE);
- mShouldSendTypingState = false;
- }
- }
- else
- {
- // Send 'stop typing' notification immediately
- LLIMModel::instance().sendTypingState(mSessionID, mOtherParticipantUUID, FALSE);
- mShouldSendTypingState = false;
- }
- }
-
- LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
- if (speaker_mgr)
- speaker_mgr->setSpeakerTyping(gAgent.getID(), FALSE);
-
-}
-
-void LLIMFloater::processIMTyping(const LLIMInfo* im_info, BOOL typing)
-{
- if ( typing )
- {
- // other user started typing
- addTypingIndicator(im_info);
- }
- else
- {
- // other user stopped typing
- removeTypingIndicator(im_info);
- }
-}
-
-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)
-{
- LLFontGL* font = LLViewerChat::getChatFont();
- 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();
- floater->mInputEditor->setFont(font);
- }
- }
-
-}
-
-void LLIMFloater::processSessionUpdate(const LLSD& session_update)
-{
- // *TODO : verify following code when moderated mode will be implemented
- if ( false && session_update.has("moderated_mode") &&
- session_update["moderated_mode"].has("voice") )
- {
- BOOL voice_moderated = session_update["moderated_mode"]["voice"];
- const std::string session_label = LLIMModel::instance().getName(mSessionID);
-
- if (voice_moderated)
- {
- setTitle(session_label + std::string(" ") + LLTrans::getString("IM_moderated_chat_label"));
- }
- else
- {
- setTitle(session_label);
- }
-
- // *TODO : uncomment this when/if LLPanelActiveSpeakers panel will be added
- //update the speakers dropdown too
- //mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated);
- }
-}
-
-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)
- {
- uuid_vec_t 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)
- {
- uuid_vec_t 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 uuid_vec_t& 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
- if ( im_info && !mOtherTyping )
- {
- mOtherTyping = true;
-
- // Save and set new title
- mSavedTitle = getTitle();
- setTitle (mTypingStart);
-
- // Update speaker
- LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
- if ( speaker_mgr )
- {
- speaker_mgr->setSpeakerTyping(im_info->mFromID, TRUE);
- }
- }
-}
-
-void LLIMFloater::removeTypingIndicator(const LLIMInfo* im_info)
-{
- if ( mOtherTyping )
- {
- mOtherTyping = false;
-
- // Revert the title to saved one
- setTitle(mSavedTitle);
-
- if ( im_info )
- {
- // Update speaker
- LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
- if ( speaker_mgr )
- {
- speaker_mgr->setSpeakerTyping(im_info->mFromID, FALSE);
- }
- }
-
- }
-}
-
-// static
-void LLIMFloater::closeHiddenIMToasts()
-{
- class IMToastMatcher: public LLNotificationsUI::LLScreenChannel::Matcher
- {
- public:
- bool matches(const LLNotificationPtr notification) const
- {
- // "notifytoast" type of notifications is reserved for IM notifications
- return "notifytoast" == notification->getType();
- }
- };
-
- LLNotificationsUI::LLScreenChannel* channel = LLNotificationsUI::LLChannelManager::getNotificationScreenChannel();
- if (channel != NULL)
- {
- channel->closeHiddenToasts(IMToastMatcher());
- }
-}
-// static
-void LLIMFloater::confirmLeaveCallCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- const LLSD& payload = notification["payload"];
- LLUUID session_id = payload["session_id"];
-
- LLFloater* im_floater = LLFloaterReg::findInstance("impanel", session_id);
- if (option == 0 && im_floater != NULL)
- {
- im_floater->closeFloater();
- }
-
- return;
-}
-
-// static
-bool LLIMFloater::isChatMultiTab()
-{
- // Restart is required in order to change chat window type.
- 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);
- }
-
-}
-
-void LLIMFloater::onClickCloseBtn()
-{
-
- LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(
- mSessionID);
-
- if (session == NULL)
- {
- llwarns << "Empty session." << llendl;
- return;
- }
-
- bool is_call_with_chat = session->isGroupSessionType()
- || session->isAdHocSessionType() || session->isP2PSessionType();
-
- LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
-
- if (is_call_with_chat && voice_channel != NULL && voice_channel->isActive())
- {
- LLSD payload;
- payload["session_id"] = mSessionID;
- LLNotificationsUtil::add("ConfirmLeaveCall", LLSD(), payload, confirmLeaveCallCallback);
- return;
- }
-
- LLFloater::onClickCloseBtn();
-}
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
deleted file mode 100644
index 0f0ae896a2..0000000000
--- a/indra/newview/llimfloatercontainer.cpp
+++ /dev/null
@@ -1,165 +0,0 @@
-/**
- * @file llimfloatercontainer.cpp
- * @brief Multifloater containing active IM sessions in separate tab container tabs
- *
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-#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()
-{
- mNewMessageConnection.disconnect();
- LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this);
-}
-
-BOOL LLIMFloaterContainer::postBuild()
-{
- mNewMessageConnection = 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;
- icon_params.group_id = session_id;
- icon = LLUICtrlFactory::instance().create<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;
- icon_params.avatar_id = avatar_id;
- icon = LLUICtrlFactory::instance().create<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);
- setFocus(TRUE);
-}
-
-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);
- // Hide minimized floater (see EXT-5315)
- setVisible(!b);
-
- if (isMinimized()) return;
-
- if (getActiveFloater())
- {
- getActiveFloater()->setVisible(TRUE);
- }
-}
-
-// EOF
diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h
deleted file mode 100644
index 892ecef48d..0000000000
--- a/indra/newview/llimfloatercontainer.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * @file llimfloatercontainer.h
- * @brief Multifloater containing active IM sessions in separate tab container tabs
- *
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#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;
- boost::signals2::connection mNewMessageConnection;
-
- void onNewMessageReceived(const LLSD& data);
-};
-
-#endif // LL_LLIMFLOATERCONTAINER_H
diff --git a/indra/newview/llimhandler.cpp b/indra/newview/llimhandler.cpp
index 07d73c8c66..c2b29f36e8 100644
--- a/indra/newview/llimhandler.cpp
+++ b/indra/newview/llimhandler.cpp
@@ -36,11 +36,12 @@
using namespace LLNotificationsUI;
+extern void process_dnd_im(const LLSD& notification);
+
//--------------------------------------------------------------------------
-LLIMHandler::LLIMHandler(e_notification_type type, const LLSD& id)
+LLIMHandler::LLIMHandler()
+: LLCommunicationNotificationHandler("IM Notifications", "notifytoast")
{
- mType = type;
-
// Getting a Channel for our notifications
mChannel = LLChannelManager::getInstance()->createNotificationChannel()->getHandle();
}
@@ -59,72 +60,57 @@ void LLIMHandler::initChannel()
}
//--------------------------------------------------------------------------
-bool LLIMHandler::processNotification(const LLSD& notify)
+bool LLIMHandler::processNotification(const LLNotificationPtr& notification)
{
- if(mChannel.isDead())
- {
- return false;
- }
-
- LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());
-
- if(!notification)
- return false;
-
- // arrange a channel on a screen
- if(!mChannel.get()->getVisible())
- {
- initChannel();
- }
-
- if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
- {
- LLSD substitutions = notification->getSubstitutions();
-
- // According to comments in LLIMMgr::addMessage(), if we get message
- // from ourselves, the sender id is set to null. This fixes EXT-875.
- LLUUID avatar_id = substitutions["FROM_ID"].asUUID();
- if (avatar_id.isNull())
- avatar_id = gAgentID;
-
- LLToastIMPanel::Params im_p;
- im_p.notification = notification;
- im_p.avatar_id = avatar_id;
- im_p.from = substitutions["FROM"].asString();
- im_p.time = substitutions["TIME"].asString();
- im_p.message = substitutions["MESSAGE"].asString();
- im_p.session_id = substitutions["SESSION_ID"].asUUID();
-
- LLToastIMPanel* im_box = new LLToastIMPanel(im_p);
-
- LLToast::Params p;
- p.notif_id = notification->getID();
- p.session_id = im_p.session_id;
- p.notification = notification;
- p.panel = im_box;
- p.can_be_stored = false;
- p.on_delete_toast = boost::bind(&LLIMHandler::onDeleteToast, this, _1);
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
- if(channel)
- channel->addToast(p);
-
- // send a signal to the counter manager;
- mNewNotificationSignal();
- }
- else if (notify["sigtype"].asString() == "delete")
- {
- mChannel.get()->killToastByNotificationID(notification->getID());
- }
- return false;
-}
+ if(notification->isDND())
+ {
+ LLSD data = notification->asLLSD(); //don't need this if retrieve needed data from notification getters
+ process_dnd_im(data);
+ }
+ else
+ {
+ if(mChannel.isDead())
+ {
+ return false;
+ }
+
+ // arrange a channel on a screen
+ if(!mChannel.get()->getVisible())
+ {
+ initChannel();
+ }
+
+ LLSD substitutions = notification->getSubstitutions();
+
+ // According to comments in LLIMMgr::addMessage(), if we get message
+ // from ourselves, the sender id is set to null. This fixes EXT-875.
+ LLUUID avatar_id = substitutions["FROM_ID"].asUUID();
+ if (avatar_id.isNull())
+ avatar_id = gAgentID;
+
+ LLToastIMPanel::Params im_p;
+ im_p.notification = notification;
+ im_p.avatar_id = avatar_id;
+ im_p.from = substitutions["FROM"].asString();
+ im_p.time = substitutions["TIME"].asString();
+ im_p.message = substitutions["MESSAGE"].asString();
+ im_p.session_id = substitutions["SESSION_ID"].asUUID();
+
+ LLToastIMPanel* im_box = new LLToastIMPanel(im_p);
+
+ LLToast::Params p;
+ p.notif_id = notification->getID();
+ p.session_id = im_p.session_id;
+ p.notification = notification;
+ p.panel = im_box;
+ p.can_be_stored = false;
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
+ if(channel)
+ channel->addToast(p);
+ }
-//--------------------------------------------------------------------------
-void LLIMHandler::onDeleteToast(LLToast* toast)
-{
- // send a signal to the counter manager
- mDelNotificationSignal();
+ return false;
}
-//--------------------------------------------------------------------------
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index 0250af6a0e..c64ecdc47a 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -171,7 +171,7 @@ LLFloaterIMPanel::LLFloaterIMPanel(const std::string& session_label,
// enable line history support for instant message bar
mInputEditor->setEnableLineHistory(TRUE);
- //*TODO we probably need the same "awaiting message" thing in LLIMFloater
+ //*TODO we probably need the same "awaiting message" thing in LLFloaterIMSession
LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mSessionUUID);
if (!im_session)
{
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 4000570872..8c862548bb 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -29,6 +29,8 @@
#include "llimview.h"
#include "llavatarnamecache.h" // IDEVO
+#include "llavataractions.h"
+#include "llfloaterconversationlog.h"
#include "llfloaterreg.h"
#include "llfontgl.h"
#include "llgl.h"
@@ -41,14 +43,15 @@
#include "lltextutil.h"
#include "lltrans.h"
#include "lluictrlfactory.h"
-
+#include "llfloaterimsessiontab.h"
#include "llagent.h"
#include "llagentui.h"
#include "llappviewer.h"
#include "llavatariconctrl.h"
#include "llcallingcard.h"
#include "llchat.h"
-#include "llimfloater.h"
+#include "llfloaterimsession.h"
+#include "llfloaterimcontainer.h"
#include "llgroupiconctrl.h"
#include "llmd5.h"
#include "llmutelist.h"
@@ -57,12 +60,14 @@
#include "llviewerwindow.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
-#include "llnearbychat.h"
+#include "llfloaterimnearbychat.h"
#include "llspeakers.h" //for LLIMSpeakerMgr
#include "lltextbox.h"
#include "lltoolbarview.h"
#include "llviewercontrol.h"
#include "llviewerparcelmgr.h"
+#include "llconversationlog.h"
+#include "message.h"
const static std::string ADHOC_NAME_SUFFIX(" Conference");
@@ -97,6 +102,47 @@ BOOL LLSessionTimeoutTimer::tick()
return TRUE;
}
+
+
+void process_dnd_im(const LLSD& notification)
+{
+ LLSD data = notification["substitutions"];
+ LLUUID sessionID = data["SESSION_ID"].asUUID();
+ LLUUID fromID = data["FROM_ID"].asUUID();
+
+ //re-create the IM session if needed
+ //(when coming out of DND mode upon app restart)
+ if(!gIMMgr->hasSession(sessionID))
+ {
+ //reconstruct session using data from the notification
+ std::string name = data["FROM"];
+ LLAvatarName av_name;
+ if (LLAvatarNameCache::get(data["FROM_ID"], &av_name))
+ {
+ name = av_name.getDisplayName();
+ }
+
+
+ LLIMModel::getInstance()->newSession(sessionID,
+ name,
+ IM_NOTHING_SPECIAL,
+ fromID,
+ false,
+ false); //will need slight refactor to retrieve whether offline message or not (assume online for now)
+
+ LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container");
+
+ if (im_box)
+ {
+ im_box->flashConversationItemWidget(sessionID, true);
+ }
+
+ }
+}
+
+
+
+
static void on_avatar_name_cache_toast(const LLUUID& agent_id,
const LLAvatarName& av_name,
LLSD msg)
@@ -108,77 +154,183 @@ static void on_avatar_name_cache_toast(const LLUUID& agent_id,
args["FROM"] = av_name.getCompleteName();
args["FROM_ID"] = msg["from_id"];
args["SESSION_ID"] = msg["session_id"];
- LLNotificationsUtil::add("IMToast", args, LLSD(), boost::bind(&LLIMFloater::show, msg["session_id"].asUUID()));
-}
-
-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"])
- {
- return;
- }
-
- // check whether incoming IM belongs to an active session or not
- 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;
- }
-
- // *NOTE Skip toasting if the user disable it in preferences/debug settings ~Alexandrea
- LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(
- msg["session_id"]);
- if (!gSavedSettings.getBOOL("EnableGroupChatPopups")
- && session->isGroupSessionType())
- {
- return;
- }
- if (!gSavedSettings.getBOOL("EnableIMChatPopups")
- && !session->isGroupSessionType())
+ args["SESSION_TYPE"] = msg["session_type"];
+ LLNotificationsUtil::add("IMToast", args, args, boost::bind(&LLFloaterIMContainer::showConversation, LLFloaterIMContainer::getInstance(), msg["session_id"].asUUID()));
+}
+
+void on_new_message(const LLSD& msg)
+{
+ std::string action;
+ LLUUID participant_id = msg["from_id"].asUUID();
+ LLUUID session_id = msg["session_id"].asUUID();
+ LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(session_id);
+
+ // determine action for this session
+
+ if (session_id.isNull())
+ {
+ action = gSavedSettings.getString("NotificationNearbyChatOptions");
+ }
+ else if(session->isP2PSessionType())
+ {
+ if (LLAvatarTracker::instance().isBuddy(participant_id))
+ {
+ action = gSavedSettings.getString("NotificationFriendIMOptions");
+ }
+ else
+ {
+ action = gSavedSettings.getString("NotificationNonFriendIMOptions");
+ }
+ }
+ else if(session->isAdHocSessionType())
+ {
+ action = gSavedSettings.getString("NotificationConferenceIMOptions");
+ }
+ else if(session->isGroupSessionType())
+ {
+ action = gSavedSettings.getString("NotificationGroupChatOptions");
+ }
+
+ // do not show notification which goes from agent
+ if (gAgent.getID() == participant_id)
+ {
+ return;
+ }
+
+ // execution of the action
+
+ LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container");
+ LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(session_id);
+
+ if (im_box->isFrontmost() && im_box->getSelectedSession() == session_id
+ && !(session_floater->getHost() ? im_box->isMinimized() : session_floater->isMinimized()))
{
return;
}
+
+ //session floater not focused (visible or not)
+ bool session_floater_not_focused = session_floater && !session_floater->hasFocus();
+
+ //conv. floater is closed
+ bool conversation_floater_is_closed =
+ !( im_box
+ && im_box->isInVisibleChain()
+ && !im_box->isMinimized());
+
+ //conversation floater not focused (visible or not)
+ bool conversation_floater_not_focused =
+ conversation_floater_is_closed || !im_box->hasFocus();
+ // sess. floater is open
+ bool session_floater_is_open =
+ session_floater
+ && session_floater->isInVisibleChain()
+ && !session_floater->isMinimized()
+ && !(session_floater->getHost() && session_floater->getHost()->isMinimized());
+
+ bool conversation_floater_collapsed = !session_floater->isMessagePaneExpanded();
+ if (("toast" == action && !session_floater_is_open) || conversation_floater_collapsed)
+ {
+ //User is not focused on conversation containing the message
+ if(session_floater_not_focused || conversation_floater_collapsed)
+ {
+ if(!LLMuteList::getInstance()->isMuted(participant_id))
+ {
+ im_box->flashConversationItemWidget(session_id, true);
+ }
+ //The conversation floater isn't focused/open
+ if(conversation_floater_not_focused || conversation_floater_collapsed)
+ {
+ if(!LLMuteList::getInstance()->isMuted(participant_id)
+ && !gAgent.isDoNotDisturb())
+ {
+ gToolBarView->flashCommand(LLCommandId("chat"), true);
+ }
+
+ //Show IM toasts (upper right toasts)
+ // Skip toasting for system messages and for nearby chat
+ if(session_id.notNull() && participant_id.notNull())
+ {
+ LLAvatarNameCache::get(participant_id, boost::bind(&on_avatar_name_cache_toast, _1, _2, msg));
+ }
+ }
+ }
+ }
+
+ else if ("flash" == action)
+ {
+ if (!gAgent.isDoNotDisturb())
+ {
+ im_box->flashConversationItemWidget(session_id, true);
+ if(conversation_floater_not_focused)
+ {
+ //User is not focused on conversation containing the message
+ gToolBarView->flashCommand(LLCommandId("chat"), true);
+ }
+ }
+ else if(session_id.notNull() && participant_id.notNull())
+ {
+ //If a DND message, allow notification to be stored so upon DND exit
+ //useMostItrusiveIMNotification will be called to notify user a message exists
+ LLAvatarNameCache::get(participant_id, boost::bind(&on_avatar_name_cache_toast, _1, _2, msg));
+ }
+ }
- // 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;
- }
+ else if("openconversations" == action)
+ {
+ //User is not focused on conversation containing the message
+ if(session_floater_not_focused)
+ {
+ //Flash line item
+ im_box->flashConversationItemWidget(session_id, true);
- LLAvatarNameCache::get(msg["from_id"].asUUID(),
- boost::bind(&on_avatar_name_cache_toast,
- _1, _2, msg));
-}
-
-void LLIMModel::setActiveSessionID(const LLUUID& session_id)
-{
- // check if such an ID really exists
- if (!findIMSession(session_id))
- {
- llwarns << "Trying to set as active a non-existent session!" << llendl;
- return;
- }
+ if(!gAgent.isDoNotDisturb())
+ {
+ //Surface conversations floater
+ LLFloaterReg::showInstance("im_container");
+ im_box->collapseMessagesPane(false);
+ if (session_floater)
+ {
+ if (session_floater->getHost())
+ {
+ if (NULL != im_box && im_box->isMinimized())
+ {
+ LLFloater::onClickMinimize(im_box);
+ }
+ }
+ else
+ {
+ if (session_floater->isMinimized())
+ {
+ LLFloater::onClickMinimize(session_floater);
+ }
+ }
+ }
+ }
- mActiveSessionID = session_id;
+ //If in DND mode, allow notification to be stored so upon DND exit
+ //useMostItrusiveIMNotification will be called to notify user a message exists
+ if(session_id.notNull()
+ && participant_id.notNull()
+ && gAgent.isDoNotDisturb()
+ && !session_floater_is_open)
+ {
+ LLAvatarNameCache::get(participant_id, boost::bind(&on_avatar_name_cache_toast, _1, _2, msg));
+ }
+ }
+ }
}
LLIMModel::LLIMModel()
{
- addNewMsgCallback(boost::bind(&LLIMFloater::newIMCallback, _1));
- addNewMsgCallback(boost::bind(&toast_callback, _1));
+ addNewMsgCallback(boost::bind(&LLFloaterIMSession::newIMCallback, _1));
+ addNewMsgCallback(boost::bind(&on_new_message, _1));
}
-LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice)
+LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice, bool has_offline_msg)
: mSessionID(session_id),
mName(name),
mType(type),
+ mHasOfflineMessage(has_offline_msg),
mParticipantUnreadMessageCount(0),
mNumUnread(0),
mOtherParticipantID(other_participant_id),
@@ -190,7 +342,8 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
mTextIMPossible(true),
mOtherParticipantIsAvatar(true),
mStartCallOnInitialize(false),
- mStartedAsIMCall(voice)
+ mStartedAsIMCall(voice),
+ mAvatarNameCacheConnection()
{
// set P2P type by default
mSessionType = P2P_SESSION;
@@ -256,30 +409,22 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
}
buildHistoryFileName();
-
- if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") )
- {
- std::list<LLSD> chat_history;
-
- //involves parsing of a chat history
- LLLogChat::loadAllHistory(mHistoryFileName, chat_history);
- addMessagesFromHistory(chat_history);
- }
+ loadHistory();
// Localizing name of ad-hoc session. STORM-153
// Changing name should happen here- after the history file was created, so that
// history files have consistent (English) names in different locales.
if (isAdHocSessionType() && IM_SESSION_INVITE == mType)
{
- LLAvatarNameCache::get(mOtherParticipantID,
- boost::bind(&LLIMModel::LLIMSession::onAdHocNameCache,
- this, _2));
+ mAvatarNameCacheConnection = LLAvatarNameCache::get(mOtherParticipantID,boost::bind(&LLIMModel::LLIMSession::onAdHocNameCache,this, _2));
}
}
void LLIMModel::LLIMSession::onAdHocNameCache(const LLAvatarName& av_name)
{
- if (av_name.mIsTemporaryName)
+ mAvatarNameCacheConnection.disconnect();
+
+ if (!av_name.isValidName())
{
S32 separator_index = mName.rfind(" ");
std::string name = mName.substr(0, separator_index);
@@ -375,6 +520,8 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
break;
}
}
+ default:
+ break;
}
// Update speakers list when connected
if (LLVoiceChannel::STATE_CONNECTED == new_state)
@@ -385,6 +532,11 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
LLIMModel::LLIMSession::~LLIMSession()
{
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+
delete mSpeakers;
mSpeakers = NULL;
@@ -450,11 +602,11 @@ void LLIMModel::LLIMSession::addMessagesFromHistory(const std::list<LLSD>& histo
{
const LLSD& msg = *it;
- std::string from = msg[IM_FROM];
+ std::string from = msg[LL_IM_FROM];
LLUUID from_id;
- if (msg[IM_FROM_ID].isDefined())
+ if (msg[LL_IM_FROM_ID].isDefined())
{
- from_id = msg[IM_FROM_ID].asUUID();
+ from_id = msg[LL_IM_FROM_ID].asUUID();
}
else
{
@@ -463,8 +615,8 @@ void LLIMModel::LLIMSession::addMessagesFromHistory(const std::list<LLSD>& histo
gCacheName->getUUID(legacy_name, from_id);
}
- std::string timestamp = msg[IM_TIME];
- std::string text = msg[IM_TEXT];
+ std::string timestamp = msg[LL_IM_TIME];
+ std::string text = msg[LL_IM_TEXT];
addMessage(from, from_id, text, timestamp, true);
@@ -488,10 +640,23 @@ void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const
}
}
+void LLIMModel::LLIMSession::loadHistory()
+{
+ mMsgs.clear();
+
+ if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") )
+ {
+ std::list<LLSD> chat_history;
+
+ //involves parsing of a chat history
+ LLLogChat::loadChatHistory(mHistoryFileName, chat_history);
+ addMessagesFromHistory(chat_history);
+ }
+}
+
LLIMModel::LLIMSession* LLIMModel::findIMSession(const LLUUID& session_id) const
{
- return get_if_there(mId2SessionMap, session_id,
- (LLIMModel::LLIMSession*) NULL);
+ return get_if_there(mId2SessionMap, session_id, (LLIMModel::LLIMSession*) NULL);
}
//*TODO consider switching to using std::set instead of std::list for holding LLUUIDs across the whole code
@@ -533,7 +698,7 @@ LLIMModel::LLIMSession* LLIMModel::findAdHocIMSession(const uuid_vec_t& ids)
return NULL;
}
-bool LLIMModel::LLIMSession::isOutgoingAdHoc()
+bool LLIMModel::LLIMSession::isOutgoingAdHoc() const
{
return IM_SESSION_CONFERENCE_START == mType;
}
@@ -553,6 +718,19 @@ bool LLIMModel::LLIMSession::isOtherParticipantAvaline()
return !mOtherParticipantIsAvatar;
}
+LLUUID LLIMModel::LLIMSession::generateOutgouigAdHocHash() const
+{
+ LLUUID hash = LLUUID::null;
+
+ if (mInitialTargetIDs.size())
+ {
+ std::set<LLUUID> sorted_uuids(mInitialTargetIDs.begin(), mInitialTargetIDs.end());
+ hash = generateHash(sorted_uuids);
+ }
+
+ return hash;
+}
+
void LLIMModel::LLIMSession::buildHistoryFileName()
{
mHistoryFileName = mName;
@@ -569,7 +747,7 @@ void LLIMModel::LLIMSession::buildHistoryFileName()
if (mInitialTargetIDs.size())
{
std::set<LLUUID> sorted_uuids(mInitialTargetIDs.begin(), mInitialTargetIDs.end());
- mHistoryFileName = mName + " hash" + generateHash(sorted_uuids);
+ mHistoryFileName = mName + " hash" + generateHash(sorted_uuids).asString();
}
else
{
@@ -584,15 +762,7 @@ void LLIMModel::LLIMSession::buildHistoryFileName()
// so no need for a callback in LLAvatarNameCache::get()
if (LLAvatarNameCache::get(mOtherParticipantID, &av_name))
{
- if (av_name.mUsername.empty())
- {
- // Display names are off, use mDisplayName which will be the legacy name
- mHistoryFileName = LLCacheName::buildUsername(av_name.mDisplayName);
- }
- else
- {
- mHistoryFileName = av_name.mUsername;
- }
+ mHistoryFileName = LLCacheName::buildUsername(av_name.getUserName());
}
else
{
@@ -603,7 +773,7 @@ void LLIMModel::LLIMSession::buildHistoryFileName()
}
//static
-std::string LLIMModel::LLIMSession::generateHash(const std::set<LLUUID>& sorted_uuids)
+LLUUID LLIMModel::LLIMSession::generateHash(const std::set<LLUUID>& sorted_uuids)
{
LLMD5 md5_uuid;
@@ -617,7 +787,7 @@ std::string LLIMModel::LLIMSession::generateHash(const std::set<LLUUID>& sorted_
LLUUID participants_md5_hash;
md5_uuid.raw_digest((unsigned char*) participants_md5_hash.mData);
- return participants_md5_hash.asString();
+ return participants_md5_hash;
}
void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id)
@@ -631,16 +801,19 @@ void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, con
{
mId2SessionMap.erase(old_session_id);
mId2SessionMap[new_session_id] = session;
-
- gIMMgr->notifyObserverSessionIDUpdated(old_session_id, new_session_id);
}
- LLIMFloater* im_floater = LLIMFloater::findInstance(old_session_id);
+ LLFloaterIMSession* im_floater = LLFloaterIMSession::findInstance(old_session_id);
if (im_floater)
{
im_floater->sessionInitReplyReceived(new_session_id);
}
+ if (old_session_id != new_session_id)
+ {
+ gIMMgr->notifyObserverSessionIDUpdated(old_session_id, new_session_id);
+ }
+
// auto-start the call on session initialization?
if (session->mStartCallOnInitialize)
{
@@ -676,7 +849,7 @@ void LLIMModel::testMessages()
//session name should not be empty
bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type,
- const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice)
+ const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice, bool has_offline_msg)
{
if (name.empty())
{
@@ -690,22 +863,23 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co
return false;
}
- LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids, voice);
+ LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids, voice, has_offline_msg);
mId2SessionMap[session_id] = session;
// When notifying observer, name of session is used instead of "name", because they may not be the
// same if it is an adhoc session (in this case name is localized in LLIMSession constructor).
std::string session_name = LLIMModel::getInstance()->getName(session_id);
- LLIMMgr::getInstance()->notifyObserverSessionAdded(session_id, session_name, other_participant_id);
+ LLIMMgr::getInstance()->notifyObserverSessionAdded(session_id, session_name, other_participant_id,has_offline_msg);
return true;
}
-bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, bool voice)
+bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, bool voice, bool has_offline_msg)
{
- uuid_vec_t no_ids;
- return newSession(session_id, name, type, other_participant_id, no_ids, voice);
+ uuid_vec_t ids;
+ ids.push_back(other_participant_id);
+ return newSession(session_id, name, type, other_participant_id, ids, voice, has_offline_msg);
}
bool LLIMModel::clearSession(const LLUUID& session_id)
@@ -716,6 +890,16 @@ bool LLIMModel::clearSession(const LLUUID& session_id)
return true;
}
+void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index, const bool sendNoUnreadMsgs)
+{
+ getMessagesSilently(session_id, messages, start_index);
+
+ if (sendNoUnreadMsgs)
+ {
+ sendNoUnreadMessages(session_id);
+ }
+}
+
void LLIMModel::getMessagesSilently(const LLUUID& session_id, std::list<LLSD>& messages, int start_index)
{
LLIMSession* session = findIMSession(session_id);
@@ -757,13 +941,6 @@ void LLIMModel::sendNoUnreadMessages(const LLUUID& session_id)
mNoUnreadMsgsSignal(arg);
}
-void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index)
-{
- getMessagesSilently(session_id, messages, start_index);
-
- sendNoUnreadMessages(session_id);
-}
-
bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text) {
LLIMSession* session = findIMSession(session_id);
@@ -781,19 +958,20 @@ bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from,
bool LLIMModel::logToFile(const std::string& file_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
{
- if (gSavedPerAccountSettings.getBOOL("LogInstantMessages"))
+ if (gSavedPerAccountSettings.getS32("KeepConversationLogTranscripts") > 1)
{
std::string from_name = from;
LLAvatarName av_name;
if (!from_id.isNull() &&
LLAvatarNameCache::get(from_id, &av_name) &&
- !av_name.mIsDisplayNameDefault)
+ !av_name.isDisplayNameDefault())
{
from_name = av_name.getCompleteName();
}
LLLogChat::saveHistory(file_name, from_name, from_id, utf8_text);
+ LLConversationLog::instance().cache(); // update the conversation log too
return true;
}
else
@@ -831,6 +1009,7 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co
arg["from"] = from;
arg["from_id"] = from_id;
arg["time"] = LLLogChat::timestamp(false);
+ arg["session_type"] = session->mSessionType;
mNewMsgSignal(arg);
return true;
@@ -878,7 +1057,7 @@ const std::string LLIMModel::getName(const LLUUID& session_id) const
{
LLIMSession* session = findIMSession(session_id);
- if (!session)
+ if (!session)
{
llwarns << "session " << session_id << "does not exist " << llendl;
return LLTrans::getString("no_session_message");
@@ -904,7 +1083,7 @@ const LLUUID& LLIMModel::getOtherParticipantID(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 LLUUID::null;
}
@@ -1376,7 +1555,7 @@ public:
&& LLIMModel::getInstance()->findIMSession(mSessionID))
{
// TODO remove in 2010, for voice calls we do not open an IM window
- //LLIMFloater::show(mSessionID);
+ //LLFloaterIMSession::show(mSessionID);
}
gIMMgr->clearPendingAgentListUpdates(mSessionID);
@@ -1444,6 +1623,11 @@ LLUUID LLIMMgr::computeSessionID(
session_id = other_participant_id ^ agent_id;
}
}
+
+ if (gAgent.isInGroup(session_id) && (session_id != other_participant_id))
+ {
+ llwarns << "Group session id different from group id: IM type = " << dialog << ", session id = " << session_id << ", group id = " << other_participant_id << llendl;
+ }
return session_id;
}
@@ -1520,7 +1704,7 @@ LLIMMgr::onConfirmForceCloseError(
//only 1 option really
LLUUID session_id = notification["payload"]["session_id"];
- LLFloater* floater = LLIMFloater::findInstance(session_id);
+ LLFloater* floater = LLFloaterIMSession::findInstance(session_id);
if ( floater )
{
floater->closeFloater(FALSE);
@@ -1878,7 +2062,7 @@ void LLOutgoingCallDialog::show(const LLSD& key)
LLAvatarName av_name;
if (LLAvatarNameCache::get(callee_id, &av_name))
{
- final_callee_name = av_name.mDisplayName;
+ final_callee_name = av_name.getDisplayName();
title = av_name.getCompleteName();
}
}
@@ -1980,7 +2164,8 @@ BOOL LLOutgoingCallDialog::postBuild()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LLIncomingCallDialog::LLIncomingCallDialog(const LLSD& payload) :
-LLCallDialog(payload)
+LLCallDialog(payload),
+mAvatarNameCacheConnection()
{
}
@@ -2050,9 +2235,11 @@ BOOL LLIncomingCallDialog::postBuild()
else
{
// Get the full name information
- LLAvatarNameCache::get(caller_id,
- boost::bind(&LLIncomingCallDialog::onAvatarNameCache,
- this, _1, _2, call_type));
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+ mAvatarNameCacheConnection = LLAvatarNameCache::get(caller_id, boost::bind(&LLIncomingCallDialog::onAvatarNameCache, this, _1, _2, call_type));
}
setIcon(session_id, caller_id);
@@ -2078,7 +2265,6 @@ BOOL LLIncomingCallDialog::postBuild()
getChildView("Start IM")->setVisible( is_avatar && notify_box_type != "VoiceInviteAdHoc" && notify_box_type != "VoiceInviteGroup");
setCanDrag(FALSE);
-
return TRUE;
}
@@ -2086,7 +2272,6 @@ void LLIncomingCallDialog::setCallerName(const std::string& ui_title,
const std::string& ui_label,
const std::string& call_type)
{
- setTitle(ui_title);
// call_type may be a string like " is calling."
LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name");
@@ -2097,14 +2282,15 @@ void LLIncomingCallDialog::onAvatarNameCache(const LLUUID& agent_id,
const LLAvatarName& av_name,
const std::string& call_type)
{
+ mAvatarNameCacheConnection.disconnect();
std::string title = av_name.getCompleteName();
- setCallerName(title, av_name.mDisplayName, call_type);
+ setCallerName(title, av_name.getCompleteName(), call_type);
}
void LLIncomingCallDialog::onOpen(const LLSD& key)
{
LLCallDialog::onOpen(key);
-
+ make_ui_sound("UISndStartIM");
LLStringUtil::format_map_t args;
LLGroupData data;
// if it's a group call, retrieve group name to use it in question
@@ -2112,18 +2298,6 @@ void LLIncomingCallDialog::onOpen(const LLSD& key)
{
args["[GROUP]"] = data.mName;
}
- // tell the user which voice channel they would be leaving
- LLVoiceChannel *voice = LLVoiceChannel::getCurrentVoiceChannel();
- if (voice && !voice->getSessionName().empty())
- {
- args["[CURRENT_CHAT]"] = voice->getSessionName();
- getChild<LLUICtrl>("question")->setValue(getString(key["question_type"].asString(), args));
- }
- else
- {
- args["[CURRENT_CHAT]"] = getString("localchat");
- getChild<LLUICtrl>("question")->setValue(getString(key["question_type"].asString(), args));
- }
}
//static
@@ -2184,6 +2358,10 @@ void LLIncomingCallDialog::processCallResponse(S32 response, const LLSD &payload
{
gIMMgr->startCall(session_id, LLVoiceChannel::INCOMING_CALL);
}
+ else
+ {
+ LLAvatarActions::startIM(caller_id);
+ }
gIMMgr->clearPendingAgentListUpdates(session_id);
gIMMgr->clearPendingInvitation(session_id);
@@ -2386,7 +2564,7 @@ LLIMMgr::LLIMMgr()
mPendingInvitations = LLSD::emptyMap();
mPendingAgentListUpdates = LLSD::emptyMap();
- LLIMModel::getInstance()->addNewMsgCallback(boost::bind(&LLIMFloater::sRemoveTypingIndicator, _1));
+ LLIMModel::getInstance()->addNewMsgCallback(boost::bind(&LLFloaterIMSession::sRemoveTypingIndicator, _1));
}
// Add a message to a session.
@@ -2395,6 +2573,7 @@ void LLIMMgr::addMessage(
const LLUUID& target_id,
const std::string& from,
const std::string& msg,
+ bool is_offline_msg,
const std::string& session_name,
EInstantMessage dialog,
U32 parent_estate_id,
@@ -2403,6 +2582,7 @@ void LLIMMgr::addMessage(
bool link_name) // If this is true, then we insert the name and link it to a profile
{
LLUUID other_participant_id = target_id;
+
LLUUID new_session_id = session_id;
if (new_session_id.isNull())
{
@@ -2412,15 +2592,22 @@ void LLIMMgr::addMessage(
//*NOTE session_name is empty in case of incoming P2P sessions
std::string fixed_session_name = from;
+ bool name_is_setted = false;
if(!session_name.empty() && session_name.size()>1)
{
fixed_session_name = session_name;
+ name_is_setted = true;
}
bool new_session = !hasSession(new_session_id);
if (new_session)
{
- LLIMModel::getInstance()->newSession(new_session_id, fixed_session_name, dialog, other_participant_id);
+ LLAvatarName av_name;
+ if (LLAvatarNameCache::get(other_participant_id, &av_name) && !name_is_setted)
+ {
+ fixed_session_name = av_name.getDisplayName();
+ }
+ LLIMModel::getInstance()->newSession(new_session_id, fixed_session_name, dialog, other_participant_id, false, is_offline_msg);
// 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
@@ -2455,16 +2642,35 @@ void LLIMMgr::addMessage(
return;
}
- make_ui_sound("UISndNewIncomingIMSession");
+ //Play sound for new conversations
+ if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation") == TRUE))
+ {
+ make_ui_sound("UISndNewIncomingIMSession");
+ }
}
- bool skip_message = (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") &&
- LLAvatarTracker::instance().getBuddyInfo(other_participant_id) == NULL);
+ bool skip_message = false;
+ if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly"))
+ {
+ // Evaluate if we need to skip this message when that setting is true (default is false)
+ LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(new_session_id);
+ skip_message = (LLAvatarTracker::instance().getBuddyInfo(other_participant_id) == NULL); // Skip non friends...
+ skip_message &= !session->isGroupSessionType(); // Do not skip group chats...
+ skip_message &= !(other_participant_id == gAgentID); // You are your best friend... Don't skip yourself
+ }
if (!LLMuteList::getInstance()->isMuted(other_participant_id, LLMute::flagTextChat) && !skip_message)
{
LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg);
}
+
+ // Open conversation floater if offline messages are present
+ if (is_offline_msg)
+ {
+ LLFloaterReg::showInstance("im_container");
+ LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container")->
+ flashConversationItemWidget(new_session_id, true);
+ }
}
void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& message_name, const LLSD& args)
@@ -2479,11 +2685,9 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess
LLChat chat(message);
chat.mSourceType = CHAT_SOURCE_SYSTEM;
-
- LLFloater* chat_bar = LLFloaterReg::getInstance("chat_bar");
- LLNearbyChat* nearby_chat = chat_bar->findChild<LLNearbyChat>("nearby_chat");
- if(nearby_chat)
+ LLFloaterIMNearbyChat* nearby_chat = LLFloaterReg::findTypedInstance<LLFloaterIMNearbyChat>("nearby_chat");
+ if (nearby_chat)
{
nearby_chat->addMessage(chat);
}
@@ -2497,6 +2701,7 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess
gIMMgr->addMessage(session_id, LLUUID::null, SYSTEM_FROM, message.getString());
}
// log message to file
+
else
{
std::string session_name;
@@ -2579,7 +2784,8 @@ LLUUID LLIMMgr::addSession(
{
LLDynamicArray<LLUUID> ids;
ids.put(other_participant_id);
- return addSession(name, dialog, other_participant_id, ids, voice);
+ LLUUID session_id = addSession(name, dialog, other_participant_id, ids, voice);
+ return session_id;
}
// Adds a session using the given session_id. If the session already exists
@@ -2588,7 +2794,8 @@ LLUUID LLIMMgr::addSession(
const std::string& name,
EInstantMessage dialog,
const LLUUID& other_participant_id,
- const LLDynamicArray<LLUUID>& ids, bool voice)
+ const LLDynamicArray<LLUUID>& ids, bool voice,
+ const LLUUID& floater_id)
{
if (0 == ids.getLength())
{
@@ -2603,7 +2810,21 @@ LLUUID LLIMMgr::addSession(
LLUUID session_id = computeSessionID(dialog,other_participant_id);
- bool new_session = !LLIMModel::getInstance()->findIMSession(session_id);
+ if (floater_id.notNull())
+ {
+ LLFloaterIMSession* im_floater = LLFloaterIMSession::findInstance(floater_id);
+
+ if (im_floater)
+ {
+ // The IM floater should be initialized with a new session_id
+ // so that it is found by that id when creating a chiclet in LLFloaterIMSession::onIMChicletCreated,
+ // and a new floater is not created.
+ im_floater->initIMSession(session_id);
+ im_floater->reloadMessages();
+ }
+ }
+
+ bool new_session = (LLIMModel::getInstance()->findIMSession(session_id) == NULL);
//works only for outgoing ad-hoc sessions
if (new_session && IM_SESSION_CONFERENCE_START == dialog && ids.size())
@@ -2616,10 +2837,17 @@ LLUUID LLIMMgr::addSession(
}
}
+ //Notify observers that a session was added
if (new_session)
{
LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids, voice);
}
+ //Notifies observers that the session was already added
+ else
+ {
+ std::string session_name = LLIMModel::getInstance()->getName(session_id);
+ LLIMMgr::getInstance()->notifyObserverSessionActivated(session_id, session_name, other_participant_id);
+ }
//we don't need to show notes about online/offline, mute/unmute users' statuses for existing sessions
if (!new_session) return session_id;
@@ -2634,6 +2862,8 @@ LLUUID LLIMMgr::addSession(
noteMutedUsers(session_id, ids);
}
+ notifyObserverSessionVoiceOrIMStarted(session_id);
+
return session_id;
}
@@ -2739,12 +2969,17 @@ void LLIMMgr::inviteToSession(
if (voice_invite)
{
- if ( // if we are rejecting group calls
- (gSavedSettings.getBOOL("VoiceCallsRejectGroup") && notify_box_type == "VoiceInviteGroup") ||
- // or we're rejecting non-friend voice calls and this isn't a friend
- (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL))
- )
+ bool isRejectGroupCall = (gSavedSettings.getBOOL("VoiceCallsRejectGroup") && (notify_box_type == "VoiceInviteGroup"));
+ bool isRejectNonFriendCall = (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL));
+ bool isRejectDoNotDisturb = (gAgent.isDoNotDisturb() && !hasSession(session_id));
+ if (isRejectGroupCall || isRejectNonFriendCall || isRejectDoNotDisturb)
{
+ if (isRejectDoNotDisturb && !isRejectGroupCall && !isRejectNonFriendCall)
+ {
+ LLSD args;
+ addSystemMessage(session_id, "you_auto_rejected_call", args);
+ send_do_not_disturb_message(gMessageSystem, caller_id, session_id);
+ }
// silently decline the call
LLIncomingCallDialog::processCallResponse(1, payload);
return;
@@ -2806,7 +3041,7 @@ void LLIMMgr::clearPendingInvitation(const LLUUID& session_id)
void LLIMMgr::processAgentListUpdates(const LLUUID& session_id, const LLSD& body)
{
- LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+ LLFloaterIMSession* im_floater = LLFloaterIMSession::findInstance(session_id);
if ( im_floater )
{
im_floater->processAgentListUpdates(body);
@@ -2912,11 +3147,27 @@ void LLIMMgr::clearPendingAgentListUpdates(const LLUUID& session_id)
}
}
-void LLIMMgr::notifyObserverSessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
+void LLIMMgr::notifyObserverSessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id, bool has_offline_msg)
{
for (session_observers_list_t::iterator it = mSessionObservers.begin(); it != mSessionObservers.end(); it++)
{
- (*it)->sessionAdded(session_id, name, other_participant_id);
+ (*it)->sessionAdded(session_id, name, other_participant_id, has_offline_msg);
+ }
+}
+
+void LLIMMgr::notifyObserverSessionActivated(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
+{
+ for (session_observers_list_t::iterator it = mSessionObservers.begin(); it != mSessionObservers.end(); it++)
+ {
+ (*it)->sessionActivated(session_id, name, other_participant_id);
+ }
+}
+
+void LLIMMgr::notifyObserverSessionVoiceOrIMStarted(const LLUUID& session_id)
+{
+ for (session_observers_list_t::iterator it = mSessionObservers.begin(); it != mSessionObservers.end(); it++)
+ {
+ (*it)->sessionVoiceOrIMStarted(session_id);
}
}
@@ -3016,7 +3267,7 @@ void LLIMMgr::noteOfflineUsers(
{
LLUIString offline = LLTrans::getString("offline_message");
// Use display name only because this user is your friend
- offline.setArg("[NAME]", av_name.mDisplayName);
+ offline.setArg("[NAME]", av_name.getDisplayName());
im_model.proccessOnlineOfflineNotification(session_id, offline);
}
}
@@ -3064,7 +3315,7 @@ 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);
- LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+ LLFloaterIMSession* im_floater = LLFloaterIMSession::findInstance(session_id);
if ( im_floater )
{
im_floater->processIMTyping(im_info, typing);
@@ -3109,7 +3360,7 @@ public:
speaker_mgr->updateSpeakers(gIMMgr->getPendingAgentListUpdates(session_id));
}
- LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+ LLFloaterIMSession* im_floater = LLFloaterIMSession::findInstance(session_id);
if ( im_floater )
{
if ( body.has("session_info") )
@@ -3203,7 +3454,7 @@ public:
const LLSD& input) const
{
LLUUID session_id = input["body"]["session_id"].asUUID();
- LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+ LLFloaterIMSession* im_floater = LLFloaterIMSession::findInstance(session_id);
if ( im_floater )
{
im_floater->processSessionUpdate(input["body"]["info"]);
@@ -3248,13 +3499,11 @@ public:
time_t timestamp =
(time_t) message_params["timestamp"].asInteger();
- BOOL is_busy = gAgent.getBusy();
- BOOL is_muted = LLMuteList::getInstance()->isMuted(
- from_id,
- name,
- LLMute::flagTextChat);
+ BOOL is_do_not_disturb = gAgent.isDoNotDisturb();
- if (is_busy || is_muted)
+ //don't return if user is muted b/c proper way to ignore a muted user who
+ //initiated an adhoc/group conference is to create then leave the session (see STORM-1731)
+ if (is_do_not_disturb)
{
return;
}
@@ -3279,6 +3528,7 @@ public:
from_id,
name,
buffer,
+ IM_OFFLINE == offline,
std::string((char*)&bin_bucket[0]),
IM_SESSION_INVITE,
message_params["parent_estate_id"].asInteger(),
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 7c2cd03d97..da6039a3ae 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -27,7 +27,7 @@
#ifndef LL_LLIMVIEW_H
#define LL_LLIMVIEW_H
-#include "lldockablefloater.h"
+#include "../llui/lldockablefloater.h"
#include "lleventtimer.h"
#include "llinstantmessage.h"
@@ -70,10 +70,11 @@ public:
GROUP_SESSION,
ADHOC_SESSION,
AVALINE_SESSION,
+ NONE_SESSION,
} SType;
LLIMSession(const LLUUID& session_id, const std::string& name,
- const EInstantMessage& type, const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice);
+ const EInstantMessage& type, const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice, bool has_offline_msg);
virtual ~LLIMSession();
void sessionInitReplyReceived(const LLUUID& new_session_id);
@@ -84,7 +85,7 @@ public:
/** @deprecated */
static void chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata);
- bool isOutgoingAdHoc();
+ bool isOutgoingAdHoc() const;
bool isAdHoc();
bool isP2P();
bool isOtherParticipantAvaline();
@@ -94,10 +95,14 @@ public:
bool isGroupSessionType() const { return mSessionType == GROUP_SESSION;}
bool isAvalineSessionType() const { return mSessionType == AVALINE_SESSION;}
+ LLUUID generateOutgouigAdHocHash() const;
+
//*TODO make private
/** ad-hoc sessions involve sophisticated chat history file naming schemes */
void buildHistoryFileName();
+ void loadHistory();
+
LLUUID mSessionID;
std::string mName;
EInstantMessage mType;
@@ -133,22 +138,18 @@ public:
//if IM session is created for a voice call
bool mStartedAsIMCall;
+ bool mHasOfflineMessage;
+
private:
void onAdHocNameCache(const LLAvatarName& av_name);
- static std::string generateHash(const std::set<LLUUID>& sorted_uuids);
+ static LLUUID generateHash(const std::set<LLUUID>& sorted_uuids);
+ boost::signals2::connection mAvatarNameCacheConnection;
};
LLIMModel();
-
- //we should control the currently active session
- LLUUID mActiveSessionID;
- void setActiveSessionID(const LLUUID& session_id);
- void resetActiveSessionID() { mActiveSessionID.setNull(); }
- LLUUID getActiveSessionID() { return mActiveSessionID; }
-
/** Session id to session object */
std::map<LLUUID, LLIMSession*> mId2SessionMap;
@@ -181,10 +182,10 @@ public:
* @param name session name should not be empty, will return false if empty
*/
bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id,
- const uuid_vec_t& ids, bool voice = false);
+ const uuid_vec_t& ids, bool voice = false, bool has_offline_msg = false);
bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type,
- const LLUUID& other_participant_id, bool voice = false);
+ const LLUUID& other_participant_id, bool voice = false, bool has_offline_msg = false);
/**
* Remove all session data associated with a session specified by session_id
@@ -192,12 +193,6 @@ public:
bool clearSession(const LLUUID& session_id);
/**
- * Populate supplied std::list with messages starting from index specified by start_index without
- * emitting no unread messages signal.
- */
- void getMessagesSilently(const LLUUID& session_id, std::list<LLSD>& messages, int start_index = 0);
-
- /**
* Sends no unread messages signal.
*/
void sendNoUnreadMessages(const LLUUID& session_id);
@@ -205,7 +200,7 @@ public:
/**
* Populate supplied std::list with messages starting from index specified by start_index
*/
- void getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index = 0);
+ void getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index = 0, const bool sendNoUnreadMsgs = true);
/**
* Add a message to an IM Model - the message is saved in a message store associated with a session specified by session_id
@@ -288,6 +283,12 @@ public:
private:
/**
+ * Populate supplied std::list with messages starting from index specified by start_index without
+ * emitting no unread messages signal.
+ */
+ void getMessagesSilently(const LLUUID& session_id, std::list<LLSD>& messages, int start_index = 0);
+
+ /**
* Add message to a list of message associated with session specified by session_id
*/
bool addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);
@@ -297,7 +298,9 @@ class LLIMSessionObserver
{
public:
virtual ~LLIMSessionObserver() {}
- virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) = 0;
+ virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id, BOOL has_offline_msg) = 0;
+ virtual void sessionActivated(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) = 0;
+ virtual void sessionVoiceOrIMStarted(const LLUUID& session_id) = 0;
virtual void sessionRemoved(const LLUUID& session_id) = 0;
virtual void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id) = 0;
};
@@ -324,6 +327,7 @@ public:
const LLUUID& target_id,
const std::string& from,
const std::string& msg,
+ bool is_offline_msg = false,
const std::string& session_name = LLStringUtil::null,
EInstantMessage dialog = IM_NOTHING_SPECIAL,
U32 parent_estate_id = 0,
@@ -347,10 +351,12 @@ public:
// Adds a session using a specific group of starting agents
// the dialog type is assumed correct. Returns the uuid of the session.
+ // A session can be added to a floater specified by floater_id.
LLUUID addSession(const std::string& name,
EInstantMessage dialog,
const LLUUID& other_participant_id,
- const LLDynamicArray<LLUUID>& ids, bool voice = false);
+ const LLDynamicArray<LLUUID>& ids, bool voice = false,
+ const LLUUID& floater_id = LLUUID::null);
/**
* Creates a P2P session with the requisite handle for responding to voice calls.
@@ -459,7 +465,10 @@ private:
static void onInviteNameLookup(LLSD payload, const LLUUID& id, const std::string& name, bool is_group);
- void notifyObserverSessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id);
+ void notifyObserverSessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id, bool has_offline_msg);
+ //Triggers when a session has already been added
+ void notifyObserverSessionActivated(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id);
+ void notifyObserverSessionVoiceOrIMStarted(const LLUUID& session_id);
void notifyObserverSessionRemoved(const LLUUID& session_id);
void notifyObserverSessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
@@ -541,7 +550,14 @@ class LLIncomingCallDialog : public LLCallDialog
{
public:
LLIncomingCallDialog(const LLSD& payload);
-
+ ~LLIncomingCallDialog()
+ {
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+ }
+
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
@@ -558,6 +574,8 @@ private:
const LLAvatarName& av_name,
const std::string& call_type);
+ boost::signals2::connection mAvatarNameCacheConnection;
+
/*virtual*/ void onLifetimeExpired();
};
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index 17d0b0ffbb..1e15dc832c 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -29,37 +29,24 @@
// viewer files
#include "llagent.h"
-#include "llagentdata.h"
#include "llavataractions.h"
+#include "llavatariconctrl.h"
#include "llavatarnamecache.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 "llslurl.h"
#include "llstartup.h"
-#include "llspeakers.h"
-#include "llviewermenu.h"
#include "llvoiceclient.h"
-#include "llviewerobjectlist.h"
#include "lltransientfloatermgr.h"
-#include "llnotificationsutil.h"
// Linden libraries
#include "llfloater.h"
#include "llfloaterreg.h"
-#include "llmenubutton.h"
#include "lltextbox.h"
-#include "lltoggleablemenu.h"
#include "lltooltip.h" // positionViewNearMouse()
#include "lltrans.h"
-#include "lluictrl.h"
-
-#include "llavatariconctrl.h"
class LLFetchAvatarData;
@@ -80,70 +67,30 @@ public:
// Inspector will be positioned relative to current mouse position
LLInspectAvatar(const LLSD& avatar_id);
virtual ~LLInspectAvatar();
-
+
/*virtual*/ BOOL postBuild(void);
// Because floater is single instance, need to re-parse data on each spawn
// (for example, inspector about same avatar but in different position)
/*virtual*/ void onOpen(const LLSD& avatar_id);
- // When closing they should close their gear menu
- /*virtual*/ void onClose(bool app_quitting);
-
// 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.
void requestUpdate();
-
+
// 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 onClickShare();
- void onToggleMute();
- void onClickReport();
- void onClickFreeze();
- void onClickEject();
- void onClickKick();
- void onClickCSR();
- void onClickZoomIn();
- void onClickFindOnMap();
- bool onVisibleFindOnMap();
- bool onVisibleEject();
- bool onVisibleFreeze();
- bool onVisibleZoomIn();
void onClickMuteVolume();
void onVolumeChange(const LLSD& data);
- bool enableMute();
- bool enableUnmute();
- bool enableTeleportOffer();
- bool godModeEnabled();
-
- // Is used to determine if "Add friend" option should be enabled in gear menu
- bool isNotFriend();
void onAvatarNameCache(const LLUUID& agent_id,
const LLAvatarName& av_name);
@@ -155,6 +102,7 @@ private:
// an in-flight request for avatar properties from LLAvatarPropertiesProcessor
// is represented by this object
LLFetchAvatarData* mPropertiesRequest;
+ boost::signals2::connection mAvatarNameCacheConnection;
};
//////////////////////////////////////////////////////////////////////////////
@@ -207,41 +155,11 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
: LLInspect( LLSD() ), // single_instance, doesn't really need key
mAvatarID(), // set in onOpen() *Note: we used to show partner's name but we dont anymore --angela 3rd Dec*
mAvatarName(),
- mPropertiesRequest(NULL)
+ mPropertiesRequest(NULL),
+ mAvatarNameCacheConnection()
{
- 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.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.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.Kick", boost::bind(&LLInspectAvatar::onClickKick, this));
- mCommitCallbackRegistrar.add("InspectAvatar.CSR", boost::bind(&LLInspectAvatar::onClickCSR, 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));
- mCommitCallbackRegistrar.add("InspectAvatar.DisableVoice", boost::bind(&LLInspectAvatar::toggleSelectedVoice, this, false));
- mCommitCallbackRegistrar.add("InspectAvatar.EnableVoice", boost::bind(&LLInspectAvatar::toggleSelectedVoice, this, true));
-
- mEnableCallbackRegistrar.add("InspectAvatar.EnableGod", boost::bind(&LLInspectAvatar::godModeEnabled, this));
- mEnableCallbackRegistrar.add("InspectAvatar.VisibleFindOnMap", boost::bind(&LLInspectAvatar::onVisibleFindOnMap, this));
- mEnableCallbackRegistrar.add("InspectAvatar.VisibleEject", boost::bind(&LLInspectAvatar::onVisibleEject, this));
- mEnableCallbackRegistrar.add("InspectAvatar.VisibleFreeze", boost::bind(&LLInspectAvatar::onVisibleFreeze, 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.Gear.EnableTeleportOffer", boost::bind(&LLInspectAvatar::enableTeleportOffer, this));
- mEnableCallbackRegistrar.add("InspectAvatar.EnableMute", boost::bind(&LLInspectAvatar::enableMute, this));
- mEnableCallbackRegistrar.add("InspectAvatar.EnableUnmute", boost::bind(&LLInspectAvatar::enableUnmute, this));
-
// can't make the properties request until the widgets are constructed
- // as it might return immediately, so do it in postBuild.
+ // as it might return immediately, so do it in onOpen.
LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::GLOBAL, this);
LLTransientFloater::init(this);
@@ -249,6 +167,10 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
LLInspectAvatar::~LLInspectAvatar()
{
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
// clean up any pending requests so they don't call back into a deleted
// view
delete mPropertiesRequest;
@@ -260,12 +182,6 @@ LLInspectAvatar::~LLInspectAvatar()
/*virtual*/
BOOL LLInspectAvatar::postBuild(void)
{
- getChild<LLUICtrl>("add_friend_btn")->setCommitCallback(
- boost::bind(&LLInspectAvatar::onClickAddFriend, this) );
-
- getChild<LLUICtrl>("view_profile_btn")->setCommitCallback(
- boost::bind(&LLInspectAvatar::onClickViewProfile, this) );
-
getChild<LLUICtrl>("mute_btn")->setCommitCallback(
boost::bind(&LLInspectAvatar::onClickMuteVolume, this) );
@@ -275,7 +191,6 @@ BOOL LLInspectAvatar::postBuild(void)
return TRUE;
}
-
// Multiple calls to showInstance("inspect_avatar", foo) will provide different
// LLSD for foo, which we will catch here.
//virtual
@@ -287,11 +202,6 @@ void LLInspectAvatar::onOpen(const LLSD& data)
// Extract appropriate avatar id
mAvatarID = data["avatar_id"];
- 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
@@ -304,20 +214,15 @@ void LLInspectAvatar::onOpen(const LLSD& data)
LLUI::positionViewNearMouse(this);
}
+ // Generate link to avatar profile.
+ getChild<LLUICtrl>("avatar_profile_link")->setTextArg("[LINK]", LLSLURL("agent", mAvatarID, "about").getSLURLString());
+
// can't call from constructor as widgets are not built yet
requestUpdate();
updateVolumeSlider();
-
- updateModeratorPanel();
}
-// virtual
-void LLInspectAvatar::onClose(bool app_quitting)
-{
- getChild<LLMenuButton>("gear_btn")->hideMenu();
-}
-
void LLInspectAvatar::requestUpdate()
{
// Don't make network requests when spawning from the debug menu at the
@@ -344,25 +249,6 @@ void LLInspectAvatar::requestUpdate()
delete mPropertiesRequest;
mPropertiesRequest = new LLFetchAvatarData(mAvatarID, this);
- // 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);
- 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
// and this may result in the image being visible sooner.
@@ -374,9 +260,11 @@ void LLInspectAvatar::requestUpdate()
getChild<LLUICtrl>("avatar_icon")->setValue(LLSD(mAvatarID) );
- LLAvatarNameCache::get(mAvatarID,
- boost::bind(&LLInspectAvatar::onAvatarNameCache,
- this, _1, _2));
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+ mAvatarNameCacheConnection = LLAvatarNameCache::get(mAvatarID,boost::bind(&LLInspectAvatar::onAvatarNameCache,this, _1, _2));
}
void LLInspectAvatar::processAvatarData(LLAvatarData* data)
@@ -405,141 +293,6 @@ void LLInspectAvatar::processAvatarData(LLAvatarData* data)
mPropertiesRequest = NULL;
}
-// 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)
-{
- LLToggleableMenu* gear_menu = getChild<LLMenuButton>("gear_btn")->getMenu();
- LLToggleableMenu* gear_menu_self = getChild<LLMenuButton>("gear_self_btn")->getMenu();
- if ( gear_menu && gear_menu->getVisible() &&
- gear_menu_self && gear_menu_self->getVisible() )
- {
- return;
- }
-
- if(childHasVisiblePopupMenu())
- {
- return;
- }
-
- 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)
- {
- 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 (getChild<LLUICtrl>("moderator_panel")->getVisible())
- {
- 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());
- }
-}
-
-void LLInspectAvatar::toggleSelectedVoice(bool enabled)
-{
- LLUUID session_id = LLVoiceChannel::getCurrentVoiceChannel()->getSessionID();
- LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
-
- if (speaker_mgr)
- {
- 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 = LLVoiceClient::getInstance()->getVoiceEnabled(mAvatarID);
@@ -558,12 +311,11 @@ void LLInspectAvatar::updateVolumeSlider()
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);
+ bool is_muted = LLAvatarActions::isVoiceMuted(mAvatarID);
LLUICtrl* mute_btn = getChild<LLUICtrl>("mute_btn");
- bool is_linden = LLStringUtil::endsWith(mAvatarName.getLegacyName(), " Linden");
+ bool is_linden = LLStringUtil::endsWith(mAvatarName.getDisplayName(), " Linden");
mute_btn->setEnabled( !is_linden);
mute_btn->setValue( is_muted );
@@ -594,7 +346,7 @@ void LLInspectAvatar::onClickMuteVolume()
LLMuteList* mute_list = LLMuteList::getInstance();
bool is_muted = mute_list->isMuted(mAvatarID, LLMute::flagVoiceChat);
- LLMute mute(mAvatarID, mAvatarName.getLegacyName(), LLMute::AGENT);
+ LLMute mute(mAvatarID, mAvatarName.getDisplayName(), LLMute::AGENT);
if (!is_muted)
{
mute_list->add(mute, LLMute::flagVoiceChat);
@@ -617,11 +369,13 @@ void LLInspectAvatar::onAvatarNameCache(
const LLUUID& agent_id,
const LLAvatarName& av_name)
{
+ mAvatarNameCacheConnection.disconnect();
+
if (agent_id == mAvatarID)
{
- getChild<LLUICtrl>("user_name")->setValue(av_name.mDisplayName);
- getChild<LLUICtrl>("user_name_small")->setValue(av_name.mDisplayName);
- getChild<LLUICtrl>("user_slid")->setValue(av_name.mUsername);
+ getChild<LLUICtrl>("user_name")->setValue(av_name.getDisplayName());
+ getChild<LLUICtrl>("user_name_small")->setValue(av_name.getDisplayName());
+ getChild<LLUICtrl>("user_slid")->setValue(av_name.getUserName());
mAvatarName = av_name;
// show smaller display name if too long to display in regular size
@@ -640,215 +394,6 @@ void LLInspectAvatar::onAvatarNameCache(
}
}
-void LLInspectAvatar::onClickAddFriend()
-{
- LLAvatarActions::requestFriendshipDialog(mAvatarID, mAvatarName.getLegacyName());
- closeFloater();
-}
-
-void LLInspectAvatar::onClickViewProfile()
-{
- LLAvatarActions::showProfile(mAvatarID);
- closeFloater();
-}
-
-bool LLInspectAvatar::isNotFriend()
-{
- return !LLAvatarActions::isFriend(mAvatarID);
-}
-
-bool LLInspectAvatar::onVisibleFindOnMap()
-{
- return gAgent.isGodlike() || is_agent_mappable(mAvatarID);
-}
-
-bool LLInspectAvatar::onVisibleEject()
-{
- return enable_freeze_eject( LLSD(mAvatarID) );
-}
-
-bool LLInspectAvatar::onVisibleFreeze()
-{
- // either user is a god and can do long distance freeze
- // or check for target proximity and permissions
- return gAgent.isGodlike() || 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::onToggleMute()
-{
- LLMute mute(mAvatarID, mAvatarName.mDisplayName, LLMute::AGENT);
-
- 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::showFromAvatar(mAvatarID, mAvatarName.getCompleteName());
- closeFloater();
-}
-
-bool godlike_freeze(const LLSD& notification, const LLSD& response)
-{
- LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-
- switch (option)
- {
- case 0:
- LLAvatarActions::freeze(avatar_id);
- break;
- case 1:
- LLAvatarActions::unfreeze(avatar_id);
- break;
- default:
- break;
- }
-
- return false;
-}
-
-void LLInspectAvatar::onClickFreeze()
-{
- if (gAgent.isGodlike())
- {
- // use godlike freeze-at-a-distance, with confirmation
- LLNotificationsUtil::add("FreezeAvatar",
- LLSD(),
- LLSD().with("avatar_id", mAvatarID),
- godlike_freeze);
- }
- else
- {
- // use default "local" version of freezing that requires avatar to be in range
- handle_avatar_freeze( LLSD(mAvatarID) );
- }
- closeFloater();
-}
-
-void LLInspectAvatar::onClickEject()
-{
- handle_avatar_eject( LLSD(mAvatarID) );
- closeFloater();
-}
-
-void LLInspectAvatar::onClickKick()
-{
- LLAvatarActions::kick(mAvatarID);
- closeFloater();
-}
-
-void LLInspectAvatar::onClickCSR()
-{
- std::string name;
- gCacheName->getFullName(mAvatarID, name);
- LLAvatarActions::csr(mAvatarID, name);
- closeFloater();
-}
-
-void LLInspectAvatar::onClickZoomIn()
-{
- handle_zoom_to_object(mAvatarID);
- closeFloater();
-}
-
-void LLInspectAvatar::onClickFindOnMap()
-{
- gFloaterWorldMap->trackAvatar(mAvatarID, mAvatarName.mDisplayName);
- LLFloaterReg::showInstance("world_map");
-}
-
-
-bool LLInspectAvatar::enableMute()
-{
- bool is_linden = LLStringUtil::endsWith(mAvatarName.getLegacyName(), " Linden");
- bool is_self = mAvatarID == gAgent.getID();
-
- if (!is_linden && !is_self && !LLMuteList::getInstance()->isMuted(mAvatarID, mAvatarName.getLegacyName()))
- {
- return true;
- }
- else
- {
- return false;
- }
-}
-
-bool LLInspectAvatar::enableUnmute()
-{
- bool is_linden = LLStringUtil::endsWith(mAvatarName.getLegacyName(), " Linden");
- bool is_self = mAvatarID == gAgent.getID();
-
- if (!is_linden && !is_self && LLMuteList::getInstance()->isMuted(mAvatarID, mAvatarName.getLegacyName()))
- {
- return true;
- }
- else
- {
- return false;
- }
-}
-
-bool LLInspectAvatar::enableTeleportOffer()
-{
- return LLAvatarActions::canOfferTeleport(mAvatarID);
-}
-
-bool LLInspectAvatar::godModeEnabled()
-{
- return gAgent.isGodlike();
-}
-
//////////////////////////////////////////////////////////////////////////////
// LLInspectAvatarUtil
//////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index fce0b7c9c9..0ee78d57bd 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -37,6 +37,7 @@
#include "llappearancemgr.h"
#include "llattachmentsmgr.h"
#include "llavataractions.h"
+#include "llfavoritesbar.h" // management of favorites folder
#include "llfloateropenobject.h"
#include "llfloaterreg.h"
#include "llfloatersidepanelcontainer.h"
@@ -45,7 +46,7 @@
#include "llfriendcard.h"
#include "llgesturemgr.h"
#include "llgiveinventory.h"
-#include "llimfloater.h"
+#include "llfloaterimcontainer.h"
#include "llimview.h"
#include "llclipboard.h"
#include "llinventorydefines.h"
@@ -94,21 +95,6 @@ struct LLMoveInv
using namespace LLOldEvents;
-// Helpers
-// bug in busy count inc/dec right now, logic is complex... do we really need it?
-void inc_busy_count()
-{
-// gViewerWindow->getWindow()->incBusyCount();
-// check balance of these calls if this code is changed to ever actually
-// *do* something!
-}
-void dec_busy_count()
-{
-// gViewerWindow->getWindow()->decBusyCount();
-// check balance of these calls if this code is changed to ever actually
-// *do* something!
-}
-
// Function declarations
void remove_inventory_category_from_avatar(LLInventoryCategory* category);
void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id);
@@ -118,10 +104,10 @@ void teleport_via_landmark(const LLUUID& asset_id);
static BOOL can_move_to_outfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit);
static bool check_category(LLInventoryModel* model,
const LLUUID& cat_id,
- LLFolderView* active_folder_view,
+ LLInventoryPanel* active_panel,
LLInventoryFilter* filter);
static bool check_item(const LLUUID& item_id,
- LLFolderView* active_folder_view,
+ LLInventoryPanel* active_panel,
LLInventoryFilter* filter);
// Helper functions
@@ -169,7 +155,6 @@ public:
{
if (clear_observer)
{
- dec_busy_count();
gInventory.removeObserver(this);
delete this;
}
@@ -192,7 +177,8 @@ LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory,
mUUID(uuid),
mRoot(root),
mInvType(LLInventoryType::IT_NONE),
- mIsLink(FALSE)
+ mIsLink(FALSE),
+ LLFolderViewModelItemInventory(inventory->getRootViewModel())
{
mInventoryPanel = inventory->getInventoryPanelHandle();
const LLInventoryObject* obj = getInventoryObject();
@@ -211,7 +197,11 @@ const std::string& LLInvFVBridge::getName() const
const std::string& LLInvFVBridge::getDisplayName() const
{
- return getName();
+ if(mDisplayName.empty())
+ {
+ buildDisplayName();
+ }
+ return mDisplayName;
}
// Folders have full perms
@@ -230,9 +220,24 @@ LLFolderType::EType LLInvFVBridge::getPreferredType() const
// Folders don't have creation dates.
time_t LLInvFVBridge::getCreationDate() const
{
- return 0;
+ LLInventoryObject* objectp = getInventoryObject();
+ if (objectp)
+ {
+ return objectp->getCreationDate();
+ }
+ return (time_t)0;
}
+void LLInvFVBridge::setCreationDate(time_t creation_date_utc)
+{
+ LLInventoryObject* objectp = getInventoryObject();
+ if (objectp)
+ {
+ objectp->setCreationDate(creation_date_utc);
+ }
+}
+
+
// Can be destroyed (or moved to trash)
BOOL LLInvFVBridge::isItemRemovable() const
{
@@ -250,6 +255,11 @@ BOOL LLInvFVBridge::isLink() const
return mIsLink;
}
+BOOL LLInvFVBridge::isLibraryItem() const
+{
+ return gInventory.isObjectDescendentOf(getUUID(),gInventory.getLibraryRootFolderID());
+}
+
/*virtual*/
/**
* @brief Adds this item into clipboard storage
@@ -286,7 +296,7 @@ void LLInvFVBridge::showProperties()
*/
}
-void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch)
+void LLInvFVBridge::removeBatch(std::vector<LLFolderViewModelItem*>& batch)
{
// Deactivate gestures when moving them into Trash
LLInvFVBridge* bridge;
@@ -295,11 +305,11 @@ void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batc
LLViewerInventoryCategory* cat = NULL;
LLInventoryModel::cat_array_t descendent_categories;
LLInventoryModel::item_array_t descendent_items;
- S32 count = batch.count();
+ S32 count = batch.size();
S32 i,j;
for(i = 0; i < count; ++i)
{
- bridge = (LLInvFVBridge*)(batch.get(i));
+ bridge = (LLInvFVBridge*)(batch[i]);
if(!bridge || !bridge->isItemRemovable()) continue;
item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID());
if (item)
@@ -312,7 +322,7 @@ void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batc
}
for(i = 0; i < count; ++i)
{
- bridge = (LLInvFVBridge*)(batch.get(i));
+ bridge = (LLInvFVBridge*)(batch[i]);
if(!bridge || !bridge->isItemRemovable()) continue;
cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID());
if (cat)
@@ -330,7 +340,7 @@ void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batc
removeBatchNoCheck(batch);
}
-void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch)
+void LLInvFVBridge::removeBatchNoCheck(std::vector<LLFolderViewModelItem*>& batch)
{
// this method moves a bunch of items and folders to the trash. As
// per design guidelines for the inventory model, the message is
@@ -346,14 +356,14 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*
uuid_vec_t move_ids;
LLInventoryModel::update_map_t update;
bool start_new_message = true;
- S32 count = batch.count();
+ S32 count = batch.size();
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));
+ bridge = (LLInvFVBridge*)(batch[i]);
if(!bridge || !bridge->isItemRemovable()) continue;
item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID());
if(item)
@@ -366,7 +376,7 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*
for(i = 0; i < count; ++i)
{
- bridge = (LLInvFVBridge*)(batch.get(i));
+ bridge = (LLInvFVBridge*)(batch[i]);
if(!bridge || !bridge->isItemRemovable()) continue;
item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID());
if(item)
@@ -407,7 +417,7 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*
for(i = 0; i < count; ++i)
{
- bridge = (LLInvFVBridge*)(batch.get(i));
+ bridge = (LLInvFVBridge*)(batch[i]);
if(!bridge || !bridge->isItemRemovable()) continue;
LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID());
if(cat)
@@ -501,8 +511,10 @@ BOOL LLInvFVBridge::isClipboardPasteable() const
// Each item must be copyable to be pastable
LLItemBridge item_br(mInventoryPanel.get(), mRoot, item_id);
if (!item_br.isItemCopyable())
- return FALSE;
- }
+ {
+ return FALSE;
+ }
+ }
return TRUE;
}
@@ -879,6 +891,12 @@ LLInventoryModel* LLInvFVBridge::getInventoryModel() const
return panel ? panel->getModel() : NULL;
}
+LLInventoryFilter* LLInvFVBridge::getInventoryFilter() const
+{
+ LLInventoryPanel* panel = mInventoryPanel.get();
+ return panel ? &(panel->getFilter()) : NULL;
+}
+
BOOL LLInvFVBridge::isItemInTrash() const
{
LLInventoryModel* model = getInventoryModel();
@@ -931,7 +949,7 @@ BOOL LLInvFVBridge::isCOFFolder() const
BOOL LLInvFVBridge::isInboxFolder() const
{
- const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false);
+ const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false);
if (inbox_id.isNull())
{
@@ -971,7 +989,7 @@ BOOL LLInvFVBridge::isOutboxFolderDirectParent() const
const LLUUID LLInvFVBridge::getOutboxFolder() const
{
- const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false);
+ const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
return outbox_id;
}
@@ -1003,6 +1021,7 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
LLAssetType::EType actual_asset_type,
LLInventoryType::EType inv_type,
LLInventoryPanel* inventory,
+ LLFolderViewModelInventory* view_model,
LLFolderView* root,
const LLUUID& uuid,
U32 flags)
@@ -1253,10 +1272,10 @@ bool LLInvFVBridge::canListOnMarketplaceNow() const
if (can_list)
{
- LLFolderViewFolder * object_folderp = mRoot->getFolderByID(object_id);
+ LLFolderViewFolder * object_folderp = mInventoryPanel.get() ? mInventoryPanel.get()->getFolderByID(object_id) : NULL;
if (object_folderp)
{
- can_list = !object_folderp->isLoading();
+ can_list = !static_cast<LLFolderBridge*>(object_folderp->getViewModelItem())->isLoading();
}
}
@@ -1264,7 +1283,7 @@ bool LLInvFVBridge::canListOnMarketplaceNow() const
{
// Get outbox id
const LLUUID & outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
- LLFolderViewItem * outbox_itemp = mRoot->getItemByID(outbox_id);
+ LLFolderViewItem * outbox_itemp = mInventoryPanel.get() ? mInventoryPanel.get()->getItemByID(outbox_id) : NULL;
if (outbox_itemp)
{
@@ -1274,7 +1293,7 @@ bool LLInvFVBridge::canListOnMarketplaceNow() const
void * cargo_data = (void *) obj;
std::string tooltip_msg;
- can_list = outbox_itemp->getListener()->dragOrDrop(mask, drop, cargo_type, cargo_data, tooltip_msg);
+ can_list = outbox_itemp->getViewModelItem()->dragOrDrop(mask, drop, cargo_type, cargo_data, tooltip_msg);
}
}
}
@@ -1286,14 +1305,30 @@ bool LLInvFVBridge::canListOnMarketplaceNow() const
#endif
}
+LLToolDragAndDrop::ESource LLInvFVBridge::getDragSource() const
+{
+ if (gInventory.isObjectDescendentOf(getUUID(), gInventory.getRootFolderID()))
+ {
+ return LLToolDragAndDrop::SOURCE_AGENT;
+ }
+ else if (gInventory.isObjectDescendentOf(getUUID(), gInventory.getLibraryRootFolderID()))
+ {
+ return LLToolDragAndDrop::SOURCE_LIBRARY;
+ }
+
+ return LLToolDragAndDrop::SOURCE_VIEWER;
+}
+
+
// +=================================================+
// | InventoryFVBridgeBuilder |
// +=================================================+
-LLInvFVBridge* LLInventoryFVBridgeBuilder::createBridge(LLAssetType::EType asset_type,
+LLInvFVBridge* LLInventoryFolderViewModelBuilder::createBridge(LLAssetType::EType asset_type,
LLAssetType::EType actual_asset_type,
LLInventoryType::EType inv_type,
LLInventoryPanel* inventory,
+ LLFolderViewModelInventory* view_model,
LLFolderView* root,
const LLUUID& uuid,
U32 flags /* = 0x00 */) const
@@ -1302,6 +1337,7 @@ LLInvFVBridge* LLInventoryFVBridgeBuilder::createBridge(LLAssetType::EType asset
actual_asset_type,
inv_type,
inventory,
+ view_model,
root,
uuid,
flags);
@@ -1358,10 +1394,7 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
else if ("cut" == action)
{
cutToClipboard();
- // MAINT-1197: This is temp code to work around a deselection/reselection bug. Please discard when merging CHUI.
- LLFolderViewItem* item_to_select = mRoot->getNextUnselectedItem();
- LLFolderView::removeCutItems();
- mRoot->setSelection(item_to_select, item_to_select ? item_to_select->isOpen() : false, false);
+ gInventory.removeObject(mUUID);
return;
}
else if ("copy" == action)
@@ -1374,10 +1407,10 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
LLInventoryItem* itemp = model->getItem(mUUID);
if (!itemp) return;
- LLFolderViewItem* folder_view_itemp = mRoot->getItemByID(itemp->getParentUUID());
+ LLFolderViewItem* folder_view_itemp = mInventoryPanel.get()->getItemByID(itemp->getParentUUID());
if (!folder_view_itemp) return;
- folder_view_itemp->getListener()->pasteFromClipboard();
+ folder_view_itemp->getViewModelItem()->pasteFromClipboard();
return;
}
else if ("paste_link" == action)
@@ -1386,10 +1419,10 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
LLInventoryItem* itemp = model->getItem(mUUID);
if (!itemp) return;
- LLFolderViewItem* folder_view_itemp = mRoot->getItemByID(itemp->getParentUUID());
+ LLFolderViewItem* folder_view_itemp = mInventoryPanel.get()->getItemByID(itemp->getParentUUID());
if (!folder_view_itemp) return;
- folder_view_itemp->getListener()->pasteLinkFromClipboard();
+ folder_view_itemp->getViewModelItem()->pasteLinkFromClipboard();
return;
}
else if (isMarketplaceCopyAction(action))
@@ -1399,7 +1432,7 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
LLInventoryItem* itemp = model->getItem(mUUID);
if (!itemp) return;
- const LLUUID outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false);
+ const LLUUID outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
copy_item_to_outbox(itemp, outbox_id, LLUUID::null, LLToolDragAndDrop::getOperationId());
}
else if ("copy_slurl" == action)
@@ -1515,6 +1548,15 @@ LLUIImagePtr LLItemBridge::getIcon() const
return LLInventoryIcon::getIcon(LLInventoryIcon::ICONNAME_OBJECT);
}
+LLUIImagePtr LLItemBridge::getIconOverlay() const
+{
+ if (getItem() && getItem()->getIsLinkType())
+ {
+ return LLUI::getUIImage("Inv_Link");
+ }
+ return NULL;
+}
+
PermissionMask LLItemBridge::getPermissionMask() const
{
LLViewerInventoryItem* item = getItem();
@@ -1523,26 +1565,27 @@ PermissionMask LLItemBridge::getPermissionMask() const
return perm_mask;
}
-const std::string& LLItemBridge::getDisplayName() const
+void LLItemBridge::buildDisplayName() const
{
- if(mDisplayName.empty())
+ if(getItem())
{
- buildDisplayName(getItem(), mDisplayName);
+ mDisplayName.assign(getItem()->getName());
}
- return mDisplayName;
+ else
+ {
+ mDisplayName.assign(LLStringUtil::null);
}
-void LLItemBridge::buildDisplayName(LLInventoryItem* item, std::string& name)
+ mSearchableName.assign(mDisplayName);
+ mSearchableName.append(getLabelSuffix());
+ LLStringUtil::toUpper(mSearchableName);
+
+ //Name set, so trigger a sort
+ if(mParent)
{
- if(item)
- {
- name.assign(item->getName());
+ mParent->requestSort();
}
- else
- {
- name.assign(LLStringUtil::null);
}
-}
LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const
{
@@ -1658,18 +1701,17 @@ BOOL LLItemBridge::renameItem(const std::string& new_name)
{
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
new_item->rename(new_name);
- buildDisplayName(new_item, mDisplayName);
new_item->updateServer(FALSE);
model->updateItem(new_item);
model->notifyObservers();
+ buildDisplayName();
}
// return FALSE because we either notified observers (& therefore
// rebuilt) or we didn't update.
return FALSE;
}
-
BOOL LLItemBridge::removeItem()
{
if(!isItemRemovable())
@@ -1677,7 +1719,6 @@ BOOL LLItemBridge::removeItem()
return FALSE;
}
-
// move it to the trash
LLPreview::hide(mUUID, TRUE);
LLInventoryModel* model = getInventoryModel();
@@ -1815,6 +1856,99 @@ void LLFolderBridge::selectItem()
LLInventoryModelBackgroundFetch::instance().start(getUUID(), true);
}
+void LLFolderBridge::buildDisplayName() const
+{
+ LLFolderType::EType preferred_type = 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
+
+ // HACK: EXT - 6028 ([HARD CODED]? Inventory > Library > "Accessories" folder)
+ // Translation of Accessories folder in Library inventory folder
+ bool accessories = false;
+ if(getName() == "Accessories")
+ {
+ //To ensure that Accessories folder is in Library we have to check its parent folder.
+ //Due to parent LLFolderViewFloder is not set to this item yet we have to check its parent via Inventory Model
+ LLInventoryCategory* cat = gInventory.getCategory(getUUID());
+ if(cat)
+ {
+ const LLUUID& parent_folder_id = cat->getParentUUID();
+ accessories = (parent_folder_id == gInventory.getLibraryRootFolderID());
+ }
+ }
+
+ //"Accessories" inventory category has folder type FT_NONE. So, this folder
+ //can not be detected as protected with LLFolderType::lookupIsProtectedType
+ mDisplayName.assign(getName());
+ if (accessories || LLFolderType::lookupIsProtectedType(preferred_type))
+ {
+ LLTrans::findString(mDisplayName, std::string("InvFolder ") + getName(), LLSD());
+ }
+
+ mSearchableName.assign(mDisplayName);
+ mSearchableName.append(getLabelSuffix());
+ LLStringUtil::toUpper(mSearchableName);
+
+ //Name set, so trigger a sort
+ if(mParent)
+ {
+ mParent->requestSort();
+ }
+}
+
+
+void LLFolderBridge::update()
+{
+ bool possibly_has_children = false;
+ bool up_to_date = isUpToDate();
+ if(!up_to_date && hasChildren()) // we know we have children but haven't fetched them (doesn't obey filter)
+ {
+ possibly_has_children = true;
+ }
+
+ bool loading = (possibly_has_children
+ && !up_to_date );
+
+ if (loading != mIsLoading)
+ {
+ if ( loading && !mIsLoading )
+ {
+ // Measure how long we've been in the loading state
+ mTimeSinceRequestStart.reset();
+ }
+
+ const BOOL in_inventory = gInventory.isObjectDescendentOf(getUUID(), gInventory.getRootFolderID());
+ const BOOL in_library = gInventory.isObjectDescendentOf(getUUID(), gInventory.getLibraryRootFolderID());
+
+ bool root_is_loading = false;
+ if (in_inventory)
+ {
+ root_is_loading = LLInventoryModelBackgroundFetch::instance().inventoryFetchInProgress();
+ }
+ if (in_library)
+ {
+ root_is_loading = LLInventoryModelBackgroundFetch::instance().libraryFetchInProgress();
+ }
+ if ((mIsLoading
+ && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime"))
+ || (LLInventoryModelBackgroundFetch::instance().folderFetchActive()
+ && root_is_loading))
+ {
+ mDisplayName = LLInvFVBridge::getDisplayName() + " ( " + LLTrans::getString("LoadingData") + " ) ";
+ mIsLoading = true;
+ }
+ else
+ {
+ mDisplayName = LLInvFVBridge::getDisplayName();
+ mIsLoading = false;
+ }
+ }
+}
+
+
// Iterate through a folder's children to determine if
// all the children are removable.
class LLIsItemRemovable : public LLFolderViewFunctor
@@ -1823,11 +1957,11 @@ public:
LLIsItemRemovable() : mPassed(TRUE) {}
virtual void doFolder(LLFolderViewFolder* folder)
{
- mPassed &= folder->getListener()->isItemRemovable();
+ mPassed &= folder->getViewModelItem()->isItemRemovable();
}
virtual void doItem(LLFolderViewItem* item)
{
- mPassed &= item->getListener()->isItemRemovable();
+ mPassed &= item->getViewModelItem()->isItemRemovable();
}
BOOL mPassed;
};
@@ -1841,7 +1975,7 @@ BOOL LLFolderBridge::isItemRemovable() const
}
LLInventoryPanel* panel = mInventoryPanel.get();
- LLFolderViewFolder* folderp = dynamic_cast<LLFolderViewFolder*>(panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL);
+ LLFolderViewFolder* folderp = dynamic_cast<LLFolderViewFolder*>(panel ? panel->getItemByID(mUUID) : NULL);
if (folderp)
{
LLIsItemRemovable folder_test;
@@ -2080,7 +2214,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
LLInventoryPanel* destination_panel = mInventoryPanel.get();
if (!destination_panel) return false;
- LLInventoryFilter* filter = destination_panel->getFilter();
+ LLInventoryFilter* filter = getInventoryFilter();
if (!filter) return false;
const LLUUID &cat_id = inv_cat->getUUID();
@@ -2299,7 +2433,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
{
// Check whether the folder being dragged from active inventory panel
// passes the filter of the destination panel.
- is_movable = check_category(model, cat_id, active_folder_view, filter);
+ is_movable = check_category(model, cat_id, active_panel, filter);
}
}
}
@@ -2373,7 +2507,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
}
else
{
- if (model->isObjectDescendentOf(cat_id, model->findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false)))
+ if (model->isObjectDescendentOf(cat_id, model->findCategoryUUIDForType(LLFolderType::FT_INBOX, false)))
{
set_dad_inbox_object(cat_id);
}
@@ -2551,7 +2685,6 @@ void LLRightClickInventoryFetchDescendentsObserver::execute(bool clear_observer)
llwarns << "LLRightClickInventoryFetchDescendentsObserver::done with empty mCompleteFolders" << llendl;
if (clear_observer)
{
- dec_busy_count();
gInventory.removeObserver(this);
delete this;
}
@@ -2565,7 +2698,6 @@ void LLRightClickInventoryFetchDescendentsObserver::execute(bool clear_observer)
// could notify observers and throw us into an infinite loop.
if (clear_observer)
{
- dec_busy_count();
gInventory.removeObserver(this);
delete this;
}
@@ -2577,14 +2709,23 @@ void LLRightClickInventoryFetchDescendentsObserver::execute(bool clear_observer)
LLInventoryModel::item_array_t* item_array;
gInventory.getDirectDescendentsOf(*current_folder, cat_array, item_array);
- S32 item_count = item_array->count();
- S32 cat_count = cat_array->count();
-
+ S32 item_count(0);
+ if( item_array )
+ {
+ item_count = item_array->count();
+ }
+
+ S32 cat_count(0);
+ if( cat_array )
+ {
+ cat_count = cat_array->count();
+ }
+
// Move to next if current folder empty
if ((item_count == 0) && (cat_count == 0))
- {
+ {
continue;
- }
+ }
uuid_vec_t ids;
LLRightClickInventoryFetchObserver* outfit = NULL;
@@ -2627,7 +2768,6 @@ void LLRightClickInventoryFetchDescendentsObserver::execute(bool clear_observer)
{
// it's all on its way - add an observer, and the inventory
// will call done for us when everything is here.
- inc_busy_count();
gInventory.addObserver(outfit);
}
*/
@@ -2646,7 +2786,6 @@ void LLRightClickInventoryFetchDescendentsObserver::execute(bool clear_observer)
{
// it's all on its way - add an observer, and the inventory
// will call done for us when everything is here.
- inc_busy_count();
gInventory.addObserver(categories);
}
}
@@ -2725,7 +2864,7 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
{
if ("open" == action)
{
- LLFolderViewFolder *f = dynamic_cast<LLFolderViewFolder *>(mRoot->getItemByID(mUUID));
+ LLFolderViewFolder *f = dynamic_cast<LLFolderViewFolder *>(mInventoryPanel.get()->getItemByID(mUUID));
if (f)
{
f->setOpen(TRUE);
@@ -2772,10 +2911,7 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
else if ("cut" == action)
{
cutToClipboard();
- // MAINT-1197: This is temp code to work around a deselection/reselection bug. Please discard when merging CHUI.
- LLFolderViewItem* item_to_select = mRoot->getNextUnselectedItem();
- LLFolderView::removeCutItems();
- mRoot->setSelection(item_to_select, item_to_select ? item_to_select->isOpen() : false, false);
+ gInventory.removeObject(mUUID);
return;
}
else if ("copy" == action)
@@ -2816,7 +2952,7 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
LLInventoryCategory * cat = gInventory.getCategory(mUUID);
if (!cat) return;
- const LLUUID outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false);
+ const LLUUID outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
copy_folder_to_outbox(cat, outbox_id, cat->getUUID(), LLToolDragAndDrop::getOperationId());
}
#if ENABLE_MERCHANT_SEND_TO_MARKETPLACE_CONTEXT_MENU
@@ -2912,17 +3048,24 @@ LLUIImagePtr LLFolderBridge::getIcon() const
LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type)
{
return LLUI::getUIImage(LLViewerFolderType::lookupIconName(preferred_type, FALSE));
- /*case LLAssetType::AT_MESH:
- control = "inv_folder_mesh.tga";
- break;*/
}
-LLUIImagePtr LLFolderBridge::getOpenIcon() const
+LLUIImagePtr LLFolderBridge::getIconOpen() const
{
return LLUI::getUIImage(LLViewerFolderType::lookupIconName(getPreferredType(), TRUE));
}
+LLUIImagePtr LLFolderBridge::getIconOverlay() const
+{
+ if (getInventoryObject() && getInventoryObject()->getIsLinkType())
+ {
+ return LLUI::getUIImage("Inv_Link");
+ }
+ return NULL;
+}
+
+
BOOL LLFolderBridge::renameItem(const std::string& new_name)
{
rename_category(getInventoryModel(), mUUID, new_name);
@@ -2986,6 +3129,19 @@ bool LLFolderBridge::removeItemResponse(const LLSD& notification, const LLSD& re
return FALSE;
}
+//Recursively update the folder's creation date
+void LLFolderBridge::updateHierarchyCreationDate(time_t date)
+{
+ if(getCreationDate() < date)
+ {
+ setCreationDate(date);
+ if(mParent)
+ {
+ static_cast<LLFolderBridge *>(mParent)->updateHierarchyCreationDate(date);
+ }
+ }
+}
+
void LLFolderBridge::pasteFromClipboard()
{
LLInventoryModel* model = getInventoryModel();
@@ -3003,7 +3159,7 @@ void LLFolderBridge::pasteFromClipboard()
if (move_is_into_outbox)
{
- LLFolderViewItem * outbox_itemp = mRoot->getItemByID(mUUID);
+ LLFolderViewItem * outbox_itemp = mInventoryPanel.get()->getItemByID(mUUID);
if (outbox_itemp)
{
@@ -3026,7 +3182,7 @@ void LLFolderBridge::pasteFromClipboard()
void * cargo_data = (void *) item;
std::string tooltip_msg;
- can_list = outbox_itemp->getListener()->dragOrDrop(mask, drop, cargo_type, cargo_data, tooltip_msg);
+ can_list = outbox_itemp->getViewModelItem()->dragOrDrop(mask, drop, cargo_type, cargo_data, tooltip_msg);
}
}
@@ -3068,7 +3224,8 @@ void LLFolderBridge::pasteFromClipboard()
LLViewerInventoryCategory* vicat = (LLViewerInventoryCategory *) model->getCategory(item_id);
llassert(vicat);
if (vicat)
- {
+ {
+ //changeCategoryParent() implicity calls dirtyFilter
changeCategoryParent(model, vicat, parent_id, FALSE);
}
}
@@ -3078,6 +3235,7 @@ void LLFolderBridge::pasteFromClipboard()
llassert(viitem);
if (viitem)
{
+ //changeItemParent() implicity calls dirtyFilter
changeItemParent(model, viitem, parent_id, FALSE);
}
}
@@ -3198,41 +3356,45 @@ BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInv
return ((item_array.count() > 0) ? TRUE : FALSE );
}
-void LLFolderBridge::buildContextMenuBaseOptions(U32 flags)
+void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items, menuentry_vec_t& disabled_items)
{
LLInventoryModel* model = getInventoryModel();
llassert(model != NULL);
const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
const LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
+ const LLUUID favorites = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
if (lost_and_found_id == mUUID)
{
// This is the lost+found folder.
- mItems.push_back(std::string("Empty Lost And Found"));
+ items.push_back(std::string("Empty Lost And Found"));
- mDisabledItems.push_back(std::string("New Folder"));
- mDisabledItems.push_back(std::string("New Script"));
- mDisabledItems.push_back(std::string("New Note"));
- mDisabledItems.push_back(std::string("New Gesture"));
- mDisabledItems.push_back(std::string("New Clothes"));
- mDisabledItems.push_back(std::string("New Body Parts"));
+ disabled_items.push_back(std::string("New Folder"));
+ disabled_items.push_back(std::string("New Script"));
+ disabled_items.push_back(std::string("New Note"));
+ disabled_items.push_back(std::string("New Gesture"));
+ disabled_items.push_back(std::string("New Clothes"));
+ disabled_items.push_back(std::string("New Body Parts"));
+ }
+ if (favorites == mUUID)
+ {
+ disabled_items.push_back(std::string("New Folder"));
}
-
if(trash_id == mUUID)
{
// This is the trash.
- mItems.push_back(std::string("Empty Trash"));
+ items.push_back(std::string("Empty Trash"));
}
else if(isItemInTrash())
{
// This is a folder in the trash.
- mItems.clear(); // clear any items that used to exist
- addTrashContextMenuOptions(mItems, mDisabledItems);
+ items.clear(); // clear any items that used to exist
+ addTrashContextMenuOptions(items, disabled_items);
}
else if(isOutboxFolder())
{
- addOutboxContextMenuOptions(flags, mItems, mDisabledItems);
+ addOutboxContextMenuOptions(flags, items, disabled_items);
}
else if(isAgentInventory()) // do not allow creating in library
{
@@ -3246,40 +3408,40 @@ void LLFolderBridge::buildContextMenuBaseOptions(U32 flags)
// Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694.
if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat))
{
- mItems.push_back(std::string("New Folder"));
+ items.push_back(std::string("New Folder"));
}
- mItems.push_back(std::string("New Script"));
- mItems.push_back(std::string("New Note"));
- mItems.push_back(std::string("New Gesture"));
- mItems.push_back(std::string("New Clothes"));
- mItems.push_back(std::string("New Body Parts"));
+ items.push_back(std::string("New Script"));
+ items.push_back(std::string("New Note"));
+ items.push_back(std::string("New Gesture"));
+ items.push_back(std::string("New Clothes"));
+ items.push_back(std::string("New Body Parts"));
}
#if SUPPORT_ENSEMBLES
// Changing folder types is an unfinished unsupported feature
// and can lead to unexpected behavior if enabled.
- mItems.push_back(std::string("Change Type"));
+ items.push_back(std::string("Change Type"));
const LLViewerInventoryCategory *cat = getCategory();
if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
{
- mDisabledItems.push_back(std::string("Change Type"));
+ disabled_items.push_back(std::string("Change Type"));
}
#endif
- getClipboardEntries(false, mItems, mDisabledItems, flags);
+ getClipboardEntries(false, items, disabled_items, flags);
}
else
{
// Want some but not all of the items from getClipboardEntries for outfits.
if (cat && (cat->getPreferredType() == LLFolderType::FT_OUTFIT))
{
- mItems.push_back(std::string("Rename"));
+ items.push_back(std::string("Rename"));
- addDeleteContextMenuOptions(mItems, mDisabledItems);
+ addDeleteContextMenuOptions(items, disabled_items);
// EXT-4030: disallow deletion of currently worn outfit
const LLViewerInventoryItem *base_outfit_link = LLAppearanceMgr::instance().getBaseOutfitLink();
if (base_outfit_link && (cat == base_outfit_link->getLinkedCategory()))
{
- mDisabledItems.push_back(std::string("Delete"));
+ disabled_items.push_back(std::string("Delete"));
}
}
}
@@ -3308,20 +3470,43 @@ void LLFolderBridge::buildContextMenuBaseOptions(U32 flags)
// 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"));
+ disabled_items.push_back(std::string("Delete System Folder"));
}
if (!isOutboxFolder())
{
- mItems.push_back(std::string("Share"));
+ items.push_back(std::string("Share"));
if (!canShare())
{
- mDisabledItems.push_back(std::string("Share"));
+ disabled_items.push_back(std::string("Share"));
}
}
+ // Add menu items that are dependent on the contents of the folder.
+ LLViewerInventoryCategory* category = (LLViewerInventoryCategory *) model->getCategory(mUUID);
+ if (category)
+ {
+ uuid_vec_t folders;
+ folders.push_back(category->getUUID());
+
+ sSelf = getHandle();
+ LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(folders);
+ fetch->startFetch();
+ if (fetch->isFinished())
+ {
+ // Do not call execute() or done() here as if the folder is here, there's likely no point drilling down
+ // This saves lots of time as buildContextMenu() is called a lot
+ delete fetch;
+ buildContextMenuFolderOptions(flags, items, disabled_items);
+ }
+ else
+ {
+ // it's all on its way - add an observer, and the inventory will call done for us when everything is here.
+ gInventory.addObserver(fetch);
+ }
+}
}
-void LLFolderBridge::buildContextMenuFolderOptions(U32 flags)
+void LLFolderBridge::buildContextMenuFolderOptions(U32 flags, menuentry_vec_t& items, menuentry_vec_t& disabled_items)
{
// Build folder specific options back up
LLInventoryModel* model = getInventoryModel();
@@ -3348,21 +3533,21 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags)
LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD);
if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard))
{
- mItems.push_back(std::string("Calling Card Separator"));
- mItems.push_back(std::string("Conference Chat Folder"));
- mItems.push_back(std::string("IM All Contacts In Folder"));
+ items.push_back(std::string("Calling Card Separator"));
+ items.push_back(std::string("Conference Chat Folder"));
+ items.push_back(std::string("IM All Contacts In Folder"));
}
}
if (!isItemRemovable())
{
- mDisabledItems.push_back(std::string("Delete"));
+ disabled_items.push_back(std::string("Delete"));
}
#ifndef LL_RELEASE_FOR_DOWNLOAD
if (LLFolderType::lookupIsProtectedType(type))
{
- mItems.push_back(std::string("Delete System Folder"));
+ items.push_back(std::string("Delete System Folder"));
}
#endif
@@ -3377,7 +3562,7 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags)
checkFolderForContentsOfType(model, is_object) ||
checkFolderForContentsOfType(model, is_gesture) )
{
- mItems.push_back(std::string("Folder Wearables Separator"));
+ items.push_back(std::string("Folder Wearables Separator"));
// Only enable add/replace outfit for non-system folders.
if (!is_system_folder)
@@ -3385,25 +3570,25 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags)
// Adding an outfit onto another (versus replacing) doesn't make sense.
if (type != LLFolderType::FT_OUTFIT)
{
- mItems.push_back(std::string("Add To Outfit"));
+ items.push_back(std::string("Add To Outfit"));
}
- mItems.push_back(std::string("Replace Outfit"));
+ items.push_back(std::string("Replace Outfit"));
}
if (is_ensemble)
{
- mItems.push_back(std::string("Wear As Ensemble"));
+ items.push_back(std::string("Wear As Ensemble"));
}
- mItems.push_back(std::string("Remove From Outfit"));
+ items.push_back(std::string("Remove From Outfit"));
if (!LLAppearanceMgr::getCanRemoveFromCOF(mUUID))
{
- mDisabledItems.push_back(std::string("Remove From Outfit"));
+ disabled_items.push_back(std::string("Remove From Outfit"));
}
if (!LLAppearanceMgr::instance().getCanReplaceCOF(mUUID))
{
- mDisabledItems.push_back(std::string("Replace Outfit"));
+ disabled_items.push_back(std::string("Replace Outfit"));
}
- mItems.push_back(std::string("Outfit Separator"));
+ items.push_back(std::string("Outfit Separator"));
}
}
@@ -3412,49 +3597,28 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
sSelf.markDead();
- mItems.clear();
- mDisabledItems.clear();
+ // fetch contents of this folder, as context menu can depend on contents
+ // still, user would have to open context menu again to see the changes
+ gInventory.fetchDescendentsOf(getUUID());
+
+
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
lldebugs << "LLFolderBridge::buildContextMenu()" << llendl;
LLInventoryModel* model = getInventoryModel();
if(!model) return;
- buildContextMenuBaseOptions(flags);
-
- // Add menu items that are dependent on the contents of the folder.
- LLViewerInventoryCategory* category = (LLViewerInventoryCategory *) model->getCategory(mUUID);
- if (category)
- {
- uuid_vec_t folders;
- folders.push_back(category->getUUID());
-
- sSelf = getHandle();
- LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(folders);
- fetch->startFetch();
- if (fetch->isFinished())
- {
- // Do not call execute() or done() here as if the folder is here, there's likely no point drilling down
- // This saves lots of time as buildContextMenu() is called a lot
- delete fetch;
- buildContextMenuFolderOptions(flags);
- }
- else
- {
- // it's all on its way - add an observer, and the inventory will call done for us when everything is here.
- inc_busy_count();
- gInventory.addObserver(fetch);
- }
- }
-
- hide_context_entries(menu, mItems, mDisabledItems);
+ buildContextMenuOptions(flags, items, disabled_items);
+ hide_context_entries(menu, items, disabled_items);
// Reposition the menu, in case we're adding items to an existing menu.
menu.needsArrange();
menu.arrangeAndClear();
}
-BOOL LLFolderBridge::hasChildren() const
+bool LLFolderBridge::hasChildren() const
{
LLInventoryModel* model = getInventoryModel();
if(!model) return FALSE;
@@ -3544,25 +3708,6 @@ void LLFolderBridge::pasteClipboard(void* user_data)
if(self) self->pasteFromClipboard();
}
-void LLFolderBridge::createNewCategory(void* user_data)
-{
- LLFolderBridge* bridge = (LLFolderBridge*)user_data;
- if(!bridge) return;
- LLInventoryPanel* panel = bridge->mInventoryPanel.get();
- if (!panel) return;
- LLInventoryModel* model = panel->getModel();
- if(!model) return;
- LLUUID id;
- id = model->createNewCategory(bridge->getUUID(),
- LLFolderType::FT_NONE,
- LLStringUtil::null);
- model->notifyObservers();
-
- // At this point, the bridge has probably been deleted, but the
- // view is still there.
- panel->setSelection(id, TAKE_FOCUS_YES);
-}
-
void LLFolderBridge::createNewShirt(void* user_data)
{
LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_SHIRT);
@@ -3628,6 +3773,24 @@ void LLFolderBridge::createNewEyes(void* user_data)
LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_EYES);
}
+EInventorySortGroup LLFolderBridge::getSortGroup() const
+{
+ LLFolderType::EType preferred_type = getPreferredType();
+
+ if (preferred_type == LLFolderType::FT_TRASH)
+ {
+ return SG_TRASH_FOLDER;
+ }
+
+ if(LLFolderType::lookupIsProtectedType(preferred_type))
+ {
+ return SG_SYSTEM_FOLDER;
+ }
+
+ return SG_NORMAL_FOLDER;
+}
+
+
// static
void LLFolderBridge::createWearable(LLFolderBridge* bridge, LLWearableType::EType type)
{
@@ -3730,9 +3893,10 @@ void LLFolderBridge::dropToFavorites(LLInventoryItem* inv_item)
LLPointer<AddFavoriteLandmarkCallback> cb = new AddFavoriteLandmarkCallback();
LLInventoryPanel* panel = mInventoryPanel.get();
LLFolderViewItem* drag_over_item = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL;
- if (drag_over_item && drag_over_item->getListener())
+ LLFolderViewModelItemInventory* view_model = drag_over_item ? static_cast<LLFolderViewModelItemInventory*>(drag_over_item->getViewModelItem()) : NULL;
+ if (view_model)
{
- cb.get()->setTargetLandmarkId(drag_over_item->getListener()->getUUID());
+ cb.get()->setTargetLandmarkId(view_model->getUUID());
}
copy_inventory_item(
@@ -3781,7 +3945,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
LLInventoryPanel* destination_panel = mInventoryPanel.get();
if (!destination_panel) return false;
- LLInventoryFilter* filter = destination_panel->getFilter();
+ LLInventoryFilter* filter = getInventoryFilter();
if (!filter) return false;
const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);
@@ -3898,13 +4062,10 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
// passes the filter of the destination panel.
if (accept && active_panel)
{
- LLFolderView* active_folder_view = active_panel->getRootFolder();
- if (!active_folder_view) return false;
-
- LLFolderViewItem* fv_item = active_folder_view->getItemByID(inv_item->getUUID());
+ LLFolderViewItem* fv_item = active_panel->getItemByID(inv_item->getUUID());
if (!fv_item) return false;
- accept = filter->check(fv_item);
+ accept = filter->check(fv_item->getViewModelItem());
}
if (accept && drop)
@@ -3916,6 +4077,8 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
}
// If an item is being dragged between windows, unselect everything in the active window
// so that we don't follow the selection to its new location (which is very annoying).
+ // RN: a better solution would be to deselect automatically when an item is moved
+ // and then select any item that is dropped only in the panel that it is dropped in
if (active_panel && (destination_panel != active_panel))
{
active_panel->unSelectAll();
@@ -3933,8 +4096,8 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
if (itemp)
{
LLUUID srcItemId = inv_item->getUUID();
- LLUUID destItemId = itemp->getListener()->getUUID();
- gInventory.rearrangeFavoriteLandmarks(srcItemId, destItemId);
+ LLUUID destItemId = static_cast<LLFolderViewModelItemInventory*>(itemp->getViewModelItem())->getUUID();
+ LLFavoritesOrderStorage::instance().rearrangeFavoriteLandmarks(srcItemId, destItemId);
}
}
@@ -3966,7 +4129,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
else
{
// set up observer to select item once drag and drop from inbox is complete
- if (gInventory.isObjectDescendentOf(inv_item->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false)))
+ if (gInventory.isObjectDescendentOf(inv_item->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false)))
{
set_dad_inbox_object(inv_item->getUUID());
}
@@ -4121,13 +4284,10 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
// passes the filter of the destination panel.
if (accept && active_panel)
{
- LLFolderView* active_folder_view = active_panel->getRootFolder();
- if (!active_folder_view) return false;
-
- LLFolderViewItem* fv_item = active_folder_view->getItemByID(inv_item->getUUID());
+ LLFolderViewItem* fv_item = active_panel->getItemByID(inv_item->getUUID());
if (!fv_item) return false;
- accept = filter->check(fv_item);
+ accept = filter->check(fv_item->getViewModelItem());
}
if (accept && drop)
@@ -4167,10 +4327,10 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
// static
bool check_category(LLInventoryModel* model,
const LLUUID& cat_id,
- LLFolderView* active_folder_view,
+ LLInventoryPanel* active_panel,
LLInventoryFilter* filter)
{
- if (!model || !active_folder_view || !filter)
+ if (!model || !active_panel || !filter)
return false;
if (!filter->checkFolder(cat_id))
@@ -4190,13 +4350,13 @@ bool check_category(LLInventoryModel* model,
// Empty folder should be checked as any other folder view item.
// If we are filtering by date the folder should not pass because
// it doesn't have its own creation date. See LLInvFVBridge::getCreationDate().
- return check_item(cat_id, active_folder_view, filter);
+ return check_item(cat_id, active_panel, filter);
}
for (S32 i = 0; i < num_descendent_categories; ++i)
{
LLInventoryCategory* category = descendent_categories[i];
- if(!check_category(model, category->getUUID(), active_folder_view, filter))
+ if(!check_category(model, category->getUUID(), active_panel, filter))
{
return false;
}
@@ -4205,7 +4365,7 @@ bool check_category(LLInventoryModel* model,
for (S32 i = 0; i < num_descendent_items; ++i)
{
LLViewerInventoryItem* item = descendent_items[i];
- if(!check_item(item->getUUID(), active_folder_view, filter))
+ if(!check_item(item->getUUID(), active_panel, filter))
{
return false;
}
@@ -4216,15 +4376,15 @@ bool check_category(LLInventoryModel* model,
// static
bool check_item(const LLUUID& item_id,
- LLFolderView* active_folder_view,
+ LLInventoryPanel* active_panel,
LLInventoryFilter* filter)
{
- if (!active_folder_view || !filter) return false;
+ if (!active_panel || !filter) return false;
- LLFolderViewItem* fv_item = active_folder_view->getItemByID(item_id);
+ LLFolderViewItem* fv_item = active_panel->getItemByID(item_id);
if (!fv_item) return false;
- return filter->check(fv_item);
+ return filter->check(fv_item->getViewModelItem());
}
// +=================================================+
@@ -4326,15 +4486,6 @@ void LLSoundBridge::openItem()
}
}
-void LLSoundBridge::previewItem()
-{
- LLViewerInventoryItem* item = getItem();
- if(item)
- {
- send_sound_trigger(item->getAssetUUID(), 1.0);
- }
-}
-
void LLSoundBridge::openSoundPreview(void* which)
{
LLSoundBridge *me = (LLSoundBridge *)which;
@@ -4552,7 +4703,7 @@ LLCallingCardBridge::~LLCallingCardBridge()
void LLCallingCardBridge::refreshFolderViewItem()
{
LLInventoryPanel* panel = mInventoryPanel.get();
- LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL;
+ LLFolderViewItem* itemp = panel ? panel->getItemByID(mUUID) : NULL;
if (itemp)
{
itemp->refresh();
@@ -4568,19 +4719,16 @@ void LLCallingCardBridge::performAction(LLInventoryModel* model, std::string act
if (item && (item->getCreatorUUID() != gAgent.getID()) &&
(!item->getCreatorUUID().isNull()))
{
- std::string callingcard_name;
- gCacheName->getFullName(item->getCreatorUUID(), callingcard_name);
- // IDEVO
+ std::string callingcard_name = LLCacheName::getDefaultName();
LLAvatarName av_name;
- if (LLAvatarNameCache::useDisplayNames()
- && LLAvatarNameCache::get(item->getCreatorUUID(), &av_name))
+ if (LLAvatarNameCache::get(item->getCreatorUUID(), &av_name))
{
- callingcard_name = av_name.mDisplayName + " (" + av_name.mUsername + ")";
+ callingcard_name = av_name.getCompleteName();
}
LLUUID session_id = gIMMgr->addSession(callingcard_name, IM_NOTHING_SPECIAL, item->getCreatorUUID());
if (session_id != LLUUID::null)
{
- LLIMFloater::show(session_id);
+ LLFloaterIMContainer::getInstance()->showConversation(session_id);
}
}
}
@@ -4658,6 +4806,10 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
disabled_items.push_back(std::string("Share"));
}
+ if ((flags & FIRST_SELECTED_ITEM) == 0)
+ {
+ disabled_items.push_back(std::string("Open"));
+ }
addOpenRightClickMenuOption(items);
items.push_back(std::string("Properties"));
@@ -5322,6 +5474,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
p.on_enable.parameter = cbparams;
LLView* parent = attachment->getIsHUDAttachment() ? attach_hud_menu : attach_menu;
LLUICtrlFactory::create<LLMenuItemCallGL>(p, parent);
+ items.push_back(p.name);
}
}
}
@@ -5343,11 +5496,10 @@ BOOL LLObjectBridge::renameItem(const std::string& new_name)
{
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
new_item->rename(new_name);
- buildDisplayName(new_item, mDisplayName);
new_item->updateServer(FALSE);
model->updateItem(new_item);
-
model->notifyObservers();
+ buildDisplayName();
if (isAgentAvatarValid())
{
@@ -5624,7 +5776,8 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
items.push_back(std::string("Wearable Edit"));
- if ((flags & FIRST_SELECTED_ITEM) == 0)
+ bool modifiable = !gAgentWearables.isWearableModifiable(item->getUUID());
+ if (((flags & FIRST_SELECTED_ITEM) == 0) || modifiable)
{
disabled_items.push_back(std::string("Wearable Edit"));
}
@@ -5947,16 +6100,6 @@ void LLMeshBridge::openItem()
}
}
-void LLMeshBridge::previewItem()
-{
- LLViewerInventoryItem* item = getItem();
- if(item)
- {
- // preview mesh
- }
-}
-
-
void LLMeshBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
lldebugs << "LLMeshBridge::buildContextMenu()" << llendl;
@@ -6045,14 +6188,15 @@ void LLLinkFolderBridge::gotoItem()
const LLUUID &cat_uuid = getFolderID();
if (!cat_uuid.isNull())
{
- if (LLFolderViewItem *base_folder = mRoot->getItemByID(cat_uuid))
+ LLFolderViewItem *base_folder = mInventoryPanel.get()->getItemByID(cat_uuid);
+ if (base_folder)
{
if (LLInventoryModel* model = getInventoryModel())
{
model->fetchDescendentsOf(cat_uuid);
}
base_folder->setOpen(TRUE);
- mRoot->setSelectionFromRoot(base_folder,TRUE);
+ mRoot->setSelection(base_folder,TRUE);
mRoot->scrollToShowSelection();
}
}
@@ -6383,9 +6527,8 @@ LLInvFVBridgeAction* LLInvFVBridgeAction::createAction(LLAssetType::EType asset_
/************************************************************************/
void LLRecentItemsFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
- LLFolderBridge::buildContextMenu(menu, flags);
-
- menuentry_vec_t disabled_items, items = getMenuItems();
+ menuentry_vec_t disabled_items, items;
+ buildContextMenuOptions(flags, items, disabled_items);
items.erase(std::remove(items.begin(), items.end(), std::string("New Folder")), items.end());
@@ -6397,42 +6540,29 @@ LLInvFVBridge* LLRecentInventoryBridgeBuilder::createBridge(
LLAssetType::EType actual_asset_type,
LLInventoryType::EType inv_type,
LLInventoryPanel* inventory,
+ LLFolderViewModelInventory* view_model,
LLFolderView* root,
const LLUUID& uuid,
U32 flags /*= 0x00*/ ) const
{
LLInvFVBridge* new_listener = NULL;
- switch(asset_type)
+ if (asset_type == LLAssetType::AT_CATEGORY
+ && actual_asset_type != LLAssetType::AT_LINK_FOLDER)
{
- case LLAssetType::AT_CATEGORY:
- if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)
+ new_listener = new LLRecentItemsFolderBridge(inv_type, inventory, root, uuid);
+ }
+ else
{
- // *TODO: Create a link folder handler instead if it is necessary
- new_listener = LLInventoryFVBridgeBuilder::createBridge(
- asset_type,
+ new_listener = LLInventoryFolderViewModelBuilder::createBridge(asset_type,
actual_asset_type,
inv_type,
inventory,
+ view_model,
root,
uuid,
flags);
- break;
}
- new_listener = new LLRecentItemsFolderBridge(inv_type, inventory, root, uuid);
- break;
- default:
- new_listener = LLInventoryFVBridgeBuilder::createBridge(
- asset_type,
- actual_asset_type,
- inv_type,
- inventory,
- root,
- uuid,
- flags);
- }
return new_listener;
-
}
-
// EOF
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 118430efe1..5c6cf0f0f0 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -29,11 +29,13 @@
#include "llcallingcard.h"
#include "llfloaterproperties.h"
-#include "llfoldervieweventlistener.h"
+#include "llfolderviewmodel.h"
#include "llinventorymodel.h"
#include "llinventoryobserver.h"
+#include "llinventorypanel.h"
#include "llviewercontrol.h"
#include "llwearable.h"
+#include "lltooldraganddrop.h"
class LLInventoryFilter;
class LLInventoryPanel;
@@ -41,7 +43,7 @@ class LLInventoryModel;
class LLMenuGL;
class LLCallingCardObserver;
class LLViewerJointAttachment;
-
+class LLFolderView;
typedef std::vector<std::string> menuentry_vec_t;
@@ -56,7 +58,7 @@ typedef std::vector<std::string> menuentry_vec_t;
// functionality a bit. (except for folders, you can create those
// manually...)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLInvFVBridge : public LLFolderViewEventListener
+class LLInvFVBridge : public LLFolderViewModelItemInventory
{
public:
// This method is a convenience function which creates the correct
@@ -65,6 +67,7 @@ public:
LLAssetType::EType actual_asset_type,
LLInventoryType::EType inv_type,
LLInventoryPanel* inventory,
+ LLFolderViewModelInventory* view_model,
LLFolderView* root,
const LLUUID& uuid,
U32 flags = 0x00);
@@ -78,23 +81,25 @@ public:
// LLInvFVBridge functionality
//--------------------------------------------------------------------
virtual const LLUUID& getUUID() const { return mUUID; }
- virtual void clearDisplayName() {}
+ virtual void clearDisplayName() { mDisplayName.clear(); }
virtual void restoreItem() {}
virtual void restoreToWorld() {}
//--------------------------------------------------------------------
- // Inherited LLFolderViewEventListener functions
+ // Inherited LLFolderViewModelItemInventory functions
//--------------------------------------------------------------------
virtual const std::string& getName() const;
virtual const std::string& getDisplayName() const;
+ const std::string& getSearchableName() const { return mSearchableName; }
+
virtual PermissionMask getPermissionMask() const;
virtual LLFolderType::EType getPreferredType() const;
virtual time_t getCreationDate() const;
+ virtual void setCreationDate(time_t creation_date_utc);
virtual LLFontGL::StyleFlags getLabelStyle() const { return LLFontGL::NORMAL; }
virtual std::string getLabelSuffix() const { return LLStringUtil::null; }
virtual void openItem() {}
virtual void closeItem() {}
- virtual void previewItem() {openItem();}
virtual void showProperties();
virtual BOOL isItemRenameable() const { return TRUE; }
//virtual BOOL renameItem(const std::string& new_name) {}
@@ -102,9 +107,10 @@ public:
virtual BOOL isItemMovable() const;
virtual BOOL isItemInTrash() const;
virtual BOOL isLink() const;
+ virtual BOOL isLibraryItem() const;
//virtual BOOL removeItem() = 0;
- virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch);
- virtual void move(LLFolderViewEventListener* new_parent_bridge) {}
+ virtual void removeBatch(std::vector<LLFolderViewModelItem*>& batch);
+ virtual void move(LLFolderViewModelItem* new_parent_bridge) {}
virtual BOOL isItemCopyable() const { return FALSE; }
virtual BOOL copyToClipboard() const;
virtual BOOL cutToClipboard() const;
@@ -115,6 +121,7 @@ public:
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 LLToolDragAndDrop::ESource getDragSource() const;
virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const;
virtual BOOL dragOrDrop(MASK mask, BOOL drop,
EDragAndDropType cargo_type,
@@ -122,6 +129,9 @@ public:
std::string& tooltip_msg) { return FALSE; }
virtual LLInventoryType::EType getInventoryType() const { return mInvType; }
virtual LLWearableType::EType getWearableType() const { return LLWearableType::WT_NONE; }
+ EInventorySortGroup getSortGroup() const { return SG_ITEM; }
+ virtual LLInventoryObject* getInventoryObject() const;
+
//--------------------------------------------------------------------
// Convenience functions for adding various common menu options.
@@ -138,16 +148,16 @@ protected:
protected:
LLInvFVBridge(LLInventoryPanel* inventory, LLFolderView* root, const LLUUID& uuid);
- LLInventoryObject* getInventoryObject() const;
LLInventoryModel* getInventoryModel() const;
+ LLInventoryFilter* getInventoryFilter() 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
- BOOL isInboxFolder() const; // true if COF or descendent of marketplace inbox
- BOOL isOutboxFolder() const; // true if COF or descendent of marketplace outbox
+ BOOL isCOFFolder() const; // true if COF or descendant of
+ BOOL isInboxFolder() const; // true if COF or descendant of marketplace inbox
+ BOOL isOutboxFolder() const; // true if COF or descendant of marketplace outbox
BOOL isOutboxFolderDirectParent() const;
const LLUUID getOutboxFolder() const;
@@ -160,30 +170,36 @@ protected:
LLViewerInventoryCategory* item,
const LLUUID& new_parent,
BOOL restamp);
- void removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch);
+ void removeBatchNoCheck(std::vector<LLFolderViewModelItem*>& batch);
protected:
LLHandle<LLInventoryPanel> mInventoryPanel;
LLFolderView* mRoot;
const LLUUID mUUID; // item id
LLInventoryType::EType mInvType;
- BOOL mIsLink;
+ bool mIsLink;
+ LLTimer mTimeSinceRequestStart;
+ mutable std::string mDisplayName;
+ mutable std::string mSearchableName;
+
void purgeItem(LLInventoryModel *model, const LLUUID &uuid);
+ virtual void buildDisplayName() const {}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInvFVBridgeBuilder
+// Class LLInventoryFolderViewModelBuilder
//
-// This class intended to build Folder View Bridge via LLInvFVBridge::createBridge.
-// It can be overridden with another way of creation necessary Inventory-Folder-View-Bridge.
+// This class intended to build Folder View Model via LLInvFVBridge::createBridge.
+// It can be overridden with another way of creation necessary Inventory Folder View Models.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLInventoryFVBridgeBuilder
+class LLInventoryFolderViewModelBuilder
{
public:
- virtual ~LLInventoryFVBridgeBuilder() {}
+ virtual ~LLInventoryFolderViewModelBuilder() {}
virtual LLInvFVBridge* createBridge(LLAssetType::EType asset_type,
LLAssetType::EType actual_asset_type,
LLInventoryType::EType inv_type,
LLInventoryPanel* inventory,
+ LLFolderViewModelInventory* view_model,
LLFolderView* root,
const LLUUID& uuid,
U32 flags = 0x00) const;
@@ -205,7 +221,6 @@ public:
virtual void restoreToWorld();
virtual void gotoItem();
virtual LLUIImagePtr getIcon() const;
- virtual const std::string& getDisplayName() const;
virtual std::string getLabelSuffix() const;
virtual LLFontGL::StyleFlags getLabelStyle() const;
virtual PermissionMask getPermissionMask() const;
@@ -214,18 +229,17 @@ public:
virtual BOOL renameItem(const std::string& new_name);
virtual BOOL removeItem();
virtual BOOL isItemCopyable() const;
- virtual BOOL hasChildren() const { return FALSE; }
+ virtual bool hasChildren() const { return FALSE; }
virtual BOOL isUpToDate() const { return TRUE; }
- /*virtual*/ void clearDisplayName() { mDisplayName.clear(); }
+ virtual LLUIImagePtr getIconOverlay() const;
LLViewerInventoryItem* getItem() const;
protected:
BOOL confirmRemoveItem(const LLSD& notification, const LLSD& response);
virtual BOOL isItemPermissive() const;
- static void buildDisplayName(LLInventoryItem* item, std::string& name);
+ virtual void buildDisplayName() const;
- mutable std::string mDisplayName;
};
class LLFolderBridge : public LLInvFVBridge
@@ -233,15 +247,18 @@ class LLFolderBridge : public LLInvFVBridge
public:
LLFolderBridge(LLInventoryPanel* inventory,
LLFolderView* root,
- const LLUUID& uuid) :
- LLInvFVBridge(inventory, root, uuid),
+ const LLUUID& uuid)
+ : LLInvFVBridge(inventory, root, uuid),
mCallingCards(FALSE),
- mWearables(FALSE)
+ mWearables(FALSE),
+ mIsLoading(false)
{}
BOOL dragItemIntoFolder(LLInventoryItem* inv_item, BOOL drop, std::string& tooltip_msg);
BOOL dragCategoryIntoFolder(LLInventoryCategory* inv_category, BOOL drop, std::string& tooltip_msg);
+ virtual void buildDisplayName() const;
+
virtual void performAction(LLInventoryModel* model, std::string action);
virtual void openItem();
virtual void closeItem();
@@ -251,7 +268,9 @@ public:
virtual LLFolderType::EType getPreferredType() const;
virtual LLUIImagePtr getIcon() const;
- virtual LLUIImagePtr getOpenIcon() const;
+ virtual LLUIImagePtr getIconOpen() const;
+ virtual LLUIImagePtr getIconOverlay() const;
+
static LLUIImagePtr getIcon(LLFolderType::EType preferred_type);
virtual BOOL renameItem(const std::string& new_name);
@@ -259,11 +278,12 @@ public:
virtual BOOL removeItem();
BOOL removeSystemFolder();
bool removeItemResponse(const LLSD& notification, const LLSD& response);
+ void updateHierarchyCreationDate(time_t date);
virtual void pasteFromClipboard();
virtual void pasteLinkFromClipboard();
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
- virtual BOOL hasChildren() const;
+ virtual bool hasChildren() const;
virtual BOOL dragOrDrop(MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
@@ -276,20 +296,24 @@ public:
virtual BOOL isClipboardPasteable() const;
virtual BOOL isClipboardPasteableAsLink() const;
+ EInventorySortGroup getSortGroup() const;
+ virtual void update();
+
static void createWearable(LLFolderBridge* bridge, LLWearableType::EType type);
LLViewerInventoryCategory* getCategory() const;
LLHandle<LLFolderBridge> getHandle() { mHandle.bind(this); return mHandle; }
+ bool isLoading() { return mIsLoading; }
+
protected:
- void buildContextMenuBaseOptions(U32 flags);
- void buildContextMenuFolderOptions(U32 flags);
+ void buildContextMenuOptions(U32 flags, menuentry_vec_t& items, menuentry_vec_t& disabled_items);
+ void buildContextMenuFolderOptions(U32 flags, menuentry_vec_t& items, menuentry_vec_t& disabled_items);
//--------------------------------------------------------------------
// Menu callbacks
//--------------------------------------------------------------------
static void pasteClipboard(void* user_data);
- static void createNewCategory(void* user_data);
static void createNewShirt(void* user_data);
static void createNewPants(void* user_data);
static void createNewShoes(void* user_data);
@@ -309,8 +333,6 @@ protected:
void modifyOutfit(BOOL append);
void determineFolderType();
- menuentry_vec_t getMenuItems() { return mItems; } // returns a copy of current menu items
-
void dropToFavorites(LLInventoryItem* inv_item);
void dropToOutfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit);
@@ -322,10 +344,11 @@ public:
static void staticFolderOptionsMenu();
private:
- BOOL mCallingCards;
- BOOL mWearables;
- menuentry_vec_t mItems;
- menuentry_vec_t mDisabledItems;
+
+ bool mCallingCards;
+ bool mWearables;
+ bool mIsLoading;
+ LLTimer mTimeSinceRequestStart;
LLRootHandle<LLFolderBridge> mHandle;
};
@@ -355,7 +378,6 @@ public:
const LLUUID& uuid) :
LLItemBridge(inventory, root, uuid) {}
virtual void openItem();
- virtual void previewItem();
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
static void openSoundPreview(void*);
};
@@ -545,7 +567,6 @@ class LLMeshBridge : public LLItemBridge
public:
virtual LLUIImagePtr getIcon() const;
virtual void openItem();
- virtual void previewItem();
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
protected:
@@ -621,7 +642,7 @@ public:
};
// Bridge builder to create Inventory-Folder-View-Bridge for Recent Inventory Panel
-class LLRecentInventoryBridgeBuilder : public LLInventoryFVBridgeBuilder
+class LLRecentInventoryBridgeBuilder : public LLInventoryFolderViewModelBuilder
{
public:
// Overrides FolderBridge for Recent Inventory Panel.
@@ -630,6 +651,7 @@ public:
LLAssetType::EType actual_asset_type,
LLInventoryType::EType inv_type,
LLInventoryPanel* inventory,
+ LLFolderViewModelInventory* view_model,
LLFolderView* root,
const LLUUID& uuid,
U32 flags = 0x00) const;
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index 4573074c73..92f2d33073 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -29,7 +29,7 @@
#include "llinventoryfilter.h"
// viewer includes
-#include "llfoldervieweventlistener.h"
+#include "llfolderviewmodel.h"
#include "llfolderviewitem.h"
#include "llinventorymodel.h"
#include "llinventorymodelbackgroundfetch.h"
@@ -44,107 +44,86 @@
LLFastTimer::DeclareTimer FT_FILTER_CLIPBOARD("Filter Clipboard");
-LLInventoryFilter::FilterOps::FilterOps() :
- mFilterObjectTypes(0xffffffffffffffffULL),
- mFilterCategoryTypes(0xffffffffffffffffULL),
- mFilterWearableTypes(0xffffffffffffffffULL),
- mMinDate(time_min()),
- mMaxDate(time_max()),
- mHoursAgo(0),
- mShowFolderState(SHOW_NON_EMPTY_FOLDERS),
- mPermissions(PERM_NONE),
- mFilterTypes(FILTERTYPE_OBJECT),
- mFilterUUID(LLUUID::null),
- mFilterLinks(FILTERLINK_INCLUDE_LINKS)
+LLInventoryFilter::FilterOps::FilterOps(const Params& p)
+: mFilterObjectTypes(p.object_types),
+ mFilterCategoryTypes(p.category_types),
+ mFilterWearableTypes(p.wearable_types),
+ mMinDate(p.date_range.min_date),
+ mMaxDate(p.date_range.max_date),
+ mHoursAgo(p.hours_ago),
+ mShowFolderState(p.show_folder_state),
+ mPermissions(p.permissions),
+ mFilterTypes(p.types),
+ mFilterUUID(p.uuid),
+ mFilterLinks(p.links)
{
}
///----------------------------------------------------------------------------
/// Class LLInventoryFilter
///----------------------------------------------------------------------------
-LLInventoryFilter::LLInventoryFilter(const std::string& name)
-: mName(name),
- mModified(FALSE),
- mNeedTextRebuild(TRUE),
- mEmptyLookupMessage("InventoryNoMatchingItems")
+LLInventoryFilter::LLInventoryFilter(const Params& p)
+: mName(p.name),
+ mFilterModified(FILTER_NONE),
+ mEmptyLookupMessage("InventoryNoMatchingItems"),
+ mFilterOps(p.filter_ops),
+ mFilterSubString(p.substring),
+ mCurrentGeneration(0),
+ mFirstRequiredGeneration(0),
+ mFirstSuccessGeneration(0),
+ mFilterCount(0)
{
- mOrder = SO_FOLDERS_BY_NAME; // This gets overridden by a pref immediately
-
- mSubStringMatchOffset = 0;
- mFilterSubString.clear();
- mFilterGeneration = 0;
- mMustPassGeneration = S32_MAX;
- mMinRequiredGeneration = 0;
- mFilterCount = 0;
- mNextFilterGeneration = mFilterGeneration + 1;
-
- mLastLogoff = gSavedPerAccountSettings.getU32("LastLogoff");
- mFilterBehavior = FILTER_NONE;
+ mNextFilterGeneration = mCurrentGeneration + 1;
// copy mFilterOps into mDefaultFilterOps
markDefault();
}
-LLInventoryFilter::~LLInventoryFilter()
-{
-}
-
-BOOL LLInventoryFilter::check(const LLFolderViewItem* item)
+bool LLInventoryFilter::check(const LLFolderViewModelItem* item)
{
+ const LLFolderViewModelItemInventory* listener = dynamic_cast<const LLFolderViewModelItemInventory*>(item);
// Clipboard cut items are *always* filtered so we need this value upfront
- const LLFolderViewEventListener* listener = item->getListener();
const BOOL passed_clipboard = (listener ? checkAgainstClipboard(listener->getUUID()) : TRUE);
// If it's a folder and we're showing all folders, return automatically.
- const BOOL is_folder = (dynamic_cast<const LLFolderViewFolder*>(item) != NULL);
+ const BOOL is_folder = listener->getInventoryType() == LLInventoryType::IT_CATEGORY;
if (is_folder && (mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS))
{
return passed_clipboard;
}
- mSubStringMatchOffset = mFilterSubString.size() ? item->getSearchableLabel().find(mFilterSubString) : std::string::npos;
+ std::string::size_type string_offset = mFilterSubString.size() ? listener->getSearchableName().find(mFilterSubString) : std::string::npos;
- const BOOL passed_filtertype = checkAgainstFilterType(item);
- const BOOL passed_permissions = checkAgainstPermissions(item);
- const BOOL passed_filterlink = checkAgainstFilterLinks(item);
- const BOOL passed = (passed_filtertype &&
- passed_permissions &&
- passed_filterlink &&
- passed_clipboard &&
- (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos));
+ BOOL passed = (mFilterSubString.size() == 0 || string_offset != std::string::npos);
+ passed = passed && checkAgainstFilterType(listener);
+ passed = passed && checkAgainstPermissions(listener);
+ passed = passed && checkAgainstFilterLinks(listener);
+ passed = passed && passed_clipboard;
return passed;
}
bool LLInventoryFilter::check(const LLInventoryItem* item)
{
- mSubStringMatchOffset = mFilterSubString.size() ? item->getName().find(mFilterSubString) : std::string::npos;
+ std::string::size_type string_offset = mFilterSubString.size() ? item->getName().find(mFilterSubString) : std::string::npos;
const bool passed_filtertype = checkAgainstFilterType(item);
const bool passed_permissions = checkAgainstPermissions(item);
const BOOL passed_clipboard = checkAgainstClipboard(item->getUUID());
- const bool passed = (passed_filtertype &&
- passed_permissions &&
- passed_clipboard &&
- (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos));
+ const bool passed = (passed_filtertype
+ && passed_permissions
+ && passed_clipboard
+ && (mFilterSubString.size() == 0 || string_offset != std::string::npos));
return passed;
}
-bool LLInventoryFilter::checkFolder(const LLFolderViewFolder* folder) const
+bool LLInventoryFilter::checkFolder(const LLFolderViewModelItem* item) const
{
- if (!folder)
- {
- llwarns << "The filter can not be checked on an invalid folder." << llendl;
- llassert(false); // crash in development builds
- return false;
- }
-
- const LLFolderViewEventListener* listener = folder->getListener();
+ const LLFolderViewModelItemInventory* listener = dynamic_cast<const LLFolderViewModelItemInventory*>(item);
if (!listener)
{
- llwarns << "Folder view event listener not found." << llendl;
- llassert(false); // crash in development builds
+ llerrs << "Folder view event listener not found." << llendl;
return false;
}
@@ -155,6 +134,13 @@ bool LLInventoryFilter::checkFolder(const LLFolderViewFolder* folder) const
bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const
{
+ // when applying a filter, matching folders get their contents downloaded first
+ if (isNotDefault()
+ && !gInventory.isCategoryComplete(folder_id))
+ {
+ LLInventoryModelBackgroundFetch::instance().start(folder_id);
+ }
+
// Always check against the clipboard
const BOOL passed_clipboard = checkAgainstClipboard(folder_id);
@@ -163,14 +149,14 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const
{
return passed_clipboard;
}
-
+
if (mFilterOps.mFilterTypes & FILTERTYPE_CATEGORY)
{
// Can only filter categories for items in your inventory
// (e.g. versus in-world object contents).
const LLViewerInventoryCategory *cat = gInventory.getCategory(folder_id);
if (!cat)
- return false;
+ return folder_id.isNull();
LLFolderType::EType cat_type = cat->getPreferredType();
if (cat_type != LLFolderType::FT_NONE && (1LL << cat_type & mFilterOps.mFilterCategoryTypes) == U64(0))
return false;
@@ -179,9 +165,8 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const
return passed_clipboard;
}
-BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) const
+bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInventory* listener) const
{
- const LLFolderViewEventListener* listener = item->getListener();
if (!listener) return FALSE;
LLInventoryType::EType object_type = listener->getInventoryType();
@@ -268,7 +253,7 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) con
}
}
}
-
+
return TRUE;
}
@@ -347,13 +332,12 @@ bool LLInventoryFilter::checkAgainstClipboard(const LLUUID& object_id) const
return true;
}
-BOOL LLInventoryFilter::checkAgainstPermissions(const LLFolderViewItem* item) const
+bool LLInventoryFilter::checkAgainstPermissions(const LLFolderViewModelItemInventory* listener) const
{
- const LLFolderViewEventListener* listener = item->getListener();
if (!listener) return FALSE;
PermissionMask perm = listener->getPermissionMask();
- const LLInvFVBridge *bridge = dynamic_cast<const LLInvFVBridge *>(item->getListener());
+ const LLInvFVBridge *bridge = dynamic_cast<const LLInvFVBridge *>(listener);
if (bridge && bridge->isLink())
{
const LLUUID& linked_uuid = gInventory.getLinkedItemID(bridge->getUUID());
@@ -375,9 +359,8 @@ bool LLInventoryFilter::checkAgainstPermissions(const LLInventoryItem* item) con
return (perm & mFilterOps.mPermissions) == mFilterOps.mPermissions;
}
-BOOL LLInventoryFilter::checkAgainstFilterLinks(const LLFolderViewItem* item) const
+bool LLInventoryFilter::checkAgainstFilterLinks(const LLFolderViewModelItemInventory* listener) const
{
- const LLFolderViewEventListener* listener = item->getListener();
if (!listener) return TRUE;
const LLUUID object_id = listener->getUUID();
@@ -397,20 +380,20 @@ const std::string& LLInventoryFilter::getFilterSubString(BOOL trim) const
return mFilterSubString;
}
-std::string::size_type LLInventoryFilter::getStringMatchOffset() const
+std::string::size_type LLInventoryFilter::getStringMatchOffset(LLFolderViewModelItem* item) const
{
- return mSubStringMatchOffset;
+ return mFilterSubString.size() ? item->getSearchableName().find(mFilterSubString) : std::string::npos;
}
-BOOL LLInventoryFilter::isDefault() const
+bool LLInventoryFilter::isDefault() const
{
return !isNotDefault();
}
// has user modified default filter params?
-BOOL LLInventoryFilter::isNotDefault() const
+bool LLInventoryFilter::isNotDefault() const
{
- BOOL not_default = FALSE;
+ S32 not_default = 0;
not_default |= (mFilterOps.mFilterObjectTypes != mDefaultFilterOps.mFilterObjectTypes);
not_default |= (mFilterOps.mFilterCategoryTypes != mDefaultFilterOps.mFilterCategoryTypes);
@@ -422,11 +405,11 @@ BOOL LLInventoryFilter::isNotDefault() const
not_default |= (mFilterOps.mMinDate != mDefaultFilterOps.mMinDate);
not_default |= (mFilterOps.mMaxDate != mDefaultFilterOps.mMaxDate);
not_default |= (mFilterOps.mHoursAgo != mDefaultFilterOps.mHoursAgo);
-
- return not_default;
+
+ return not_default != 0;
}
-BOOL LLInventoryFilter::isActive() const
+bool LLInventoryFilter::isActive() const
{
return mFilterOps.mFilterObjectTypes != 0xffffffffffffffffULL
|| mFilterOps.mFilterCategoryTypes != 0xffffffffffffffffULL
@@ -440,16 +423,9 @@ BOOL LLInventoryFilter::isActive() const
|| mFilterOps.mHoursAgo != 0;
}
-BOOL LLInventoryFilter::isModified() const
-{
- return mModified;
-}
-
-BOOL LLInventoryFilter::isModifiedAndClear()
+bool LLInventoryFilter::isModified() const
{
- BOOL ret = mModified;
- mModified = FALSE;
- return ret;
+ return mFilterModified != FILTER_NONE;
}
void LLInventoryFilter::updateFilterTypes(U64 types, U64& current_types)
@@ -613,9 +589,10 @@ void LLInventoryFilter::setDateRange(time_t min_date, time_t max_date)
void LLInventoryFilter::setDateRangeLastLogoff(BOOL sl)
{
+ static LLCachedControl<U32> s_last_logoff(gSavedPerAccountSettings, "LastLogoff", 0);
if (sl && !isSinceLogoff())
{
- setDateRange(mLastLogoff, time_max());
+ setDateRange(s_last_logoff(), time_max());
setModified();
}
if (!sl && isSinceLogoff())
@@ -634,17 +611,18 @@ void LLInventoryFilter::setDateRangeLastLogoff(BOOL sl)
}
}
-BOOL LLInventoryFilter::isSinceLogoff() const
+bool LLInventoryFilter::isSinceLogoff() const
{
- return (mFilterOps.mMinDate == (time_t)mLastLogoff) &&
+ static LLCachedControl<U32> s_last_logoff(gSavedSettings, "LastLogoff", 0);
+
+ return (mFilterOps.mMinDate == (time_t)s_last_logoff()) &&
(mFilterOps.mMaxDate == time_max()) &&
(mFilterOps.mFilterTypes & FILTERTYPE_DATE);
}
void LLInventoryFilter::clearModified()
{
- mModified = FALSE;
- mFilterBehavior = FILTER_NONE;
+ mFilterModified = FILTER_NONE;
}
void LLInventoryFilter::setHoursAgo(U32 hours)
@@ -722,15 +700,6 @@ void LLInventoryFilter::setShowFolderState(EFolderShow state)
}
}
-void LLInventoryFilter::setSortOrder(U32 order)
-{
- if (mOrder != order)
- {
- mOrder = order;
- setModified();
- }
-}
-
void LLInventoryFilter::markDefault()
{
mDefaultFilterOps = mFilterOps;
@@ -742,83 +711,68 @@ void LLInventoryFilter::resetDefault()
setModified();
}
-void LLInventoryFilter::setModified(EFilterBehavior behavior)
+void LLInventoryFilter::setModified(EFilterModified behavior)
{
- mModified = TRUE;
- mNeedTextRebuild = TRUE;
- mFilterGeneration = mNextFilterGeneration++;
+ mFilterText.clear();
+ mCurrentGeneration = mNextFilterGeneration++;
- if (mFilterBehavior == FILTER_NONE)
+ if (mFilterModified == FILTER_NONE)
{
- mFilterBehavior = behavior;
+ mFilterModified = behavior;
}
- else if (mFilterBehavior != behavior)
+ else if (mFilterModified != behavior)
{
// trying to do both less restrictive and more restrictive filter
// basically means restart from scratch
- mFilterBehavior = FILTER_RESTART;
+ mFilterModified = FILTER_RESTART;
}
- if (isNotDefault())
+ // if not keeping current filter results, update last valid as well
+ switch(mFilterModified)
{
- // 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;
- }
- }
- else
- {
- // shortcut disabled filters to show everything immediately
- mMinRequiredGeneration = 0;
- mMustPassGeneration = S32_MAX;
+ case FILTER_RESTART:
+ mFirstRequiredGeneration = mCurrentGeneration;
+ mFirstSuccessGeneration = mCurrentGeneration;
+ break;
+ case FILTER_LESS_RESTRICTIVE:
+ mFirstRequiredGeneration = mCurrentGeneration;
+ break;
+ case FILTER_MORE_RESTRICTIVE:
+ mFirstSuccessGeneration = mCurrentGeneration;
+ break;
+ default:
+ llerrs << "Bad filter behavior specified" << llendl;
}
}
-BOOL LLInventoryFilter::isFilterObjectTypesWith(LLInventoryType::EType t) const
+bool LLInventoryFilter::isFilterObjectTypesWith(LLInventoryType::EType t) const
{
return mFilterOps.mFilterObjectTypes & (1LL << t);
}
const std::string& LLInventoryFilter::getFilterText()
{
- if (!mNeedTextRebuild)
+ if (!mFilterText.empty())
{
return mFilterText;
}
- mNeedTextRebuild = FALSE;
std::string filtered_types;
std::string not_filtered_types;
BOOL filtered_by_type = FALSE;
BOOL filtered_by_all_types = TRUE;
S32 num_filter_types = 0;
+
mFilterText.clear();
if (isFilterObjectTypesWith(LLInventoryType::IT_ANIMATION))
{
- //filtered_types += " Animations,";
filtered_types += LLTrans::getString("Animations");
filtered_by_type = TRUE;
num_filter_types++;
}
else
{
- //not_filtered_types += " Animations,";
not_filtered_types += LLTrans::getString("Animations");
filtered_by_all_types = FALSE;
@@ -826,140 +780,120 @@ const std::string& LLInventoryFilter::getFilterText()
if (isFilterObjectTypesWith(LLInventoryType::IT_CALLINGCARD))
{
- //filtered_types += " Calling Cards,";
filtered_types += LLTrans::getString("Calling Cards");
filtered_by_type = TRUE;
num_filter_types++;
}
else
{
- //not_filtered_types += " Calling Cards,";
not_filtered_types += LLTrans::getString("Calling Cards");
filtered_by_all_types = FALSE;
}
if (isFilterObjectTypesWith(LLInventoryType::IT_WEARABLE))
{
- //filtered_types += " Clothing,";
filtered_types += LLTrans::getString("Clothing");
filtered_by_type = TRUE;
num_filter_types++;
}
else
{
- //not_filtered_types += " Clothing,";
not_filtered_types += LLTrans::getString("Clothing");
filtered_by_all_types = FALSE;
}
if (isFilterObjectTypesWith(LLInventoryType::IT_GESTURE))
{
- //filtered_types += " Gestures,";
filtered_types += LLTrans::getString("Gestures");
filtered_by_type = TRUE;
num_filter_types++;
}
else
{
- //not_filtered_types += " Gestures,";
not_filtered_types += LLTrans::getString("Gestures");
filtered_by_all_types = FALSE;
}
if (isFilterObjectTypesWith(LLInventoryType::IT_LANDMARK))
{
- //filtered_types += " Landmarks,";
filtered_types += LLTrans::getString("Landmarks");
filtered_by_type = TRUE;
num_filter_types++;
}
else
{
- //not_filtered_types += " Landmarks,";
not_filtered_types += LLTrans::getString("Landmarks");
filtered_by_all_types = FALSE;
}
if (isFilterObjectTypesWith(LLInventoryType::IT_NOTECARD))
{
- //filtered_types += " Notecards,";
filtered_types += LLTrans::getString("Notecards");
filtered_by_type = TRUE;
num_filter_types++;
}
else
{
- //not_filtered_types += " Notecards,";
not_filtered_types += LLTrans::getString("Notecards");
filtered_by_all_types = FALSE;
}
if (isFilterObjectTypesWith(LLInventoryType::IT_OBJECT) && isFilterObjectTypesWith(LLInventoryType::IT_ATTACHMENT))
{
- //filtered_types += " Objects,";
filtered_types += LLTrans::getString("Objects");
filtered_by_type = TRUE;
num_filter_types++;
}
else
{
- //not_filtered_types += " Objects,";
not_filtered_types += LLTrans::getString("Objects");
filtered_by_all_types = FALSE;
}
if (isFilterObjectTypesWith(LLInventoryType::IT_LSL))
{
- //filtered_types += " Scripts,";
filtered_types += LLTrans::getString("Scripts");
filtered_by_type = TRUE;
num_filter_types++;
}
else
{
- //not_filtered_types += " Scripts,";
not_filtered_types += LLTrans::getString("Scripts");
filtered_by_all_types = FALSE;
}
if (isFilterObjectTypesWith(LLInventoryType::IT_SOUND))
{
- //filtered_types += " Sounds,";
filtered_types += LLTrans::getString("Sounds");
filtered_by_type = TRUE;
num_filter_types++;
}
else
{
- //not_filtered_types += " Sounds,";
not_filtered_types += LLTrans::getString("Sounds");
filtered_by_all_types = FALSE;
}
if (isFilterObjectTypesWith(LLInventoryType::IT_TEXTURE))
{
- //filtered_types += " Textures,";
filtered_types += LLTrans::getString("Textures");
filtered_by_type = TRUE;
num_filter_types++;
}
else
{
- //not_filtered_types += " Textures,";
not_filtered_types += LLTrans::getString("Textures");
filtered_by_all_types = FALSE;
}
if (isFilterObjectTypesWith(LLInventoryType::IT_SNAPSHOT))
{
- //filtered_types += " Snapshots,";
filtered_types += LLTrans::getString("Snapshots");
filtered_by_type = TRUE;
num_filter_types++;
}
else
{
- //not_filtered_types += " Snapshots,";
not_filtered_types += LLTrans::getString("Snapshots");
filtered_by_all_types = FALSE;
}
@@ -975,7 +909,6 @@ const std::string& LLInventoryFilter::getFilterText()
}
else
{
- //mFilterText += "No ";
mFilterText += LLTrans::getString("No Filters");
mFilterText += not_filtered_types;
}
@@ -985,66 +918,55 @@ const std::string& LLInventoryFilter::getFilterText()
if (isSinceLogoff())
{
- //mFilterText += " - Since Logoff";
mFilterText += LLTrans::getString("Since Logoff");
}
return mFilterText;
}
-void LLInventoryFilter::toLLSD(LLSD& data) const
-{
- data["filter_types"] = (LLSD::Integer)getFilterObjectTypes();
- data["min_date"] = (LLSD::Integer)getMinDate();
- data["max_date"] = (LLSD::Integer)getMaxDate();
- data["hours_ago"] = (LLSD::Integer)getHoursAgo();
- data["show_folder_state"] = (LLSD::Integer)getShowFolderState();
- data["permissions"] = (LLSD::Integer)getFilterPermissions();
- data["substring"] = (LLSD::String)getFilterSubString();
- data["sort_order"] = (LLSD::Integer)getSortOrder();
- data["since_logoff"] = (LLSD::Boolean)isSinceLogoff();
-}
-void LLInventoryFilter::fromLLSD(LLSD& data)
+LLInventoryFilter& LLInventoryFilter::operator=( const LLInventoryFilter& other )
{
- if(data.has("filter_types"))
- {
- setFilterObjectTypes((U64)data["filter_types"].asInteger());
- }
-
- if(data.has("min_date") && data.has("max_date"))
- {
- setDateRange(data["min_date"].asInteger(), data["max_date"].asInteger());
- }
-
- if(data.has("hours_ago"))
- {
- setHoursAgo((U32)data["hours_ago"].asInteger());
- }
-
- if(data.has("show_folder_state"))
- {
- setShowFolderState((EFolderShow)data["show_folder_state"].asInteger());
- }
+ setFilterObjectTypes(other.getFilterObjectTypes());
+ setDateRange(other.getMinDate(), other.getMaxDate());
+ setHoursAgo(other.getHoursAgo());
+ setShowFolderState(other.getShowFolderState());
+ setFilterPermissions(other.getFilterPermissions());
+ setFilterSubString(other.getFilterSubString());
+ setDateRangeLastLogoff(other.isSinceLogoff());
+ return *this;
+}
- if(data.has("permissions"))
- {
- setFilterPermissions((PermissionMask)data["permissions"].asInteger());
- }
- if(data.has("substring"))
- {
- setFilterSubString(std::string(data["substring"].asString()));
- }
+void LLInventoryFilter::toParams(Params& params) const
+{
+ params.filter_ops.types = getFilterObjectTypes();
+ params.filter_ops.category_types = getFilterCategoryTypes();
+ params.filter_ops.wearable_types = getFilterWearableTypes();
+ params.filter_ops.date_range.min_date = getMinDate();
+ params.filter_ops.date_range.max_date = getMaxDate();
+ params.filter_ops.hours_ago = getHoursAgo();
+ params.filter_ops.show_folder_state = getShowFolderState();
+ params.filter_ops.permissions = getFilterPermissions();
+ params.substring = getFilterSubString();
+ params.since_logoff = isSinceLogoff();
+}
- if(data.has("sort_order"))
+void LLInventoryFilter::fromParams(const Params& params)
+{
+ if (!params.validateBlock())
{
- setSortOrder((U32)data["sort_order"].asInteger());
+ return;
}
- if(data.has("since_logoff"))
- {
- setDateRangeLastLogoff((bool)data["since_logoff"].asBoolean());
- }
+ setFilterObjectTypes(params.filter_ops.types);
+ setFilterCategoryTypes(params.filter_ops.category_types);
+ setFilterWearableTypes(params.filter_ops.wearable_types);
+ setDateRange(params.filter_ops.date_range.min_date, params.filter_ops.date_range.max_date);
+ setHoursAgo(params.filter_ops.hours_ago);
+ setShowFolderState(params.filter_ops.show_folder_state);
+ setFilterPermissions(params.filter_ops.permissions);
+ setFilterSubString(params.substring);
+ setDateRangeLastLogoff(params.since_logoff);
}
U64 LLInventoryFilter::getFilterObjectTypes() const
@@ -1057,11 +979,21 @@ U64 LLInventoryFilter::getFilterCategoryTypes() const
return mFilterOps.mFilterCategoryTypes;
}
-BOOL LLInventoryFilter::hasFilterString() const
+U64 LLInventoryFilter::getFilterWearableTypes() const
+{
+ return mFilterOps.mFilterWearableTypes;
+}
+
+bool LLInventoryFilter::hasFilterString() const
{
return mFilterSubString.size() > 0;
}
+std::string::size_type LLInventoryFilter::getFilterStringSize() const
+{
+ return mFilterSubString.size();
+}
+
PermissionMask LLInventoryFilter::getFilterPermissions() const
{
return mFilterOps.mPermissions;
@@ -1088,14 +1020,6 @@ 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)
{
@@ -1113,15 +1037,15 @@ void LLInventoryFilter::decrementFilterCount()
S32 LLInventoryFilter::getCurrentGeneration() const
{
- return mFilterGeneration;
+ return mCurrentGeneration;
}
-S32 LLInventoryFilter::getMinRequiredGeneration() const
+S32 LLInventoryFilter::getFirstSuccessGeneration() const
{
- return mMinRequiredGeneration;
+ return mFirstSuccessGeneration;
}
-S32 LLInventoryFilter::getMustPassGeneration() const
+S32 LLInventoryFilter::getFirstRequiredGeneration() const
{
- return mMustPassGeneration;
+ return mFirstRequiredGeneration;
}
void LLInventoryFilter::setEmptyLookupMessage(const std::string& message)
@@ -1129,9 +1053,12 @@ void LLInventoryFilter::setEmptyLookupMessage(const std::string& message)
mEmptyLookupMessage = message;
}
-const std::string& LLInventoryFilter::getEmptyLookupMessage() const
+std::string LLInventoryFilter::getEmptyLookupMessage() const
{
- return mEmptyLookupMessage;
+ LLStringUtil::format_map_t args;
+ args["[SEARCH_TERM]"] = LLURI::escape(getFilterSubStringOrig());
+
+ return LLTrans::getString(mEmptyLookupMessage, args);
}
@@ -1141,3 +1068,27 @@ bool LLInventoryFilter::areDateLimitsSet()
|| mFilterOps.mMaxDate != time_max()
|| mFilterOps.mHoursAgo != 0;
}
+
+bool LLInventoryFilter::showAllResults() const
+{
+ return hasFilterString();
+}
+
+
+
+bool LLInventoryFilter::FilterOps::DateRange::validateBlock( bool emit_errors /*= true*/ ) const
+{
+ bool valid = LLInitParam::Block<DateRange>::validateBlock(emit_errors);
+ if (valid)
+ {
+ if (max_date() < min_date())
+ {
+ if (emit_errors)
+ {
+ llwarns << "max_date should be greater or equal to min_date" << llendl;
+ }
+ valid = false;
+ }
+ }
+ return valid;
+}
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index 9e600c036f..4912b5ca91 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -29,12 +29,13 @@
#include "llinventorytype.h"
#include "llpermissionsflags.h"
+#include "llfolderviewmodel.h"
class LLFolderViewItem;
class LLFolderViewFolder;
class LLInventoryItem;
-class LLInventoryFilter
+class LLInventoryFilter : public LLFolderViewFilter
{
public:
enum EFolderShow
@@ -44,14 +45,6 @@ public:
SHOW_NO_FOLDERS
};
- 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
- };
-
enum EFilterType {
FILTERTYPE_NONE = 0,
FILTERTYPE_OBJECT = 0x1 << 0, // normal default search-by-object-type
@@ -59,7 +52,7 @@ public:
FILTERTYPE_UUID = 0x1 << 2, // find the object with UUID and any links to it
FILTERTYPE_DATE = 0x1 << 3, // search by date range
FILTERTYPE_WEARABLE = 0x1 << 4, // search by wearable type
- FILTERTYPE_EMPTYFOLDERS = 0x1 << 5 // pass if folder is not a system folder to be hidden if empty
+ FILTERTYPE_EMPTYFOLDERS = 0x1 << 5 // pass if folder is not a system folder to be hidden if
};
enum EFilterLink
@@ -77,16 +70,92 @@ public:
SO_SYSTEM_FOLDERS_TO_TOP = 0x1 << 2 // Force system folders to be on top
};
- LLInventoryFilter(const std::string& name);
- virtual ~LLInventoryFilter();
+ struct FilterOps
+ {
+ struct DateRange : public LLInitParam::Block<DateRange>
+ {
+ Optional<time_t> min_date,
+ max_date;
+
+ DateRange()
+ : min_date("min_date", time_min()),
+ max_date("max_date", time_max())
+ {}
+
+ bool validateBlock(bool emit_errors = true) const;
+ };
+
+ struct Params : public LLInitParam::Block<Params>
+ {
+ Optional<U32> types;
+ Optional<U64> object_types,
+ wearable_types,
+ category_types;
+ Optional<EFilterLink> links;
+ Optional<LLUUID> uuid;
+ Optional<DateRange> date_range;
+ Optional<S32> hours_ago;
+ Optional<EFolderShow> show_folder_state;
+ Optional<PermissionMask> permissions;
+
+ Params()
+ : types("filter_types", FILTERTYPE_OBJECT),
+ object_types("object_types", 0xffffFFFFffffFFFFULL),
+ wearable_types("wearable_types", 0xffffFFFFffffFFFFULL),
+ category_types("category_types", 0xffffFFFFffffFFFFULL),
+ links("links", FILTERLINK_INCLUDE_LINKS),
+ uuid("uuid"),
+ date_range("date_range"),
+ hours_ago("hours_ago", 0),
+ show_folder_state("show_folder_state", SHOW_NON_EMPTY_FOLDERS),
+ permissions("permissions", PERM_NONE)
+ {}
+ };
+
+ FilterOps(const Params& = Params());
+
+ U32 mFilterTypes;
+ U64 mFilterObjectTypes, // For _OBJECT
+ mFilterWearableTypes,
+ mFilterLinks,
+ mFilterCategoryTypes; // For _CATEGORY
+ LLUUID mFilterUUID; // for UUID
+
+ time_t mMinDate,
+ mMaxDate;
+ U32 mHoursAgo;
+
+ EFolderShow mShowFolderState;
+ PermissionMask mPermissions;
+ };
+
+ struct Params : public LLInitParam::Block<Params>
+ {
+ Optional<std::string> name;
+ Optional<FilterOps::Params> filter_ops;
+ Optional<std::string> substring;
+ Optional<bool> since_logoff;
+
+ Params()
+ : name("name"),
+ filter_ops(""),
+ substring("substring"),
+ since_logoff("since_logoff")
+ {}
+ };
+
+ LLInventoryFilter(const Params& p = Params());
+ LLInventoryFilter(const LLInventoryFilter& other) { *this = other; }
+ virtual ~LLInventoryFilter() {}
// +-------------------------------------------------------------------+
// + Parameters
// +-------------------------------------------------------------------+
- void setFilterObjectTypes(U64 types);
U64 getFilterObjectTypes() const;
U64 getFilterCategoryTypes() const;
- BOOL isFilterObjectTypesWith(LLInventoryType::EType t) const;
+ U64 getFilterWearableTypes() const;
+ bool isFilterObjectTypesWith(LLInventoryType::EType t) const;
+ void setFilterObjectTypes(U64 types);
void setFilterCategoryTypes(U64 types);
void setFilterUUID(const LLUUID &object_id);
void setFilterWearableTypes(U64 types);
@@ -96,7 +165,7 @@ public:
void setFilterSubString(const std::string& string);
const std::string& getFilterSubString(BOOL trim = FALSE) const;
const std::string& getFilterSubStringOrig() const { return mFilterSubStringOrig; }
- BOOL hasFilterString() const;
+ bool hasFilterString() const;
void setFilterPermissions(PermissionMask perms);
PermissionMask getFilterPermissions() const;
@@ -115,43 +184,35 @@ public:
// +-------------------------------------------------------------------+
// + Execution And Results
// +-------------------------------------------------------------------+
- BOOL check(const LLFolderViewItem* item);
+ bool check(const LLFolderViewModelItem* listener);
bool check(const LLInventoryItem* item);
- bool checkFolder(const LLFolderViewFolder* folder) const;
+ bool checkFolder(const LLFolderViewModelItem* listener) const;
bool checkFolder(const LLUUID& folder_id) const;
- BOOL checkAgainstFilterType(const LLFolderViewItem* item) const;
- bool checkAgainstFilterType(const LLInventoryItem* item) const;
- BOOL checkAgainstPermissions(const LLFolderViewItem* item) const;
- bool checkAgainstPermissions(const LLInventoryItem* item) const;
- BOOL checkAgainstFilterLinks(const LLFolderViewItem* item) const;
- bool checkAgainstClipboard(const LLUUID& object_id) const;
- std::string::size_type getStringMatchOffset() const;
+ bool showAllResults() const;
+ std::string::size_type getStringMatchOffset(LLFolderViewModelItem* item) const;
+ std::string::size_type getFilterStringSize() const;
// +-------------------------------------------------------------------+
// + 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;
+ std::string getEmptyLookupMessage() const;
// +-------------------------------------------------------------------+
// + Status
// +-------------------------------------------------------------------+
- BOOL isActive() const;
- BOOL isModified() const;
- BOOL isModifiedAndClear();
- BOOL isSinceLogoff() const;
+ bool isActive() const;
+ bool isModified() const;
+ bool isSinceLogoff() const;
void clearModified();
- const std::string& getName() const;
+ const std::string& getName() const { return mName; }
const std::string& getFilterText();
//RN: this is public to allow system to externally force a global refilter
- void setModified(EFilterBehavior behavior = FILTER_RESTART);
+ void setModified(EFilterModified behavior = FILTER_RESTART);
// +-------------------------------------------------------------------+
// + Count
@@ -163,8 +224,8 @@ public:
// +-------------------------------------------------------------------+
// + Default
// +-------------------------------------------------------------------+
- BOOL isDefault() const;
- BOOL isNotDefault() const;
+ bool isDefault() const;
+ bool isNotDefault() const;
void markDefault();
void resetDefault();
@@ -172,57 +233,42 @@ public:
// + Generation
// +-------------------------------------------------------------------+
S32 getCurrentGeneration() const;
- S32 getMinRequiredGeneration() const;
- S32 getMustPassGeneration() const;
+ S32 getFirstSuccessGeneration() const;
+ S32 getFirstRequiredGeneration() const;
+
// +-------------------------------------------------------------------+
// + Conversion
// +-------------------------------------------------------------------+
- void toLLSD(LLSD& data) const;
- void fromLLSD(LLSD& data);
+ void toParams(Params& params) const;
+ void fromParams(const Params& p);
+
+ LLInventoryFilter& operator =(const LLInventoryFilter& other);
private:
bool areDateLimitsSet();
-
- struct FilterOps
- {
- FilterOps();
- U32 mFilterTypes;
-
- U64 mFilterObjectTypes; // For _OBJECT
- U64 mFilterWearableTypes;
- U64 mFilterCategoryTypes; // For _CATEGORY
- LLUUID mFilterUUID; // for UUID
-
- time_t mMinDate;
- time_t mMaxDate;
- U32 mHoursAgo;
- EFolderShow mShowFolderState;
- PermissionMask mPermissions;
- U64 mFilterLinks;
- };
-
- U32 mOrder;
- U32 mLastLogoff;
+ bool checkAgainstFilterType(const class LLFolderViewModelItemInventory* listener) const;
+ bool checkAgainstFilterType(const LLInventoryItem* item) const;
+ bool checkAgainstPermissions(const class LLFolderViewModelItemInventory* listener) const;
+ bool checkAgainstPermissions(const LLInventoryItem* item) const;
+ bool checkAgainstFilterLinks(const class LLFolderViewModelItemInventory* listener) const;
+ bool checkAgainstClipboard(const LLUUID& object_id) const;
FilterOps mFilterOps;
FilterOps mDefaultFilterOps;
- std::string::size_type mSubStringMatchOffset;
std::string mFilterSubString;
std::string mFilterSubStringOrig;
const std::string mName;
- S32 mFilterGeneration;
- S32 mMustPassGeneration;
- S32 mMinRequiredGeneration;
+ S32 mCurrentGeneration;
+ S32 mFirstRequiredGeneration;
+ S32 mFirstSuccessGeneration;
S32 mNextFilterGeneration;
S32 mFilterCount;
- EFilterBehavior mFilterBehavior;
+ EFilterModified mFilterModified;
- BOOL mModified;
- BOOL mNeedTextRebuild;
std::string mFilterText;
std::string mEmptyLookupMessage;
};
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index e98d3f88a6..f1a4889f5a 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -45,7 +45,8 @@
// newview includes
#include "llappearancemgr.h"
#include "llappviewer.h"
-//#include "llfirstuse.h"
+#include "llclipboard.h"
+#include "lldonotdisturbnotificationstorage.h"
#include "llfloaterinventory.h"
#include "llfloatersidepanelcontainer.h"
#include "llfocusmgr.h"
@@ -74,8 +75,10 @@
#include "llsidepanelinventory.h"
#include "lltabcontainer.h"
#include "lltooldraganddrop.h"
+#include "lltrans.h"
#include "lluictrlfactory.h"
#include "llviewermessage.h"
+#include "llviewerfoldertype.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
#include "llviewerwindow.h"
@@ -959,8 +962,7 @@ void LLSaveFolderState::setApply(BOOL apply)
void LLSaveFolderState::doFolder(LLFolderViewFolder* folder)
{
- LLMemType mt(LLMemType::MTYPE_INVENTORY_DO_FOLDER);
- LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener();
+ LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getViewModelItem();
if(!bridge) return;
if(mApply)
@@ -995,7 +997,7 @@ void LLSaveFolderState::doFolder(LLFolderViewFolder* folder)
void LLOpenFilteredFolders::doItem(LLFolderViewItem *item)
{
- if (item->getFiltered())
+ if (item->passedFilter())
{
item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
}
@@ -1003,12 +1005,12 @@ void LLOpenFilteredFolders::doItem(LLFolderViewItem *item)
void LLOpenFilteredFolders::doFolder(LLFolderViewFolder* folder)
{
- if (folder->getFiltered() && folder->getParentFolder())
+ if (folder->LLFolderViewItem::passedFilter() && 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())
+ else if (!folder->getViewModelItem()->passedFilter() && !folder->getViewModelItem()->descendantsPassedFilter())
{
folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_NO);
}
@@ -1016,7 +1018,7 @@ void LLOpenFilteredFolders::doFolder(LLFolderViewFolder* folder)
void LLSelectFirstFilteredItem::doItem(LLFolderViewItem *item)
{
- if (item->getFiltered() && !mItemSelected)
+ if (item->passedFilter() && !mItemSelected)
{
item->getRoot()->setSelection(item, FALSE, FALSE);
if (item->getParentFolder())
@@ -1029,14 +1031,12 @@ void LLSelectFirstFilteredItem::doItem(LLFolderViewItem *item)
void LLSelectFirstFilteredItem::doFolder(LLFolderViewFolder* folder)
{
- if (folder->getFiltered() && !mItemSelected)
+ // Skip if folder or item already found, if not filtered or if no parent (root folder is not selectable)
+ if (!mFolderSelected && !mItemSelected && folder->LLFolderViewItem::passedFilter() && folder->getParentFolder())
{
folder->getRoot()->setSelection(folder, FALSE, FALSE);
- if (folder->getParentFolder())
- {
- folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
- }
- mItemSelected = TRUE;
+ folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
+ mFolderSelected = TRUE;
}
}
@@ -1056,3 +1056,113 @@ void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder)
}
}
+void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root, const std::string& action)
+{
+ if ("rename" == action)
+ {
+ root->startRenamingSelectedItem();
+ return;
+ }
+ if ("delete" == action)
+ {
+ LLSD args;
+ args["QUESTION"] = LLTrans::getString(root->getSelectedCount() > 1 ? "DeleteItems" : "DeleteItem");
+ LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&LLInventoryAction::onItemsRemovalConfirmation, _1, _2, root));
+ return;
+ }
+ if (("copy" == action) || ("cut" == action))
+ {
+ // Clear the clipboard before we start adding things on it
+ LLClipboard::instance().reset();
+ }
+
+ static const std::string change_folder_string = "change_folder_type_";
+ if (action.length() > change_folder_string.length() &&
+ (action.compare(0,change_folder_string.length(),"change_folder_type_") == 0))
+ {
+ LLFolderType::EType new_folder_type = LLViewerFolderType::lookupTypeFromXUIName(action.substr(change_folder_string.length()));
+ LLFolderViewModelItemInventory* inventory_item = static_cast<LLFolderViewModelItemInventory*>(root->getViewModelItem());
+ LLViewerInventoryCategory *cat = model->getCategory(inventory_item->getUUID());
+ if (!cat) return;
+ cat->changeType(new_folder_type);
+ return;
+ }
+
+
+ std::set<LLFolderViewItem*> selected_items = root->getSelectionList();
+
+ LLMultiPreview* multi_previewp = NULL;
+ LLMultiProperties* multi_propertiesp = NULL;
+
+ if (("task_open" == action || "open" == action) && selected_items.size() > 1)
+ {
+ multi_previewp = new LLMultiPreview();
+ gFloaterView->addChild(multi_previewp);
+
+ LLFloater::setFloaterHost(multi_previewp);
+
+ }
+ else if (("task_properties" == action || "properties" == action) && selected_items.size() > 1)
+ {
+ multi_propertiesp = new LLMultiProperties();
+ gFloaterView->addChild(multi_propertiesp);
+
+ LLFloater::setFloaterHost(multi_propertiesp);
+ }
+
+ std::set<LLFolderViewItem*>::iterator set_iter;
+
+ for (set_iter = selected_items.begin(); set_iter != selected_items.end(); ++set_iter)
+ {
+ LLFolderViewItem* folder_item = *set_iter;
+ if(!folder_item) continue;
+ LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getViewModelItem();
+ if(!bridge) continue;
+ bridge->performAction(model, action);
+ }
+
+ LLFloater::setFloaterHost(NULL);
+ if (multi_previewp)
+ {
+ multi_previewp->openFloater(LLSD());
+ }
+ else if (multi_propertiesp)
+ {
+ multi_propertiesp->openFloater(LLSD());
+ }
+}
+
+void LLInventoryAction::removeItemFromDND(LLFolderView* root)
+{
+ if(gAgent.isDoNotDisturb())
+ {
+ //Get selected items
+ LLFolderView::selected_items_t selectedItems = root->getSelectedItems();
+ LLFolderViewModelItemInventory * viewModel = NULL;
+
+ //If user is in DND and deletes item, make sure the notification is not displayed by removing the notification
+ //from DND history and .xml file. Once this is done, upon exit of DND mode the item deleted will not show a notification.
+ for(LLFolderView::selected_items_t::iterator it = selectedItems.begin(); it != selectedItems.end(); ++it)
+ {
+ viewModel = dynamic_cast<LLFolderViewModelItemInventory *>((*it)->getViewModelItem());
+
+ if(viewModel && viewModel->getUUID().notNull())
+ {
+ //Will remove the item offer notification
+ LLDoNotDisturbNotificationStorage::instance().removeNotification(LLDoNotDisturbNotificationStorage::offerName, viewModel->getUUID());
+ }
+ }
+ }
+}
+
+void LLInventoryAction::onItemsRemovalConfirmation( const LLSD& notification, const LLSD& response, LLFolderView* root )
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0)
+ {
+ //Need to remove item from DND before item is removed from root folder view
+ //because once removed from root folder view the item is no longer a selected item
+ removeItemFromDND(root);
+ root->removeSelectedItems();
+ }
+}
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index 909f7fd10b..f1066a4dc9 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -419,21 +419,6 @@ public:
class LLFolderViewItem;
class LLFolderViewFolder;
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLFolderViewFunctor
-//
-// Simple abstract base class for applying a functor to folders and
-// items in a folder view hierarchy. This is suboptimal for algorithms
-// 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 LLFolderViewFunctor
-{
-public:
- virtual ~LLFolderViewFunctor() {}
- virtual void doFolder(LLFolderViewFolder* folder) = 0;
- virtual void doItem(LLFolderViewItem* item) = 0;
-};
class LLInventoryState
{
@@ -443,49 +428,14 @@ public:
static LLUUID sWearNewClothingTransactionID; // wear all clothing in this transaction
};
-class LLSelectFirstFilteredItem : public LLFolderViewFunctor
+struct LLInventoryAction
{
-public:
- LLSelectFirstFilteredItem() : mItemSelected(FALSE) {}
- virtual ~LLSelectFirstFilteredItem() {}
- virtual void doFolder(LLFolderViewFolder* folder);
- virtual void doItem(LLFolderViewItem* item);
- BOOL wasItemSelected() { return mItemSelected; }
-protected:
- BOOL mItemSelected;
-};
+ static void doToSelected(class LLInventoryModel* model, class LLFolderView* root, const std::string& action);
-class LLOpenFilteredFolders : public LLFolderViewFunctor
-{
-public:
- LLOpenFilteredFolders() {}
- virtual ~LLOpenFilteredFolders() {}
- virtual void doFolder(LLFolderViewFolder* folder);
- virtual void doItem(LLFolderViewItem* item);
+ static void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLFolderView* root);
+ static void removeItemFromDND(LLFolderView* root);
};
-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);
-};
#endif // LL_LLINVENTORYFUNCTIONS_H
diff --git a/indra/newview/llinventoryicon.h b/indra/newview/llinventoryicon.h
index c7e2998a20..5c8acf9e85 100644
--- a/indra/newview/llinventoryicon.h
+++ b/indra/newview/llinventoryicon.h
@@ -1,5 +1,5 @@
/**
- * @file llinventoryfunctions.h
+ * @file llinventoryicon.h
* @brief Miscellaneous inventory-related functions and classes
* class definition
*
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 6e23d7c701..e7d59d92d9 100755..100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -373,13 +373,12 @@ void LLInventoryModel::unlockDirectDescendentArrays(const LLUUID& cat_id)
// specifies 'type' as what it defaults to containing. The category is
// not necessarily only for that type. *NOTE: This will create a new
// inventory category on the fly if one does not exist.
-const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType preferred_type,
- bool create_folder,
- bool find_in_library)
+const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder/*,
+ bool find_in_library*/)
{
LLUUID rv = LLUUID::null;
- const LLUUID &root_id = (find_in_library) ? gInventory.getLibraryRootFolderID() : gInventory.getRootFolderID();
+ const LLUUID &root_id = /*(find_in_library) ? gInventory.getLibraryRootFolderID() :*/ gInventory.getRootFolderID();
if(LLFolderType::FT_ROOT_INVENTORY == preferred_type)
{
rv = root_id;
@@ -402,7 +401,44 @@ const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType prefe
}
}
- if(rv.isNull() && isInventoryUsable() && (create_folder && !find_in_library))
+ if(rv.isNull() && isInventoryUsable() && (create_folder && true/*!find_in_library*/))
+ {
+ if(root_id.notNull())
+ {
+ return createNewCategory(root_id, preferred_type, LLStringUtil::null);
+ }
+ }
+ return rv;
+}
+
+const LLUUID LLInventoryModel::findLibraryCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder)
+{
+ LLUUID rv = LLUUID::null;
+
+ const LLUUID &root_id = gInventory.getLibraryRootFolderID();
+ if(LLFolderType::FT_ROOT_INVENTORY == preferred_type)
+ {
+ rv = root_id;
+ }
+ else if (root_id.notNull())
+ {
+ cat_array_t* cats = NULL;
+ cats = get_ptr_in_map(mParentChildCategoryTree, root_id);
+ if(cats)
+ {
+ S32 count = cats->count();
+ for(S32 i = 0; i < count; ++i)
+ {
+ if(cats->get(i)->getPreferredType() == preferred_type)
+ {
+ rv = cats->get(i)->getUUID();
+ break;
+ }
+ }
+ }
+ }
+
+ if(rv.isNull() && isInventoryUsable() && (create_folder && true/*!find_in_library*/))
{
if(root_id.notNull())
{
@@ -950,6 +986,7 @@ void LLInventoryModel::updateCategory(const LLViewerInventoryCategory* cat)
cat_array->put(old_cat);
}
mask |= LLInventoryObserver::STRUCTURE;
+ mask |= LLInventoryObserver::INTERNAL;
}
if(old_cat->getName() != cat->getName())
{
@@ -1245,14 +1282,33 @@ void LLInventoryModel::purgeDescendentsOf(const LLUUID& id)
items,
INCLUDE_TRASH);
S32 count = items.count();
+
+ item_map_t::iterator item_map_end = mItemMap.end();
+ cat_map_t::iterator cat_map_end = mCategoryMap.end();
+ LLUUID uu_id;
+
for(S32 i = 0; i < count; ++i)
{
- deleteObject(items.get(i)->getUUID());
+ uu_id = items.get(i)->getUUID();
+
+ // This check prevents the deletion of a previously deleted item.
+ // This is necessary because deletion is not done in a hierarchical
+ // order. The current item may have been already deleted as a child
+ // of its deleted parent.
+ if (mItemMap.find(uu_id) != item_map_end)
+ {
+ deleteObject(uu_id);
+ }
}
+
count = categories.count();
for(S32 i = 0; i < count; ++i)
{
- deleteObject(categories.get(i)->getUUID());
+ uu_id = categories.get(i)->getUUID();
+ if (mCategoryMap.find(uu_id) != cat_map_end)
+ {
+ deleteObject(uu_id);
+ }
}
}
}
@@ -3239,68 +3295,7 @@ void LLInventoryModel::updateItemsOrder(LLInventoryModel::item_array_t& items, c
}
}
-//* @param[in] items vector of items in order to be saved.
-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);
-}
-
-// * @param source_item_id - LLUUID of the source item to be moved into new position
-// * @param target_item_id - LLUUID of the target item before which source item should be placed.
-void LLInventoryModel::rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id)
-{
- LLInventoryModel::cat_array_t cats;
- 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);
-}
//----------------------------------------------------------------------------
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index 8382e875b4..503de627a0 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -231,11 +231,12 @@ public:
// Returns the uuid of the category that specifies 'type' as what it
// defaults to containing. The category is not necessarily only for that type.
// NOTE: If create_folder is true, this will create a new inventory category
- // on the fly if one does not exist. *NOTE: if find_in_library is true it
- // will search in the user's library folder instead of "My Inventory"
+ // on the fly if one does not exist.
const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type,
- bool create_folder = true,
- bool find_in_library = false);
+ bool create_folder = true);
+ // will search in the user's library folder instead of "My Inventory"
+ const LLUUID findLibraryCategoryUUIDForType(LLFolderType::EType preferred_type,
+ bool create_folder = true);
// Get whatever special folder this object is a child of, if any.
const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const;
@@ -362,15 +363,6 @@ public:
// Returns end() of the vector if not found.
static LLInventoryModel::item_array_t::iterator findItemIterByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id);
- // Saves current order of the passed items using inventory item sort field.
- // Resets 'items' sort fields and saves them on server.
- // Is used to save order for Favorites folder.
- void saveItemsOrder(const LLInventoryModel::item_array_t& items);
-
- // Rearranges Landmarks inside Favorites folder.
- // Moves source landmark before target one.
- void rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id);
-
//--------------------------------------------------------------------
// Creation
//--------------------------------------------------------------------
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 05c81957c6..fabcd50c7d 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -38,12 +38,15 @@
#include "llfloaterreg.h"
#include "llfloatersidepanelcontainer.h"
#include "llfolderview.h"
-#include "llimfloater.h"
+#include "llfolderviewitem.h"
+#include "llfloaterimcontainer.h"
#include "llimview.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
#include "llinventorymodelbackgroundfetch.h"
+#include "llpreview.h"
#include "llsidepanelinventory.h"
+#include "lltrans.h"
#include "llviewerattachmenu.h"
#include "llviewerfoldertype.h"
#include "llvoavatarself.h"
@@ -53,8 +56,16 @@ 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;
+static const LLInventoryFolderViewModelBuilder INVENTORY_BRIDGE_BUILDER;
+// statics
+bool LLInventoryPanel::sColorSetInitialized = false;
+LLUIColor LLInventoryPanel::sDefaultColor;
+LLUIColor LLInventoryPanel::sDefaultHighlightColor;
+LLUIColor LLInventoryPanel::sLibraryColor;
+LLUIColor LLInventoryPanel::sLinkColor;
+
+const LLColor4U DEFAULT_WHITE(255, 255, 255);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryPanelObserver
@@ -134,78 +145,86 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
mAllowMultiSelect(p.allow_multi_select),
mShowItemLinkOverlays(p.show_item_link_overlays),
mShowEmptyMessage(p.show_empty_message),
- mShowLoadStatus(p.show_load_status),
mViewsInitialized(false),
mInvFVBridgeBuilder(NULL)
{
mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER;
- // contex menu callbacks
+ if (!sColorSetInitialized)
+ {
+ sDefaultColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
+ sDefaultHighlightColor = LLUIColorTable::instance().getColor("MenuItemHighlightFgColor", DEFAULT_WHITE);
+ sLibraryColor = LLUIColorTable::instance().getColor("InventoryItemLibraryColor", DEFAULT_WHITE);
+ sLinkColor = LLUIColorTable::instance().getColor("InventoryItemLinkColor", DEFAULT_WHITE);
+ sColorSetInitialized = true;
+ }
+
+ // context 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));
- mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars));
+ mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars, this));
}
-void LLInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params)
+LLFolderView * LLInventoryPanel::createFolderRoot(LLUUID root_id )
{
- // Determine the root folder in case specified, and
- // build the views starting with that folder.
-
- std::string start_folder_name(params.start_folder());
-
- const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(start_folder_name);
-
- LLUUID root_id;
-
- if ("LIBRARY" == params.start_folder())
- {
- root_id = gInventory.getLibraryRootFolderID();
- }
- else
- {
- root_id = (preferred_type != LLFolderType::FT_NONE)
- ? gInventory.findCategoryUUIDForType(preferred_type, false, false)
- : LLUUID::null;
- }
-
- if ((root_id == LLUUID::null) && !start_folder_name.empty())
- {
- llwarns << "No category found that matches start_folder: " << start_folder_name << llendl;
- root_id = LLUUID::generateNewID();
- }
-
- LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_CATEGORY,
+ LLFolderView::Params p(mParams.folder_view);
+ p.name = getName();
+ p.title = getLabel();
+ p.rect = LLRect(0, 0, getRect().getWidth(), 0);
+ p.parent_panel = this;
+ p.tool_tip = p.name;
+ p.listener = mInvFVBridgeBuilder->createBridge( LLAssetType::AT_CATEGORY,
LLAssetType::AT_CATEGORY,
LLInventoryType::IT_CATEGORY,
this,
+ &mInventoryViewModel,
NULL,
root_id);
+ p.view_model = &mInventoryViewModel;
+ p.use_label_suffix = mParams.use_label_suffix;
+ p.allow_multiselect = mAllowMultiSelect;
+ p.show_empty_message = mShowEmptyMessage;
+ p.show_item_link_overlays = mShowItemLinkOverlays;
+ p.root = NULL;
+ p.options_menu = "menu_inventory.xml";
- mFolderRoot = createFolderView(new_listener, params.use_label_suffix());
+ return LLUICtrlFactory::create<LLFolderView>(p);
}
void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
{
- LLMemType mt(LLMemType::MTYPE_INVENTORY_POST_BUILD);
+ // save off copy of params
+ mParams = params;
+ // Clear up the root view
+ // Note: This needs to be done *before* we build the new folder view
+ LLUUID root_id = getRootFolderID();
+ if (mFolderRoot)
+ {
+ removeItemID(root_id);
+ mFolderRoot->destroyView();
+ mFolderRoot = NULL;
+ }
mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves
+ {
+ // Determine the root folder in case specified, and
+ // build the views starting with that folder.
+ mFolderRoot = createFolderRoot(root_id);
- buildFolderView(params);
-
+ addItemID(root_id, mFolderRoot);
+ }
mCommitCallbackRegistrar.popScope();
-
mFolderRoot->setCallbackRegistrar(&mCommitCallbackRegistrar);
// Scroller
- {
LLRect scroller_view_rect = getRect();
scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
- LLScrollContainer::Params scroller_params(params.scroll());
+ LLScrollContainer::Params scroller_params(mParams.scroll());
scroller_params.rect(scroller_view_rect);
mScroller = LLUICtrlFactory::create<LLFolderViewScrollContainer>(scroller_params);
addChild(mScroller);
@@ -213,7 +232,6 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
mFolderRoot->setScrollContainer(mScroller);
mFolderRoot->setFollowsAll();
mFolderRoot->addChild(mFolderRoot->mStatusTextBox);
- }
// Set up the callbacks from the inventory we're viewing, and then build everything.
mInventoryObserver = new LLInventoryPanelObserver(this);
@@ -228,6 +246,7 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
{
initializeViews();
}
+
gIdleCallbacks.addFunction(onIdle, (void*)this);
if (mSortOrderSetting != INHERIT_SORT_ORDER)
@@ -240,32 +259,31 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
}
// hide inbox
- getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_INBOX));
- getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_OUTBOX));
+ getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_INBOX));
+ getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_OUTBOX));
// set the filter for the empty folder if the debug setting is on
if (gSavedSettings.getBOOL("DebugHideEmptySystemFolders"))
{
- getFilter()->setFilterEmptySystemFolders();
+ getFilter().setFilterEmptySystemFolders();
}
// keep track of the clipboard state so that we avoid filtering too much
mClipboardState = LLClipboard::instance().getGeneration();
// Initialize base class params.
- LLPanel::initFromParams(params);
+ LLPanel::initFromParams(mParams);
}
LLInventoryPanel::~LLInventoryPanel()
{
- if (mFolderRoot)
- {
- U32 sort_order = mFolderRoot->getSortOrder();
+ gIdleCallbacks.deleteFunction(idle, this);
+
+ U32 sort_order = getFolderViewModel()->getSorter().getSortOrder();
if (mSortOrderSetting != INHERIT_SORT_ORDER)
{
gSavedSettings.setU32(mSortOrderSetting, sort_order);
}
- }
gIdleCallbacks.deleteFunction(onIdle, this);
@@ -281,82 +299,68 @@ LLInventoryPanel::~LLInventoryPanel()
void LLInventoryPanel::draw()
{
// Select the desired item (in case it wasn't loaded when the selection was requested)
- mFolderRoot->updateSelection();
-
- // Nudge the filter if the clipboard state changed
- if (mClipboardState != LLClipboard::instance().getGeneration())
- {
- mClipboardState = LLClipboard::instance().getGeneration();
- getFilter()->setModified(LLClipboard::instance().isCutMode() ? LLInventoryFilter::FILTER_MORE_RESTRICTIVE : LLInventoryFilter::FILTER_LESS_RESTRICTIVE);
- }
+ updateSelection();
LLPanel::draw();
}
-LLInventoryFilter* LLInventoryPanel::getFilter()
+const LLInventoryFilter& LLInventoryPanel::getFilter() const
{
- if (mFolderRoot)
- {
- return mFolderRoot->getFilter();
- }
- return NULL;
+ return getFolderViewModel()->getFilter();
}
-const LLInventoryFilter* LLInventoryPanel::getFilter() const
+LLInventoryFilter& LLInventoryPanel::getFilter()
{
- if (mFolderRoot)
- {
- return mFolderRoot->getFilter();
- }
- return NULL;
+ return getFolderViewModel()->getFilter();
}
void LLInventoryPanel::setFilterTypes(U64 types, LLInventoryFilter::EFilterType filter_type)
{
if (filter_type == LLInventoryFilter::FILTERTYPE_OBJECT)
- getFilter()->setFilterObjectTypes(types);
+ getFilter().setFilterObjectTypes(types);
if (filter_type == LLInventoryFilter::FILTERTYPE_CATEGORY)
- getFilter()->setFilterCategoryTypes(types);
+ getFilter().setFilterCategoryTypes(types);
}
U32 LLInventoryPanel::getFilterObjectTypes() const
{
- return mFolderRoot->getFilterObjectTypes();
+ return getFilter().getFilterObjectTypes();
}
U32 LLInventoryPanel::getFilterPermMask() const
{
- return mFolderRoot->getFilterPermissions();
+ return getFilter().getFilterPermissions();
}
void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask)
{
- getFilter()->setFilterPermissions(filter_perm_mask);
+ getFilter().setFilterPermissions(filter_perm_mask);
}
void LLInventoryPanel::setFilterWearableTypes(U64 types)
{
- getFilter()->setFilterWearableTypes(types);
+ getFilter().setFilterWearableTypes(types);
}
void LLInventoryPanel::setFilterSubString(const std::string& string)
{
- getFilter()->setFilterSubString(string);
+ getFilter().setFilterSubString(string);
}
const std::string LLInventoryPanel::getFilterSubString()
{
- return mFolderRoot->getFilterSubString();
+ return getFilter().getFilterSubString();
}
void LLInventoryPanel::setSortOrder(U32 order)
{
- getFilter()->setSortOrder(order);
- if (getFilter()->isModified())
+ LLInventorySort sorter(order);
+ if (order != getFolderViewModel()->getSorter().getSortOrder())
{
- mFolderRoot->setSortOrder(order);
+ getFolderViewModel()->setSorter(sorter);
+ mFolderRoot->arrangeAll();
// try to keep selection onscreen, even if it wasn't to start with
mFolderRoot->scrollToShowSelection();
}
@@ -364,37 +368,32 @@ void LLInventoryPanel::setSortOrder(U32 order)
U32 LLInventoryPanel::getSortOrder() const
{
- return mFolderRoot->getSortOrder();
-}
-
-void LLInventoryPanel::requestSort()
-{
- mFolderRoot->requestSort();
+ return getFolderViewModel()->getSorter().getSortOrder();
}
void LLInventoryPanel::setSinceLogoff(BOOL sl)
{
- getFilter()->setDateRangeLastLogoff(sl);
+ getFilter().setDateRangeLastLogoff(sl);
}
void LLInventoryPanel::setHoursAgo(U32 hours)
{
- getFilter()->setHoursAgo(hours);
+ getFilter().setHoursAgo(hours);
}
void LLInventoryPanel::setFilterLinks(U64 filter_links)
{
- getFilter()->setFilterLinks(filter_links);
+ getFilter().setFilterLinks(filter_links);
}
void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show)
{
- getFilter()->setShowFolderState(show);
+ getFilter().setShowFolderState(show);
}
LLInventoryFilter::EFolderShow LLInventoryPanel::getShowFolderState()
{
- return getFilter()->getShowFolderState();
+ return getFilter().getShowFolderState();
}
void LLInventoryPanel::modelChanged(U32 mask)
@@ -418,11 +417,20 @@ void LLInventoryPanel::modelChanged(U32 mask)
{
const LLUUID& item_id = (*items_iter);
const LLInventoryObject* model_item = model->getObject(item_id);
- LLFolderViewItem* view_item = mFolderRoot->getItemByID(item_id);
+ LLFolderViewItem* view_item = getItemByID(item_id);
+ LLFolderViewModelItemInventory* viewmodel_item =
+ static_cast<LLFolderViewModelItemInventory*>(view_item ? view_item->getViewModelItem() : NULL);
// LLFolderViewFolder is derived from LLFolderViewItem so dynamic_cast from item
// to folder is the fast way to get a folder without searching through folders tree.
- LLFolderViewFolder* view_folder = dynamic_cast<LLFolderViewFolder*>(view_item);
+ LLFolderViewFolder* view_folder = NULL;
+
+ // Check requires as this item might have already been deleted
+ // as a child of its deleted parent.
+ if (model_item && view_item)
+ {
+ view_folder = dynamic_cast<LLFolderViewFolder*>(view_item);
+ }
//////////////////////////////
// LABEL Operation
@@ -433,7 +441,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
if (view_item)
{
// Request refresh on this item (also flags for filtering)
- LLInvFVBridge* bridge = (LLInvFVBridge*)view_item->getListener();
+ LLInvFVBridge* bridge = (LLInvFVBridge*)view_item->getViewModelItem();
if(bridge)
{ // Clear the display name first, so it gets properly re-built during refresh()
bridge->clearDisplayName();
@@ -449,11 +457,15 @@ void LLInventoryPanel::modelChanged(U32 mask)
if (mask & LLInventoryObserver::REBUILD)
{
handled = true;
- if (model_item && view_item)
+ if (model_item && view_item && viewmodel_item)
{
+ const LLUUID& idp = viewmodel_item->getUUID();
view_item->destroyView();
+ removeItemID(idp);
}
view_item = buildNewViews(item_id);
+ viewmodel_item =
+ static_cast<LLFolderViewModelItemInventory*>(view_item ? view_item->getViewModelItem() : NULL);
view_folder = dynamic_cast<LLFolderViewFolder *>(view_item);
}
@@ -475,7 +487,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
{
if (view_folder)
{
- view_folder->requestSort();
+ view_folder->getViewModelItem()->requestSort();
}
}
@@ -510,20 +522,24 @@ void LLInventoryPanel::modelChanged(U32 mask)
else if (model_item && view_item)
{
// Don't process the item if it is the root
- if (view_item->getRoot() != view_item)
+ if (view_item->getParentFolder())
{
- LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolderRoot->getItemByID(model_item->getParentUUID());
+ LLFolderViewFolder* new_parent = (LLFolderViewFolder*)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, mFolderRoot);
+ view_item->addToFolder(new_parent);
+ addItemID(viewmodel_item->getUUID(), view_item);
}
else
{
+ // Remove the item ID before destroying the view because the view-model-item gets
+ // destroyed when the view is destroyed
+ removeItemID(viewmodel_item->getUUID());
+
// 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();
@@ -535,9 +551,10 @@ void LLInventoryPanel::modelChanged(U32 mask)
//////////////////////////////
// REMOVE Operation
// This item has been removed from memory, but its associated UI element still exists.
- else if (!model_item && view_item)
+ else if (!model_item && view_item && viewmodel_item)
{
// Remove the item's UI.
+ removeItemID(viewmodel_item->getUUID());
view_item->destroyView();
}
}
@@ -549,6 +566,43 @@ LLFolderView* LLInventoryPanel::getRootFolder()
return mFolderRoot;
}
+LLUUID LLInventoryPanel::getRootFolderID()
+{
+ if (mFolderRoot && mFolderRoot->getViewModelItem())
+ {
+ return static_cast<LLFolderViewModelItemInventory*>(mFolderRoot->getViewModelItem())->getUUID();
+
+ }
+ else
+ {
+ LLUUID root_id;
+ if (mParams.start_folder.id.isChosen())
+ {
+ root_id = mParams.start_folder.id;
+ }
+ else
+ {
+ const LLFolderType::EType preferred_type = mParams.start_folder.type.isChosen()
+ ? mParams.start_folder.type
+ : LLViewerFolderType::lookupTypeFromNewCategoryName(mParams.start_folder.name);
+
+ if ("LIBRARY" == mParams.start_folder.name())
+ {
+ root_id = gInventory.getLibraryRootFolderID();
+ }
+ else if (preferred_type != LLFolderType::FT_NONE)
+ {
+ root_id = gInventory.findCategoryUUIDForType(preferred_type, false);
+ if (root_id.isNull())
+ {
+ llwarns << "Could not find folder of type " << preferred_type << llendl;
+ root_id.generateNewID();
+ }
+ }
+ }
+ return root_id;
+ }
+}
// static
void LLInventoryPanel::onIdle(void *userdata)
@@ -568,16 +622,73 @@ void LLInventoryPanel::onIdle(void *userdata)
}
}
-const LLUUID& LLInventoryPanel::getRootFolderID() const
+struct DirtyFilterFunctor : public LLFolderViewFunctor
+{
+ /*virtual*/ void doFolder(LLFolderViewFolder* folder)
+ {
+ folder->getViewModelItem()->dirtyFilter();
+ }
+ /*virtual*/ void doItem(LLFolderViewItem* item)
+ {
+ item->getViewModelItem()->dirtyFilter();
+ }
+};
+
+void LLInventoryPanel::idle(void* user_data)
{
- return mFolderRoot->getListener()->getUUID();
+ LLInventoryPanel* panel = (LLInventoryPanel*)user_data;
+ // Nudge the filter if the clipboard state changed
+ if (panel->mClipboardState != LLClipboard::instance().getGeneration())
+ {
+ panel->mClipboardState = LLClipboard::instance().getGeneration();
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ LLFolderViewFolder* trash_folder = panel->getFolderByID(trash_id);
+ if (trash_folder)
+ {
+ DirtyFilterFunctor dirtyFilterFunctor;
+ trash_folder->applyFunctorToChildren(dirtyFilterFunctor);
+ }
+
+ }
+
+ panel->mFolderRoot->update();
+ // while dragging, update selection rendering to reflect single/multi drag status
+ if (LLToolDragAndDrop::getInstance()->hasMouseCapture())
+ {
+ EAcceptance last_accept = LLToolDragAndDrop::getInstance()->getLastAccept();
+ if (last_accept == ACCEPT_YES_SINGLE || last_accept == ACCEPT_YES_COPY_SINGLE)
+ {
+ panel->mFolderRoot->setShowSingleSelection(TRUE);
+ }
+ else
+ {
+ panel->mFolderRoot->setShowSingleSelection(FALSE);
+ }
+}
+ else
+ {
+ panel->mFolderRoot->setShowSingleSelection(FALSE);
+ }
}
+
void LLInventoryPanel::initializeViews()
{
if (!gInventory.isInventoryUsable()) return;
- rebuildViewsFor(getRootFolderID());
+ LLUUID root_id = getRootFolderID();
+ if (root_id.notNull())
+ {
+ buildNewViews(getRootFolderID());
+ }
+ else
+ {
+ // Default case: always add "My Inventory" first, "Library" second
+ buildNewViews(gInventory.getRootFolderID()); // My Inventory
+ buildNewViews(gInventory.getLibraryRootFolderID()); // Library
+ }
+
+ gIdleCallbacks.addFunction(idle, this);
mViewsInitialized = true;
@@ -587,14 +698,14 @@ void LLInventoryPanel::initializeViews()
if (gAgent.isFirstLogin())
{
// Auto open the user's library
- LLFolderViewFolder* lib_folder = mFolderRoot->getFolderByID(gInventory.getLibraryRootFolderID());
+ LLFolderViewFolder* lib_folder = getFolderByID(gInventory.getLibraryRootFolderID());
if (lib_folder)
{
lib_folder->setOpen(TRUE);
}
// Auto close the user's my inventory folder
- LLFolderViewFolder* my_inv_folder = mFolderRoot->getFolderByID(gInventory.getRootFolderID());
+ LLFolderViewFolder* my_inv_folder = getFolderByID(gInventory.getRootFolderID());
if (my_inv_folder)
{
my_inv_folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_DOWN);
@@ -602,79 +713,35 @@ void LLInventoryPanel::initializeViews()
}
}
-LLFolderViewItem* LLInventoryPanel::rebuildViewsFor(const LLUUID& id)
-{
- // Destroy the old view for this ID so we can rebuild it.
- LLFolderViewItem* old_view = mFolderRoot->getItemByID(id);
- if (old_view)
- {
- old_view->destroyView();
- }
-
- return buildNewViews(id);
-}
-
-LLFolderView * LLInventoryPanel::createFolderView(LLInvFVBridge * bridge, bool useLabelSuffix)
-{
- LLRect folder_rect(0,
- 0,
- getRect().getWidth(),
- 0);
-
- LLFolderView::Params p;
-
- p.name = getName();
- p.title = getLabel();
- p.rect = folder_rect;
- p.parent_panel = this;
- p.tool_tip = p.name;
- p.listener = bridge;
- p.use_label_suffix = useLabelSuffix;
- p.allow_multiselect = mAllowMultiSelect;
- p.show_empty_message = mShowEmptyMessage;
- p.show_load_status = mShowLoadStatus;
-
- return LLUICtrlFactory::create<LLFolderView>(p);
-}
LLFolderViewFolder * LLInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge)
{
- LLFolderViewFolder::Params params;
+ LLFolderViewFolder::Params params(mParams.folder);
params.name = bridge->getDisplayName();
- params.icon = bridge->getIcon();
- params.icon_open = bridge->getOpenIcon();
-
- if (mShowItemLinkOverlays) // if false, then links show up just like normal items
- {
- params.icon_overlay = LLUI::getUIImage("Inv_Link");
- }
-
params.root = mFolderRoot;
params.listener = bridge;
params.tool_tip = params.name;
+ params.font_color = (bridge->isLibraryItem() ? sLibraryColor : (bridge->isLink() ? sLinkColor : sDefaultColor));
+ params.font_highlight_color = (bridge->isLibraryItem() ? sLibraryColor : (bridge->isLink() ? sLinkColor : sDefaultHighlightColor));
+
return LLUICtrlFactory::create<LLFolderViewFolder>(params);
}
LLFolderViewItem * LLInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge)
{
- LLFolderViewItem::Params params;
+ LLFolderViewItem::Params params(mParams.item);
params.name = bridge->getDisplayName();
- params.icon = bridge->getIcon();
- params.icon_open = bridge->getOpenIcon();
-
- if (mShowItemLinkOverlays) // if false, then links show up just like normal items
- {
- params.icon_overlay = LLUI::getUIImage("Inv_Link");
- }
-
params.creation_date = bridge->getCreationDate();
params.root = mFolderRoot;
params.listener = bridge;
params.rect = LLRect (0, 0, 0, 0);
params.tool_tip = params.name;
+
+ params.font_color = (bridge->isLibraryItem() ? sLibraryColor : (bridge->isLink() ? sLinkColor : sDefaultColor));
+ params.font_highlight_color = (bridge->isLibraryItem() ? sLibraryColor : (bridge->isLink() ? sLinkColor : sDefaultHighlightColor));
return LLUICtrlFactory::create<LLFolderViewItem>(params);
}
@@ -682,20 +749,15 @@ LLFolderViewItem * LLInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge
LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
{
LLInventoryObject const* objectp = gInventory.getObject(id);
- LLUUID root_id = mFolderRoot->getListener()->getUUID();
- LLFolderViewFolder* parent_folder = NULL;
- LLFolderViewItem* itemp = NULL;
- if (id == root_id)
- {
- parent_folder = mFolderRoot;
- }
- else if (objectp)
- {
+ if (!objectp) return NULL;
+
+ LLFolderViewItem* folder_view_item = getItemByID(id);
+
const LLUUID &parent_id = objectp->getParentUUID();
- parent_folder = (LLFolderViewFolder*)mFolderRoot->getItemByID(parent_id);
+ LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)getItemByID(parent_id);
- if (parent_folder)
+ if (!folder_view_item && parent_folder)
{
if (objectp->getType() <= LLAssetType::AT_NONE ||
objectp->getType() >= LLAssetType::AT_COUNT)
@@ -713,16 +775,12 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
objectp->getType(),
LLInventoryType::IT_CATEGORY,
this,
+ &mInventoryViewModel,
mFolderRoot,
objectp->getUUID());
if (new_listener)
{
- LLFolderViewFolder* folderp = createFolderViewFolder(new_listener);
- if (folderp)
- {
- folderp->setItemSortOrder(mFolderRoot->getSortOrder());
- }
- itemp = folderp;
+ folder_view_item = createFolderViewFolder(new_listener);
}
}
else
@@ -733,28 +791,28 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
item->getActualType(),
item->getInventoryType(),
this,
+ &mInventoryViewModel,
mFolderRoot,
item->getUUID(),
item->getFlags());
if (new_listener)
{
- itemp = createFolderViewItem(new_listener);
+ folder_view_item = createFolderViewItem(new_listener);
}
}
- if (itemp)
+ if (folder_view_item)
{
- itemp->addToFolder(parent_folder, mFolderRoot);
- }
+ llassert(parent_folder != NULL);
+ folder_view_item->addToFolder(parent_folder);
+ addItemID(id, folder_view_item);
}
}
// If this is a folder, add the children of the folder and recursively add any
// child folders.
- if (id.isNull()
- || (objectp
- && objectp->getType() == LLAssetType::AT_CATEGORY))
+ if (folder_view_item && objectp->getType() == LLAssetType::AT_CATEGORY)
{
LLViewerInventoryCategory::cat_array_t* categories;
LLViewerInventoryItem::item_array_t* items;
@@ -771,7 +829,7 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
}
}
- if(items && parent_folder)
+ if(items)
{
for (LLViewerInventoryItem::item_array_t::const_iterator item_iter = items->begin();
item_iter != items->end();
@@ -784,7 +842,7 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
mInventory->unlockDirectDescendentArrays(id);
}
- return itemp;
+ return folder_view_item;
}
// bit of a hack to make sure the inventory is open.
@@ -795,8 +853,8 @@ void LLInventoryPanel::openStartFolderOrMyInventory()
{
LLFolderViewFolder *fchild = dynamic_cast<LLFolderViewFolder*>(child);
if (fchild
- && fchild->getListener()
- && fchild->getListener()->getUUID() == gInventory.getRootFolderID())
+ && fchild->getViewModelItem()
+ && fchild->getViewModelItem()->getName() == "My Inventory")
{
fchild->setOpen(TRUE);
break;
@@ -813,7 +871,7 @@ void LLInventoryPanel::openSelected()
{
LLFolderViewItem* folder_item = mFolderRoot->getCurSelectedItem();
if(!folder_item) return;
- LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener();
+ LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getViewModelItem();
if(!bridge) return;
bridge->openItem();
}
@@ -917,7 +975,7 @@ void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_foc
{
return;
}
- mFolderRoot->setSelectionByID(obj_id, take_keyboard_focus);
+ setSelectionByID(obj_id, take_keyboard_focus);
}
void LLInventoryPanel::setSelectCallback(const boost::function<void (const std::deque<LLFolderViewItem*>& items, BOOL user_action)>& cb)
@@ -930,7 +988,7 @@ void LLInventoryPanel::setSelectCallback(const boost::function<void (const std::
void LLInventoryPanel::clearSelection()
{
- mFolderRoot->clearSelection();
+ mSelectThisID.setNull();
}
void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& items, BOOL user_action)
@@ -939,7 +997,7 @@ void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& it
mCompletionObserver->reset();
for (std::deque<LLFolderViewItem*>::const_iterator it = items.begin(); it != items.end(); ++it)
{
- LLUUID id = (*it)->getListener()->getUUID();
+ LLUUID id = static_cast<LLFolderViewModelItemInventory*>((*it)->getViewModelItem())->getUUID();
LLViewerInventoryItem* inv_item = mInventory->getItem(id);
if (inv_item && !inv_item->isFinished())
@@ -959,41 +1017,34 @@ void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& it
}
}
-void LLInventoryPanel::doToSelected(const LLSD& userdata)
-{
- mFolderRoot->doToSelected(&gInventory, userdata);
-}
-
void LLInventoryPanel::doCreate(const LLSD& userdata)
{
reset_inventory_filter();
- menu_create_inventory_item(mFolderRoot, LLFolderBridge::sSelf.get(), userdata);
+ menu_create_inventory_item(this, LLFolderBridge::sSelf.get(), userdata);
}
bool LLInventoryPanel::beginIMSession()
{
- std::set<LLUUID> selected_items = mFolderRoot->getSelectionList();
+ std::set<LLFolderViewItem*> selected_items = mFolderRoot->getSelectionList();
std::string name;
- static int session_num = 1;
LLDynamicArray<LLUUID> members;
EInstantMessage type = IM_SESSION_CONFERENCE_START;
- std::set<LLUUID>::const_iterator iter;
+ std::set<LLFolderViewItem*>::const_iterator iter;
for (iter = selected_items.begin(); iter != selected_items.end(); iter++)
{
- LLUUID item = *iter;
- LLFolderViewItem* folder_item = mFolderRoot->getItemByID(item);
+ LLFolderViewItem* folder_item = (*iter);
if(folder_item)
{
- LLFolderViewEventListener* fve_listener = folder_item->getListener();
+ LLFolderViewModelItemInventory* fve_listener = static_cast<LLFolderViewModelItemInventory*>(folder_item->getViewModelItem());
if (fve_listener && (fve_listener->getInventoryType() == LLInventoryType::IT_CATEGORY))
{
- LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getListener();
+ LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getViewModelItem();
if(!bridge) return true;
LLViewerInventoryCategory* cat = bridge->getCategory();
if(!cat) return true;
@@ -1027,9 +1078,7 @@ bool LLInventoryPanel::beginIMSession()
}
else
{
- LLFolderViewItem* folder_item = mFolderRoot->getItemByID(item);
- if(!folder_item) return true;
- LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getListener();
+ LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getViewModelItem();
if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD)
{
@@ -1055,13 +1104,13 @@ bool LLInventoryPanel::beginIMSession()
if (name.empty())
{
- name = llformat("Session %d", session_num++);
+ name = LLTrans::getString("conference-title");
}
LLUUID session_id = gIMMgr->addSession(name, type, members[0], members);
if (session_id != LLUUID::null)
{
- LLIMFloater::show(session_id);
+ LLFloaterIMContainer::getInstance()->showConversation(session_id);
}
return true;
@@ -1070,13 +1119,13 @@ bool LLInventoryPanel::beginIMSession()
bool LLInventoryPanel::attachObject(const LLSD& userdata)
{
// Copy selected item UUIDs to a vector.
- std::set<LLUUID> selected_items = mFolderRoot->getSelectionList();
+ std::set<LLFolderViewItem*> selected_items = mFolderRoot->getSelectionList();
uuid_vec_t items;
- for (std::set<LLUUID>::const_iterator set_iter = selected_items.begin();
+ for (std::set<LLFolderViewItem*>::const_iterator set_iter = selected_items.begin();
set_iter != selected_items.end();
++set_iter)
{
- items.push_back(*set_iter);
+ items.push_back(static_cast<LLFolderViewModelItemInventory*>((*set_iter)->getViewModelItem())->getUUID());
}
// Attach selected items.
@@ -1089,7 +1138,7 @@ bool LLInventoryPanel::attachObject(const LLSD& userdata)
BOOL LLInventoryPanel::getSinceLogoff()
{
- return getFilter()->isSinceLogoff();
+ return getFilter().isSinceLogoff();
}
// DEBUG ONLY
@@ -1215,14 +1264,150 @@ void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const L
void LLInventoryPanel::addHideFolderType(LLFolderType::EType folder_type)
{
- getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() & ~(1ULL << folder_type));
+ getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << folder_type));
}
BOOL LLInventoryPanel::getIsHiddenFolderType(LLFolderType::EType folder_type) const
{
- return !(getFilter()->getFilterCategoryTypes() & (1ULL << folder_type));
+ return !(getFilter().getFilterCategoryTypes() & (1ULL << folder_type));
}
+void LLInventoryPanel::addItemID( const LLUUID& id, LLFolderViewItem* itemp )
+{
+ mItemMap[id] = itemp;
+}
+
+void LLInventoryPanel::removeItemID(const LLUUID& id)
+{
+ LLInventoryModel::cat_array_t categories;
+ LLInventoryModel::item_array_t items;
+ gInventory.collectDescendents(id, categories, items, TRUE);
+
+ mItemMap.erase(id);
+
+ for (LLInventoryModel::cat_array_t::iterator it = categories.begin(), end_it = categories.end();
+ it != end_it;
+ ++it)
+ {
+ mItemMap.erase((*it)->getUUID());
+}
+
+ for (LLInventoryModel::item_array_t::iterator it = items.begin(), end_it = items.end();
+ it != end_it;
+ ++it)
+ {
+ mItemMap.erase((*it)->getUUID());
+ }
+}
+
+LLFastTimer::DeclareTimer FTM_GET_ITEM_BY_ID("Get FolderViewItem by ID");
+LLFolderViewItem* LLInventoryPanel::getItemByID(const LLUUID& id)
+{
+ LLFastTimer _(FTM_GET_ITEM_BY_ID);
+
+ std::map<LLUUID, LLFolderViewItem*>::iterator map_it;
+ map_it = mItemMap.find(id);
+ if (map_it != mItemMap.end())
+ {
+ return map_it->second;
+ }
+
+ return NULL;
+}
+
+LLFolderViewFolder* LLInventoryPanel::getFolderByID(const LLUUID& id)
+{
+ LLFolderViewItem* item = getItemByID(id);
+ return dynamic_cast<LLFolderViewFolder*>(item);
+}
+
+
+void LLInventoryPanel::setSelectionByID( const LLUUID& obj_id, BOOL take_keyboard_focus )
+{
+ LLFolderViewItem* itemp = getItemByID(obj_id);
+ if(itemp && itemp->getViewModelItem())
+ {
+ itemp->arrangeAndSet(TRUE, take_keyboard_focus);
+ mSelectThisID.setNull();
+ return;
+ }
+ else
+ {
+ // save the desired item to be selected later (if/when ready)
+ mSelectThisID = obj_id;
+ }
+}
+
+void LLInventoryPanel::updateSelection()
+{
+ if (mSelectThisID.notNull())
+ {
+ setSelectionByID(mSelectThisID, false);
+ }
+}
+
+void LLInventoryPanel::doToSelected(const LLSD& userdata)
+{
+ LLInventoryAction::doToSelected(mInventory, mFolderRoot, userdata.asString());
+
+ return;
+}
+
+BOOL LLInventoryPanel::handleKeyHere( KEY key, MASK mask )
+{
+ BOOL handled = FALSE;
+ switch (key)
+ {
+ case KEY_RETURN:
+ // Open selected items if enter key hit on the inventory panel
+ if (mask == MASK_NONE)
+ {
+ LLInventoryAction::doToSelected(mInventory, mFolderRoot, "open");
+ handled = TRUE;
+ }
+ break;
+ case KEY_DELETE:
+ case KEY_BACKSPACE:
+ // Delete selected items if delete or backspace key hit on the inventory panel
+ // Note: on Mac laptop keyboards, backspace and delete are one and the same
+ if (isSelectionRemovable() && (mask == MASK_NONE))
+ {
+ LLInventoryAction::doToSelected(mInventory, mFolderRoot, "delete");
+ handled = TRUE;
+ }
+ break;
+ }
+ return handled;
+}
+
+bool LLInventoryPanel::isSelectionRemovable()
+{
+ bool can_delete = false;
+ if (mFolderRoot)
+ {
+ std::set<LLFolderViewItem*> selection_set = mFolderRoot->getSelectionList();
+ if (!selection_set.empty())
+ {
+ can_delete = true;
+ for (std::set<LLFolderViewItem*>::iterator iter = selection_set.begin();
+ iter != selection_set.end();
+ ++iter)
+ {
+ LLFolderViewItem *item = *iter;
+ const LLFolderViewModelItemInventory *listener = static_cast<const LLFolderViewModelItemInventory*>(item->getViewModelItem());
+ if (!listener)
+ {
+ can_delete = false;
+ }
+ else
+ {
+ can_delete &= listener->isItemRemovable() && !listener->isItemInTrash();
+ }
+ }
+ }
+ }
+ return can_delete;
+}
/************************************************************************/
/* Recent Inventory Panel related class */
@@ -1241,7 +1426,7 @@ public:
{
LLInventoryPanel::initFromParams(p);
// turn on inbox for recent items
- getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() | (1ULL << LLFolderType::FT_INBOX));
+ getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() | (1ULL << LLFolderType::FT_INBOX));
}
protected:
@@ -1256,3 +1441,34 @@ LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params)
mInvFVBridgeBuilder = &RECENT_ITEMS_BUILDER;
}
+namespace LLInitParam
+{
+ void TypeValues<LLFolderType::EType>::declareValues()
+ {
+ declare(LLFolderType::lookup(LLFolderType::FT_TEXTURE) , LLFolderType::FT_TEXTURE);
+ declare(LLFolderType::lookup(LLFolderType::FT_SOUND) , LLFolderType::FT_SOUND);
+ declare(LLFolderType::lookup(LLFolderType::FT_CALLINGCARD) , LLFolderType::FT_CALLINGCARD);
+ declare(LLFolderType::lookup(LLFolderType::FT_LANDMARK) , LLFolderType::FT_LANDMARK);
+ declare(LLFolderType::lookup(LLFolderType::FT_CLOTHING) , LLFolderType::FT_CLOTHING);
+ declare(LLFolderType::lookup(LLFolderType::FT_OBJECT) , LLFolderType::FT_OBJECT);
+ declare(LLFolderType::lookup(LLFolderType::FT_NOTECARD) , LLFolderType::FT_NOTECARD);
+ declare(LLFolderType::lookup(LLFolderType::FT_ROOT_INVENTORY) , LLFolderType::FT_ROOT_INVENTORY);
+ declare(LLFolderType::lookup(LLFolderType::FT_LSL_TEXT) , LLFolderType::FT_LSL_TEXT);
+ declare(LLFolderType::lookup(LLFolderType::FT_BODYPART) , LLFolderType::FT_BODYPART);
+ declare(LLFolderType::lookup(LLFolderType::FT_TRASH) , LLFolderType::FT_TRASH);
+ declare(LLFolderType::lookup(LLFolderType::FT_SNAPSHOT_CATEGORY), LLFolderType::FT_SNAPSHOT_CATEGORY);
+ declare(LLFolderType::lookup(LLFolderType::FT_LOST_AND_FOUND) , LLFolderType::FT_LOST_AND_FOUND);
+ declare(LLFolderType::lookup(LLFolderType::FT_ANIMATION) , LLFolderType::FT_ANIMATION);
+ declare(LLFolderType::lookup(LLFolderType::FT_GESTURE) , LLFolderType::FT_GESTURE);
+ declare(LLFolderType::lookup(LLFolderType::FT_FAVORITE) , LLFolderType::FT_FAVORITE);
+ declare(LLFolderType::lookup(LLFolderType::FT_ENSEMBLE_START) , LLFolderType::FT_ENSEMBLE_START);
+ declare(LLFolderType::lookup(LLFolderType::FT_ENSEMBLE_END) , LLFolderType::FT_ENSEMBLE_END);
+ declare(LLFolderType::lookup(LLFolderType::FT_CURRENT_OUTFIT) , LLFolderType::FT_CURRENT_OUTFIT);
+ declare(LLFolderType::lookup(LLFolderType::FT_OUTFIT) , LLFolderType::FT_OUTFIT);
+ declare(LLFolderType::lookup(LLFolderType::FT_MY_OUTFITS) , LLFolderType::FT_MY_OUTFITS);
+ declare(LLFolderType::lookup(LLFolderType::FT_MESH ) , LLFolderType::FT_MESH );
+ declare(LLFolderType::lookup(LLFolderType::FT_INBOX) , LLFolderType::FT_INBOX);
+ declare(LLFolderType::lookup(LLFolderType::FT_OUTBOX) , LLFolderType::FT_OUTBOX);
+ declare(LLFolderType::lookup(LLFolderType::FT_BASIC_ROOT) , LLFolderType::FT_BASIC_ROOT);
+ }
+}
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 6db59afb9b..00a90325ad 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -30,6 +30,8 @@
#include "llassetstorage.h"
#include "lldarray.h"
+#include "llfolderviewitem.h"
+#include "llfolderviewmodelinventory.h"
#include "llfloater.h"
#include "llinventory.h"
#include "llinventoryfilter.h"
@@ -38,22 +40,19 @@
#include "lluictrlfactory.h"
#include <set>
-class LLFolderView;
-class LLFolderViewFolder;
-class LLFolderViewItem;
-class LLInventoryFilter;
-class LLInventoryModel;
class LLInvFVBridge;
-class LLInventoryFVBridgeBuilder;
-class LLMenuBarGL;
-class LLCheckBoxCtrl;
-class LLSpinCtrl;
-class LLTextBox;
-class LLIconCtrl;
-class LLSaveFolderState;
-class LLFilterEditor;
-class LLTabContainer;
+class LLInventoryFolderViewModelBuilder;
class LLInvPanelComplObserver;
+class LLFolderViewModelInventory;
+
+namespace LLInitParam
+{
+ template<>
+ struct TypeValues<LLFolderType::EType> : public TypeValuesHelper<LLFolderType::EType>
+ {
+ static void declareValues();
+ };
+}
class LLInventoryPanel : public LLPanel
{
@@ -74,6 +73,19 @@ public:
{}
};
+ struct StartFolder : public LLInitParam::ChoiceBlock<StartFolder>
+ {
+ Alternative<std::string> name;
+ Alternative<LLUUID> id;
+ Alternative<LLFolderType::EType> type;
+
+ StartFolder()
+ : name("name"),
+ id("id"),
+ type("type")
+ {}
+ };
+
struct Params
: public LLInitParam::Block<Params, LLPanel::Params>
{
@@ -82,12 +94,14 @@ public:
Optional<bool> allow_multi_select;
Optional<bool> show_item_link_overlays;
Optional<Filter> filter;
- Optional<std::string> start_folder;
+ Optional<StartFolder> start_folder;
Optional<bool> use_label_suffix;
Optional<bool> show_empty_message;
- Optional<bool> show_load_status;
Optional<LLScrollContainer::Params> scroll;
Optional<bool> accepts_drag_and_drop;
+ Optional<LLFolderView::Params> folder_view;
+ Optional<LLFolderViewFolder::Params> folder;
+ Optional<LLFolderViewItem::Params> item;
Params()
: sort_order_setting("sort_order_setting"),
@@ -98,27 +112,38 @@ public:
start_folder("start_folder"),
use_label_suffix("use_label_suffix", true),
show_empty_message("show_empty_message", true),
- show_load_status("show_load_status"),
scroll("scroll"),
- accepts_drag_and_drop("accepts_drag_and_drop")
+ accepts_drag_and_drop("accepts_drag_and_drop"),
+ folder_view("folder_view"),
+ folder("folder"),
+ item("item")
{}
};
+ struct InventoryState : public LLInitParam::Block<InventoryState>
+ {
+ Mandatory<LLInventoryFilter::Params> filter;
+ Mandatory<LLInventorySort::Params> sort;
+ };
+
//--------------------------------------------------------------------
// Initialization
//--------------------------------------------------------------------
protected:
LLInventoryPanel(const Params&);
void initFromParams(const Params&);
+
friend class LLUICtrlFactory;
public:
virtual ~LLInventoryPanel();
public:
LLInventoryModel* getModel() { return mInventory; }
+ LLFolderViewModelInventory& getRootViewModel() { return mInventoryViewModel; }
// LLView methods
void draw();
+ /*virtual*/ BOOL handleKeyHere( KEY key, MASK mask );
BOOL handleHover(S32 x, S32 y, MASK mask);
BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
@@ -137,8 +162,9 @@ public:
void setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus);
void setSelectCallback(const boost::function<void (const std::deque<LLFolderViewItem*>& items, BOOL user_action)>& cb);
void clearSelection();
- LLInventoryFilter* getFilter();
- const LLInventoryFilter* getFilter() const;
+ bool isSelectionRemovable();
+ LLInventoryFilter& getFilter();
+ const LLInventoryFilter& getFilter() const;
void setFilterTypes(U64 filter, LLInventoryFilter::EFilterType = LLInventoryFilter::FILTERTYPE_OBJECT);
U32 getFilterObjectTypes() const;
void setFilterPermMask(PermissionMask filter_perm_mask);
@@ -156,6 +182,7 @@ public:
// This method is called when something has changed about the inventory.
void modelChanged(U32 mask);
LLFolderView* getRootFolder();
+ LLUUID getRootFolderID();
LLScrollContainer* getScrollableContainer() { return mScroller; }
void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
@@ -167,7 +194,8 @@ public:
void doCreate(const LLSD& userdata);
bool beginIMSession();
bool attachObject(const LLSD& userdata);
-
+ static void idle(void* user_data);
+
// DEBUG ONLY:
static void dumpSelectionInformation(void* user_data);
@@ -182,30 +210,44 @@ public:
static void openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id);
+ void addItemID(const LLUUID& id, LLFolderViewItem* itemp);
+ void removeItemID(const LLUUID& id);
+ LLFolderViewItem* getItemByID(const LLUUID& id);
+ LLFolderViewFolder* getFolderByID(const LLUUID& id);
+ void setSelectionByID(const LLUUID& obj_id, BOOL take_keyboard_focus);
+ void updateSelection();
+
+ LLFolderViewModelInventory* getFolderViewModel();
+ const LLFolderViewModelInventory* getFolderViewModel() const;
+
protected:
void openStartFolderOrMyInventory(); // open the first level of inventory
void onItemsCompletion(); // called when selected items are complete
+ LLUUID mSelectThisID;
LLInventoryModel* mInventory;
LLInventoryObserver* mInventoryObserver;
LLInvPanelComplObserver* mCompletionObserver;
- BOOL mAcceptsDragAndDrop;
- BOOL mAllowMultiSelect;
- BOOL mShowItemLinkOverlays; // Shows link graphic over inventory item icons
- BOOL mShowEmptyMessage;
- BOOL mShowLoadStatus;
+ bool mAcceptsDragAndDrop;
+ bool mAllowMultiSelect;
+ bool mShowItemLinkOverlays; // Shows link graphic over inventory item icons
+ bool mShowEmptyMessage;
LLFolderView* mFolderRoot;
LLScrollContainer* mScroller;
+ LLFolderViewModelInventory mInventoryViewModel;
+ Params mParams; // stored copy of parameter block
+
+ std::map<LLUUID, LLFolderViewItem*> mItemMap;
/**
- * Pointer to LLInventoryFVBridgeBuilder.
+ * Pointer to LLInventoryFolderViewModelBuilder.
*
* 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;
+ const LLInventoryFolderViewModelBuilder* mInvFVBridgeBuilder;
//--------------------------------------------------------------------
@@ -218,7 +260,6 @@ public:
void setSortOrder(U32 order);
U32 getSortOrder() const;
- void requestSort();
private:
std::string mSortOrderSetting;
@@ -231,26 +272,27 @@ public:
void addHideFolderType(LLFolderType::EType folder_type);
public:
- BOOL getIsViewsInitialized() const { return mViewsInitialized; }
- const LLUUID& getRootFolderID() const;
+ BOOL getIsViewsInitialized() const { return mViewsInitialized; }
protected:
// Builds the UI. Call this once the inventory is usable.
void initializeViews();
- LLFolderViewItem* rebuildViewsFor(const LLUUID& id); // Given the id and the parent, build all of the folder views.
- virtual void buildFolderView(const LLInventoryPanel::Params& params);
+ // Specific inventory colors
+ static bool sColorSetInitialized;
+ static LLUIColor sDefaultColor;
+ static LLUIColor sDefaultHighlightColor;
+ static LLUIColor sLibraryColor;
+ static LLUIColor sLinkColor;
+
LLFolderViewItem* buildNewViews(const LLUUID& id);
BOOL getIsHiddenFolderType(LLFolderType::EType folder_type) const;
- virtual LLFolderView* createFolderView(LLInvFVBridge * bridge, bool useLabelSuffix);
+ virtual LLFolderView * createFolderRoot(LLUUID root_id );
virtual LLFolderViewFolder* createFolderViewFolder(LLInvFVBridge * bridge);
virtual LLFolderViewItem* createFolderViewItem(LLInvFVBridge * bridge);
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.
- LLUUID mStartFolderID;
+ bool mBuildDefaultHierarchy; // default inventory hierarchy should be created in postBuild()
+ bool mViewsInitialized; // Views have been generated
};
#endif // LL_LLINVENTORYPANEL_H
diff --git a/indra/newview/lllistcontextmenu.h b/indra/newview/lllistcontextmenu.h
index fabd68ee20..04d3314829 100644
--- a/indra/newview/lllistcontextmenu.h
+++ b/indra/newview/lllistcontextmenu.h
@@ -37,7 +37,7 @@ class LLContextMenu;
/**
* Context menu for single or multiple list items.
*
- * Derived classes must implement contextMenu().
+ * Derived classes must implement createMenu().
*
* Typical usage:
* <code>
diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp
index 459e52c4f4..97ba5b634a 100644
--- a/indra/newview/lllocalbitmaps.cpp
+++ b/indra/newview/lllocalbitmaps.cpp
@@ -32,9 +32,7 @@
#include "lllocalbitmaps.h"
/* boost: will not compile unless equivalent is undef'd, beware. */
-#ifdef equivalent
-#undef equivalent
-#endif
+#include "fix_macros.h"
#include <boost/filesystem.hpp>
/* image compression headers. */
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index ebb5912ace..2d7454b636 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -28,11 +28,13 @@
#include "llagent.h"
#include "llagentui.h"
+#include "llavatarnamecache.h"
#include "lllogchat.h"
#include "lltrans.h"
#include "llviewercontrol.h"
#include "lldiriterator.h"
+#include "llfloaterimsessiontab.h"
#include "llinstantmessage.h"
#include "llsingleton.h" // for LLSingleton
@@ -40,6 +42,7 @@
#include <boost/algorithm/string/replace.hpp>
#include <boost/regex.hpp>
#include <boost/regex/v4/match_results.hpp>
+#include <boost/foreach.hpp>
#if LL_MSVC
#pragma warning(push)
@@ -58,10 +61,11 @@
const S32 LOG_RECALL_SIZE = 2048;
-const std::string IM_TIME("time");
-const std::string IM_TEXT("message");
-const std::string IM_FROM("from");
-const std::string IM_FROM_ID("from_id");
+const std::string LL_IM_TIME("time");
+const std::string LL_IM_TEXT("message");
+const std::string LL_IM_FROM("from");
+const std::string LL_IM_FROM_ID("from_id");
+const std::string LL_TRANSCRIPT_FILE_EXTENSION("txt");
const static std::string IM_SEPARATOR(": ");
const static std::string NEW_LINE("\n");
@@ -84,6 +88,7 @@ const static std::string MULTI_LINE_PREFIX(" ");
* 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+)?(.*)$");
+const static boost::regex TIMESTAMP("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}\\]|\\[\\d{1,2}:\\d{2}\\]).*");
/**
* Regular expression suitable to match names like
@@ -116,6 +121,15 @@ const static int IDX_TEXT = 3;
using namespace boost::posix_time;
using namespace boost::gregorian;
+void append_to_last_message(std::list<LLSD>& messages, const std::string& line)
+{
+ if (!messages.size()) return;
+
+ std::string im_text = messages.back()[LL_IM_TEXT].asString();
+ im_text.append(line);
+ messages.back()[LL_IM_TEXT] = im_text;
+}
+
class LLLogChatTimeScanner: public LLSingleton<LLLogChatTimeScanner>
{
public:
@@ -191,15 +205,17 @@ private:
std::stringstream mTimeStream;
};
+LLLogChat::save_history_signal_t * LLLogChat::sSaveHistorySignal = NULL;
+
//static
std::string LLLogChat::makeLogFileName(std::string filename)
{
/**
- * Testing for in bound and out bound ad-hoc file names
- * if it is then skip date stamping.
- **/
- //LL_INFOS("") << "Befor:" << filename << LL_ENDL;/* uncomment if you want to verify step, delete on commit */
- boost::match_results<std::string::const_iterator> matches;
+ * Testing for in bound and out bound ad-hoc file names
+ * if it is then skip date stamping.
+ **/
+
+ boost::match_results<std::string::const_iterator> matches;
bool inboundConf = boost::regex_match(filename, matches, INBOUND_CONFERENCE);
bool outboundConf = boost::regex_match(filename, matches, OUTBOUND_CONFERENCE);
if (!(inboundConf || outboundConf))
@@ -220,17 +236,17 @@ std::string LLLogChat::makeLogFileName(std::string filename)
filename += dbuffer;
}
}
- //LL_INFOS("") << "After:" << filename << LL_ENDL;/* uncomment if you want to verify step, delete on commit */
+
filename = cleanFileName(filename);
- filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_ACCOUNT_CHAT_LOGS,filename);
- filename += ".txt";
- //LL_INFOS("") << "Full:" << filename << LL_ENDL;/* uncomment if you want to verify step, delete on commit */
+ filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_ACCOUNT_CHAT_LOGS, filename);
+ filename += '.' + LL_TRANSCRIPT_FILE_EXTENSION;
+
return filename;
}
std::string LLLogChat::cleanFileName(std::string filename)
{
- std::string invalidChars = "\"\'\\/?*:.<>|[]{}~"; // Cannot match glob or illegal filename chars
+ std::string invalidChars = "\"\'\\/?*:.<>|[]{}~"; // Cannot match glob or illegal filename chars
std::string::size_type position = filename.find_first_of(invalidChars);
while (position != filename.npos)
{
@@ -242,27 +258,24 @@ std::string LLLogChat::cleanFileName(std::string filename)
std::string LLLogChat::timestamp(bool withdate)
{
- time_t utc_time;
- utc_time = time_corrected();
-
std::string timeStr;
- LLSD substitution;
- substitution["datetime"] = (S32) utc_time;
-
if (withdate)
{
- timeStr = "["+LLTrans::getString ("TimeYear")+"]/["
- +LLTrans::getString ("TimeMonth")+"]/["
- +LLTrans::getString ("TimeDay")+"] ["
- +LLTrans::getString ("TimeHour")+"]:["
- +LLTrans::getString ("TimeMin")+"]";
+ timeStr = "[" + LLTrans::getString ("TimeYear") + "]/["
+ + LLTrans::getString ("TimeMonth") + "]/["
+ + LLTrans::getString ("TimeDay") + "] ["
+ + LLTrans::getString ("TimeHour") + "]:["
+ + LLTrans::getString ("TimeMin") + "]";
}
else
{
timeStr = "[" + LLTrans::getString("TimeHour") + "]:["
- + LLTrans::getString ("TimeMin")+"]";
+ + LLTrans::getString ("TimeMin")+"]";
}
+ LLSD substitution;
+ substitution["datetime"] = (S32)time_corrected();
+
LLStringUtil::format (timeStr, substitution);
return timeStr;
}
@@ -270,9 +283,9 @@ std::string LLLogChat::timestamp(bool withdate)
//static
void LLLogChat::saveHistory(const std::string& filename,
- const std::string& from,
- const LLUUID& from_id,
- const std::string& line)
+ const std::string& from,
+ const LLUUID& from_id,
+ const std::string& line)
{
std::string tmp_filename = filename;
LLStringUtil::trim(tmp_filename);
@@ -312,108 +325,41 @@ void LLLogChat::saveHistory(const std::string& filename,
file << LLChatLogFormatter(item) << std::endl;
file.close();
-}
-void LLLogChat::loadHistory(const std::string& filename, void (*callback)(ELogLineType, const LLSD&, void*), void* userdata)
-{
- if(!filename.size())
- {
- llwarns << "Filename is Empty!" << llendl;
- return ;
- }
-
- LLFILE* fptr = LLFile::fopen(makeLogFileName(filename), "r"); /*Flawfinder: ignore*/
- if (!fptr)
- {
- callback(LOG_EMPTY, LLSD(), userdata);
- return; //No previous conversation with this name.
- }
- else
+ if (NULL != sSaveHistorySignal)
{
- 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)
- {
- LLSD item;
- std::string line(buffer);
- std::istringstream iss(line);
-
- if (!LLChatLogParser::parse(line, item))
- {
- item["message"] = line;
- callback(LOG_LINE, item, userdata);
- }
- else
- {
- callback(LOG_LLSD, item, userdata);
- }
- }
- else
- {
- firstline = FALSE;
- }
- }
- callback(LOG_END, LLSD(), userdata);
-
- fclose(fptr);
+ (*sSaveHistorySignal)();
}
}
-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;
-}
-
// static
-void LLLogChat::loadAllHistory(const std::string& file_name, std::list<LLSD>& messages)
+void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params)
{
if (file_name.empty())
{
llwarns << "Session name is Empty!" << llendl;
return ;
}
- //LL_INFOS("") << "Loading:" << file_name << LL_ENDL;/* uncomment if you want to verify step, delete on commit */
- //LL_INFOS("") << "Current:" << makeLogFileName(file_name) << LL_ENDL;/* uncomment if you want to verify step, delete on commit */
+
+ bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false;
+
LLFILE* fptr = LLFile::fopen(makeLogFileName(file_name), "r");/*Flawfinder: ignore*/
if (!fptr)
- {
+ {
fptr = LLFile::fopen(oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
- if (!fptr)
- {
- if (!fptr) return; //No previous conversation with this name.
- }
+ if (!fptr)
+ {
+ return; //No previous conversation with this name.
+ }
}
- //LL_INFOS("") << "Reading:" << file_name << LL_ENDL;
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.
+ if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1 , SEEK_END))
+ { //We need to load the whole historyFile or it's smaller than recall size, so get it all.
firstline = FALSE;
if (fseek(fptr, 0, SEEK_SET))
{
@@ -449,9 +395,9 @@ void LLLogChat::loadAllHistory(const std::string& file_name, std::list<LLSD>& me
else
{
LLSD item;
- if (!LLChatLogParser::parse(line, item))
+ if (!LLChatLogParser::parse(line, item, load_params))
{
- item[IM_TEXT] = line;
+ item[LL_IM_TEXT] = line;
}
messages.push_back(item);
}
@@ -459,9 +405,259 @@ void LLLogChat::loadAllHistory(const std::string& file_name, std::list<LLSD>& me
fclose(fptr);
}
+// static
+std::string LLLogChat::oldLogFileName(std::string filename)
+{
+ // get Users log directory
+ std::string directory = gDirUtilp->getPerAccountChatLogsDir();
+
+ // add final OS dependent delimiter
+ directory += gDirUtilp->getDirDelimiter();
+
+ // lest make sure the file name has no invalid characters before making the pattern
+ filename = cleanFileName(filename);
+
+ // create search pattern
+ std::string pattern = filename + ( filename == "chat" ? "-???\?-?\?-??.txt" : "-???\?-??.txt");
+
+ std::vector<std::string> allfiles;
+ LLDirIterator iter(directory, pattern);
+ std::string scanResult;
+
+ while (iter.next(scanResult))
+ {
+ allfiles.push_back(scanResult);
+ }
+
+ if (allfiles.size() == 0) // if no result from date search, return generic filename
+ {
+ scanResult = directory + filename + '.' + LL_TRANSCRIPT_FILE_EXTENSION;
+ }
+ else
+ {
+ sort(allfiles.begin(), allfiles.end());
+ scanResult = directory + allfiles.back();
+ // this file is now the most recent version of the file.
+ }
+
+ return scanResult;
+}
+
+// static
+void LLLogChat::findTranscriptFiles(std::string pattern, std::vector<std::string>& list_of_transcriptions)
+{
+ // get Users log directory
+ std::string dirname = gDirUtilp->getPerAccountChatLogsDir();
+
+ // add final OS dependent delimiter
+ dirname += gDirUtilp->getDirDelimiter();
+
+ LLDirIterator iter(dirname, pattern);
+ std::string filename;
+ while (iter.next(filename))
+ {
+ std::string fullname = gDirUtilp->add(dirname, filename);
+
+ LLFILE * filep = LLFile::fopen(fullname, "rb");
+ if (NULL != filep)
+ {
+ char buffer[LOG_RECALL_SIZE];
+
+ fseek(filep, 0, SEEK_END); // seek to end of file
+ S32 bytes_to_read = ftell(filep); // get current file pointer
+ fseek(filep, 0, SEEK_SET); // seek back to beginning of file
+
+ // limit the number characters to read from file
+ if (bytes_to_read >= LOG_RECALL_SIZE)
+ {
+ bytes_to_read = LOG_RECALL_SIZE - 1;
+ }
+
+ if (bytes_to_read > 0 && NULL != fgets(buffer, bytes_to_read, filep))
+ {
+ //matching a timestamp
+ boost::match_results<std::string::const_iterator> matches;
+ if (boost::regex_match(std::string(buffer), matches, TIMESTAMP))
+ {
+ list_of_transcriptions.push_back(gDirUtilp->add(dirname, filename));
+ }
+ }
+ LLFile::close(filep);
+ }
+ }
+}
+
+// static
+void LLLogChat::getListOfTranscriptFiles(std::vector<std::string>& list_of_transcriptions)
+{
+ // create search pattern
+ std::string pattern = "*." + LL_TRANSCRIPT_FILE_EXTENSION;
+ findTranscriptFiles(pattern, list_of_transcriptions);
+}
+
+// static
+void LLLogChat::getListOfTranscriptBackupFiles(std::vector<std::string>& list_of_transcriptions)
+{
+ // create search pattern
+ std::string pattern = "*." + LL_TRANSCRIPT_FILE_EXTENSION + ".backup*";
+ findTranscriptFiles(pattern, list_of_transcriptions);
+}
+
+//static
+boost::signals2::connection LLLogChat::setSaveHistorySignal(const save_history_signal_t::slot_type& cb)
+{
+ if (NULL == sSaveHistorySignal)
+ {
+ sSaveHistorySignal = new save_history_signal_t();
+ }
+
+ return sSaveHistorySignal->connect(cb);
+}
+
+//static
+bool LLLogChat::moveTranscripts(const std::string originDirectory,
+ const std::string targetDirectory,
+ std::vector<std::string>& listOfFilesToMove,
+ std::vector<std::string>& listOfFilesMoved)
+{
+ std::string newFullPath;
+ bool movedAllTranscripts = true;
+ std::string backupFileName;
+ unsigned backupFileCount;
+
+ BOOST_FOREACH(const std::string& fullpath, listOfFilesToMove)
+ {
+ backupFileCount = 0;
+ newFullPath = targetDirectory + fullpath.substr(originDirectory.length(), std::string::npos);
+
+ //The target directory contains that file already, so lets store it
+ if(LLFile::isfile(newFullPath))
+ {
+ backupFileName = newFullPath + ".backup";
+
+ //If needed store backup file as .backup1 etc.
+ while(LLFile::isfile(backupFileName))
+ {
+ ++backupFileCount;
+ backupFileName = newFullPath + ".backup" + boost::lexical_cast<std::string>(backupFileCount);
+ }
+
+ //Rename the file to its backup name so it is not overwritten
+ LLFile::rename(newFullPath, backupFileName);
+ }
+
+ S32 retry_count = 0;
+ while (retry_count < 5)
+ {
+ //success is zero
+ if (LLFile::rename(fullpath, newFullPath) != 0)
+ {
+ retry_count++;
+ S32 result = errno;
+ LL_WARNS("LLLogChat::moveTranscripts") << "Problem renaming " << fullpath << " - errorcode: "
+ << result << " attempt " << retry_count << LL_ENDL;
+
+ ms_sleep(100);
+ }
+ else
+ {
+ listOfFilesMoved.push_back(newFullPath);
+
+ if (retry_count)
+ {
+ LL_WARNS("LLLogChat::moveTranscripts") << "Successfully renamed " << fullpath << LL_ENDL;
+ }
+ break;
+ }
+ }
+ }
+
+ if(listOfFilesMoved.size() != listOfFilesToMove.size())
+ {
+ movedAllTranscripts = false;
+ }
+
+ return movedAllTranscripts;
+}
+
+//static
+bool LLLogChat::moveTranscripts(const std::string currentDirectory,
+ const std::string newDirectory,
+ std::vector<std::string>& listOfFilesToMove)
+{
+ std::vector<std::string> listOfFilesMoved;
+ return moveTranscripts(currentDirectory, newDirectory, listOfFilesToMove, listOfFilesMoved);
+}
+
+//static
+void LLLogChat::deleteTranscripts()
+{
+ std::vector<std::string> list_of_transcriptions;
+ getListOfTranscriptFiles(list_of_transcriptions);
+ getListOfTranscriptBackupFiles(list_of_transcriptions);
+
+ BOOST_FOREACH(const std::string& fullpath, list_of_transcriptions)
+ {
+ S32 retry_count = 0;
+ while (retry_count < 5)
+ {
+ if (0 != LLFile::remove(fullpath))
+ {
+ retry_count++;
+ S32 result = errno;
+ LL_WARNS("LLLogChat::deleteTranscripts") << "Problem removing " << fullpath << " - errorcode: "
+ << result << " attempt " << retry_count << LL_ENDL;
+
+ if(retry_count >= 5)
+ {
+ LL_WARNS("LLLogChat::deleteTranscripts") << "Failed to remove " << fullpath << LL_ENDL;
+ return;
+ }
+
+ ms_sleep(100);
+ }
+ else
+ {
+ if (retry_count)
+ {
+ LL_WARNS("LLLogChat::deleteTranscripts") << "Successfully removed " << fullpath << LL_ENDL;
+ }
+ break;
+ }
+ }
+ }
+
+ LLFloaterIMSessionTab::processChatHistoryStyleUpdate(true);
+}
+
+// static
+bool LLLogChat::isTranscriptExist(const LLUUID& avatar_id)
+{
+ std::vector<std::string> list_of_transcriptions;
+ LLLogChat::getListOfTranscriptFiles(list_of_transcriptions);
+
+ if (list_of_transcriptions.size() > 0)
+ {
+ LLAvatarName avatar_name;
+ LLAvatarNameCache::get(avatar_id, &avatar_name);
+ std::string avatar_user_name = avatar_name.getAccountName();
+ std::replace(avatar_user_name.begin(), avatar_user_name.end(), '.', '_');
+
+ BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions)
+ {
+ if (std::string::npos != transcript_file_name.find(avatar_user_name))
+ {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
//*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>"
+//Example, an object's name can be written like "Object <actual_object's_name>"
void LLChatLogFormatter::format(const LLSD& im, std::ostream& ostr) const
{
if (!im.isMap())
@@ -470,19 +666,19 @@ void LLChatLogFormatter::format(const LLSD& im, std::ostream& ostr) const
return;
}
- if (im[IM_TIME].isDefined())
+ if (im[LL_IM_TIME].isDefined())
{
- std::string timestamp = im[IM_TIME].asString();
+ std::string timestamp = im[LL_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())
+ //Example, an object's name can be written like "Object <actual_object's_name>"
+ if (im[LL_IM_FROM].isDefined())
{
- std::string from = im[IM_FROM].asString();
+ std::string from = im[LL_IM_FROM].asString();
boost::trim(from);
if (from.size())
{
@@ -490,9 +686,9 @@ void LLChatLogFormatter::format(const LLSD& im, std::ostream& ostr) const
}
}
- if (im[IM_TEXT].isDefined())
+ if (im[LL_IM_TEXT].isDefined())
{
- std::string im_text = im[IM_TEXT].asString();
+ std::string im_text = im[LL_IM_TEXT].asString();
//multilined text will be saved with prepended spaces
boost::replace_all(im_text, NEW_LINE, NEW_LINE_SPACE_PREFIX);
@@ -500,10 +696,11 @@ void LLChatLogFormatter::format(const LLSD& im, std::ostream& ostr) const
}
}
-bool LLChatLogParser::parse(std::string& raw, LLSD& im)
+bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params)
{
if (!raw.length()) return false;
+ bool cut_off_todays_date = parse_params.has("cut_off_todays_date") ? parse_params["cut_off_todays_date"].asBoolean() : true;
im = LLSD::emptyMap();
//matching a timestamp
@@ -518,13 +715,18 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im)
boost::trim(timestamp);
timestamp.erase(0, 1);
timestamp.erase(timestamp.length()-1, 1);
- LLLogChatTimeScanner::instance().checkAndCutOffDate(timestamp);
- im[IM_TIME] = timestamp;
+
+ if (cut_off_todays_date)
+ {
+ LLLogChatTimeScanner::instance().checkAndCutOffDate(timestamp);
+ }
+
+ im[LL_IM_TIME] = timestamp;
}
else
{
//timestamp is optional
- im[IM_TIME] = "";
+ im[LL_IM_TIME] = "";
}
bool has_stuff = matches[IDX_STUFF].matched;
@@ -550,8 +752,8 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im)
if (!has_name || name == SYSTEM_FROM)
{
//name is optional too
- im[IM_FROM] = SYSTEM_FROM;
- im[IM_FROM_ID] = LLUUID::null;
+ im[LL_IM_FROM] = SYSTEM_FROM;
+ im[LL_IM_FROM_ID] = LLUUID::null;
}
//possibly a case of complex object names consisting of 3+ words
@@ -560,8 +762,8 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im)
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());
+ im[LL_IM_FROM] = stuff.substr(0, divider_pos);
+ im[LL_IM_TEXT] = stuff.substr(divider_pos + NAME_TEXT_DIVIDER.length());
return true;
}
}
@@ -569,7 +771,7 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im)
if (!has_name)
{
//text is mandatory
- im[IM_TEXT] = stuff;
+ im[LL_IM_TEXT] = stuff;
return true; //parse as a message from Second Life
}
@@ -581,45 +783,15 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im)
{
std::string agent_name;
LLAgentUI::buildFullname(agent_name);
- im[IM_FROM] = agent_name;
- im[IM_FROM_ID] = gAgentID;
+ im[LL_IM_FROM] = agent_name;
+ im[LL_IM_FROM_ID] = gAgentID;
}
else
{
- im[IM_FROM] = name;
+ im[LL_IM_FROM] = name;
}
- im[IM_TEXT] = name_and_text[IDX_TEXT];
+ im[LL_IM_TEXT] = name_and_text[IDX_TEXT];
return true; //parsed name and message text, maybe have a timestamp too
}
-std::string LLLogChat::oldLogFileName(std::string filename)
-{
- std::string scanResult;
- std::string directory = gDirUtilp->getPerAccountChatLogsDir();/* get Users log directory */
- directory += gDirUtilp->getDirDelimiter();/* add final OS dependent delimiter */
- filename=cleanFileName(filename);/* lest make shure the file name has no invalad charecters befor making the pattern */
- std::string pattern = (filename+(( filename == "chat" ) ? "-???\?-?\?-??.txt" : "-???\?-??.txt"));/* create search pattern*/
- //LL_INFOS("") << "Checking:" << directory << " for " << pattern << LL_ENDL;/* uncomment if you want to verify step, delete on commit */
- std::vector<std::string> allfiles;
-
- LLDirIterator iter(directory, pattern);
- while (iter.next(scanResult))
- {
- //LL_INFOS("") << "Found :" << scanResult << LL_ENDL;
- allfiles.push_back(scanResult);
- }
-
- if (allfiles.size() == 0) // if no result from date search, return generic filename
- {
- scanResult = directory + filename + ".txt";
- }
- else
- {
- std::sort(allfiles.begin(), allfiles.end());
- scanResult = directory + allfiles.back();
- // thisfile is now the most recent version of the file.
- }
- //LL_INFOS("") << "Reading:" << scanResult << LL_ENDL;/* uncomment if you want to verify step, delete on commit */
- return scanResult;
-}
diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h
index 27752452c9..e819f00dd9 100644
--- a/indra/newview/lllogchat.h
+++ b/indra/newview/lllogchat.h
@@ -49,15 +49,29 @@ public:
const std::string& from,
const LLUUID& from_id,
const std::string& line);
+ static void findTranscriptFiles(std::string pattern, std::vector<std::string>& list_of_transcriptions);
+ static void getListOfTranscriptFiles(std::vector<std::string>& list);
+ static void getListOfTranscriptBackupFiles(std::vector<std::string>& list_of_transcriptions);
- /** @deprecated @see loadAllHistory() */
- static void loadHistory(const std::string& filename,
- void (*callback)(ELogLineType, const LLSD&, void*),
- void* userdata);
+ static void loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params = LLSD());
+
+ typedef boost::signals2::signal<void ()> save_history_signal_t;
+ static boost::signals2::connection setSaveHistorySignal(const save_history_signal_t::slot_type& cb);
+
+ static bool moveTranscripts(const std::string currentDirectory,
+ const std::string newDirectory,
+ std::vector<std::string>& listOfFilesToMove,
+ std::vector<std::string>& listOfFilesMoved);
+ static bool moveTranscripts(const std::string currentDirectory,
+ const std::string newDirectory,
+ std::vector<std::string>& listOfFilesToMove);
+
+ static void deleteTranscripts();
+ static bool isTranscriptExist(const LLUUID& avatar_id);
- static void loadAllHistory(const std::string& file_name, std::list<LLSD>& messages);
private:
static std::string cleanFileName(std::string filename);
+ static save_history_signal_t * sSaveHistorySignal;
};
/**
@@ -105,7 +119,7 @@ public:
*
* @return false if failed to parse mandatory data - message text
*/
- static bool parse(std::string& raw, LLSD& im);
+ static bool parse(std::string& raw, LLSD& im, const LLSD& parse_params = LLSD());
protected:
LLChatLogParser();
@@ -113,9 +127,10 @@ protected:
};
// LLSD map lookup constants
-extern const std::string IM_TIME; //("time");
-extern const std::string IM_TEXT; //("message");
-extern const std::string IM_FROM; //("from");
-extern const std::string IM_FROM_ID; //("from_id");
+extern const std::string LL_IM_TIME; //("time");
+extern const std::string LL_IM_TEXT; //("message");
+extern const std::string LL_IM_FROM; //("from");
+extern const std::string LL_IM_FROM_ID; //("from_id");
+extern const std::string LL_TRANSCRIPT_FILE_EXTENSION; //("txt");
#endif
diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp
index 6e0f360cbc..9ec5d7c20c 100644
--- a/indra/newview/llmanip.cpp
+++ b/indra/newview/llmanip.cpp
@@ -72,7 +72,6 @@ void LLManip::rebuild(LLViewerObject* vobj)
LLDrawable* drawablep = vobj->mDrawable;
if (drawablep && drawablep->getVOVolume())
{
-
gPipeline.markRebuild(drawablep,LLDrawable::REBUILD_VOLUME, TRUE);
drawablep->setState(LLDrawable::MOVE_UNDAMPED); // force to UNDAMPED
drawablep->updateMove();
@@ -82,6 +81,14 @@ void LLManip::rebuild(LLViewerObject* vobj)
group->dirtyGeom();
gPipeline.markRebuild(group, TRUE);
}
+
+ LLViewerObject::const_child_list_t& child_list = vobj->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(), endIter = child_list.end();
+ iter != endIter; ++iter)
+ {
+ LLViewerObject* child = *iter;
+ rebuild(child);
+ }
}
}
diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index 826e8d560a..c8b446872b 100644
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -1376,74 +1376,28 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y )
BOOL hit = getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, constraint_axis);
projected_mouse -= snap_plane_center;
- S32 snap_plane = 0;
-
- F32 dot = cam_to_snap_plane * constraint_axis;
- if (llabs(dot) < 0.01f)
- {
- // looking at ring edge on, project onto view plane and check if mouse is past ring
- getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, cam_to_snap_plane);
- projected_mouse -= snap_plane_center;
- dot = projected_mouse * constraint_axis;
- if (projected_mouse * constraint_axis > 0)
- {
- snap_plane = 1;
- }
- projected_mouse -= dot * constraint_axis;
- }
- else if (dot > 0.f)
- {
- // look for mouse position outside and in front of snap circle
- if (hit && projected_mouse.magVec() > SNAP_GUIDE_INNER_RADIUS * mRadiusMeters && projected_mouse * cam_to_snap_plane < 0.f)
- {
- snap_plane = 1;
- }
- }
- else
- {
- // look for mouse position inside or in back of snap circle
- if (projected_mouse.magVec() < SNAP_GUIDE_INNER_RADIUS * mRadiusMeters || projected_mouse * cam_to_snap_plane > 0.f || !hit)
- {
- snap_plane = 1;
- }
- }
-
- if (snap_plane == 0)
- {
- // try other plane
- snap_plane_center = (center - (constraint_axis * mRadiusMeters * 0.5f));
- if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
- {
- cam_to_snap_plane.setVec(1.f, 0.f, 0.f);
- }
- else
- {
- cam_to_snap_plane = snap_plane_center - gAgentCamera.getCameraPositionAgent();
- cam_to_snap_plane.normVec();
- }
-
- hit = getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, constraint_axis);
- projected_mouse -= snap_plane_center;
-
- dot = cam_to_snap_plane * constraint_axis;
+ if (gSavedSettings.getBOOL("SnapEnabled")) {
+ S32 snap_plane = 0;
+
+ F32 dot = cam_to_snap_plane * constraint_axis;
if (llabs(dot) < 0.01f)
{
// looking at ring edge on, project onto view plane and check if mouse is past ring
getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, cam_to_snap_plane);
projected_mouse -= snap_plane_center;
dot = projected_mouse * constraint_axis;
- if (projected_mouse * constraint_axis < 0)
+ if (projected_mouse * constraint_axis > 0)
{
- snap_plane = 2;
+ snap_plane = 1;
}
projected_mouse -= dot * constraint_axis;
}
- else if (dot < 0.f)
+ else if (dot > 0.f)
{
// look for mouse position outside and in front of snap circle
if (hit && projected_mouse.magVec() > SNAP_GUIDE_INNER_RADIUS * mRadiusMeters && projected_mouse * cam_to_snap_plane < 0.f)
{
- snap_plane = 2;
+ snap_plane = 1;
}
}
else
@@ -1451,78 +1405,136 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y )
// look for mouse position inside or in back of snap circle
if (projected_mouse.magVec() < SNAP_GUIDE_INNER_RADIUS * mRadiusMeters || projected_mouse * cam_to_snap_plane > 0.f || !hit)
{
- snap_plane = 2;
+ snap_plane = 1;
}
}
- }
-
- if (snap_plane > 0)
- {
- LLVector3 cam_at_axis;
- if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
- {
- cam_at_axis.setVec(1.f, 0.f, 0.f);
- }
- else
- {
- cam_at_axis = snap_plane_center - gAgentCamera.getCameraPositionAgent();
- cam_at_axis.normVec();
- }
-
- // first, project mouse onto screen plane at point tangent to rotation radius.
- getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, cam_at_axis);
- // project that point onto rotation plane
- projected_mouse -= snap_plane_center;
- projected_mouse -= projected_vec(projected_mouse, constraint_axis);
-
- F32 mouse_lateral_dist = llmin(SNAP_GUIDE_INNER_RADIUS * mRadiusMeters, projected_mouse.magVec());
- F32 mouse_depth = SNAP_GUIDE_INNER_RADIUS * mRadiusMeters;
- if (llabs(mouse_lateral_dist) > 0.01f)
- {
- mouse_depth = sqrtf((SNAP_GUIDE_INNER_RADIUS * mRadiusMeters) * (SNAP_GUIDE_INNER_RADIUS * mRadiusMeters) -
- (mouse_lateral_dist * mouse_lateral_dist));
- }
- LLVector3 projected_camera_at = cam_at_axis - projected_vec(cam_at_axis, constraint_axis);
- projected_mouse -= mouse_depth * projected_camera_at;
-
- if (!mInSnapRegime)
+
+ if (snap_plane == 0)
{
- mSmoothRotate = TRUE;
+ // try other plane
+ snap_plane_center = (center - (constraint_axis * mRadiusMeters * 0.5f));
+ if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
+ {
+ cam_to_snap_plane.setVec(1.f, 0.f, 0.f);
+ }
+ else
+ {
+ cam_to_snap_plane = snap_plane_center - gAgentCamera.getCameraPositionAgent();
+ cam_to_snap_plane.normVec();
+ }
+
+ hit = getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, constraint_axis);
+ projected_mouse -= snap_plane_center;
+
+ dot = cam_to_snap_plane * constraint_axis;
+ if (llabs(dot) < 0.01f)
+ {
+ // looking at ring edge on, project onto view plane and check if mouse is past ring
+ getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, cam_to_snap_plane);
+ projected_mouse -= snap_plane_center;
+ dot = projected_mouse * constraint_axis;
+ if (projected_mouse * constraint_axis < 0)
+ {
+ snap_plane = 2;
+ }
+ projected_mouse -= dot * constraint_axis;
+ }
+ else if (dot < 0.f)
+ {
+ // look for mouse position outside and in front of snap circle
+ if (hit && projected_mouse.magVec() > SNAP_GUIDE_INNER_RADIUS * mRadiusMeters && projected_mouse * cam_to_snap_plane < 0.f)
+ {
+ snap_plane = 2;
+ }
+ }
+ else
+ {
+ // look for mouse position inside or in back of snap circle
+ if (projected_mouse.magVec() < SNAP_GUIDE_INNER_RADIUS * mRadiusMeters || projected_mouse * cam_to_snap_plane > 0.f || !hit)
+ {
+ snap_plane = 2;
+ }
+ }
}
- mInSnapRegime = TRUE;
- // 0 to 360 deg
- F32 mouse_angle = fmodf(atan2(projected_mouse * axis1, projected_mouse * axis2) * RAD_TO_DEG + 360.f, 360.f);
- F32 relative_mouse_angle = fmodf(mouse_angle + (SNAP_ANGLE_DETENTE / 2), SNAP_ANGLE_INCREMENT);
- //fmodf(llround(mouse_angle * RAD_TO_DEG, 7.5f) + 360.f, 360.f);
-
- LLVector3 object_axis;
- getObjectAxisClosestToMouse(object_axis);
- object_axis = object_axis * first_object_node->mSavedRotation;
-
- // project onto constraint plane
- object_axis = object_axis - (object_axis * getConstraintAxis()) * getConstraintAxis();
- object_axis.normVec();
-
- if (relative_mouse_angle < SNAP_ANGLE_DETENTE)
+ if (snap_plane > 0)
{
- F32 quantized_mouse_angle = mouse_angle - (relative_mouse_angle - (SNAP_ANGLE_DETENTE * 0.5f));
- angle = (quantized_mouse_angle * DEG_TO_RAD) - atan2(object_axis * axis1, object_axis * axis2);
+ LLVector3 cam_at_axis;
+ if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
+ {
+ cam_at_axis.setVec(1.f, 0.f, 0.f);
+ }
+ else
+ {
+ cam_at_axis = snap_plane_center - gAgentCamera.getCameraPositionAgent();
+ cam_at_axis.normVec();
+ }
+
+ // first, project mouse onto screen plane at point tangent to rotation radius.
+ getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, cam_at_axis);
+ // project that point onto rotation plane
+ projected_mouse -= snap_plane_center;
+ projected_mouse -= projected_vec(projected_mouse, constraint_axis);
+
+ F32 mouse_lateral_dist = llmin(SNAP_GUIDE_INNER_RADIUS * mRadiusMeters, projected_mouse.magVec());
+ F32 mouse_depth = SNAP_GUIDE_INNER_RADIUS * mRadiusMeters;
+ if (llabs(mouse_lateral_dist) > 0.01f)
+ {
+ mouse_depth = sqrtf((SNAP_GUIDE_INNER_RADIUS * mRadiusMeters) * (SNAP_GUIDE_INNER_RADIUS * mRadiusMeters) -
+ (mouse_lateral_dist * mouse_lateral_dist));
+ }
+ LLVector3 projected_camera_at = cam_at_axis - projected_vec(cam_at_axis, constraint_axis);
+ projected_mouse -= mouse_depth * projected_camera_at;
+
+ if (!mInSnapRegime)
+ {
+ mSmoothRotate = TRUE;
+ }
+ mInSnapRegime = TRUE;
+ // 0 to 360 deg
+ F32 mouse_angle = fmodf(atan2(projected_mouse * axis1, projected_mouse * axis2) * RAD_TO_DEG + 360.f, 360.f);
+
+ F32 relative_mouse_angle = fmodf(mouse_angle + (SNAP_ANGLE_DETENTE / 2), SNAP_ANGLE_INCREMENT);
+ //fmodf(llround(mouse_angle * RAD_TO_DEG, 7.5f) + 360.f, 360.f);
+
+ LLVector3 object_axis;
+ getObjectAxisClosestToMouse(object_axis);
+ object_axis = object_axis * first_object_node->mSavedRotation;
+
+ // project onto constraint plane
+ object_axis = object_axis - (object_axis * getConstraintAxis()) * getConstraintAxis();
+ object_axis.normVec();
+
+ if (relative_mouse_angle < SNAP_ANGLE_DETENTE)
+ {
+ F32 quantized_mouse_angle = mouse_angle - (relative_mouse_angle - (SNAP_ANGLE_DETENTE * 0.5f));
+ angle = (quantized_mouse_angle * DEG_TO_RAD) - atan2(object_axis * axis1, object_axis * axis2);
+ }
+ else
+ {
+ angle = (mouse_angle * DEG_TO_RAD) - atan2(object_axis * axis1, object_axis * axis2);
+ }
+ return LLQuaternion( -angle, constraint_axis );
}
else
{
- angle = (mouse_angle * DEG_TO_RAD) - atan2(object_axis * axis1, object_axis * axis2);
+ if (mInSnapRegime)
+ {
+ mSmoothRotate = TRUE;
+ }
+ mInSnapRegime = FALSE;
}
- return LLQuaternion( -angle, constraint_axis );
}
- else
- {
+ else {
if (mInSnapRegime)
{
mSmoothRotate = TRUE;
}
mInSnapRegime = FALSE;
-
+ }
+
+ if (!mInSnapRegime)
+ {
LLVector3 up_from_axis = mCenterToCamNorm % constraint_axis;
up_from_axis.normVec();
LLVector3 cur_intersection;
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index 7650fe9229..99b4707158 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -564,32 +564,13 @@ void LLMediaCtrl::navigateTo( std::string url_in, std::string mime_type)
//
void LLMediaCtrl::navigateToLocalPage( const std::string& subdir, const std::string& filename_in )
{
- std::string language = LLUI::getLanguage();
- std::string delim = gDirUtilp->getDirDelimiter();
- std::string filename;
+ std::string filename(gDirUtilp->add(subdir, filename_in));
+ std::string expanded_filename = gDirUtilp->findSkinnedFilename("html", filename);
- filename += subdir;
- filename += delim;
- filename += filename_in;
-
- std::string expanded_filename = gDirUtilp->findSkinnedFilename("html", language, filename);
-
- if (! gDirUtilp->fileExists(expanded_filename))
+ if (expanded_filename.empty())
{
- if (language != "en")
- {
- expanded_filename = gDirUtilp->findSkinnedFilename("html", "en", filename);
- if (! gDirUtilp->fileExists(expanded_filename))
- {
- llwarns << "File " << subdir << delim << filename_in << "not found" << llendl;
- return;
- }
- }
- else
- {
- llwarns << "File " << subdir << delim << filename_in << "not found" << llendl;
- return;
- }
+ llwarns << "File " << filename << "not found" << llendl;
+ return;
}
if (ensureMediaSourceExists())
{
@@ -597,7 +578,6 @@ void LLMediaCtrl::navigateToLocalPage( const std::string& subdir, const std::str
mMediaSource->setSize(mTextureWidth, mTextureHeight);
mMediaSource->navigateTo(expanded_filename, "text/html", false);
}
-
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llmemoryview.cpp b/indra/newview/llmemoryview.cpp
deleted file mode 100644
index c0a323d6cb..0000000000
--- a/indra/newview/llmemoryview.cpp
+++ /dev/null
@@ -1,333 +0,0 @@
-/**
- * @file llmemoryview.cpp
- * @brief LLMemoryView class implementation
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llmemoryview.h"
-
-#include "llappviewer.h"
-#include "llallocator_heap_profile.h"
-#include "llgl.h" // LLGLSUIDefault
-#include "llviewerwindow.h"
-#include "llviewercontrol.h"
-
-#include <sstream>
-#include <boost/algorithm/string/split.hpp>
-
-#include "llmemory.h"
-
-LLMemoryView::LLMemoryView(const LLMemoryView::Params& p)
-: LLView(p),
- mPaused(FALSE),
- //mDelay(120),
- mAlloc(NULL)
-{
-}
-
-LLMemoryView::~LLMemoryView()
-{
-}
-
-BOOL LLMemoryView::handleMouseDown(S32 x, S32 y, MASK mask)
-{
- if (mask & MASK_SHIFT)
- {
- }
- else if (mask & MASK_CONTROL)
- {
- }
- else
- {
- mPaused = !mPaused;
- }
- return TRUE;
-}
-
-BOOL LLMemoryView::handleMouseUp(S32 x, S32 y, MASK mask)
-{
- return TRUE;
-}
-
-
-BOOL LLMemoryView::handleHover(S32 x, S32 y, MASK mask)
-{
- return FALSE;
-}
-
-void LLMemoryView::refreshProfile()
-{
- /*
- LLAllocator & alloc = LLAppViewer::instance()->getAllocator();
- if(alloc.isProfiling()) {
- std::string profile_text = alloc.getRawProfile();
-
- boost::algorithm::split(mLines, profile_text, boost::bind(std::equal_to<llwchar>(), '\n', _1));
- } else {
- mLines.clear();
- }
- */
- if (mAlloc == NULL) {
- mAlloc = &LLAppViewer::instance()->getAllocator();
- }
-
- mLines.clear();
-
- if(mAlloc->isProfiling())
- {
- const LLAllocatorHeapProfile &prof = mAlloc->getProfile();
- for(size_t i = 0; i < prof.mLines.size(); ++i)
- {
- std::stringstream ss;
- ss << "Unfreed Mem: " << (prof.mLines[i].mLiveSize >> 20) << " M Trace: ";
- for(size_t k = 0; k < prof.mLines[i].mTrace.size(); ++k)
- {
- ss << LLMemType::getNameFromID(prof.mLines[i].mTrace[k]) << " ";
- }
- mLines.push_back(utf8string_to_wstring(ss.str()));
- }
- }
-}
-
-void LLMemoryView::draw()
-{
- const S32 UPDATE_INTERVAL = 60;
- const S32 MARGIN_AMT = 10;
- static S32 curUpdate = UPDATE_INTERVAL;
- static LLUIColor s_console_color = LLUIColorTable::instance().getColor("ConsoleBackground", LLColor4U::black);
-
- // setup update interval
- if (curUpdate >= UPDATE_INTERVAL)
- {
- refreshProfile();
- curUpdate = 0;
- }
- curUpdate++;
-
- // setup window properly
- 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
- F32 console_opacity = llclamp(gSavedSettings.getF32("ConsoleBackgroundOpacity"), 0.f, 1.f);
- LLColor4 color = s_console_color;
- color.mV[VALPHA] *= console_opacity;
-
- LLGLSUIDefault gls_ui;
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gl_rect_2d(0, height, width, 0, color);
-
- LLFontGL * font = LLFontGL::getFontSansSerifSmall();
-
- // draw remaining lines
- F32 y_pos = 0.f;
- F32 y_off = 0.f;
-
- F32 line_height = font->getLineHeight();
- S32 target_width = width - 2 * MARGIN_AMT;
-
- // cut off lines on bottom
- U32 max_lines = U32((height - 2 * line_height) / line_height);
- y_pos = height - MARGIN_AMT - line_height;
- y_off = 0.f;
-
-#if !MEM_TRACK_MEM
- std::vector<LLWString>::const_iterator end = mLines.end();
- if(mLines.size() > max_lines) {
- end = mLines.begin() + max_lines;
- }
- for (std::vector<LLWString>::const_iterator i = mLines.begin(); i != end; ++i)
- {
- font->render(*i, 0, MARGIN_AMT, y_pos - y_off,
- LLColor4::white,
- LLFontGL::LEFT,
- LLFontGL::BASELINE,
- LLFontGL::NORMAL,
- LLFontGL::DROP_SHADOW,
- S32_MAX,
- target_width
- );
- y_off += line_height;
- }
-
-#else
- LLMemTracker::getInstance()->preDraw(mPaused) ;
-
- {
- F32 x_pos = MARGIN_AMT ;
- U32 lines = 0 ;
- const char* str = LLMemTracker::getInstance()->getNextLine() ;
- while(str != NULL)
- {
- lines++ ;
- font->renderUTF8(str, 0, x_pos, y_pos - y_off,
- LLColor4::white,
- LLFontGL::LEFT,
- LLFontGL::BASELINE,
- LLFontGL::NORMAL,
- LLFontGL::DROP_SHADOW,
- S32_MAX,
- target_width,
- NULL, FALSE);
-
- str = LLMemTracker::getInstance()->getNextLine() ;
- y_off += line_height;
-
- if(lines >= max_lines)
- {
- lines = 0 ;
- x_pos += 512.f ;
- if(x_pos + 512.f > target_width)
- {
- break ;
- }
-
- y_pos = height - MARGIN_AMT - line_height;
- y_off = 0.f;
- }
- }
- }
-
- LLMemTracker::getInstance()->postDraw() ;
-#endif
-
-#if MEM_TRACK_TYPE
-
- S32 left, top, right, bottom;
- S32 x, y;
-
- S32 margin = 10;
- S32 texth = LLFontGL::getFontMonospace()->getLineHeight();
-
- S32 xleft = margin;
- S32 ytop = height - margin;
- S32 labelwidth = 0;
- S32 maxmaxbytes = 1;
-
- // Make sure all timers are accounted for
- // Set 'MT_OTHER' to unaccounted ticks last frame
- {
- S32 display_memtypes[LLMemType::MTYPE_NUM_TYPES];
- for (S32 i=0; i < LLMemType::MTYPE_NUM_TYPES; i++)
- {
- display_memtypes[i] = 0;
- }
- for (S32 i=0; i < MTV_DISPLAY_NUM; i++)
- {
- S32 tidx = mtv_display_table[i].memtype;
- display_memtypes[tidx]++;
- }
- LLMemType::sMemCount[LLMemType::MTYPE_OTHER] = 0;
- LLMemType::sMaxMemCount[LLMemType::MTYPE_OTHER] = 0;
- for (S32 tidx = 0; tidx < LLMemType::MTYPE_NUM_TYPES; tidx++)
- {
- if (display_memtypes[tidx] == 0)
- {
- LLMemType::sMemCount[LLMemType::MTYPE_OTHER] += LLMemType::sMemCount[tidx];
- LLMemType::sMaxMemCount[LLMemType::MTYPE_OTHER] += LLMemType::sMaxMemCount[tidx];
- }
- }
- }
-
- // Labels
- {
- y = ytop;
- S32 peak = 0;
- for (S32 i=0; i<MTV_DISPLAY_NUM; i++)
- {
- x = xleft;
-
- int tidx = mtv_display_table[i].memtype;
- S32 bytes = LLMemType::sMemCount[tidx];
- S32 maxbytes = LLMemType::sMaxMemCount[tidx];
- maxmaxbytes = llmax(maxbytes, maxmaxbytes);
- peak += maxbytes;
- S32 mbytes = bytes >> 20;
-
- tdesc = llformat("%s [%4d MB] in %06d NEWS",mtv_display_table[i].desc,mbytes, LLMemType::sNewCount[tidx]);
- LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
-
- y -= (texth + 2);
-
- S32 textw = LLFontGL::getFontMonospace()->getWidth(tdesc);
- if (textw > labelwidth)
- labelwidth = textw;
- }
-
- S32 num_avatars = 0;
- S32 num_motions = 0;
- S32 num_loading_motions = 0;
- S32 num_loaded_motions = 0;
- S32 num_active_motions = 0;
- S32 num_deprecated_motions = 0;
- for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
- iter != LLCharacter::sInstances.end(); ++iter)
- {
- num_avatars++;
- (*iter)->getMotionController().incMotionCounts(num_motions, num_loading_motions, num_loaded_motions, num_active_motions, num_deprecated_motions);
- }
-
- x = xleft;
- tdesc = llformat("Total Bytes: %d MB Overhead: %d KB Avs %d Motions:%d Loading:%d Loaded:%d Active:%d Dep:%d",
- LLMemType::sTotalMem >> 20, LLMemType::sOverheadMem >> 10,
- num_avatars, num_motions, num_loading_motions, num_loaded_motions, num_active_motions, num_deprecated_motions);
- LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
- }
-
- // Bars
- y = ytop;
- labelwidth += 8;
- S32 barw = width - labelwidth - xleft - margin;
- for (S32 i=0; i<MTV_DISPLAY_NUM; i++)
- {
- x = xleft + labelwidth;
-
- int tidx = mtv_display_table[i].memtype;
- S32 bytes = LLMemType::sMemCount[tidx];
- F32 frac = (F32)bytes / (F32)maxmaxbytes;
- S32 w = (S32)(frac * (F32)barw);
- left = x; right = x + w;
- top = y; bottom = y - texth;
- gl_rect_2d(left, top, right, bottom, *mtv_display_table[i].color);
-
- S32 maxbytes = LLMemType::sMaxMemCount[tidx];
- F32 frac2 = (F32)maxbytes / (F32)maxmaxbytes;
- S32 w2 = (S32)(frac2 * (F32)barw);
- left = x + w + 1; right = x + w2;
- top = y; bottom = y - texth;
- LLColor4 tcolor = *mtv_display_table[i].color;
- tcolor.setAlpha(.5f);
- gl_rect_2d(left, top, right, bottom, tcolor);
-
- y -= (texth + 2);
- }
-
- dumpData();
-
-#endif
-
- LLView::draw();
-}
diff --git a/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp
new file mode 100644
index 0000000000..2b92b0b3d1
--- /dev/null
+++ b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp
@@ -0,0 +1,245 @@
+/**
+* @file llmenuoptionpathfindingrebakenavmesh.cpp
+* @brief Implementation of llmenuoptionpathfindingrebakenavmesh
+* @author Prep@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llmenuoptionpathfindingrebakenavmesh.h"
+
+#include <boost/bind.hpp>
+#include <boost/signals2.hpp>
+
+#include "llagent.h"
+#include "llenvmanager.h"
+#include "llnotificationsutil.h"
+#include "llpathfindingmanager.h"
+#include "llpathfindingnavmesh.h"
+#include "llpathfindingnavmeshstatus.h"
+#include "llviewerregion.h"
+
+LLMenuOptionPathfindingRebakeNavmesh::LLMenuOptionPathfindingRebakeNavmesh()
+ : LLSingleton<LLMenuOptionPathfindingRebakeNavmesh>(),
+ mIsInitialized(false),
+ mCanRebakeRegion(false),
+ mRebakeNavMeshMode(kRebakeNavMesh_Default),
+ mNavMeshSlot(),
+ mRegionCrossingSlot(),
+ mAgentStateSlot()
+{
+}
+
+LLMenuOptionPathfindingRebakeNavmesh::~LLMenuOptionPathfindingRebakeNavmesh()
+{
+ if (mIsInitialized)
+ {
+ if (mRebakeNavMeshMode == kRebakeNavMesh_RequestSent)
+ {
+ LL_WARNS("navmeshRebaking") << "During destruction of the LLMenuOptionPathfindingRebakeNavmesh "
+ << "singleton, the mode indicates that a request has been sent for which a response has yet "
+ << "to be received. This could contribute to a crash on exit." << LL_ENDL;
+ }
+
+ quit();
+ }
+}
+
+void LLMenuOptionPathfindingRebakeNavmesh::initialize()
+{
+ if (!mIsInitialized)
+ {
+ mIsInitialized = true;
+
+ setMode(kRebakeNavMesh_Default);
+
+ createNavMeshStatusListenerForCurrentRegion();
+
+ if ( !mRegionCrossingSlot.connected() )
+ {
+ mRegionCrossingSlot = LLEnvManagerNew::getInstance()->setRegionChangeCallback(boost::bind(&LLMenuOptionPathfindingRebakeNavmesh::handleRegionBoundaryCrossed, this));
+ }
+
+ if (!mAgentStateSlot.connected())
+ {
+ mAgentStateSlot = LLPathfindingManager::getInstance()->registerAgentStateListener(boost::bind(&LLMenuOptionPathfindingRebakeNavmesh::handleAgentState, this, _1));
+ }
+ LLPathfindingManager::getInstance()->requestGetAgentState();
+ }
+}
+
+void LLMenuOptionPathfindingRebakeNavmesh::quit()
+{
+ if (mIsInitialized)
+ {
+ if (mNavMeshSlot.connected())
+ {
+ mNavMeshSlot.disconnect();
+ }
+
+ if (mRegionCrossingSlot.connected())
+ {
+ mRegionCrossingSlot.disconnect();
+ }
+
+ if (mAgentStateSlot.connected())
+ {
+ mAgentStateSlot.disconnect();
+ }
+
+ mIsInitialized = false;
+ }
+}
+
+bool LLMenuOptionPathfindingRebakeNavmesh::canRebakeRegion() const
+{
+ if (!mIsInitialized)
+ {
+ LL_ERRS("navmeshRebaking") << "LLMenuOptionPathfindingRebakeNavmesh class has not been initialized "
+ << "when the ability to rebake navmesh is being requested." << LL_ENDL;
+ }
+ return mCanRebakeRegion;
+}
+
+LLMenuOptionPathfindingRebakeNavmesh::ERebakeNavMeshMode LLMenuOptionPathfindingRebakeNavmesh::getMode() const
+{
+ if (!mIsInitialized)
+ {
+ LL_ERRS("navmeshRebaking") << "LLMenuOptionPathfindingRebakeNavmesh class has not been initialized "
+ << "when the mode is being requested." << LL_ENDL;
+ }
+ return mRebakeNavMeshMode;
+}
+
+void LLMenuOptionPathfindingRebakeNavmesh::sendRequestRebakeNavmesh()
+{
+ if (!mIsInitialized)
+ {
+ LL_ERRS("navmeshRebaking") << "LLMenuOptionPathfindingRebakeNavmesh class has not been initialized "
+ << "when the request is being made to rebake the navmesh." << LL_ENDL;
+ }
+ else
+ {
+ if (!canRebakeRegion())
+ {
+ LL_WARNS("navmeshRebaking") << "attempting to rebake navmesh when user does not have permissions "
+ << "on this region" << LL_ENDL;
+ }
+ if (getMode() != kRebakeNavMesh_Available)
+ {
+ LL_WARNS("navmeshRebaking") << "attempting to rebake navmesh when mode is not available"
+ << LL_ENDL;
+ }
+
+ setMode(kRebakeNavMesh_RequestSent);
+ LLPathfindingManager::getInstance()->requestRebakeNavMesh(boost::bind(&LLMenuOptionPathfindingRebakeNavmesh::handleRebakeNavMeshResponse, this, _1));
+ }
+}
+
+void LLMenuOptionPathfindingRebakeNavmesh::setMode(ERebakeNavMeshMode pRebakeNavMeshMode)
+{
+ mRebakeNavMeshMode = pRebakeNavMeshMode;
+}
+
+void LLMenuOptionPathfindingRebakeNavmesh::handleAgentState(BOOL pCanRebakeRegion)
+{
+ llassert(mIsInitialized);
+ mCanRebakeRegion = pCanRebakeRegion;
+}
+
+void LLMenuOptionPathfindingRebakeNavmesh::handleRebakeNavMeshResponse(bool pResponseStatus)
+{
+ llassert(mIsInitialized);
+ if (mIsInitialized)
+ {
+ if (getMode() == kRebakeNavMesh_RequestSent)
+ {
+ setMode(pResponseStatus ? kRebakeNavMesh_InProgress : kRebakeNavMesh_Default);
+ }
+
+ if (!pResponseStatus)
+ {
+ LLNotificationsUtil::add("PathfindingCannotRebakeNavmesh");
+ }
+ }
+}
+
+void LLMenuOptionPathfindingRebakeNavmesh::handleNavMeshStatus(const LLPathfindingNavMeshStatus &pNavMeshStatus)
+{
+ llassert(mIsInitialized);
+ if (mIsInitialized)
+ {
+ ERebakeNavMeshMode rebakeNavMeshMode = kRebakeNavMesh_Default;
+ if (pNavMeshStatus.isValid())
+ {
+ switch (pNavMeshStatus.getStatus())
+ {
+ case LLPathfindingNavMeshStatus::kPending :
+ case LLPathfindingNavMeshStatus::kRepending :
+ rebakeNavMeshMode = kRebakeNavMesh_Available;
+ break;
+ case LLPathfindingNavMeshStatus::kBuilding :
+ rebakeNavMeshMode = kRebakeNavMesh_InProgress;
+ break;
+ case LLPathfindingNavMeshStatus::kComplete :
+ rebakeNavMeshMode = kRebakeNavMesh_NotAvailable;
+ break;
+ default :
+ rebakeNavMeshMode = kRebakeNavMesh_Default;
+ llassert(0);
+ break;
+ }
+ }
+
+ setMode(rebakeNavMeshMode);
+ }
+}
+
+void LLMenuOptionPathfindingRebakeNavmesh::handleRegionBoundaryCrossed()
+{
+ llassert(mIsInitialized);
+ if (mIsInitialized)
+ {
+ createNavMeshStatusListenerForCurrentRegion();
+ mCanRebakeRegion = FALSE;
+ LLPathfindingManager::getInstance()->requestGetAgentState();
+ }
+}
+
+void LLMenuOptionPathfindingRebakeNavmesh::createNavMeshStatusListenerForCurrentRegion()
+{
+ if (mNavMeshSlot.connected())
+ {
+ mNavMeshSlot.disconnect();
+ }
+
+ LLViewerRegion *currentRegion = gAgent.getRegion();
+ if (currentRegion != NULL)
+ {
+ mNavMeshSlot = LLPathfindingManager::getInstance()->registerNavMeshListenerForRegion(currentRegion, boost::bind(&LLMenuOptionPathfindingRebakeNavmesh::handleNavMeshStatus, this, _2));
+ LLPathfindingManager::getInstance()->requestGetNavMeshForRegion(currentRegion, true);
+ }
+}
+
diff --git a/indra/newview/llpanelpathfindingrebakenavmesh.h b/indra/newview/llmenuoptionpathfindingrebakenavmesh.h
index 48764f2aa7..7b1d2873ba 100644
--- a/indra/newview/llpanelpathfindingrebakenavmesh.h
+++ b/indra/newview/llmenuoptionpathfindingrebakenavmesh.h
@@ -1,6 +1,6 @@
/**
-* @file llpanelpathfindingrebakenavmesh.h
-* @brief Header file for llpanelpathfindingrebakenavmesh
+* @file llmenuoptionpathfindingrebakenavmesh.h
+* @brief Header file for llmenuoptionpathfindingrebakenavmesh
* @author Prep@lindenlab.com
*
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
@@ -24,34 +24,22 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-#ifndef LL_LLPANELPATHFINDINGREBAKENAVMESH_H
-#define LL_LLPANELPATHFINDINGREBAKENAVMESH_H
+#ifndef LL_LLMENUOPTIONPATHFINDINGREBAKENAVMESH_H
+#define LL_LLMENUOPTIONPATHFINDINGREBAKENAVMESH_H
#include <boost/signals2.hpp>
-#include "llpanel.h"
#include "llpathfindingmanager.h"
#include "llpathfindingnavmesh.h"
+#include "llsingleton.h"
-class LLButton;
class LLPathfindingNavMeshStatus;
-class LLPanelPathfindingRebakeNavmesh : public LLPanel
+class LLMenuOptionPathfindingRebakeNavmesh : public LLSingleton<LLMenuOptionPathfindingRebakeNavmesh>
{
-
- LOG_CLASS(LLPanelPathfindingRebakeNavmesh);
+ LOG_CLASS(LLMenuOptionPathfindingRebakeNavmesh);
public:
- static LLPanelPathfindingRebakeNavmesh* getInstance();
-
- virtual BOOL postBuild();
-
- virtual void draw();
- virtual BOOL handleToolTip( S32 x, S32 y, MASK mask );
-
-protected:
-
-private:
typedef enum
{
kRebakeNavMesh_Available,
@@ -61,15 +49,21 @@ private:
kRebakeNavMesh_Default = kRebakeNavMesh_NotAvailable
} ERebakeNavMeshMode;
- LLPanelPathfindingRebakeNavmesh();
- virtual ~LLPanelPathfindingRebakeNavmesh();
+ LLMenuOptionPathfindingRebakeNavmesh();
+ virtual ~LLMenuOptionPathfindingRebakeNavmesh();
- static LLPanelPathfindingRebakeNavmesh* getPanel();
+ void initialize();
+ void quit();
- void setMode(ERebakeNavMeshMode pRebakeNavMeshMode);
+ bool canRebakeRegion() const;
ERebakeNavMeshMode getMode() const;
- void onNavMeshRebakeClick();
+ void sendRequestRebakeNavmesh();
+
+protected:
+
+private:
+ void setMode(ERebakeNavMeshMode pRebakeNavMeshMode);
void handleAgentState(BOOL pCanRebakeRegion);
void handleRebakeNavMeshResponse(bool pResponseStatus);
@@ -78,19 +72,14 @@ private:
void createNavMeshStatusListenerForCurrentRegion();
- bool doDraw() const;
- void updatePosition();
+ bool mIsInitialized;
- BOOL mCanRebakeRegion;
+ bool mCanRebakeRegion;
ERebakeNavMeshMode mRebakeNavMeshMode;
- LLButton* mNavMeshRebakeButton;
- LLButton* mNavMeshSendingButton;
- LLButton* mNavMeshBakingButton;
-
LLPathfindingNavMesh::navmesh_slot_t mNavMeshSlot;
boost::signals2::connection mRegionCrossingSlot;
LLPathfindingManager::agent_state_slot_t mAgentStateSlot;
};
-#endif // LL_LLPANELPATHFINDINGREBAKENAVMESH_H
+#endif // LL_LLMENUOPTIONPATHFINDINGREBAKENAVMESH_H
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index bc7f522848..1223615079 100755
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -204,16 +204,30 @@ class LLMeshHeaderResponder : public LLCurl::Responder
{
public:
LLVolumeParams mMeshParams;
-
+ bool mProcessed;
+
LLMeshHeaderResponder(const LLVolumeParams& mesh_params)
: mMeshParams(mesh_params)
{
- LLMeshRepoThread::sActiveHeaderRequests++;
+ LLMeshRepoThread::incActiveHeaderRequests();
+ mProcessed = false;
}
~LLMeshHeaderResponder()
{
- LLMeshRepoThread::sActiveHeaderRequests--;
+ if (!LLApp::isQuitting())
+ {
+ if (!mProcessed)
+ { //something went wrong, retry
+ llwarns << "Timeout or service unavailable, retrying." << llendl;
+ LLMeshRepository::sHTTPRetryCount++;
+ LLMeshRepoThread::HeaderRequest req(mMeshParams);
+ LLMutexLock lock(gMeshRepo.mThread->mMutex);
+ gMeshRepo.mThread->mHeaderReqQ.push(req);
+ }
+
+ LLMeshRepoThread::decActiveHeaderRequests();
+ }
}
virtual void completedRaw(U32 status, const std::string& reason,
@@ -229,16 +243,27 @@ public:
S32 mLOD;
U32 mRequestedBytes;
U32 mOffset;
+ bool mProcessed;
LLMeshLODResponder(const LLVolumeParams& mesh_params, S32 lod, U32 offset, U32 requested_bytes)
: mMeshParams(mesh_params), mLOD(lod), mOffset(offset), mRequestedBytes(requested_bytes)
{
- LLMeshRepoThread::sActiveLODRequests++;
+ LLMeshRepoThread::incActiveLODRequests();
+ mProcessed = false;
}
~LLMeshLODResponder()
{
- LLMeshRepoThread::sActiveLODRequests--;
+ if (!LLApp::isQuitting())
+ {
+ if (!mProcessed)
+ {
+ llwarns << "Killed without being processed, retrying." << llendl;
+ LLMeshRepository::sHTTPRetryCount++;
+ gMeshRepo.mThread->lockAndLoadMeshLOD(mMeshParams, mLOD);
+ }
+ LLMeshRepoThread::decActiveLODRequests();
+ }
}
virtual void completedRaw(U32 status, const std::string& reason,
@@ -253,10 +278,17 @@ public:
LLUUID mMeshID;
U32 mRequestedBytes;
U32 mOffset;
+ bool mProcessed;
LLMeshSkinInfoResponder(const LLUUID& id, U32 offset, U32 size)
: mMeshID(id), mRequestedBytes(size), mOffset(offset)
{
+ mProcessed = false;
+ }
+
+ ~LLMeshSkinInfoResponder()
+ {
+ llassert(mProcessed);
}
virtual void completedRaw(U32 status, const std::string& reason,
@@ -271,10 +303,17 @@ public:
LLUUID mMeshID;
U32 mRequestedBytes;
U32 mOffset;
+ bool mProcessed;
LLMeshDecompositionResponder(const LLUUID& id, U32 offset, U32 size)
: mMeshID(id), mRequestedBytes(size), mOffset(offset)
{
+ mProcessed = false;
+ }
+
+ ~LLMeshDecompositionResponder()
+ {
+ llassert(mProcessed);
}
virtual void completedRaw(U32 status, const std::string& reason,
@@ -289,10 +328,17 @@ public:
LLUUID mMeshID;
U32 mRequestedBytes;
U32 mOffset;
+ bool mProcessed;
LLMeshPhysicsShapeResponder(const LLUUID& id, U32 offset, U32 size)
: mMeshID(id), mRequestedBytes(size), mOffset(offset)
{
+ mProcessed = false;
+ }
+
+ ~LLMeshPhysicsShapeResponder()
+ {
+ llassert(mProcessed);
}
virtual void completedRaw(U32 status, const std::string& reason,
@@ -361,7 +407,20 @@ public:
mModelData(model_data),
mObserverHandle(observer_handle)
{
+ if (mThread)
+ {
+ mThread->startRequest();
+ }
+ }
+
+ ~LLWholeModelFeeResponder()
+ {
+ if (mThread)
+ {
+ mThread->stopRequest();
+ }
}
+
virtual void completed(U32 status,
const std::string& reason,
const LLSD& content)
@@ -372,7 +431,6 @@ public:
cc = llsd_from_file("fake_upload_error.xml");
}
- mThread->mPendingUploads--;
dump_llsd_to_file(cc,make_dump_name("whole_model_fee_response_",dump_num));
LLWholeModelFeeObserver* observer = mObserverHandle.get();
@@ -415,7 +473,20 @@ public:
mModelData(model_data),
mObserverHandle(observer_handle)
{
+ if (mThread)
+ {
+ mThread->startRequest();
+ }
}
+
+ ~LLWholeModelUploadResponder()
+ {
+ if (mThread)
+ {
+ mThread->stopRequest();
+ }
+ }
+
virtual void completed(U32 status,
const std::string& reason,
const LLSD& content)
@@ -426,7 +497,6 @@ public:
cc = llsd_from_file("fake_upload_error.xml");
}
- mThread->mPendingUploads--;
dump_llsd_to_file(cc,make_dump_name("whole_model_upload_response_",dump_num));
LLWholeModelUploadObserver* observer = mObserverHandle.get();
@@ -614,16 +684,24 @@ void LLMeshRepoThread::loadMeshPhysicsShape(const LLUUID& mesh_id)
mPhysicsShapeRequests.insert(mesh_id);
}
+void LLMeshRepoThread::lockAndLoadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
+{
+ if (!LLAppViewer::isQuitting())
+ {
+ loadMeshLOD(mesh_params, lod);
+ }
+}
+
-void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
-{ //protected by mSignal, no locking needed here
+void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
+{ //could be called from any thread
+ LLMutexLock lock(mMutex);
mesh_header_map::iterator iter = mMeshHeader.find(mesh_params.getSculptID());
if (iter != mMeshHeader.end())
{ //if we have the header, request LOD byte range
LODRequest req(mesh_params, lod);
{
- LLMutexLock lock(mMutex);
mLODReqQ.push(req);
LLMeshRepository::sLODProcessing++;
}
@@ -641,7 +719,6 @@ void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
}
else
{ //if no header request is pending, fetch header
- LLMutexLock lock(mMutex);
mHeaderReqQ.push(req);
mPendingLOD[mesh_params].push_back(lod);
}
@@ -921,6 +998,34 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
return ret;
}
+//static
+void LLMeshRepoThread::incActiveLODRequests()
+{
+ LLMutexLock lock(gMeshRepo.mThread->mMutex);
+ ++LLMeshRepoThread::sActiveLODRequests;
+}
+
+//static
+void LLMeshRepoThread::decActiveLODRequests()
+{
+ LLMutexLock lock(gMeshRepo.mThread->mMutex);
+ --LLMeshRepoThread::sActiveLODRequests;
+}
+
+//static
+void LLMeshRepoThread::incActiveHeaderRequests()
+{
+ LLMutexLock lock(gMeshRepo.mThread->mMutex);
+ ++LLMeshRepoThread::sActiveHeaderRequests;
+}
+
+//static
+void LLMeshRepoThread::decActiveHeaderRequests()
+{
+ LLMutexLock lock(gMeshRepo.mThread->mMutex);
+ --LLMeshRepoThread::sActiveHeaderRequests;
+}
+
//return false if failed to get header
bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params, U32& count)
{
@@ -1097,11 +1202,13 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat
mMeshHeader[mesh_id] = header;
}
+
+ LLMutexLock lock(mMutex); // make sure only one thread access mPendingLOD at the same time.
+
//check for pending requests
pending_lod_map::iterator iter = mPendingLOD.find(mesh_params);
if (iter != mPendingLOD.end())
{
- LLMutexLock lock(mMutex);
for (U32 i = 0; i < iter->second.size(); ++i)
{
LODRequest req(mesh_params, iter->second[i]);
@@ -1620,7 +1727,7 @@ void LLMeshUploadThread::doWholeModelUpload()
mCurlRequest->process();
//sleep for 10ms to prevent eating a whole core
apr_sleep(10000);
- } while (!LLAppViewer::isQuitting() && mCurlRequest->getQueued() > 0);
+ } while (!LLAppViewer::isQuitting() && mPendingUploads > 0);
}
delete mCurlRequest;
@@ -1642,7 +1749,6 @@ void LLMeshUploadThread::requestWholeModelFee()
wholeModelToLLSD(model_data,false);
dump_llsd_to_file(model_data,make_dump_name("whole_model_fee_request_",dump_num));
- mPendingUploads++;
LLCurlRequest::headers_t headers;
{
@@ -1659,7 +1765,7 @@ void LLMeshUploadThread::requestWholeModelFee()
mCurlRequest->process();
//sleep for 10ms to prevent eating a whole core
apr_sleep(10000);
- } while (!LLApp::isQuitting() && mCurlRequest->getQueued() > 0);
+ } while (!LLApp::isQuitting() && mPendingUploads > 0);
delete mCurlRequest;
mCurlRequest = NULL;
@@ -1796,7 +1902,14 @@ void LLMeshLODResponder::completedRaw(U32 status, const std::string& reason,
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer)
{
-
+ mProcessed = true;
+
+ // thread could have already be destroyed during logout
+ if( !gMeshRepo.mThread )
+ {
+ return;
+ }
+
S32 data_size = buffer->countAfter(channels.in(), NULL);
if (status < 200 || status > 400)
@@ -1808,11 +1921,13 @@ void LLMeshLODResponder::completedRaw(U32 status, const std::string& reason,
{
if (status == 499 || status == 503)
{ //timeout or service unavailable, try again
+ llwarns << "Timeout or service unavailable, retrying." << llendl;
LLMeshRepository::sHTTPRetryCount++;
gMeshRepo.mThread->loadMeshLOD(mMeshParams, mLOD);
}
else
{
+ llassert(status == 499 || status == 503); //intentionally trigger a breakpoint
llwarns << "Unhandled status " << status << llendl;
}
return;
@@ -1851,6 +1966,14 @@ void LLMeshSkinInfoResponder::completedRaw(U32 status, const std::string& reason
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer)
{
+ mProcessed = true;
+
+ // thread could have already be destroyed during logout
+ if( !gMeshRepo.mThread )
+ {
+ return;
+ }
+
S32 data_size = buffer->countAfter(channels.in(), NULL);
if (status < 200 || status > 400)
@@ -1862,11 +1985,13 @@ void LLMeshSkinInfoResponder::completedRaw(U32 status, const std::string& reason
{
if (status == 499 || status == 503)
{ //timeout or service unavailable, try again
+ llwarns << "Timeout or service unavailable, retrying." << llendl;
LLMeshRepository::sHTTPRetryCount++;
gMeshRepo.mThread->loadMeshSkinInfo(mMeshID);
}
else
{
+ llassert(status == 499 || status == 503); //intentionally trigger a breakpoint
llwarns << "Unhandled status " << status << llendl;
}
return;
@@ -1905,6 +2030,13 @@ void LLMeshDecompositionResponder::completedRaw(U32 status, const std::string& r
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer)
{
+ mProcessed = true;
+
+ if( !gMeshRepo.mThread )
+ {
+ return;
+ }
+
S32 data_size = buffer->countAfter(channels.in(), NULL);
if (status < 200 || status > 400)
@@ -1916,11 +2048,13 @@ void LLMeshDecompositionResponder::completedRaw(U32 status, const std::string& r
{
if (status == 499 || status == 503)
{ //timeout or service unavailable, try again
+ llwarns << "Timeout or service unavailable, retrying." << llendl;
LLMeshRepository::sHTTPRetryCount++;
gMeshRepo.mThread->loadMeshDecomposition(mMeshID);
}
else
{
+ llassert(status == 499 || status == 503); //intentionally trigger a breakpoint
llwarns << "Unhandled status " << status << llendl;
}
return;
@@ -1959,6 +2093,14 @@ void LLMeshPhysicsShapeResponder::completedRaw(U32 status, const std::string& re
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer)
{
+ mProcessed = true;
+
+ // thread could have already be destroyed during logout
+ if( !gMeshRepo.mThread )
+ {
+ return;
+ }
+
S32 data_size = buffer->countAfter(channels.in(), NULL);
if (status < 200 || status > 400)
@@ -1970,11 +2112,13 @@ void LLMeshPhysicsShapeResponder::completedRaw(U32 status, const std::string& re
{
if (status == 499 || status == 503)
{ //timeout or service unavailable, try again
+ llwarns << "Timeout or service unavailable, retrying." << llendl;
LLMeshRepository::sHTTPRetryCount++;
gMeshRepo.mThread->loadMeshPhysicsShape(mMeshID);
}
else
{
+ llassert(status == 499 || status == 503); //intentionally trigger a breakpoint
llwarns << "Unhandled status " << status << llendl;
}
return;
@@ -2013,6 +2157,14 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer)
{
+ mProcessed = true;
+
+ // thread could have already be destroyed during logout
+ if( !gMeshRepo.mThread )
+ {
+ return;
+ }
+
if (status < 200 || status > 400)
{
//llwarns
@@ -2025,8 +2177,12 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,
// TODO*: Add maximum retry logic, exponential backoff
// and (somewhat more optional than the others) retries
// again after some set period of time
+
+ llassert(status == 503 || status == 499);
+
if (status == 503 || status == 499)
{ //retry
+ llwarns << "Timeout or service unavailable, retrying." << llendl;
LLMeshRepository::sHTTPRetryCount++;
LLMeshRepoThread::HeaderRequest req(mMeshParams);
LLMutexLock lock(gMeshRepo.mThread->mMutex);
@@ -2034,6 +2190,10 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,
return;
}
+ else
+ {
+ llwarns << "Unhandled status." << llendl;
+ }
}
S32 data_size = buffer->countAfter(channels.in(), NULL);
@@ -2048,7 +2208,11 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,
LLMeshRepository::sBytesReceived += llmin(data_size, 4096);
- if (!gMeshRepo.mThread->headerReceived(mMeshParams, data, data_size))
+ bool success = gMeshRepo.mThread->headerReceived(mMeshParams, data, data_size);
+
+ llassert(success);
+
+ if (!success)
{
llwarns
<< "Unable to parse mesh header: "
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index da81bb057b..8602271f84 100644
--- a/indra/newview/llmeshrepository.h
+++ b/indra/newview/llmeshrepository.h
@@ -322,7 +322,9 @@ public:
virtual void run();
+ void lockAndLoadMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
void loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
+
bool fetchMeshHeader(const LLVolumeParams& mesh_params, U32& count);
bool fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, U32& count);
bool headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size);
@@ -351,6 +353,10 @@ public:
// (should hold onto mesh_id and try again later if header info does not exist)
bool fetchMeshPhysicsShape(const LLUUID& mesh_id);
+ static void incActiveLODRequests();
+ static void decActiveLODRequests();
+ static void incActiveHeaderRequests();
+ static void decActiveHeaderRequests();
};
@@ -405,6 +411,9 @@ public:
LLHandle<LLWholeModelFeeObserver> fee_observer= (LLHandle<LLWholeModelFeeObserver>()), LLHandle<LLWholeModelUploadObserver> upload_observer = (LLHandle<LLWholeModelUploadObserver>()));
~LLMeshUploadThread();
+ void startRequest() { ++mPendingUploads; }
+ void stopRequest() { --mPendingUploads; }
+
bool finished() { return mFinished; }
virtual void run();
void preStart();
diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index 93f7146fc8..eb6591eb39 100644
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -698,19 +698,28 @@ void LLPanelStandStopFlying::updatePosition()
S32 y_pos = 0;
S32 bottom_tb_center = 0;
- if (LLToolBar* toolbar_bottom = gToolBarView->getChild<LLToolBar>("toolbar_bottom"))
+ if (LLToolBar* toolbar_bottom = gToolBarView->getToolbar(LLToolBarView::TOOLBAR_BOTTOM))
{
y_pos = toolbar_bottom->getRect().getHeight();
bottom_tb_center = toolbar_bottom->getRect().getCenterX();
}
S32 left_tb_width = 0;
- if (LLToolBar* toolbar_left = gToolBarView->getChild<LLToolBar>("toolbar_left"))
+ if (LLToolBar* toolbar_left = gToolBarView->getToolbar(LLToolBarView::TOOLBAR_LEFT))
{
left_tb_width = toolbar_left->getRect().getWidth();
}
- if(LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("state_management_buttons_container"))
+ if (!mStateManagementButtons.get())
+ {
+ LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("state_management_buttons_container");
+ if (panel_ssf_container)
+ {
+ mStateManagementButtons = panel_ssf_container->getHandle();
+ }
+ }
+
+ if(LLPanel* panel_ssf_container = mStateManagementButtons.get())
{
panel_ssf_container->setOrigin(0, y_pos);
}
diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h
index 744dd866d4..c525d9dfdb 100644
--- a/indra/newview/llmoveview.h
+++ b/indra/newview/llmoveview.h
@@ -172,6 +172,8 @@ private:
*/
LLHandle<LLPanel> mOriginalParent;
+ LLHandle<LLPanel> mStateManagementButtons;
+
/**
* True if the panel is currently attached to the movement controls floater.
*
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 472c26e22d..7f396b7b7e 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -64,11 +64,12 @@ LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p)
mNameColumnIndex(p.name_column.column_index),
mNameColumn(p.name_column.column_name),
mAllowCallingCardDrop(p.allow_calling_card_drop),
- mShortNames(p.short_names)
+ mShortNames(p.short_names),
+ mAvatarNameCacheConnection()
{}
// public
-void LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos,
+LLScrollListItem* LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos,
BOOL enabled, const std::string& suffix)
{
//llinfos << "LLNameListCtrl::addNameItem " << agent_id << llendl;
@@ -78,7 +79,7 @@ void LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos,
item.enabled = enabled;
item.target = INDIVIDUAL;
- addNameItemRow(item, pos, suffix);
+ return addNameItemRow(item, pos, suffix);
}
// virtual, public
@@ -204,7 +205,7 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
{
BOOL handled = FALSE;
S32 column_index = getColumnIndexFromOffset(x);
- LLScrollListItem* hit_item = hitItem(x, y);
+ LLNameListItem* hit_item = dynamic_cast<LLNameListItem*>(hitItem(x, y));
if (hit_item
&& column_index == mNameColumnIndex)
{
@@ -228,7 +229,7 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
LLCoordGL pos( sticky_rect.mRight - info_icon_size, sticky_rect.mTop - (sticky_rect.getHeight() - icon->getHeight())/2 );
// Should we show a group or an avatar inspector?
- bool is_group = hit_item->getValue()["is_group"].asBoolean();
+ bool is_group = hit_item->isGroup();
LLToolTip::Params params;
params.background_visible( false );
@@ -271,10 +272,10 @@ void LLNameListCtrl::addGroupNameItem(LLNameListCtrl::NameItem& item, EAddPositi
addNameItemRow(item, pos);
}
-void LLNameListCtrl::addNameItem(LLNameListCtrl::NameItem& item, EAddPosition pos)
+LLScrollListItem* LLNameListCtrl::addNameItem(LLNameListCtrl::NameItem& item, EAddPosition pos)
{
item.target = INDIVIDUAL;
- addNameItemRow(item, pos);
+ return addNameItemRow(item, pos);
}
LLScrollListItem* LLNameListCtrl::addElement(const LLSD& element, EAddPosition pos, void* userdata)
@@ -293,19 +294,12 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(
const std::string& suffix)
{
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);
- }
+ LLNameListItem* item = new LLNameListItem(name_item,name_item.target() == GROUP);
if (!item) return NULL;
+ LLScrollListCtrl::addRow(item, name_item, pos);
+
// use supplied name by default
std::string fullname = name_item.name;
switch(name_item.target)
@@ -327,16 +321,20 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(
else if (LLAvatarNameCache::get(id, &av_name))
{
if (mShortNames)
- fullname = av_name.mDisplayName;
+ fullname = av_name.getDisplayName();
else
fullname = av_name.getCompleteName();
}
else
{
// ...schedule a callback
- LLAvatarNameCache::get(id,
- boost::bind(&LLNameListCtrl::onAvatarNameCache,
- this, _1, _2, item->getHandle()));
+ // This is not correct and will likely lead to partially populated lists in cases where avatar names are not cached.
+ // *TODO : Change this to have 2 callbacks : one callback per list item and one for the whole list.
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+ mAvatarNameCacheConnection = LLAvatarNameCache::get(id,boost::bind(&LLNameListCtrl::onAvatarNameCache,this, _1, _2, item->getHandle()));
}
break;
}
@@ -395,9 +393,11 @@ void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id,
const LLAvatarName& av_name,
LLHandle<LLNameListItem> item)
{
+ mAvatarNameCacheConnection.disconnect();
+
std::string name;
if (mShortNames)
- name = av_name.mDisplayName;
+ name = av_name.getDisplayName();
else
name = av_name.getCompleteName();
@@ -411,7 +411,7 @@ void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id,
setNeedsSort();
}
}
-
+
dirtyColumns();
}
diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h
index ba85e77c65..271802d48a 100644
--- a/indra/newview/llnamelistctrl.h
+++ b/indra/newview/llnamelistctrl.h
@@ -42,14 +42,24 @@ class LLAvatarName;
class LLNameListItem : public LLScrollListItem, public LLHandleProvider<LLNameListItem>
{
public:
- LLUUID getUUID() const { return getValue()["uuid"].asUUID(); }
+ bool isGroup() const { return mIsGroup; }
+ void setIsGroup(bool is_group) { mIsGroup = is_group; }
+
protected:
friend class LLNameListCtrl;
LLNameListItem( const LLScrollListItem::Params& p )
- : LLScrollListItem(p)
+ : LLScrollListItem(p), mIsGroup(false)
+ {
+ }
+
+ LLNameListItem( const LLScrollListItem::Params& p, bool is_group )
+ : LLScrollListItem(p), mIsGroup(is_group)
{
}
+
+private:
+ bool mIsGroup;
};
@@ -101,13 +111,20 @@ public:
protected:
LLNameListCtrl(const Params&);
+ virtual ~LLNameListCtrl()
+ {
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+ }
friend class LLUICtrlFactory;
public:
// Add a user to the list by name. It will be added, the name
// requested from the cache, and updated as necessary.
- void addNameItem(const LLUUID& agent_id, EAddPosition pos = ADD_BOTTOM,
+ LLScrollListItem* addNameItem(const LLUUID& agent_id, EAddPosition pos = ADD_BOTTOM,
BOOL enabled = TRUE, const std::string& suffix = LLStringUtil::null);
- void addNameItem(NameItem& item, EAddPosition pos = ADD_BOTTOM);
+ LLScrollListItem* 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, const std::string& suffix = LLStringUtil::null);
@@ -144,6 +161,7 @@ private:
std::string mNameColumn;
BOOL mAllowCallingCardDrop;
bool mShortNames; // display name only, no SLID
+ boost::signals2::connection mAvatarNameCacheConnection;
};
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
deleted file mode 100644
index a7303ad035..0000000000
--- a/indra/newview/llnearbychat.cpp
+++ /dev/null
@@ -1,338 +0,0 @@
-/**
- * @file LLNearbyChat.cpp
- * @brief Nearby chat history scrolling panel implementation
- *
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llnearbychat.h"
-#include "llviewercontrol.h"
-#include "llviewerwindow.h"
-#include "llrootview.h"
-//#include "llchatitemscontainerctrl.h"
-#include "lliconctrl.h"
-#include "llfloatersidepanelcontainer.h"
-#include "llfocusmgr.h"
-#include "lllogchat.h"
-#include "llresizebar.h"
-#include "llresizehandle.h"
-#include "llmenugl.h"
-#include "llviewermenu.h"//for gMenuHolder
-
-#include "llnearbychathandler.h"
-#include "llchannelmanager.h"
-
-#include "llagent.h" // gAgent
-#include "llchathistory.h"
-#include "llstylemap.h"
-
-#include "llavatarnamecache.h"
-
-#include "lldraghandle.h"
-
-#include "llnearbychatbar.h"
-#include "llfloaterreg.h"
-#include "lltrans.h"
-
-static const S32 RESIZE_BAR_THICKNESS = 3;
-
-
-static LLRegisterPanelClassWrapper<LLNearbyChat> t_panel_nearby_chat("panel_nearby_chat");
-
-LLNearbyChat::LLNearbyChat(const LLNearbyChat::Params& p)
-: LLPanel(p),
- mChatHistory(NULL)
-{
-}
-
-BOOL LLNearbyChat::postBuild()
-{
- //menu
- LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
- LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
-
- enable_registrar.add("NearbyChat.Check", boost::bind(&LLNearbyChat::onNearbyChatCheckContextMenuItem, this, _2));
- registrar.add("NearbyChat.Action", boost::bind(&LLNearbyChat::onNearbyChatContextMenuItemClicked, this, _2));
-
-
- LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_nearby_chat.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- if(menu)
- mPopupMenuHandle = menu->getHandle();
-
- gSavedSettings.declareS32("nearbychat_showicons_and_names",2,"NearByChat header settings",true);
-
- mChatHistory = getChild<LLChatHistory>("chat_history");
-
- if(!LLPanel::postBuild())
- return false;
-
- return true;
-}
-
-std::string appendTime()
-{
- time_t utc_time;
- utc_time = time_corrected();
- std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
- +LLTrans::getString("TimeMin")+"]";
-
- LLSD substitution;
-
- substitution["datetime"] = (S32) utc_time;
- LLStringUtil::format (timeStr, substitution);
-
- return timeStr;
-}
-
-
-void LLNearbyChat::addMessage(const LLChat& chat,bool archive,const LLSD &args)
-{
- 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");
-
- if (!chat.mMuted)
- {
- 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("LogNearbyChat"))
- {
- std::string from_name = chat.mFromName;
-
- if (chat.mSourceType == CHAT_SOURCE_AGENT)
- {
- // if the chat is coming from an agent, log the complete name
- LLAvatarName av_name;
- LLAvatarNameCache::get(chat.mFromID, &av_name);
-
- if (!av_name.mIsDisplayNameDefault)
- {
- from_name = av_name.getCompleteName();
- }
- }
-
- LLLogChat::saveHistory("chat", from_name, chat.mFromID, chat.mText);
- }
-}
-
-void LLNearbyChat::onNearbySpeakers()
-{
- LLSD param;
- param["people_panel_tab_name"] = "nearby_panel";
- LLFloaterSidePanelContainer::showPanel("people", "panel_people", param);
-}
-
-
-void LLNearbyChat::onNearbyChatContextMenuItemClicked(const LLSD& userdata)
-{
-}
-bool LLNearbyChat::onNearbyChatCheckContextMenuItem(const LLSD& userdata)
-{
- std::string str = userdata.asString();
- if(str == "nearby_people")
- onNearbySpeakers();
- return false;
-}
-
-void LLNearbyChat::removeScreenChat()
-{
- LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID")));
- if(chat_channel)
- {
- chat_channel->removeToastsFromChannel();
- }
-}
-
-void LLNearbyChat::setVisible(BOOL visible)
-{
- if(visible)
- {
- removeScreenChat();
- }
-
- LLPanel::setVisible(visible);
-}
-
-
-void LLNearbyChat::getAllowedRect(LLRect& rect)
-{
- rect = gViewerWindow->getWorldViewRectScaled();
-}
-
-void LLNearbyChat::updateChatHistoryStyle()
-{
- mChatHistory->clear();
-
- LLSD do_not_log;
- do_not_log["do_not_log"] = true;
- for(std::vector<LLChat>::iterator it = mMessageArchive.begin();it!=mMessageArchive.end();++it)
- {
- // Update the messages without re-writing them to a log file.
- addMessage(*it,false, do_not_log);
- }
-}
-
-//static
-void LLNearbyChat::processChatHistoryStyleUpdate(const LLSD& newvalue)
-{
- LLFloater* chat_bar = LLFloaterReg::getInstance("chat_bar");
- LLNearbyChat* nearby_chat = chat_bar->findChild<LLNearbyChat>("nearby_chat");
- if(nearby_chat)
- nearby_chat->updateChatHistoryStyle();
-}
-
-bool isWordsName(const std::string& name)
-{
- // checking to see if it's display name plus username in parentheses
- S32 open_paren = name.find(" (", 0);
- S32 close_paren = name.find(')', 0);
-
- if (open_paren != std::string::npos &&
- close_paren == name.length()-1)
- {
- return true;
- }
- else
- {
- //checking for a single space
- S32 pos = name.find(' ', 0);
- return std::string::npos != pos && name.rfind(' ', name.length()) == pos && 0 != pos && name.length()-1 != pos;
- }
-}
-
-void LLNearbyChat::loadHistory()
-{
- LLSD do_not_log;
- 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;
- if (msg[IM_FROM_ID].isDefined())
- {
- from_id = msg[IM_FROM_ID].asUUID();
- }
- else
- {
- std::string legacy_name = gCacheName->buildLegacyName(from);
- gCacheName->getUUID(legacy_name, 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;
-
- chat.mSourceType = CHAT_SOURCE_AGENT;
- if (from_id.isNull() && SYSTEM_FROM == from)
- {
- chat.mSourceType = CHAT_SOURCE_SYSTEM;
-
- }
- else if (from_id.isNull())
- {
- chat.mSourceType = isWordsName(from) ? CHAT_SOURCE_UNKNOWN : CHAT_SOURCE_OBJECT;
- }
-
- addMessage(chat, true, do_not_log);
-
- it++;
- }
-}
-
-//static
-LLNearbyChat* LLNearbyChat::getInstance()
-{
- LLFloater* chat_bar = LLFloaterReg::getInstance("chat_bar");
- return chat_bar->findChild<LLNearbyChat>("nearby_chat");
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLNearbyChat::onFocusReceived()
-{
- setBackgroundOpaque(true);
- LLPanel::onFocusReceived();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLNearbyChat::onFocusLost()
-{
- setBackgroundOpaque(false);
- LLPanel::onFocusLost();
-}
-
-BOOL LLNearbyChat::handleMouseDown(S32 x, S32 y, MASK mask)
-{
- //fix for EXT-6625
- //highlight NearbyChat history whenever mouseclick happen in NearbyChat
- //setting focus to eidtor will force onFocusLost() call that in its turn will change
- //background opaque. This all happenn since NearByChat is "chrome" and didn't process focus change.
-
- if(mChatHistory)
- mChatHistory->setFocus(TRUE);
- return LLPanel::handleMouseDown(x, y, mask);
-}
-
-void LLNearbyChat::draw()
-{
- // *HACK: Update transparency type depending on whether our children have focus.
- // This is needed because this floater is chrome and thus cannot accept focus, so
- // the transparency type setting code from LLFloater::setFocus() isn't reached.
- if (getTransparencyType() != TT_DEFAULT)
- {
- setTransparencyType(hasFocus() ? TT_ACTIVE : TT_INACTIVE);
- }
-
- LLPanel::draw();
-}
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
deleted file mode 100644
index 7c5975cbc5..0000000000
--- a/indra/newview/llnearbychat.h
+++ /dev/null
@@ -1,83 +0,0 @@
- /**
- * @file llnearbychat.h
- * @brief nearby chat history scrolling panel implementation
- *
- * $LicenseInfo:firstyear=2004&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLNEARBYCHAT_H_
-#define LL_LLNEARBYCHAT_H_
-
-#include "llscrollbar.h"
-#include "llviewerchat.h"
-#include "llfloater.h"
-
-class LLResizeBar;
-class LLChatHistory;
-
-class LLNearbyChat: public LLPanel
-{
-public:
- LLNearbyChat(const Params& p = LLPanel::getDefaultParams());
-
- BOOL postBuild ();
-
- /** @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);
-
- virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
- virtual void draw();
-
- // focus overrides
- /*virtual*/ void onFocusLost();
- /*virtual*/ void onFocusReceived();
-
- /*virtual*/ void setVisible(BOOL visible);
-
- virtual void updateChatHistoryStyle();
-
- static void processChatHistoryStyleUpdate(const LLSD& newvalue);
-
- void loadHistory();
-
- static LLNearbyChat* getInstance();
- void removeScreenChat();
-
-private:
-
- void getAllowedRect (LLRect& rect);
-
- void onNearbySpeakers ();
-
-
-private:
- LLHandle<LLView> mPopupMenuHandle;
- LLChatHistory* mChatHistory;
-
- std::vector<LLChat> mMessageArchive;
-};
-
-#endif
-
-
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
deleted file mode 100644
index f8f0f7d243..0000000000
--- a/indra/newview/llnearbychatbar.cpp
+++ /dev/null
@@ -1,680 +0,0 @@
-/**
- * @file llnearbychatbar.cpp
- * @brief LLNearbyChatBar class implementation
- *
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "message.h"
-
-#include "llappviewer.h"
-#include "llfloaterreg.h"
-#include "lltrans.h"
-
-#include "llfirstuse.h"
-#include "llnearbychatbar.h"
-#include "llnearbychatbarlistener.h"
-#include "llagent.h"
-#include "llgesturemgr.h"
-#include "llmultigesture.h"
-#include "llkeyboard.h"
-#include "llanimationstates.h"
-#include "llviewerstats.h"
-#include "llcommandhandler.h"
-#include "llviewercontrol.h"
-#include "llnavigationbar.h"
-#include "llwindow.h"
-#include "llviewerwindow.h"
-#include "llrootview.h"
-#include "llviewerchat.h"
-#include "llnearbychat.h"
-#include "lltranslate.h"
-
-#include "llresizehandle.h"
-#include "llautoreplace.h"
-
-S32 LLNearbyChatBar::sLastSpecialChatChannel = 0;
-
-const S32 EXPANDED_HEIGHT = 300;
-const S32 COLLAPSED_HEIGHT = 60;
-const S32 EXPANDED_MIN_HEIGHT = 150;
-
-// legacy callback glue
-void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel);
-
-struct LLChatTypeTrigger {
- std::string name;
- EChatType type;
-};
-
-static LLChatTypeTrigger sChatTypeTriggers[] = {
- { "/whisper" , CHAT_TYPE_WHISPER},
- { "/shout" , CHAT_TYPE_SHOUT}
-};
-
-LLNearbyChatBar::LLNearbyChatBar(const LLSD& key)
-: LLFloater(key),
- mChatBox(NULL),
- mNearbyChat(NULL),
- mOutputMonitor(NULL),
- mSpeakerMgr(NULL),
- mExpandedHeight(COLLAPSED_HEIGHT + EXPANDED_HEIGHT)
-{
- mSpeakerMgr = LLLocalSpeakerMgr::getInstance();
- mListener.reset(new LLNearbyChatBarListener(*this));
-}
-
-//virtual
-BOOL LLNearbyChatBar::postBuild()
-{
- mChatBox = getChild<LLLineEditor>("chat_box");
-
- mChatBox->setAutoreplaceCallback(boost::bind(&LLAutoReplace::autoreplaceCallback, LLAutoReplace::getInstance(), _1, _2));
- mChatBox->setCommitCallback(boost::bind(&LLNearbyChatBar::onChatBoxCommit, this));
- mChatBox->setKeystrokeCallback(&onChatBoxKeystroke, this);
- mChatBox->setFocusLostCallback(boost::bind(&onChatBoxFocusLost, _1, this));
- mChatBox->setFocusReceivedCallback(boost::bind(&LLNearbyChatBar::onChatBoxFocusReceived, this));
-
- mChatBox->setIgnoreArrowKeys( FALSE );
- mChatBox->setCommitOnFocusLost( FALSE );
- mChatBox->setRevertOnEsc( FALSE );
- mChatBox->setIgnoreTab(TRUE);
- mChatBox->setPassDelete(TRUE);
- mChatBox->setReplaceNewlinesWithSpaces(FALSE);
- mChatBox->setEnableLineHistory(TRUE);
- mChatBox->setFont(LLViewerChat::getChatFont());
-
- mNearbyChat = getChildView("nearby_chat");
-
- gSavedSettings.declareBOOL("nearbychat_history_visibility", mNearbyChat->getVisible(), "Visibility state of nearby chat history", TRUE);
- BOOL show_nearby_chat = gSavedSettings.getBOOL("nearbychat_history_visibility");
-
- LLButton* show_btn = getChild<LLButton>("show_nearby_chat");
- show_btn->setCommitCallback(boost::bind(&LLNearbyChatBar::onToggleNearbyChatPanel, this));
- show_btn->setToggleState(show_nearby_chat);
-
- mOutputMonitor = getChild<LLOutputMonitorCtrl>("chat_zone_indicator");
- mOutputMonitor->setVisible(FALSE);
-
- showNearbyChatPanel(show_nearby_chat);
-
- // Register for font change notifications
- LLViewerChat::setFontChangedCallback(boost::bind(&LLNearbyChatBar::onChatFontChange, this, _1));
-
- enableResizeCtrls(true, true, false);
-
- return TRUE;
-}
-
-// virtual
-void LLNearbyChatBar::onOpen(const LLSD& key)
-{
- showTranslationCheckbox(LLTranslate::isTranslationConfigured());
-}
-
-bool LLNearbyChatBar::applyRectControl()
-{
- bool rect_controlled = LLFloater::applyRectControl();
-
- if (!mNearbyChat->getVisible())
- {
- reshape(getRect().getWidth(), getMinHeight());
- enableResizeCtrls(true, true, false);
- }
- else
- {
- enableResizeCtrls(true);
- setResizeLimits(getMinWidth(), EXPANDED_MIN_HEIGHT);
- }
-
- return rect_controlled;
-}
-
-void LLNearbyChatBar::onChatFontChange(LLFontGL* fontp)
-{
- // Update things with the new font whohoo
- if (mChatBox)
- {
- mChatBox->setFont(fontp);
- }
-}
-
-//static
-LLNearbyChatBar* LLNearbyChatBar::getInstance()
-{
- return LLFloaterReg::getTypedInstance<LLNearbyChatBar>("chat_bar");
-}
-
-void LLNearbyChatBar::showHistory()
-{
- openFloater();
-
- if (!getChildView("nearby_chat")->getVisible())
- {
- onToggleNearbyChatPanel();
- }
-}
-
-void LLNearbyChatBar::showTranslationCheckbox(BOOL show)
-{
- getChild<LLUICtrl>("translate_chat_checkbox_lp")->setVisible(show);
-}
-
-void LLNearbyChatBar::draw()
-{
- displaySpeakingIndicator();
- LLFloater::draw();
-}
-
-std::string LLNearbyChatBar::getCurrentChat()
-{
- return mChatBox ? mChatBox->getText() : LLStringUtil::null;
-}
-
-// virtual
-BOOL LLNearbyChatBar::handleKeyHere( KEY key, MASK mask )
-{
- BOOL handled = FALSE;
-
- if( KEY_RETURN == key && mask == MASK_CONTROL)
- {
- // shout
- sendChat(CHAT_TYPE_SHOUT);
- handled = TRUE;
- }
-
- return handled;
-}
-
-BOOL LLNearbyChatBar::matchChatTypeTrigger(const std::string& in_str, std::string* out_str)
-{
- U32 in_len = in_str.length();
- S32 cnt = sizeof(sChatTypeTriggers) / sizeof(*sChatTypeTriggers);
-
- for (S32 n = 0; n < cnt; n++)
- {
- if (in_len > sChatTypeTriggers[n].name.length())
- continue;
-
- std::string trigger_trunc = sChatTypeTriggers[n].name;
- LLStringUtil::truncate(trigger_trunc, in_len);
-
- if (!LLStringUtil::compareInsensitive(in_str, trigger_trunc))
- {
- *out_str = sChatTypeTriggers[n].name;
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-void LLNearbyChatBar::onChatBoxKeystroke(LLLineEditor* caller, void* userdata)
-{
- LLFirstUse::otherAvatarChatFirst(false);
-
- LLNearbyChatBar* self = (LLNearbyChatBar *)userdata;
-
- LLWString raw_text = self->mChatBox->getWText();
-
- // Can't trim the end, because that will cause autocompletion
- // to eat trailing spaces that might be part of a gesture.
- LLWStringUtil::trimHead(raw_text);
-
- S32 length = raw_text.length();
-
- if( (length > 0) && (raw_text[0] != '/') ) // forward slash is used for escape (eg. emote) sequences
- {
- gAgent.startTyping();
- }
- else
- {
- gAgent.stopTyping();
- }
-
- /* Doesn't work -- can't tell the difference between a backspace
- that killed the selection vs. backspace at the end of line.
- if (length > 1
- && text[0] == '/'
- && key == KEY_BACKSPACE)
- {
- // the selection will already be deleted, but we need to trim
- // off the character before
- std::string new_text = raw_text.substr(0, length-1);
- self->mInputEditor->setText( new_text );
- self->mInputEditor->setCursorToEnd();
- length = length - 1;
- }
- */
-
- KEY key = gKeyboard->currentKey();
-
- // Ignore "special" keys, like backspace, arrows, etc.
- if (length > 1
- && raw_text[0] == '/'
- && key < KEY_SPECIAL)
- {
- // we're starting a gesture, attempt to autocomplete
-
- std::string utf8_trigger = wstring_to_utf8str(raw_text);
- std::string utf8_out_str(utf8_trigger);
-
- if (LLGestureMgr::instance().matchPrefix(utf8_trigger, &utf8_out_str))
- {
- std::string rest_of_match = utf8_out_str.substr(utf8_trigger.size());
- self->mChatBox->setText(utf8_trigger + rest_of_match); // keep original capitalization for user-entered part
- S32 outlength = self->mChatBox->getLength(); // in characters
-
- // Select to end of line, starting from the character
- // after the last one the user typed.
- self->mChatBox->setSelection(length, outlength);
- }
- else if (matchChatTypeTrigger(utf8_trigger, &utf8_out_str))
- {
- std::string rest_of_match = utf8_out_str.substr(utf8_trigger.size());
- self->mChatBox->setText(utf8_trigger + rest_of_match + " "); // keep original capitalization for user-entered part
- self->mChatBox->setCursorToEnd();
- }
-
- //llinfos << "GESTUREDEBUG " << trigger
- // << " len " << length
- // << " outlen " << out_str.getLength()
- // << llendl;
- }
-}
-
-// static
-void LLNearbyChatBar::onChatBoxFocusLost(LLFocusableElement* caller, void* userdata)
-{
- // stop typing animation
- gAgent.stopTyping();
-}
-
-void LLNearbyChatBar::onChatBoxFocusReceived()
-{
- mChatBox->setEnabled(!gDisconnected);
-}
-
-EChatType LLNearbyChatBar::processChatTypeTriggers(EChatType type, std::string &str)
-{
- U32 length = str.length();
- S32 cnt = sizeof(sChatTypeTriggers) / sizeof(*sChatTypeTriggers);
-
- for (S32 n = 0; n < cnt; n++)
- {
- if (length >= sChatTypeTriggers[n].name.length())
- {
- std::string trigger = str.substr(0, sChatTypeTriggers[n].name.length());
-
- if (!LLStringUtil::compareInsensitive(trigger, sChatTypeTriggers[n].name))
- {
- U32 trigger_length = sChatTypeTriggers[n].name.length();
-
- // It's to remove space after trigger name
- if (length > trigger_length && str[trigger_length] == ' ')
- trigger_length++;
-
- str = str.substr(trigger_length, length);
-
- if (CHAT_TYPE_NORMAL == type)
- return sChatTypeTriggers[n].type;
- else
- break;
- }
- }
- }
-
- return type;
-}
-
-void LLNearbyChatBar::sendChat( EChatType type )
-{
- if (mChatBox)
- {
- LLWString text = mChatBox->getConvertedText();
- if (!text.empty())
- {
- // store sent line in history, duplicates will get filtered
- mChatBox->updateHistory();
- // Check if this is destined for another channel
- S32 channel = 0;
- stripChannelNumber(text, &channel);
-
- std::string utf8text = wstring_to_utf8str(text);
- // Try to trigger a gesture, if not chat to a script.
- std::string utf8_revised_text;
- if (0 == channel)
- {
- // discard returned "found" boolean
- LLGestureMgr::instance().triggerAndReviseString(utf8text, &utf8_revised_text);
- }
- else
- {
- utf8_revised_text = utf8text;
- }
-
- utf8_revised_text = utf8str_trim(utf8_revised_text);
-
- type = processChatTypeTriggers(type, utf8_revised_text);
-
- if (!utf8_revised_text.empty())
- {
- // Chat with animation
- sendChatFromViewer(utf8_revised_text, type, TRUE);
- }
- }
-
- mChatBox->setText(LLStringExplicit(""));
- }
-
- gAgent.stopTyping();
-
- // If the user wants to stop chatting on hitting return, lose focus
- // and go out of chat mode.
- if (gSavedSettings.getBOOL("CloseChatOnReturn"))
- {
- stopChat();
- }
-}
-
-void LLNearbyChatBar::showNearbyChatPanel(bool show)
-{
- if (!show)
- {
- if (mNearbyChat->getVisible() && !isMinimized())
- {
- mExpandedHeight = getRect().getHeight();
- }
- setResizeLimits(getMinWidth(), COLLAPSED_HEIGHT);
- mNearbyChat->setVisible(FALSE);
- reshape(getRect().getWidth(), COLLAPSED_HEIGHT);
- enableResizeCtrls(true, true, false);
- storeRectControl();
- }
- else
- {
- mNearbyChat->setVisible(TRUE);
- setResizeLimits(getMinWidth(), EXPANDED_MIN_HEIGHT);
- reshape(getRect().getWidth(), mExpandedHeight);
- enableResizeCtrls(true);
- storeRectControl();
- }
-
- gSavedSettings.setBOOL("nearbychat_history_visibility", mNearbyChat->getVisible());
-}
-
-void LLNearbyChatBar::onToggleNearbyChatPanel()
-{
- showNearbyChatPanel(!mNearbyChat->getVisible());
-}
-
-void LLNearbyChatBar::setMinimized(BOOL b)
-{
- LLNearbyChat* nearby_chat = getChild<LLNearbyChat>("nearby_chat");
- // when unminimizing with nearby chat visible, go ahead and kill off screen chats
- if (!b && nearby_chat->getVisible())
- {
- nearby_chat->removeScreenChat();
- }
- LLFloater::setMinimized(b);
-}
-
-void LLNearbyChatBar::onChatBoxCommit()
-{
- if (mChatBox->getText().length() > 0)
- {
- sendChat(CHAT_TYPE_NORMAL);
- }
-
- gAgent.stopTyping();
-}
-
-void LLNearbyChatBar::displaySpeakingIndicator()
-{
- LLSpeakerMgr::speaker_list_t speaker_list;
- LLUUID id;
-
- id.setNull();
- mSpeakerMgr->update(TRUE);
- mSpeakerMgr->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)
- {
- id = s->mID;
- break;
- }
- }
-
- if (!id.isNull())
- {
- mOutputMonitor->setVisible(TRUE);
- mOutputMonitor->setSpeakerId(id);
- }
- else
- {
- mOutputMonitor->setVisible(FALSE);
- }
-}
-
-void LLNearbyChatBar::sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate)
-{
- sendChatFromViewer(utf8str_to_wstring(utf8text), type, animate);
-}
-
-void LLNearbyChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate)
-{
- // Look for "/20 foo" channel chats.
- S32 channel = 0;
- LLWString out_text = stripChannelNumber(wtext, &channel);
- std::string utf8_out_text = wstring_to_utf8str(out_text);
- std::string utf8_text = wstring_to_utf8str(wtext);
-
- utf8_text = utf8str_trim(utf8_text);
- if (!utf8_text.empty())
- {
- utf8_text = utf8str_truncate(utf8_text, MAX_STRING - 1);
- }
-
- // Don't animate for chats people can't hear (chat to scripts)
- if (animate && (channel == 0))
- {
- if (type == CHAT_TYPE_WHISPER)
- {
- lldebugs << "You whisper " << utf8_text << llendl;
- gAgent.sendAnimationRequest(ANIM_AGENT_WHISPER, ANIM_REQUEST_START);
- }
- else if (type == CHAT_TYPE_NORMAL)
- {
- lldebugs << "You say " << utf8_text << llendl;
- gAgent.sendAnimationRequest(ANIM_AGENT_TALK, ANIM_REQUEST_START);
- }
- else if (type == CHAT_TYPE_SHOUT)
- {
- lldebugs << "You shout " << utf8_text << llendl;
- gAgent.sendAnimationRequest(ANIM_AGENT_SHOUT, ANIM_REQUEST_START);
- }
- else
- {
- llinfos << "send_chat_from_viewer() - invalid volume" << llendl;
- return;
- }
- }
- else
- {
- if (type != CHAT_TYPE_START && type != CHAT_TYPE_STOP)
- {
- lldebugs << "Channel chat: " << utf8_text << llendl;
- }
- }
-
- send_chat_from_viewer(utf8_out_text, type, channel);
-}
-
-// static
-void LLNearbyChatBar::startChat(const char* line)
-{
- LLNearbyChatBar* cb = LLNearbyChatBar::getInstance();
-
- if (!cb )
- return;
-
- cb->setVisible(TRUE);
- cb->setFocus(TRUE);
- cb->mChatBox->setFocus(TRUE);
-
- if (line)
- {
- std::string line_string(line);
- cb->mChatBox->setText(line_string);
- }
-
- cb->mChatBox->setCursorToEnd();
-}
-
-// Exit "chat mode" and do the appropriate focus changes
-// static
-void LLNearbyChatBar::stopChat()
-{
- LLNearbyChatBar* cb = LLNearbyChatBar::getInstance();
-
- if (!cb)
- return;
-
- cb->mChatBox->setFocus(FALSE);
-
- // stop typing animation
- gAgent.stopTyping();
-}
-
-// If input of the form "/20foo" or "/20 foo", returns "foo" and channel 20.
-// Otherwise returns input and channel 0.
-LLWString LLNearbyChatBar::stripChannelNumber(const LLWString &mesg, S32* channel)
-{
- if (mesg[0] == '/'
- && mesg[1] == '/')
- {
- // This is a "repeat channel send"
- *channel = sLastSpecialChatChannel;
- return mesg.substr(2, mesg.length() - 2);
- }
- else if (mesg[0] == '/'
- && mesg[1]
- && LLStringOps::isDigit(mesg[1]))
- {
- // This a special "/20" speak on a channel
- S32 pos = 0;
-
- // Copy the channel number into a string
- LLWString channel_string;
- llwchar c;
- do
- {
- c = mesg[pos+1];
- channel_string.push_back(c);
- pos++;
- }
- while(c && pos < 64 && LLStringOps::isDigit(c));
-
- // Move the pointer forward to the first non-whitespace char
- // Check isspace before looping, so we can handle "/33foo"
- // as well as "/33 foo"
- while(c && iswspace(c))
- {
- c = mesg[pos+1];
- pos++;
- }
-
- sLastSpecialChatChannel = strtol(wstring_to_utf8str(channel_string).c_str(), NULL, 10);
- *channel = sLastSpecialChatChannel;
- return mesg.substr(pos, mesg.length() - pos);
- }
- else
- {
- // This is normal chat.
- *channel = 0;
- return mesg;
- }
-}
-
-void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel)
-{
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessageFast(_PREHASH_ChatFromViewer);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_ChatData);
- msg->addStringFast(_PREHASH_Message, utf8_out_text);
- msg->addU8Fast(_PREHASH_Type, type);
- msg->addS32("Channel", channel);
-
- gAgent.sendReliableMessage();
-
- LLViewerStats::getInstance()->incStat(LLViewerStats::ST_CHAT_COUNT);
-}
-
-class LLChatCommandHandler : public LLCommandHandler
-{
-public:
- // not allowed from outside the app
- LLChatCommandHandler() : LLCommandHandler("chat", UNTRUSTED_BLOCK) { }
-
- // Your code here
- bool handle(const LLSD& tokens, const LLSD& query_map,
- LLMediaCtrl* web)
- {
- bool retval = false;
- // Need at least 2 tokens to have a valid message.
- if (tokens.size() < 2)
- {
- retval = false;
- }
- else
- {
- S32 channel = tokens[0].asInteger();
- // VWR-19499 Restrict function to chat channels greater than 0.
- if ((channel > 0) && (channel < CHAT_CHANNEL_DEBUG))
- {
- retval = true;
- // Send unescaped message, see EXT-6353.
- std::string unescaped_mesg (LLURI::unescape(tokens[1].asString()));
- send_chat_from_viewer(unescaped_mesg, CHAT_TYPE_NORMAL, channel);
- }
- else
- {
- retval = false;
- // Tell us this is an unsupported SLurl.
- }
- }
- return retval;
- }
-};
-
-// Creating the object registers with the dispatcher.
-LLChatCommandHandler gChatHandler;
-
-
diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp
index 89fe7bb3c2..58a9b01a45 100644
--- a/indra/newview/llnotificationalerthandler.cpp
+++ b/indra/newview/llnotificationalerthandler.cpp
@@ -29,6 +29,7 @@
#include "llnotificationhandler.h"
+#include "llagentcamera.h"
#include "llnotifications.h"
#include "llprogressview.h"
#include "lltoastnotifypanel.h"
@@ -40,10 +41,10 @@
using namespace LLNotificationsUI;
//--------------------------------------------------------------------------
-LLAlertHandler::LLAlertHandler(e_notification_type type, const LLSD& id) : mIsModal(false)
+LLAlertHandler::LLAlertHandler(const std::string& name, const std::string& notification_type, bool is_modal)
+: LLSystemNotificationHandler(name, notification_type),
+ mIsModal(is_modal)
{
- mType = type;
-
LLScreenChannelBase::Params p;
p.id = LLUUID(gSavedSettings.getString("AlertChannelUUID"));
p.display_toasts_always = true;
@@ -68,79 +69,83 @@ void LLAlertHandler::initChannel()
}
//--------------------------------------------------------------------------
-bool LLAlertHandler::processNotification(const LLSD& notify)
+bool LLAlertHandler::processNotification(const LLNotificationPtr& notification)
{
if(mChannel.isDead())
{
return false;
}
- LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());
-
- if(!notification)
- return false;
-
// arrange a channel on a screen
if(!mChannel.get()->getVisible())
{
initChannel();
}
- if (notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "load")
+ if (notification->canLogToIM() && notification->hasFormElements())
{
- 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();
- p.notification = notification;
- p.panel = dynamic_cast<LLToastPanel*>(alert_dialog);
- p.enable_hide_btn = false;
- p.can_fade = false;
- 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.get()->updatePositionAndSize(rc);
-
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
- if(channel)
- channel->addToast(p);
- }
- else if (notify["sigtype"].asString() == "change")
- {
- LLToastAlertPanel* alert_dialog = new LLToastAlertPanel(notification, mIsModal);
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
- if(channel)
- channel->modifyToastByNotificationID(notification->getID(), (LLToastPanel*)alert_dialog);
- }
- else
- {
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
- if(channel)
- channel->killToastByNotificationID(notification->getID());
+ 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();
+ p.notification = notification;
+ p.panel = dynamic_cast<LLToastPanel*>(alert_dialog);
+ p.enable_hide_btn = false;
+ p.can_fade = false;
+ 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.get()->updatePositionAndSize(rc);
+
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
+ if(channel)
+ channel->addToast(p);
+
return false;
}
+void LLAlertHandler::onChange( LLNotificationPtr notification )
+{
+ LLToastAlertPanel* alert_dialog = new LLToastAlertPanel(notification, mIsModal);
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
+ if(channel)
+ channel->modifyToastByNotificationID(notification->getID(), (LLToastPanel*)alert_dialog);
+}
+
//--------------------------------------------------------------------------
+LLViewerAlertHandler::LLViewerAlertHandler(const std::string& name, const std::string& notification_type)
+ : LLSystemNotificationHandler(name, notification_type)
+{
+}
-void LLAlertHandler::onDeleteToast(LLToast* toast)
+bool LLViewerAlertHandler::processNotification(const LLNotificationPtr& p)
{
+ if (gHeadlessClient)
+ {
+ LL_INFOS("LLViewerAlertHandler") << "Alert: " << p->getName() << LL_ENDL;
+ }
+
+ // If we're in mouselook, the mouse is hidden and so the user can't click
+ // the dialog buttons. In that case, change to First Person instead.
+ if( gAgentCamera.cameraMouselook() )
+ {
+ gAgentCamera.changeCameraToDefault();
+ }
+
+ return false;
}
-//--------------------------------------------------------------------------
diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp
index ad51389241..8fef102cf8 100644
--- a/indra/newview/llnotificationgrouphandler.cpp
+++ b/indra/newview/llnotificationgrouphandler.cpp
@@ -37,15 +37,13 @@
using namespace LLNotificationsUI;
//--------------------------------------------------------------------------
-LLGroupHandler::LLGroupHandler(e_notification_type type, const LLSD& id)
+LLGroupHandler::LLGroupHandler()
+: LLCommunicationNotificationHandler("Group Notifications", "groupnotify")
{
- mType = type;
-
// Getting a Channel for our notifications
LLScreenChannel* channel = LLChannelManager::getInstance()->createNotificationChannel();
if(channel)
{
- channel->setOnRejectToastCallback(boost::bind(&LLGroupHandler::onRejectToast, this, _1));
mChannel = channel->getHandle();
}
}
@@ -64,72 +62,37 @@ void LLGroupHandler::initChannel()
}
//--------------------------------------------------------------------------
-bool LLGroupHandler::processNotification(const LLSD& notify)
+bool LLGroupHandler::processNotification(const LLNotificationPtr& notification)
{
if(mChannel.isDead())
{
return false;
}
- LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());
-
- if(!notification)
- return false;
-
// arrange a channel on a screen
if(!mChannel.get()->getVisible())
{
initChannel();
}
- if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
- {
- LLHandlerUtil::logGroupNoticeToIMGroup(notification);
+ LLHandlerUtil::logGroupNoticeToIMGroup(notification);
- LLPanel* notify_box = new LLToastGroupNotifyPanel(notification);
- LLToast::Params p;
- p.notif_id = notification->getID();
- p.notification = notification;
- p.panel = notify_box;
- p.on_delete_toast = boost::bind(&LLGroupHandler::onDeleteToast, this, _1);
+ LLPanel* notify_box = new LLToastGroupNotifyPanel(notification);
+ LLToast::Params p;
+ p.notif_id = notification->getID();
+ p.notification = notification;
+ p.panel = notify_box;
+ p.on_delete_toast = boost::bind(&LLGroupHandler::onDeleteToast, this, _1);
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
- if(channel)
- channel->addToast(p);
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
+ if(channel)
+ channel->addToast(p);
- // send a signal to the counter manager
- mNewNotificationSignal();
+ LLGroupActions::refresh_notices();
- LLGroupActions::refresh_notices();
- }
- else if (notify["sigtype"].asString() == "delete")
- {
- mChannel.get()->killToastByNotificationID(notification->getID());
- }
return false;
}
-//--------------------------------------------------------------------------
-void LLGroupHandler::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 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 3569ad6447..bff4efa9ea 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -27,33 +27,20 @@
#ifndef LL_LLNOTIFICATIONHANDLER_H
#define LL_LLNOTIFICATIONHANDLER_H
+#include <boost/intrusive_ptr.hpp>
#include "llwindow.h"
-//#include "llnotificationsutil.h"
+#include "llnotifications.h"
#include "llchannelmanager.h"
#include "llchat.h"
#include "llinstantmessage.h"
#include "llnotificationptr.h"
-class LLIMFloater;
+class LLFloaterIMSession;
namespace LLNotificationsUI
{
-// ENotificationType enumerates all possible types of notifications that could be met
-//
-typedef enum e_notification_type
-{
- NT_NOTIFY,
- NT_NOTIFYTIP,
- NT_GROUPNOTIFY,
- NT_IMCHAT,
- NT_GROUPCHAT,
- NT_NEARBYCHAT,
- NT_ALERT,
- NT_ALERTMODAL,
- NT_OFFER
-} ENotificationType;
/**
* Handler of notification events.
@@ -81,21 +68,8 @@ class LLEventHandler
public:
virtual ~LLEventHandler() {};
- // callbacks for counters
- typedef boost::function<void (void)> notification_callback_t;
- typedef boost::signals2::signal<void (void)> notification_signal_t;
- notification_signal_t mNewNotificationSignal;
- notification_signal_t mDelNotificationSignal;
- boost::signals2::connection setNewNotificationCallback(notification_callback_t cb) { return mNewNotificationSignal.connect(cb); }
- boost::signals2::connection setDelNotification(notification_callback_t cb) { return mDelNotificationSignal.connect(cb); }
- // callback for notification/toast
- typedef boost::function<void (const LLUUID id)> notification_id_callback_t;
- typedef boost::signals2::signal<void (const LLUUID id)> notification_id_signal_t;
- notification_id_signal_t mNotificationIDSignal;
- boost::signals2::connection setNotificationIDCallback(notification_id_callback_t cb) { return mNotificationIDSignal.connect(cb); }
-
protected:
- virtual void onDeleteToast(LLToast* toast)=0;
+ virtual void onDeleteToast(LLToast* toast) {}
// arrange handler's channel on a screen
// is necessary to unbind a moment of creation of a channel and a moment of positioning of it
@@ -104,8 +78,6 @@ protected:
virtual void initChannel()=0;
LLHandle<LLScreenChannelBase> mChannel;
- e_notification_type mType;
-
};
// LLSysHandler and LLChatHandler are more specific base classes
@@ -115,24 +87,37 @@ protected:
/**
* Handler for system notifications.
*/
-class LLSysHandler : public LLEventHandler
+class LLNotificationHandler : public LLEventHandler, public LLNotificationChannel
{
public:
- LLSysHandler();
- virtual ~LLSysHandler() {};
+ LLNotificationHandler(const std::string& name, const std::string& notification_type, const std::string& parentName);
+ virtual ~LLNotificationHandler() {};
- virtual bool processNotification(const LLSD& notify)=0;
+ // base interface functions
+ virtual void onAdd(LLNotificationPtr p) { processNotification(p); }
+ virtual void onChange(LLNotificationPtr p) { processNotification(p); }
+ virtual void onLoad(LLNotificationPtr p) { processNotification(p); }
+ virtual void onDelete(LLNotificationPtr p) { if (mChannel.get()) mChannel.get()->removeToastByNotificationID(p->getID());}
-protected :
- static void init();
- void removeExclusiveNotifications(const LLNotificationPtr& notif);
+ virtual bool processNotification(const LLNotificationPtr& notify) = 0;
+};
- typedef std::list< std::set<std::string> > exclusive_notif_sets;
- static exclusive_notif_sets sExclusiveNotificationGroups;
+class LLSystemNotificationHandler : public LLNotificationHandler
+{
+public:
+ LLSystemNotificationHandler(const std::string& name, const std::string& notification_type);
+ virtual ~LLSystemNotificationHandler() {};
+};
+
+class LLCommunicationNotificationHandler : public LLNotificationHandler
+{
+public:
+ LLCommunicationNotificationHandler(const std::string& name, const std::string& notification_type);
+ virtual ~LLCommunicationNotificationHandler() {};
};
/**
- * Handler for chat message notifications.
+ * Handler for chat message notifications.
*/
class LLChatHandler : public LLEventHandler
{
@@ -146,17 +131,14 @@ public:
* Handler for IM notifications.
* It manages life time of IMs, group messages.
*/
-class LLIMHandler : public LLSysHandler
+class LLIMHandler : public LLCommunicationNotificationHandler
{
public:
- LLIMHandler(e_notification_type type, const LLSD& id);
+ LLIMHandler();
virtual ~LLIMHandler();
-
- // base interface functions
- virtual bool processNotification(const LLSD& notify);
+ bool processNotification(const LLNotificationPtr& p);
protected:
- virtual void onDeleteToast(LLToast* toast);
virtual void initChannel();
};
@@ -164,18 +146,15 @@ protected:
* Handler for system informational notices.
* It manages life time of tip notices.
*/
-class LLTipHandler : public LLSysHandler
+class LLTipHandler : public LLSystemNotificationHandler
{
public:
- LLTipHandler(e_notification_type type, const LLSD& id);
+ LLTipHandler();
virtual ~LLTipHandler();
- // base interface functions
- virtual bool processNotification(const LLSD& notify);
+ virtual bool processNotification(const LLNotificationPtr& p);
protected:
- virtual void onDeleteToast(LLToast* toast);
- virtual void onRejectToast(const LLUUID& id);
virtual void initChannel();
};
@@ -183,168 +162,144 @@ protected:
* Handler for system informational notices.
* It manages life time of script notices.
*/
-class LLScriptHandler : public LLSysHandler
+class LLScriptHandler : public LLSystemNotificationHandler
{
public:
- LLScriptHandler(e_notification_type type, const LLSD& id);
+ LLScriptHandler();
virtual ~LLScriptHandler();
- // base interface functions
- virtual bool processNotification(const LLSD& notify);
+ virtual void onDelete(LLNotificationPtr p);
+ virtual bool processNotification(const LLNotificationPtr& p);
protected:
virtual void onDeleteToast(LLToast* toast);
virtual void initChannel();
-
- // own handlers
- void onRejectToast(LLUUID& id);
};
/**
* Handler for group system notices.
*/
-class LLGroupHandler : public LLSysHandler
+class LLGroupHandler : public LLCommunicationNotificationHandler
{
public:
- LLGroupHandler(e_notification_type type, const LLSD& id);
+ LLGroupHandler();
virtual ~LLGroupHandler();
- // base interface functions
- virtual bool processNotification(const LLSD& notify);
+ virtual bool processNotification(const LLNotificationPtr& p);
protected:
- virtual void onDeleteToast(LLToast* toast);
virtual void initChannel();
-
- // own handlers
- void onRejectToast(LLUUID& id);
};
/**
* Handler for alert system notices.
*/
-class LLAlertHandler : public LLSysHandler
+class LLAlertHandler : public LLSystemNotificationHandler
{
public:
- LLAlertHandler(e_notification_type type, const LLSD& id);
+ LLAlertHandler(const std::string& name, const std::string& notification_type, bool is_modal);
virtual ~LLAlertHandler();
- void setAlertMode(bool is_modal) { mIsModal = is_modal; }
-
- // base interface functions
- virtual bool processNotification(const LLSD& notify);
+ virtual void onChange(LLNotificationPtr p);
+ virtual bool processNotification(const LLNotificationPtr& p);
protected:
- virtual void onDeleteToast(LLToast* toast);
virtual void initChannel();
bool mIsModal;
};
+class LLViewerAlertHandler : public LLSystemNotificationHandler
+{
+ LOG_CLASS(LLViewerAlertHandler);
+public:
+ LLViewerAlertHandler(const std::string& name, const std::string& notification_type);
+ virtual ~LLViewerAlertHandler() {};
+
+ virtual void onDelete(LLNotificationPtr p) {};
+ virtual bool processNotification(const LLNotificationPtr& p);
+
+protected:
+ virtual void initChannel() {};
+};
+
/**
* Handler for offers notices.
* It manages life time of offer notices.
*/
-class LLOfferHandler : public LLSysHandler
+class LLOfferHandler : public LLCommunicationNotificationHandler
{
public:
- LLOfferHandler(e_notification_type type, const LLSD& id);
+ LLOfferHandler();
virtual ~LLOfferHandler();
- // base interface functions
- virtual bool processNotification(const LLSD& notify);
+ virtual void onChange(LLNotificationPtr p);
+ virtual void onDelete(LLNotificationPtr notification);
+ virtual bool processNotification(const LLNotificationPtr& p);
protected:
- virtual void onDeleteToast(LLToast* toast);
virtual void initChannel();
-
- // own handlers
- void onRejectToast(LLUUID& id);
};
/**
* Handler for UI hints.
*/
-class LLHintHandler : public LLSingleton<LLHintHandler>
+class LLHintHandler : public LLSystemNotificationHandler
{
public:
LLHintHandler();
- virtual ~LLHintHandler();
+ virtual ~LLHintHandler() {}
- // base interface functions
- virtual bool processNotification(const LLSD& notify);
+ virtual void onAdd(LLNotificationPtr p);
+ virtual void onLoad(LLNotificationPtr p);
+ virtual void onDelete(LLNotificationPtr p);
+ virtual bool processNotification(const LLNotificationPtr& p);
+
+protected:
+ virtual void initChannel() {};
};
/**
* Handler for browser notifications
*/
-class LLBrowserNotification : public LLSingleton<LLBrowserNotification>
+class LLBrowserNotification : public LLSystemNotificationHandler
{
public:
- virtual bool processNotification(const LLSD& notify);
+ LLBrowserNotification();
+ virtual ~LLBrowserNotification() {}
+
+ virtual bool processNotification(const LLNotificationPtr& p);
+
+protected:
+ virtual void initChannel() {};
};
/**
* Handler for outbox notifications
*/
-class LLOutboxNotification : public LLSingleton<LLOutboxNotification>
+class LLOutboxNotification : public LLSystemNotificationHandler
{
public:
- virtual bool processNotification(const LLSD& notify);
+ LLOutboxNotification();
+ virtual ~LLOutboxNotification() {};
+ virtual void onChange(LLNotificationPtr p) { }
+ virtual void onDelete(LLNotificationPtr p);
+ virtual bool processNotification(const LLNotificationPtr& p);
+
+protected:
+ virtual void initChannel() {};
};
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 whether notification can be used multiple times or not.
- */
- static bool isNotificationReusable(const LLNotificationPtr& notification);
-
- /**
- * Checks if passed notification can create IM session and be written into it.
- *
- * This method uses canLogToIM() & canSpawnIMSession().
- */
- static bool canSpawnSessionAndLogToIM(const LLNotificationPtr& notification);
-
- /**
- * Checks if passed notification can create toast.
- */
- static bool canSpawnToast(const LLNotificationPtr& notification);
-
- /**
* Determines whether IM floater is opened.
*/
static bool isIMFloaterOpened(const LLNotificationPtr& notification);
/**
- * Determines whether IM floater is focused.
- */
- static bool isIMFloaterFocused(const LLNotificationPtr& notification);
-
- /**
* Writes notification message to IM session.
*/
static void logToIM(const EInstantMessage& session_type,
@@ -355,12 +310,7 @@ public:
/**
* 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);
+ static void logToIMP2P(const LLNotificationPtr& notification, bool to_file_only = false);
/**
* Writes group notice notification message to IM group session.
@@ -406,13 +356,6 @@ public:
*/
static void decIMMesageCounter(const LLNotificationPtr& notification);
-private:
-
- /**
- * Find IM floater based on "from_id"
- */
- static LLIMFloater* findIMFloater(const LLNotificationPtr& notification);
-
};
}
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index 16c51138a9..eb4601a469 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -34,219 +34,34 @@
#include "llurlaction.h"
#include "llagent.h"
-#include "llimfloater.h"
+#include "llfloaterimsession.h"
#include "llimview.h"
-#include "llnearbychat.h"
+#include "llfloaterimnearbychat.h"
#include "llnotificationhandler.h"
using namespace LLNotificationsUI;
-// static
-std::list< std::set<std::string> > LLSysHandler::sExclusiveNotificationGroups;
-
-// static
-void LLSysHandler::init()
-{
- std::set<std::string> online_offline_group;
- online_offline_group.insert("FriendOnline");
- online_offline_group.insert("FriendOffline");
+LLNotificationHandler::LLNotificationHandler(const std::string& name, const std::string& notification_type, const std::string& parentName)
+: LLNotificationChannel(name, parentName, LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, notification_type))
+{}
- sExclusiveNotificationGroups.push_back(online_offline_group);
-}
-
-LLSysHandler::LLSysHandler()
-{
- if(sExclusiveNotificationGroups.empty())
- {
- init();
- }
-}
+LLSystemNotificationHandler::LLSystemNotificationHandler(const std::string& name, const std::string& notification_type)
+ : LLNotificationHandler(name, notification_type, "System")
+{}
-void LLSysHandler::removeExclusiveNotifications(const LLNotificationPtr& notif)
-{
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel *>(mChannel.get());
- if (channel == NULL)
- {
- return;
- }
-
- class ExclusiveMatcher: public LLScreenChannel::Matcher
- {
- public:
- ExclusiveMatcher(const std::set<std::string>& excl_group,
- const std::string& from_name) :
- mExclGroup(excl_group), mFromName(from_name)
- {
- }
- bool matches(const LLNotificationPtr notification) const
- {
- for (std::set<std::string>::const_iterator it = mExclGroup.begin(); it
- != mExclGroup.end(); it++)
- {
- std::string from_name = LLHandlerUtil::getSubstitutionName(notification);
- if (notification->getName() == *it && from_name == mFromName)
- {
- return true;
- }
- }
- return false;
- }
- private:
- const std::set<std::string>& mExclGroup;
- const std::string& mFromName;
- };
-
-
- for (exclusive_notif_sets::iterator it = sExclusiveNotificationGroups.begin(); it
- != sExclusiveNotificationGroups.end(); it++)
- {
- std::set<std::string> group = *it;
- std::set<std::string>::iterator g_it = group.find(notif->getName());
- if (g_it != group.end())
- {
- channel->killMatchedToasts(ExclusiveMatcher(group,
- LLHandlerUtil::getSubstitutionName(notif)));
- }
- }
-}
-
-const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"),
- REVOKED_MODIFY_RIGHTS("RevokedModifyRights"),
- OBJECT_GIVE_ITEM("ObjectGiveItem"),
- OBJECT_GIVE_ITEM_UNKNOWN_USER("ObjectGiveItemUnknownUser"),
- PAYMENT_RECEIVED("PaymentReceived"),
- PAYMENT_SENT("PaymentSent"),
- 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"),
- TELEPORT_OFFERED_MATURITY_EXCEEDED("TeleportOffered_MaturityExceeded"),
- TELEPORT_OFFERED_MATURITY_BLOCKED("TeleportOffered_MaturityBlocked"),
- TELEPORT_OFFER_SENT("TeleportOfferSent"),
- IM_SYSTEM_MESSAGE_TIP("IMSystemMessageTip");
-
-
-// static
-bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)
-{
- return GRANTED_MODIFY_RIGHTS == notification->getName()
- || REVOKED_MODIFY_RIGHTS == notification->getName()
- || PAYMENT_RECEIVED == notification->getName()
- || PAYMENT_SENT == notification->getName()
- || OFFER_FRIENDSHIP == notification->getName()
- || FRIENDSHIP_OFFERED == notification->getName()
- || FRIENDSHIP_ACCEPTED == notification->getName()
- || FRIENDSHIP_ACCEPTED_BYME == notification->getName()
- || FRIENDSHIP_DECLINED_BYME == notification->getName()
- || SERVER_OBJECT_MESSAGE == notification->getName()
- || INVENTORY_ACCEPTED == notification->getName()
- || INVENTORY_DECLINED == notification->getName()
- || USER_GIVE_ITEM == notification->getName()
- || TELEPORT_OFFERED == notification->getName()
- || TELEPORT_OFFERED_MATURITY_EXCEEDED == notification->getName()
- || TELEPORT_OFFERED_MATURITY_BLOCKED == notification->getName()
- || TELEPORT_OFFER_SENT == notification->getName()
- || IM_SYSTEM_MESSAGE_TIP == 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()
- && IM_SYSTEM_MESSAGE_TIP != notification->getName();
-}
-
-// static
-bool LLHandlerUtil::canSpawnIMSession(const LLNotificationPtr& notification)
-{
- return OFFER_FRIENDSHIP == notification->getName()
- || USER_GIVE_ITEM == notification->getName()
- || TELEPORT_OFFERED == notification->getName()
- || TELEPORT_OFFERED_MATURITY_EXCEEDED == notification->getName()
- || TELEPORT_OFFERED_MATURITY_BLOCKED == notification->getName();
-}
-
-// static
-bool LLHandlerUtil::canAddNotifPanelToIM(const LLNotificationPtr& notification)
-{
- return OFFER_FRIENDSHIP == notification->getName()
- || USER_GIVE_ITEM == notification->getName()
- || TELEPORT_OFFERED == notification->getName()
- || TELEPORT_OFFERED_MATURITY_EXCEEDED == notification->getName()
- || TELEPORT_OFFERED_MATURITY_BLOCKED == notification->getName();
-}
-
-// static
-bool LLHandlerUtil::isNotificationReusable(const LLNotificationPtr& notification)
-{
- return OFFER_FRIENDSHIP == notification->getName()
- || USER_GIVE_ITEM == notification->getName()
- || TELEPORT_OFFERED == notification->getName()
- || TELEPORT_OFFERED_MATURITY_EXCEEDED == notification->getName()
- || TELEPORT_OFFERED_MATURITY_BLOCKED == notification->getName();
-}
-
-// static
-bool LLHandlerUtil::canSpawnSessionAndLogToIM(const LLNotificationPtr& notification)
-{
- return canLogToIM(notification) && canSpawnIMSession(notification);
-}
+LLCommunicationNotificationHandler::LLCommunicationNotificationHandler(const std::string& name, const std::string& notification_type)
+ : LLNotificationHandler(name, notification_type, "Communication")
+{}
// static
-bool LLHandlerUtil::canSpawnToast(const LLNotificationPtr& notification)
+bool LLHandlerUtil::isIMFloaterOpened(const LLNotificationPtr& notification)
{
- if(INVENTORY_DECLINED == notification->getName()
- || INVENTORY_ACCEPTED == notification->getName())
- {
- // return false for inventory accepted/declined notifications if respective IM window is open (EXT-5909)
- return ! isIMFloaterOpened(notification);
- }
-
- if(FRIENDSHIP_ACCEPTED == notification->getName())
- {
- // don't show FRIENDSHIP_ACCEPTED if IM window is opened and focused - EXT-6441
- return ! isIMFloaterFocused(notification);
- }
-
- if(OFFER_FRIENDSHIP == notification->getName()
- || USER_GIVE_ITEM == notification->getName()
- || TELEPORT_OFFERED == notification->getName()
- || TELEPORT_OFFERED_MATURITY_EXCEEDED == notification->getName()
- || TELEPORT_OFFERED_MATURITY_BLOCKED == notification->getName())
- {
- // When ANY offer arrives, show toast, unless IM window is already open - EXT-5904
- return ! isIMFloaterOpened(notification);
- }
-
- return true;
-}
+ bool res = false;
-// static
-LLIMFloater* LLHandlerUtil::findIMFloater(const LLNotificationPtr& notification)
-{
LLUUID from_id = notification->getPayload()["from_id"];
LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, from_id);
- return LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
-}
-
-// static
-bool LLHandlerUtil::isIMFloaterOpened(const LLNotificationPtr& notification)
-{
- bool res = false;
+ LLFloaterIMSession* im_floater = LLFloaterReg::findTypedInstance<LLFloaterIMSession>("impanel", session_id);
- LLIMFloater* im_floater = findIMFloater(notification);
if (im_floater != NULL)
{
res = im_floater->getVisible() == TRUE;
@@ -255,19 +70,6 @@ bool LLHandlerUtil::isIMFloaterOpened(const LLNotificationPtr& notification)
return res;
}
-bool LLHandlerUtil::isIMFloaterFocused(const LLNotificationPtr& notification)
-{
- bool res = false;
-
- LLIMFloater* im_floater = findIMFloater(notification);
- if (im_floater != NULL)
- {
- res = im_floater->hasFocus() == TRUE;
- }
-
- return res;
-}
-
// static
void LLHandlerUtil::logToIM(const EInstantMessage& session_type,
const std::string& session_name, const std::string& from_name,
@@ -299,13 +101,6 @@ void LLHandlerUtil::logToIM(const EInstantMessage& session_type,
}
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);
-
S32 unread = session->mNumUnread;
S32 participant_unread = session->mParticipantUnreadMessageCount;
LLIMModel::instance().addMessageSilently(session_id, from, from_id,
@@ -316,25 +111,9 @@ void LLHandlerUtil::logToIM(const EInstantMessage& session_type,
// update IM floater messages
updateIMFLoaterMesages(session_id);
-
- // 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);
-}
-
void log_name_callback(const std::string& full_name, const std::string& from_name,
const std::string& message, const LLUUID& from_id)
@@ -346,14 +125,12 @@ void log_name_callback(const std::string& full_name, const std::string& from_nam
// static
void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification, bool to_file_only)
{
- // don't create IM p2p session with objects, it's necessary condition to log
- if (notification->getName() != OBJECT_GIVE_ITEM)
- {
LLUUID from_id = notification->getPayload()["from_id"];
if (from_id.isNull())
{
- llwarns << " from_id for notification " << notification->getName() << " is null " << llendl;
+ // Normal behavior for system generated messages, don't spam.
+ // llwarns << " from_id for notification " << notification->getName() << " is null " << llendl;
return;
}
@@ -366,7 +143,6 @@ void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification, bool to_fi
gCacheName->get(from_id, false, boost::bind(&log_name_callback, _2, INTERACTIVE_SYSTEM_FROM, notification->getMessage(), from_id));
}
}
-}
// static
void LLHandlerUtil::logGroupNoticeToIMGroup(
@@ -397,8 +173,8 @@ void LLHandlerUtil::logGroupNoticeToIMGroup(
// static
void LLHandlerUtil::logToNearbyChat(const LLNotificationPtr& notification, EChatSourceType type)
{
- LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
- if(nearby_chat)
+ LLFloaterIMNearbyChat* nearby_chat = LLFloaterReg::findTypedInstance<LLFloaterIMNearbyChat>("nearby_chat");
+ if (nearby_chat)
{
LLChat chat_msg(notification->getMessage());
chat_msg.mSourceType = type;
@@ -477,7 +253,7 @@ void LLHandlerUtil::addNotifPanelToIM(const LLNotificationPtr& notification)
// static
void LLHandlerUtil::updateIMFLoaterMesages(const LLUUID& session_id)
{
- LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+ LLFloaterIMSession* im_floater = LLFloaterIMSession::findInstance(session_id);
if (im_floater != NULL && im_floater->getVisible())
{
im_floater->updateMessages();
@@ -501,14 +277,10 @@ void LLHandlerUtil::decIMMesageCounter(const LLNotificationPtr& notification)
LLUUID from_id = notification->getPayload()["from_id"];
LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, from_id);
- LLIMModel::LLIMSession * session = LLIMModel::getInstance()->findIMSession(
- session_id);
+ LLIMModel::LLIMSession * session = LLIMModel::getInstance()->findIMSession(session_id);
- if (session == NULL)
+ if (session)
{
- return;
- }
-
LLSD arg;
arg["session_id"] = session_id;
session->mNumUnread--;
@@ -517,3 +289,5 @@ void LLHandlerUtil::decIMMesageCounter(const LLNotificationPtr& notification)
arg["participant_unread"] = session->mParticipantUnreadMessageCount;
LLIMModel::getInstance()->mNewMsgSignal(arg);
}
+}
+
diff --git a/indra/newview/llnotificationhinthandler.cpp b/indra/newview/llnotificationhinthandler.cpp
index f7163cb04f..f40369a2e0 100644
--- a/indra/newview/llnotificationhinthandler.cpp
+++ b/indra/newview/llnotificationhinthandler.cpp
@@ -34,25 +34,26 @@
using namespace LLNotificationsUI;
LLHintHandler::LLHintHandler()
+ : LLSystemNotificationHandler("Hints", "hint")
{
}
-LLHintHandler::~LLHintHandler()
+void LLHintHandler::onAdd(LLNotificationPtr p)
{
+ LLHints::show(p);
}
-bool LLHintHandler::processNotification(const LLSD& notify)
+void LLHintHandler::onLoad(LLNotificationPtr p)
+{
+ LLHints::show(p);
+}
+
+void LLHintHandler::onDelete(LLNotificationPtr p)
+{
+ LLHints::hide(p);
+}
+
+bool LLHintHandler::processNotification(const LLNotificationPtr& p)
{
- LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());
-
- std::string sigtype = notify["sigtype"].asString();
- if (sigtype == "add" || sigtype == "load")
- {
- LLHints::show(notification);
- }
- else if (sigtype == "delete")
- {
- LLHints::hide(notification);
- }
return false;
}
diff --git a/indra/newview/llnotificationmanager.cpp b/indra/newview/llnotificationmanager.cpp
index f792f53ac5..152581c5a0 100644
--- a/indra/newview/llnotificationmanager.cpp
+++ b/indra/newview/llnotificationmanager.cpp
@@ -31,7 +31,7 @@
#include "llnotificationmanager.h"
-#include "llnearbychathandler.h"
+#include "llfloaterimnearbychathandler.h"
#include "llnotifications.h"
#include <boost/bind.hpp>
@@ -42,107 +42,35 @@ using namespace LLNotificationsUI;
//--------------------------------------------------------------------------
LLNotificationManager::LLNotificationManager()
{
- mNotifyHandlers.clear();
init();
}
//--------------------------------------------------------------------------
LLNotificationManager::~LLNotificationManager()
{
- BOOST_FOREACH(listener_pair_t& pair, mChannelListeners)
- {
- pair.second.disconnect();
- }
}
//--------------------------------------------------------------------------
void LLNotificationManager::init()
{
- LLNotificationChannel::buildChannel("Notifications", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "notify"));
- LLNotificationChannel::buildChannel("NotificationTips", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "notifytip"));
- LLNotificationChannel::buildChannel("Group Notifications", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "groupnotify"));
- 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"));
- LLNotificationChannel::buildChannel("Hints", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "hint"));
- LLNotificationChannel::buildChannel("Browser", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "browser"));
- LLNotificationChannel::buildChannel("Outbox", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "outbox"));
+ mChannels.push_back(new LLScriptHandler());
+ mChannels.push_back(new LLTipHandler());
+ mChannels.push_back(new LLGroupHandler());
+ mChannels.push_back(new LLAlertHandler("Alerts", "alert", false));
+ mChannels.push_back(new LLAlertHandler("AlertModal", "alertmodal", true));
+ mChannels.push_back(new LLOfferHandler());
+ mChannels.push_back(new LLHintHandler());
+ mChannels.push_back(new LLBrowserNotification());
+ mChannels.push_back(new LLOutboxNotification());
+ mChannels.push_back(new LLIMHandler());
- mChannelListeners["Notifications"] = LLNotifications::instance().getChannel("Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
- mChannelListeners["NotificationTips"] = LLNotifications::instance().getChannel("NotificationTips")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
- mChannelListeners["Group Notifications"] = LLNotifications::instance().getChannel("Group Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
- mChannelListeners["Alerts"] = LLNotifications::instance().getChannel("Alerts")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
- mChannelListeners["AlertModal"] = LLNotifications::instance().getChannel("AlertModal")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
- mChannelListeners["IM Notifications"] = LLNotifications::instance().getChannel("IM Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
- mChannelListeners["Offer"] = LLNotifications::instance().getChannel("Offer")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
- mChannelListeners["Hints"] = LLNotifications::instance().getChannel("Hints")->connectChanged(boost::bind(&LLHintHandler::processNotification, LLHintHandler::getInstance(), _1));
- mChannelListeners["Browser"] = LLNotifications::instance().getChannel("Browser")->connectChanged(boost::bind(&LLBrowserNotification::processNotification, LLBrowserNotification::getInstance(), _1));
- mChannelListeners["Outbox"] = LLNotifications::instance().getChannel("Outbox")->connectChanged(boost::bind(&LLOutboxNotification::processNotification, LLOutboxNotification::getInstance(), _1));
-
- mNotifyHandlers["notify"] = boost::shared_ptr<LLEventHandler>(new LLScriptHandler(NT_NOTIFY, LLSD()));
- mNotifyHandlers["notifytip"] = boost::shared_ptr<LLEventHandler>(new LLTipHandler(NT_NOTIFY, LLSD()));
- mNotifyHandlers["groupnotify"] = boost::shared_ptr<LLEventHandler>(new LLGroupHandler(NT_GROUPNOTIFY, LLSD()));
- mNotifyHandlers["alert"] = boost::shared_ptr<LLEventHandler>(new LLAlertHandler(NT_ALERT, LLSD()));
- mNotifyHandlers["alertmodal"] = boost::shared_ptr<LLEventHandler>(new LLAlertHandler(NT_ALERT, LLSD()));
- static_cast<LLAlertHandler*>(mNotifyHandlers["alertmodal"].get())->setAlertMode(true);
- 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()));
-}
-
-//--------------------------------------------------------------------------
-bool LLNotificationManager::onNotification(const LLSD& notify)
-{
- LLSysHandler* handle = NULL;
-
- if (LLNotifications::destroyed())
- return false;
-
- LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());
-
- if (!notification)
- return false;
-
- std::string notification_type = notification->getType();
- handle = static_cast<LLSysHandler*>(mNotifyHandlers[notification_type].get());
-
- if(!handle)
- return false;
-
- return handle->processNotification(notify);
+ mChatHandler = boost::shared_ptr<LLFloaterIMNearbyChatHandler>(new LLFloaterIMNearbyChatHandler());
}
//--------------------------------------------------------------------------
void LLNotificationManager::onChat(const LLChat& msg, const LLSD &args)
{
- // check ENotificationType argument
- switch(args["type"].asInteger())
- {
- case NT_NEARBYCHAT:
- {
- LLNearbyChatHandler* handle = dynamic_cast<LLNearbyChatHandler*>(mNotifyHandlers["nearbychat"].get());
-
- if(handle)
- handle->processChat(msg, args);
+ if(mChatHandler)
+ mChatHandler->processChat(msg, args);
}
- break;
- default: //no need to handle all enum types
- break;
- }
-}
-
-//--------------------------------------------------------------------------
-LLEventHandler* LLNotificationManager::getHandlerForNotification(std::string notification_type)
-{
- std::map<std::string, boost::shared_ptr<LLEventHandler> >::iterator it = mNotifyHandlers.find(notification_type);
-
- if(it != mNotifyHandlers.end())
- return (*it).second.get();
-
- return NULL;
-}
-
-//--------------------------------------------------------------------------
diff --git a/indra/newview/llnotificationmanager.h b/indra/newview/llnotificationmanager.h
index 27b6ba1c71..f37c6b833c 100644
--- a/indra/newview/llnotificationmanager.h
+++ b/indra/newview/llnotificationmanager.h
@@ -28,8 +28,6 @@
#ifndef LL_LLNOTIFICATIONMANAGER_H
#define LL_LLNOTIFICATIONMANAGER_H
-#include "llevents.h"
-
#include "lluictrl.h"
#include "llnotificationhandler.h"
@@ -49,7 +47,6 @@ class LLToast;
class LLNotificationManager : public LLSingleton<LLNotificationManager>
{
typedef std::pair<std::string, LLEventHandler*> eventhandlers;
- typedef std::pair<const std::string, LLBoundListener> listener_pair_t;
public:
LLNotificationManager();
virtual ~LLNotificationManager();
@@ -59,22 +56,12 @@ public:
void init(void);
//TODO: combine processing and storage (*)
- // this method reacts on system notifications and calls an appropriate handler
- bool onNotification(const LLSD& notification);
-
// this method reacts on chat notifications and calls an appropriate handler
void onChat(const LLChat& msg, const LLSD &args);
- // get a handler for a certain type of notification
- LLEventHandler* getHandlerForNotification(std::string notification_type);
-
-
private:
- //TODO (*)
- std::map<std::string, boost::shared_ptr<LLEventHandler> > mNotifyHandlers;
- // cruft std::map<std::string, LLChatHandler*> mChatHandlers;
-
- std::map<std::string, LLBoundListener> mChannelListeners;
+ boost::shared_ptr<class LLFloaterIMNearbyChatHandler> mChatHandler;
+ std::vector<LLNotificationChannelPtr> mChannels;
};
}
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index 1552ed3346..2657b84ef3 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -40,16 +40,14 @@
using namespace LLNotificationsUI;
//--------------------------------------------------------------------------
-LLOfferHandler::LLOfferHandler(e_notification_type type, const LLSD& id)
+LLOfferHandler::LLOfferHandler()
+: LLCommunicationNotificationHandler("Offer", "offer")
{
- mType = type;
-
// Getting a Channel for our notifications
LLScreenChannel* channel = LLChannelManager::getInstance()->createNotificationChannel();
if(channel)
{
channel->setControlHovering(true);
- channel->setOnRejectToastCallback(boost::bind(&LLOfferHandler::onRejectToast, this, _1));
mChannel = channel->getHandle();
}
}
@@ -68,147 +66,124 @@ void LLOfferHandler::initChannel()
}
//--------------------------------------------------------------------------
-bool LLOfferHandler::processNotification(const LLSD& notify)
+bool LLOfferHandler::processNotification(const LLNotificationPtr& notification)
{
if(mChannel.isDead())
{
return false;
}
- LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());
-
- if(!notification)
- return false;
-
// arrange a channel on a screen
if(!mChannel.get()->getVisible())
{
initChannel();
}
- if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
- {
+ if( notification->getPayload().has("give_inventory_notification")
+ && notification->getPayload()["give_inventory_notification"].asBoolean() == false)
+ {
+ // This is an original inventory offer, so add a script floater
+ LLScriptFloaterManager::instance().onAddNotification(notification->getID());
+ }
+ else
+ {
+ bool add_notif_to_im = notification->canLogToIM() && notification->hasFormElements();
- if( notification->getPayload().has("give_inventory_notification")
- && !notification->getPayload()["give_inventory_notification"] )
+ if (add_notif_to_im)
{
- // This is an original inventory offer, so add a script floater
- LLScriptFloaterManager::instance().onAddNotification(notification->getID());
+ const std::string name = LLHandlerUtil::getSubstitutionName(notification);
+
+ LLUUID from_id = notification->getPayload()["from_id"];
+
+ //Will not play a notification sound for inventory and teleport offer based upon chat preference
+ bool playSound = (!notification->isDND()
+ && ((notification->getName() == "UserGiveItem"
+ && gSavedSettings.getBOOL("PlaySoundInventoryOffer"))
+ || (notification->getName() == "TeleportOffered"
+ && gSavedSettings.getBOOL("PlaySoundTeleportOffer"))));
+
+ if(playSound)
+ {
+ notification->playSound();
+ }
+
+ LLHandlerUtil::spawnIMSession(name, from_id);
+ LLHandlerUtil::addNotifPanelToIM(notification);
+
}
- else
+
+ if (!notification->canShowToast())
{
- notification->setReusable(LLHandlerUtil::isNotificationReusable(notification));
-
- 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);
- }
-
- bool show_toast = LLHandlerUtil::canSpawnToast(notification);
- bool add_notid_to_im = LLHandlerUtil::canAddNotifPanelToIM(notification);
- if (add_notid_to_im)
- {
- LLHandlerUtil::addNotifPanelToIM(notification);
- }
-
- if (notification->getPayload().has("SUPPRESS_TOAST")
- && notification->getPayload()["SUPPRESS_TOAST"])
- {
- LLNotificationsUtil::cancel(notification);
- }
- else if(show_toast)
- {
- LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
- // don't close notification on panel destroy since it will be used by IM floater
- notify_box->setCloseNotificationOnDestroy(!add_notid_to_im);
- LLToast::Params p;
- p.notif_id = notification->getID();
- p.notification = notification;
- p.panel = notify_box;
- p.on_delete_toast = boost::bind(&LLOfferHandler::onDeleteToast, this, _1);
- // we not save offer notifications to the syswell floater that should be added to the IM floater
- p.can_be_stored = !add_notid_to_im;
-
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
- if(channel)
- channel->addToast(p);
-
- // if we not add notification to IM - add it to notification well
- if (!add_notid_to_im)
- {
- // send a signal to the counter manager
- mNewNotificationSignal();
- }
- }
-
- if (LLHandlerUtil::canLogToIM(notification))
- {
- // log only to file if notif panel can be embedded to IM and IM is opened
- if (add_notid_to_im && LLHandlerUtil::isIMFloaterOpened(notification))
- {
- LLHandlerUtil::logToIMP2P(notification, true);
- }
- else
- {
- LLHandlerUtil::logToIMP2P(notification);
- }
- }
+ LLNotificationsUtil::cancel(notification);
}
- }
- else if (notify["sigtype"].asString() == "delete")
- {
- if( notification->getPayload().has("give_inventory_notification")
- && !notification->getPayload()["give_inventory_notification"] )
+ else if(!notification->canLogToIM() || !LLHandlerUtil::isIMFloaterOpened(notification))
{
- // Remove original inventory offer script floater
- LLScriptFloaterManager::instance().onRemoveNotification(notification->getID());
+ LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
+ LLToast::Params p;
+ p.notif_id = notification->getID();
+ p.notification = notification;
+ p.panel = notify_box;
+ // we not save offer notifications to the syswell floater that should be added to the IM floater
+ p.can_be_stored = !add_notif_to_im;
+ p.force_show = notification->getOfferFromAgent();
+
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
+ if(channel)
+ channel->addToast(p);
+
}
- else
+
+ if (notification->canLogToIM())
{
- if (LLHandlerUtil::canAddNotifPanelToIM(notification)
- && !LLHandlerUtil::isIMFloaterOpened(notification))
- {
- LLHandlerUtil::decIMMesageCounter(notification);
- }
- mChannel.get()->killToastByNotificationID(notification->getID());
+ // log only to file if notif panel can be embedded to IM and IM is opened
+ bool file_only = add_notif_to_im && LLHandlerUtil::isIMFloaterOpened(notification);
+ LLHandlerUtil::logToIMP2P(notification, file_only);
}
}
return false;
}
-//--------------------------------------------------------------------------
-
-void LLOfferHandler::onDeleteToast(LLToast* toast)
+/*virtual*/ void LLOfferHandler::onChange(LLNotificationPtr p)
{
- if (!LLHandlerUtil::canAddNotifPanelToIM(toast->getNotification()))
+ LLToastNotifyPanel* panelp = LLToastNotifyPanel::getInstance(p->getID());
+ if (panelp)
{
- // send a signal to the counter manager
- mDelNotificationSignal();
+ //
+ // HACK: if we're dealing with a notification embedded in IM, update it
+ // otherwise remove its toast
+ //
+ if (dynamic_cast<LLIMToastNotifyPanel*>(panelp))
+ {
+ panelp->updateNotification();
+ }
+ else
+ {
+ // if notification has changed, hide it
+ mChannel.get()->removeToastByNotificationID(p->getID());
+ }
}
-
- // 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
- // don't delete notification since it may be used by IM floater
- && !LLHandlerUtil::canAddNotifPanelToIM(notification))
+/*virtual*/ void LLOfferHandler::onDelete(LLNotificationPtr notification)
+{
+ if( notification->getPayload().has("give_inventory_notification")
+ && !notification->getPayload()["give_inventory_notification"] )
{
- LLNotifications::instance().cancel(notification);
+ // Remove original inventory offer script floater
+ LLScriptFloaterManager::instance().onRemoveNotification(notification->getID());
+ }
+ else
+ {
+ if (notification->canLogToIM()
+ && notification->hasFormElements()
+ && !LLHandlerUtil::isIMFloaterOpened(notification))
+ {
+ LLHandlerUtil::decIMMesageCounter(notification);
+ }
+ mChannel.get()->removeToastByNotificationID(notification->getID());
}
}
+
diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp
index 398f54c6f7..08c98e4f28 100644
--- a/indra/newview/llnotificationscripthandler.cpp
+++ b/indra/newview/llnotificationscripthandler.cpp
@@ -27,6 +27,7 @@
#include "llviewerprecompiledheaders.h" // must be first include
+#include "llagent.h"
#include "llnotificationhandler.h"
#include "lltoastnotifypanel.h"
#include "llviewercontrol.h"
@@ -37,21 +38,15 @@
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)
+LLScriptHandler::LLScriptHandler()
+: LLSystemNotificationHandler("Notifications", "notify")
{
- mType = type;
-
// Getting a Channel for our notifications
LLScreenChannel* channel = LLChannelManager::getInstance()->createNotificationChannel();
if(channel)
{
channel->setControlHovering(true);
- channel->setOnRejectToastCallback(boost::bind(&LLScriptHandler::onRejectToast, this, _1));
mChannel = channel->getHandle();
}
}
@@ -70,104 +65,83 @@ void LLScriptHandler::initChannel()
}
//--------------------------------------------------------------------------
-bool LLScriptHandler::processNotification(const LLSD& notify)
+bool LLScriptHandler::processNotification(const LLNotificationPtr& notification)
{
if(mChannel.isDead())
{
return false;
}
- LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());
-
- if(!notification)
- return false;
-
// arrange a channel on a screen
if(!mChannel.get()->getVisible())
{
initChannel();
}
- if(notify["sigtype"].asString() == "add")
+ if (notification->canLogToIM())
{
- if (LLHandlerUtil::canLogToIM(notification))
- {
- LLHandlerUtil::logToIMP2P(notification);
- }
+ LLHandlerUtil::logToIMP2P(notification);
+ }
- if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName() || SCRIPT_LOAD_URL == notification->getName())
- {
- LLScriptFloaterManager::getInstance()->onAddNotification(notification->getID());
+ if(notification->hasFormElements() && !notification->canShowToast())
+ {
+ LLScriptFloaterManager::getInstance()->onAddNotification(notification->getID());
+ }
+ else
+ {
+ LLToastPanel* notify_box = LLToastPanel::buidPanelFromNotification(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);
+ if(gAgent.isDoNotDisturb())
+ {
+ p.force_show = notification->getName() == "SystemMessage"
+ || notification->getName() == "GodMessage"
+ || notification->getPriority() >= NOTIFICATION_PRIORITY_HIGH;
}
- else
+
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
+ if(channel)
{
- LLToastPanel* notify_box = LLToastPanel::buidPanelFromNotification(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.get());
- if(channel)
- {
- channel->addToast(p);
- }
-
- // send a signal to the counter manager
- mNewNotificationSignal();
+ channel->addToast(p);
}
}
- else if (notify["sigtype"].asString() == "delete")
+
+ return false;
+}
+
+
+void LLScriptHandler::onDelete( LLNotificationPtr notification )
{
- if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName() || SCRIPT_LOAD_URL == notification->getName())
+ if(notification->hasFormElements() && !notification->canShowToast())
{
LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID());
}
else
{
- mChannel.get()->killToastByNotificationID(notification->getID());
+ mChannel.get()->removeToastByNotificationID(notification->getID());
}
}
- return false;
-}
+
//--------------------------------------------------------------------------
void LLScriptHandler::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());
-
LLNotificationPtr notification = LLNotifications::getInstance()->find(toast->getNotificationID());
- if( notification &&
- (SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName()) )
+ if( notification && notification->hasFormElements() && !notification->canShowToast())
{
LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID());
}
-}
-
-//--------------------------------------------------------------------------
-void LLScriptHandler::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/llnotificationstorage.cpp b/indra/newview/llnotificationstorage.cpp
index fb1adc7ddf..b6184f09bf 100644
--- a/indra/newview/llnotificationstorage.cpp
+++ b/indra/newview/llnotificationstorage.cpp
@@ -25,197 +25,111 @@
*/
#include "llviewerprecompiledheaders.h" // must be first include
+
#include "llnotificationstorage.h"
-#include "llxmlnode.h" // for linux compilers
+#include <string>
+#include <map>
-#include "llchannelmanager.h"
-#include "llscreenchannel.h"
-#include "llscriptfloater.h"
+#include "llerror.h"
+#include "llfile.h"
+#include "llnotifications.h"
+#include "llpointer.h"
+#include "llsd.h"
#include "llsdserialize.h"
-#include "llviewermessage.h"
+#include "llsingleton.h"
+#include "llregistry.h"
+#include "llviewermessage.h"
-//////////////////////////////////////////////////////////////////////////
+typedef boost::function<LLNotificationResponderInterface * (const LLSD& pParams)> responder_constructor_t;
-class LLResponderRegistry
+class LLResponderRegistry : public LLRegistrySingleton<std::string, responder_constructor_t, LLResponderRegistry>
{
-public:
-
- static void registerResponders();
-
- static LLNotificationResponderInterface* createResponder(const std::string& notification_name, const LLSD& params);
-
-private:
-
- template<typename RESPONDER_TYPE>
- static LLNotificationResponderInterface* create(const LLSD& params)
- {
- RESPONDER_TYPE* responder = new RESPONDER_TYPE();
- responder->fromLLSD(params);
- return responder;
- }
-
- typedef boost::function<LLNotificationResponderInterface* (const LLSD& params)> responder_constructor_t;
+ public:
+ template<typename RESPONDER_TYPE> static LLNotificationResponderInterface * create(const LLSD& pParams);
+ LLNotificationResponderInterface * createResponder(const std::string& pNotificationName, const LLSD& pParams);
+};
- static void add(const std::string& notification_name, const responder_constructor_t& ctr);
+template<typename RESPONDER_TYPE> LLNotificationResponderInterface * LLResponderRegistry::create(const LLSD& pParams)
+{
+ RESPONDER_TYPE* responder = new RESPONDER_TYPE();
+ responder->fromLLSD(pParams);
+ return responder;
+}
-private:
- typedef std::map<std::string, responder_constructor_t> build_map_t;
+LLNotificationResponderInterface * LLResponderRegistry::createResponder(const std::string& pNotificationName, const LLSD& pParams)
+{
+ responder_constructor_t * factoryFunc = (LLResponderRegistry::getValue(pNotificationName));
+
+ if(factoryFunc)
+ {
+ return (*factoryFunc)(pParams);
+ }
+
+ return NULL;
+}
- static build_map_t sBuildMap;
-};
+LLResponderRegistry::StaticRegistrar sRegisterObjectGiveItem("ObjectGiveItem", &LLResponderRegistry::create<LLOfferInfo>);
+LLResponderRegistry::StaticRegistrar sRegisterUserGiveItem("UserGiveItem", &LLResponderRegistry::create<LLOfferInfo>);
+LLResponderRegistry::StaticRegistrar sRegisterOfferInfo("offer_info", &LLResponderRegistry::create<LLOfferInfo>);
-//////////////////////////////////////////////////////////////////////////
-LLPersistentNotificationStorage::LLPersistentNotificationStorage()
+LLNotificationStorage::LLNotificationStorage(std::string pFileName)
+ : mFileName(pFileName)
{
- mFileName = gDirUtilp->getExpandedFilename ( LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml" );
}
-bool LLPersistentNotificationStorage::onPersistentChannelChanged(const LLSD& payload)
+LLNotificationStorage::~LLNotificationStorage()
{
- // we ignore "load" messages, but rewrite the persistence file on any other
- const std::string sigtype = payload["sigtype"].asString();
- if ("load" != sigtype)
- {
- saveNotifications();
- }
- return false;
}
-void LLPersistentNotificationStorage::saveNotifications()
+bool LLNotificationStorage::writeNotifications(const LLSD& pNotificationData) const
{
- // TODO - think about save optimization.
- llofstream notify_file(mFileName.c_str());
- if (!notify_file.is_open())
+ llofstream notifyFile(mFileName.c_str());
+ bool didFileOpen = notifyFile.is_open();
+
+ if (!didFileOpen)
{
- llwarns << "Failed to open " << mFileName << llendl;
- return;
+ LL_WARNS("LLNotificationStorage") << "Failed to open file '" << mFileName << "'" << LL_ENDL;
}
-
- LLSD output;
- LLSD& data = output["data"];
-
- LLNotificationChannelPtr history_channel = LLNotifications::instance().getChannel("Persistent");
- LLNotificationSet::iterator it = history_channel->begin();
-
- for ( ; history_channel->end() != it; ++it)
+ else
{
- LLNotificationPtr notification = *it;
-
- // After a notification was placed in Persist channel, it can become
- // responded, expired or canceled - in this case we are should not save it
- if(notification->isRespondedTo() || notification->isCancelled()
- || notification->isExpired())
- {
- continue;
- }
-
- data.append(notification->asLLSD());
+ LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter();
+ formatter->format(pNotificationData, notifyFile, LLSDFormatter::OPTIONS_PRETTY);
}
- LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter();
- formatter->format(output, notify_file, LLSDFormatter::OPTIONS_PRETTY);
+ return didFileOpen;
}
-void LLPersistentNotificationStorage::loadNotifications()
+bool LLNotificationStorage::readNotifications(LLSD& pNotificationData) const
{
- LLResponderRegistry::registerResponders();
+ bool didFileRead;
- LLNotifications::instance().getChannel("Persistent")->
- connectChanged(boost::bind(&LLPersistentNotificationStorage::onPersistentChannelChanged, this, _1));
+ pNotificationData.clear();
- llifstream notify_file(mFileName.c_str());
- if (!notify_file.is_open())
+ llifstream notifyFile(mFileName.c_str());
+ didFileRead = notifyFile.is_open();
+ if (!didFileRead)
{
- llwarns << "Failed to open " << mFileName << llendl;
- return;
+ LL_WARNS("LLNotificationStorage") << "Failed to open file '" << mFileName << "'" << LL_ENDL;
}
-
- LLSD input;
- LLPointer<LLSDParser> parser = new LLSDXMLParser();
- if (parser->parse(notify_file, input, LLSDSerialize::SIZE_UNLIMITED) < 0)
+ else
{
- llwarns << "Failed to parse open notifications" << llendl;
- return;
- }
-
- if (input.isUndefined())
- {
- return;
- }
-
- LLSD& data = input["data"];
- if (data.isUndefined())
- {
- return;
- }
-
- using namespace LLNotificationsUI;
- LLScreenChannel* notification_channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->
- findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
-
- LLNotifications& instance = LLNotifications::instance();
-
- for (LLSD::array_const_iterator notification_it = data.beginArray();
- notification_it != data.endArray();
- ++notification_it)
- {
- LLSD notification_params = *notification_it;
- LLNotificationPtr notification(new LLNotification(notification_params));
-
- LLNotificationResponderPtr responder(LLResponderRegistry::
- createResponder(notification_params["name"], notification_params["responder"]));
- notification->setResponseFunctor(responder);
-
- instance.add(notification);
-
- // hide script floaters so they don't confuse the user and don't overlap startup toast
- LLScriptFloaterManager::getInstance()->setFloaterVisible(notification->getID(), false);
-
- if(notification_channel)
+ LLPointer<LLSDParser> parser = new LLSDXMLParser();
+ didFileRead = (parser->parse(notifyFile, pNotificationData, LLSDSerialize::SIZE_UNLIMITED) >= 0);
+ if (!didFileRead)
{
- // hide saved toasts so they don't confuse the user
- notification_channel->hideToast(notification->getID());
+ LL_WARNS("LLNotificationStorage") << "Failed to parse open notifications from file '" << mFileName
+ << "'" << LL_ENDL;
}
}
-}
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-LLResponderRegistry::build_map_t LLResponderRegistry::sBuildMap;
-
-void LLResponderRegistry::registerResponders()
-{
- sBuildMap.clear();
-
- add("ObjectGiveItem", &create<LLOfferInfo>);
- add("UserGiveItem", &create<LLOfferInfo>);
+ return didFileRead;
}
-LLNotificationResponderInterface* LLResponderRegistry::createResponder(const std::string& notification_name, const LLSD& params)
+LLNotificationResponderInterface * LLNotificationStorage::createResponder(const std::string& pNotificationName, const LLSD& pParams) const
{
- build_map_t::const_iterator it = sBuildMap.find(notification_name);
- if(sBuildMap.end() == it)
- {
- return NULL;
- }
- responder_constructor_t ctr = it->second;
- return ctr(params);
+ return LLResponderRegistry::getInstance()->createResponder(pNotificationName, pParams);
}
-
-void LLResponderRegistry::add(const std::string& notification_name, const responder_constructor_t& ctr)
-{
- if(sBuildMap.find(notification_name) != sBuildMap.end())
- {
- llwarns << "Responder is already registered : " << notification_name << llendl;
- llassert(!"Responder already registered");
- }
- sBuildMap[notification_name] = ctr;
-}
-
-// EOF
diff --git a/indra/newview/llnotificationstorage.h b/indra/newview/llnotificationstorage.h
index 8635c797c0..7aabf7d09e 100644
--- a/indra/newview/llnotificationstorage.h
+++ b/indra/newview/llnotificationstorage.h
@@ -27,32 +27,27 @@
#ifndef LL_NOTIFICATIONSTORAGE_H
#define LL_NOTIFICATIONSTORAGE_H
-#include "llnotifications.h"
-
-// Class that saves not responded(unread) notifications.
-// Unread notifications are saved in open_notifications.xml in SL account folder
-//
-// Notifications that should be saved(if unread) are marked with persist="true" in notifications.xml
-// Notifications using functor responders are saved automatically (see llviewermessage.cpp
-// lure_callback_reg for example).
-// Notifications using object responders(LLOfferInfo) need additional tuning. Responder object should
-// be a) serializable(implement LLNotificationResponderInterface),
-// b) registered with LLResponderRegistry (found in llnotificationstorage.cpp).
-class LLPersistentNotificationStorage : public LLSingleton<LLPersistentNotificationStorage>
-{
- LOG_CLASS(LLPersistentNotificationStorage);
-public:
+#include <string>
- LLPersistentNotificationStorage();
+#include "llerror.h"
- void saveNotifications();
+class LLNotificationResponderInterface;
+class LLSD;
- void loadNotifications();
+class LLNotificationStorage
+{
+ LOG_CLASS(LLNotificationStorage);
+public:
+ LLNotificationStorage(std::string pFileName);
+ ~LLNotificationStorage();
-private:
+protected:
+ bool writeNotifications(const LLSD& pNotificationData) const;
+ bool readNotifications(LLSD& pNotificationData) const;
- bool onPersistentChannelChanged(const LLSD& payload);
+ LLNotificationResponderInterface* createResponder(const std::string& pNotificationName, const LLSD& pParams) const;
+private:
std::string mFileName;
};
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index e397cfa046..a85335f1ba 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -28,8 +28,8 @@
#include "llviewerprecompiledheaders.h" // must be first include
#include "llfloaterreg.h"
-#include "llnearbychat.h"
-#include "llnearbychatbar.h"
+#include "llfloaterimnearbychat.h"
+#include "llfloaterimnearbychat.h"
#include "llnotificationhandler.h"
#include "llnotifications.h"
#include "lltoastnotifypanel.h"
@@ -41,15 +41,13 @@
using namespace LLNotificationsUI;
//--------------------------------------------------------------------------
-LLTipHandler::LLTipHandler(e_notification_type type, const LLSD& id)
+LLTipHandler::LLTipHandler()
+: LLSystemNotificationHandler("NotificationTips", "notifytip")
{
- mType = type;
-
// Getting a Channel for our notifications
LLScreenChannel* channel = LLChannelManager::getInstance()->createNotificationChannel();
if(channel)
{
- channel->setOnRejectToastCallback(boost::bind(&LLTipHandler::onRejectToast, this, _1));
mChannel = channel->getHandle();
}
}
@@ -68,102 +66,67 @@ void LLTipHandler::initChannel()
}
//--------------------------------------------------------------------------
-bool LLTipHandler::processNotification(const LLSD& notify)
+bool LLTipHandler::processNotification(const LLNotificationPtr& notification)
{
if(mChannel.isDead())
{
return false;
}
- LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());
-
- if(!notification)
- return false;
-
// arrange a channel on a screen
if(!mChannel.get()->getVisible())
{
initChannel();
}
- if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
- {
// archive message in nearby chat
- if (LLHandlerUtil::canLogToNearbyChat(notification))
- {
- LLHandlerUtil::logToNearbyChat(notification, CHAT_SOURCE_SYSTEM);
-
- // don't show toast if Nearby Chat is opened
- LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
- LLNearbyChatBar* nearby_chat_bar = LLNearbyChatBar::getInstance();
- if (!nearby_chat_bar->isMinimized() && nearby_chat_bar->getVisible() && nearby_chat->getVisible())
- {
- return false;
- }
- }
-
- std::string session_name = notification->getPayload()["SESSION_NAME"];
- const std::string name = notification->getSubstitutions()["NAME"];
- if (session_name.empty())
- {
- session_name = name;
- }
- LLUUID from_id = notification->getPayload()["from_id"];
- if (LLHandlerUtil::canLogToIM(notification))
- {
- LLHandlerUtil::logToIM(IM_NOTHING_SPECIAL, session_name, name,
- notification->getMessage(), from_id, from_id);
- }
-
- if (LLHandlerUtil::canSpawnIMSession(notification))
- {
- LLHandlerUtil::spawnIMSession(name, from_id);
- }
+ if (notification->canLogToChat())
+ {
+ LLHandlerUtil::logToNearbyChat(notification, CHAT_SOURCE_SYSTEM);
- // don't spawn toast for inventory accepted/declined offers if respective IM window is open (EXT-5909)
- if (!LLHandlerUtil::canSpawnToast(notification))
+ // don't show toast if Nearby Chat is opened
+ LLFloaterIMNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat");
+ if (nearby_chat->isChatVisible())
{
return false;
}
+ }
- LLToastPanel* notify_box = LLToastPanel::buidPanelFromNotification(notification);
-
- LLToast::Params p;
- p.notif_id = notification->getID();
- p.notification = notification;
- p.lifetime_secs = gSavedSettings.getS32("NotificationTipToastLifeTime");
- p.panel = notify_box;
- p.is_tip = true;
- p.can_be_stored = false;
-
- removeExclusiveNotifications(notification);
-
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
- if(channel)
- channel->addToast(p);
+ std::string session_name = notification->getPayload()["SESSION_NAME"];
+ const std::string name = notification->getSubstitutions()["NAME"];
+ if (session_name.empty())
+ {
+ session_name = name;
}
- else if (notify["sigtype"].asString() == "delete")
+ LLUUID from_id = notification->getPayload()["from_id"];
+ if (notification->canLogToIM())
{
- mChannel.get()->killToastByNotificationID(notification->getID());
+ LLHandlerUtil::logToIM(IM_NOTHING_SPECIAL, session_name, name,
+ notification->getMessage(), from_id, from_id);
}
- return false;
-}
-
-//--------------------------------------------------------------------------
-void LLTipHandler::onDeleteToast(LLToast* toast)
-{
-}
-
-//--------------------------------------------------------------------------
-void LLTipHandler::onRejectToast(const LLUUID& id)
-{
- LLNotificationPtr notification = LLNotifications::instance().find(id);
+ if (notification->canLogToIM() && notification->hasFormElements())
+ {
+ LLHandlerUtil::spawnIMSession(name, from_id);
+ }
- if (notification
- && LLNotificationManager::getInstance()->getHandlerForNotification(
- notification->getType()) == this)
+ if (notification->canLogToIM() && LLHandlerUtil::isIMFloaterOpened(notification))
{
- LLNotifications::instance().cancel(notification);
+ return false;
}
+
+ LLToastPanel* notify_box = LLToastPanel::buidPanelFromNotification(notification);
+
+ LLToast::Params p;
+ p.notif_id = notification->getID();
+ p.notification = notification;
+ p.lifetime_secs = gSavedSettings.getS32("NotificationTipToastLifeTime");
+ p.panel = notify_box;
+ p.is_tip = true;
+ p.can_be_stored = false;
+
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
+ if(channel)
+ channel->addToast(p);
+ return false;
}
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index ef5ef2ddc8..c15b6bd0d3 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -117,6 +117,8 @@ public:
registrar.add("Gear.Rename", boost::bind(&LLOutfitListGearMenu::onRename, this));
registrar.add("Gear.Delete", boost::bind(&LLOutfitsList::removeSelected, mOutfitList));
registrar.add("Gear.Create", boost::bind(&LLOutfitListGearMenu::onCreate, this, _2));
+ registrar.add("Gear.Collapse", boost::bind(&LLOutfitsList::collapse_all_folders, mOutfitList));
+ registrar.add("Gear.Expand", boost::bind(&LLOutfitsList::expand_all_folders, mOutfitList));
registrar.add("Gear.WearAdd", boost::bind(&LLOutfitListGearMenu::onAdd, this));
@@ -743,6 +745,34 @@ void LLOutfitsList::getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const
}
}
+void LLOutfitsList::collapse_all_folders()
+{
+ for (outfits_map_t::iterator iter = mOutfitsMap.begin();
+ iter != mOutfitsMap.end();
+ ++iter)
+ {
+ LLAccordionCtrlTab* tab = iter->second;
+ if(tab && tab->isExpanded())
+ {
+ tab->changeOpenClose(true);
+ }
+ }
+}
+
+void LLOutfitsList::expand_all_folders()
+{
+ for (outfits_map_t::iterator iter = mOutfitsMap.begin();
+ iter != mOutfitsMap.end();
+ ++iter)
+ {
+ LLAccordionCtrlTab* tab = iter->second;
+ if(tab && !tab->isExpanded())
+ {
+ tab->changeOpenClose(false);
+ }
+ }
+}
+
boost::signals2::connection LLOutfitsList::setSelectionChangeCallback(selection_change_callback_t cb)
{
return mSelectionChangeSignal.connect(cb);
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
index a0598737f1..2e3fb3f488 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -108,6 +108,16 @@ public:
*/
bool hasItemSelected();
+ /**
+ Collapses all outfit accordions.
+ */
+ void collapse_all_folders();
+ /**
+ Expands all outfit accordions.
+ */
+ void expand_all_folders();
+
+
private:
void onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp
index 85626d8783..6c26073d5b 100644
--- a/indra/newview/lloutputmonitorctrl.cpp
+++ b/indra/newview/lloutputmonitorctrl.cpp
@@ -28,6 +28,7 @@
#include "lloutputmonitorctrl.h"
// library includes
+#include "llfloaterreg.h"
#include "llui.h"
// viewer includes
@@ -72,8 +73,8 @@ LLOutputMonitorCtrl::LLOutputMonitorCtrl(const LLOutputMonitorCtrl::Params& p)
mAutoUpdate(p.auto_update),
mSpeakerId(p.speaker_id),
mIsAgentControl(false),
- mIsSwitchDirty(false),
- mShouldSwitchOn(false)
+ mIndicatorToggled(false),
+ mShowParticipantsSpeaking(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);
@@ -114,26 +115,6 @@ 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 LLVoiceClient::getInstance() to ask if that agent-id is muted, is
@@ -156,6 +137,24 @@ void LLOutputMonitorCtrl::draw()
}
}
+ if ((mPower == 0.f && !mIsTalking) && mShowParticipantsSpeaking)
+ {
+ std::set<LLUUID> participant_uuids;
+ LLVoiceClient::instance().getParticipantList(participant_uuids);
+ std::set<LLUUID>::const_iterator part_it = participant_uuids.begin();
+
+ F32 power = 0;
+ for (; part_it != participant_uuids.end(); ++part_it)
+ {
+ power = LLVoiceClient::instance().getCurrentPower(*part_it);
+ if (power)
+ {
+ mPower = power;
+ break;
+ }
+ }
+ }
+
LLPointer<LLUIImage> icon;
if (mIsMuted)
{
@@ -241,14 +240,34 @@ void LLOutputMonitorCtrl::draw()
gl_rect_2d(0, monh, monw, 0, sColorBound, FALSE);
}
-void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id, const LLUUID& session_id/* = LLUUID::null*/)
+// virtual
+BOOL LLOutputMonitorCtrl::handleMouseUp(S32 x, S32 y, MASK mask)
+{
+ if (mSpeakerId != gAgentID && !mShowParticipantsSpeaking)
+ {
+ LLFloaterReg::showInstance("floater_voice_volume", LLSD().with("avatar_id", mSpeakerId));
+ }
+ else if(mShowParticipantsSpeaking)
+ {
+ LLFloaterReg::showInstance("chat_voice", LLSD());
+ }
+
+ return TRUE;
+}
+
+void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id, const LLUUID& session_id/* = LLUUID::null*/, bool show_other_participants_speaking /* = false */)
{
if (speaker_id.isNull() && mSpeakerId.notNull())
{
LLSpeakingIndicatorManager::unregisterSpeakingIndicator(mSpeakerId, this);
+ switchIndicator(false);
+ mSpeakerId = speaker_id;
}
- if (speaker_id.isNull() || speaker_id == mSpeakerId) return;
+ if (speaker_id.isNull() || (speaker_id == mSpeakerId))
+ {
+ return;
+ }
if (mSpeakerId.notNull())
{
@@ -256,6 +275,7 @@ void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id, const LLUUID& s
LLSpeakingIndicatorManager::unregisterSpeakingIndicator(mSpeakerId, this);
}
+ mShowParticipantsSpeaking = show_other_participants_speaking;
mSpeakerId = speaker_id;
LLSpeakingIndicatorManager::registerSpeakingIndicator(mSpeakerId, this, session_id);
@@ -264,12 +284,12 @@ void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id, const LLUUID& s
{
if (speaker_id == gAgentID)
{
- setIsMuted(false);
+ mIsMuted = false;
}
else
{
// check only blocking on voice. EXT-3542
- setIsMuted(LLMuteList::getInstance()->isMuted(mSpeakerId, LLMute::flagVoiceChat));
+ mIsMuted = LLMuteList::getInstance()->isMuted(mSpeakerId, LLMute::flagVoiceChat);
LLMuteList::getInstance()->addObserver(this);
}
}
@@ -278,32 +298,34 @@ void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id, const LLUUID& s
void LLOutputMonitorCtrl::onChange()
{
// check only blocking on voice. EXT-3542
- setIsMuted(LLMuteList::getInstance()->isMuted(mSpeakerId, LLMute::flagVoiceChat));
+ mIsMuted = 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 in next draw when parents chain becomes visible.
- else
- {
- LL_DEBUGS("SpeakingIndicator") << "Indicator is not in visible chain, parent won't be notified: " << mSpeakerId << LL_ENDL;
- mIsSwitchDirty = true;
- mShouldSwitchOn = switch_on;
- }
+ if(getVisible() != (BOOL)switch_on)
+ {
+ setVisible(switch_on);
+
+ //Let parent adjust positioning of icons adjacent to speaker indicator
+ //(when speaker indicator hidden, adjacent icons move to right and when speaker
+ //indicator visible, adjacent icons move to the left)
+ if (getParent() && getParent()->isInVisibleChain())
+ {
+ notifyParentVisibilityChanged();
+ //Ignore toggled state in case it was set when parent visibility was hidden
+ mIndicatorToggled = false;
+ }
+ else
+ {
+ //Makes sure to only adjust adjacent icons when parent becomes visible
+ //(!mIndicatorToggled ensures that changes of TFT and FTF are discarded, real state changes are TF or FT)
+ mIndicatorToggled = !mIndicatorToggled;
+ }
+
+ }
}
//////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h
index 2d23753d46..a346909027 100644
--- a/indra/newview/lloutputmonitorctrl.h
+++ b/indra/newview/lloutputmonitorctrl.h
@@ -28,10 +28,10 @@
#define LL_LLOUTPUTMONITORCTRL_H
#include "v4color.h"
-#include "llview.h"
+#include "../llui/llview.h"
#include "llmutelist.h"
#include "llspeakingindicatormanager.h"
-#include "lluiimage.h"
+#include "../llui/lluiimage.h"
class LLTextBox;
class LLUICtrlFactory;
@@ -68,19 +68,19 @@ public:
// llview overrides
virtual void draw();
+ virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
void setPower(F32 val);
F32 getPower(F32 val) const { return mPower; }
- bool getIsMuted() const { return mIsMuted; }
- void setIsMuted(bool val) { mIsMuted = val; }
-
// 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 setShowParticipantsSpeaking(bool show) { mShowParticipantsSpeaking = show; }
+
/**
* Sets avatar UUID to interact with voice channel.
*
@@ -89,7 +89,7 @@ public:
* If this parameter is set registered indicator will be shown only in voice channel
* which has the same session id (EXT-5562).
*/
- void setSpeakerId(const LLUUID& speaker_id, const LLUUID& session_id = LLUUID::null);
+ void setSpeakerId(const LLUUID& speaker_id, const LLUUID& session_id = LLUUID::null, bool show_other_participants_speaking = false);
//called by mute list
virtual void onChange();
@@ -105,6 +105,8 @@ public:
* It will be applied in next draw and parent will be notified.
*/
virtual void switchIndicator(bool switch_on);
+ bool getIndicatorToggled() { return mIndicatorToggled;}
+ void setIndicatorToggled(bool value) { mIndicatorToggled = value;}
private:
@@ -131,6 +133,7 @@ private:
bool mIsAgentControl;
bool mIsMuted;
bool mIsTalking;
+ bool mShowParticipantsSpeaking;
LLPointer<LLUIImage> mImageMute;
LLPointer<LLUIImage> mImageOff;
LLPointer<LLUIImage> mImageOn;
@@ -144,9 +147,7 @@ private:
/** uuid of a speaker being monitored */
LLUUID mSpeakerId;
- /** indicates if the instance is dirty and should notify parent */
- bool mIsSwitchDirty;
- bool mShouldSwitchOn;
+ bool mIndicatorToggled;
};
#endif
diff --git a/indra/newview/llpanelblockedlist.cpp b/indra/newview/llpanelblockedlist.cpp
index 5c85ec438c..115114bb53 100644
--- a/indra/newview/llpanelblockedlist.cpp
+++ b/indra/newview/llpanelblockedlist.cpp
@@ -30,15 +30,23 @@
// library include
#include "llavatarname.h"
+#include "llfiltereditor.h"
#include "llfloater.h"
#include "llfloaterreg.h"
#include "llnotificationsutil.h"
#include "llscrolllistctrl.h"
+#include "llmenubutton.h"
// project include
+#include "llavatarlistitem.h"
+#include "llblocklist.h"
+#include "llblockedlistitem.h"
#include "llfloateravatarpicker.h"
#include "llfloatersidepanelcontainer.h"
+#include "llinventorylistitem.h"
+#include "llinventorymodel.h"
#include "llsidetraypanelcontainer.h"
+#include "llviewercontrol.h"
static LLRegisterPanelClassWrapper<LLPanelBlockedList> t_panel_blocked_list("panel_block_list_sidetray");
@@ -54,26 +62,47 @@ const std::string BLOCKED_PARAM_NAME = "blocked_to_select";
LLPanelBlockedList::LLPanelBlockedList()
: LLPanel()
{
- mCommitCallbackRegistrar.add("Block.ClickPick", boost::bind(&LLPanelBlockedList::onPickBtnClick, this));
- mCommitCallbackRegistrar.add("Block.ClickBlockByName", boost::bind(&LLPanelBlockedList::onBlockByNameClick, this));
- mCommitCallbackRegistrar.add("Block.ClickRemove", boost::bind(&LLPanelBlockedList::onRemoveBtnClick, this));
+ mCommitCallbackRegistrar.add("Block.Action", boost::bind(&LLPanelBlockedList::onCustomAction, this, _2));
+ mEnableCallbackRegistrar.add("Block.Check", boost::bind(&LLPanelBlockedList::isActionChecked, this, _2));
}
-LLPanelBlockedList::~LLPanelBlockedList()
+void LLPanelBlockedList::removePicker()
{
- LLMuteList::getInstance()->removeObserver(this);
+ if(mPicker.get())
+ {
+ mPicker.get()->closeFloater();
+ }
}
BOOL LLPanelBlockedList::postBuild()
{
- mBlockedList = getChild<LLScrollListCtrl>("blocked");
+ mBlockedList = getChild<LLBlockList>("blocked");
mBlockedList->setCommitOnSelectionChange(TRUE);
+ this->setVisibleCallback(boost::bind(&LLPanelBlockedList::removePicker, this));
- childSetCommitCallback("back", boost::bind(&LLPanelBlockedList::onBackBtnClick, this), NULL);
+ switch (gSavedSettings.getU32("BlockPeopleSortOrder"))
+ {
+ case E_SORT_BY_NAME:
+ mBlockedList->sortByName();
+ break;
+
+ case E_SORT_BY_TYPE:
+ mBlockedList->sortByType();
+ break;
+ default:
+ llwarns << "Unrecognized sort order for blocked list" << llendl;
+ break;
+ }
+
+ // Use the context menu of the Block list for the Block tab gear menu.
+ LLToggleableMenu* blocked_gear_menu = mBlockedList->getContextMenu();
+ if (blocked_gear_menu)
+ {
+ getChild<LLMenuButton>("blocked_gear_btn")->setMenu(blocked_gear_menu, LLMenuButton::MP_BOTTOM_LEFT);
+ }
- LLMuteList::getInstance()->addObserver(this);
-
- refreshBlockedList();
+ getChild<LLButton>("unblock_btn")->setCommitCallback(boost::bind(&LLPanelBlockedList::unblockItem, this));
+ getChild<LLFilterEditor>("blocked_filter_input")->setCommitCallback(boost::bind(&LLPanelBlockedList::onFilterEdit, this, _2));
return LLPanel::postBuild();
}
@@ -94,97 +123,112 @@ void LLPanelBlockedList::onOpen(const LLSD& key)
void LLPanelBlockedList::selectBlocked(const LLUUID& mute_id)
{
- mBlockedList->selectByID(mute_id);
+ mBlockedList->selectItemByUUID(mute_id);
}
void LLPanelBlockedList::showPanelAndSelect(const LLUUID& idToSelect)
{
- LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD().with(BLOCKED_PARAM_NAME, idToSelect));
+ LLFloaterSidePanelContainer::showPanel("people", "panel_people",
+ LLSD().with("people_panel_tab_name", "blocked_panel").with(BLOCKED_PARAM_NAME, idToSelect));
}
//////////////////////////////////////////////////////////////////////////
// Private Section
//////////////////////////////////////////////////////////////////////////
-void LLPanelBlockedList::refreshBlockedList()
+void LLPanelBlockedList::updateButtons()
{
- mBlockedList->deleteAllItems();
+ bool hasSelected = NULL != mBlockedList->getSelectedItem();
+ getChildView("unblock_btn")->setEnabled(hasSelected);
+ getChildView("blocked_gear_btn")->setEnabled(hasSelected);
+}
- std::vector<LLMute> mutes = LLMuteList::getInstance()->getMutes();
- std::vector<LLMute>::iterator it;
- for (it = mutes.begin(); it != mutes.end(); ++it)
+void LLPanelBlockedList::unblockItem()
+{
+ LLBlockedListItem* item = mBlockedList->getBlockedItem();
+ if (item)
{
- LLScrollListItem::Params item_p;
- item_p.enabled(TRUE);
- item_p.value(it->mID); // link UUID of blocked item with ScrollListItem
- item_p.columns.add().column("item_name").value(it->mName);//.type("text");
- item_p.columns.add().column("item_type").value(it->getDisplayType());//.type("text").width(111);
-
- mBlockedList->addRow(item_p, ADD_BOTTOM);
+ LLMute mute(item->getUUID(), item->getName());
+ LLMuteList::instance().remove(mute);
}
}
-void LLPanelBlockedList::updateButtons()
+void LLPanelBlockedList::onCustomAction(const LLSD& userdata)
{
- bool hasSelected = NULL != mBlockedList->getFirstSelected();
- getChildView("Unblock")->setEnabled(hasSelected);
-}
-
+ const std::string command_name = userdata.asString();
-
-void LLPanelBlockedList::onBackBtnClick()
-{
- LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent());
- if(parent)
+ if ("block_obj_by_name" == command_name)
+ {
+ blockObjectByName();
+ }
+ else if ("block_res_by_name" == command_name)
+ {
+ blockResidentByName();
+ }
+ else if ("sort_by_name" == command_name)
+ {
+ mBlockedList->sortByName();
+ gSavedSettings.setU32("BlockPeopleSortOrder", E_SORT_BY_NAME);
+ }
+ else if ("sort_by_type" == command_name)
{
- parent->openPreviousPanel();
+ mBlockedList->sortByType();
+ gSavedSettings.setU32("BlockPeopleSortOrder", E_SORT_BY_TYPE);
}
}
-void LLPanelBlockedList::onRemoveBtnClick()
+BOOL LLPanelBlockedList::isActionChecked(const LLSD& userdata)
{
- std::string name = mBlockedList->getSelectedItemLabel();
- LLUUID id = mBlockedList->getStringUUIDSelectedItem();
- LLMute mute(id, name);
-
- S32 last_selected = mBlockedList->getFirstSelectedIndex();
- if (LLMuteList::getInstance()->remove(mute))
+ std::string item = userdata.asString();
+ U32 sort_order = gSavedSettings.getU32("BlockPeopleSortOrder");
+
+ if ("sort_by_name" == item)
+ {
+ return E_SORT_BY_NAME == sort_order;
+ }
+ else if ("sort_by_type" == item)
{
- // Above removals may rebuild this dialog.
-
- if (last_selected == mBlockedList->getItemCount())
- {
- // we were on the last item, so select the last item again
- mBlockedList->selectNthItem(last_selected - 1);
- }
- else
- {
- // else select the item after the last item previously selected
- mBlockedList->selectNthItem(last_selected);
- }
+ return E_SORT_BY_TYPE == sort_order;
}
+
+ return false;
}
-void LLPanelBlockedList::onPickBtnClick()
+void LLPanelBlockedList::blockResidentByName()
{
const BOOL allow_multiple = FALSE;
const BOOL close_on_select = TRUE;
- /*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
- // addDependentFloater(picker);
+
+ LLView * button = findChild<LLButton>("plus_btn", TRUE);
+ LLFloater* root_floater = gFloaterView->getParentFloater(this);
+ LLFloaterAvatarPicker * picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelBlockedList::callbackBlockPicked, this, _1, _2),
+ allow_multiple, close_on_select, FALSE, root_floater->getName(), button);
+
+ if (root_floater)
+ {
+ root_floater->addDependentFloater(picker);
+ }
+
+ mPicker = picker->getHandle();
}
-void LLPanelBlockedList::onBlockByNameClick()
+void LLPanelBlockedList::blockObjectByName()
{
LLFloaterGetBlockedObjectName::show(&LLPanelBlockedList::callbackBlockByName);
}
+void LLPanelBlockedList::onFilterEdit(const std::string& search_string)
+{
+ std::string filter = search_string;
+ LLStringUtil::trimHead(filter);
+
+ mBlockedList->setNameFilter(filter);
+}
+
void LLPanelBlockedList::callbackBlockPicked(const uuid_vec_t& ids, const std::vector<LLAvatarName> names)
{
if (names.empty() || ids.empty()) return;
- LLMute mute(ids[0], names[0].getLegacyName(), LLMute::AGENT);
+ LLMute mute(ids[0], names[0].getAccountName(), LLMute::AGENT);
LLMuteList::getInstance()->add(mute);
showPanelAndSelect(mute.mID);
}
diff --git a/indra/newview/llpanelblockedlist.h b/indra/newview/llpanelblockedlist.h
index 74ad82e32d..07f0437656 100644
--- a/indra/newview/llpanelblockedlist.h
+++ b/indra/newview/llpanelblockedlist.h
@@ -30,21 +30,15 @@
#include "llpanel.h"
#include "llmutelist.h"
#include "llfloater.h"
-// #include <vector>
-// class LLButton;
-// class LLLineEditor;
-// class LLMessageSystem;
-// class LLUUID;
class LLAvatarName;
-class LLScrollListCtrl;
+class LLBlockList;
-class LLPanelBlockedList
- : public LLPanel, public LLMuteListObserver
+class LLPanelBlockedList : public LLPanel
{
public:
LLPanelBlockedList();
- ~LLPanelBlockedList();
+ ~LLPanelBlockedList(){};
virtual BOOL postBuild();
virtual void draw();
@@ -59,25 +53,33 @@ public:
* If it is LLUUID::null, nothing will be selected.
*/
static void showPanelAndSelect(const LLUUID& idToSelect);
-
- // LLMuteListObserver callback interface implementation.
- /* virtual */ void onChange() { refreshBlockedList();}
private:
- void refreshBlockedList();
+
+ typedef enum e_sort_oder{
+ E_SORT_BY_NAME = 0,
+ E_SORT_BY_TYPE = 1,
+ } ESortOrder;
+
+ void removePicker();
void updateButtons();
// UI callbacks
- void onBackBtnClick();
- void onRemoveBtnClick();
- void onPickBtnClick();
- void onBlockByNameClick();
+ void unblockItem();
+ void blockResidentByName();
+ void blockObjectByName();
+ void onFilterEdit(const std::string& search_string);
+
+ // List commnads
+ void onCustomAction(const LLSD& userdata);
+ BOOL isActionChecked(const LLSD& userdata);
void callbackBlockPicked(const uuid_vec_t& ids, const std::vector<LLAvatarName> names);
static void callbackBlockByName(const std::string& text);
private:
- LLScrollListCtrl* mBlockedList;
+ LLBlockList* mBlockedList;
+ LLHandle<LLFloater> mPicker;
};
//-----------------------------------------------------------------------------
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index d58d6d536c..6b9edcb07c 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -835,11 +835,11 @@ BOOL LLPanelEditWearable::isDirty() const
BOOL isDirty = FALSE;
if (mWearablePtr)
{
- if (mWearablePtr->isDirty() ||
- mWearableItem->getName().compare(mNameEditor->getText()) != 0)
- {
- isDirty = TRUE;
- }
+ if (mWearablePtr->isDirty() ||
+ ( mWearableItem && mNameEditor && mWearableItem->getName().compare(mNameEditor->getText()) != 0 ))
+ {
+ isDirty = TRUE;
+ }
}
return isDirty;
}
@@ -1186,7 +1186,7 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show, BOOL dis
void LLPanelEditWearable::showDefaultSubpart()
{
- changeCamera(3);
+ changeCamera(0);
}
void LLPanelEditWearable::onTabExpandedCollapsed(const LLSD& param, U8 index)
diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h
index b494c7d403..0e6f5b8924 100644
--- a/indra/newview/llpanelgroup.h
+++ b/indra/newview/llpanelgroup.h
@@ -33,7 +33,7 @@
class LLOfferInfo;
-const S32 UPDATE_MEMBERS_PER_FRAME = 500;
+const F32 UPDATE_MEMBERS_SECONDS_PER_FRAME = 0.005; // 5ms
// Forward declares
class LLPanelGroupTab;
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index bc594b5517..0cd93b330a 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -28,8 +28,10 @@
#include "llpanelgroupgeneral.h"
-#include "lluictrlfactory.h"
+#include "llavatarnamecache.h"
#include "llagent.h"
+#include "llsdparam.h"
+#include "lluictrlfactory.h"
#include "roles_constants.h"
// UI elements
@@ -77,13 +79,18 @@ LLPanelGroupGeneral::LLPanelGroupGeneral()
mCtrlReceiveNotices(NULL),
mCtrlListGroup(NULL),
mActiveTitleLabel(NULL),
- mComboActiveTitle(NULL)
+ mComboActiveTitle(NULL),
+ mAvatarNameCacheConnection()
{
}
LLPanelGroupGeneral::~LLPanelGroupGeneral()
{
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
}
BOOL LLPanelGroupGeneral::postBuild()
@@ -313,11 +320,10 @@ void LLPanelGroupGeneral::activate()
{
LLGroupMgr::getInstance()->sendGroupTitlesRequest(mGroupID);
LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mGroupID);
-
if (!gdatap || !gdatap->isMemberDataComplete() )
{
- LLGroupMgr::getInstance()->sendGroupMembersRequest(mGroupID);
+ LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID);
}
mFirstUse = FALSE;
@@ -697,76 +703,48 @@ void LLPanelGroupGeneral::updateMembers()
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
- if (!mListVisibleMembers || !gdatap
+ if (!mListVisibleMembers
+ || !gdatap
|| !gdatap->isMemberDataComplete()
|| gdatap->mMembers.empty())
{
return;
}
- static LLTimer all_timer;
- static LLTimer sd_timer;
- static LLTimer element_timer;
+ LLTimer update_time;
+ update_time.setTimerExpirySec(UPDATE_MEMBERS_SECONDS_PER_FRAME);
- all_timer.reset();
- S32 i = 0;
+ LLAvatarName av_name;
- for( ; mMemberProgress != gdatap->mMembers.end() && i<UPDATE_MEMBERS_PER_FRAME;
- ++mMemberProgress, ++i)
+ for( ; mMemberProgress != gdatap->mMembers.end() && !update_time.hasExpired();
+ ++mMemberProgress)
{
- //llinfos << "Adding " << iter->first << ", " << iter->second->getTitle() << llendl;
LLGroupMemberData* member = mMemberProgress->second;
if (!member)
{
continue;
}
- // Owners show up in bold.
- std::string style = "NORMAL";
- sd_timer.reset();
- LLSD row;
- row["id"] = member->getID();
-
- row["columns"][0]["column"] = "name";
- row["columns"][0]["font"]["name"] = "SANSSERIF_SMALL";
- row["columns"][0]["font"]["style"] = style;
- // value is filled in by name list control
-
- row["columns"][1]["column"] = "title";
- 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"] = "status";
- row["columns"][2]["value"] = status;
- row["columns"][2]["font"]["name"] = "SANSSERIF_SMALL";
- row["columns"][2]["font"]["style"] = style;
-
- sSDTime += sd_timer.getElapsedTimeF32();
- element_timer.reset();
- LLScrollListItem* member_row = mListVisibleMembers->addElement(row);
-
- if ( member->isOwner() )
+ if (LLAvatarNameCache::get(mMemberProgress->first, &av_name))
+ {
+ addMember(mMemberProgress->second);
+ }
+ else
{
- LLScrollListText* name_textp = dynamic_cast<LLScrollListText*>(member_row->getColumn(0));
- if (name_textp)
- name_textp->setFontStyle(LLFontGL::BOLD);
+ // If name is not cached, onNameCache() should be called when it is cached and add this member to list.
+ // *TODO : Use a callback per member, not for the panel group.
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+ mAvatarNameCacheConnection = LLAvatarNameCache::get(mMemberProgress->first, boost::bind(&LLPanelGroupGeneral::onNameCache, this, gdatap->getMemberVersion(), member, _2));
}
- sElementTime += element_timer.getElapsedTimeF32();
}
- sAllTime += all_timer.getElapsedTimeF32();
- llinfos << "Updated " << i << " of " << UPDATE_MEMBERS_PER_FRAME << "members in the list." << llendl;
if (mMemberProgress == gdatap->mMembers.end())
{
- llinfos << " member list completed." << llendl;
+ lldebugs << " member list completed." << llendl;
mListVisibleMembers->setEnabled(TRUE);
-
- llinfos << "All Time: " << sAllTime << llendl;
- llinfos << "SD Time: " << sSDTime << llendl;
- llinfos << "Element Time: " << sElementTime << llendl;
}
else
{
@@ -775,6 +753,45 @@ void LLPanelGroupGeneral::updateMembers()
}
}
+void LLPanelGroupGeneral::addMember(LLGroupMemberData* member)
+{
+ LLNameListCtrl::NameItem item_params;
+ item_params.value = member->getID();
+
+ LLScrollListCell::Params column;
+ item_params.columns.add().column("name").font.name("SANSSERIF_SMALL");
+
+ item_params.columns.add().column("title").value(member->getTitle()).font.name("SANSSERIF_SMALL");
+
+ item_params.columns.add().column("status").value(member->getOnlineStatus()).font.name("SANSSERIF_SMALL");
+
+ LLScrollListItem* member_row = mListVisibleMembers->addNameItemRow(item_params);
+
+ if ( member->isOwner() )
+ {
+ LLScrollListText* name_textp = dynamic_cast<LLScrollListText*>(member_row->getColumn(0));
+ if (name_textp)
+ name_textp->setFontStyle(LLFontGL::BOLD);
+ }
+}
+
+void LLPanelGroupGeneral::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name)
+{
+ mAvatarNameCacheConnection.disconnect();
+
+ LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
+
+ if (!gdatap
+ || !gdatap->isMemberDataComplete()
+ || gdatap->getMemberVersion() != update_id)
+ {
+ // Stale data
+ return;
+ }
+
+ addMember(member);
+}
+
void LLPanelGroupGeneral::updateChanged()
{
// List all the controls we want to check for changes...
diff --git a/indra/newview/llpanelgroupgeneral.h b/indra/newview/llpanelgroupgeneral.h
index 88c092c461..b7f4a01139 100644
--- a/indra/newview/llpanelgroupgeneral.h
+++ b/indra/newview/llpanelgroupgeneral.h
@@ -38,6 +38,7 @@ class LLNameListCtrl;
class LLCheckBoxCtrl;
class LLComboBox;
class LLSpinCtrl;
+class LLAvatarName;
class LLPanelGroupGeneral : public LLPanelGroupTab
{
@@ -62,6 +63,7 @@ public:
virtual void setupCtrls (LLPanel* parent);
+ void onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name);
private:
void reset();
@@ -75,7 +77,8 @@ private:
static void onReceiveNotices(LLUICtrl* ctrl, void* data);
static void openProfile(void* data);
- S32 sortMembersList(S32,const LLScrollListItem*,const LLScrollListItem*);
+ S32 sortMembersList(S32,const LLScrollListItem*,const LLScrollListItem*);
+ void addMember(LLGroupMemberData* member);
static bool joinDlgCB(const LLSD& notification, const LLSD& response);
@@ -108,6 +111,7 @@ private:
LLComboBox *mComboMature;
LLGroupMgrGroupData::member_list_t::iterator mMemberProgress;
+ boost::signals2::connection mAvatarNameCacheConnection;
};
#endif
diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp
index 00dd206571..133b269c11 100644
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -89,6 +89,8 @@ public:
void (*mCloseCallback)(void* data);
void* mCloseCallbackUserData;
+
+ boost::signals2::connection mAvatarNameCacheConnection;
};
@@ -102,12 +104,17 @@ LLPanelGroupInvite::impl::impl(const LLUUID& group_id):
mGroupName( NULL ),
mConfirmedOwnerInvite( false ),
mCloseCallback( NULL ),
- mCloseCallbackUserData( NULL )
+ mCloseCallbackUserData( NULL ),
+ mAvatarNameCacheConnection()
{
}
LLPanelGroupInvite::impl::~impl()
{
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
}
void LLPanelGroupInvite::impl::addUsers(const std::vector<std::string>& names,
@@ -301,11 +308,13 @@ void LLPanelGroupInvite::impl::callbackClickAdd(void* userdata)
//Soon the avatar picker will be embedded into this panel
//instead of being it's own separate floater. But that is next week.
//This will do for now. -jwolk May 10, 2006
+ LLView * button = panelp->findChild<LLButton>("add_button");
+ LLFloater * root_floater = gFloaterView->getParentFloater(panelp);
LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(
- boost::bind(impl::callbackAddUsers, _1, panelp->mImplementation), TRUE);
+ boost::bind(impl::callbackAddUsers, _1, panelp->mImplementation), TRUE, FALSE, FALSE, root_floater->getName(), button);
if (picker)
{
- gFloaterView->getParentFloater(panelp)->addDependentFloater(picker);
+ root_floater->addDependentFloater(picker);
}
}
}
@@ -378,8 +387,24 @@ void LLPanelGroupInvite::impl::callbackAddUsers(const uuid_vec_t& agent_ids, voi
std::vector<std::string> names;
for (S32 i = 0; i < (S32)agent_ids.size(); i++)
{
- LLAvatarNameCache::get(agent_ids[i],
- boost::bind(&LLPanelGroupInvite::impl::onAvatarNameCache, _1, _2, user_data));
+ LLAvatarName av_name;
+ if (LLAvatarNameCache::get(agent_ids[i], &av_name))
+ {
+ LLPanelGroupInvite::impl::onAvatarNameCache(agent_ids[i], av_name, user_data);
+ }
+ else
+ {
+ impl* selfp = (impl*) user_data;
+ if (selfp)
+ {
+ if (selfp->mAvatarNameCacheConnection.connected())
+ {
+ selfp->mAvatarNameCacheConnection.disconnect();
+ }
+ // *TODO : Add a callback per avatar name being fetched.
+ selfp->mAvatarNameCacheConnection = LLAvatarNameCache::get(agent_ids[i],boost::bind(&LLPanelGroupInvite::impl::onAvatarNameCache, _1, _2, user_data));
+ }
+ }
}
}
@@ -392,6 +417,10 @@ void LLPanelGroupInvite::impl::onAvatarNameCache(const LLUUID& agent_id,
if (selfp)
{
+ if (selfp->mAvatarNameCacheConnection.connected())
+ {
+ selfp->mAvatarNameCacheConnection.disconnect();
+ }
std::vector<std::string> names;
uuid_vec_t agent_ids;
agent_ids.push_back(agent_id);
@@ -467,11 +496,11 @@ void LLPanelGroupInvite::addUsers(uuid_vec_t& agent_ids)
//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))
+ LLAvatarName av_name;
+ if (!LLAvatarNameCache::get(agent_id, &av_name))
{
// actually it should happen, just in case
- gCacheName->get(LLUUID(agent_id), false, boost::bind(
- &LLPanelGroupInvite::addUserCallback, this, _1, _2));
+ //LLAvatarNameCache::get(LLUUID(agent_id), boost::bind(&LLPanelGroupInvite::addUserCallback, this, _1, _2));
// 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
@@ -479,7 +508,7 @@ void LLPanelGroupInvite::addUsers(uuid_vec_t& agent_ids)
}
else
{
- names.push_back(fullname);
+ names.push_back(av_name.getAccountName());
}
}
}
@@ -487,12 +516,12 @@ void LLPanelGroupInvite::addUsers(uuid_vec_t& agent_ids)
mImplementation->addUsers(names, agent_ids);
}
-void LLPanelGroupInvite::addUserCallback(const LLUUID& id, const std::string& full_name)
+void LLPanelGroupInvite::addUserCallback(const LLUUID& id, const LLAvatarName& av_name)
{
std::vector<std::string> names;
uuid_vec_t agent_ids;
agent_ids.push_back(id);
- names.push_back(full_name);
+ names.push_back(av_name.getAccountName());
mImplementation->addUsers(names, agent_ids);
}
@@ -570,8 +599,8 @@ void LLPanelGroupInvite::updateLists()
if (!mPendingUpdate)
{
LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mImplementation->mGroupID);
- LLGroupMgr::getInstance()->sendGroupMembersRequest(mImplementation->mGroupID);
LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mImplementation->mGroupID);
+ LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mImplementation->mGroupID);
}
mPendingUpdate = TRUE;
}
diff --git a/indra/newview/llpanelgroupinvite.h b/indra/newview/llpanelgroupinvite.h
index a7bfd2226e..9f7b5ae9be 100644
--- a/indra/newview/llpanelgroupinvite.h
+++ b/indra/newview/llpanelgroupinvite.h
@@ -29,6 +29,8 @@
#include "llpanel.h"
#include "lluuid.h"
+class LLAvatarName;
+
class LLPanelGroupInvite
: public LLPanel
{
@@ -40,7 +42,7 @@ public:
/**
* 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& full_name);
+ void addUserCallback(const LLUUID& id, const LLAvatarName& av_name);
void clear();
void update();
diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp
index 363443646d..37755fb851 100644
--- a/indra/newview/llpanelgrouplandmoney.cpp
+++ b/indra/newview/llpanelgrouplandmoney.cpp
@@ -517,7 +517,7 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)
row["columns"][3]["column"] = "type";
row["columns"][3]["value"] = land_type;
- row["columns"][3]["font"] = "SANSSERIFSMALL";
+ row["columns"][3]["font"] = "SANSSERIF_SMALL";
// hidden is always last column
row["columns"][4]["column"] = "hidden";
diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp
index 31c0e3d01a..93b108efcc 100644
--- a/indra/newview/llpanelgroupnotices.cpp
+++ b/indra/newview/llpanelgroupnotices.cpp
@@ -543,10 +543,7 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg)
msg->getU32("Data","Timestamp",timestamp,i);
// we only have the legacy name here, convert it to a username
- if (LLAvatarNameCache::useDisplayNames())
- {
- name = LLCacheName::buildUsername(name);
- }
+ name = LLCacheName::buildUsername(name);
LLSD row;
row["id"] = id;
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index f825ee3215..cfdac11d26 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -29,6 +29,7 @@
#include "llcheckboxctrl.h"
#include "llagent.h"
+#include "llavatarnamecache.h"
#include "llbutton.h"
#include "llfiltereditor.h"
#include "llfloatergroupinvite.h"
@@ -356,7 +357,7 @@ void LLPanelGroupRoles::activate()
if (!gdatap || !gdatap->isMemberDataComplete() )
{
- LLGroupMgr::getInstance()->sendGroupMembersRequest(mGroupID);
+ LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID);
}
// Check role data.
@@ -742,13 +743,17 @@ LLPanelGroupMembersSubTab::LLPanelGroupMembersSubTab()
mChanged(FALSE),
mPendingMemberUpdate(FALSE),
mHasMatch(FALSE),
- mNumOwnerAdditions(0)
+ mNumOwnerAdditions(0),
+ mAvatarNameCacheConnection()
{
- mUdpateSessionID = LLUUID::null;
}
LLPanelGroupMembersSubTab::~LLPanelGroupMembersSubTab()
{
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
if (mMembersList)
{
gSavedSettings.setString("GroupMembersSortOrder", mMembersList->getSortColumnName());
@@ -1426,13 +1431,20 @@ U64 LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges(const LLUUID& ag
return GP_NO_POWERS;
}
- LLGroupMemberData* member_data = gdatap->mMembers[agent_id];
- if ( !member_data )
+ LLGroupMgrGroupData::member_list_t::iterator iter = gdatap->mMembers.find(agent_id);
+ if ( iter == gdatap->mMembers.end() )
{
llwarns << "LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges() -- No member data for member with UUID " << agent_id << llendl;
return GP_NO_POWERS;
}
+ LLGroupMemberData* member_data = (*iter).second;
+ if (!member_data)
+ {
+ llwarns << "LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges() -- Null member data for member with UUID " << agent_id << llendl;
+ return GP_NO_POWERS;
+ }
+
//see if there are unsaved role changes for this agent
role_change_data_map_t* role_change_datap = NULL;
member_role_changes_map_t::iterator member = mMemberRoleChangeData.find(agent_id);
@@ -1547,10 +1559,6 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc)
mMemberProgress = gdatap->mMembers.begin();
mPendingMemberUpdate = TRUE;
mHasMatch = FALSE;
- // Generate unique ID for current updateMembers()- see onNameCache for details.
- // Using unique UUID is perhaps an overkill but this way we are perfectly safe
- // from coincidences.
- mUdpateSessionID.generate();
}
else
{
@@ -1578,55 +1586,43 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc)
}
}
-void LLPanelGroupMembersSubTab::addMemberToList(LLUUID id, LLGroupMemberData* data)
+void LLPanelGroupMembersSubTab::addMemberToList(LLGroupMemberData* data)
{
if (!data) return;
LLUIString donated = getString("donation_area");
donated.setArg("[AREA]", llformat("%d", data->getContribution()));
- LLSD row;
- row["id"] = id;
-
- row["columns"][0]["column"] = "name";
- // value is filled in by name list control
+ LLNameListCtrl::NameItem item_params;
+ item_params.value = data->getID();
- row["columns"][1]["column"] = "donated";
- row["columns"][1]["value"] = donated.getString();
+ item_params.columns.add().column("name").font.name("SANSSERIF_SMALL").style("NORMAL");
- row["columns"][2]["column"] = "online";
- row["columns"][2]["value"] = data->getOnlineStatus();
- row["columns"][2]["font"] = "SANSSERIF_SMALL";
+ item_params.columns.add().column("donated").value(donated.getString())
+ .font.name("SANSSERIF_SMALL").style("NORMAL");
- mMembersList->addElement(row);
+ item_params.columns.add().column("online").value(data->getOnlineStatus())
+ .font.name("SANSSERIF_SMALL").style("NORMAL");
+ mMembersList->addNameItemRow(item_params);
mHasMatch = TRUE;
}
-void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, const LLUUID& id)
+void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name)
{
- // Update ID is used to determine whether member whose id is passed
- // into onNameCache() was passed after current or previous user-initiated update.
- // This is needed to avoid probable duplication of members in list after changing filter
- // or adding of members of another group if gets for their names were called on
- // previous update. If this id is from get() called from older update,
- // we do nothing.
- if (mUdpateSessionID != update_id) return;
-
+ mAvatarNameCacheConnection.disconnect();
+
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
- if (!gdatap)
+ if (!gdatap
+ || gdatap->getMemberVersion() != update_id
+ || !member)
{
- llwarns << "LLPanelGroupMembersSubTab::updateMembers() -- No group data!" << llendl;
return;
}
- std::string fullname;
- gCacheName->getFullName(id, fullname);
-
- LLGroupMemberData* data;
// trying to avoid unnecessary hash lookups
- if (matchesSearchFilter(fullname) && ((data = gdatap->mMembers[id]) != NULL))
+ if (matchesSearchFilter(av_name.getAccountName()))
{
- addMemberToList(id, data);
+ addMemberToList(member);
if(!mMembersList->getEnabled())
{
mMembersList->setEnabled(TRUE);
@@ -1665,27 +1661,33 @@ void LLPanelGroupMembersSubTab::updateMembers()
LLGroupMgrGroupData::member_list_t::iterator end = gdatap->mMembers.end();
-
- S32 i = 0;
- for( ; mMemberProgress != end && i<UPDATE_MEMBERS_PER_FRAME;
- ++mMemberProgress, ++i)
+
+ LLTimer update_time;
+ update_time.setTimerExpirySec(UPDATE_MEMBERS_SECONDS_PER_FRAME);
+
+ for( ; mMemberProgress != end && !update_time.hasExpired(); ++mMemberProgress)
{
if (!mMemberProgress->second)
continue;
+
// Do filtering on name if it is already in the cache.
- std::string fullname;
- if (gCacheName->getFullName(mMemberProgress->first, fullname))
+ LLAvatarName av_name;
+ if (LLAvatarNameCache::get(mMemberProgress->first, &av_name))
{
- if (matchesSearchFilter(fullname))
+ if (matchesSearchFilter(av_name.getAccountName()))
{
- addMemberToList(mMemberProgress->first, mMemberProgress->second);
+ addMemberToList(mMemberProgress->second);
}
}
else
{
// If name is not cached, onNameCache() should be called when it is cached and add this member to list.
- gCacheName->get(mMemberProgress->first, FALSE, boost::bind(&LLPanelGroupMembersSubTab::onNameCache,
- this, mUdpateSessionID, _1));
+ // *TODO : Add one callback per fetched avatar name
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+ mAvatarNameCacheConnection = LLAvatarNameCache::get(mMemberProgress->first, boost::bind(&LLPanelGroupMembersSubTab::onNameCache, this, gdatap->getMemberVersion(), mMemberProgress->second, _2));
}
}
@@ -1987,7 +1989,7 @@ void LLPanelGroupRolesSubTab::update(LLGroupChange gc)
if (!gdatap || !gdatap->isMemberDataComplete())
{
- LLGroupMgr::getInstance()->sendGroupMembersRequest(mGroupID);
+ LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID);
}
if (!gdatap || !gdatap->isRoleMemberDataComplete())
@@ -2580,7 +2582,7 @@ void LLPanelGroupActionsSubTab::handleActionSelect()
}
else
{
- LLGroupMgr::getInstance()->sendGroupMembersRequest(mGroupID);
+ LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID);
}
if (gdatap->isRoleDataComplete())
@@ -2604,6 +2606,7 @@ void LLPanelGroupActionsSubTab::handleActionSelect()
LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mGroupID);
}
}
+
void LLPanelGroupRoles::setGroupID(const LLUUID& id)
{
LLPanelGroupTab::setGroupID(id);
diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h
index a55e264150..78bb3c57a1 100644
--- a/indra/newview/llpanelgrouproles.h
+++ b/indra/newview/llpanelgrouproles.h
@@ -187,8 +187,8 @@ public:
virtual void setGroupID(const LLUUID& id);
- void addMemberToList(LLUUID id, LLGroupMemberData* data);
- void onNameCache(const LLUUID& update_id, const LLUUID& id);
+ void addMemberToList(LLGroupMemberData* data);
+ void onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name);
protected:
typedef std::map<LLUUID, LLRoleMemberChangeType> role_change_data_map_t;
@@ -210,13 +210,11 @@ protected:
BOOL mPendingMemberUpdate;
BOOL mHasMatch;
- // This id is generated after each user initiated member list update(opening Roles or changing filter)
- LLUUID mUdpateSessionID;
-
member_role_changes_map_t mMemberRoleChangeData;
U32 mNumOwnerAdditions;
LLGroupMgrGroupData::member_list_t::iterator mMemberProgress;
+ boost::signals2::connection mAvatarNameCacheConnection;
};
class LLPanelGroupRolesSubTab : public LLPanelGroupSubTab
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index eda0749cdb..389baa86cd 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -1,31 +1,30 @@
-/**
+/**
* @file llpanelavatar.cpp
* @brief LLPanelAvatar and related class implementations
*
* $LicenseInfo:firstyear=2004&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
-
#include "llfloaterreg.h"
#include "llpanelimcontrolpanel.h"
@@ -39,393 +38,7 @@
#include "llavatarlist.h"
#include "llparticipantlist.h"
#include "llimview.h"
-#include "llvoicechannel.h"
#include "llspeakers.h"
#include "lltrans.h"
-void LLPanelChatControlPanel::onCallButtonClicked()
-{
- gIMMgr->startCall(mSessionId);
-}
-
-void LLPanelChatControlPanel::onEndCallButtonClicked()
-{
- gIMMgr->endCall(mSessionId);
-}
-
-void LLPanelChatControlPanel::onOpenVoiceControlsClicked()
-{
- LLFloaterReg::showInstance("voice_controls");
-}
-
-void LLPanelChatControlPanel::onChange(EStatusType status, const std::string &channelURI, bool proximal)
-{
- if(status == STATUS_JOINING || status == STATUS_LEFT_CHANNEL)
- {
- return;
- }
-
- updateCallButton();
-}
-
-void LLPanelChatControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
-{
- updateButtons(new_state);
-}
-
-void LLPanelChatControlPanel::updateCallButton()
-{
- // hide/show call button
- bool voice_enabled = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
-
- LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(mSessionId);
-
- if (!session)
- {
- getChildView("call_btn")->setEnabled(false);
- return;
- }
-
- bool session_initialized = session->mSessionInitialized;
- bool callback_enabled = session->mCallBackEnabled;
-
- BOOL enable_connect = session_initialized
- && voice_enabled
- && callback_enabled;
- getChildView("call_btn")->setEnabled(enable_connect);
-}
-
-void LLPanelChatControlPanel::updateButtons(LLVoiceChannel::EState state)
-{
- bool is_call_started = state >= LLVoiceChannel::STATE_CALL_STARTED;
- getChildView("end_call_btn_panel")->setVisible( is_call_started);
- getChildView("voice_ctrls_btn_panel")->setVisible( is_call_started && findChild<LLView>("voice_ctrls_btn_panel"));
- getChildView("call_btn_panel")->setVisible( ! is_call_started);
-
- getChildView("volume_ctrl_panel")->setVisible(state == LLVoiceChannel::STATE_CONNECTED);
-
- 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));
-
- LLVoiceClient::getInstance()->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());
- }
-}
-
-LLPanelIMControlPanel::LLPanelIMControlPanel()
-{
-}
-
-LLPanelIMControlPanel::~LLPanelIMControlPanel()
-{
- LLAvatarTracker::instance().removeParticularFriendObserver(mAvatarID, this);
-}
-
-BOOL LLPanelIMControlPanel::postBuild()
-{
- childSetAction("view_profile_btn", boost::bind(&LLPanelIMControlPanel::onViewProfileButtonClicked, this));
- 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));
-
- childSetAction("mute_btn", boost::bind(&LLPanelIMControlPanel::onClickMuteVolume, this));
- childSetAction("block_btn", boost::bind(&LLPanelIMControlPanel::onClickBlock, this));
- childSetAction("unblock_btn", boost::bind(&LLPanelIMControlPanel::onClickUnblock, this));
-
- getChild<LLUICtrl>("volume_slider")->setCommitCallback(boost::bind(&LLPanelIMControlPanel::onVolumeChange, this, _2));
-
- getChildView("add_friend_btn")->setEnabled(!LLAvatarActions::isFriend(getChild<LLAvatarIconCtrl>("avatar_icon")->getAvatarId()));
-
- setFocusReceivedCallback(boost::bind(&LLPanelIMControlPanel::onFocusReceived, this));
-
- return LLPanelChatControlPanel::postBuild();
-}
-
-void LLPanelIMControlPanel::draw()
-{
- bool is_muted = LLMuteList::getInstance()->isMuted(mAvatarID);
-
- getChild<LLUICtrl>("block_btn_panel")->setVisible(!is_muted);
- getChild<LLUICtrl>("unblock_btn_panel")->setVisible(is_muted);
-
- if (getChildView("volume_ctrl_panel")->getVisible())
- {
-
- bool is_muted_voice = LLMuteList::getInstance()->isMuted(mAvatarID, LLMute::flagVoiceChat);
-
- LLUICtrl* mute_btn = getChild<LLUICtrl>("mute_btn");
- mute_btn->setValue( is_muted_voice );
-
- LLUICtrl* volume_slider = getChild<LLUICtrl>("volume_slider");
- volume_slider->setEnabled( !is_muted_voice );
-
- F32 volume;
-
- if (is_muted_voice)
- {
- // it's clearer to display their volume as zero
- volume = 0.f;
- }
- else
- {
- // actual volume
- volume = LLVoiceClient::getInstance()->getUserVolume(mAvatarID);
- }
- volume_slider->setValue( (F64)volume );
- }
-
- LLPanelChatControlPanel::draw();
-}
-
-void LLPanelIMControlPanel::onClickMuteVolume()
-{
- // By convention, we only display and toggle voice mutes, not all mutes
- LLMuteList* mute_list = LLMuteList::getInstance();
- bool is_muted = mute_list->isMuted(mAvatarID, LLMute::flagVoiceChat);
-
- LLMute mute(mAvatarID, getChild<LLTextBox>("avatar_name")->getText(), LLMute::AGENT);
- if (!is_muted)
- {
- mute_list->add(mute, LLMute::flagVoiceChat);
- }
- else
- {
- mute_list->remove(mute, LLMute::flagVoiceChat);
- }
-}
-
-void LLPanelIMControlPanel::onClickBlock()
-{
- LLMute mute(mAvatarID, getChild<LLTextBox>("avatar_name")->getText(), LLMute::AGENT);
-
- LLMuteList::getInstance()->add(mute);
-}
-
-void LLPanelIMControlPanel::onClickUnblock()
-{
- LLMute mute(mAvatarID, getChild<LLTextBox>("avatar_name")->getText(), LLMute::AGENT);
-
- LLMuteList::getInstance()->remove(mute);
-}
-
-void LLPanelIMControlPanel::onVolumeChange(const LLSD& data)
-{
- F32 volume = (F32)data.asReal();
- LLVoiceClient::getInstance()->setUserVolume(mAvatarID, volume);
-}
-
-void LLPanelIMControlPanel::onTeleportButtonClicked()
-{
- LLAvatarActions::offerTeleport(mAvatarID);
-}
-void LLPanelIMControlPanel::onPayButtonClicked()
-{
- LLAvatarActions::pay(mAvatarID);
-}
-
-void LLPanelIMControlPanel::onViewProfileButtonClicked()
-{
- LLAvatarActions::showProfile(mAvatarID);
-}
-
-void LLPanelIMControlPanel::onAddFriendButtonClicked()
-{
- LLAvatarIconCtrl* avatar_icon = getChild<LLAvatarIconCtrl>("avatar_icon");
- std::string full_name = avatar_icon->getFullName();
- LLAvatarActions::requestFriendshipDialog(mAvatarID, full_name);
-}
-
-void LLPanelIMControlPanel::onShareButtonClicked()
-{
- LLAvatarActions::share(mAvatarID);
-}
-
-void LLPanelIMControlPanel::onFocusReceived()
-{
- // Disable all the buttons (Call, Teleport, etc) if disconnected.
- if (gDisconnected)
- {
- setAllChildrenEnabled(FALSE);
- }
-}
-
-void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
-{
- LLPanelChatControlPanel::setSessionId(session_id);
-
- LLIMModel& im_model = LLIMModel::instance();
-
- LLAvatarTracker::instance().removeParticularFriendObserver(mAvatarID, this);
- mAvatarID = im_model.getOtherParticipantID(session_id);
- LLAvatarTracker::instance().addParticularFriendObserver(mAvatarID, this);
-
- // Disable "Add friend" button for friends.
- getChildView("add_friend_btn")->setEnabled(!LLAvatarActions::isFriend(mAvatarID));
-
- // Disable "Teleport" button if friend is offline
- if(LLAvatarActions::isFriend(mAvatarID))
- {
- getChildView("teleport_btn")->setEnabled(LLAvatarTracker::instance().isBuddyOnline(mAvatarID));
- }
-
- getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(mAvatarID);
-
- // 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 )
- {
- getChildView("view_profile_btn")->setEnabled(FALSE);
- getChildView("add_friend_btn")->setEnabled(FALSE);
-
- getChildView("share_btn")->setEnabled(FALSE);
- getChildView("teleport_btn")->setEnabled(FALSE);
- getChildView("pay_btn")->setEnabled(FALSE);
-
- getChild<LLTextBox>("avatar_name")->setValue(im_session->mName);
- getChild<LLTextBox>("avatar_name")->setToolTip(im_session->mName);
- }
- else
- {
- // If the participant is an avatar, fetch the currect name
- gCacheName->get(mAvatarID, false,
- boost::bind(&LLPanelIMControlPanel::onNameCache, this, _1, _2, _3));
- }
-}
-
-//virtual
-void LLPanelIMControlPanel::changed(U32 mask)
-{
- getChildView("add_friend_btn")->setEnabled(!LLAvatarActions::isFriend(mAvatarID));
-
- // Disable "Teleport" button if friend is offline
- if(LLAvatarActions::isFriend(mAvatarID))
- {
- getChildView("teleport_btn")->setEnabled(LLAvatarTracker::instance().isBuddyOnline(mAvatarID));
- }
-}
-
-void LLPanelIMControlPanel::onNameCache(const LLUUID& id, const std::string& full_name, bool is_group)
-{
- if ( id == mAvatarID )
- {
- std::string avatar_name = full_name;
- getChild<LLTextBox>("avatar_name")->setValue(avatar_name);
- getChild<LLTextBox>("avatar_name")->setToolTip(avatar_name);
-
- bool is_linden = LLStringUtil::endsWith(full_name, " Linden");
- getChild<LLUICtrl>("mute_btn")->setEnabled( !is_linden);
- }
-}
-
-LLPanelGroupControlPanel::LLPanelGroupControlPanel(const LLUUID& session_id):
-mParticipantList(NULL)
-{
-}
-
-BOOL LLPanelGroupControlPanel::postBuild()
-{
- childSetAction("group_info_btn", boost::bind(&LLPanelGroupControlPanel::onGroupInfoButtonClicked, this));
-
- return LLPanelChatControlPanel::postBuild();
-}
-
-LLPanelGroupControlPanel::~LLPanelGroupControlPanel()
-{
- delete mParticipantList;
- mParticipantList = NULL;
-}
-
-// virtual
-void LLPanelGroupControlPanel::draw()
-{
- // Need to resort the participant list if it's in sort by recent speaker order.
- if (mParticipantList)
- mParticipantList->update();
- LLPanelChatControlPanel::draw();
-}
-
-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 = 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);
- }
-}
-
-
-LLPanelAdHocControlPanel::LLPanelAdHocControlPanel(const LLUUID& session_id):LLPanelGroupControlPanel(session_id)
-{
-}
-
-BOOL LLPanelAdHocControlPanel::postBuild()
-{
- //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 bba847b5d4..02915ec4bb 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -28,14 +28,12 @@
#define LL_LLPANELIMCONTROLPANEL_H
#include "llpanel.h"
-#include "llvoicechannel.h"
#include "llcallingcard.h"
class LLParticipantList;
-class LLPanelChatControlPanel
+class LLPanelChatControlPanel
: public LLPanel
- , public LLVoiceClientStatusObserver
{
public:
LLPanelChatControlPanel() :
@@ -44,21 +42,6 @@ public:
virtual BOOL postBuild();
- void onCallButtonClicked();
- void onEndCallButtonClicked();
- void onOpenVoiceControlsClicked();
-
- // 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(LLVoiceChannel::EState state);
-
- // Enables/disables call button depending on voice availability
- void updateCallButton();
-
virtual void setSessionId(const LLUUID& session_id);
const LLUUID& getSessionId() { return mSessionId; }
@@ -69,41 +52,6 @@ private:
boost::signals2::connection mVoiceChannelStateChangeConnection;
};
-
-class LLPanelIMControlPanel : public LLPanelChatControlPanel, LLFriendObserver
-{
-public:
- LLPanelIMControlPanel();
- ~LLPanelIMControlPanel();
-
- BOOL postBuild();
-
- void setSessionId(const LLUUID& session_id);
-
- // LLFriendObserver trigger
- virtual void changed(U32 mask);
-
-protected:
- void onNameCache(const LLUUID& id, const std::string& full_name, bool is_group);
-
-private:
- void onViewProfileButtonClicked();
- void onAddFriendButtonClicked();
- void onShareButtonClicked();
- void onTeleportButtonClicked();
- void onPayButtonClicked();
- void onFocusReceived();
-
- void onClickMuteVolume();
- void onClickBlock();
- void onClickUnblock();
- /*virtual*/ void draw();
- void onVolumeChange(const LLSD& data);
-
- LLUUID mAvatarID;
-};
-
-
class LLPanelGroupControlPanel : public LLPanelChatControlPanel
{
public:
@@ -121,9 +69,7 @@ protected:
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/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 68a3b6d1cd..88400e4ef2 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -52,6 +52,7 @@
#include "llmenubutton.h"
#include "llplacesinventorybridge.h"
#include "llplacesinventorypanel.h"
+#include "llplacesfolderview.h"
#include "lltoggleablemenu.h"
#include "llviewermenu.h"
#include "llviewerregion.h"
@@ -102,7 +103,7 @@ 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->getViewModelItem()->descendantsPassedFilter())
{
if (folder->isOpen())
{
@@ -138,7 +139,7 @@ private:
// virtual
void LLOpenFolderByID::doFolder(LLFolderViewFolder* folder)
{
- if (folder->getListener() && folder->getListener()->getUUID() == mFolderID)
+ if (folder->getViewModelItem() && static_cast<LLFolderViewModelItemInventory*>(folder->getViewModelItem())->getUUID() == mFolderID)
{
if (!folder->isOpen())
{
@@ -177,7 +178,7 @@ void LLLandmarksPanelObserver::changed(U32 mask)
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);
+ const LLUUID &landmarks_cat = gInventory.findLibraryCategoryUUIDForType(LLFolderType::FT_LANDMARK, false);
if (landmarks_cat.notNull())
{
LLOpenFolderByID opener(landmarks_cat);
@@ -247,10 +248,7 @@ void LLLandmarksPanel::onSearchEdit(const std::string& string)
LLPlacesInventoryPanel* inventory_list = dynamic_cast<LLPlacesInventoryPanel*>(tab->getAccordionView());
if (NULL == inventory_list) continue;
- if (inventory_list->getFilter())
- {
- filter_list(inventory_list, string);
- }
+ filter_list(inventory_list, string);
}
if (sFilterSubString != string)
@@ -281,28 +279,21 @@ void LLLandmarksPanel::onShowOnMap()
//virtual
void LLLandmarksPanel::onShowProfile()
{
- LLFolderViewItem* cur_item = getCurSelectedItem();
+ LLFolderViewModelItemInventory* cur_item = getCurSelectedViewModelItem();
if(!cur_item)
return;
- cur_item->getListener()->performAction(mCurrentSelectedList->getModel(),"about");
+ cur_item->performAction(mCurrentSelectedList->getModel(),"about");
}
// virtual
void LLLandmarksPanel::onTeleport()
{
- LLFolderViewItem* current_item = getCurSelectedItem();
- if (!current_item)
- {
- llwarns << "There are no selected list. No actions are performed." << llendl;
- return;
- }
-
- LLFolderViewEventListener* listenerp = current_item->getListener();
- if (listenerp && listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK)
+ LLFolderViewModelItemInventory* view_model_item = getCurSelectedViewModelItem();
+ if (view_model_item && view_model_item->getInventoryType() == LLInventoryType::IT_LANDMARK)
{
- listenerp->openItem();
+ view_model_item->openItem();
}
}
@@ -313,8 +304,7 @@ bool LLLandmarksPanel::isSingleItemSelected()
if (mCurrentSelectedList != NULL)
{
- LLPlacesFolderView* root_view =
- static_cast<LLPlacesFolderView*>(mCurrentSelectedList->getRootFolder());
+ LLFolderView* root_view = mCurrentSelectedList->getRootFolder();
if (root_view->getSelectedCount() == 1)
{
@@ -360,7 +350,7 @@ void LLLandmarksPanel::onSelectorButtonClicked()
LLFolderViewItem* cur_item = mFavoritesInventoryPanel->getRootFolder()->getCurSelectedItem();
if (!cur_item) return;
- LLFolderViewEventListener* listenerp = cur_item->getListener();
+ LLFolderViewModelItemInventory* listenerp = static_cast<LLFolderViewModelItemInventory*>(cur_item->getViewModelItem());
if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK)
{
LLSD key;
@@ -373,10 +363,7 @@ void LLLandmarksPanel::onSelectorButtonClicked()
void LLLandmarksPanel::updateShowFolderState()
{
- if (!mLandmarksInventoryPanel->getFilter())
- return;
-
- bool show_all_folders = mLandmarksInventoryPanel->getRootFolder()->getFilterSubString().empty();
+ bool show_all_folders = mLandmarksInventoryPanel->getFilterSubString().empty();
if (show_all_folders)
{
show_all_folders = category_has_descendents(mLandmarksInventoryPanel);
@@ -417,13 +404,14 @@ void LLLandmarksPanel::setItemSelected(const LLUUID& obj_id, BOOL take_keyboard_
bool LLLandmarksPanel::isLandmarkSelected() const
{
- LLFolderViewItem* current_item = getCurSelectedItem();
- if(current_item && current_item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK)
- {
- return true;
- }
+ LLFolderViewModelItemInventory* current_item = getCurSelectedViewModelItem();
+ return current_item && (current_item->getInventoryType() == LLInventoryType::IT_LANDMARK);
+}
- return false;
+bool LLLandmarksPanel::isFolderSelected() const
+{
+ LLFolderViewModelItemInventory* current_item = getCurSelectedViewModelItem();
+ return current_item && (current_item->getInventoryType() == LLInventoryType::IT_CATEGORY);
}
bool LLLandmarksPanel::isReceivedFolderSelected() const
@@ -440,10 +428,10 @@ bool LLLandmarksPanel::isReceivedFolderSelected() const
void LLLandmarksPanel::doActionOnCurSelectedLandmark(LLLandmarkList::loaded_callback_t cb)
{
- LLFolderViewItem* cur_item = getCurSelectedItem();
- if(cur_item && cur_item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK)
+ LLFolderViewModelItemInventory* cur_item = getCurSelectedViewModelItem();
+ if(cur_item && cur_item->getInventoryType() == LLInventoryType::IT_LANDMARK)
{
- LLLandmark* landmark = LLLandmarkActions::getLandmark(cur_item->getListener()->getUUID(), cb);
+ LLLandmark* landmark = LLLandmarkActions::getLandmark(cur_item->getUUID(), cb);
if (landmark)
{
cb(landmark);
@@ -456,6 +444,17 @@ LLFolderViewItem* LLLandmarksPanel::getCurSelectedItem() const
return mCurrentSelectedList ? mCurrentSelectedList->getRootFolder()->getCurSelectedItem() : NULL;
}
+LLFolderViewModelItemInventory* LLLandmarksPanel::getCurSelectedViewModelItem() const
+{
+ LLFolderViewItem* cur_item = getCurSelectedItem();
+ if (cur_item)
+ {
+ return static_cast<LLFolderViewModelItemInventory*>(cur_item->getViewModelItem());
+ }
+ return NULL;
+}
+
+
LLFolderViewItem* LLLandmarksPanel::selectItemInAccordionTab(LLPlacesInventoryPanel* inventory_list,
const std::string& tab_name,
const LLUUID& obj_id,
@@ -466,7 +465,7 @@ LLFolderViewItem* LLLandmarksPanel::selectItemInAccordionTab(LLPlacesInventoryPa
LLFolderView* root = inventory_list->getRootFolder();
- LLFolderViewItem* item = root->getItemByID(obj_id);
+ LLFolderViewItem* item = inventory_list->getItemByID(obj_id);
if (!item)
return NULL;
@@ -508,12 +507,12 @@ void LLLandmarksPanel::processParcelInfo(const LLParcelData& parcel_data)
// We have to make request to sever to get parcel_id and snaption_id.
if(isLandmarkSelected())
{
- LLFolderViewItem* cur_item = getCurSelectedItem();
+ LLFolderViewModelItemInventory* cur_item = getCurSelectedViewModelItem();
if (!cur_item) return;
- LLUUID id = cur_item->getListener()->getUUID();
+ LLUUID id = cur_item->getUUID();
LLInventoryItem* inv_item = mCurrentSelectedList->getModel()->getItem(id);
doActionOnCurSelectedLandmark(boost::bind(
- &LLLandmarksPanel::doProcessParcelInfo, this, _1, cur_item, inv_item, parcel_data));
+ &LLLandmarksPanel::doProcessParcelInfo, this, _1, getCurSelectedItem(), inv_item, parcel_data));
}
}
@@ -543,7 +542,7 @@ void LLLandmarksPanel::initFavoritesInventoryPanel()
mFavoritesInventoryPanel = getChild<LLPlacesInventoryPanel>("favorites_list");
initLandmarksPanel(mFavoritesInventoryPanel);
- mFavoritesInventoryPanel->getFilter()->setEmptyLookupMessage("FavoritesNoMatchingItems");
+ mFavoritesInventoryPanel->getFilter().setEmptyLookupMessage("FavoritesNoMatchingItems");
initAccordion("tab_favorites", mFavoritesInventoryPanel, true);
}
@@ -554,12 +553,7 @@ void LLLandmarksPanel::initLandmarksInventoryPanel()
initLandmarksPanel(mLandmarksInventoryPanel);
- // 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);
- }
+ 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));
@@ -583,7 +577,7 @@ void LLLandmarksPanel::initLibraryInventoryPanel()
initLandmarksPanel(mLibraryInventoryPanel);
// We want to fetch only "Landmarks" category from the library.
- const LLUUID &landmarks_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false, true);
+ const LLUUID &landmarks_cat = gInventory.findLibraryCategoryUUIDForType(LLFolderType::FT_LANDMARK, false);
if (landmarks_cat.notNull())
{
LLInventoryModelBackgroundFetch::instance().start(landmarks_cat);
@@ -595,12 +589,7 @@ void LLLandmarksPanel::initLibraryInventoryPanel()
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->getFilter()->setEmptyLookupMessage("PlacesNoMatchingItems");
+ inventory_list->getFilter().setEmptyLookupMessage("PlacesNoMatchingItems");
inventory_list->setFilterTypes(0x1 << LLInventoryType::IT_LANDMARK);
inventory_list->setSelectCallback(boost::bind(&LLLandmarksPanel::onSelectionChange, this, inventory_list, _1, _2));
@@ -665,20 +654,20 @@ void LLLandmarksPanel::deselectOtherThan(const LLPlacesInventoryPanel* inventory
{
if (inventory_list != mFavoritesInventoryPanel)
{
- mFavoritesInventoryPanel->getRootFolder()->clearSelection();
+ mFavoritesInventoryPanel->clearSelection();
}
if (inventory_list != mLandmarksInventoryPanel)
{
- mLandmarksInventoryPanel->getRootFolder()->clearSelection();
+ mLandmarksInventoryPanel->clearSelection();
}
if (inventory_list != mMyInventoryPanel)
{
- mMyInventoryPanel->getRootFolder()->clearSelection();
+ mMyInventoryPanel->clearSelection();
}
if (inventory_list != mLibraryInventoryPanel)
{
- mLibraryInventoryPanel->getRootFolder()->clearSelection();
+ mLibraryInventoryPanel->clearSelection();
}
}
@@ -720,7 +709,7 @@ void LLLandmarksPanel::initListCommandsHandlers()
void LLLandmarksPanel::updateListCommands()
{
bool add_folder_enabled = isActionEnabled("category");
- bool trash_enabled = isActionEnabled("delete");
+ bool trash_enabled = isActionEnabled("delete") && (isFolderSelected() || isLandmarkSelected());
// keep Options & Add Landmark buttons always enabled
mListCommands->getChildView(ADD_FOLDER_BUTTON_NAME)->setEnabled(add_folder_enabled);
@@ -731,14 +720,9 @@ void LLLandmarksPanel::onActionsButtonClick()
{
LLToggleableMenu* menu = mGearFolderMenu;
- LLFolderViewItem* cur_item = NULL;
if(mCurrentSelectedList)
{
- cur_item = mCurrentSelectedList->getRootFolder()->getCurSelectedItem();
- if(!cur_item)
- return;
-
- LLFolderViewEventListener* listenerp = cur_item->getListener();
+ LLFolderViewModelItemInventory* listenerp = getCurSelectedViewModelItem();
if(!listenerp)
return;
@@ -776,6 +760,9 @@ void LLLandmarksPanel::onTrashButtonClick() const
void LLLandmarksPanel::onAddAction(const LLSD& userdata) const
{
+ LLFolderViewModelItemInventory* view_model = getCurSelectedViewModelItem();
+ LLFolderViewItem* item = getCurSelectedItem();
+
std::string command_name = userdata.asString();
if("add_landmark" == command_name)
{
@@ -791,24 +778,24 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const
}
else if ("category" == command_name)
{
- LLFolderViewItem* item = getCurSelectedItem();
if (item && mCurrentSelectedList == mLandmarksInventoryPanel)
{
- LLFolderViewEventListener* folder_bridge = NULL;
- if (item-> getListener()->getInventoryType()
+ LLFolderViewModelItem* folder_bridge = NULL;
+
+ if (view_model->getInventoryType()
== LLInventoryType::IT_LANDMARK)
{
// for a landmark get parent folder bridge
- folder_bridge = item->getParentFolder()->getListener();
+ folder_bridge = item->getParentFolder()->getViewModelItem();
}
- else if (item-> getListener()->getInventoryType()
+ else if (view_model->getInventoryType()
== LLInventoryType::IT_CATEGORY)
{
// for a folder get its own bridge
- folder_bridge = item->getListener();
+ folder_bridge = view_model;
}
- menu_create_inventory_item(mCurrentSelectedList->getRootFolder(),
+ menu_create_inventory_item(mCurrentSelectedList,
dynamic_cast<LLFolderBridge*> (folder_bridge), LLSD(
"category"), gInventory.findCategoryUUIDForType(
LLFolderType::FT_LANDMARK));
@@ -816,7 +803,7 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const
else
{
//in case My Landmarks tab is completely empty (thus cannot be determined as being selected)
- menu_create_inventory_item(mLandmarksInventoryPanel->getRootFolder(), NULL, LLSD("category"),
+ menu_create_inventory_item(mLandmarksInventoryPanel, NULL, LLSD("category"),
gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK));
if (mMyLandmarksAccordionTab)
@@ -834,9 +821,9 @@ void LLLandmarksPanel::onClipboardAction(const LLSD& userdata) const
std::string command_name = userdata.asString();
if("copy_slurl" == command_name)
{
- LLFolderViewItem* cur_item = getCurSelectedItem();
+ LLFolderViewModelItemInventory* cur_item = getCurSelectedViewModelItem();
if(cur_item)
- LLLandmarkActions::copySLURLtoClipboard(cur_item->getListener()->getUUID());
+ LLLandmarkActions::copySLURLtoClipboard(cur_item->getUUID());
}
else if ( "paste" == command_name)
{
@@ -848,7 +835,7 @@ void LLLandmarksPanel::onClipboardAction(const LLSD& userdata) const
}
else
{
- mCurrentSelectedList->getRootFolder()->doToSelected(mCurrentSelectedList->getModel(),command_name);
+ mCurrentSelectedList->doToSelected(command_name);
}
}
@@ -893,7 +880,7 @@ void LLLandmarksPanel::onFoldingAction(const LLSD& userdata)
{
if(mCurrentSelectedList)
{
- mCurrentSelectedList->getRootFolder()->doToSelected(&gInventory, userdata);
+ mCurrentSelectedList->doToSelected(userdata);
}
}
}
@@ -915,8 +902,9 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
{
std::string command_name = userdata.asString();
- LLPlacesFolderView* root_folder_view = mCurrentSelectedList ?
- static_cast<LLPlacesFolderView*>(mCurrentSelectedList->getRootFolder()) : NULL;
+ LLFolderView* root_folder_view = mCurrentSelectedList
+ ? mCurrentSelectedList->getRootFolder()
+ : NULL;
if ("collapse_all" == command_name)
{
@@ -977,18 +965,13 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
{
if (!root_folder_view) return false;
- std::set<LLUUID> selected_uuids = root_folder_view->getSelectionList();
+ std::set<LLFolderViewItem*> selected_uuids = root_folder_view->getSelectionList();
// Allow to execute the command only if it can be applied to all selected items.
- for (std::set<LLUUID>::const_iterator iter = selected_uuids.begin(); iter != selected_uuids.end(); ++iter)
+ for (std::set<LLFolderViewItem*>::const_iterator iter = selected_uuids.begin(); iter != selected_uuids.end(); ++iter)
{
- LLFolderViewItem* item = root_folder_view->getItemByID(*iter);
+ LLFolderViewItem* item = *iter;
- // If no item is found it might be a folder id.
- if (!item)
- {
- item = root_folder_view->getFolderByID(*iter);
- }
if (!item) return false;
if (!canItemBeModified(command_name, item)) return false;
@@ -1012,10 +995,10 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
if ("show_on_map" == command_name)
{
- LLFolderViewItem* cur_item = root_folder_view->getCurSelectedItem();
+ LLFolderViewModelItemInventory* cur_item = getCurSelectedViewModelItem();
if (!cur_item) return false;
- LLViewerInventoryItem* inv_item = cur_item->getInventoryItem();
+ LLViewerInventoryItem* inv_item = dynamic_cast<LLViewerInventoryItem*>(cur_item->getInventoryObject());
if (!inv_item) return false;
LLUUID asset_uuid = inv_item->getAssetUUID();
@@ -1049,7 +1032,7 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
{
if (mCurrentSelectedList)
{
- std::set<LLUUID> selection = mCurrentSelectedList->getRootFolder()->getSelectionList();
+ std::set<LLFolderViewItem*> selection = mCurrentSelectedList->getRootFolder()->getSelectionList();
if (!selection.empty())
{
return ( 1 == selection.size() && !LLAgentPicksInfo::getInstance()->isPickLimitReached() );
@@ -1105,27 +1088,23 @@ void LLLandmarksPanel::onMenuVisibilityChange(LLUICtrl* ctrl, const LLSD& param)
{
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- std::set<LLUUID> selected_uuids = root_folder_view->getSelectionList();
+ std::set<LLFolderViewItem*> selected_items = root_folder_view->getSelectionList();
// Iterate through selected items to find out if any of these items are in Trash
// or all the items are in Trash category.
- for (std::set<LLUUID>::const_iterator iter = selected_uuids.begin(); iter != selected_uuids.end(); ++iter)
+ for (std::set<LLFolderViewItem*>::const_iterator iter = selected_items.begin(); iter != selected_items.end(); ++iter)
{
- LLFolderViewItem* item = root_folder_view->getItemByID(*iter);
+ LLFolderViewItem* item = *iter;
// If no item is found it might be a folder id.
- if (!item)
- {
- item = root_folder_view->getFolderByID(*iter);
- }
if (!item) continue;
- LLFolderViewEventListener* listenerp = item->getListener();
+ LLFolderViewModelItemInventory* listenerp = static_cast<LLFolderViewModelItemInventory*>(item->getViewModelItem());
if(!listenerp) continue;
// Trash category itself should not be included because it can't be
// actually restored from trash.
- are_all_items_in_trash &= listenerp->isItemInTrash() && *iter != trash_id;
+ are_all_items_in_trash &= listenerp->isItemInTrash() && listenerp->getUUID() != trash_id;
// If there are any selected items in Trash including the Trash category itself
// we show "Restore Item" in context menu and hide other irrelevant items.
@@ -1164,7 +1143,7 @@ bool LLLandmarksPanel::canItemBeModified(const std::string& command_name, LLFold
bool can_be_modified = false;
// landmarks can be modified in any other accordion...
- if (item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK)
+ if (static_cast<LLFolderViewModelItemInventory*>(item->getViewModelItem())->getInventoryType() == LLInventoryType::IT_LANDMARK)
{
can_be_modified = true;
@@ -1202,7 +1181,7 @@ bool LLLandmarksPanel::canItemBeModified(const std::string& command_name, LLFold
if (can_be_modified)
{
- LLFolderViewEventListener* listenerp = item->getListener();
+ LLFolderViewModelItemInventory* listenerp = static_cast<LLFolderViewModelItemInventory*>(item->getViewModelItem());
if ("cut" == command_name)
{
@@ -1262,8 +1241,9 @@ bool LLLandmarksPanel::handleDragAndDropToTrash(BOOL drop, EDragAndDropType carg
LLInventoryItem* item = static_cast<LLInventoryItem*>(cargo_data);
if (item)
{
- LLFolderViewItem* fv_item = (mCurrentSelectedList && mCurrentSelectedList->getRootFolder()) ?
- mCurrentSelectedList->getRootFolder()->getItemByID(item->getUUID()) : NULL;
+ LLFolderViewItem* fv_item = mCurrentSelectedList
+ ? mCurrentSelectedList->getItemByID(item->getUUID())
+ : NULL;
if (fv_item)
{
@@ -1391,7 +1371,7 @@ void LLLandmarksPanel::doCreatePick(LLLandmark* landmark)
static void filter_list(LLPlacesInventoryPanel* inventory_list, const std::string& string)
{
// When search is cleared, restore the old folder state.
- if (!inventory_list->getRootFolder()->getFilterSubString().empty() && string == "")
+ if (!inventory_list->getFilterSubString().empty() && string == "")
{
inventory_list->setFilterSubString(LLStringUtil::null);
// Re-open folders that were open before
@@ -1405,7 +1385,7 @@ static void filter_list(LLPlacesInventoryPanel* inventory_list, const std::strin
}
// save current folder open state if no filter currently applied
- if (inventory_list->getRootFolder()->getFilterSubString().empty())
+ if (inventory_list->getFilterSubString().empty())
{
inventory_list->saveFolderState();
}
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index b2f4e92473..8fae0f0b67 100644
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -44,6 +44,7 @@ class LLMenuGL;
class LLToggleableMenu;
class LLInventoryPanel;
class LLPlacesInventoryPanel;
+class LLFolderViewModelItemInventory;
class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
{
@@ -84,9 +85,11 @@ protected:
* @return true - if current selected panel is not null and selected item is a landmark
*/
bool isLandmarkSelected() const;
+ bool isFolderSelected() const;
bool isReceivedFolderSelected() const;
void doActionOnCurSelectedLandmark(LLLandmarkList::loaded_callback_t cb);
LLFolderViewItem* getCurSelectedItem() const;
+ LLFolderViewModelItemInventory* getCurSelectedViewModelItem() const;
/**
* Selects item with "obj_id" in "inventory_list" and scrolls accordion
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 3bb3e5cf47..bcb90bcb56 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -139,14 +139,17 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
mLogoImage = LLUI::getUIImage("startup_logo");
buildFromFile( "panel_login.xml");
-
+
reshape(rect.getWidth(), rect.getHeight());
- getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this);
+ LLLineEditor* password_edit(getChild<LLLineEditor>("password_edit"));
+ password_edit->setKeystrokeCallback(onPassKey, this);
+ // STEAM-14: When user presses Enter with this field in focus, initiate login
+ password_edit->setCommitCallback(boost::bind(&LLPanelLogin::onClickConnect, this));
// change z sort of clickable text to be behind buttons
sendChildToBack(getChildView("forgot_password_text"));
-
+
LLComboBox* location_combo = getChild<LLComboBox>("start_location_combo");
updateLocationSelectorsVisibility(); // separate so that it can be called from preferences
location_combo->setFocusLostCallback(boost::bind(&LLPanelLogin::onLocationSLURL, this));
@@ -220,14 +223,17 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
// get the web browser control
LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
web_browser->addObserver(this);
-
+
reshapeBrowser();
loadLoginPage();
-
+
// Show last logged in user favorites in "Start at" combo.
addUsersWithFavoritesToUsername();
- getChild<LLComboBox>("username_combo")->setTextChangedCallback(boost::bind(&LLPanelLogin::addFavoritesToStartLocation, this));
+ LLComboBox* username_combo(getChild<LLComboBox>("username_combo"));
+ username_combo->setTextChangedCallback(boost::bind(&LLPanelLogin::addFavoritesToStartLocation, this));
+ // STEAM-14: When user presses Enter with this field in focus, initiate login
+ username_combo->setCommitCallback(boost::bind(&LLPanelLogin::onClickConnect, this));
}
void LLPanelLogin::addUsersWithFavoritesToUsername()
@@ -744,63 +750,48 @@ void LLPanelLogin::setAlwaysRefresh(bool refresh)
void LLPanelLogin::loadLoginPage()
{
if (!sInstance) return;
-
- std::ostringstream oStr;
- std::string login_page = LLGridManager::getInstance()->getLoginPage();
+ LLURI login_page = LLURI(LLGridManager::getInstance()->getLoginPage());
+ LLSD params(login_page.queryMap());
- oStr << login_page;
-
- // Use the right delimeter depending on how LLURI parses the URL
- LLURI login_page_uri = LLURI(login_page);
-
- std::string first_query_delimiter = "&";
- if (login_page_uri.queryMap().size() == 0)
- {
- first_query_delimiter = "?";
- }
+ LL_DEBUGS("AppInit") << "login_page: " << login_page << LL_ENDL;
// Language
- std::string language = LLUI::getLanguage();
- oStr << first_query_delimiter<<"lang=" << language;
-
+ params["lang"] = LLUI::getLanguage();
+
// First Login?
if (gSavedSettings.getBOOL("FirstLoginThisInstall"))
{
- oStr << "&firstlogin=TRUE";
+ params["firstlogin"] = "TRUE"; // not bool: server expects string TRUE
}
// Channel and Version
- std::string version = llformat("%s (%d)",
- LLVersionInfo::getShortVersion().c_str(),
- LLVersionInfo::getBuild());
+ params["version"] = llformat("%s (%d)",
+ LLVersionInfo::getShortVersion().c_str(),
+ LLVersionInfo::getBuild());
+ params["channel"] = LLVersionInfo::getChannel();
- char* curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0);
- char* curl_version = curl_escape(version.c_str(), 0);
+ // Grid
+ params["grid"] = LLGridManager::getInstance()->getGridId();
- oStr << "&channel=" << curl_channel;
- oStr << "&version=" << curl_version;
+ // add OS info
+ params["os"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
- curl_free(curl_channel);
- curl_free(curl_version);
+ // sourceid
+ params["sourceid"] = gSavedSettings.getString("sourceid");
+
+ // Make an LLURI with this augmented info
+ LLURI login_uri(LLURI::buildHTTP(login_page.authority(),
+ login_page.path(),
+ params));
- // Grid
- char* curl_grid = curl_escape(LLGridManager::getInstance()->getGridId().c_str(), 0);
- oStr << "&grid=" << curl_grid;
- curl_free(curl_grid);
-
- // add OS info
- char * os_info = curl_escape(LLAppViewer::instance()->getOSInfo().getOSStringSimple().c_str(), 0);
- oStr << "&os=" << os_info;
- curl_free(os_info);
-
gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid());
-
+
LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
- if (web_browser->getCurrentNavUrl() != oStr.str())
+ if (web_browser->getCurrentNavUrl() != login_uri.asString())
{
- LL_DEBUGS("AppInit")<<oStr.str()<<LL_ENDL;
- web_browser->navigateTo( oStr.str(), "text/html" );
+ LL_DEBUGS("AppInit") << "loading: " << login_uri << LL_ENDL;
+ web_browser->navigateTo( login_uri.asString(), "text/html" );
}
}
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 9f3273da2d..d6535c88e9 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -47,12 +47,14 @@
#include "llresmgr.h"
#include "llscrollcontainer.h"
#include "llsdserialize.h"
+#include "llsdparam.h"
#include "llspinctrl.h"
#include "lltoggleablemenu.h"
#include "lltooldraganddrop.h"
#include "llviewermenu.h"
#include "llviewertexturelist.h"
#include "llsidepanelinventory.h"
+#include "llfolderview.h"
const std::string FILTERS_FILENAME("filters.xml");
@@ -105,7 +107,6 @@ LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p)
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));
@@ -116,7 +117,7 @@ LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p)
mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLPanelMainInventory::toggleFindOptions, this));
mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLPanelMainInventory::resetFilters, this));
mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLPanelMainInventory::setSortBy, this, _2));
- mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars));
+ mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars, this));
mSavedFolderState = new LLSaveFolderState();
mSavedFolderState->setApply(FALSE);
@@ -129,7 +130,7 @@ BOOL LLPanelMainInventory::postBuild()
mFilterTabs = getChild<LLTabContainer>("inventory filter tabs");
mFilterTabs->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterSelected, this));
- //panel->getFilter()->markDefault();
+ //panel->getFilter().markDefault();
// Set up the default inv. panel/filter settings.
mActivePanel = getChild<LLInventoryPanel>("All Items");
@@ -137,7 +138,7 @@ BOOL LLPanelMainInventory::postBuild()
{
// "All Items" is the previous only view, so it gets the InventorySortOrder
mActivePanel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER));
- mActivePanel->getFilter()->markDefault();
+ mActivePanel->getFilter().markDefault();
mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2));
mResortActivePanel = true;
@@ -148,7 +149,7 @@ BOOL LLPanelMainInventory::postBuild()
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->getFilter().markDefault();
recent_items_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, recent_items_panel, _1, _2));
}
@@ -167,11 +168,14 @@ BOOL LLPanelMainInventory::postBuild()
// Note that the "All Items" settings do not persist.
if(recent_items_panel)
{
- if(savedFilterState.has(recent_items_panel->getFilter()->getName()))
+ 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);
+ recent_items_panel->getFilter().getName());
+ LLInventoryFilter::Params p;
+ LLParamSDParser parser;
+ parser.readSD(recent_items, p);
+ recent_items_panel->getFilter().fromParams(p);
}
}
@@ -208,24 +212,28 @@ LLPanelMainInventory::~LLPanelMainInventory( void )
LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>("All Items");
if (all_items_panel)
{
- LLInventoryFilter* filter = all_items_panel->getFilter();
- if (filter)
+ LLSD filterState;
+ LLInventoryPanel::InventoryState p;
+ all_items_panel->getFilter().toParams(p.filter);
+ all_items_panel->getRootViewModel().getSorter().toParams(p.sort);
+ if (p.validateBlock(false))
{
- LLSD filterState;
- filter->toLLSD(filterState);
- filterRoot[filter->getName()] = filterState;
+ LLParamSDParser().writeSD(filterState, p);
+ filterRoot[all_items_panel->getName()] = filterState;
}
}
- LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
- if (recent_items_panel)
+ LLInventoryPanel* panel = findChild<LLInventoryPanel>("Recent Items");
+ if (panel)
{
- LLInventoryFilter* filter = recent_items_panel->getFilter();
- if (filter)
+ LLSD filterState;
+ LLInventoryPanel::InventoryState p;
+ panel->getFilter().toParams(p.filter);
+ panel->getRootViewModel().getSorter().toParams(p.sort);
+ if (p.validateBlock(false))
{
- LLSD filterState;
- filter->toLLSD(filterState);
- filterRoot[filter->getName()] = filterState;
+ LLParamSDParser().writeSD(filterState, p);
+ filterRoot[panel->getName()] = filterState;
}
}
@@ -285,7 +293,7 @@ BOOL LLPanelMainInventory::handleKeyHere(KEY key, MASK mask)
void LLPanelMainInventory::doToSelected(const LLSD& userdata)
{
- getPanel()->getRootFolder()->doToSelected(&gInventory, userdata);
+ getPanel()->doToSelected(userdata);
}
void LLPanelMainInventory::closeAllFolders()
@@ -307,13 +315,13 @@ void LLPanelMainInventory::newWindow()
void LLPanelMainInventory::doCreate(const LLSD& userdata)
{
reset_inventory_filter();
- menu_create_inventory_item(getPanel()->getRootFolder(), NULL, userdata);
+ menu_create_inventory_item(getPanel(), NULL, userdata);
}
void LLPanelMainInventory::resetFilters()
{
LLFloaterInventoryFinder *finder = getFinder();
- getActivePanel()->getFilter()->resetDefault();
+ getActivePanel()->getFilter().resetDefault();
if (finder)
{
finder->updateElementsFromFilter();
@@ -418,7 +426,7 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
}
// save current folder open state if no filter currently applied
- if (!mActivePanel->getRootFolder()->isFilterModified())
+ if (!mActivePanel->getFilter().isNotDefault())
{
mSavedFolderState->setApply(FALSE);
mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
@@ -480,13 +488,13 @@ void LLPanelMainInventory::onFilterSelected()
}
setFilterSubString(mFilterSubString);
- LLInventoryFilter* filter = mActivePanel->getFilter();
+ LLInventoryFilter& filter = mActivePanel->getFilter();
LLFloaterInventoryFinder *finder = getFinder();
if (finder)
{
- finder->changeFilter(filter);
+ finder->changeFilter(&filter);
}
- if (filter->isActive())
+ if (filter.isActive())
{
// If our filter is active we may be the first thing requiring a fetch so we better start it here.
LLInventoryModelBackgroundFetch::instance().start();
@@ -599,12 +607,11 @@ void LLPanelMainInventory::onFocusReceived()
void LLPanelMainInventory::setFilterTextFromFilter()
{
- mFilterText = mActivePanel->getFilter()->getFilterText();
+ mFilterText = mActivePanel->getFilter().getFilterText();
}
void LLPanelMainInventory::toggleFindOptions()
{
- LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_TOGGLE);
LLFloater *floater = getFinder();
if (!floater)
{
@@ -649,7 +656,7 @@ LLFloaterInventoryFinder* LLPanelMainInventory::getFinder()
LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* inventory_view) :
LLFloater(LLSD()),
mPanelMainInventory(inventory_view),
- mFilter(inventory_view->getPanel()->getFilter())
+ mFilter(&inventory_view->getPanel()->getFilter())
{
buildFromFile("floater_inventory_view_finder.xml");
updateElementsFromFilter();
@@ -726,7 +733,6 @@ void LLFloaterInventoryFinder::updateElementsFromFilter()
void LLFloaterInventoryFinder::draw()
{
- LLMemType mt(LLMemType::MTYPE_INVENTORY_DRAW);
U64 filter = 0xffffffffffffffffULL;
BOOL filtered_by_all_types = TRUE;
@@ -962,7 +968,7 @@ void LLPanelMainInventory::onTrashButtonClick()
void LLPanelMainInventory::onClipboardAction(const LLSD& userdata)
{
std::string command_name = userdata.asString();
- getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name);
+ getActivePanel()->doToSelected(command_name);
}
void LLPanelMainInventory::saveTexture(const LLSD& userdata)
@@ -973,7 +979,7 @@ void LLPanelMainInventory::saveTexture(const LLSD& userdata)
return;
}
- const LLUUID& item_id = current_item->getListener()->getUUID();
+ const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES);
if (preview_texture)
{
@@ -1046,7 +1052,7 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
{
return;
}
- const LLUUID item_id = current_item->getListener()->getUUID();
+ const LLUUID item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
LLViewerInventoryItem *item = gInventory.getItem(item_id);
if (item)
{
@@ -1061,7 +1067,7 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
{
return;
}
- current_item->getListener()->performAction(getActivePanel()->getModel(), "goto");
+ static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->performAction(getActivePanel()->getModel(), "goto");
}
if (command_name == "find_links")
@@ -1071,17 +1077,17 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
{
return;
}
- const LLUUID& item_id = current_item->getListener()->getUUID();
- const std::string &item_name = current_item->getListener()->getName();
+ const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
+ const std::string &item_name = current_item->getViewModelItem()->getName();
mFilterSubString = item_name;
- LLInventoryFilter *filter = mActivePanel->getFilter();
- filter->setFilterSubString(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);
- filter->setFilterLinks(LLInventoryFilter::FILTERLINK_ONLY_LINKS);
+ filter.setFilterUUID(item_id);
+ filter.setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ filter.setFilterLinks(LLInventoryFilter::FILTERLINK_ONLY_LINKS);
}
}
@@ -1090,11 +1096,11 @@ bool LLPanelMainInventory::isSaveTextureEnabled(const LLSD& userdata)
LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
if (current_item)
{
- LLViewerInventoryItem *inv_item = current_item->getInventoryItem();
+ LLViewerInventoryItem *inv_item = dynamic_cast<LLViewerInventoryItem*>(static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getInventoryObject());
if(inv_item)
{
bool can_save = inv_item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
- LLInventoryType::EType curr_type = current_item->getListener()->getInventoryType();
+ LLInventoryType::EType curr_type = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getInventoryType();
return can_save && (curr_type == LLInventoryType::IT_TEXTURE || curr_type == LLInventoryType::IT_SNAPSHOT);
}
}
@@ -1106,28 +1112,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
const std::string command_name = userdata.asString();
if (command_name == "delete")
{
- BOOL can_delete = FALSE;
- LLFolderView* root = getActivePanel()->getRootFolder();
- if (root)
- {
- can_delete = TRUE;
- std::set<LLUUID> selection_set = root->getSelectionList();
- if (selection_set.empty()) return FALSE;
- for (std::set<LLUUID>::iterator iter = selection_set.begin();
- iter != selection_set.end();
- ++iter)
- {
- const LLUUID &item_id = (*iter);
- LLFolderViewItem *item = root->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;
+ return getActivePanel()->isSelectionRemovable();
}
if (command_name == "save_texture")
{
@@ -1137,7 +1122,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
{
LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
if (!current_item) return FALSE;
- const LLUUID& item_id = current_item->getListener()->getUUID();
+ const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
const LLViewerInventoryItem *item = gInventory.getItem(item_id);
if (item && item->getIsLinkType() && !item->getIsBrokenLink())
{
@@ -1149,11 +1134,11 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
if (command_name == "find_links")
{
LLFolderView* root = getActivePanel()->getRootFolder();
- std::set<LLUUID> selection_set = root->getSelectionList();
+ std::set<LLFolderViewItem*> selection_set = root->getSelectionList();
if (selection_set.size() != 1) return FALSE;
LLFolderViewItem* current_item = root->getCurSelectedItem();
if (!current_item) return FALSE;
- const LLUUID& item_id = current_item->getListener()->getUUID();
+ const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
const LLInventoryObject *obj = gInventory.getObject(item_id);
if (obj && !obj->getIsLinkType() && LLAssetType::lookupCanLink(obj->getType()))
{
@@ -1166,7 +1151,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
{
LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
if (!current_item) return FALSE;
- const LLUUID& item_id = current_item->getListener()->getUUID();
+ const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
const LLViewerInventoryItem *item = gInventory.getItem(item_id);
if (item && item->getIsBrokenLink())
{
@@ -1177,6 +1162,8 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
if (command_name == "share")
{
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item) return FALSE;
LLSidepanelInventory* parent = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
return parent ? parent->canShare() : FALSE;
}
diff --git a/indra/newview/llpanelmarketplaceinbox.cpp b/indra/newview/llpanelmarketplaceinbox.cpp
index 66c9c323cb..dcecce6fe4 100644
--- a/indra/newview/llpanelmarketplaceinbox.cpp
+++ b/indra/newview/llpanelmarketplaceinbox.cpp
@@ -94,14 +94,14 @@ LLInventoryPanel * LLPanelMarketplaceInbox::setupInventoryPanel()
mInventoryPanel->setShape(inventory_placeholder_rect);
// Set the sort order newest to oldest
- mInventoryPanel->setSortOrder(LLInventoryFilter::SO_DATE);
- mInventoryPanel->getFilter()->markDefault();
+ mInventoryPanel->getFolderViewModel()->setSorter(LLInventoryFilter::SO_DATE);
+ mInventoryPanel->getFilter().markDefault();
// Set selection callback for proper update of inventory status buttons
mInventoryPanel->setSelectCallback(boost::bind(&LLPanelMarketplaceInbox::onSelectionChange, this));
// Set up the note to display when the inbox is empty
- mInventoryPanel->getFilter()->setEmptyLookupMessage("InventoryInboxNoItems");
+ mInventoryPanel->getFilter().setEmptyLookupMessage("InventoryInboxNoItems");
// Hide the placeholder text
inbox_inventory_placeholder->setVisible(FALSE);
@@ -115,8 +115,8 @@ void LLPanelMarketplaceInbox::onFocusReceived()
if (sidepanel_inventory)
{
sidepanel_inventory->clearSelections(true, false);
- }
-
+ }
+
gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
}
@@ -128,7 +128,6 @@ BOOL LLPanelMarketplaceInbox::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL dr
U32 LLPanelMarketplaceInbox::getFreshItemCount() const
{
-#if SUPPORTING_FRESH_ITEM_COUNT
//
// NOTE: When turning this on, be sure to test the no inbox/outbox case because this code probably
@@ -139,7 +138,7 @@ U32 LLPanelMarketplaceInbox::getFreshItemCount() const
if (mInventoryPanel)
{
- const LLFolderViewFolder * inbox_folder = mInventoryPanel->getRootFolder();
+ LLFolderViewFolder * inbox_folder = mInventoryPanel->getRootFolder();
if (inbox_folder)
{
@@ -168,15 +167,12 @@ U32 LLPanelMarketplaceInbox::getFreshItemCount() const
if (inbox_item_view && inbox_item_view->isFresh())
{
fresh_item_count++;
- }
- }
+ }
+ }
}
}
return fresh_item_count;
-#else
- return getTotalItemCount();
-#endif
}
U32 LLPanelMarketplaceInbox::getTotalItemCount() const
@@ -231,7 +227,6 @@ void LLPanelMarketplaceInbox::draw()
args["[NUM]"] = item_count_str;
mInboxButton->setLabel(getString("InboxLabelWithArg", args));
-#if SUPPORTING_FRESH_ITEM_COUNT
// set green text to fresh item count
U32 fresh_item_count = getFreshItemCount();
mFreshCountCtrl->setVisible((fresh_item_count > 0));
@@ -240,9 +235,6 @@ void LLPanelMarketplaceInbox::draw()
{
mFreshCountCtrl->setTextArg("[NUM]", llformat("%d", fresh_item_count));
}
-#else
- mFreshCountCtrl->setVisible(FALSE);
-#endif
}
else
{
diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp
index 678e4f2843..adfb2dee86 100644
--- a/indra/newview/llpanelmarketplaceinboxinventory.cpp
+++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp
@@ -29,7 +29,8 @@
#include "llpanelmarketplaceinboxinventory.h"
#include "llfolderview.h"
-#include "llfoldervieweventlistener.h"
+#include "llfolderviewitem.h"
+#include "llfolderviewmodel.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
#include "llpanellandmarks.h"
@@ -39,6 +40,8 @@
#define DEBUGGING_FRESHNESS 0
+const LLColor4U DEFAULT_WHITE(255, 255, 255);
+
//
// statics
//
@@ -53,107 +56,42 @@ static LLDefaultChildRegistry::Register<LLInboxFolderViewItem> r3("inbox_folder_
//
LLInboxInventoryPanel::LLInboxInventoryPanel(const LLInboxInventoryPanel::Params& p)
- : LLInventoryPanel(p)
-{
-}
+: LLInventoryPanel(p)
+{}
LLInboxInventoryPanel::~LLInboxInventoryPanel()
-{
-}
-
-// virtual
-void LLInboxInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params)
-{
- // Determine the root folder in case specified, and
- // build the views starting with that folder.
-
- LLUUID root_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false);
-
- // leslie -- temporary HACK to work around sim not creating inbox with proper system folder type
- if (root_id.isNull())
- {
- std::string start_folder_name(params.start_folder());
-
- LLInventoryModel::cat_array_t* cats;
- LLInventoryModel::item_array_t* items;
-
- gInventory.getDirectDescendentsOf(gInventory.getRootFolderID(), cats, items);
-
- if (cats)
- {
- for (LLInventoryModel::cat_array_t::const_iterator cat_it = cats->begin(); cat_it != cats->end(); ++cat_it)
- {
- LLInventoryCategory* cat = *cat_it;
-
- if (cat->getName() == start_folder_name)
- {
- root_id = cat->getUUID();
- break;
- }
- }
- }
-
- if (root_id == LLUUID::null)
- {
- llwarns << "No category found that matches inbox inventory panel start_folder: " << start_folder_name << llendl;
- }
- }
- // leslie -- end temporary HACK
-
- if (root_id == LLUUID::null)
- {
- llwarns << "Inbox inventory panel has no root folder!" << llendl;
- root_id = LLUUID::generateNewID();
- }
-
- LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_CATEGORY,
- LLAssetType::AT_CATEGORY,
- LLInventoryType::IT_CATEGORY,
- this,
- NULL,
- root_id);
-
- mFolderRoot = createFolderView(new_listener, params.use_label_suffix());
-}
+{}
LLFolderViewFolder * LLInboxInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge)
{
+ LLUIColor item_color = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
+
LLInboxFolderViewFolder::Params params;
params.name = bridge->getDisplayName();
- params.icon = bridge->getIcon();
- params.icon_open = bridge->getOpenIcon();
-
- if (mShowItemLinkOverlays) // if false, then links show up just like normal items
- {
- params.icon_overlay = LLUI::getUIImage("Inv_Link");
- }
-
params.root = mFolderRoot;
params.listener = bridge;
params.tool_tip = params.name;
+ params.font_color = item_color;
+ params.font_highlight_color = item_color;
return LLUICtrlFactory::create<LLInboxFolderViewFolder>(params);
}
LLFolderViewItem * LLInboxInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge)
{
+ LLUIColor item_color = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
+
LLInboxFolderViewItem::Params params;
params.name = bridge->getDisplayName();
- params.icon = bridge->getIcon();
- params.icon_open = bridge->getOpenIcon();
-
- if (mShowItemLinkOverlays) // if false, then links show up just like normal items
- {
- params.icon_overlay = LLUI::getUIImage("Inv_Link");
- }
-
params.creation_date = bridge->getCreationDate();
params.root = mFolderRoot;
params.listener = bridge;
params.rect = LLRect (0, 0, 0, 0);
params.tool_tip = params.name;
+ params.font_color = item_color;
+ params.font_highlight_color = item_color;
return LLUICtrlFactory::create<LLInboxFolderViewItem>(params);
}
@@ -163,26 +101,40 @@ LLFolderViewItem * LLInboxInventoryPanel::createFolderViewItem(LLInvFVBridge * b
//
LLInboxFolderViewFolder::LLInboxFolderViewFolder(const Params& p)
- : LLFolderViewFolder(p)
- , LLBadgeOwner(getHandle())
- , mFresh(false)
+: LLFolderViewFolder(p),
+ LLBadgeOwner(getHandle()),
+ mFresh(false)
{
-#if SUPPORTING_FRESH_ITEM_COUNT
initBadgeParams(p.new_badge());
-#endif
+}
+
+void LLInboxFolderViewFolder::addItem(LLFolderViewItem* item)
+{
+ LLFolderViewFolder::addItem(item);
+
+ if(item)
+ {
+ LLInvFVBridge* itemBridge = static_cast<LLInvFVBridge*>(item->getViewModelItem());
+ LLFolderBridge * bridge = static_cast<LLFolderBridge *>(getViewModelItem());
+ bridge->updateHierarchyCreationDate(itemBridge->getCreationDate());
+ }
+
+ // Compute freshness if our parent is the root folder for the inbox
+ if (mParentFolder == mRoot)
+ {
+ computeFreshness();
+ }
}
// virtual
void LLInboxFolderViewFolder::draw()
{
-#if SUPPORTING_FRESH_ITEM_COUNT
if (!badgeHasParent())
{
addBadgeToParentPanel();
}
setBadgeVisibility(mFresh);
-#endif
LLFolderViewFolder::draw();
}
@@ -207,7 +159,7 @@ void LLInboxFolderViewFolder::computeFreshness()
if (last_expansion_utc > 0)
{
- mFresh = (mCreationDate > last_expansion_utc);
+ mFresh = (static_cast<LLFolderViewModelItemInventory*>(getViewModelItem())->getCreationDate() > last_expansion_utc);
#if DEBUGGING_FRESHNESS
if (mFresh)
@@ -229,16 +181,6 @@ void LLInboxFolderViewFolder::deFreshify()
gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
}
-void LLInboxFolderViewFolder::setCreationDate(time_t creation_date_utc)
-{
- mCreationDate = creation_date_utc;
-
- if (mParentFolder == mRoot)
- {
- computeFreshness();
- }
-}
-
//
// LLInboxFolderViewItem Implementation
//
@@ -248,24 +190,18 @@ LLInboxFolderViewItem::LLInboxFolderViewItem(const Params& p)
, LLBadgeOwner(getHandle())
, mFresh(false)
{
-#if SUPPORTING_FRESH_ITEM_COUNT
initBadgeParams(p.new_badge());
-#endif
}
-BOOL LLInboxFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* root)
+void LLInboxFolderViewItem::addToFolder(LLFolderViewFolder* folder)
{
- BOOL retval = LLFolderViewItem::addToFolder(folder, root);
+ LLFolderViewItem::addToFolder(folder);
-#if SUPPORTING_FRESH_ITEM_COUNT
// Compute freshness if our parent is the root folder for the inbox
if (mParentFolder == mRoot)
{
computeFreshness();
}
-#endif
-
- return retval;
}
BOOL LLInboxFolderViewItem::handleDoubleClick(S32 x, S32 y, MASK mask)
@@ -278,14 +214,12 @@ BOOL LLInboxFolderViewItem::handleDoubleClick(S32 x, S32 y, MASK mask)
// virtual
void LLInboxFolderViewItem::draw()
{
-#if SUPPORTING_FRESH_ITEM_COUNT
if (!badgeHasParent())
{
addBadgeToParentPanel();
}
setBadgeVisibility(mFresh);
-#endif
LLFolderViewItem::draw();
}
@@ -303,7 +237,7 @@ void LLInboxFolderViewItem::computeFreshness()
if (last_expansion_utc > 0)
{
- mFresh = (mCreationDate > last_expansion_utc);
+ mFresh = (static_cast<LLFolderViewModelItemInventory*>(getViewModelItem())->getCreationDate() > last_expansion_utc);
#if DEBUGGING_FRESHNESS
if (mFresh)
diff --git a/indra/newview/llpanelmarketplaceinboxinventory.h b/indra/newview/llpanelmarketplaceinboxinventory.h
index d6b827ee3e..c05e18c300 100644
--- a/indra/newview/llpanelmarketplaceinboxinventory.h
+++ b/indra/newview/llpanelmarketplaceinboxinventory.h
@@ -33,7 +33,6 @@
#include "llfolderviewitem.h"
-#define SUPPORTING_FRESH_ITEM_COUNT 1
@@ -47,9 +46,6 @@ public:
~LLInboxInventoryPanel();
// virtual
- void buildFolderView(const LLInventoryPanel::Params& params);
-
- // virtual
LLFolderViewFolder * createFolderViewFolder(LLInvFVBridge * bridge);
LLFolderViewItem * createFolderViewItem(LLInvFVBridge * bridge);
};
@@ -63,13 +59,13 @@ public:
Optional<LLBadge::Params> new_badge;
Params()
- : new_badge("new_badge")
- {
- }
+ : new_badge("new_badge")
+ {}
};
LLInboxFolderViewFolder(const Params& p);
+ void addItem(LLFolderViewItem* item);
void draw();
void selectItem();
@@ -81,8 +77,6 @@ public:
bool isFresh() const { return mFresh; }
protected:
- void setCreationDate(time_t creation_date_utc);
-
bool mFresh;
};
@@ -95,14 +89,13 @@ public:
Optional<LLBadge::Params> new_badge;
Params()
- : new_badge("new_badge")
- {
- }
+ : new_badge("new_badge")
+ {}
};
LLInboxFolderViewItem(const Params& p);
- BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root);
+ void addToFolder(LLFolderViewFolder* folder);
BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
void draw();
diff --git a/indra/newview/llpanelmarketplaceoutboxinventory.cpp b/indra/newview/llpanelmarketplaceoutboxinventory.cpp
deleted file mode 100644
index ff62cb23db..0000000000
--- a/indra/newview/llpanelmarketplaceoutboxinventory.cpp
+++ /dev/null
@@ -1,156 +0,0 @@
-/**
- * @file llpanelmarketplaceoutboxinventory.cpp
- * @brief LLOutboxInventoryPanel class definition
- *
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llpanelmarketplaceoutboxinventory.h"
-
-#include "llfolderview.h"
-#include "llfoldervieweventlistener.h"
-#include "llinventorybridge.h"
-#include "llinventoryfunctions.h"
-#include "llpanellandmarks.h"
-#include "llplacesinventorybridge.h"
-#include "lltrans.h"
-#include "llviewerfoldertype.h"
-
-
-//
-// statics
-//
-
-static LLDefaultChildRegistry::Register<LLOutboxInventoryPanel> r1("outbox_inventory_panel");
-static LLDefaultChildRegistry::Register<LLOutboxFolderViewFolder> r2("outbox_folder_view_folder");
-
-
-//
-// LLOutboxInventoryPanel Implementation
-//
-
-LLOutboxInventoryPanel::LLOutboxInventoryPanel(const LLOutboxInventoryPanel::Params& p)
- : LLInventoryPanel(p)
-{
-}
-
-LLOutboxInventoryPanel::~LLOutboxInventoryPanel()
-{
-}
-
-// virtual
-void LLOutboxInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params)
-{
- // Determine the root folder in case specified, and
- // build the views starting with that folder.
-
- LLUUID root_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false);
-
- if (root_id == LLUUID::null)
- {
- llwarns << "Outbox inventory panel has no root folder!" << llendl;
- root_id = LLUUID::generateNewID();
- }
-
- LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_CATEGORY,
- LLAssetType::AT_CATEGORY,
- LLInventoryType::IT_CATEGORY,
- this,
- NULL,
- root_id);
-
- mFolderRoot = createFolderView(new_listener, params.use_label_suffix());
-}
-
-LLFolderViewFolder * LLOutboxInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge)
-{
- LLOutboxFolderViewFolder::Params params;
-
- params.name = bridge->getDisplayName();
- params.icon = bridge->getIcon();
- params.icon_open = bridge->getOpenIcon();
-
- if (mShowItemLinkOverlays) // if false, then links show up just like normal items
- {
- params.icon_overlay = LLUI::getUIImage("Inv_Link");
- }
-
- params.root = mFolderRoot;
- params.listener = bridge;
- params.tool_tip = params.name;
-
- return LLUICtrlFactory::create<LLOutboxFolderViewFolder>(params);
-}
-
-LLFolderViewItem * LLOutboxInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge)
-{
- LLFolderViewItem::Params params;
-
- params.name = bridge->getDisplayName();
- params.icon = bridge->getIcon();
- params.icon_open = bridge->getOpenIcon();
-
- if (mShowItemLinkOverlays) // if false, then links show up just like normal items
- {
- params.icon_overlay = LLUI::getUIImage("Inv_Link");
- }
-
- params.creation_date = bridge->getCreationDate();
- params.root = mFolderRoot;
- params.listener = bridge;
- params.rect = LLRect (0, 0, 0, 0);
- params.tool_tip = params.name;
-
- return LLUICtrlFactory::create<LLOutboxFolderViewItem>(params);
-}
-
-//
-// LLOutboxFolderViewFolder Implementation
-//
-
-LLOutboxFolderViewFolder::LLOutboxFolderViewFolder(const Params& p)
- : LLFolderViewFolder(p)
-{
-}
-
-//
-// LLOutboxFolderViewItem Implementation
-//
-
-LLOutboxFolderViewItem::LLOutboxFolderViewItem(const Params& p)
- : LLFolderViewItem(p)
-{
-}
-
-BOOL LLOutboxFolderViewItem::handleDoubleClick(S32 x, S32 y, MASK mask)
-{
- return TRUE;
-}
-
-void LLOutboxFolderViewItem::openItem()
-{
- // Intentionally do nothing to block attaching items from the outbox
-}
-
-// eof
diff --git a/indra/newview/llpanelmarketplaceoutboxinventory.h b/indra/newview/llpanelmarketplaceoutboxinventory.h
deleted file mode 100644
index a6c522b7c2..0000000000
--- a/indra/newview/llpanelmarketplaceoutboxinventory.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * @file llpanelmarketplaceoutboxinventory.h
- * @brief LLOutboxInventoryPanel class declaration
- *
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_OUTBOXINVENTORYPANEL_H
-#define LL_OUTBOXINVENTORYPANEL_H
-
-
-#include "llinventorypanel.h"
-#include "llfolderviewitem.h"
-
-
-class LLOutboxInventoryPanel : public LLInventoryPanel
-{
-public:
- struct Params : public LLInitParam::Block<Params, LLInventoryPanel::Params>
- {
- Params() {}
- };
-
- LLOutboxInventoryPanel(const Params& p);
- ~LLOutboxInventoryPanel();
-
- // virtual
- void buildFolderView(const LLInventoryPanel::Params& params);
-
- // virtual
- LLFolderViewFolder * createFolderViewFolder(LLInvFVBridge * bridge);
- LLFolderViewItem * createFolderViewItem(LLInvFVBridge * bridge);
-};
-
-
-class LLOutboxFolderViewFolder : public LLFolderViewFolder
-{
-public:
- struct Params : public LLInitParam::Block<Params, LLFolderViewFolder::Params>
- {
- Params() {}
- };
-
- LLOutboxFolderViewFolder(const Params& p);
-};
-
-
-class LLOutboxFolderViewItem : public LLFolderViewItem
-{
-public:
- LLOutboxFolderViewItem(const Params& p);
-
- // virtual
- BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
- void openItem();
-};
-
-
-#endif //LL_OUTBOXINVENTORYPANEL_H
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index 1ca24f3031..7555ac7b2c 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -66,17 +66,19 @@
#include "llviewerobjectlist.h"
#include "llviewermessage.h"
+const LLColor4U DEFAULT_WHITE(255, 255, 255);
///----------------------------------------------------------------------------
/// Class LLTaskInvFVBridge
///----------------------------------------------------------------------------
-class LLTaskInvFVBridge : public LLFolderViewEventListener
+class LLTaskInvFVBridge : public LLFolderViewModelItemInventory
{
protected:
LLUUID mUUID;
std::string mName;
mutable std::string mDisplayName;
+ mutable std::string mSearchableName;
LLPanelObjectInventory* mPanel;
U32 mFlags;
LLAssetType::EType mAssetType;
@@ -102,26 +104,29 @@ public:
S32 getPrice();
static bool commitBuyItem(const LLSD& notification, const LLSD& response);
- // LLFolderViewEventListener functionality
+ // LLFolderViewModelItemInventory functionality
virtual const std::string& getName() const;
virtual const std::string& getDisplayName() const;
+ virtual const std::string& getSearchableName() 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 void setCreationDate(time_t creation_date_utc);
+
virtual LLUIImagePtr getIcon() const;
virtual void openItem();
virtual BOOL canOpenItem() const { return FALSE; }
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 void removeBatch(std::vector<LLFolderViewModelItem*>& batch);
+ virtual void move(LLFolderViewModelItem* parent_listener);
virtual BOOL isItemCopyable() const;
virtual BOOL copyToClipboard() const;
virtual BOOL cutToClipboard() const;
@@ -131,11 +136,15 @@ public:
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
virtual void performAction(LLInventoryModel* model, std::string action);
virtual BOOL isUpToDate() const { return TRUE; }
- virtual BOOL hasChildren() const { return FALSE; }
+ virtual bool hasChildren() const { return FALSE; }
virtual LLInventoryType::EType getInventoryType() const { return LLInventoryType::IT_NONE; }
virtual LLWearableType::EType getWearableType() const { return LLWearableType::WT_NONE; }
+ virtual EInventorySortGroup getSortGroup() const { return SG_ITEM; }
+ virtual LLInventoryObject* getInventoryObject() const { return findInvObject(); }
+
// LLDragAndDropBridge functionality
+ virtual LLToolDragAndDrop::ESource getDragSource() const { return LLToolDragAndDrop::SOURCE_WORLD; }
virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const;
virtual BOOL dragOrDrop(MASK mask, BOOL drop,
EDragAndDropType cargo_type,
@@ -147,7 +156,8 @@ LLTaskInvFVBridge::LLTaskInvFVBridge(
LLPanelObjectInventory* panel,
const LLUUID& uuid,
const std::string& name,
- U32 flags):
+ U32 flags)
+: LLFolderViewModelItemInventory(panel->getRootViewModel()),
mUUID(uuid),
mName(name),
mPanel(panel),
@@ -330,15 +340,27 @@ const std::string& LLTaskInvFVBridge::getDisplayName() const
}
}
+ mSearchableName.assign(mDisplayName + getLabelSuffix());
+
return mDisplayName;
}
+const std::string& LLTaskInvFVBridge::getSearchableName() const
+{
+ return mSearchableName;
+}
+
+
// BUG: No creation dates for task inventory
time_t LLTaskInvFVBridge::getCreationDate() const
{
return 0;
}
+void LLTaskInvFVBridge::setCreationDate(time_t creation_date_utc)
+{}
+
+
LLUIImagePtr LLTaskInvFVBridge::getIcon() const
{
const BOOL item_is_multi = (mFlags & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS);
@@ -352,11 +374,6 @@ void LLTaskInvFVBridge::openItem()
lldebugs << "LLTaskInvFVBridge::openItem()" << llendl;
}
-void LLTaskInvFVBridge::previewItem()
-{
- openItem();
-}
-
BOOL LLTaskInvFVBridge::isItemRenameable() const
{
if(gAgent.isGodlike()) return TRUE;
@@ -467,7 +484,7 @@ BOOL LLTaskInvFVBridge::removeItem()
return FALSE;
}
-void LLTaskInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch)
+void LLTaskInvFVBridge::removeBatch(std::vector<LLFolderViewModelItem*>& batch)
{
if (!mPanel)
{
@@ -507,7 +524,7 @@ void LLTaskInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>&
}
}
-void LLTaskInvFVBridge::move(LLFolderViewEventListener* parent_listener)
+void LLTaskInvFVBridge::move(LLFolderViewModelItem* parent_listener)
{
}
@@ -709,7 +726,7 @@ public:
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 hasChildren() const;
virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const;
virtual BOOL dragOrDrop(MASK mask, BOOL drop,
EDragAndDropType cargo_type,
@@ -717,6 +734,7 @@ public:
std::string& tooltip_msg);
virtual BOOL canOpenItem() const { return TRUE; }
virtual void openItem();
+ virtual EInventorySortGroup getSortGroup() const { return SG_NORMAL_FOLDER; }
};
LLTaskCategoryBridge::LLTaskCategoryBridge(
@@ -739,15 +757,7 @@ const std::string& LLTaskCategoryBridge::getDisplayName() const
if (cat)
{
- // Localize "Contents" folder.
- if (cat->getParentUUID().isNull() && cat->getName() == "Contents")
- {
- mDisplayName.assign(LLTrans::getString("ViewerObjectContents"));
- }
- else
- {
- mDisplayName.assign(cat->getName());
- }
+ mDisplayName.assign(cat->getName());
}
return mDisplayName;
@@ -775,7 +785,7 @@ void LLTaskCategoryBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
hide_context_entries(menu, items, disabled_items);
}
-BOOL LLTaskCategoryBridge::hasChildren() const
+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.
@@ -1489,7 +1499,7 @@ LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Par
mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&do_nothing));
mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&do_nothing));
mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&do_nothing));
- mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars));
+ mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars, this));
}
// Destroys the object
@@ -1514,7 +1524,7 @@ BOOL LLPanelObjectInventory::postBuild()
void LLPanelObjectInventory::doToSelected(const LLSD& userdata)
{
- mFolders->doToSelected(&gInventory, userdata);
+ LLInventoryAction::doToSelected(&gInventory, mFolders, userdata.asString());
}
void LLPanelObjectInventory::clearContents()
@@ -1526,6 +1536,8 @@ void LLPanelObjectInventory::clearContents()
LLToolDragAndDrop::getInstance()->endDrag();
}
+ clearItemIDs();
+
if( mScroller )
{
// removes mFolders
@@ -1541,21 +1553,26 @@ void LLPanelObjectInventory::reset()
{
clearContents();
- //setBorderVisible(FALSE);
-
mCommitCallbackRegistrar.pushScope(); // push local callbacks
+ // Reset the inventory model to show all folders by default
+ mInventoryViewModel.getFilter().setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS);
+
+ // Create a new folder view root
LLRect dummy_rect(0, 1, 1, 0);
LLFolderView::Params p;
p.name = "task inventory";
p.title = "task inventory";
- p.task_id = getTaskUUID();
p.parent_panel = this;
p.tool_tip= LLTrans::getString("PanelContentsTooltip");
p.listener = LLTaskInvFVBridge::createObjectBridge(this, NULL);
+ p.folder_indentation = -14; // subtract space normally reserved for folder expanders
+ p.view_model = &mInventoryViewModel;
+ p.root = NULL;
+ p.options_menu = "menu_inventory.xml";
+
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())
@@ -1600,7 +1617,7 @@ void LLPanelObjectInventory::inventoryChanged(LLViewerObject* object,
iter != inventory->end(); )
{
LLInventoryObject* item = *iter++;
- LLFloaterProperties* floater = LLFloaterReg::findTypedInstance<LLFloaterProperties>("properites", item->getUUID());
+ LLFloaterProperties* floater = LLFloaterReg::findTypedInstance<LLFloaterProperties>("properties", item->getUUID());
if(floater)
{
floater->refresh();
@@ -1615,15 +1632,20 @@ void LLPanelObjectInventory::updateInventory()
// << " panel UUID: " << panel->mTaskUUID << "\n"
// << " task UUID: " << object->mID << llendl;
// We're still interested in this task's inventory.
- std::set<LLUUID> selected_items;
+ std::vector<LLUUID> selected_item_ids;
+ std::set<LLFolderViewItem*> selected_items;
BOOL inventory_has_focus = FALSE;
- if (mHaveInventory)
+ if (mHaveInventory && mFolders)
{
selected_items = mFolders->getSelectionList();
inventory_has_focus = gFocusMgr.childHasKeyboardFocus(mFolders);
}
-
- reset();
+ for (std::set<LLFolderViewItem*>::iterator it = selected_items.begin(), end_it = selected_items.end();
+ it != end_it;
+ ++it)
+ {
+ selected_item_ids.push_back(static_cast<LLFolderViewModelItemInventory*>((*it)->getViewModelItem())->getUUID());
+ }
LLViewerObject* objectp = gObjectList.findObject(mTaskUUID);
if (objectp)
@@ -1631,19 +1653,21 @@ void LLPanelObjectInventory::updateInventory()
LLInventoryObject* inventory_root = objectp->getInventoryRoot();
LLInventoryObject::object_list_t contents;
objectp->getInventoryContents(contents);
+
if (inventory_root)
{
- createFolderViews(inventory_root, contents);
- mHaveInventory = TRUE;
+ reset();
mIsInventoryEmpty = FALSE;
+ createFolderViews(inventory_root, contents);
mFolders->setEnabled(TRUE);
}
else
{
// TODO: create an empty inventory
mIsInventoryEmpty = TRUE;
- mHaveInventory = TRUE;
}
+
+ mHaveInventory = TRUE;
}
else
{
@@ -1653,11 +1677,12 @@ void LLPanelObjectInventory::updateInventory()
}
// 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)
+ std::vector<LLUUID>::iterator selection_it;
+ bool first_item = true;
+ for (selection_it = selected_item_ids.begin(); selection_it != selected_item_ids.end(); ++selection_it)
{
- LLFolderViewItem* selected_item = mFolders->getItemByID(*selection_it);
+ LLFolderViewItem* selected_item = getItemByID(*selection_it);
+
if (selected_item)
{
//HACK: "set" first item then "change" each other one to get keyboard focus right
@@ -1673,7 +1698,10 @@ void LLPanelObjectInventory::updateInventory()
}
}
- mFolders->requestArrange();
+ if (mFolders)
+ {
+ mFolders->requestArrange();
+ }
mInventoryNeedsUpdate = FALSE;
// Edit menu handler is set in onFocusReceived
}
@@ -1694,19 +1722,24 @@ void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root
bridge = LLTaskInvFVBridge::createObjectBridge(this, inventory_root);
if(bridge)
{
- LLFolderViewFolder* new_folder = NULL;
+ LLUIColor item_color = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
+
LLFolderViewFolder::Params p;
p.name = inventory_root->getName();
- p.icon = LLUI::getUIImage("Inv_FolderClosed");
- p.icon_open = LLUI::getUIImage("Inv_FolderOpen");
+ p.tool_tip = p.name;
p.root = mFolders;
p.listener = bridge;
- p.tool_tip = p.name;
- new_folder = LLUICtrlFactory::create<LLFolderViewFolder>(p);
- new_folder->addToFolder(mFolders, mFolders);
+ p.font_color = item_color;
+ p.font_highlight_color = item_color;
+
+ LLFolderViewFolder* new_folder = LLUICtrlFactory::create<LLFolderViewFolder>(p);
+ new_folder->addToFolder(mFolders);
new_folder->toggleOpen();
- createViewsForCategory(&contents, inventory_root, new_folder);
+ if (!contents.empty())
+ {
+ createViewsForCategory(&contents, inventory_root, new_folder);
+ }
}
}
@@ -1716,6 +1749,8 @@ void LLPanelObjectInventory::createViewsForCategory(LLInventoryObject::object_li
LLInventoryObject* parent,
LLFolderViewFolder* folder)
{
+ LLUIColor item_color = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
+
// Find all in the first pass
LLDynamicArray<obj_folder_pair*> child_categories;
LLTaskInvFVBridge* bridge;
@@ -1738,11 +1773,11 @@ void LLPanelObjectInventory::createViewsForCategory(LLInventoryObject::object_li
{
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;
+ p.font_color = item_color;
+ p.font_highlight_color = item_color;
view = LLUICtrlFactory::create<LLFolderViewFolder>(p);
child_categories.put(new obj_folder_pair(obj,
(LLFolderViewFolder*)view));
@@ -1751,15 +1786,17 @@ void LLPanelObjectInventory::createViewsForCategory(LLInventoryObject::object_li
{
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;
+ params.font_color = item_color;
+ params.font_highlight_color = item_color;
view = LLUICtrlFactory::create<LLFolderViewItem> (params);
}
- view->addToFolder(folder, mFolders);
+ view->addToFolder(folder);
+ addItemID(obj->getUUID(), view);
}
}
@@ -1827,6 +1864,7 @@ void LLPanelObjectInventory::refresh()
removeVOInventoryListener();
clearContents();
}
+ mInventoryViewModel.setTaskID(mTaskUUID);
//llinfos << "LLPanelObjectInventory::refresh() " << mTaskUUID << llendl;
}
@@ -1914,7 +1952,10 @@ void LLPanelObjectInventory::idle(void* user_data)
{
LLPanelObjectInventory* self = (LLPanelObjectInventory*)user_data;
-
+ if (self->mFolders)
+ {
+ self->mFolders->update();
+ }
if (self->mInventoryNeedsUpdate)
{
self->updateInventory();
@@ -1939,3 +1980,32 @@ void LLPanelObjectInventory::onFocusReceived()
LLPanel::onFocusReceived();
}
+
+
+LLFolderViewItem* LLPanelObjectInventory::getItemByID( const LLUUID& id )
+{
+ std::map<LLUUID, LLFolderViewItem*>::iterator map_it;
+ map_it = mItemMap.find(id);
+ if (map_it != mItemMap.end())
+ {
+ return map_it->second;
+ }
+
+ return NULL;
+}
+
+void LLPanelObjectInventory::removeItemID( const LLUUID& id )
+{
+ mItemMap.erase(id);
+}
+
+void LLPanelObjectInventory::addItemID( const LLUUID& id, LLFolderViewItem* itemp )
+{
+ mItemMap[id] = itemp;
+}
+
+void LLPanelObjectInventory::clearItemIDs()
+{
+ mItemMap.clear();
+}
+
diff --git a/indra/newview/llpanelobjectinventory.h b/indra/newview/llpanelobjectinventory.h
index 607b705f7f..f497c695b3 100644
--- a/indra/newview/llpanelobjectinventory.h
+++ b/indra/newview/llpanelobjectinventory.h
@@ -29,6 +29,7 @@
#include "llvoinventorylistener.h"
#include "llpanel.h"
+#include "llinventorypanel.h" // for LLFolderViewModelInventory
#include "llinventory.h"
@@ -55,6 +56,8 @@ public:
virtual BOOL postBuild();
+ LLFolderViewModelInventory& getRootViewModel() { return mInventoryViewModel; }
+
void doToSelected(const LLSD& userdata);
void refresh();
@@ -85,8 +88,15 @@ protected:
LLInventoryObject* parent,
LLFolderViewFolder* folder);
void clearContents();
+ LLFolderViewItem* getItemByID(const LLUUID& id);
+
+ void addItemID( const LLUUID& id, LLFolderViewItem* itemp );
+ void removeItemID(const LLUUID& id);
+ void clearItemIDs();
private:
+ std::map<LLUUID, LLFolderViewItem*> mItemMap;
+
LLScrollContainer* mScroller;
LLFolderView* mFolders;
@@ -94,6 +104,7 @@ private:
BOOL mHaveInventory;
BOOL mIsInventoryEmpty;
BOOL mInventoryNeedsUpdate;
+ LLFolderViewModelInventory mInventoryViewModel;
};
#endif // LL_LLPANELOBJECTINVENTORY_H
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index 35e2e96bab..c09d4393c8 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -169,7 +169,7 @@ public:
return menu;
}
-
+
private:
static void onCreate(const LLSD& param)
{
@@ -187,7 +187,7 @@ private:
static void populateCreateWearableSubmenus(LLMenuGL* menu)
{
LLView* menu_clothes = gMenuHolder->getChildView("COF.Gear.New_Clothes", FALSE);
- LLView* menu_bp = gMenuHolder->getChildView("COF.Geear.New_Body_Parts", FALSE);
+ LLView* menu_bp = gMenuHolder->getChildView("COF.Gear.New_Body_Parts", FALSE);
for (U8 i = LLWearableType::WT_SHAPE; i != (U8) LLWearableType::WT_COUNT; ++i)
{
@@ -200,8 +200,7 @@ private:
p.on_click.function_name = "Wearable.Create";
p.on_click.parameter = LLSD(type_name);
- LLView* parent = LLWearableType::getAssetType(type) == LLAssetType::AT_CLOTHING ?
- menu_clothes : menu_bp;
+ LLView* parent = LLWearableType::getAssetType(type) == LLAssetType::AT_CLOTHING ? menu_clothes : menu_bp;
LLUICtrlFactory::create<LLMenuItemCallGL>(p, parent);
}
}
@@ -270,7 +269,7 @@ private:
if (inventory_panel->getVisible())
{
- inventory_panel->setSortOrder(sort_order);
+ inventory_panel->getFolderViewModel()->setSorter(sort_order);
}
else
{
@@ -738,7 +737,7 @@ void LLPanelOutfitEdit::onSearchEdit(const std::string& string)
}
// save current folder open state if no filter currently applied
- if (mInventoryItemsPanel->getRootFolder()->getFilterSubString().empty())
+ if (mInventoryItemsPanel->getFilterSubString().empty())
{
mSavedFolderState->setApply(FALSE);
mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
@@ -885,13 +884,13 @@ LLPanelOutfitEdit::selection_info_t LLPanelOutfitEdit::getAddMorePanelSelectionT
{
if (mInventoryItemsPanel != NULL && mInventoryItemsPanel->getVisible())
{
- std::set<LLUUID> selected_uuids = mInventoryItemsPanel->getRootFolder()->getSelectionList();
+ std::set<LLFolderViewItem*> selected_items = mInventoryItemsPanel->getRootFolder()->getSelectionList();
- result.second = selected_uuids.size();
+ result.second = selected_items.size();
if (result.second == 1)
{
- result.first = getWearableTypeByItemUUID(*(selected_uuids.begin()));
+ result.first = getWearableTypeByItemUUID(static_cast<LLFolderViewModelItemInventory*>((*selected_items.begin())->getViewModelItem())->getUUID());
}
}
else if (mWearableItemsList != NULL && mWearableItemsList->getVisible())
@@ -1310,7 +1309,7 @@ void LLPanelOutfitEdit::getCurrentItemUUID(LLUUID& selected_id)
LLFolderViewItem* curr_item = mInventoryItemsPanel->getRootFolder()->getCurSelectedItem();
if (!curr_item) return;
- LLFolderViewEventListener* listenerp = curr_item->getListener();
+ LLFolderViewModelItemInventory* listenerp = static_cast<LLFolderViewModelItemInventory*>(curr_item->getViewModelItem());
if (!listenerp) return;
selected_id = listenerp->getUUID();
@@ -1327,9 +1326,13 @@ void LLPanelOutfitEdit::getSelectedItemsUUID(uuid_vec_t& uuid_list)
void (uuid_vec_t::* tmp)(LLUUID const &) = &uuid_vec_t::push_back;
if (mInventoryItemsPanel->getVisible())
{
- std::set<LLUUID> item_set = mInventoryItemsPanel->getRootFolder()->getSelectionList();
-
- std::for_each(item_set.begin(), item_set.end(), boost::bind( tmp, &uuid_list, _1));
+ std::set<LLFolderViewItem*> item_set = mInventoryItemsPanel->getRootFolder()->getSelectionList();
+ for (std::set<LLFolderViewItem*>::iterator it = item_set.begin(), end_it = item_set.end();
+ it != end_it;
+ ++it)
+ {
+ uuid_list.push_back(static_cast<LLFolderViewModelItemInventory*>((*it)->getViewModelItem())->getUUID());
+ }
}
else if (mWearablesListViewPanel->getVisible())
{
@@ -1374,13 +1377,13 @@ void LLPanelOutfitEdit::saveListSelection()
{
if(mWearablesListViewPanel->getVisible())
{
- std::set<LLUUID> selected_ids = mInventoryItemsPanel->getRootFolder()->getSelectionList();
+ std::set<LLFolderViewItem*> selected_ids = mInventoryItemsPanel->getRootFolder()->getSelectionList();
if(!selected_ids.size()) return;
- for (std::set<LLUUID>::const_iterator item_id = selected_ids.begin(); item_id != selected_ids.end(); ++item_id)
+ for (std::set<LLFolderViewItem*>::const_iterator item_id = selected_ids.begin(); item_id != selected_ids.end(); ++item_id)
{
- mWearableItemsList->selectItemByUUID(*item_id, true);
+ mWearableItemsList->selectItemByUUID(static_cast<LLFolderViewModelItemInventory*>((*item_id)->getViewModelItem())->getUUID(), true);
}
mWearableItemsList->scrollToShowFirstSelectedItem();
}
@@ -1398,7 +1401,7 @@ void LLPanelOutfitEdit::saveListSelection()
for(std::vector<LLUUID>::const_iterator item_id = selected_ids.begin(); item_id != selected_ids.end(); ++item_id)
{
- LLFolderViewItem* item = root->getItemByID(*item_id);
+ LLFolderViewItem* item = mInventoryItemsPanel->getItemByID(*item_id);
if (!item) continue;
LLFolderViewFolder* parent = item->getParentFolder();
diff --git a/indra/newview/llpanelpathfindingrebakenavmesh.cpp b/indra/newview/llpanelpathfindingrebakenavmesh.cpp
deleted file mode 100644
index 7efb1a9227..0000000000
--- a/indra/newview/llpanelpathfindingrebakenavmesh.cpp
+++ /dev/null
@@ -1,269 +0,0 @@
-/**
-* @file llpanelpathfindingrebakenavmesh.cpp
-* @brief Implementation of llpanelpathfindingrebakenavmesh
-* @author Prep@lindenlab.com
-*
-* $LicenseInfo:firstyear=2012&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2012, Linden Research, Inc.
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation;
-* version 2.1 of the License only.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*
-* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-* $/LicenseInfo$
-*/
-
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llpanelpathfindingrebakenavmesh.h"
-
-#include <boost/bind.hpp>
-#include <boost/signals2.hpp>
-
-#include "llagent.h"
-#include "llbutton.h"
-#include "llenvmanager.h"
-#include "llhints.h"
-#include "llnotificationsutil.h"
-#include "llpanel.h"
-#include "llpathfindingmanager.h"
-#include "llpathfindingnavmesh.h"
-#include "llpathfindingnavmeshstatus.h"
-#include "lltoolbar.h"
-#include "lltoolbarview.h"
-#include "lltooltip.h"
-#include "llviewerregion.h"
-
-LLPanelPathfindingRebakeNavmesh* LLPanelPathfindingRebakeNavmesh::getInstance()
-{
- static LLPanelPathfindingRebakeNavmesh* panel = getPanel();
- return panel;
-}
-
-BOOL LLPanelPathfindingRebakeNavmesh::postBuild()
-{
- //Rebake button
- mNavMeshRebakeButton = findChild<LLButton>("navmesh_btn");
- llassert(mNavMeshRebakeButton != NULL);
- mNavMeshRebakeButton->setCommitCallback(boost::bind(&LLPanelPathfindingRebakeNavmesh::onNavMeshRebakeClick, this));
- LLHints::registerHintTarget("navmesh_btn", mNavMeshRebakeButton->getHandle());
-
- //Sending rebake request
- mNavMeshSendingButton = findChild<LLButton>("navmesh_btn_sending");
- llassert(mNavMeshSendingButton != NULL);
- LLHints::registerHintTarget("navmesh_btn_sending", mNavMeshSendingButton->getHandle());
-
- //rebaking...
- mNavMeshBakingButton = findChild<LLButton>("navmesh_btn_baking");
- llassert(mNavMeshBakingButton != NULL);
- LLHints::registerHintTarget("navmesh_btn_baking", mNavMeshBakingButton->getHandle());
-
- setMode(kRebakeNavMesh_Default);
-
- createNavMeshStatusListenerForCurrentRegion();
-
- if ( !mRegionCrossingSlot.connected() )
- {
- mRegionCrossingSlot = LLEnvManagerNew::getInstance()->setRegionChangeCallback(boost::bind(&LLPanelPathfindingRebakeNavmesh::handleRegionBoundaryCrossed, this));
- }
-
- if (!mAgentStateSlot.connected())
- {
- mAgentStateSlot = LLPathfindingManager::getInstance()->registerAgentStateListener(boost::bind(&LLPanelPathfindingRebakeNavmesh::handleAgentState, this, _1));
- }
- LLPathfindingManager::getInstance()->requestGetAgentState();
-
- return LLPanel::postBuild();
-}
-
-void LLPanelPathfindingRebakeNavmesh::draw()
-{
- if (doDraw())
- {
- updatePosition();
- LLPanel::draw();
- }
-}
-
-BOOL LLPanelPathfindingRebakeNavmesh::handleToolTip( S32 x, S32 y, MASK mask )
-{
- LLToolTipMgr::instance().unblockToolTips();
-
- if (mNavMeshRebakeButton->getVisible())
- {
- LLToolTipMgr::instance().show(mNavMeshRebakeButton->getToolTip());
- }
- else if (mNavMeshSendingButton->getVisible())
- {
- LLToolTipMgr::instance().show(mNavMeshSendingButton->getToolTip());
- }
- else if (mNavMeshBakingButton->getVisible())
- {
- LLToolTipMgr::instance().show(mNavMeshBakingButton->getToolTip());
- }
-
- return LLPanel::handleToolTip(x, y, mask);
-}
-
-LLPanelPathfindingRebakeNavmesh::LLPanelPathfindingRebakeNavmesh()
- : LLPanel(),
- mCanRebakeRegion(FALSE),
- mRebakeNavMeshMode(kRebakeNavMesh_Default),
- mNavMeshRebakeButton(NULL),
- mNavMeshSendingButton(NULL),
- mNavMeshBakingButton(NULL),
- mNavMeshSlot(),
- mRegionCrossingSlot(),
- mAgentStateSlot()
-{
- // make sure we have the only instance of this class
- static bool b = true;
- llassert_always(b);
- b=false;
-}
-
-LLPanelPathfindingRebakeNavmesh::~LLPanelPathfindingRebakeNavmesh()
-{
-}
-
-LLPanelPathfindingRebakeNavmesh* LLPanelPathfindingRebakeNavmesh::getPanel()
-{
- LLPanelPathfindingRebakeNavmesh* panel = new LLPanelPathfindingRebakeNavmesh();
- panel->buildFromFile("panel_navmesh_rebake.xml");
- return panel;
-}
-
-void LLPanelPathfindingRebakeNavmesh::setMode(ERebakeNavMeshMode pRebakeNavMeshMode)
-{
- if (pRebakeNavMeshMode == kRebakeNavMesh_Available)
- {
- LLNotificationsUtil::add("PathfindingRebakeNavmesh");
- }
- mNavMeshRebakeButton->setVisible(pRebakeNavMeshMode == kRebakeNavMesh_Available);
- mNavMeshSendingButton->setVisible(pRebakeNavMeshMode == kRebakeNavMesh_RequestSent);
- mNavMeshBakingButton->setVisible(pRebakeNavMeshMode == kRebakeNavMesh_InProgress);
- mRebakeNavMeshMode = pRebakeNavMeshMode;
-}
-
-LLPanelPathfindingRebakeNavmesh::ERebakeNavMeshMode LLPanelPathfindingRebakeNavmesh::getMode() const
-{
- return mRebakeNavMeshMode;
-}
-
-void LLPanelPathfindingRebakeNavmesh::onNavMeshRebakeClick()
-{
- setMode(kRebakeNavMesh_RequestSent);
- LLPathfindingManager::getInstance()->requestRebakeNavMesh(boost::bind(&LLPanelPathfindingRebakeNavmesh::handleRebakeNavMeshResponse, this, _1));
-}
-
-void LLPanelPathfindingRebakeNavmesh::handleAgentState(BOOL pCanRebakeRegion)
-{
- mCanRebakeRegion = pCanRebakeRegion;
-}
-
-void LLPanelPathfindingRebakeNavmesh::handleRebakeNavMeshResponse(bool pResponseStatus)
-{
- if (getMode() == kRebakeNavMesh_RequestSent)
- {
- setMode(pResponseStatus ? kRebakeNavMesh_InProgress : kRebakeNavMesh_Default);
- }
-
- if (!pResponseStatus)
- {
- LLNotificationsUtil::add("PathfindingCannotRebakeNavmesh");
- }
-}
-
-void LLPanelPathfindingRebakeNavmesh::handleNavMeshStatus(const LLPathfindingNavMeshStatus &pNavMeshStatus)
-{
- ERebakeNavMeshMode rebakeNavMeshMode = kRebakeNavMesh_Default;
- if (pNavMeshStatus.isValid())
- {
- switch (pNavMeshStatus.getStatus())
- {
- case LLPathfindingNavMeshStatus::kPending :
- case LLPathfindingNavMeshStatus::kRepending :
- rebakeNavMeshMode = kRebakeNavMesh_Available;
- break;
- case LLPathfindingNavMeshStatus::kBuilding :
- rebakeNavMeshMode = kRebakeNavMesh_InProgress;
- break;
- case LLPathfindingNavMeshStatus::kComplete :
- rebakeNavMeshMode = kRebakeNavMesh_NotAvailable;
- break;
- default :
- rebakeNavMeshMode = kRebakeNavMesh_Default;
- llassert(0);
- break;
- }
- }
-
- setMode(rebakeNavMeshMode);
-}
-
-void LLPanelPathfindingRebakeNavmesh::handleRegionBoundaryCrossed()
-{
- createNavMeshStatusListenerForCurrentRegion();
- mCanRebakeRegion = FALSE;
- LLPathfindingManager::getInstance()->requestGetAgentState();
-}
-
-void LLPanelPathfindingRebakeNavmesh::createNavMeshStatusListenerForCurrentRegion()
-{
- if (mNavMeshSlot.connected())
- {
- mNavMeshSlot.disconnect();
- }
-
- LLViewerRegion *currentRegion = gAgent.getRegion();
- if (currentRegion != NULL)
- {
- mNavMeshSlot = LLPathfindingManager::getInstance()->registerNavMeshListenerForRegion(currentRegion, boost::bind(&LLPanelPathfindingRebakeNavmesh::handleNavMeshStatus, this, _2));
- LLPathfindingManager::getInstance()->requestGetNavMeshForRegion(currentRegion, true);
- }
-}
-
-bool LLPanelPathfindingRebakeNavmesh::doDraw() const
-{
- return (mCanRebakeRegion && (mRebakeNavMeshMode != kRebakeNavMesh_NotAvailable));
-}
-
-void LLPanelPathfindingRebakeNavmesh::updatePosition()
-{
- S32 y_pos = 0;
- S32 bottom_tb_center = 0;
-
- if (LLToolBar* toolbar_bottom = gToolBarView->getChild<LLToolBar>("toolbar_bottom"))
- {
- y_pos = toolbar_bottom->getRect().getHeight();
- bottom_tb_center = toolbar_bottom->getRect().getCenterX();
- }
-
- S32 left_tb_width = 0;
- if (LLToolBar* toolbar_left = gToolBarView->getChild<LLToolBar>("toolbar_left"))
- {
- left_tb_width = toolbar_left->getRect().getWidth();
- }
-
- if(LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("state_management_buttons_container"))
- {
- panel_ssf_container->setOrigin(0, y_pos);
- }
-
- S32 x_pos = bottom_tb_center-getRect().getWidth()/2 - left_tb_width + 113 /* width of stand/fly button */ + 10 /* margin */;
-
- setOrigin( x_pos, 0);
-}
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index f1380e7a36..d7c634d619 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -72,9 +72,12 @@ static const std::string NEARBY_TAB_NAME = "nearby_panel";
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 BLOCKED_TAB_NAME = "blocked_panel"; // blocked avatars
static const std::string COLLAPSED_BY_USER = "collapsed_by_user";
+extern S32 gMaxAgentGroups;
+
/** Comparator for comparing avatar items by last interaction date */
class LLAvatarItemRecentComparator : public LLAvatarItemComparator
{
@@ -492,26 +495,37 @@ public:
LLPanelPeople::LLPanelPeople()
: LLPanel(),
- mFilterSubString(LLStringUtil::null),
- mFilterSubStringOrig(LLStringUtil::null),
- mFilterEditor(NULL),
mTabContainer(NULL),
mOnlineFriendList(NULL),
mAllFriendList(NULL),
mNearbyList(NULL),
mRecentList(NULL),
mGroupList(NULL),
- mNearbyGearButton(NULL),
- mFriendsGearButton(NULL),
- mGroupsGearButton(NULL),
- mRecentGearButton(NULL),
mMiniMap(NULL)
{
mFriendListUpdater = new LLFriendListUpdater(boost::bind(&LLPanelPeople::updateFriendList, this));
mNearbyListUpdater = new LLNearbyListUpdater(boost::bind(&LLPanelPeople::updateNearbyList, this));
mRecentListUpdater = new LLRecentListUpdater(boost::bind(&LLPanelPeople::updateRecentList, this));
mButtonsUpdater = new LLButtonsUpdater(boost::bind(&LLPanelPeople::updateButtons, this));
- mCommitCallbackRegistrar.add("People.addFriend", boost::bind(&LLPanelPeople::onAddFriendButtonClicked, this));
+
+ mCommitCallbackRegistrar.add("People.AddFriend", boost::bind(&LLPanelPeople::onAddFriendButtonClicked, this));
+ mCommitCallbackRegistrar.add("People.AddFriendWizard", boost::bind(&LLPanelPeople::onAddFriendWizButtonClicked, this));
+ mCommitCallbackRegistrar.add("People.DelFriend", boost::bind(&LLPanelPeople::onDeleteFriendButtonClicked, this));
+ mCommitCallbackRegistrar.add("People.Group.Minus", boost::bind(&LLPanelPeople::onGroupMinusButtonClicked, this));
+ mCommitCallbackRegistrar.add("People.Chat", boost::bind(&LLPanelPeople::onChatButtonClicked, this));
+ mCommitCallbackRegistrar.add("People.Gear", boost::bind(&LLPanelPeople::onGearButtonClicked, this, _1));
+
+ mCommitCallbackRegistrar.add("People.Group.Plus.Action", boost::bind(&LLPanelPeople::onGroupPlusMenuItemClicked, this, _2));
+ mCommitCallbackRegistrar.add("People.Friends.ViewSort.Action", boost::bind(&LLPanelPeople::onFriendsViewSortMenuItemClicked, this, _2));
+ mCommitCallbackRegistrar.add("People.Nearby.ViewSort.Action", boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemClicked, this, _2));
+ mCommitCallbackRegistrar.add("People.Groups.ViewSort.Action", boost::bind(&LLPanelPeople::onGroupsViewSortMenuItemClicked, this, _2));
+ mCommitCallbackRegistrar.add("People.Recent.ViewSort.Action", boost::bind(&LLPanelPeople::onRecentViewSortMenuItemClicked, this, _2));
+
+ mEnableCallbackRegistrar.add("People.Friends.ViewSort.CheckItem", boost::bind(&LLPanelPeople::onFriendsViewSortMenuItemCheck, this, _2));
+ mEnableCallbackRegistrar.add("People.Recent.ViewSort.CheckItem", boost::bind(&LLPanelPeople::onRecentViewSortMenuItemCheck, this, _2));
+ mEnableCallbackRegistrar.add("People.Nearby.ViewSort.CheckItem", boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemCheck, this, _2));
+
+ mEnableCallbackRegistrar.add("People.Group.Plus.Validate", boost::bind(&LLPanelPeople::onGroupPlusButtonValidate, this));
}
LLPanelPeople::~LLPanelPeople()
@@ -525,13 +539,6 @@ LLPanelPeople::~LLPanelPeople()
{
LLVoiceClient::getInstance()->removeObserver(this);
}
-
- if (mGroupPlusMenuHandle.get()) mGroupPlusMenuHandle.get()->die();
- if (mNearbyViewSortMenuHandle.get()) mNearbyViewSortMenuHandle.get()->die();
- if (mNearbyViewSortMenuHandle.get()) mNearbyViewSortMenuHandle.get()->die();
- if (mGroupsViewSortMenuHandle.get()) mGroupsViewSortMenuHandle.get()->die();
- if (mRecentViewSortMenuHandle.get()) mRecentViewSortMenuHandle.get()->die();
-
}
void LLPanelPeople::onFriendsAccordionExpandedCollapsed(LLUICtrl* ctrl, const LLSD& param, LLAvatarList* avatar_list)
@@ -551,17 +558,31 @@ void LLPanelPeople::onFriendsAccordionExpandedCollapsed(LLUICtrl* ctrl, const LL
}
}
+
+void LLPanelPeople::removePicker()
+{
+ if(mPicker.get())
+ {
+ mPicker.get()->closeFloater();
+ }
+}
+
BOOL LLPanelPeople::postBuild()
{
- mFilterEditor = getChild<LLFilterEditor>("filter_input");
- mFilterEditor->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
+ getChild<LLFilterEditor>("nearby_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
+ getChild<LLFilterEditor>("friends_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
+ getChild<LLFilterEditor>("groups_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
+ getChild<LLFilterEditor>("recent_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
mTabContainer = getChild<LLTabContainer>("tabs");
mTabContainer->setCommitCallback(boost::bind(&LLPanelPeople::onTabSelected, this, _2));
+ mSavedFilters.resize(mTabContainer->getTabCount());
+ mSavedOriginalFilters.resize(mTabContainer->getTabCount());
LLPanel* friends_tab = getChild<LLPanel>(FRIENDS_TAB_NAME);
// updater is active only if panel is visible to user.
friends_tab->setVisibleCallback(boost::bind(&Updater::setActive, mFriendListUpdater, _2));
+ friends_tab->setVisibleCallback(boost::bind(&LLPanelPeople::removePicker, this));
mOnlineFriendList = friends_tab->getChild<LLAvatarList>("avatars_online");
mAllFriendList = friends_tab->getChild<LLAvatarList>("avatars_all");
mOnlineFriendList->setNoItemsCommentText(getString("no_friends_online"));
@@ -592,23 +613,15 @@ BOOL LLPanelPeople::postBuild()
mGroupList->setNoItemsMsg(getString("no_groups_msg"));
mGroupList->setNoFilteredItemsMsg(getString("no_filtered_groups_msg"));
- mNearbyList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
- mRecentList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
- mAllFriendList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
- mOnlineFriendList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
+ mNearbyList->setContextMenu(&LLPanelPeopleMenus::gNearbyPeopleContextMenu);
+ mRecentList->setContextMenu(&LLPanelPeopleMenus::gPeopleContextMenu);
+ mAllFriendList->setContextMenu(&LLPanelPeopleMenus::gPeopleContextMenu);
+ mOnlineFriendList->setContextMenu(&LLPanelPeopleMenus::gPeopleContextMenu);
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));
-
- 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->setItemDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, _1));
mAllFriendList->setItemDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, _1));
mNearbyList->setItemDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, _1));
@@ -629,6 +642,19 @@ BOOL LLPanelPeople::postBuild()
mGroupList->setCommitCallback(boost::bind(&LLPanelPeople::updateButtons, this));
mGroupList->setReturnCallback(boost::bind(&LLPanelPeople::onChatButtonClicked, this));
+ LLMenuButton* groups_gear_btn = getChild<LLMenuButton>("groups_gear_btn");
+
+ // Use the context menu of the Groups list for the Groups tab gear menu.
+ LLToggleableMenu* groups_gear_menu = mGroupList->getContextMenu();
+ if (groups_gear_menu)
+ {
+ groups_gear_btn->setMenu(groups_gear_menu, LLMenuButton::MP_BOTTOM_LEFT);
+ }
+ else
+ {
+ llwarns << "People->Groups list menu not found" << llendl;
+ }
+
LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>("tab_all");
accordion_tab->setDropDownStateChangedCallback(
boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _1, _2, mAllFriendList));
@@ -637,70 +663,9 @@ BOOL LLPanelPeople::postBuild()
accordion_tab->setDropDownStateChangedCallback(
boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _1, _2, mOnlineFriendList));
- buttonSetAction("view_profile_btn", boost::bind(&LLPanelPeople::onViewProfileButtonClicked, 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));
-
// Must go after setting commit callback and initializing all pointers to children.
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));
-
- mNearbyGearButton = getChild<LLMenuButton>("nearby_view_sort_btn");
- mFriendsGearButton = getChild<LLMenuButton>("friends_viewsort_btn");
- mGroupsGearButton = getChild<LLMenuButton>("groups_viewsort_btn");
- mRecentGearButton = getChild<LLMenuButton>("recent_viewsort_btn");
-
- LLMenuGL* plus_menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_group_plus.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- mGroupPlusMenuHandle = plus_menu->getHandle();
-
- LLToggleableMenu* nearby_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_people_nearby_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- if(nearby_view_sort)
- {
- mNearbyViewSortMenuHandle = nearby_view_sort->getHandle();
- mNearbyGearButton->setMenu(nearby_view_sort);
- }
-
- LLToggleableMenu* friend_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_people_friends_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- if(friend_view_sort)
- {
- mFriendsViewSortMenuHandle = friend_view_sort->getHandle();
- mFriendsGearButton->setMenu(friend_view_sort);
- }
-
- LLToggleableMenu* group_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_people_groups_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- if(group_view_sort)
- {
- mGroupsViewSortMenuHandle = group_view_sort->getHandle();
- mGroupsGearButton->setMenu(group_view_sort);
- }
-
- LLToggleableMenu* recent_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_people_recent_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- if(recent_view_sort)
- {
- mRecentViewSortMenuHandle = recent_view_sort->getHandle();
- mRecentGearButton->setMenu(recent_view_sort);
- }
-
LLVoiceClient::getInstance()->addObserver(this);
// call this method in case some list is empty and buttons can be in inconsistent state
@@ -735,9 +700,11 @@ void LLPanelPeople::updateFriendListHelpText()
if (no_friends_text->getVisible())
{
//update help text for empty lists
- std::string message_name = mFilterSubString.empty() ? "no_friends_msg" : "no_filtered_friends_msg";
+ const std::string& filter = mSavedOriginalFilters[mTabContainer->getCurrentPanelIndex()];
+
+ std::string message_name = filter.empty() ? "no_friends_msg" : "no_filtered_friends_msg";
LLStringUtil::format_map_t args;
- args["[SEARCH_TERM]"] = LLURI::escape(mFilterSubStringOrig);
+ args["[SEARCH_TERM]"] = LLURI::escape(filter);
no_friends_text->setText(getString(message_name, args));
}
}
@@ -821,31 +788,9 @@ void LLPanelPeople::updateRecentList()
mRecentList->setDirty();
}
-void LLPanelPeople::buttonSetVisible(std::string btn_name, BOOL 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)
-{
- // 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->setEnabled(enabled);
-}
-
-void LLPanelPeople::buttonSetAction(const std::string& btn_name, const commit_signal_t::slot_type& cb)
-{
- // 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->setClickedCallback(cb);
-}
-
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);
@@ -856,63 +801,47 @@ void LLPanelPeople::updateButtons()
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("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", nearby_tab_active || friends_tab_active);
-
if (group_tab_active)
{
- bool cur_group_active = true;
-
if (item_selected)
{
selected_id = mGroupList->getSelectedUUID();
- cur_group_active = (gAgent.getGroupID() == selected_id);
}
LLPanel* groups_panel = mTabContainer->getCurrentPanel();
- groups_panel->getChildView("activate_btn")->setEnabled(item_selected && !cur_group_active); // "none" or a non-active group selected
- groups_panel->getChildView("minus_btn")->setEnabled(item_selected && selected_id.notNull());
+ groups_panel->getChildView("minus_btn")->setEnabled(item_selected && selected_id.notNull()); // a real group selected
+ groups_panel->getChild<LLUICtrl>("groupcount")->setTextArg("[COUNT]", llformat("%d",gAgent.mGroups.count()));
+ groups_panel->getChild<LLUICtrl>("groupcount")->setTextArg("[REMAINING]", llformat("%d",(gMaxAgentGroups-gAgent.mGroups.count())));
}
else
{
bool is_friend = true;
-
+ bool is_self = false;
// Check whether selected avatar is our friend.
if (item_selected)
{
selected_id = selected_uuids.front();
is_friend = LLAvatarTracker::instance().getBuddyInfo(selected_id) != NULL;
+ is_self = gAgent.getID() == selected_id;
}
LLPanel* cur_panel = mTabContainer->getCurrentPanel();
if (cur_panel)
{
- cur_panel->getChildView("add_friend_btn")->setEnabled(!is_friend);
+ if (cur_panel->hasChild("add_friend_btn", TRUE))
+ cur_panel->getChildView("add_friend_btn")->setEnabled(item_selected && !is_friend && !is_self);
+
if (friends_tab_active)
{
- cur_panel->getChildView("del_btn")->setEnabled(multiple_selected);
+ cur_panel->getChildView("friends_del_btn")->setEnabled(multiple_selected);
+ }
+
+ if (!group_tab_active)
+ {
+ cur_panel->getChildView("gear_btn")->setEnabled(multiple_selected);
}
}
}
-
- bool enable_calls = LLVoiceClient::getInstance()->isVoiceWorking() && LLVoiceClient::getInstance()->voiceEnabled();
-
- buttonSetEnabled("view_profile_btn",item_selected);
- buttonSetEnabled("share_btn", item_selected);
- buttonSetEnabled("im_btn", multiple_selected); // allow starting the friends conference for multiple selection
- buttonSetEnabled("call_btn", multiple_selected && enable_calls);
- buttonSetEnabled("teleport_btn", multiple_selected && LLAvatarActions::canOfferTeleport(selected_uuids));
-
- 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
@@ -943,6 +872,9 @@ LLUUID LLPanelPeople::getCurrentItemID() const
if (cur_tab == GROUP_TAB_NAME)
return mGroupList->getSelectedUUID();
+ if (cur_tab == BLOCKED_TAB_NAME)
+ return LLUUID::null; // FIXME?
+
llassert(0 && "unknown tab selected");
return LLUUID::null;
}
@@ -963,6 +895,8 @@ void LLPanelPeople::getCurrentItemIDs(uuid_vec_t& selected_uuids) const
mRecentList->getSelectedUUIDs(selected_uuids);
else if (cur_tab == GROUP_TAB_NAME)
mGroupList->getSelectedUUIDs(selected_uuids);
+ else if (cur_tab == BLOCKED_TAB_NAME)
+ selected_uuids.clear(); // FIXME?
else
llassert(0 && "unknown tab selected");
@@ -1031,49 +965,60 @@ void LLPanelPeople::setSortOrder(LLAvatarList* list, ESortOrder order, bool save
}
}
-bool LLPanelPeople::isRealGroup()
-{
- return getCurrentItemID() != LLUUID::null;
-}
-
void LLPanelPeople::onFilterEdit(const std::string& search_string)
{
- mFilterSubStringOrig = search_string;
- LLStringUtil::trimHead(mFilterSubStringOrig);
+ const S32 cur_tab_idx = mTabContainer->getCurrentPanelIndex();
+ std::string& filter = mSavedOriginalFilters[cur_tab_idx];
+ std::string& saved_filter = mSavedFilters[cur_tab_idx];
+
+ filter = search_string;
+ LLStringUtil::trimHead(filter);
+
// Searches are case-insensitive
- std::string search_upper = mFilterSubStringOrig;
+ std::string search_upper = filter;
LLStringUtil::toUpper(search_upper);
- if (mFilterSubString == search_upper)
+ if (saved_filter == search_upper)
return;
- mFilterSubString = search_upper;
+ saved_filter = search_upper;
- //store accordion tabs state before any manipulation with accordion tabs
- if(!mFilterSubString.empty())
+ // Apply new filter to the current tab.
+ const std::string cur_tab = getActiveTabName();
+ if (cur_tab == NEARBY_TAB_NAME)
+ {
+ mNearbyList->setNameFilter(filter);
+ }
+ else if (cur_tab == FRIENDS_TAB_NAME)
+ {
+ // store accordion tabs opened/closed state before any manipulation with accordion tabs
+ if (!saved_filter.empty())
{
notifyChildren(LLSD().with("action","store_state"));
}
-
- // Apply new filter.
- mNearbyList->setNameFilter(mFilterSubStringOrig);
- mOnlineFriendList->setNameFilter(mFilterSubStringOrig);
- mAllFriendList->setNameFilter(mFilterSubStringOrig);
- mRecentList->setNameFilter(mFilterSubStringOrig);
- mGroupList->setNameFilter(mFilterSubStringOrig);
+ mOnlineFriendList->setNameFilter(filter);
+ mAllFriendList->setNameFilter(filter);
setAccordionCollapsedByUser("tab_online", false);
setAccordionCollapsedByUser("tab_all", false);
-
showFriendsAccordionsIfNeeded();
- //restore accordion tabs state _after_ all manipulations...
- if(mFilterSubString.empty())
+ // restore accordion tabs state _after_ all manipulations
+ if(saved_filter.empty())
{
notifyChildren(LLSD().with("action","restore_state"));
}
}
+ else if (cur_tab == GROUP_TAB_NAME)
+ {
+ mGroupList->setNameFilter(filter);
+ }
+ else if (cur_tab == RECENT_TAB_NAME)
+ {
+ mRecentList->setNameFilter(filter);
+ }
+}
void LLPanelPeople::onTabSelected(const LLSD& param)
{
@@ -1081,11 +1026,6 @@ void LLPanelPeople::onTabSelected(const LLSD& param)
updateButtons();
showFriendsAccordionsIfNeeded();
-
- if (GROUP_TAB_NAME == tab_name)
- mFilterEditor->setLabel(getString("groups_filter_label"));
- else
- mFilterEditor->setLabel(getString("people_filter_label"));
}
void LLPanelPeople::onAvatarListDoubleClicked(LLUICtrl* ctrl)
@@ -1097,6 +1037,10 @@ void LLPanelPeople::onAvatarListDoubleClicked(LLUICtrl* ctrl)
}
LLUUID clicked_id = item->getAvatarId();
+ if(gAgent.getID() == clicked_id)
+ {
+ return;
+ }
#if 0 // SJB: Useful for testing, but not currently functional or to spec
LLAvatarActions::showProfile(clicked_id);
@@ -1127,12 +1071,6 @@ void LLPanelPeople::onAvatarListCommitted(LLAvatarList* list)
updateButtons();
}
-void LLPanelPeople::onViewProfileButtonClicked()
-{
- LLUUID id = getCurrentItemID();
- LLAvatarActions::showProfile(id);
-}
-
void LLPanelPeople::onAddFriendButtonClicked()
{
LLUUID id = getCurrentItemID();
@@ -1160,8 +1098,12 @@ bool LLPanelPeople::isItemsFreeOfFriends(const uuid_vec_t& uuids)
void LLPanelPeople::onAddFriendWizButtonClicked()
{
+ LLPanel* cur_panel = mTabContainer->getCurrentPanel();
+ LLView * button = cur_panel->findChild<LLButton>("friends_add_btn", TRUE);
+
// Show add friend wizard.
- LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelPeople::onAvatarPicked, _1, _2), FALSE, TRUE);
+ LLFloater* root_floater = gFloaterView->getParentFloater(this);
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelPeople::onAvatarPicked, _1, _2), FALSE, TRUE, FALSE, root_floater->getName(), button);
if (!picker)
{
return;
@@ -1169,11 +1111,13 @@ void LLPanelPeople::onAddFriendWizButtonClicked()
// Need to disable 'ok' button when friend occurs in selection
picker->setOkBtnEnableCb(boost::bind(&LLPanelPeople::isItemsFreeOfFriends, this, _1));
- LLFloater* root_floater = gFloaterView->getParentFloater(this);
+
if (root_floater)
{
root_floater->addDependentFloater(picker);
}
+
+ mPicker = picker->getHandle();
}
void LLPanelPeople::onDeleteFriendButtonClicked()
@@ -1191,11 +1135,6 @@ void LLPanelPeople::onDeleteFriendButtonClicked()
}
}
-void LLPanelPeople::onGroupInfoButtonClicked()
-{
- LLGroupActions::show(getCurrentItemID());
-}
-
void LLPanelPeople::onChatButtonClicked()
{
LLUUID group_id = getCurrentItemID();
@@ -1203,6 +1142,17 @@ void LLPanelPeople::onChatButtonClicked()
LLGroupActions::startIM(group_id);
}
+void LLPanelPeople::onGearButtonClicked(LLUICtrl* btn)
+{
+ uuid_vec_t selected_uuids;
+ getCurrentItemIDs(selected_uuids);
+ // Spawn at bottom left corner of the button.
+ if (getActiveTabName() == NEARBY_TAB_NAME)
+ LLPanelPeopleMenus::gNearbyPeopleContextMenu.show(btn, selected_uuids, 0, 0);
+ else
+ LLPanelPeopleMenus::gPeopleContextMenu.show(btn, selected_uuids, 0, 0);
+}
+
void LLPanelPeople::onImButtonClicked()
{
uuid_vec_t selected_uuids;
@@ -1219,11 +1169,6 @@ void LLPanelPeople::onImButtonClicked()
}
}
-void LLPanelPeople::onActivateButtonClicked()
-{
- LLGroupActions::activate(mGroupList->getSelectedUUID());
-}
-
// static
void LLPanelPeople::onAvatarPicked(const uuid_vec_t& ids, const std::vector<LLAvatarName> names)
{
@@ -1231,19 +1176,15 @@ void LLPanelPeople::onAvatarPicked(const uuid_vec_t& ids, const std::vector<LLAv
LLAvatarActions::requestFriendshipDialog(ids[0], names[0].getCompleteName());
}
-void LLPanelPeople::onGroupPlusButtonClicked()
+bool LLPanelPeople::onGroupPlusButtonValidate()
{
if (!gAgent.canJoinGroups())
{
LLNotificationsUtil::add("JoinedTooManyGroups");
- return;
+ return false;
}
- LLMenuGL* plus_menu = (LLMenuGL*)mGroupPlusMenuHandle.get();
- if (!plus_menu)
- return;
-
- showGroupMenu(plus_menu);
+ return true;
}
void LLPanelPeople::onGroupMinusButtonClicked()
@@ -1288,10 +1229,6 @@ void LLPanelPeople::onFriendsViewSortMenuItemClicked(const LLSD& userdata)
mAllFriendList->showPermissions(show_permissions);
mOnlineFriendList->showPermissions(show_permissions);
}
- else if (chosen_item == "panel_block_list_sidetray")
- {
- LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD());
- }
}
void LLPanelPeople::onGroupsViewSortMenuItemClicked(const LLSD& userdata)
@@ -1324,10 +1261,6 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata)
{
setSortOrder(mNearbyList, E_SORT_BY_DISTANCE);
}
- else if (chosen_item == "panel_block_list_sidetray")
- {
- LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD());
- }
}
bool LLPanelPeople::onNearbyViewSortMenuItemCheck(const LLSD& userdata)
@@ -1361,10 +1294,6 @@ void LLPanelPeople::onRecentViewSortMenuItemClicked(const LLSD& userdata)
{
mRecentList->toggleIcons();
}
- else if (chosen_item == "panel_block_list_sidetray")
- {
- LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD());
- }
}
bool LLPanelPeople::onFriendsViewSortMenuItemCheck(const LLSD& userdata)
@@ -1393,40 +1322,6 @@ bool LLPanelPeople::onRecentViewSortMenuItemCheck(const LLSD& userdata)
return false;
}
-void LLPanelPeople::onCallButtonClicked()
-{
- uuid_vec_t 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()
-{
- uuid_vec_t selected_uuids;
- getCurrentItemIDs(selected_uuids);
- LLAvatarActions::offerTeleport(selected_uuids);
-}
-
-void LLPanelPeople::onShareButtonClicked()
-{
- LLAvatarActions::share(getCurrentItemID());
-}
-
void LLPanelPeople::onMoreButtonClicked()
{
// *TODO: not implemented yet
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index 46c58cd139..4740964dee 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -68,6 +68,8 @@ private:
E_SORT_BY_RECENT_SPEAKERS = 4,
} ESortOrder;
+ void removePicker();
+
// methods indirectly called by the updaters
void updateFriendListHelpText();
void updateFriendList();
@@ -80,31 +82,22 @@ private:
std::string getActiveTabName() const;
LLUUID getCurrentItemID() const;
void getCurrentItemIDs(uuid_vec_t& selected_uuids) const;
- void buttonSetVisible(std::string btn_name, BOOL visible);
- void buttonSetEnabled(const std::string& btn_name, bool enabled);
- void buttonSetAction(const std::string& btn_name, const commit_signal_t::slot_type& cb);
void showGroupMenu(LLMenuGL* menu);
void setSortOrder(LLAvatarList* list, ESortOrder order, bool save = true);
// UI callbacks
void onFilterEdit(const std::string& search_string);
void onTabSelected(const LLSD& param);
- void onViewProfileButtonClicked();
void onAddFriendButtonClicked();
void onAddFriendWizButtonClicked();
void onDeleteFriendButtonClicked();
- void onGroupInfoButtonClicked();
void onChatButtonClicked();
+ void onGearButtonClicked(LLUICtrl* btn);
void onImButtonClicked();
- void onCallButtonClicked();
- void onGroupCallButtonClicked();
- void onTeleportButtonClicked();
- void onShareButtonClicked();
void onMoreButtonClicked();
- void onActivateButtonClicked();
void onAvatarListDoubleClicked(LLUICtrl* ctrl);
void onAvatarListCommitted(LLAvatarList* list);
- void onGroupPlusButtonClicked();
+ bool onGroupPlusButtonValidate();
void onGroupMinusButtonClicked();
void onGroupPlusMenuItemClicked(const LLSD& userdata);
@@ -113,8 +106,6 @@ 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);
@@ -135,7 +126,6 @@ private:
bool isAccordionCollapsedByUser(LLUICtrl* acc_tab);
bool isAccordionCollapsedByUser(const std::string& name);
- LLFilterEditor* mFilterEditor;
LLTabContainer* mTabContainer;
LLAvatarList* mOnlineFriendList;
LLAvatarList* mAllFriendList;
@@ -144,24 +134,14 @@ private:
LLGroupList* mGroupList;
LLNetMap* mMiniMap;
- LLHandle<LLView> mGroupPlusMenuHandle;
- LLHandle<LLView> mNearbyViewSortMenuHandle;
- LLHandle<LLView> mFriendsViewSortMenuHandle;
- LLHandle<LLView> mGroupsViewSortMenuHandle;
- LLHandle<LLView> mRecentViewSortMenuHandle;
+ std::vector<std::string> mSavedOriginalFilters;
+ std::vector<std::string> mSavedFilters;
Updater* mFriendListUpdater;
Updater* mNearbyListUpdater;
Updater* mRecentListUpdater;
Updater* mButtonsUpdater;
-
- LLMenuButton* mNearbyGearButton;
- LLMenuButton* mFriendsGearButton;
- LLMenuButton* mGroupsGearButton;
- LLMenuButton* mRecentGearButton;
-
- std::string mFilterSubString;
- std::string mFilterSubStringOrig;
+ LLHandle< LLFloater > mPicker;
};
#endif //LL_LLPANELPEOPLE_H
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index f12c4de2f7..49f7361c4a 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -37,20 +37,25 @@
#include "llagentdata.h" // for gAgentID
#include "llavataractions.h"
#include "llcallingcard.h" // for LLAvatarTracker
+#include "lllogchat.h"
#include "llviewermenu.h" // for gMenuHolder
+#include "llconversationmodel.h"
+#include "llviewerobjectlist.h"
namespace LLPanelPeopleMenus
{
-NearbyMenu gNearbyMenu;
+PeopleContextMenu gPeopleContextMenu;
+NearbyPeopleContextMenu gNearbyPeopleContextMenu;
-//== NearbyMenu ===============================================================
+//== PeopleContextMenu ===============================================================
-LLContextMenu* NearbyMenu::createMenu()
+LLContextMenu* PeopleContextMenu::createMenu()
{
// set up the callbacks for all of the avatar menu items
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+ LLContextMenu* menu;
if ( mUUIDs.size() == 1 )
{
@@ -62,38 +67,86 @@ LLContextMenu* NearbyMenu::createMenu()
registrar.add("Avatar.RemoveFriend", boost::bind(&LLAvatarActions::removeFriendDialog, id));
registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startIM, id));
registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startCall, id));
- registrar.add("Avatar.OfferTeleport", boost::bind(&NearbyMenu::offerTeleport, this));
+ registrar.add("Avatar.OfferTeleport", boost::bind(&PeopleContextMenu::offerTeleport, this));
+ registrar.add("Avatar.ZoomIn", boost::bind(&handle_zoom_to_object, id));
registrar.add("Avatar.ShowOnMap", boost::bind(&LLAvatarActions::showOnMap, id));
registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::share, id));
registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, id));
registrar.add("Avatar.BlockUnblock", boost::bind(&LLAvatarActions::toggleBlock, id));
+ registrar.add("Avatar.InviteToGroup", boost::bind(&LLAvatarActions::inviteToGroup, id));
+ registrar.add("Avatar.Calllog", boost::bind(&LLAvatarActions::viewChatHistory, id));
- enable_registrar.add("Avatar.EnableItem", boost::bind(&NearbyMenu::enableContextMenuItem, this, _2));
- enable_registrar.add("Avatar.CheckItem", boost::bind(&NearbyMenu::checkContextMenuItem, this, _2));
+ enable_registrar.add("Avatar.EnableItem", boost::bind(&PeopleContextMenu::enableContextMenuItem, this, _2));
+ enable_registrar.add("Avatar.CheckItem", boost::bind(&PeopleContextMenu::checkContextMenuItem, this, _2));
// create the context menu from the XUI
- return createFromFile("menu_people_nearby.xml");
+ menu = createFromFile("menu_people_nearby.xml");
+ buildContextMenu(*menu, 0x0);
}
else
{
// Set up for multi-selected People
// registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, mUUIDs)); // *TODO: unimplemented
- registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startConference, mUUIDs));
- registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startAdhocCall, mUUIDs));
- registrar.add("Avatar.OfferTeleport", boost::bind(&NearbyMenu::offerTeleport, this));
- registrar.add("Avatar.RemoveFriend",boost::bind(&LLAvatarActions::removeFriendsDialog, mUUIDs));
+ registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startConference, mUUIDs, LLUUID::null));
+ registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startAdhocCall, mUUIDs, LLUUID::null));
+ registrar.add("Avatar.OfferTeleport", boost::bind(&PeopleContextMenu::offerTeleport, this));
+ 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));
+ // registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, mUUIDs)); // *TODO: unimplemented
+
+ enable_registrar.add("Avatar.EnableItem", boost::bind(&PeopleContextMenu::enableContextMenuItem, this, _2));
// create the context menu from the XUI
- return createFromFile("menu_people_nearby_multiselect.xml");
+ menu = createFromFile("menu_people_nearby_multiselect.xml");
+ buildContextMenu(*menu, ITEM_IN_MULTI_SELECTION);
}
+
+ return menu;
+}
+
+void PeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags)
+{
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
+
+ if (flags & ITEM_IN_MULTI_SELECTION)
+ {
+ items.push_back(std::string("add_friends"));
+ items.push_back(std::string("remove_friends"));
+ items.push_back(std::string("im"));
+ items.push_back(std::string("call"));
+ items.push_back(std::string("share"));
+ items.push_back(std::string("pay"));
+ items.push_back(std::string("offer_teleport"));
+ }
+ else
+ {
+ items.push_back(std::string("view_profile"));
+ items.push_back(std::string("im"));
+ items.push_back(std::string("offer_teleport"));
+ items.push_back(std::string("voice_call"));
+ items.push_back(std::string("chat_history"));
+ items.push_back(std::string("separator_chat_history"));
+ items.push_back(std::string("add_friend"));
+ items.push_back(std::string("remove_friend"));
+ items.push_back(std::string("invite_to_group"));
+ items.push_back(std::string("separator_invite_to_group"));
+ items.push_back(std::string("map"));
+ items.push_back(std::string("share"));
+ items.push_back(std::string("pay"));
+ items.push_back(std::string("block_unblock"));
+ }
+
+ hide_context_entries(menu, items, disabled_items);
}
-bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
+bool PeopleContextMenu::enableContextMenuItem(const LLSD& userdata)
{
+ if(gAgent.getID() == mUUIDs.front())
+ {
+ return false;
+ }
std::string item = userdata.asString();
// Note: can_block and can_delete is used only for one person selected menu
@@ -160,6 +213,12 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
{
return LLAvatarActions::canCall();
}
+ else if (item == std::string("can_zoom_in"))
+ {
+ const LLUUID& id = mUUIDs.front();
+
+ return gObjectList.findObject(id);
+ }
else if (item == std::string("can_show_on_map"))
{
const LLUUID& id = mUUIDs.front();
@@ -171,10 +230,19 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
{
return LLAvatarActions::canOfferTeleport(mUUIDs);
}
+ else if (item == std::string("can_callog"))
+ {
+ return LLLogChat::isTranscriptExist(mUUIDs.front());
+ }
+ else if (item == std::string("can_im") || item == std::string("can_invite") ||
+ item == std::string("can_share") || item == std::string("can_pay"))
+ {
+ return true;
+ }
return false;
}
-bool NearbyMenu::checkContextMenuItem(const LLSD& userdata)
+bool PeopleContextMenu::checkContextMenuItem(const LLSD& userdata)
{
std::string item = userdata.asString();
const LLUUID& id = mUUIDs.front();
@@ -187,11 +255,50 @@ bool NearbyMenu::checkContextMenuItem(const LLSD& userdata)
return false;
}
-void NearbyMenu::offerTeleport()
+void PeopleContextMenu::offerTeleport()
{
// boost::bind cannot recognize overloaded method LLAvatarActions::offerTeleport(),
// so we have to use a wrapper.
LLAvatarActions::offerTeleport(mUUIDs);
}
+//== NearbyPeopleContextMenu ===============================================================
+
+void NearbyPeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags)
+{
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
+
+ if (flags & ITEM_IN_MULTI_SELECTION)
+ {
+ items.push_back(std::string("add_friends"));
+ items.push_back(std::string("remove_friends"));
+ items.push_back(std::string("im"));
+ items.push_back(std::string("call"));
+ items.push_back(std::string("share"));
+ items.push_back(std::string("pay"));
+ items.push_back(std::string("offer_teleport"));
+ }
+ else
+ {
+ items.push_back(std::string("view_profile"));
+ items.push_back(std::string("im"));
+ items.push_back(std::string("offer_teleport"));
+ items.push_back(std::string("voice_call"));
+ items.push_back(std::string("chat_history"));
+ items.push_back(std::string("separator_chat_history"));
+ items.push_back(std::string("add_friend"));
+ items.push_back(std::string("remove_friend"));
+ items.push_back(std::string("invite_to_group"));
+ items.push_back(std::string("separator_invite_to_group"));
+ items.push_back(std::string("zoom_in"));
+ items.push_back(std::string("map"));
+ items.push_back(std::string("share"));
+ items.push_back(std::string("pay"));
+ items.push_back(std::string("block_unblock"));
+ }
+
+ hide_context_entries(menu, items, disabled_items);
+}
+
} // namespace LLPanelPeopleMenus
diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h
index d51eaec716..0a1dcef303 100644
--- a/indra/newview/llpanelpeoplemenus.h
+++ b/indra/newview/llpanelpeoplemenus.h
@@ -33,19 +33,33 @@ namespace LLPanelPeopleMenus
{
/**
- * Menu used in the nearby people list.
+ * Menu used in the people lists.
*/
-class NearbyMenu : public LLListContextMenu
+class PeopleContextMenu : public LLListContextMenu
{
public:
/*virtual*/ LLContextMenu* createMenu();
+
+protected:
+ virtual void buildContextMenu(class LLMenuGL& menu, U32 flags);
+
private:
bool enableContextMenuItem(const LLSD& userdata);
bool checkContextMenuItem(const LLSD& userdata);
void offerTeleport();
};
-extern NearbyMenu gNearbyMenu;
+/**
+ * Menu used in the nearby people list.
+ */
+class NearbyPeopleContextMenu : public PeopleContextMenu
+{
+protected:
+ /*virtual*/ void buildContextMenu(class LLMenuGL& menu, U32 flags);
+};
+
+extern PeopleContextMenu gPeopleContextMenu;
+extern NearbyPeopleContextMenu gNearbyPeopleContextMenu;
} // namespace LLPanelPeopleMenus
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 51ab7649a4..e641370d2e 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -425,7 +425,7 @@ void LLPanelPermissions::refresh()
}
}
- getChildView("button set group")->setEnabled(owners_identical && (mOwnerID == gAgent.getID()) && is_nonpermanent_enforced);
+ getChildView("button set group")->setEnabled(root_selected && owners_identical && (mOwnerID == gAgent.getID()) && is_nonpermanent_enforced);
getChildView("Name:")->setEnabled(TRUE);
LLLineEditor* LineEditorObjectName = getChild<LLLineEditor>("Object Name");
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
index ce8057eead..83b70d9f29 100644
--- a/indra/newview/llpanelplaceprofile.cpp
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -499,9 +499,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
std::string parcel_owner =
LLSLURL("agent", parcel->getOwnerID(), "inspect").getSLURLString();
mParcelOwner->setText(parcel_owner);
- LLAvatarNameCache::get(region->getOwner(),
- boost::bind(&LLPanelPlaceInfo::onAvatarNameCache,
- _1, _2, mRegionOwnerText));
+ LLAvatarNameCache::get(region->getOwner(), boost::bind(&LLPanelPlaceInfo::onAvatarNameCache, _1, _2, mRegionOwnerText));
}
if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus())
@@ -523,9 +521,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID();
if(auth_buyer_id.notNull())
{
- LLAvatarNameCache::get(auth_buyer_id,
- boost::bind(&LLPanelPlaceInfo::onAvatarNameCache,
- _1, _2, mSaleToText));
+ LLAvatarNameCache::get(auth_buyer_id, boost::bind(&LLPanelPlaceInfo::onAvatarNameCache, _1, _2, mSaleToText));
// Show sales info to a specific person or a group he belongs to.
if (auth_buyer_id != gAgent.getID() && !gAgent.isInGroup(auth_buyer_id))
diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h
index a33fc12ce4..f4c6145881 100644
--- a/indra/newview/llpanelplaceprofile.h
+++ b/indra/newview/llpanelplaceprofile.h
@@ -38,7 +38,7 @@ class LLPanelPlaceProfile : public LLPanelPlaceInfo
public:
LLPanelPlaceProfile();
/*virtual*/ ~LLPanelPlaceProfile();
-
+
/*virtual*/ BOOL postBuild();
/*virtual*/ void resetLocation();
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index 6d321d4716..6c2a01fc82 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -366,6 +366,7 @@ void LLPanelPlaces::onOpen(const LLSD& key)
if (key.size() != 0)
{
+ isLandmarkEditModeOn = false;
std::string key_type = key["type"].asString();
if (key_type == LANDMARK_TAB_INFO_TYPE)
{
@@ -392,7 +393,6 @@ void LLPanelPlaces::onOpen(const LLSD& key)
mPlaceInfoType = key_type;
mPosGlobal.setZero();
mItem = NULL;
- isLandmarkEditModeOn = false;
togglePlaceInfoPanel(TRUE);
if (mPlaceInfoType == AGENT_INFO_TYPE)
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index c63d89fc98..0756faf5c0 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -972,6 +972,11 @@ void LLTeleportHistoryPanel::onCollapseAllFolders()
mItemContainers.get(n)->setDisplayChildren(false);
}
mHistoryAccordion->arrange();
+
+ if (mLastSelectedFlatlList)
+ {
+ mLastSelectedFlatlList->resetSelection();
+ }
}
void LLTeleportHistoryPanel::onClearTeleportHistory()
diff --git a/indra/newview/llpaneltopinfobar.cpp b/indra/newview/llpaneltopinfobar.cpp
index 280cc11179..343c140bbb 100644
--- a/indra/newview/llpaneltopinfobar.cpp
+++ b/indra/newview/llpaneltopinfobar.cpp
@@ -64,9 +64,6 @@ private:
LLPanelTopInfoBar::LLPanelTopInfoBar(): mParcelChangedObserver(0)
{
- LLUICtrl::CommitCallbackRegistry::currentRegistrar()
- .add("TopInfoBar.Action", boost::bind(&LLPanelTopInfoBar::onContextMenuItemClicked, this, _2));
-
buildFromFile( "panel_topinfo_bar.xml");
}
@@ -132,6 +129,11 @@ void LLPanelTopInfoBar::handleLoginComplete()
BOOL LLPanelTopInfoBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
+ if(!LLUICtrl::CommitCallbackRegistry::getValue("TopInfoBar.Action"))
+ {
+ LLUICtrl::CommitCallbackRegistry::currentRegistrar()
+ .add("TopInfoBar.Action", boost::bind(&LLPanelTopInfoBar::onContextMenuItemClicked, this, _2));
+ }
show_topinfobar_context_menu(this, x, y);
return TRUE;
}
@@ -230,7 +232,7 @@ void LLPanelTopInfoBar::buildLocationString(std::string& loc_str, bool show_coor
void LLPanelTopInfoBar::setParcelInfoText(const std::string& new_text)
{
LLRect old_rect = getRect();
- const LLFontGL* font = mParcelInfoText->getDefaultFont();
+ const LLFontGL* font = mParcelInfoText->getFont();
S32 new_text_width = font->getWidth(new_text);
mParcelInfoText->setText(new_text);
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 975a6c67d8..c53760bca1 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -1,6 +1,6 @@
/**
* @file llparticipantlist.cpp
- * @brief LLParticipantList intended to update view(LLAvatarList) according to incoming messages
+ * @brief LLParticipantList : model of a conversation session with added speaker events handling
*
* $LicenseInfo:firstyear=2009&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -26,38 +26,17 @@
#include "llviewerprecompiledheaders.h"
-// common includes
-#include "lltrans.h"
-#include "llavataractions.h"
-#include "llagent.h"
-
+#include "llavatarnamecache.h"
#include "llimview.h"
-#include "llnotificationsutil.h"
+#include "llfloaterimcontainer.h"
#include "llparticipantlist.h"
#include "llspeakers.h"
-#include "llviewercontrol.h"
-#include "llviewermenu.h"
-#include "llvoiceclient.h"
//LLParticipantList retrieves add, clear and remove events and updates view accordingly
#if LL_MSVC
#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
#endif
-static const LLAvatarItemAgentOnTopComparator AGENT_ON_TOP_NAME_COMPARATOR;
-
-// helper function to update AvatarList Item's indicator in the voice participant list
-static void update_speaker_indicator(const LLAvatarList* const avatar_list, const LLUUID& avatar_uuid, bool is_muted)
-{
- LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(avatar_list->getItemByValue(avatar_uuid));
- if (item)
- {
- LLOutputMonitorCtrl* indicator = item->getChild<LLOutputMonitorCtrl>("speaking_indicator");
- indicator->setIsMuted(is_muted);
- }
-}
-
-
// See EXT-4301.
/**
* class LLAvalineUpdater - observe the list of voice participants in session and check
@@ -197,15 +176,9 @@ private:
uuid_set_t mAvalineCallers;
};
-LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source,
- LLAvatarList* avatar_list,
- bool use_context_menu/* = true*/,
- bool exclude_agent /*= true*/,
- bool can_toggle_icons /*= true*/) :
+LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLFolderViewModelInterface& root_view_model) :
+ LLConversationItemSession(data_source->getSessionID(), root_view_model),
mSpeakerMgr(data_source),
- mAvatarList(avatar_list),
- mParticipantListMenu(NULL),
- mExcludeAgent(exclude_agent),
mValidateSpeakerCallback(NULL)
{
@@ -216,36 +189,16 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source,
mSpeakerRemoveListener = new SpeakerRemoveListener(*this);
mSpeakerClearListener = new SpeakerClearListener(*this);
mSpeakerModeratorListener = new SpeakerModeratorUpdateListener(*this);
+ mSpeakerUpdateListener = new SpeakerUpdateListener(*this);
mSpeakerMuteListener = new SpeakerMuteListener(*this);
mSpeakerMgr->addListener(mSpeakerAddListener, "add");
mSpeakerMgr->addListener(mSpeakerRemoveListener, "remove");
mSpeakerMgr->addListener(mSpeakerClearListener, "clear");
mSpeakerMgr->addListener(mSpeakerModeratorListener, "update_moderator");
+ mSpeakerMgr->addListener(mSpeakerUpdateListener, "update_speaker");
- mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData"));
- LL_DEBUGS("SpeakingIndicator") << "Set session for speaking indicators: " << mSpeakerMgr->getSessionID() << LL_ENDL;
- mAvatarList->setSessionID(mSpeakerMgr->getSessionID());
- mAvatarListDoubleClickConnection = mAvatarList->setItemDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, _1));
- mAvatarListRefreshConnection = mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2));
- // Set onAvatarListDoubleClicked as default on_return action.
- mAvatarListReturnConnection = mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
-
- if (use_context_menu)
- {
- mParticipantListMenu = new LLParticipantListMenu(*this);
- mAvatarList->setContextMenu(mParticipantListMenu);
- }
- else
- {
- mAvatarList->setContextMenu(NULL);
- }
-
- if (use_context_menu && can_toggle_icons)
- {
- mAvatarList->setShowIcons("ParticipantListShowIcons");
- mAvatarListToggleIconsConnection = gSavedSettings.getControl("ParticipantListShowIcons")->getSignal()->connect(boost::bind(&LLAvatarList::toggleIcons, mAvatarList));
- }
+ setSessionID(mSpeakerMgr->getSessionID());
//Lets fill avatarList with existing speakers
LLSpeakerMgr::speaker_list_t speaker_list;
@@ -264,138 +217,32 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source,
mModeratorToRemoveList.insert(speakerp->mID);
}
}
- // we need to exclude agent id for non group chat
- sort();
-}
-
-LLParticipantList::~LLParticipantList()
-{
- mAvatarListDoubleClickConnection.disconnect();
- mAvatarListRefreshConnection.disconnect();
- mAvatarListReturnConnection.disconnect();
- mAvatarListToggleIconsConnection.disconnect();
-
- // It is possible Participant List will be re-created from LLCallFloater::onCurrentChannelChanged()
- // See ticket EXT-3427
- // 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);
- mAvatarList->setComparator(NULL);
-
- delete mAvalineUpdater;
-}
-
-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)
+ // Identify and store what kind of session we are
+ LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(data_source->getSessionID());
+ if (im_session)
{
- 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)
+ // By default, sessions that can't be identified as group or ad-hoc will be considered P2P (i.e. 1 on 1)
+ mConvType = CONV_SESSION_1_ON_1;
+ if (im_session->isAdHocSessionType())
{
- LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*> (list->getItemByValue(*moderator_list_it));
- if ( item )
- {
- std::string name = item->getAvatarName();
- std::string tooltip = item->getAvatarToolTip();
- size_t found = name.find(moderator_indicator);
- if (found != std::string::npos)
- {
- name.erase(found, moderator_indicator_len);
- item->setAvatarName(name);
- }
- found = tooltip.find(moderator_indicator);
- if (found != tooltip.npos)
- {
- tooltip.erase(found, moderator_indicator_len);
- item->setAvatarToolTip(tooltip);
- }
- }
- }
-
- 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();
- std::string tooltip = item->getAvatarToolTip();
- size_t found = name.find(moderator_indicator);
- if (found == std::string::npos)
- {
- name += " ";
- name += moderator_indicator;
- item->setAvatarName(name);
- }
- found = tooltip.find(moderator_indicator);
- if (found == std::string::npos)
- {
- tooltip += " ";
- tooltip += moderator_indicator;
- item->setAvatarToolTip(tooltip);
- }
- }
+ mConvType = CONV_SESSION_AD_HOC;
}
-
- // update voice mute state of all items. See EXT-7235
- LLSpeakerMgr::speaker_list_t speaker_list;
-
- // Use also participants which are not in voice session now (the second arg is TRUE).
- // They can already have mModeratorMutedVoice set from the previous voice session
- // and LLSpeakerVoiceModerationEvent will not be sent when speaker manager is updated next time.
- mSpeakerMgr->getSpeakerList(&speaker_list, TRUE);
- for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++)
+ else if (im_session->isGroupSessionType())
{
- const LLPointer<LLSpeaker>& speakerp = *it;
-
- if (speakerp->mStatus == LLSpeaker::STATUS_TEXT_ONLY)
- {
- update_speaker_indicator(list, speakerp->mID, speakerp->mModeratorMutedVoice);
- }
+ mConvType = CONV_SESSION_GROUP;
}
}
+ else
+ {
+ // That's the only session that doesn't get listed in the LLIMModel as a session...
+ mConvType = CONV_SESSION_NEARBY;
+ }
+}
+
+LLParticipantList::~LLParticipantList()
+{
+ delete mAvalineUpdater;
}
/*
@@ -411,31 +258,11 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)
*/
void LLParticipantList::onAvalineCallerFound(const LLUUID& participant_id)
{
- LLPanel* item = mAvatarList->getItemByValue(participant_id);
-
- if (NULL == item)
+ LLConversationItemParticipant* participant = findParticipant(participant_id);
+ if (participant)
{
- LL_WARNS("Avaline") << "Something wrong. Unable to find item for: " << participant_id << LL_ENDL;
- return;
+ removeParticipant(participant);
}
-
- if (typeid(*item) == typeid(LLAvalineListItem))
- {
- LL_DEBUGS("Avaline") << "Avaline caller has already correct class type for: " << participant_id << LL_ENDL;
- // item representing an Avaline caller has a correct type already.
- return;
- }
-
- LL_DEBUGS("Avaline") << "remove item from the list and re-add it: " << participant_id << LL_ENDL;
-
- // remove UUID from LLAvatarList::mIDs to be able add it again.
- uuid_vec_t& ids = mAvatarList->getIDs();
- uuid_vec_t::iterator pos = std::find(ids.begin(), ids.end(), participant_id);
- ids.erase(pos);
-
- // remove item directly
- mAvatarList->removeItem(item);
-
// re-add avaline caller with a correct class instance.
addAvatarIDExceptAgent(participant_id);
}
@@ -447,23 +274,6 @@ void LLParticipantList::onAvalineCallerRemoved(const LLUUID& participant_id)
mSpeakerMgr->removeAvalineSpeaker(participant_id);
}
-void LLParticipantList::setSortOrder(EParticipantSortOrder order)
-{
- const U32 speaker_sort_order = gSavedSettings.getU32("SpeakerParticipantDefaultOrder");
-
- if ( speaker_sort_order != order )
- {
- gSavedSettings.setU32("SpeakerParticipantDefaultOrder", (U32)order);
- sort();
- }
-}
-
-const LLParticipantList::EParticipantSortOrder LLParticipantList::getSortOrder() const
-{
- const U32 speaker_sort_order = gSavedSettings.getU32("SpeakerParticipantDefaultOrder");
- return EParticipantSortOrder(speaker_sort_order);
-}
-
void LLParticipantList::setValidateSpeakerCallback(validate_speaker_callback_t cb)
{
mValidateSpeakerCallback = cb;
@@ -472,19 +282,6 @@ void LLParticipantList::setValidateSpeakerCallback(validate_speaker_callback_t c
void LLParticipantList::update()
{
mSpeakerMgr->update(true);
-
- if (E_SORT_BY_RECENT_SPEAKERS == getSortOrder() && !isHovered())
- {
- // Resort avatar list
- sort();
- }
-}
-
-bool LLParticipantList::isHovered()
-{
- S32 x, y;
- LLUI::getMousePositionScreen(&x, &y);
- return mAvatarList->calcScreenRect().pointInRect(x, y);
}
bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
@@ -497,27 +294,34 @@ bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, co
}
addAvatarIDExceptAgent(uu_id);
- sort();
return true;
}
bool LLParticipantList::onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
{
- uuid_vec_t& group_members = mAvatarList->getIDs();
- uuid_vec_t::iterator pos = std::find(group_members.begin(), group_members.end(), event->getValue().asUUID());
- if(pos != group_members.end())
- {
- group_members.erase(pos);
- mAvatarList->setDirty();
- }
+ LLUUID avatar_id = event->getValue().asUUID();
+ removeParticipant(avatar_id);
return true;
}
bool LLParticipantList::onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
{
- uuid_vec_t& group_members = mAvatarList->getIDs();
- group_members.clear();
- mAvatarList->setDirty();
+ clearParticipants();
+ return true;
+}
+
+bool LLParticipantList::onSpeakerUpdateEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+ const LLSD& evt_data = event->getValue();
+ if ( evt_data.has("id") )
+ {
+ LLUUID participant_id = evt_data["id"];
+ LLFloaterIMContainer* im_box = LLFloaterIMContainer::findInstance();
+ if (im_box)
+ {
+ im_box->setTimeNow(mUUID,participant_id);
+ }
+ }
return true;
}
@@ -541,9 +345,7 @@ bool LLParticipantList::onModeratorUpdateEvent(LLPointer<LLOldEvents::LLEvent> e
mModeratorList.erase(id);
}
}
-
- // apply changes immediately
- onAvatarListRefreshed(mAvatarList, LLSD());
+ // *TODO : do we have to fire an event so that LLFloaterIMSessionTab::refreshConversation() gets called
}
}
return true;
@@ -557,60 +359,45 @@ bool LLParticipantList::onSpeakerMuteEvent(LLPointer<LLOldEvents::LLEvent> event
// update UI on confirmation of moderator mutes
if (event->getValue().asString() == "voice")
{
- update_speaker_indicator(mAvatarList, speakerp->mID, speakerp->mModeratorMutedVoice);
+ setParticipantIsMuted(speakerp->mID, speakerp->mModeratorMutedVoice);
}
return true;
}
-void LLParticipantList::sort()
+void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id)
{
- if ( !mAvatarList )
- return;
-
- switch ( getSortOrder() )
+ // Do not add if already in there, is the session id (hence not an avatar) or excluded for some reason
+ if (findParticipant(avatar_id) || (avatar_id == mUUID))
{
- 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;
+ return;
}
-}
-
-void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id)
-{
- if (mExcludeAgent && gAgent.getID() == avatar_id) return;
- if (mAvatarList->contains(avatar_id)) return;
bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(avatar_id);
+ LLConversationItemParticipant* participant = NULL;
+
if (is_avatar)
{
- mAvatarList->getIDs().push_back(avatar_id);
- mAvatarList->setDirty();
+ // Create a participant view model instance
+ LLAvatarName avatar_name;
+ bool has_name = LLAvatarNameCache::get(avatar_id, &avatar_name);
+ participant = new LLConversationItemParticipant(!has_name ? LLTrans::getString("AvatarNameWaiting") : avatar_name.getDisplayName() , avatar_id, mRootViewModel);
+ participant->fetchAvatarName();
}
else
{
std::string display_name = LLVoiceClient::getInstance()->getDisplayName(avatar_id);
- mAvatarList->addAvalineItem(avatar_id, mSpeakerMgr->getSessionID(), display_name.empty() ? LLTrans::getString("AvatarNameWaiting") : display_name);
+ // Create a participant view model instance
+ participant = new LLConversationItemParticipant(display_name.empty() ? LLTrans::getString("AvatarNameWaiting") : display_name, avatar_id, mRootViewModel);
mAvalineUpdater->watchAvalineCaller(avatar_id);
}
+
+ // *TODO : Need to update the online/offline status of the participant
+ // Hack for this: LLAvatarTracker::instance().isBuddyOnline(avatar_id))
+
+ // Add the participant model to the session's children list
+ addParticipant(participant);
+
adjustParticipant(avatar_id);
}
@@ -629,12 +416,12 @@ void LLParticipantList::adjustParticipant(const LLUUID& speaker_id)
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
+ * 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)
+ if (speaker.isNull() || (speaker->mType == LLSpeaker::SPEAKER_OBJECT))
{
return false;
}
@@ -658,6 +445,14 @@ bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents:
}
//
+// LLParticipantList::SpeakerUpdateListener
+//
+bool LLParticipantList::SpeakerUpdateListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+ return mParent.onSpeakerUpdateEvent(event, userdata);
+}
+
+//
// LLParticipantList::SpeakerModeratorListener
//
bool LLParticipantList::SpeakerModeratorUpdateListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
@@ -670,377 +465,4 @@ bool LLParticipantList::SpeakerMuteListener::handleEvent(LLPointer<LLOldEvents::
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.EnableItem.Moderate", boost::bind(&LLParticipantList::LLParticipantListMenu::enableModerateContextMenuItem, this, _2));
- enable_registrar.add("ParticipantList.CheckItem", boost::bind(&LLParticipantList::LLParticipantListMenu::checkContextMenuItem, this, _2));
-
- // create the context menu from the XUI
- LLContextMenu* main_menu = createFromFile("menu_participant_list.xml");
-
- // Don't show sort options for P2P chat
- bool is_sort_visible = (mParent.mAvatarList && mParent.mAvatarList->size() > 1);
- main_menu->setItemVisible("SortByName", is_sort_visible);
- main_menu->setItemVisible("SortByRecentSpeakers", is_sort_visible);
- main_menu->setItemVisible("Moderator Options Separator", isGroupModerator());
- main_menu->setItemVisible("Moderator Options", isGroupModerator());
- main_menu->setItemVisible("View Icons Separator", mParent.mAvatarListToggleIconsConnection.connected());
- main_menu->setItemVisible("View Icons", mParent.mAvatarListToggleIconsConnection.connected());
- main_menu->arrangeAndClear();
-
- return main_menu;
-}
-
-void LLParticipantList::LLParticipantListMenu::show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y)
-{
- if (uuids.size() == 0) return;
-
- LLListContextMenu::show(spawning_view, uuids, x, y);
-
- const LLUUID& speaker_id = mUUIDs.front();
- BOOL is_muted = isMuted(speaker_id);
-
- if (is_muted)
- {
- LLMenuGL::sMenuContainer->getChildView("ModerateVoiceMuteSelected")->setVisible( false);
- }
- else
- {
- LLMenuGL::sMenuContainer->getChildView("ModerateVoiceUnMuteSelected")->setVisible( 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())
- {
- LL_WARNS("Speakers") << "Speaker " << speaker_id << " not found" << llendl;
- return;
- }
- LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(mParent.mAvatarList->getItemByValue(speaker_id));
- if (NULL == item) return;
-
- name = item->getAvatarName();
-
- LLMute::EType mute_type;
- switch (speakerp->mType)
- {
- case LLSpeaker::SPEAKER_AGENT:
- mute_type = LLMute::AGENT;
- break;
- case LLSpeaker::SPEAKER_OBJECT:
- mute_type = LLMute::OBJECT;
- break;
- case LLSpeaker::SPEAKER_EXTERNAL:
- default:
- mute_type = LLMute::EXTERNAL;
- break;
- }
- LLMute mute(speaker_id, name, mute_type);
-
- if (!is_muted)
- {
- 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()
-{
- if (!mParent.mSpeakerMgr)
- {
- llwarns << "Speaker manager is missing" << llendl;
- return false;
- }
-
- // Is session a group call/chat?
- if(gAgent.isInGroup(mParent.mSpeakerMgr->getSessionID()))
- {
- LLSpeaker* speaker = mParent.mSpeakerMgr->findSpeaker(gAgentID).get();
-
- // Is agent a moderator?
- return speaker && speaker->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";
-
- if (moderate_selected)
- {
- const LLUUID& selected_avatar_id = mUUIDs.front();
- bool is_muted = isMuted(selected_avatar_id);
- moderateVoiceParticipant(selected_avatar_id, is_muted);
- }
- else
- {
- bool unmute_all = userdata.asString() == "unmute_all";
- moderateVoiceAllParticipants(unmute_all);
- }
-}
-
-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::moderateVoiceAllParticipants(bool unmute)
-{
- LLIMSpeakerMgr* mgr = dynamic_cast<LLIMSpeakerMgr*>(mParent.mSpeakerMgr);
- if (mgr)
- {
- if (!unmute)
- {
- LLSD payload;
- payload["session_id"] = mgr->getSessionID();
- LLNotificationsUtil::add("ConfirmMuteAll", LLSD(), payload, confirmMuteAllCallback);
- return;
- }
-
- mgr->moderateVoiceAllParticipants(unmute);
- }
-}
-
-// static
-void LLParticipantList::LLParticipantListMenu::confirmMuteAllCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- // if Cancel pressed
- if (option == 1)
- {
- return;
- }
-
- const LLSD& payload = notification["payload"];
- const LLUUID& session_id = payload["session_id"];
-
- LLIMSpeakerMgr * speaker_manager = dynamic_cast<LLIMSpeakerMgr*> (
- LLIMModel::getInstance()->getSpeakerManager(session_id));
- if (speaker_manager)
- {
- speaker_manager->moderateVoiceAllParticipants(false);
- }
-
- return;
-}
-
-
-bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& userdata)
-{
- std::string item = userdata.asString();
- const LLUUID& participant_id = mUUIDs.front();
-
- // For now non of "can_view_profile" action and menu actions listed below except "can_block"
- // can be performed for Avaline callers.
- bool is_participant_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(participant_id);
- if (!is_participant_avatar && "can_block" != item) return false;
-
- if (item == "can_mute_text" || "can_block" == item || "can_share" == item || "can_im" == item
- || "can_pay" == item)
- {
- return mUUIDs.front() != gAgentID;
- }
- else if (item == 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);
-
- uuid_vec_t::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::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
- return can_call;
- }
-
- return true;
-}
-
-/*
- Processed menu items with such parameters:
- can_allow_text_chat
- can_moderate_voice
-*/
-bool LLParticipantList::LLParticipantListMenu::enableModerateContextMenuItem(const LLSD& userdata)
-{
- // only group moderators can perform actions related to this "enable callback"
- if (!isGroupModerator()) return false;
-
- const LLUUID& participant_id = mUUIDs.front();
- LLPointer<LLSpeaker> speakerp = mParent.mSpeakerMgr->findSpeaker(participant_id);
-
- // not in voice participants can not be moderated
- bool speaker_in_voice = speakerp.notNull() && speakerp->isInVoiceChannel();
-
- const std::string& item = userdata.asString();
-
- if ("can_moderate_voice" == item)
- {
- return speaker_in_voice;
- }
-
- // For now non of menu actions except "can_moderate_voice" can be performed for Avaline callers.
- bool is_participant_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(participant_id);
- if (!is_participant_avatar) return false;
-
- return true;
-}
-
-bool LLParticipantList::LLParticipantListMenu::checkContextMenuItem(const LLSD& userdata)
-{
- std::string item = userdata.asString();
- 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.getSortOrder();
- }
- else if(item == "is_sorted_by_recent_speakers")
- {
- return E_SORT_BY_RECENT_SPEAKERS == mParent.getSortOrder();
- }
-
- 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 53966c15fe..3a3ae76604 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -1,6 +1,6 @@
/**
* @file llparticipantlist.h
- * @brief LLParticipantList intended to update view(LLAvatarList) according to incoming messages
+ * @brief LLParticipantList : model of a conversation session with added speaker events handling
*
* $LicenseInfo:firstyear=2009&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -28,35 +28,21 @@
#define LL_PARTICIPANTLIST_H
#include "llviewerprecompiledheaders.h"
-#include "llevent.h"
-#include "llavatarlist.h" // for LLAvatarItemRecentSpeakerComparator
-#include "lllistcontextmenu.h"
+#include "llconversationmodel.h"
class LLSpeakerMgr;
-class LLAvatarList;
class LLUICtrl;
class LLAvalineUpdater;
-class LLParticipantList
+class LLParticipantList : public LLConversationItemSession
{
LOG_CLASS(LLParticipantList);
public:
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,
- bool can_toggle_icons = true);
+ LLParticipantList(LLSpeakerMgr* data_source, LLFolderViewModelInterface& root_view_model);
~LLParticipantList();
- void setSpeakingIndicatorsVisible(BOOL visible);
-
- enum EParticipantSortOrder
- {
- E_SORT_BY_NAME = 0,
- E_SORT_BY_RECENT_SPEAKERS = 1,
- };
/**
* Adds specified avatar ID to the existing list if it is not Agent's ID
@@ -66,12 +52,6 @@ public:
void addAvatarIDExceptAgent(const LLUUID& avatar_id);
/**
- * Set and sort Avatarlist by given order
- */
- void setSortOrder(EParticipantSortOrder order = E_SORT_BY_NAME);
- const EParticipantSortOrder getSortOrder() const;
-
- /**
* Refreshes the participant list.
*/
void update();
@@ -93,14 +73,10 @@ protected:
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 onSpeakerUpdateEvent(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
@@ -134,6 +110,13 @@ protected:
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
};
+ class SpeakerUpdateListener : public BaseSpeakerListener
+ {
+ public:
+ SpeakerUpdateListener(LLParticipantList& parent) : BaseSpeakerListener(parent) {}
+ /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+ };
+
class SpeakerModeratorUpdateListener : public BaseSpeakerListener
{
public:
@@ -149,98 +132,7 @@ protected:
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
};
- /**
- * Menu used in the participant list.
- */
- class LLParticipantListMenu : public LLListContextMenu
- {
- public:
- LLParticipantListMenu(LLParticipantList& parent):mParent(parent){};
- /*virtual*/ LLContextMenu* createMenu();
- /*virtual*/ void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y);
- protected:
- LLParticipantList& mParent;
- private:
- bool enableContextMenuItem(const LLSD& userdata);
- bool enableModerateContextMenuItem(const LLSD& userdata);
- bool checkContextMenuItem(const LLSD& userdata);
-
- void sortParticipantList(const LLSD& userdata);
- 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 moderateVoiceAllParticipants()
- */
- 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 moderateVoiceAllParticipants()
- */
- void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute);
-
- /**
- * Mutes/Unmutes all avatars for current group voice chat.
- *
- * It only marks avatars as muted for session and does not use local Agent's Block list.
- *
- * @param[in] unmute if true - avatars will be muted, otherwise - unmuted.
- *
- * @see moderateVoiceParticipant()
- */
- void moderateVoiceAllParticipants(bool unmute);
-
- static void confirmMuteAllCallback(const LLSD& notification, const LLSD& response);
- };
-
- /**
- * 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);
-
void onAvalineCallerFound(const LLUUID& participant_id);
void onAvalineCallerRemoved(const LLUUID& participant_id);
@@ -251,10 +143,7 @@ private:
*/
void adjustParticipant(const LLUUID& speaker_id);
- bool isHovered();
-
LLSpeakerMgr* mSpeakerMgr;
- LLAvatarList* mAvatarList;
std::set<LLUUID> mModeratorList;
std::set<LLUUID> mModeratorToRemoveList;
@@ -262,25 +151,10 @@ private:
LLPointer<SpeakerAddListener> mSpeakerAddListener;
LLPointer<SpeakerRemoveListener> mSpeakerRemoveListener;
LLPointer<SpeakerClearListener> mSpeakerClearListener;
+ LLPointer<SpeakerUpdateListener> mSpeakerUpdateListener;
LLPointer<SpeakerModeratorUpdateListener> mSpeakerModeratorListener;
LLPointer<SpeakerMuteListener> mSpeakerMuteListener;
- LLParticipantListMenu* mParticipantListMenu;
-
- /**
- * 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;
- boost::signals2::connection mAvatarListToggleIconsConnection;
-
- LLPointer<LLAvatarItemRecentSpeakerComparator> mSortByRecentSpeakers;
validate_speaker_callback_t mValidateSpeakerCallback;
LLAvalineUpdater* mAvalineUpdater;
};
diff --git a/indra/newview/llpathfindingobject.cpp b/indra/newview/llpathfindingobject.cpp
index 858d3203c0..900763eae4 100644
--- a/indra/newview/llpathfindingobject.cpp
+++ b/indra/newview/llpathfindingobject.cpp
@@ -173,6 +173,7 @@ void LLPathfindingObject::fetchOwnerName()
mHasOwnerName = LLAvatarNameCache::get(mOwnerUUID, &mOwnerName);
if (!mHasOwnerName)
{
+ disconnectAvatarNameCacheConnection();
mAvatarNameCacheConnection = LLAvatarNameCache::get(mOwnerUUID, boost::bind(&LLPathfindingObject::handleAvatarNameFetch, this, _1, _2));
}
}
diff --git a/indra/newview/llpersistentnotificationstorage.cpp b/indra/newview/llpersistentnotificationstorage.cpp
new file mode 100644
index 0000000000..11c12e6c10
--- /dev/null
+++ b/indra/newview/llpersistentnotificationstorage.cpp
@@ -0,0 +1,145 @@
+/**
+* @file llpersistentnotificationstorage.cpp
+* @brief Implementation of llpersistentnotificationstorage
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpersistentnotificationstorage.h"
+
+#include "llchannelmanager.h"
+#include "llnotificationstorage.h"
+#include "llscreenchannel.h"
+#include "llscriptfloater.h"
+#include "llviewermessage.h"
+
+LLPersistentNotificationStorage::LLPersistentNotificationStorage()
+ : LLSingleton<LLPersistentNotificationStorage>()
+ , LLNotificationStorage(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml"))
+{
+}
+
+LLPersistentNotificationStorage::~LLPersistentNotificationStorage()
+{
+}
+
+static LLFastTimer::DeclareTimer FTM_SAVE_NOTIFICATIONS("Save Notifications");
+
+void LLPersistentNotificationStorage::saveNotifications()
+{
+ LLFastTimer _(FTM_SAVE_NOTIFICATIONS);
+
+ boost::intrusive_ptr<LLPersistentNotificationChannel> history_channel = boost::dynamic_pointer_cast<LLPersistentNotificationChannel>(LLNotifications::instance().getChannel("Persistent"));
+ if (!history_channel)
+ {
+ return;
+ }
+
+ LLSD output = LLSD::emptyMap();
+ LLSD& data = output["data"];
+
+ for ( std::vector<LLNotificationPtr>::iterator it = history_channel->beginHistory(), end_it = history_channel->endHistory();
+ it != end_it;
+ ++it)
+ {
+ LLNotificationPtr notification = *it;
+
+ // After a notification was placed in Persist channel, it can become
+ // responded, expired or canceled - in this case we are should not save it
+ if(notification->isRespondedTo() || notification->isCancelled()
+ || notification->isExpired())
+ {
+ continue;
+ }
+
+ data.append(notification->asLLSD(true));
+ }
+
+ writeNotifications(output);
+}
+
+static LLFastTimer::DeclareTimer FTM_LOAD_NOTIFICATIONS("Load Notifications");
+
+void LLPersistentNotificationStorage::loadNotifications()
+{
+ LLFastTimer _(FTM_LOAD_NOTIFICATIONS);
+
+ LLNotifications::instance().getChannel("Persistent")->
+ connectChanged(boost::bind(&LLPersistentNotificationStorage::onPersistentChannelChanged, this, _1));
+
+ LLSD input;
+ if (!readNotifications(input) ||input.isUndefined())
+ {
+ return;
+ }
+
+ LLSD& data = input["data"];
+ if (data.isUndefined())
+ {
+ return;
+ }
+
+ using namespace LLNotificationsUI;
+ LLScreenChannel* notification_channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->
+ findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
+
+ LLNotifications& instance = LLNotifications::instance();
+
+ for (LLSD::array_const_iterator notification_it = data.beginArray();
+ notification_it != data.endArray();
+ ++notification_it)
+ {
+ LLSD notification_params = *notification_it;
+ LLNotificationPtr notification(new LLNotification(notification_params));
+
+ LLNotificationResponderPtr responder(createResponder(notification_params["name"], notification_params["responder"]));
+ notification->setResponseFunctor(responder);
+
+ instance.add(notification);
+
+ // hide script floaters so they don't confuse the user and don't overlap startup toast
+ LLScriptFloaterManager::getInstance()->setFloaterVisible(notification->getID(), false);
+
+ if(notification_channel)
+ {
+ // hide saved toasts so they don't confuse the user
+ notification_channel->hideToast(notification->getID());
+ }
+ }
+}
+
+bool LLPersistentNotificationStorage::onPersistentChannelChanged(const LLSD& payload)
+{
+ // we ignore "load" messages, but rewrite the persistence file on any other
+ const std::string sigtype = payload["sigtype"].asString();
+ if ("load" != sigtype)
+ {
+ saveNotifications();
+ }
+ return false;
+}
+
+// EOF
diff --git a/indra/newview/llpersistentnotificationstorage.h b/indra/newview/llpersistentnotificationstorage.h
new file mode 100644
index 0000000000..98a825d2c1
--- /dev/null
+++ b/indra/newview/llpersistentnotificationstorage.h
@@ -0,0 +1,63 @@
+/**
+* @file llpersistentnotificationstorage.h
+* @brief Header file for llpersistentnotificationstorage
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+#ifndef LL_LLPERSISTENTNOTIFICATIONSTORAGE_H
+#define LL_LLPERSISTENTNOTIFICATIONSTORAGE_H
+
+#include "llerror.h"
+#include "llnotificationstorage.h"
+#include "llsingleton.h"
+
+class LLSD;
+
+// Class that saves not responded(unread) notifications.
+// Unread notifications are saved in open_notifications.xml in SL account folder
+//
+// Notifications that should be saved(if unread) are marked with persist="true" in notifications.xml
+// Notifications using functor responders are saved automatically (see llviewermessage.cpp
+// lure_callback_reg for example).
+// Notifications using object responders(LLOfferInfo) need additional tuning. Responder object should
+// be a) serializable(implement LLNotificationResponderInterface),
+// b) registered with LLResponderRegistry (found in llpersistentnotificationstorage.cpp).
+
+class LLPersistentNotificationStorage : public LLSingleton<LLPersistentNotificationStorage>, public LLNotificationStorage
+{
+ LOG_CLASS(LLPersistentNotificationStorage);
+public:
+ LLPersistentNotificationStorage();
+ ~LLPersistentNotificationStorage();
+
+ void saveNotifications();
+ void loadNotifications();
+
+protected:
+
+private:
+ bool onPersistentChannelChanged(const LLSD& payload);
+};
+
+#endif // LL_LLPERSISTENTNOTIFICATIONSTORAGE_H
+
diff --git a/indra/newview/llplacesfolderview.cpp b/indra/newview/llplacesfolderview.cpp
new file mode 100644
index 0000000000..3caa93ae71
--- /dev/null
+++ b/indra/newview/llplacesfolderview.cpp
@@ -0,0 +1,74 @@
+/**
+* @file llplacesfolderview.cpp
+* @brief llplacesfolderview used within llplacesinventorypanel
+* @author Gilbert@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llplacesfolderview.h"
+
+#include "llplacesinventorypanel.h"
+#include "llpanellandmarks.h"
+
+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 = static_cast<LLFolderViewModelItemInventory*>(getCurSelectedItem()->getViewModelItem())->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;
+}
+
diff --git a/indra/newview/llplacesfolderview.h b/indra/newview/llplacesfolderview.h
new file mode 100644
index 0000000000..8c5be39b5e
--- /dev/null
+++ b/indra/newview/llplacesfolderview.h
@@ -0,0 +1,72 @@
+/**
+* @file llplacesfolderview.h
+* @brief llplacesfolderview used within llplacesinventorypanel
+* @author Gilbert@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+#ifndef LL_LLPLACESFOLDERVIEW_H
+#define LL_LLPLACESFOLDERVIEW_H
+
+#include "llfolderview.h"
+#include "llinventorypanel.h"
+
+class LLLandmarksPanel;
+
+class LLPlacesFolderView : public LLFolderView
+{
+public:
+
+ struct Params : public LLInitParam::Block<Params, LLFolderView::Params>
+ {
+ Params()
+ {}
+ };
+
+ 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;
+ }
+
+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_LLPLACESFOLDERVIEW_H
+
diff --git a/indra/newview/llplacesinventorybridge.cpp b/indra/newview/llplacesinventorybridge.cpp
index fe4cc0f55f..ebd9604c5b 100644
--- a/indra/newview/llplacesinventorybridge.cpp
+++ b/indra/newview/llplacesinventorybridge.cpp
@@ -85,34 +85,33 @@ void LLPlacesLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
void LLPlacesFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
+ std::vector<std::string> items;
+ std::vector<std::string> disabled_items;
+
+ LLInventoryPanel* inv_panel = mInventoryPanel.get();
+ bool is_open = false;
+ if (inv_panel)
{
- std::vector<std::string> items;
- std::vector<std::string> disabled_items;
+ LLFolderViewFolder* folder = dynamic_cast<LLFolderViewFolder*>(inv_panel->getItemByID(mUUID));
+ is_open = (NULL != folder) && folder->isOpen();
+ }
- LLInventoryPanel* inv_panel = mInventoryPanel.get();
- bool is_open = false;
- if (inv_panel)
- {
- LLFolderViewFolder* folder = dynamic_cast<LLFolderViewFolder*>(inv_panel->getRootFolder()->getItemByID(mUUID));
- is_open = (NULL != folder) && folder->isOpen();
- }
+ // collect all items' names
+ fill_items_with_menu_items(items, menu);
- // collect all items' names
- fill_items_with_menu_items(items, menu);
+ // remove expand or collapse menu item depend on folder state
+ std::string collapse_expand_item_to_hide(is_open ? "expand" : "collapse");
+ std::vector<std::string>::iterator it = std::find(items.begin(), items.end(), collapse_expand_item_to_hide);
+ if (it != items.end()) items.erase(it);
- // remove expand or collapse menu item depend on folder state
- std::string collapse_expand_item_to_hide(is_open ? "expand" : "collapse");
- std::vector<std::string>::iterator it = std::find(items.begin(), items.end(), collapse_expand_item_to_hide);
- if (it != items.end()) items.erase(it);
- // Disabled items are processed via LLLandmarksPanel::isActionEnabled()
- // they should be synchronized with Places/My Landmarks/Gear menu. See EXT-1601
+ // Disabled items are processed via LLLandmarksPanel::isActionEnabled()
+ // they should be synchronized with Places/My Landmarks/Gear menu. See EXT-1601
- // repeat parent functionality
- sSelf = getHandle(); // necessary for "New Folder" functionality
+ // repeat parent functionality
+ sSelf = getHandle(); // necessary for "New Folder" functionality
- hide_context_entries(menu, items, disabled_items);
- }
+ hide_context_entries(menu, items, disabled_items);
}
//virtual
@@ -140,7 +139,7 @@ LLFolderViewFolder* LLPlacesFolderBridge::getFolder()
LLInventoryPanel* inv_panel = mInventoryPanel.get();
if (inv_panel)
{
- folder = dynamic_cast<LLFolderViewFolder*>(inv_panel->getRootFolder()->getItemByID(mUUID));
+ folder = dynamic_cast<LLFolderViewFolder*>(inv_panel->getItemByID(mUUID));
}
return folder;
@@ -152,6 +151,7 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge(
LLAssetType::EType actual_asset_type,
LLInventoryType::EType inv_type,
LLInventoryPanel* inventory,
+ LLFolderViewModelInventory* view_model,
LLFolderView* root,
const LLUUID& uuid,
U32 flags/* = 0x00*/) const
@@ -170,11 +170,12 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge(
if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)
{
// *TODO: Create a link folder handler instead if it is necessary
- new_listener = LLInventoryFVBridgeBuilder::createBridge(
+ new_listener = LLInventoryFolderViewModelBuilder::createBridge(
asset_type,
actual_asset_type,
inv_type,
inventory,
+ view_model,
root,
uuid,
flags);
@@ -183,11 +184,12 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge(
new_listener = new LLPlacesFolderBridge(inv_type, inventory, root, uuid);
break;
default:
- new_listener = LLInventoryFVBridgeBuilder::createBridge(
+ new_listener = LLInventoryFolderViewModelBuilder::createBridge(
asset_type,
actual_asset_type,
inv_type,
inventory,
+ view_model,
root,
uuid,
flags);
diff --git a/indra/newview/llplacesinventorybridge.h b/indra/newview/llplacesinventorybridge.h
index 52beacef9c..07d18d03c5 100644
--- a/indra/newview/llplacesinventorybridge.h
+++ b/indra/newview/llplacesinventorybridge.h
@@ -82,13 +82,14 @@ protected:
*
* It builds Bridges for Landmarks and Folders in Places Landmarks Panel
*/
-class LLPlacesInventoryBridgeBuilder : public LLInventoryFVBridgeBuilder
+class LLPlacesInventoryBridgeBuilder : public LLInventoryFolderViewModelBuilder
{
public:
/*virtual*/ LLInvFVBridge* createBridge(LLAssetType::EType asset_type,
LLAssetType::EType actual_asset_type,
LLInventoryType::EType inv_type,
LLInventoryPanel* inventory,
+ LLFolderViewModelInventory* view_model,
LLFolderView* root,
const LLUUID& uuid,
U32 flags = 0x00) const;
diff --git a/indra/newview/llplacesinventorypanel.cpp b/indra/newview/llplacesinventorypanel.cpp
index f7823f4fe8..4c2213c198 100644
--- a/indra/newview/llplacesinventorypanel.cpp
+++ b/indra/newview/llplacesinventorypanel.cpp
@@ -30,7 +30,8 @@
#include "llplacesinventorypanel.h"
-#include "llfoldervieweventlistener.h"
+#include "llfolderviewmodel.h"
+#include "llplacesfolderview.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
#include "llpanellandmarks.h"
@@ -57,44 +58,35 @@ LLPlacesInventoryPanel::~LLPlacesInventoryPanel()
delete mSavedFolderState;
}
-void LLPlacesInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params)
-{
- // Determine the root folder in case specified, and
- // build the views starting with that folder.
- const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(params.start_folder);
-
- LLUUID root_id;
- if ("LIBRARY" == params.start_folder())
- {
- root_id = gInventory.getLibraryRootFolderID();
- }
- else
- {
- root_id = (preferred_type != LLFolderType::FT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null);
- }
-
- LLRect folder_rect(0,
- 0,
- getRect().getWidth(),
- 0);
- LLPlacesFolderView::Params p;
- p.name = getName();
- p.title = getLabel();
- p.rect = folder_rect;
- p.listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_CATEGORY,
- LLAssetType::AT_CATEGORY,
- LLInventoryType::IT_CATEGORY,
- this,
- NULL,
- root_id);
- p.parent_panel = this;
- p.allow_multiselect = mAllowMultiSelect;
- p.use_ellipses = true; // truncate inventory item text so remove horizontal scroller
- mFolderRoot = (LLFolderView*)LLUICtrlFactory::create<LLPlacesFolderView>(p);
+LLFolderView * LLPlacesInventoryPanel::createFolderRoot(LLUUID root_id )
+{
+ LLPlacesFolderView::Params p;
+
+ p.name = getName();
+ p.title = getLabel();
+ p.rect = LLRect(0, 0, getRect().getWidth(), 0);
+ p.parent_panel = this;
+ p.tool_tip = p.name;
+ p.listener = mInvFVBridgeBuilder->createBridge( LLAssetType::AT_CATEGORY,
+ LLAssetType::AT_CATEGORY,
+ LLInventoryType::IT_CATEGORY,
+ this,
+ &mInventoryViewModel,
+ NULL,
+ root_id);
+ p.view_model = &mInventoryViewModel;
+ p.use_label_suffix = mParams.use_label_suffix;
+ p.allow_multiselect = mAllowMultiSelect;
+ p.show_empty_message = mShowEmptyMessage;
+ p.show_item_link_overlays = mShowItemLinkOverlays;
+ p.root = NULL;
+ p.use_ellipses = mParams.folder_view.use_ellipses;
+ p.options_menu = "menu_inventory.xml";
+
+ return LLUICtrlFactory::create<LLPlacesFolderView>(p);
}
-
// save current folder open state
void LLPlacesInventoryPanel::saveFolderState()
{
@@ -128,59 +120,3 @@ S32 LLPlacesInventoryPanel::notify(const LLSD& 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
index f647e7f970..2805fc4257 100644
--- a/indra/newview/llplacesinventorypanel.h
+++ b/indra/newview/llplacesinventorypanel.h
@@ -29,9 +29,9 @@
#include "llfloaterinventory.h"
#include "llinventorypanel.h"
-#include "llfolderview.h"
class LLLandmarksPanel;
+class LLFolderView;
class LLPlacesInventoryPanel : public LLInventoryPanel
{
@@ -46,8 +46,7 @@ public:
LLPlacesInventoryPanel(const Params& p);
~LLPlacesInventoryPanel();
- /*virtual*/ void buildFolderView(const LLInventoryPanel::Params& params);
-
+ LLFolderView * createFolderRoot(LLUUID root_id );
void saveFolderState();
void restoreFolderState();
@@ -57,36 +56,4 @@ 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/llpolymesh.cpp b/indra/newview/llpolymesh.cpp
index 70f3b5335e..5f5258bbce 100644
--- a/indra/newview/llpolymesh.cpp
+++ b/indra/newview/llpolymesh.cpp
@@ -241,7 +241,7 @@ BOOL LLPolyMeshSharedData::allocateVertexData( U32 numVertices )
mBaseNormals[i].clear();
mBaseBinormals[i].clear();
mTexCoords[i].clear();
- mWeights[i] = 0.f;
+ mWeights[i] = 0.f;
}
mNumVertices = numVertices;
return TRUE;
@@ -750,8 +750,6 @@ const LLVector2 &LLPolyMeshSharedData::getUVs(U32 index)
//-----------------------------------------------------------------------------
LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_mesh)
{
- LLMemType mt(LLMemType::MTYPE_AVATAR_MESH);
-
llassert(shared_data);
mSharedData = shared_data;
diff --git a/indra/newview/llpolymesh.h b/indra/newview/llpolymesh.h
index ffb11a3f7e..28da230541 100644
--- a/indra/newview/llpolymesh.h
+++ b/indra/newview/llpolymesh.h
@@ -400,12 +400,24 @@ protected:
// LLPolySkeletalDeformation
// A set of joint scale data for deforming the avatar mesh
//-----------------------------------------------------------------------------
+
+LL_ALIGN_PREFIX(16)
class LLPolySkeletalDistortion : public LLViewerVisualParam
{
public:
LLPolySkeletalDistortion(LLVOAvatar *avatarp);
~LLPolySkeletalDistortion();
+ void* operator new(size_t size)
+ {
+ return ll_aligned_malloc_16(size);
+ }
+
+ void operator delete(void* ptr)
+ {
+ ll_aligned_free_16(ptr);
+ }
+
// Special: These functions are overridden by child classes
LLPolySkeletalDistortionInfo* getInfo() const { return (LLPolySkeletalDistortionInfo*)mInfo; }
// This sets mInfo and calls initialization functions
@@ -426,13 +438,14 @@ public:
/*virtual*/ const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh){index = 0; poly_mesh = NULL; return NULL;};
protected:
+ LL_ALIGN_16(LLVector4a mDefaultVec);
+
typedef std::map<LLJoint*, LLVector3> joint_vec_map_t;
joint_vec_map_t mJointScales;
joint_vec_map_t mJointOffsets;
- LLVector4a mDefaultVec;
// Backlink only; don't make this an LLPointer.
LLVOAvatar *mAvatar;
-};
+} LL_ALIGN_POSTFIX(16);
#endif // LL_LLPOLYMESH_H
diff --git a/indra/newview/llpolymorph.cpp b/indra/newview/llpolymorph.cpp
index d25d1420ee..495fdc348c 100644
--- a/indra/newview/llpolymorph.cpp
+++ b/indra/newview/llpolymorph.cpp
@@ -73,9 +73,11 @@ LLPolyMorphData::LLPolyMorphData(const LLPolyMorphData &rhs) :
{
const S32 numVertices = mNumIndices;
- mCoords = new LLVector4a[numVertices];
- mNormals = new LLVector4a[numVertices];
- mBinormals = new LLVector4a[numVertices];
+ U32 size = sizeof(LLVector4a)*numVertices;
+
+ mCoords = static_cast<LLVector4a*>( ll_aligned_malloc_16(size) );
+ mNormals = static_cast<LLVector4a*>( ll_aligned_malloc_16(size) );
+ mBinormals = static_cast<LLVector4a*>( ll_aligned_malloc_16(size) );
mTexCoords = new LLVector2[numVertices];
mVertexIndices = new U32[numVertices];
@@ -89,17 +91,12 @@ LLPolyMorphData::LLPolyMorphData(const LLPolyMorphData &rhs) :
}
}
-
//-----------------------------------------------------------------------------
// ~LLPolyMorphData()
//-----------------------------------------------------------------------------
LLPolyMorphData::~LLPolyMorphData()
{
- delete [] mVertexIndices;
- delete [] mCoords;
- delete [] mNormals;
- delete [] mBinormals;
- delete [] mTexCoords;
+ freeData();
}
//-----------------------------------------------------------------------------
@@ -119,11 +116,20 @@ BOOL LLPolyMorphData::loadBinary(LLFILE *fp, LLPolyMeshSharedData *mesh)
}
//-------------------------------------------------------------------------
+ // free any existing data
+ //-------------------------------------------------------------------------
+ freeData();
+
+ //-------------------------------------------------------------------------
// allocate vertices
//-------------------------------------------------------------------------
- mCoords = new LLVector4a[numVertices];
- mNormals = new LLVector4a[numVertices];
- mBinormals = new LLVector4a[numVertices];
+
+ U32 size = sizeof(LLVector4a)*numVertices;
+
+ mCoords = static_cast<LLVector4a*>(ll_aligned_malloc_16(size));
+ mNormals = static_cast<LLVector4a*>(ll_aligned_malloc_16(size));
+ mBinormals = static_cast<LLVector4a*>(ll_aligned_malloc_16(size));
+
mTexCoords = new LLVector2[numVertices];
// Actually, we are allocating more space than we need for the skiplist
mVertexIndices = new U32[numVertices];
@@ -207,6 +213,42 @@ BOOL LLPolyMorphData::loadBinary(LLFILE *fp, LLPolyMeshSharedData *mesh)
}
//-----------------------------------------------------------------------------
+// freeData()
+//-----------------------------------------------------------------------------
+void LLPolyMorphData::freeData()
+{
+ if (mCoords != NULL)
+ {
+ ll_aligned_free_16(mCoords);
+ mCoords = NULL;
+ }
+
+ if (mNormals != NULL)
+ {
+ ll_aligned_free_16(mNormals);
+ mNormals = NULL;
+ }
+
+ if (mBinormals != NULL)
+ {
+ ll_aligned_free_16(mBinormals);
+ mBinormals = NULL;
+ }
+
+ if (mTexCoords != NULL)
+ {
+ delete [] mTexCoords;
+ mTexCoords = NULL;
+ }
+
+ if (mVertexIndices != NULL)
+ {
+ delete [] mVertexIndices;
+ mVertexIndices = NULL;
+ }
+}
+
+//-----------------------------------------------------------------------------
// LLPolyMorphTargetInfo()
//-----------------------------------------------------------------------------
LLPolyMorphTargetInfo::LLPolyMorphTargetInfo()
diff --git a/indra/newview/llpolymorph.h b/indra/newview/llpolymorph.h
index 46e23b7792..24940c52e0 100644
--- a/indra/newview/llpolymorph.h
+++ b/indra/newview/llpolymorph.h
@@ -41,6 +41,7 @@ class LLWearable;
//-----------------------------------------------------------------------------
// LLPolyMorphData()
//-----------------------------------------------------------------------------
+LL_ALIGN_PREFIX(16)
class LLPolyMorphData
{
public:
@@ -48,6 +49,16 @@ public:
~LLPolyMorphData();
LLPolyMorphData(const LLPolyMorphData &rhs);
+ void* operator new(size_t size)
+ {
+ return ll_aligned_malloc_16(size);
+ }
+
+ void operator delete(void* ptr)
+ {
+ ll_aligned_free_16(ptr);
+ }
+
BOOL loadBinary(LLFILE* fp, LLPolyMeshSharedData *mesh);
const std::string& getName() { return mName; }
@@ -65,9 +76,13 @@ public:
F32 mTotalDistortion; // vertex distortion summed over entire morph
F32 mMaxDistortion; // maximum single vertex distortion in a given morph
- LLVector4a mAvgDistortion; // average vertex distortion, to infer directionality of the morph
+ LL_ALIGN_16(LLVector4a mAvgDistortion); // average vertex distortion, to infer directionality of the morph
LLPolyMeshSharedData* mMesh;
-};
+
+private:
+ void freeData();
+} LL_ALIGN_POSTFIX(16);
+
//-----------------------------------------------------------------------------
// LLPolyVertexMask()
diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp
index 18626e3273..04934b13f1 100644
--- a/indra/newview/llpreview.cpp
+++ b/indra/newview/llpreview.cpp
@@ -464,7 +464,9 @@ LLMultiPreview::LLMultiPreview()
void LLMultiPreview::onOpen(const LLSD& key)
{
- LLPreview* frontmost_preview = (LLPreview*)mTabContainer->getCurrentPanel();
+ // Floater could be something else than LLPreview, eg LLFloaterProfile.
+ LLPreview* frontmost_preview = dynamic_cast<LLPreview*>(mTabContainer->getCurrentPanel());
+
if (frontmost_preview && frontmost_preview->getAssetStatus() == LLPreview::PREVIEW_ASSET_UNLOADED)
{
frontmost_preview->loadAsset();
@@ -477,8 +479,13 @@ void LLMultiPreview::handleReshape(const LLRect& new_rect, bool by_user)
{
if(new_rect.getWidth() != getRect().getWidth() || new_rect.getHeight() != getRect().getHeight())
{
- LLPreview* frontmost_preview = (LLPreview*)mTabContainer->getCurrentPanel();
- if (frontmost_preview) frontmost_preview->userResized();
+ // Floater could be something else than LLPreview, eg LLFloaterProfile.
+ LLPreview* frontmost_preview = dynamic_cast<LLPreview*>(mTabContainer->getCurrentPanel());
+
+ if (frontmost_preview)
+ {
+ frontmost_preview->userResized();
+ }
}
LLFloater::handleReshape(new_rect, by_user);
}
@@ -486,7 +493,9 @@ void LLMultiPreview::handleReshape(const LLRect& new_rect, bool by_user)
void LLMultiPreview::tabOpen(LLFloater* opened_floater, bool from_click)
{
- LLPreview* opened_preview = (LLPreview*)opened_floater;
+ // Floater could be something else than LLPreview, eg LLFloaterProfile.
+ LLPreview* opened_preview = dynamic_cast<LLPreview*>(opened_floater);
+
if (opened_preview && opened_preview->getAssetStatus() == LLPreview::PREVIEW_ASSET_UNLOADED)
{
opened_preview->loadAsset();
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 88727bf59b..968a912ea2 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -305,7 +305,11 @@ BOOL LLFloaterScriptSearch::handleKeyHere(KEY key, MASK mask)
{
if (mEditorCore)
{
- return mEditorCore->handleKeyHere(key, mask);
+ BOOL handled = mEditorCore->handleKeyHere(key, mask);
+ if (!handled)
+ {
+ LLFloater::handleKeyHere(key, mask);
+ }
}
return FALSE;
@@ -815,7 +819,7 @@ void LLScriptEdCore::onBtnDynamicHelp()
if (!live_help_floater)
{
live_help_floater = new LLFloater(LLSD());
- live_help_floater->buildFromFile("floater_lsl_guide.xml", NULL);
+ live_help_floater->buildFromFile("floater_lsl_guide.xml");
LLFloater* parent = dynamic_cast<LLFloater*>(getParent());
llassert(parent);
if (parent)
diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp
index f86e583b9e..989f0b0e60 100644
--- a/indra/newview/llprogressview.cpp
+++ b/indra/newview/llprogressview.cpp
@@ -96,7 +96,7 @@ BOOL LLProgressView::postBuild()
getChild<LLTextBox>("message_text")->setClickedCallback(onClickMessage, this);
// hidden initially, until we need it
- LLPanel::setVisible(FALSE);
+ setVisible(FALSE);
LLNotifications::instance().getChannel("AlertModal")->connectChanged(boost::bind(&LLProgressView::onAlertModal, this, _1));
@@ -265,7 +265,7 @@ void LLProgressView::draw()
gFocusMgr.releaseFocusIfNeeded( this );
// turn off panel that hosts intro so we see the world
- LLPanel::setVisible(FALSE);
+ setVisible(FALSE);
// stop observing events since we no longer care
mMediaCtrl->remObserver( this );
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index d340b304ca..154555b261 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -39,7 +39,7 @@
#include "lldockablefloater.h"
#include "llsyswellwindow.h"
-#include "llimfloater.h"
+#include "llfloaterimsession.h"
#include "llscriptfloater.h"
#include "llrootview.h"
@@ -253,12 +253,26 @@ void LLScreenChannel::addToast(const LLToast::Params& p)
{
bool store_toast = false, show_toast = false;
- mDisplayToastsAlways ? show_toast = true : show_toast = mWasStartUpToastShown && (mShowToasts || p.force_show);
+ if (mDisplayToastsAlways)
+ {
+ show_toast = true;
+ }
+ else
+ {
+ show_toast = mWasStartUpToastShown && (mShowToasts || p.force_show);
+ }
store_toast = !show_toast && p.can_be_stored && mCanStoreToasts;
if(!show_toast && !store_toast)
{
- mRejectToastSignal(p.notif_id);
+ LLNotificationPtr notification = LLNotifications::instance().find(p.notif_id);
+
+ if (notification &&
+ (!notification->canLogToIM() || !notification->hasFormElements()))
+ {
+ // only cancel notification if it isn't being used in IM session
+ LLNotifications::instance().cancel(notification);
+ }
return;
}
@@ -371,7 +385,7 @@ void LLScreenChannel::storeToast(ToastElem& toast_elem)
const LLToast* toast = toast_elem.getToast();
if (toast)
{
- mStoredToastList.push_back(toast_elem);
+ mStoredToastList.push_back(toast_elem);
mOnStoreToast(toast->getPanel(), toast->getNotificationID());
}
}
@@ -410,14 +424,14 @@ void LLScreenChannel::loadStoredToastByNotificationIDToChannel(LLUUID id)
LLToast* toast = it->getToast();
if (toast)
{
- if(toast->getVisible())
- {
- // toast is already in channel
- return;
- }
+ if(toast->getVisible())
+ {
+ // toast is already in channel
+ return;
+ }
- toast->setIsHidden(false);
- toast->startTimer();
+ toast->setIsHidden(false);
+ toast->startTimer();
mToastList.push_back(*it);
}
@@ -425,34 +439,12 @@ void LLScreenChannel::loadStoredToastByNotificationIDToChannel(LLUUID id)
}
//--------------------------------------------------------------------------
-void LLScreenChannel::removeStoredToastByNotificationID(LLUUID id)
-{
- // *TODO: may be remove this function
- std::vector<ToastElem>::iterator it = find(mStoredToastList.begin(), mStoredToastList.end(), id);
-
- if( it == mStoredToastList.end() )
- return;
-
- const LLToast* toast = it->getToast();
- if (toast)
- {
- mRejectToastSignal(toast->getNotificationID());
- }
-
- // Call find() once more, because the mStoredToastList could have been changed
- // in mRejectToastSignal callback and the iterator could have become invalid.
- it = find(mStoredToastList.begin(), mStoredToastList.end(), id);
- if (it != mStoredToastList.end())
- {
- mStoredToastList.erase(it);
- }
-}
-
-//--------------------------------------------------------------------------
void LLScreenChannel::killToastByNotificationID(LLUUID id)
{
// searching among toasts on a screen
std::vector<ToastElem>::iterator it = find(mToastList.begin(), mToastList.end(), id);
+ LLNotificationPtr notification = LLNotifications::instance().find(id);
+ if (!notification) return;
if( it != mToastList.end())
{
@@ -465,42 +457,67 @@ void LLScreenChannel::killToastByNotificationID(LLUUID id)
// the toast will be destroyed.
if(toast && toast->isNotificationValid())
{
- mRejectToastSignal(toast->getNotificationID());
+ if (!notification->canLogToIM() || !notification->hasFormElements())
+ {
+ // only cancel notification if it isn't being used in IM session
+ LLNotifications::instance().cancel(notification);
+ }
}
else
{
-
- deleteToast(toast);
- mToastList.erase(it);
- redrawToasts();
+ removeToastByNotificationID(id);
}
- return;
}
-
- // searching among stored toasts
- it = find(mStoredToastList.begin(), mStoredToastList.end(), id);
-
- if (it != mStoredToastList.end())
+ else
{
- LLToast* toast = it->getToast();
- if (toast)
+ // searching among stored toasts
+ it = find(mStoredToastList.begin(), mStoredToastList.end(), id);
+
+ if( it != mStoredToastList.end() )
{
- // send signal to a listener to let him perform some action on toast rejecting
- mRejectToastSignal(toast->getNotificationID());
- deleteToast(toast);
+ LLToast* toast = it->getToast();
+ if (toast)
+ {
+ if (!notification->canLogToIM() || !notification->hasFormElements())
+ {
+ // only cancel notification if it isn't being used in IM session
+ LLNotifications::instance().cancel(notification);
+ }
+ deleteToast(toast);
+ }
+ }
+
+ // Call find() once more, because the mStoredToastList could have been changed
+ // via notification cancellation and the iterator could have become invalid.
+ it = find(mStoredToastList.begin(), mStoredToastList.end(), id);
+ if (it != mStoredToastList.end())
+ {
+ mStoredToastList.erase(it);
}
}
+}
+
+void LLScreenChannel::removeToastByNotificationID(LLUUID id)
+{
+ std::vector<ToastElem>::iterator it = find(mToastList.begin(), mToastList.end(), id);
+ while( it != mToastList.end())
+ {
+ deleteToast(it->getToast());
+ mToastList.erase(it);
+ redrawToasts();
+ // find next toast with matching id
+ it = find(mToastList.begin(), mToastList.end(), id);
+ }
- // Call find() once more, because the mStoredToastList could have been changed
- // in mRejectToastSignal callback and the iterator could have become invalid.
it = find(mStoredToastList.begin(), mStoredToastList.end(), id);
if (it != mStoredToastList.end())
{
+ deleteToast(it->getToast());
mStoredToastList.erase(it);
}
-
}
+
void LLScreenChannel::killMatchedToasts(const Matcher& matcher)
{
std::list<const LLToast*> to_delete = findToasts(matcher);
@@ -521,11 +538,11 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)
LLToast* toast = it->getToast();
if (toast)
{
- LLPanel* old_panel = toast->getPanel();
- toast->removeChild(old_panel);
- delete old_panel;
- toast->insertPanel(panel);
- toast->startTimer();
+ LLPanel* old_panel = toast->getPanel();
+ toast->removeChild(old_panel);
+ delete old_panel;
+ toast->insertPanel(panel);
+ toast->startTimer();
}
redrawToasts();
}
@@ -571,9 +588,13 @@ void LLScreenChannel::showToastsBottom()
LLDockableFloater* floater = dynamic_cast<LLDockableFloater*>(LLDockableFloater::getInstanceHandle().get());
- for(it = mToastList.rbegin(); it != mToastList.rend(); ++it)
+ // Use a local variable instead of mToastList.
+ // mToastList can be modified during recursive calls and then all iteratos will be invalidated.
+ std::vector<ToastElem> vToastList( mToastList );
+
+ for(it = vToastList.rbegin(); it != vToastList.rend(); ++it)
{
- if(it != mToastList.rbegin())
+ if(it != vToastList.rbegin())
{
LLToast* toast = (it-1)->getToast();
if (!toast)
@@ -601,7 +622,7 @@ void LLScreenChannel::showToastsBottom()
if(floater && floater->overlapsScreenChannel())
{
- if(it == mToastList.rbegin())
+ if(it == vToastList.rbegin())
{
// move first toast above docked floater
S32 shift = floater->getRect().getHeight();
@@ -624,7 +645,7 @@ void LLScreenChannel::showToastsBottom()
if(!stop_showing_toasts)
{
- if( it != mToastList.rend()-1)
+ if( it != vToastList.rend()-1)
{
S32 toast_top = toast->getRect().mTop + gSavedSettings.getS32("ToastGap");
stop_showing_toasts = toast_top > getRect().mTop;
@@ -632,7 +653,8 @@ void LLScreenChannel::showToastsBottom()
}
// at least one toast should be visible
- if(it == mToastList.rbegin())
+
+ if(it == vToastList.rbegin())
{
stop_showing_toasts = false;
}
@@ -655,10 +677,11 @@ void LLScreenChannel::showToastsBottom()
}
// Dismiss toasts we don't have space for (STORM-391).
- if(it != mToastList.rend())
+ if(it != vToastList.rend())
{
mHiddenToastsNum = 0;
- for(; it != mToastList.rend(); it++)
+
+ for(; it != vToastList.rend(); it++)
{
LLToast* toast = it->getToast();
if (toast)
@@ -679,7 +702,7 @@ void LLScreenChannel::showToastsCentre()
return;
}
- LLRect toast_rect;
+ LLRect toast_rect;
S32 bottom = (getRect().mTop - getRect().mBottom)/2 + toast->getRect().getHeight()/2;
std::vector<ToastElem>::reverse_iterator it;
@@ -714,9 +737,13 @@ void LLScreenChannel::showToastsTop()
LLDockableFloater* floater = dynamic_cast<LLDockableFloater*>(LLDockableFloater::getInstanceHandle().get());
- for(it = mToastList.rbegin(); it != mToastList.rend(); ++it)
+ // Use a local variable instead of mToastList.
+ // mToastList can be modified during recursive calls and then all iteratos will be invalidated.
+ std::vector<ToastElem> vToastList( mToastList );
+
+ for(it = vToastList.rbegin(); it != vToastList.rend(); ++it)
{
- if(it != mToastList.rbegin())
+ if(it != vToastList.rbegin())
{
LLToast* toast = (it-1)->getToast();
if (!toast)
@@ -744,7 +771,7 @@ void LLScreenChannel::showToastsTop()
if(floater && floater->overlapsScreenChannel())
{
- if(it == mToastList.rbegin())
+ if(it == vToastList.rbegin())
{
// move first toast above docked floater
S32 shift = -floater->getRect().getHeight();
@@ -767,7 +794,7 @@ void LLScreenChannel::showToastsTop()
if(!stop_showing_toasts)
{
- if( it != mToastList.rend()-1)
+ if( it != vToastList.rend()-1)
{
S32 toast_bottom = toast->getRect().mBottom - gSavedSettings.getS32("ToastGap");
stop_showing_toasts = toast_bottom < channel_rect.mBottom;
@@ -775,7 +802,7 @@ void LLScreenChannel::showToastsTop()
}
// at least one toast should be visible
- if(it == mToastList.rbegin())
+ if(it == vToastList.rbegin())
{
stop_showing_toasts = false;
}
@@ -799,10 +826,12 @@ void LLScreenChannel::showToastsTop()
// Dismiss toasts we don't have space for (STORM-391).
std::vector<LLToast*> toasts_to_hide;
- if(it != mToastList.rend())
+
+ if(it != vToastList.rend())
{
mHiddenToastsNum = 0;
- for(; it != mToastList.rend(); it++)
+
+ for(; it != vToastList.rend(); it++)
{
LLToast* toast = it->getToast();
if (toast)
diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h
index 56a9cf8b4b..e5f4807ab7 100644
--- a/indra/newview/llscreenchannel.h
+++ b/indra/newview/llscreenchannel.h
@@ -84,6 +84,7 @@ public:
// kill or modify a toast by its ID
virtual void killToastByNotificationID(LLUUID id) {};
virtual void modifyToastNotificationByID(LLUUID id, LLSD data) {};
+ virtual void removeToastByNotificationID(LLUUID id){};
// hide all toasts from screen, but not remove them from a channel
virtual void hideToastsFromScreen() {};
@@ -175,6 +176,7 @@ public:
void addToast(const LLToast::Params& p);
// kill or modify a toast by its ID
void killToastByNotificationID(LLUUID id);
+ void removeToastByNotificationID(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
@@ -195,8 +197,6 @@ public:
void loadStoredToastsToChannel();
// finds a toast among stored by its Notification ID and throws it on a screen to a channel
void loadStoredToastByNotificationIDToChannel(LLUUID id);
- // removes a toast from stored finding it by its Notification ID
- void removeStoredToastByNotificationID(LLUUID id);
// removes from channel all toasts that belongs to the certain IM session
void removeToastsBySessionID(LLUUID id);
// remove all storable toasts from screen and store them
@@ -227,16 +227,12 @@ public:
// Channel's signals
// signal on storing of faded toasts event
- typedef boost::function<void (LLPanel* info_panel, const LLUUID id)> store_tost_callback_t;
- typedef boost::signals2::signal<void (LLPanel* info_panel, const LLUUID id)> store_tost_signal_t;
- store_tost_signal_t mOnStoreToast;
- boost::signals2::connection setOnStoreToastCallback(store_tost_callback_t cb) { return mOnStoreToast.connect(cb); }
- // 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); }
+ typedef boost::signals2::signal<void (LLPanel* info_panel, const LLUUID id)> store_toast_signal_t;
+ boost::signals2::connection addOnStoreToastCallback(store_toast_signal_t::slot_type cb) { return mOnStoreToast.connect(cb); }
private:
+ store_toast_signal_t mOnStoreToast;
+
class ToastElem
{
public:
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index 6f98be1cb8..0e0da6bdc7 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -41,7 +41,7 @@
#include "lltoastscripttextbox.h"
#include "lltrans.h"
#include "llviewerwindow.h"
-#include "llimfloater.h"
+#include "llfloaterimsession.h"
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -95,7 +95,12 @@ bool LLScriptFloater::toggle(const LLUUID& notification_id)
show(notification_id);
}
- LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(notification_id, true);
+ LLChicletPanel * chiclet_panelp = LLChicletBar::getInstance()->getChicletPanel();
+ if (NULL != chiclet_panelp)
+ {
+ chiclet_panelp->setChicletToggleState(notification_id, true);
+ }
+
return true;
}
@@ -206,10 +211,14 @@ void LLScriptFloater::setVisible(BOOL visible)
if(!visible)
{
- LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());
- if(chiclet)
+ LLChicletPanel * chiclet_panelp = LLChicletBar::getInstance()->getChicletPanel();
+ if (NULL != chiclet_panelp)
{
- chiclet->setToggleState(false);
+ LLIMChiclet * chicletp = chiclet_panelp->findChiclet<LLIMChiclet>(getNotificationId());
+ if(NULL != chicletp)
+ {
+ chicletp->setToggleState(false);
+ }
}
}
}
@@ -218,15 +227,19 @@ void LLScriptFloater::onMouseDown()
{
if(getNotificationId().notNull())
{
- // Remove new message icon
- LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());
- if (chiclet == NULL)
+ LLChicletPanel * chiclet_panelp = LLChicletBar::getInstance()->getChicletPanel();
+ if (NULL != chiclet_panelp)
{
- llerror("Dock chiclet for LLScriptFloater doesn't exist", 0);
- }
- else
- {
- chiclet->setShowNewMessagesIcon(false);
+ LLIMChiclet * chicletp = chiclet_panelp->findChiclet<LLIMChiclet>(getNotificationId());
+ // Remove new message icon
+ if (NULL == chicletp)
+ {
+ llerror("Dock chiclet for LLScriptFloater doesn't exist", 0);
+ }
+ else
+ {
+ chicletp->setShowNewMessagesIcon(false);
+ }
}
}
}
@@ -262,7 +275,11 @@ void LLScriptFloater::onFocusLost()
{
if(getNotificationId().notNull())
{
- LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), false);
+ LLChicletPanel * chiclet_panelp = LLChicletBar::getInstance()->getChicletPanel();
+ if (NULL != chiclet_panelp)
+ {
+ chiclet_panelp->setChicletToggleState(getNotificationId(), false);
+ }
}
}
@@ -271,7 +288,11 @@ void LLScriptFloater::onFocusReceived()
// first focus will be received before setObjectId() call - don't toggle chiclet
if(getNotificationId().notNull())
{
- LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), true);
+ LLChicletPanel * chiclet_panelp = LLChicletBar::getInstance()->getChicletPanel();
+ if (NULL != chiclet_panelp)
+ {
+ chiclet_panelp->setChicletToggleState(getNotificationId(), true);
+ }
}
}
@@ -279,28 +300,30 @@ void LLScriptFloater::dockToChiclet(bool dock)
{
if (getDockControl() == NULL)
{
- LLChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(getNotificationId());
- if (chiclet == NULL)
- {
- llwarns << "Dock chiclet for LLScriptFloater doesn't exist" << llendl;
- return;
- }
- else
+ LLChicletPanel * chiclet_panelp = LLChicletBar::getInstance()->getChicletPanel();
+ if (NULL != chiclet_panelp)
{
- LLChicletBar::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
- }
+ LLChiclet * chicletp = chiclet_panelp->findChiclet<LLChiclet>(getNotificationId());
+ if (NULL == chicletp)
+ {
+ llwarns << "Dock chiclet for LLScriptFloater doesn't exist" << llendl;
+ return;
+ }
- // Stop saving position while we dock floater
- bool save = getSavePosition();
- setSavePosition(false);
+ chiclet_panelp->scrollToChiclet(chicletp);
- setDockControl(new LLDockControl(chiclet, this, getDockTongue(),
- LLDockControl::BOTTOM));
+ // Stop saving position while we dock floater
+ bool save = getSavePosition();
+ setSavePosition(false);
- setDocked(dock);
+ setDockControl(new LLDockControl(chicletp, this, getDockTongue(),
+ LLDockControl::BOTTOM));
- // Restore saving
- setSavePosition(save);
+ setDocked(dock);
+
+ // Restore saving
+ setSavePosition(save);
+ }
}
}
@@ -347,11 +370,15 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
script_notification_map_t::const_iterator it = findUsingObjectId(object_id);
if(it != mNotifications.end())
{
- LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(it->first);
- if(chiclet)
+ LLChicletPanel * chiclet_panelp = LLChicletBar::getInstance()->getChicletPanel();
+ if (NULL != chiclet_panelp)
{
- // Pass the new_message icon state further.
- set_new_message = chiclet->getShowNewMessagesIcon();
+ LLIMChiclet * chicletp = chiclet_panelp->findChiclet<LLIMChiclet>(it->first);
+ if(NULL != chicletp)
+ {
+ // Pass the new_message icon state further.
+ set_new_message = chicletp->getShowNewMessagesIcon();
+ }
}
LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", it->first);
@@ -367,14 +394,18 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
mNotifications.insert(std::make_pair(notification_id, object_id));
- // Create inventory offer chiclet for offer type notifications
- if( OBJ_GIVE_INVENTORY == obj_type )
+ LLChicletPanel * chiclet_panelp = LLChicletBar::getInstance()->getChicletPanel();
+ if (NULL != chiclet_panelp)
{
- LLChicletBar::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(notification_id);
- }
- else
- {
- LLChicletBar::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(notification_id);
+ // Create inventory offer chiclet for offer type notifications
+ if( OBJ_GIVE_INVENTORY == obj_type )
+ {
+ chiclet_panelp->createChiclet<LLInvOfferChiclet>(notification_id);
+ }
+ else
+ {
+ chiclet_panelp->createChiclet<LLScriptChiclet>(notification_id);
+ }
}
LLIMWellWindow::getInstance()->addObjectRow(notification_id, set_new_message);
@@ -410,7 +441,11 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
// remove related chiclet
if (LLChicletBar::instanceExists())
{
- LLChicletBar::getInstance()->getChicletPanel()->removeChiclet(notification_id);
+ LLChicletPanel * chiclet_panelp = LLChicletBar::getInstance()->getChicletPanel();
+ if (NULL != chiclet_panelp)
+ {
+ chiclet_panelp->removeChiclet(notification_id);
+ }
}
LLIMWellWindow* im_well_window = LLIMWellWindow::findInstance();
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index c3c37141ed..343316d30a 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -211,7 +211,6 @@ LLSelectMgr::LLSelectMgr()
mGridMode = GRID_MODE_WORLD;
gSavedSettings.setS32("GridMode", (S32)GRID_MODE_WORLD);
- mGridValid = FALSE;
mSelectedObjects = new LLObjectSelection();
mHoverObjects = new LLObjectSelection();
@@ -1170,7 +1169,6 @@ void LLSelectMgr::setGridMode(EGridMode mode)
mGridMode = mode;
gSavedSettings.setS32("GridMode", mode);
updateSelectionCenter();
- mGridValid = FALSE;
}
void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &scale)
@@ -1271,7 +1269,6 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &
origin = mGridOrigin;
rotation = mGridRotation;
scale = mGridScale;
- mGridValid = TRUE;
}
//-----------------------------------------------------------------------------
@@ -2941,116 +2938,148 @@ BOOL LLSelectMgr::selectGetRootsCopy()
return TRUE;
}
-//-----------------------------------------------------------------------------
-// selectGetCreator()
-// Creator information only applies to root objects.
-//-----------------------------------------------------------------------------
-BOOL LLSelectMgr::selectGetCreator(LLUUID& result_id, std::string& name)
+struct LLSelectGetFirstTest
{
- BOOL identical = TRUE;
- BOOL first = TRUE;
- LLUUID first_id;
- for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin();
- iter != getSelection()->root_object_end(); iter++ )
+ LLSelectGetFirstTest() : mIdentical(true), mFirst(true) { }
+ virtual ~LLSelectGetFirstTest() { }
+
+ // returns false to break out of the iteration.
+ bool checkMatchingNode(LLSelectNode* node)
{
- LLSelectNode* node = *iter;
- if (!node->mValid)
+ if (!node || !node->mValid)
{
- return FALSE;
+ return false;
}
- if (first)
+ if (mFirst)
{
- first_id = node->mPermissions->getCreator();
- first = FALSE;
+ mFirstValue = getValueFromNode(node);
+ mFirst = false;
}
else
{
- if ( !(first_id == node->mPermissions->getCreator() ) )
+ if ( mFirstValue != getValueFromNode(node) )
+ {
+ mIdentical = false;
+ // stop testing once we know not all selected are identical.
+ return false;
+ }
+ }
+ // continue testing.
+ return true;
+ }
+
+ bool mIdentical;
+ LLUUID mFirstValue;
+
+protected:
+ virtual const LLUUID& getValueFromNode(LLSelectNode* node) = 0;
+
+private:
+ bool mFirst;
+};
+
+void LLSelectMgr::getFirst(LLSelectGetFirstTest* test)
+{
+ if (gSavedSettings.getBOOL("EditLinkedParts"))
+ {
+ for (LLObjectSelection::valid_iterator iter = getSelection()->valid_begin();
+ iter != getSelection()->valid_end(); ++iter )
+ {
+ if (!test->checkMatchingNode(*iter))
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin();
+ iter != getSelection()->root_object_end(); ++iter )
+ {
+ if (!test->checkMatchingNode(*iter))
{
- identical = FALSE;
break;
}
}
}
- if (first_id.isNull())
+}
+
+//-----------------------------------------------------------------------------
+// selectGetCreator()
+// Creator information only applies to roots unless editing linked parts.
+//-----------------------------------------------------------------------------
+struct LLSelectGetFirstCreator : public LLSelectGetFirstTest
+{
+protected:
+ virtual const LLUUID& getValueFromNode(LLSelectNode* node)
+ {
+ return node->mPermissions->getCreator();
+ }
+};
+
+BOOL LLSelectMgr::selectGetCreator(LLUUID& result_id, std::string& name)
+{
+ LLSelectGetFirstCreator test;
+ getFirst(&test);
+
+ if (test.mFirstValue.isNull())
{
name = LLTrans::getString("AvatarNameNobody");
return FALSE;
}
- result_id = first_id;
+ result_id = test.mFirstValue;
- if (identical)
+ if (test.mIdentical)
{
- name = LLSLURL("agent", first_id, "inspect").getSLURLString();
+ name = LLSLURL("agent", test.mFirstValue, "inspect").getSLURLString();
}
else
{
name = LLTrans::getString("AvatarNameMultiple");
}
- return identical;
+ return test.mIdentical;
}
-
//-----------------------------------------------------------------------------
// selectGetOwner()
-// Owner information only applies to roots.
+// Owner information only applies to roots unless editing linked parts.
//-----------------------------------------------------------------------------
-BOOL LLSelectMgr::selectGetOwner(LLUUID& result_id, std::string& name)
+struct LLSelectGetFirstOwner : public LLSelectGetFirstTest
{
- BOOL identical = TRUE;
- BOOL first = TRUE;
- BOOL first_group_owned = FALSE;
- LLUUID first_id;
- for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin();
- iter != getSelection()->root_object_end(); iter++ )
+protected:
+ virtual const LLUUID& getValueFromNode(LLSelectNode* node)
{
- LLSelectNode* node = *iter;
- if (!node->mValid)
- {
- return FALSE;
- }
-
- if (first)
- {
- node->mPermissions->getOwnership(first_id, first_group_owned);
- first = FALSE;
- }
- else
- {
- LLUUID owner_id;
- BOOL is_group_owned = FALSE;
- if (!(node->mPermissions->getOwnership(owner_id, is_group_owned))
- || owner_id != first_id || is_group_owned != first_group_owned)
- {
- identical = FALSE;
- break;
- }
- }
+ // Don't use 'getOwnership' since we return a reference, not a copy.
+ // Will return LLUUID::null if unowned (which is not allowed and should never happen.)
+ return node->mPermissions->isGroupOwned() ? node->mPermissions->getGroup() : node->mPermissions->getOwner();
}
- if (first_id.isNull())
+};
+
+BOOL LLSelectMgr::selectGetOwner(LLUUID& result_id, std::string& name)
+{
+ LLSelectGetFirstOwner test;
+ getFirst(&test);
+
+ if (test.mFirstValue.isNull())
{
return FALSE;
}
- result_id = first_id;
+ result_id = test.mFirstValue;
- if (identical)
+ if (test.mIdentical)
{
- BOOL public_owner = (first_id.isNull() && !first_group_owned);
- if (first_group_owned)
- {
- name = LLSLURL("group", first_id, "inspect").getSLURLString();
- }
- else if(!public_owner)
+ bool group_owned = selectIsGroupOwned();
+ if (group_owned)
{
- name = LLSLURL("agent", first_id, "inspect").getSLURLString();
+ name = LLSLURL("group", test.mFirstValue, "inspect").getSLURLString();
}
else
{
- name = LLTrans::getString("AvatarNameNobody");
+ name = LLSLURL("agent", test.mFirstValue, "inspect").getSLURLString();
}
}
else
@@ -3058,131 +3087,92 @@ BOOL LLSelectMgr::selectGetOwner(LLUUID& result_id, std::string& name)
name = LLTrans::getString("AvatarNameMultiple");
}
- return identical;
+ return test.mIdentical;
}
-
//-----------------------------------------------------------------------------
// selectGetLastOwner()
-// Owner information only applies to roots.
+// Owner information only applies to roots unless editing linked parts.
//-----------------------------------------------------------------------------
-BOOL LLSelectMgr::selectGetLastOwner(LLUUID& result_id, std::string& name)
+struct LLSelectGetFirstLastOwner : public LLSelectGetFirstTest
{
- BOOL identical = TRUE;
- BOOL first = TRUE;
- LLUUID first_id;
- for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin();
- iter != getSelection()->root_object_end(); iter++ )
+protected:
+ virtual const LLUUID& getValueFromNode(LLSelectNode* node)
{
- LLSelectNode* node = *iter;
- if (!node->mValid)
- {
- return FALSE;
- }
-
- if (first)
- {
- first_id = node->mPermissions->getLastOwner();
- first = FALSE;
- }
- else
- {
- if ( !(first_id == node->mPermissions->getLastOwner() ) )
- {
- identical = FALSE;
- break;
- }
- }
+ return node->mPermissions->getLastOwner();
}
- if (first_id.isNull())
+};
+
+BOOL LLSelectMgr::selectGetLastOwner(LLUUID& result_id, std::string& name)
+{
+ LLSelectGetFirstLastOwner test;
+ getFirst(&test);
+
+ if (test.mFirstValue.isNull())
{
return FALSE;
}
- result_id = first_id;
+ result_id = test.mFirstValue;
- if (identical)
+ if (test.mIdentical)
{
- BOOL public_owner = (first_id.isNull());
- if(!public_owner)
- {
- name = LLSLURL("agent", first_id, "inspect").getSLURLString();
- }
- else
- {
- name.assign("Public or Group");
- }
+ name = LLSLURL("agent", test.mFirstValue, "inspect").getSLURLString();
}
else
{
name.assign( "" );
}
- return identical;
+ return test.mIdentical;
}
-
//-----------------------------------------------------------------------------
// selectGetGroup()
-// Group information only applies to roots.
+// Group information only applies to roots unless editing linked parts.
//-----------------------------------------------------------------------------
-BOOL LLSelectMgr::selectGetGroup(LLUUID& result_id)
+struct LLSelectGetFirstGroup : public LLSelectGetFirstTest
{
- BOOL identical = TRUE;
- BOOL first = TRUE;
- LLUUID first_id;
- for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin();
- iter != getSelection()->root_object_end(); iter++ )
+protected:
+ virtual const LLUUID& getValueFromNode(LLSelectNode* node)
{
- LLSelectNode* node = *iter;
- if (!node->mValid)
- {
- return FALSE;
- }
-
- if (first)
- {
- first_id = node->mPermissions->getGroup();
- first = FALSE;
- }
- else
- {
- if ( !(first_id == node->mPermissions->getGroup() ) )
- {
- identical = FALSE;
- break;
- }
- }
+ return node->mPermissions->getGroup();
}
+};
- result_id = first_id;
+BOOL LLSelectMgr::selectGetGroup(LLUUID& result_id)
+{
+ LLSelectGetFirstGroup test;
+ getFirst(&test);
- return identical;
+ result_id = test.mFirstValue;
+ return test.mIdentical;
}
//-----------------------------------------------------------------------------
// selectIsGroupOwned()
-// Only operates on root nodes.
-// Returns TRUE if all have valid data and they are all group owned.
+// Only operates on root nodes unless editing linked parts.
+// Returns TRUE if the first selected is group owned.
//-----------------------------------------------------------------------------
-BOOL LLSelectMgr::selectIsGroupOwned()
+struct LLSelectGetFirstGroupOwner : public LLSelectGetFirstTest
{
- BOOL found_one = FALSE;
- for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin();
- iter != getSelection()->root_object_end(); iter++ )
+protected:
+ virtual const LLUUID& getValueFromNode(LLSelectNode* node)
{
- LLSelectNode* node = *iter;
- if (!node->mValid)
+ if (node->mPermissions->isGroupOwned())
{
- return FALSE;
+ return node->mPermissions->getGroup();
}
- found_one = TRUE;
- if (!node->mPermissions->isGroupOwned())
- {
- return FALSE;
- }
- }
- return found_one ? TRUE : FALSE;
+ return LLUUID::null;
+ }
+};
+
+BOOL LLSelectMgr::selectIsGroupOwned()
+{
+ LLSelectGetFirstGroupOwner test;
+ getFirst(&test);
+
+ return test.mFirstValue.notNull() ? TRUE : FALSE;
}
//-----------------------------------------------------------------------------
@@ -4987,7 +4977,11 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data
} func(id);
LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode(&func);
- if (node)
+ if (!node)
+ {
+ llwarns << "Couldn't find object " << id << " selected." << llendl;
+ }
+ else
{
if (node->mInventorySerial != inv_serial)
{
@@ -5058,13 +5052,6 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data
dialog_refresh_all();
- // silly hack to allow 'save into inventory'
- if(gPopupMenuView->getVisible())
- {
- gPopupMenuView->setItemEnabled(SAVE_INTO_INVENTORY,
- enable_save_into_inventory(NULL));
- }
-
// hack for left-click buy object
LLToolPie::selectionPropertiesReceived();
}
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index ecbb20df1b..cc78e35869 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -343,6 +343,9 @@ typedef LLSafeHandle<LLObjectSelection> LLObjectSelectionHandle;
extern template class LLSelectMgr* LLSingleton<class LLSelectMgr>::getInstance();
#endif
+// For use with getFirstTest()
+struct LLSelectGetFirstTest;
+
class LLSelectMgr : public LLEditMenuHandler, public LLSingleton<LLSelectMgr>
{
public:
@@ -745,6 +748,9 @@ private:
static void packGodlikeHead(void* user_data);
static bool confirmDelete(const LLSD& notification, const LLSD& response, LLObjectSelectionHandle handle);
+ // Get the first ID that matches test and whether or not all ids are identical in selected objects.
+ void getFirst(LLSelectGetFirstTest* test);
+
public:
// Observer/callback support for when object selection changes or
// properties are received/updated
@@ -763,8 +769,6 @@ private:
LLVector3 mGridOrigin;
LLVector3 mGridScale;
EGridMode mGridMode;
- BOOL mGridValid;
-
BOOL mTEMode; // render te
LLVector3d mSelectionCenterGlobal;
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 853656905c..adb97ac800 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -38,7 +38,7 @@
#include "llfiltereditor.h"
#include "llfloaterreg.h"
#include "llfloaterworldmap.h"
-#include "llfoldervieweventlistener.h"
+#include "llfolderviewmodel.h"
#include "lloutfitobserver.h"
#include "llpaneleditwearable.h"
#include "llpaneloutfitsinventory.h"
@@ -267,11 +267,11 @@ void LLSidepanelAppearance::onOpenOutfitButtonClicked()
if (inventory_panel)
{
LLFolderView* root = inventory_panel->getRootFolder();
- LLFolderViewItem *outfit_folder = root->getItemByID(outfit_link->getLinkedUUID());
+ LLFolderViewItem *outfit_folder = inventory_panel->getItemByID(outfit_link->getLinkedUUID());
if (outfit_folder)
{
outfit_folder->setOpen(!outfit_folder->isOpen());
- root->setSelectionFromRoot(outfit_folder,TRUE);
+ root->setSelection(outfit_folder,TRUE);
root->scrollToShowSelection();
}
}
@@ -456,10 +456,10 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name)
void LLSidepanelAppearance::editWearable(LLWearable *wearable, LLView *data, BOOL disable_camera_switch)
{
LLFloaterSidePanelContainer::showPanel("appearance", LLSD());
-
LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(data);
if (panel)
{
+ panel->showOutfitsInventoryPanel();
panel->showWearableEditPanel(wearable, disable_camera_switch);
}
}
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index 4f9ab318a5..8915bb2fef 100644
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -36,6 +36,7 @@
#include "llfirstuse.h"
#include "llfloatersidepanelcontainer.h"
#include "llfoldertype.h"
+#include "llfolderview.h"
#include "llhttpclient.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
@@ -259,9 +260,8 @@ void LLSidepanelInventory::updateInbox()
//
const bool do_not_create_folder = false;
- const bool do_not_find_in_library = false;
- const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, do_not_create_folder, do_not_find_in_library);
+ const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, do_not_create_folder);
// Set up observer to listen for creation of inbox if at least one of them doesn't exist
if (inbox_id.isNull())
@@ -383,10 +383,10 @@ void LLSidepanelInventory::onToggleInboxBtn()
{
inboxPanel->setTargetDim(gSavedPerAccountSettings.getS32("InventoryInboxHeight"));
if (inboxPanel->isInVisibleChain())
- {
- gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
- }
+ {
+ gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
}
+}
else
{
gSavedPerAccountSettings.setS32("InventoryInboxHeight", inboxPanel->getTargetDim());
@@ -448,7 +448,7 @@ void LLSidepanelInventory::onInfoButtonClicked()
void LLSidepanelInventory::onShareButtonClicked()
{
- LLAvatarActions::shareWithAvatars();
+ LLAvatarActions::shareWithAvatars(this);
}
void LLSidepanelInventory::onShopButtonClicked()
@@ -472,7 +472,7 @@ void LLSidepanelInventory::performActionOnSelection(const std::string &action)
}
}
- current_item->getListener()->performAction(mPanelMainInventory->getActivePanel()->getModel(), action);
+ static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->performAction(mPanelMainInventory->getActivePanel()->getModel(), action);
}
void LLSidepanelInventory::onWearButtonClicked()
@@ -662,7 +662,7 @@ LLInventoryItem *LLSidepanelInventory::getSelectedItem()
return NULL;
}
}
- const LLUUID &item_id = current_item->getListener()->getUUID();
+ const LLUUID &item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
LLInventoryItem *item = gInventory.getItem(item_id);
return item;
}
@@ -671,7 +671,7 @@ U32 LLSidepanelInventory::getSelectedCount()
{
int count = 0;
- std::set<LLUUID> selection_list = mPanelMainInventory->getActivePanel()->getRootFolder()->getSelectionList();
+ std::set<LLFolderViewItem*> selection_list = mPanelMainInventory->getActivePanel()->getRootFolder()->getSelectionList();
count += selection_list.size();
if ((count == 0) && mInboxEnabled && (mInventoryPanelInbox != NULL))
@@ -722,9 +722,9 @@ void LLSidepanelInventory::clearSelections(bool clearMain, bool clearInbox)
updateVerbs();
}
-std::set<LLUUID> LLSidepanelInventory::getInboxSelectionList()
+std::set<LLFolderViewItem*> LLSidepanelInventory::getInboxSelectionList()
{
- std::set<LLUUID> inventory_selected_uuids;
+ std::set<LLFolderViewItem*> inventory_selected_uuids;
if (mInboxEnabled && (mInventoryPanelInbox != NULL))
{
diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h
index a33607f50d..e8b2808d4f 100644
--- a/indra/newview/llsidepanelinventory.h
+++ b/indra/newview/llsidepanelinventory.h
@@ -63,7 +63,7 @@ public:
BOOL isMainInventoryPanelActive() const;
void clearSelections(bool clearMain, bool clearInbox);
- std::set<LLUUID> getInboxSelectionList();
+ std::set<LLFolderViewItem*> getInboxSelectionList();
void showItemInfoPanel();
void showTaskInfoPanel();
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
index c351b1a128..5532bdc71a 100644
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -101,6 +101,8 @@ BOOL LLSidepanelTaskInfo::postBuild()
mDetailsBtn = getChild<LLButton>("details_btn");
mDetailsBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onDetailsButtonClicked, this));
+ mDeedBtn = getChild<LLButton>("button deed");
+
mLabelGroupName = getChild<LLNameBox>("Group Name Proxy");
childSetCommitCallback("Object Name", LLSidepanelTaskInfo::onCommitName,this);
@@ -263,7 +265,7 @@ void LLSidepanelTaskInfo::disableAll()
void LLSidepanelTaskInfo::refresh()
{
- LLButton* btn_deed_to_group = getChild<LLButton>("button deed");
+ LLButton* btn_deed_to_group = mDeedBtn;
if (btn_deed_to_group)
{
std::string deedText;
diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h
index 124229af06..05edcda5ed 100644
--- a/indra/newview/llsidepaneltaskinfo.h
+++ b/indra/newview/llsidepaneltaskinfo.h
@@ -113,6 +113,7 @@ private:
LLButton* mPayBtn;
LLButton* mBuyBtn;
LLButton* mDetailsBtn;
+ LLButton* mDeedBtn;
protected:
LLViewerObject* getObject();
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 06c87e57fc..3ed6e24498 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -55,7 +55,7 @@
#include "llviewershadermgr.h"
static LLFastTimer::DeclareTimer FTM_FRUSTUM_CULL("Frustum Culling");
-static LLFastTimer::DeclareTimer FTM_CULL_REBOUND("Cull Rebound");
+static LLFastTimer::DeclareTimer FTM_CULL_REBOUND("Cull Rebound Partition");
const F32 SG_OCCLUSION_FUDGE = 0.25f;
#define SG_DISCARD_TOLERANCE 0.01f
@@ -376,7 +376,6 @@ LLSpatialGroup::~LLSpatialGroup()
}
}
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
clearDrawMap();
clearAtlasList() ;
}
@@ -615,8 +614,6 @@ void LLSpatialGroup::validateDrawMap()
BOOL LLSpatialGroup::updateInGroup(LLDrawable *drawablep, BOOL immediate)
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-
drawablep->updateSpatialExtents();
OctreeNode* parent = mOctreeNode->getOctParent();
@@ -638,7 +635,6 @@ BOOL LLSpatialGroup::updateInGroup(LLDrawable *drawablep, BOOL immediate)
BOOL LLSpatialGroup::addObject(LLDrawable *drawablep, BOOL add_all, BOOL from_octree)
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
if (!from_octree)
{
mOctreeNode->insert(drawablep);
@@ -664,7 +660,6 @@ BOOL LLSpatialGroup::addObject(LLDrawable *drawablep, BOOL add_all, BOOL from_oc
void LLSpatialGroup::rebuildGeom()
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
if (!isDead())
{
mSpatialPartition->rebuildGeom(this);
@@ -876,7 +871,6 @@ LLSpatialGroup* LLSpatialGroup::getParent()
BOOL LLSpatialGroup::removeObject(LLDrawable *drawablep, BOOL from_octree)
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
unbound();
if (mOctreeNode && !from_octree)
{
@@ -913,7 +907,6 @@ BOOL LLSpatialGroup::removeObject(LLDrawable *drawablep, BOOL from_octree)
void LLSpatialGroup::shift(const LLVector4a &offset)
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
LLVector4a t = mOctreeNode->getCenter();
t.add(offset);
mOctreeNode->setCenter(t);
@@ -968,8 +961,6 @@ void LLSpatialGroup::setState(U32 state)
void LLSpatialGroup::setState(U32 state, S32 mode)
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-
llassert(state <= LLSpatialGroup::STATE_MASK);
if (mode > STATE_MODE_SINGLE)
@@ -1026,8 +1017,6 @@ void LLSpatialGroup::clearState(U32 state, S32 mode)
{
llassert(state <= LLSpatialGroup::STATE_MASK);
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-
if (mode > STATE_MODE_SINGLE)
{
if (mode == STATE_MODE_DIFF)
@@ -1084,8 +1073,6 @@ public:
void LLSpatialGroup::setOcclusionState(U32 state, S32 mode)
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-
if (mode > STATE_MODE_SINGLE)
{
if (mode == STATE_MODE_DIFF)
@@ -1150,8 +1137,6 @@ public:
void LLSpatialGroup::clearOcclusionState(U32 state, S32 mode)
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-
if (mode > STATE_MODE_SINGLE)
{
if (mode == STATE_MODE_DIFF)
@@ -1203,7 +1188,6 @@ LLSpatialGroup::LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part) :
ll_assert_aligned(this,16);
sNodeCount++;
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
mViewAngle.splat(0.f);
mLastUpdateViewAngle.splat(-1.f);
@@ -1389,7 +1373,6 @@ BOOL LLSpatialGroup::changeLOD()
void LLSpatialGroup::handleInsertion(const TreeNode* node, LLDrawable* drawablep)
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
addObject(drawablep, FALSE, TRUE);
unbound();
setState(OBJECT_DIRTY);
@@ -1397,14 +1380,12 @@ void LLSpatialGroup::handleInsertion(const TreeNode* node, LLDrawable* drawablep
void LLSpatialGroup::handleRemoval(const TreeNode* node, LLDrawable* drawable)
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
removeObject(drawable, TRUE);
setState(OBJECT_DIRTY);
}
void LLSpatialGroup::handleDestruction(const TreeNode* node)
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
setState(DEAD);
for (element_iter i = getDataBegin(); i != getDataEnd(); ++i)
@@ -1446,7 +1427,6 @@ void LLSpatialGroup::handleStateChange(const TreeNode* node)
void LLSpatialGroup::handleChildAddition(const OctreeNode* parent, OctreeNode* child)
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
if (child->getListenerCount() == 0)
{
new LLSpatialGroup(child, mSpatialPartition);
@@ -1792,7 +1772,6 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)
LLSpatialPartition::LLSpatialPartition(U32 data_mask, BOOL render_by_group, U32 buffer_usage)
: mRenderByGroup(render_by_group), mBridge(NULL)
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
mOcclusionEnabled = TRUE;
mDrawableType = 0;
mPartitionType = LLViewerRegion::PARTITION_NONE;
@@ -1816,8 +1795,6 @@ LLSpatialPartition::LLSpatialPartition(U32 data_mask, BOOL render_by_group, U32
LLSpatialPartition::~LLSpatialPartition()
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-
delete mOctree;
mOctree = NULL;
}
@@ -1825,8 +1802,6 @@ LLSpatialPartition::~LLSpatialPartition()
LLSpatialGroup *LLSpatialPartition::put(LLDrawable *drawablep, BOOL was_visible)
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-
drawablep->updateSpatialExtents();
//keep drawable from being garbage collected
@@ -1848,8 +1823,6 @@ LLSpatialGroup *LLSpatialPartition::put(LLDrawable *drawablep, BOOL was_visible)
BOOL LLSpatialPartition::remove(LLDrawable *drawablep, LLSpatialGroup *curp)
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-
if (!curp->removeObject(drawablep))
{
OCT_ERRS << "Failed to remove drawable from octree!" << llendl;
@@ -1859,6 +1832,8 @@ BOOL LLSpatialPartition::remove(LLDrawable *drawablep, LLSpatialGroup *curp)
drawablep->setSpatialGroup(NULL);
}
+ drawablep->setSpatialGroup(NULL);
+
assert_octree_valid(mOctree);
return TRUE;
@@ -1866,8 +1841,6 @@ BOOL LLSpatialPartition::remove(LLDrawable *drawablep, LLSpatialGroup *curp)
void LLSpatialPartition::move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL immediate)
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-
// sanity check submitted by open source user bushing Spatula
// who was seeing crashing here. (See VWR-424 reported by Bunny Mayne)
if (!drawablep)
@@ -1924,7 +1897,6 @@ public:
void LLSpatialPartition::shift(const LLVector4a &offset)
{ //shift octree node bounding boxes by offset
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
LLSpatialShift shifter(offset);
shifter.traverse(mOctree);
}
@@ -2338,7 +2310,6 @@ public:
void LLSpatialPartition::restoreGL()
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
}
void LLSpatialPartition::resetVertexBuffers()
@@ -2381,7 +2352,6 @@ BOOL LLSpatialPartition::visibleObjectsInFrustum(LLCamera& camera)
S32 LLSpatialPartition::cull(LLCamera &camera, std::vector<LLDrawable *>* results, BOOL for_select)
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
#if LL_OCTREE_PARANOIA_CHECK
((LLSpatialGroup*)mOctree->getListener(0))->checkStates();
#endif
@@ -2776,7 +2746,7 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)
void renderCrossHairs(LLVector3 position, F32 size, LLColor4 color)
{
- gGL.diffuseColor4fv(color.mV);
+ gGL.color4fv(color.mV);
gGL.begin(LLRender::LINES);
{
gGL.vertex3fv((position - LLVector3(size, 0.f, 0.f)).mV);
@@ -4027,7 +3997,7 @@ void renderAgentTarget(LLVOAvatar* avatar)
if (avatar->isSelf())
{
renderCrossHairs(avatar->getPositionAgent(), 0.2f, LLColor4(1, 0, 0, 0.8f));
- renderCrossHairs(avatar->mDrawable->getPositionAgent(), 0.2f, LLColor4(1, 0, 0, 0.8f));
+ renderCrossHairs(avatar->mDrawable->getPositionAgent(), 0.2f, LLColor4(0, 1, 0, 0.8f));
renderCrossHairs(avatar->mRoot.getWorldPosition(), 0.2f, LLColor4(1, 1, 1, 0.8f));
renderCrossHairs(avatar->mPelvisp->getWorldPosition(), 0.2f, LLColor4(0, 0, 1, 0.8f));
}
@@ -4194,7 +4164,7 @@ public:
{
if (index < 255)
{
- if (facep->mDrawInfo->mTextureList.size()<= index)
+ if (facep->mDrawInfo->mTextureList.size() <= index)
{
llerrs << "Face texture index out of bounds." << llendl;
}
@@ -4439,8 +4409,6 @@ void LLSpatialPartition::renderDebug()
sCurMaxTexPriority = 0.f;
}
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-
LLGLDisable cullface(GL_CULL_FACE);
LLGLEnable blend(GL_BLEND);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
@@ -4714,55 +4682,63 @@ LLCullResult::LLCullResult()
mVisibleListAllocated = 0;
mVisibleBridgeAllocated = 0;
- mVisibleGroups = NULL;
- mVisibleGroupsEnd = NULL;
- mAlphaGroups = NULL;
- mAlphaGroupsEnd = NULL;
- mOcclusionGroups = NULL;
- mOcclusionGroupsEnd = NULL;
- mDrawableGroups = NULL;
- mDrawableGroupsEnd = NULL;
- mVisibleList = NULL;
- mVisibleListEnd = NULL;
- mVisibleBridge = NULL;
- mVisibleBridgeEnd = NULL;
+ mVisibleGroups.clear();
+ mVisibleGroups.push_back(NULL);
+ mVisibleGroupsEnd = &mVisibleGroups[0];
+ mAlphaGroups.clear();
+ mAlphaGroups.push_back(NULL);
+ mAlphaGroupsEnd = &mAlphaGroups[0];
+ mOcclusionGroups.clear();
+ mOcclusionGroups.push_back(NULL);
+ mOcclusionGroupsEnd = &mOcclusionGroups[0];
+ mDrawableGroups.clear();
+ mDrawableGroups.push_back(NULL);
+ mDrawableGroupsEnd = &mDrawableGroups[0];
+ mVisibleList.clear();
+ mVisibleList.push_back(NULL);
+ mVisibleListEnd = &mVisibleList[0];
+ mVisibleBridge.clear();
+ mVisibleBridge.push_back(NULL);
+ mVisibleBridgeEnd = &mVisibleBridge[0];
for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; i++)
{
- mRenderMap[i] = NULL;
- mRenderMapEnd[i] = NULL;
+ mRenderMap[i].clear();
+ mRenderMap[i].push_back(NULL);
+ mRenderMapEnd[i] = &mRenderMap[i][0];
mRenderMapAllocated[i] = 0;
}
clear();
}
-void LLCullResult::pushBack(void**& head, U32& count, void* val)
+template <class T, class V>
+void LLCullResult::pushBack(T& head, U32& count, V* val)
{
+ head[count] = val;
+ head.push_back(NULL);
count++;
- head = (void**) realloc((void*) head, sizeof(void*) * count);
- head[count-1] = val;
}
void LLCullResult::clear()
{
mVisibleGroupsSize = 0;
- mVisibleGroupsEnd = mVisibleGroups;
+ mVisibleGroupsEnd = &mVisibleGroups[0];
mAlphaGroupsSize = 0;
- mAlphaGroupsEnd = mAlphaGroups;
+ mAlphaGroupsEnd = &mAlphaGroups[0];
mOcclusionGroupsSize = 0;
- mOcclusionGroupsEnd = mOcclusionGroups;
+ mOcclusionGroupsEnd = &mOcclusionGroups[0];
mDrawableGroupsSize = 0;
- mDrawableGroupsEnd = mDrawableGroups;
+ mDrawableGroupsEnd = &mDrawableGroups[0];
mVisibleListSize = 0;
- mVisibleListEnd = mVisibleList;
+ mVisibleListEnd = &mVisibleList[0];
mVisibleBridgeSize = 0;
- mVisibleBridgeEnd = mVisibleBridge;
+ mVisibleBridgeEnd = &mVisibleBridge[0];
for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; i++)
@@ -4772,13 +4748,13 @@ void LLCullResult::clear()
mRenderMap[i][j] = 0;
}
mRenderMapSize[i] = 0;
- mRenderMapEnd[i] = mRenderMap[i];
+ mRenderMapEnd[i] = &(mRenderMap[i][0]);
}
}
LLCullResult::sg_iterator LLCullResult::beginVisibleGroups()
{
- return mVisibleGroups;
+ return &mVisibleGroups[0];
}
LLCullResult::sg_iterator LLCullResult::endVisibleGroups()
@@ -4788,7 +4764,7 @@ LLCullResult::sg_iterator LLCullResult::endVisibleGroups()
LLCullResult::sg_iterator LLCullResult::beginAlphaGroups()
{
- return mAlphaGroups;
+ return &mAlphaGroups[0];
}
LLCullResult::sg_iterator LLCullResult::endAlphaGroups()
@@ -4798,7 +4774,7 @@ LLCullResult::sg_iterator LLCullResult::endAlphaGroups()
LLCullResult::sg_iterator LLCullResult::beginOcclusionGroups()
{
- return mOcclusionGroups;
+ return &mOcclusionGroups[0];
}
LLCullResult::sg_iterator LLCullResult::endOcclusionGroups()
@@ -4808,7 +4784,7 @@ LLCullResult::sg_iterator LLCullResult::endOcclusionGroups()
LLCullResult::sg_iterator LLCullResult::beginDrawableGroups()
{
- return mDrawableGroups;
+ return &mDrawableGroups[0];
}
LLCullResult::sg_iterator LLCullResult::endDrawableGroups()
@@ -4818,7 +4794,7 @@ LLCullResult::sg_iterator LLCullResult::endDrawableGroups()
LLCullResult::drawable_iterator LLCullResult::beginVisibleList()
{
- return mVisibleList;
+ return &mVisibleList[0];
}
LLCullResult::drawable_iterator LLCullResult::endVisibleList()
@@ -4828,7 +4804,7 @@ LLCullResult::drawable_iterator LLCullResult::endVisibleList()
LLCullResult::bridge_iterator LLCullResult::beginVisibleBridge()
{
- return mVisibleBridge;
+ return &mVisibleBridge[0];
}
LLCullResult::bridge_iterator LLCullResult::endVisibleBridge()
@@ -4838,7 +4814,7 @@ LLCullResult::bridge_iterator LLCullResult::endVisibleBridge()
LLCullResult::drawinfo_iterator LLCullResult::beginRenderMap(U32 type)
{
- return mRenderMap[type];
+ return &mRenderMap[type][0];
}
LLCullResult::drawinfo_iterator LLCullResult::endRenderMap(U32 type)
@@ -4854,10 +4830,10 @@ void LLCullResult::pushVisibleGroup(LLSpatialGroup* group)
}
else
{
- pushBack((void**&) mVisibleGroups, mVisibleGroupsAllocated, (void*) group);
+ pushBack(mVisibleGroups, mVisibleGroupsAllocated, group);
}
++mVisibleGroupsSize;
- mVisibleGroupsEnd = mVisibleGroups+mVisibleGroupsSize;
+ mVisibleGroupsEnd = &mVisibleGroups[mVisibleGroupsSize];
}
void LLCullResult::pushAlphaGroup(LLSpatialGroup* group)
@@ -4868,10 +4844,10 @@ void LLCullResult::pushAlphaGroup(LLSpatialGroup* group)
}
else
{
- pushBack((void**&) mAlphaGroups, mAlphaGroupsAllocated, (void*) group);
+ pushBack(mAlphaGroups, mAlphaGroupsAllocated, group);
}
++mAlphaGroupsSize;
- mAlphaGroupsEnd = mAlphaGroups+mAlphaGroupsSize;
+ mAlphaGroupsEnd = &mAlphaGroups[mAlphaGroupsSize];
}
void LLCullResult::pushOcclusionGroup(LLSpatialGroup* group)
@@ -4882,10 +4858,10 @@ void LLCullResult::pushOcclusionGroup(LLSpatialGroup* group)
}
else
{
- pushBack((void**&) mOcclusionGroups, mOcclusionGroupsAllocated, (void*) group);
+ pushBack(mOcclusionGroups, mOcclusionGroupsAllocated, group);
}
++mOcclusionGroupsSize;
- mOcclusionGroupsEnd = mOcclusionGroups+mOcclusionGroupsSize;
+ mOcclusionGroupsEnd = &mOcclusionGroups[mOcclusionGroupsSize];
}
void LLCullResult::pushDrawableGroup(LLSpatialGroup* group)
@@ -4896,10 +4872,10 @@ void LLCullResult::pushDrawableGroup(LLSpatialGroup* group)
}
else
{
- pushBack((void**&) mDrawableGroups, mDrawableGroupsAllocated, (void*) group);
+ pushBack(mDrawableGroups, mDrawableGroupsAllocated, group);
}
++mDrawableGroupsSize;
- mDrawableGroupsEnd = mDrawableGroups+mDrawableGroupsSize;
+ mDrawableGroupsEnd = &mDrawableGroups[mDrawableGroupsSize];
}
void LLCullResult::pushDrawable(LLDrawable* drawable)
@@ -4910,10 +4886,10 @@ void LLCullResult::pushDrawable(LLDrawable* drawable)
}
else
{
- pushBack((void**&) mVisibleList, mVisibleListAllocated, (void*) drawable);
+ pushBack(mVisibleList, mVisibleListAllocated, drawable);
}
++mVisibleListSize;
- mVisibleListEnd = mVisibleList+mVisibleListSize;
+ mVisibleListEnd = &mVisibleList[mVisibleListSize];
}
void LLCullResult::pushBridge(LLSpatialBridge* bridge)
@@ -4924,10 +4900,10 @@ void LLCullResult::pushBridge(LLSpatialBridge* bridge)
}
else
{
- pushBack((void**&) mVisibleBridge, mVisibleBridgeAllocated, (void*) bridge);
+ pushBack(mVisibleBridge, mVisibleBridgeAllocated, bridge);
}
++mVisibleBridgeSize;
- mVisibleBridgeEnd = mVisibleBridge+mVisibleBridgeSize;
+ mVisibleBridgeEnd = &mVisibleBridge[mVisibleBridgeSize];
}
void LLCullResult::pushDrawInfo(U32 type, LLDrawInfo* draw_info)
@@ -4938,10 +4914,10 @@ void LLCullResult::pushDrawInfo(U32 type, LLDrawInfo* draw_info)
}
else
{
- pushBack((void**&) mRenderMap[type], mRenderMapAllocated[type], (void*) draw_info);
+ pushBack(mRenderMap[type], mRenderMapAllocated[type], draw_info);
}
++mRenderMapSize[type];
- mRenderMapEnd[type] = mRenderMap[type] + mRenderMapSize[type];
+ mRenderMapEnd[type] = &(mRenderMap[type][mRenderMapSize[type]]);
}
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index f050df2b39..b1706d9d35 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -350,6 +350,8 @@ public:
element_list& getData() { return mOctreeNode->getData(); }
element_iter getDataBegin() { return mOctreeNode->getDataBegin(); }
element_iter getDataEnd() { return mOctreeNode->getDataEnd(); }
+ bool hasElement(LLDrawable* drawablep) { return std::find(mOctreeNode->getDataBegin(), mOctreeNode->getDataEnd(), drawablep) != mOctreeNode->getDataEnd(); }
+
U32 getElementCount() const { return mOctreeNode->getElementCount(); }
bool isEmpty() const { return mOctreeNode->isEmpty(); }
@@ -567,10 +569,10 @@ class LLCullResult
public:
LLCullResult();
- typedef LLSpatialGroup** sg_list_t;
- typedef LLDrawable** drawable_list_t;
- typedef LLSpatialBridge** bridge_list_t;
- typedef LLDrawInfo** drawinfo_list_t;
+ typedef std::vector<LLSpatialGroup*> sg_list_t;
+ typedef std::vector<LLDrawable*> drawable_list_t;
+ typedef std::vector<LLSpatialBridge*> bridge_list_t;
+ typedef std::vector<LLDrawInfo*> drawinfo_list_t;
typedef LLSpatialGroup** sg_iterator;
typedef LLSpatialBridge** bridge_iterator;
@@ -620,7 +622,7 @@ public:
private:
- void pushBack(void** &head, U32& count, void* val);
+ template <class T, class V> void pushBack(T &head, U32& count, V* val);
U32 mVisibleGroupsSize;
U32 mAlphaGroupsSize;
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 07d2f1ad6f..8783d99b11 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -31,12 +31,15 @@
#include "llagent.h"
#include "llappviewer.h"
#include "llimview.h"
+#include "llgroupmgr.h"
#include "llsdutil.h"
#include "lluicolortable.h"
#include "llviewerobjectlist.h"
#include "llvoavatar.h"
#include "llworld.h"
+extern LLControlGroup gSavedSettings;
+
const LLColor4 INACTIVE_COLOR(0.3f, 0.3f, 0.3f, 0.5f);
const LLColor4 ACTIVE_COLOR(0.5f, 0.5f, 0.5f, 1.f);
@@ -84,6 +87,19 @@ bool LLSpeaker::isInVoiceChannel()
return mStatus <= LLSpeaker::STATUS_VOICE_ACTIVE || mStatus == LLSpeaker::STATUS_MUTED;
}
+LLSpeakerUpdateSpeakerEvent::LLSpeakerUpdateSpeakerEvent(LLSpeaker* source)
+: LLEvent(source, "Speaker update speaker event"),
+ mSpeakerID (source->mID)
+{
+}
+
+LLSD LLSpeakerUpdateSpeakerEvent::getValue()
+{
+ LLSD ret;
+ ret["id"] = mSpeakerID;
+ return ret;
+}
+
LLSpeakerUpdateModeratorEvent::LLSpeakerUpdateModeratorEvent(LLSpeaker* source)
: LLEvent(source, "Speaker add moderator event"),
mSpeakerID (source->mID),
@@ -241,16 +257,63 @@ bool LLSpeakersDelayActionsStorage::onTimerActionCallback(const LLUUID& speaker_
return true;
}
+bool LLSpeakersDelayActionsStorage::isTimerStarted(const LLUUID& speaker_id)
+{
+ return (mActionTimersMap.size() > 0) && (mActionTimersMap.find(speaker_id) != mActionTimersMap.end());
+}
+
+//
+// ModerationResponder
+//
+
+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;
+};
//
// LLSpeakerMgr
//
LLSpeakerMgr::LLSpeakerMgr(LLVoiceChannel* channelp) :
- mVoiceChannel(channelp)
-, mVoiceModerated(false)
-, mModerateModeHandledFirstTime(false)
+ mVoiceChannel(channelp),
+ mVoiceModerated(false),
+ mModerateModeHandledFirstTime(false),
+ mSpeakerListUpdated(false)
{
+ mGetListTime.reset();
static LLUICachedControl<F32> remove_delay ("SpeakerParticipantRemoveDelay", 10.0);
mSpeakerDelayRemover = new LLSpeakersDelayActionsStorage(boost::bind(&LLSpeakerMgr::removeSpeaker, this, _1), remove_delay);
@@ -263,7 +326,11 @@ LLSpeakerMgr::~LLSpeakerMgr()
LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::string& name, LLSpeaker::ESpeakerStatus status, LLSpeaker::ESpeakerType type)
{
- if (id.isNull()) return NULL;
+ LLUUID session_id = getSessionID();
+ if (id.isNull() || (id == session_id))
+ {
+ return NULL;
+ }
LLPointer<LLSpeaker> speakerp;
if (mSpeakers.find(id) == mSpeakers.end())
@@ -345,12 +412,10 @@ void LLSpeakerMgr::update(BOOL resort_ok)
// update status of all current speakers
BOOL voice_channel_active = (!mVoiceChannel && LLVoiceClient::getInstance()->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive());
- for (speaker_map_t::iterator speaker_it = mSpeakers.begin(); speaker_it != mSpeakers.end();)
+ for (speaker_map_t::iterator speaker_it = mSpeakers.begin(); speaker_it != mSpeakers.end(); speaker_it++)
{
LLUUID speaker_id = speaker_it->first;
LLSpeaker* speakerp = speaker_it->second;
-
- speaker_map_t::iterator cur_speaker_it = speaker_it++;
if (voice_channel_active && LLVoiceClient::getInstance()->getVoiceEnabled(speaker_id))
{
@@ -374,6 +439,7 @@ void LLSpeakerMgr::update(BOOL resort_ok)
{
speakerp->mLastSpokeTime = mSpeechTimer.getElapsedTimeF32();
speakerp->mHasSpoken = TRUE;
+ fireEvent(new LLSpeakerUpdateSpeakerEvent(speakerp), "update_speaker");
}
speakerp->mStatus = LLSpeaker::STATUS_SPEAKING;
// interpolate between active color and full speaking color based on power of speech output
@@ -448,24 +514,89 @@ void LLSpeakerMgr::update(BOOL resort_ok)
void LLSpeakerMgr::updateSpeakerList()
{
- // are we bound to the currently active voice channel?
+ // Are we bound to the currently active voice channel?
if ((!mVoiceChannel && LLVoiceClient::getInstance()->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive()))
{
- std::set<LLUUID> participants;
- LLVoiceClient::getInstance()->getParticipantList(participants);
- // add new participants to our list of known speakers
- for (std::set<LLUUID>::iterator participant_it = participants.begin();
- participant_it != participants.end();
- ++participant_it)
+ std::set<LLUUID> participants;
+ LLVoiceClient::getInstance()->getParticipantList(participants);
+ // If we are, add all voice client participants to our list of known speakers
+ for (std::set<LLUUID>::iterator participant_it = participants.begin(); participant_it != participants.end(); ++participant_it)
{
setSpeaker(*participant_it,
LLVoiceClient::getInstance()->getDisplayName(*participant_it),
LLSpeaker::STATUS_VOICE_ACTIVE,
(LLVoiceClient::getInstance()->isParticipantAvatar(*participant_it)?LLSpeaker::SPEAKER_AGENT:LLSpeaker::SPEAKER_EXTERNAL));
-
-
}
}
+ else
+ {
+ // If not, check if the list is empty, except if it's Nearby Chat (session_id NULL).
+ LLUUID session_id = getSessionID();
+ if (!session_id.isNull() && !mSpeakerListUpdated)
+ {
+ // If the list is empty, we update it with whatever we have locally so that it doesn't stay empty too long.
+ // *TODO: Fix the server side code that sometimes forgets to send back the list of participants after a chat started.
+ // (IOW, fix why we get no ChatterBoxSessionAgentListUpdates message after the initial ChatterBoxSessionStartReply)
+ LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id);
+ if (session->isGroupSessionType() && (mSpeakers.size() <= 1))
+ {
+ const F32 load_group_timeout = gSavedSettings.getF32("ChatLoadGroupTimeout");
+ // For groups, we need to hit the group manager.
+ // Note: The session uuid and the group uuid are actually one and the same. If that was to change, this will fail.
+ LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(session_id);
+ if (!gdatap && (mGetListTime.getElapsedTimeF32() >= load_group_timeout))
+ {
+ // Request the data the first time around
+ LLGroupMgr::getInstance()->sendCapGroupMembersRequest(session_id);
+ }
+ else if (gdatap && gdatap->isMemberDataComplete() && !gdatap->mMembers.empty())
+ {
+ // Add group members when we get the complete list (note: can take a while before we get that list)
+ LLGroupMgrGroupData::member_list_t::iterator member_it = gdatap->mMembers.begin();
+ const S32 load_group_max_members = gSavedSettings.getS32("ChatLoadGroupMaxMembers");
+ S32 updated = 0;
+ while (member_it != gdatap->mMembers.end())
+ {
+ LLGroupMemberData* member = member_it->second;
+ LLUUID id = member_it->first;
+ // Add only members who are online and not already in the list
+ if ((member->getOnlineStatus() == "Online") && (mSpeakers.find(id) == mSpeakers.end()))
+ {
+ LLPointer<LLSpeaker> speakerp = setSpeaker(id, "", LLSpeaker::STATUS_VOICE_ACTIVE, LLSpeaker::SPEAKER_AGENT);
+ speakerp->mIsModerator = ((member->getAgentPowers() & GP_SESSION_MODERATOR) == GP_SESSION_MODERATOR);
+ updated++;
+ }
+ ++member_it;
+ // Limit the number of "manually updated" participants to a reasonable number to avoid severe fps drop
+ // *TODO : solve the perf issue of having several hundreds of widgets in the conversation list
+ if (updated >= load_group_max_members)
+ break;
+ }
+ mSpeakerListUpdated = true;
+ }
+ }
+ else if (mSpeakers.size() == 0)
+ {
+ // For all other session type (ad-hoc, P2P, avaline), we use the initial participants targets list
+ for (uuid_vec_t::iterator it = session->mInitialTargetIDs.begin();it!=session->mInitialTargetIDs.end();++it)
+ {
+ // Add buddies if they are on line, add any other avatar.
+ if (!LLAvatarTracker::instance().isBuddy(*it) || LLAvatarTracker::instance().isBuddyOnline(*it))
+ {
+ setSpeaker(*it, "", LLSpeaker::STATUS_VOICE_ACTIVE, LLSpeaker::SPEAKER_AGENT);
+ }
+ }
+ mSpeakerListUpdated = true;
+ }
+ else
+ {
+ // The list has been updated the normal way (i.e. by a ChatterBoxSessionAgentListUpdates received from the server)
+ mSpeakerListUpdated = true;
+ }
+ }
+ }
+ // Always add the current agent (it has to be there...). Will do nothing if already there.
+ setSpeaker(gAgentID, "", LLSpeaker::STATUS_VOICE_ACTIVE, LLSpeaker::SPEAKER_AGENT);
}
void LLSpeakerMgr::setSpeakerNotInChannel(LLSpeaker* speakerp)
@@ -530,6 +661,10 @@ const LLUUID LLSpeakerMgr::getSessionID()
return mVoiceChannel->getSessionID();
}
+bool LLSpeakerMgr::isSpeakerToBeRemoved(const LLUUID& speaker_id)
+{
+ return mSpeakerDelayRemover && mSpeakerDelayRemover->isTimerStarted(speaker_id);
+}
void LLSpeakerMgr::setSpeakerTyping(const LLUUID& speaker_id, BOOL typing)
{
@@ -548,6 +683,7 @@ void LLSpeakerMgr::speakerChatted(const LLUUID& speaker_id)
{
speakerp->mLastSpokeTime = mSpeechTimer.getElapsedTimeF32();
speakerp->mHasSpoken = TRUE;
+ fireEvent(new LLSpeakerUpdateSpeakerEvent(speakerp), "update_speaker");
}
}
@@ -718,43 +854,6 @@ 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);
diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h
index b9358cf37c..e953dd0e1a 100644
--- a/indra/newview/llspeakers.h
+++ b/indra/newview/llspeakers.h
@@ -29,7 +29,6 @@
#include "llevent.h"
#include "lleventtimer.h"
-#include "llspeakers.h"
#include "llvoicechannel.h"
class LLSpeakerMgr;
@@ -80,6 +79,15 @@ public:
BOOL mModeratorMutedText;
};
+class LLSpeakerUpdateSpeakerEvent : public LLOldEvents::LLEvent
+{
+public:
+ LLSpeakerUpdateSpeakerEvent(LLSpeaker* source);
+ /*virtual*/ LLSD getValue();
+private:
+ const LLUUID& mSpeakerID;
+};
+
class LLSpeakerUpdateModeratorEvent : public LLOldEvents::LLEvent
{
public:
@@ -185,6 +193,8 @@ public:
void unsetActionTimer(const LLUUID& speaker_id);
void removeAllTimers();
+
+ bool isTimerStarted(const LLUUID& speaker_id);
private:
/**
* Callback of the each instance of LLSpeakerActionTimer.
@@ -229,6 +239,7 @@ public:
void getSpeakerList(speaker_list_t* speaker_list, BOOL include_text);
LLVoiceChannel* getVoiceChannel() { return mVoiceChannel; }
const LLUUID getSessionID();
+ bool isSpeakerToBeRemoved(const LLUUID& speaker_id);
/**
* Removes avaline speaker.
@@ -252,6 +263,8 @@ protected:
typedef std::map<LLUUID, LLPointer<LLSpeaker> > speaker_map_t;
speaker_map_t mSpeakers;
+ bool mSpeakerListUpdated;
+ LLTimer mGetListTime;
speaker_list_t mSpeakersSorted;
LLFrameTimer mSpeechTimer;
diff --git a/indra/newview/llspeakingindicatormanager.cpp b/indra/newview/llspeakingindicatormanager.cpp
index 9b38bf22ff..07e9371124 100644
--- a/indra/newview/llspeakingindicatormanager.cpp
+++ b/indra/newview/llspeakingindicatormanager.cpp
@@ -74,6 +74,16 @@ public:
*/
void unregisterSpeakingIndicator(const LLUUID& speaker_id, const LLSpeakingIndicator* const speaking_indicator);
+ /**
+ * 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 onParticipantsChanged();
+
private:
typedef std::set<LLUUID> speaker_ids_t;
typedef std::multimap<LLUUID, LLSpeakingIndicator*> speaking_indicators_mmap_t;
@@ -94,16 +104,6 @@ private:
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 onParticipantsChanged();
-
- /**
* Changes state of indicators specified by LLUUIDs
*
* @param speakers_uuids - avatars' LLUUIDs whose speaking indicators should be switched
@@ -237,28 +237,18 @@ void SpeakingIndicatorManager::switchSpeakerIndicators(const speaker_ids_t& spea
{
was_found = true;
LLSpeakingIndicator* indicator = (*it_indicator).second;
+ was_switched_on = was_switched_on || switch_on;
- BOOL switch_current_on = switch_on;
-
- // we should show indicator for specified voice session only if this is current channel. EXT-5562.
- if (switch_current_on && indicator->getTargetSessionID().notNull())
- {
- switch_current_on = indicator->getTargetSessionID() == session_id;
- LL_DEBUGS("SpeakingIndicator") << "Session: " << session_id << ", target: " << indicator->getTargetSessionID() << ", the same? = " << switch_current_on << LL_ENDL;
- }
- was_switched_on = was_switched_on || switch_current_on;
-
- indicator->switchIndicator(switch_current_on);
-
+ indicator->switchIndicator(switch_on);
}
if (was_found)
{
- LL_DEBUGS("SpeakingIndicator") << mSpeakingIndicators.count(*it_uuid) << " indicators where found" << LL_ENDL;
+ LL_DEBUGS("SpeakingIndicator") << mSpeakingIndicators.count(*it_uuid) << " indicators were found" << LL_ENDL;
if (switch_on && !was_switched_on)
{
- LL_DEBUGS("SpeakingIndicator") << "but non of them where switched on" << LL_ENDL;
+ LL_DEBUGS("SpeakingIndicator") << "but none of them were switched on" << LL_ENDL;
}
if (was_switched_on)
@@ -314,5 +304,13 @@ void LLSpeakingIndicatorManager::unregisterSpeakingIndicator(const LLUUID& speak
}
}
+void LLSpeakingIndicatorManager::updateSpeakingIndicators()
+{
+ if(SpeakingIndicatorManager::instanceExists())
+ {
+ SpeakingIndicatorManager::instance().onParticipantsChanged();
+ }
+}
+
// EOF
diff --git a/indra/newview/llspeakingindicatormanager.h b/indra/newview/llspeakingindicatormanager.h
index b0a147865b..e5afcd1cb7 100644
--- a/indra/newview/llspeakingindicatormanager.h
+++ b/indra/newview/llspeakingindicatormanager.h
@@ -78,6 +78,11 @@ namespace LLSpeakingIndicatorManager
* @param speaking_indicator instance of the speaker indicator to be unregistered.
*/
void unregisterSpeakingIndicator(const LLUUID& speaker_id, const LLSpeakingIndicator* const speaking_indicator);
+
+ /**
+ * Switch on/off registered speaking indicator according to the most current voice client status
+ */
+ void updateSpeakingIndicators();
}
#endif // LL_LLSPEAKINGINDICATORMANAGER_H
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 42648b82c2..37e6ded986 100755..100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -54,7 +54,7 @@
#include "llfloaterreg.h"
#include "llfocusmgr.h"
#include "llhttpsender.h"
-#include "llimfloater.h"
+#include "llfloaterimsession.h"
#include "lllocationhistory.h"
#include "llimageworker.h"
@@ -63,7 +63,8 @@
#include "llmemorystream.h"
#include "llmessageconfig.h"
#include "llmoveview.h"
-#include "llnearbychat.h"
+#include "llfloaterimcontainer.h"
+#include "llfloaterimnearbychat.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "llteleporthistory.h"
@@ -94,6 +95,7 @@
#include "llcallingcard.h"
#include "llconsole.h"
#include "llcontainerview.h"
+#include "llconversationlog.h"
#include "lldebugview.h"
#include "lldrawable.h"
#include "lleventnotifier.h"
@@ -312,8 +314,6 @@ void update_texture_fetch()
// true when all initialization done.
bool idle_startup()
{
- LLMemType mt1(LLMemType::MTYPE_STARTUP);
-
const F32 PRECACHING_DELAY = gSavedSettings.getF32("PrecachingDelay");
static LLTimer timeout;
static S32 timeout_count = 0;
@@ -917,6 +917,13 @@ bool idle_startup()
// Overwrite default user settings with user settings
LLAppViewer::instance()->loadSettingsFromDirectory("Account");
+ // Convert 'LogInstantMessages' into 'KeepConversationLogTranscripts' for backward compatibility (CHUI-743).
+ LLControlVariablePtr logInstantMessagesControl = gSavedPerAccountSettings.getControl("LogInstantMessages");
+ if (logInstantMessagesControl.notNull())
+ {
+ gSavedPerAccountSettings.setS32("KeepConversationLogTranscripts", logInstantMessagesControl->getValue() ? 2 : 1);
+ }
+
// Need to set the LastLogoff time here if we don't have one. LastLogoff is used for "Recent Items" calculation
// and startup time is close enough if we don't have a real value.
if (gSavedPerAccountSettings.getU32("LastLogoff") == 0)
@@ -1293,6 +1300,8 @@ bool idle_startup()
display_startup();
LLStartUp::setStartupState( STATE_MULTIMEDIA_INIT );
+ LLConversationLog::getInstance();
+
return FALSE;
}
@@ -1403,14 +1412,9 @@ bool idle_startup()
LLVoiceClient::getInstance()->updateSettings();
display_startup();
- //gCacheName is required for nearby chat history loading
- //so I just moved nearby history loading a few states further
- if (gSavedPerAccountSettings.getBOOL("LogShowHistory"))
- {
- LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
- if (nearby_chat) nearby_chat->loadHistory();
- }
- display_startup();
+ // create a container's instance for start a controlling conversation windows
+ // by the voice's events
+ LLFloaterIMContainer::getInstance();
// *Note: this is where gWorldMap used to be initialized.
@@ -1420,7 +1424,7 @@ bool idle_startup()
display_startup();
//reset statistics
- LLViewerStats::getInstance()->resetStats();
+ LLViewerStats::instance().resetStats();
display_startup();
//
@@ -1521,7 +1525,7 @@ bool idle_startup()
}
//---------------------------------------------------------------------
- // Agent Send
+ // World Wait
//---------------------------------------------------------------------
if(STATE_WORLD_WAIT == LLStartUp::getStartupState())
{
@@ -1847,6 +1851,10 @@ bool idle_startup()
// Set the show start location to true, now that the user has logged
// on with this install.
gSavedSettings.setBOOL("ShowStartLocation", TRUE);
+
+ // Open Conversation floater on first login.
+ LLFloaterReg::toggleInstanceOrBringToFront("im_container");
+
}
display_startup();
@@ -1949,7 +1957,7 @@ bool idle_startup()
llinfos << "gAgentStartLocation : " << gAgentStartLocation << llendl;
LLSLURL start_slurl = LLStartUp::getStartSLURL();
LL_DEBUGS("AppInit") << "start slurl "<<start_slurl.asString()<<LL_ENDL;
-
+
if (((start_slurl.getType() == LLSLURL::LOCATION) && (gAgentStartLocation == "url")) ||
((start_slurl.getType() == LLSLURL::LAST_LOCATION) && (gAgentStartLocation == "last")) ||
((start_slurl.getType() == LLSLURL::HOME_LOCATION) && (gAgentStartLocation == "home")))
@@ -2169,7 +2177,6 @@ bool idle_startup()
display_startup();
// Unmute audio if desired and setup volumes.
- // Unmute audio if desired and setup volumes.
// This is a not-uncommon crash site, so surround it with
// llinfos output to aid diagnosis.
LL_INFOS("AppInit") << "Doing first audio_update_volume..." << LL_ENDL;
@@ -2190,7 +2197,6 @@ bool idle_startup()
LLAgentPicksInfo::getInstance()->requestNumberOfPicks();
- LLIMFloater::initIMFloater();
display_startup();
llassert(LLPathfindingManager::getInstance() != NULL);
@@ -2296,7 +2302,7 @@ bool login_alert_status(const LLSD& notification, const LLSD& response)
// break;
case 2: // Teleport
// Restart the login process, starting at our home locaton
- LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME));
+ LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME));
LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
break;
default:
@@ -2805,7 +2811,7 @@ void LLStartUp::initNameCache()
// Start cache in not-running state until we figure out if we have
// capabilities for display name lookup
- LLAvatarNameCache::initClass(false);
+ LLAvatarNameCache::initClass(false,gSavedSettings.getBOOL("UsePeopleAPI"));
LLAvatarNameCache::setUseDisplayNames(gSavedSettings.getBOOL("UseDisplayNames"));
}
@@ -3307,11 +3313,8 @@ bool process_login_success_response()
{
// replace the default help URL format
gSavedSettings.setString("HelpURLFormat",text);
-
- // don't fall back to Standalone's pre-connection static help
- gSavedSettings.setBOOL("HelpUseLocal", false);
}
-
+
std::string home_location = response["home"];
if(!home_location.empty())
{
diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h
index 760e38890b..760e38890b 100755..100644
--- a/indra/newview/llstartup.h
+++ b/indra/newview/llstartup.h
diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp
index f64a72a616..ec11a23eb8 100644
--- a/indra/newview/llsurface.cpp
+++ b/indra/newview/llsurface.cpp
@@ -62,8 +62,6 @@ LLColor4U MAX_WATER_COLOR(0, 48, 96, 240);
S32 LLSurface::sTextureSize = 256;
-S32 LLSurface::sTexelsUpdated = 0;
-F32 LLSurface::sTextureUpdateTime = 0.f;
// ---------------- LLSurface:: Public Members ---------------
@@ -647,7 +645,6 @@ void LLSurface::updatePatchVisibilities(LLAgent &agent)
BOOL LLSurface::idleUpdate(F32 max_update_time)
{
- LLMemType mt_ius(LLMemType::MTYPE_IDLE_UPDATE_SURFACE);
if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_TERRAIN))
{
return FALSE;
diff --git a/indra/newview/llsurface.h b/indra/newview/llsurface.h
index 8052fb0d18..9d24bf8771 100644
--- a/indra/newview/llsurface.h
+++ b/indra/newview/llsurface.h
@@ -169,9 +169,6 @@ public:
F32 mDetailTextureScale; // Number of times to repeat detail texture across this surface
- static F32 sTextureUpdateTime;
- static S32 sTexelsUpdated;
-
protected:
void createSTexture();
void createWaterTexture();
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index 0cb6c85012..e92bd766ca 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -23,29 +23,18 @@
* $/LicenseInfo$
*/
-
#include "llviewerprecompiledheaders.h" // must be first include
-
#include "llsyswellwindow.h"
-#include "llagent.h"
-#include "llavatarnamecache.h"
-
-#include "llflatlistview.h"
-#include "llfloaterreg.h"
-#include "llnotifications.h"
-
-#include "llscriptfloater.h"
-#include "llviewercontrol.h"
-#include "llviewerwindow.h"
-
#include "llchiclet.h"
#include "llchicletbar.h"
-#include "lltoastpanel.h"
+#include "llflatlistview.h"
+#include "llfloaterreg.h"
#include "llnotificationmanager.h"
#include "llnotificationsutil.h"
+#include "llscriptfloater.h"
#include "llspeakers.h"
-#include "lltoolbarview.h"
+#include "lltoastpanel.h"
//---------------------------------------------------------------------------------
LLSysWellWindow::LLSysWellWindow(const LLSD& key) : LLTransientDockableFloater(NULL, true, key),
@@ -68,10 +57,6 @@ BOOL LLSysWellWindow::postBuild()
// get a corresponding channel
initChannel();
- // 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));
-
return LLTransientDockableFloater::postBuild();
}
@@ -98,9 +83,12 @@ void LLSysWellWindow::onStartUpToastClick(S32 x, S32 y, MASK mask)
void LLSysWellWindow::setSysWellChiclet(LLSysWellChiclet* chiclet)
{
mSysWellChiclet = chiclet;
- if(mSysWellChiclet)
- mSysWellChiclet->updateWidget(isWindowEmpty());
+ if(NULL != mSysWellChiclet)
+ {
+ mSysWellChiclet->updateWidget(isWindowEmpty());
+ }
}
+
//---------------------------------------------------------------------------------
LLSysWellWindow::~LLSysWellWindow()
{
@@ -111,7 +99,10 @@ void LLSysWellWindow::removeItemByID(const LLUUID& id)
{
if(mMessageList->removeItemByValue(id))
{
- mSysWellChiclet->updateWidget(isWindowEmpty());
+ if (NULL != mSysWellChiclet)
+ {
+ mSysWellChiclet->updateWidget(isWindowEmpty());
+ }
reshapeWindow();
}
else
@@ -165,11 +156,6 @@ void LLSysWellWindow::setVisible(BOOL visible)
mChannel->updateShowToastsState();
mChannel->redrawToasts();
}
-
- if (visible)
- {
- releaseNewMessagesState();
- }
}
//---------------------------------------------------------------------------------
@@ -219,14 +205,6 @@ void LLSysWellWindow::reshapeWindow()
}
}
-void LLSysWellWindow::releaseNewMessagesState()
-{
- if (NULL != mSysWellChiclet)
- {
- mSysWellChiclet->setNewMessagesState(false);
- }
-}
-
//---------------------------------------------------------------------------------
bool LLSysWellWindow::isWindowEmpty()
{
@@ -234,121 +212,6 @@ bool LLSysWellWindow::isWindowEmpty()
}
/************************************************************************/
-/* RowPanel implementation */
-/************************************************************************/
-
-//---------------------------------------------------------------------------------
-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)
-{
- buildFromFile( "panel_activeim_row.xml", NULL);
-
- // Choose which of the pre-created chiclets (IM/group) to use.
- // The other one gets hidden.
-
- LLIMChiclet::EType im_chiclet_type = LLIMChiclet::getIMSessionType(sessionId);
- switch (im_chiclet_type)
- {
- case LLIMChiclet::TYPE_GROUP:
- mChiclet = getChild<LLIMGroupChiclet>("group_chiclet");
- break;
- case LLIMChiclet::TYPE_AD_HOC:
- mChiclet = getChild<LLAdHocChiclet>("adhoc_chiclet");
- break;
- case LLIMChiclet::TYPE_UNKNOWN: // assign mChiclet a non-null value anyway
- case LLIMChiclet::TYPE_IM:
- 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);
-
- if (im_chiclet_type == LLIMChiclet::TYPE_IM)
- {
- LLAvatarNameCache::get(otherParticipantId,
- boost::bind(&LLIMWellWindow::RowPanel::onAvatarNameCache,
- this, _1, _2));
- }
- else
- {
- LLTextBox* contactName = getChild<LLTextBox>("contact_name");
- contactName->setValue(name);
- }
-
- mCloseBtn = getChild<LLButton>("hide_btn");
- mCloseBtn->setCommitCallback(boost::bind(&LLIMWellWindow::RowPanel::onClosePanel, this));
-}
-
-//---------------------------------------------------------------------------------
-void LLIMWellWindow::RowPanel::onAvatarNameCache(const LLUUID& agent_id,
- const LLAvatarName& av_name)
-{
- LLTextBox* contactName = getChild<LLTextBox>("contact_name");
- contactName->setValue( av_name.getCompleteName() );
-}
-
-//---------------------------------------------------------------------------------
-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->setShape(text_rect);
-}
-
-//---------------------------------------------------------------------------------
-LLIMWellWindow::RowPanel::~RowPanel()
-{
-}
-
-//---------------------------------------------------------------------------------
-void LLIMWellWindow::RowPanel::onClosePanel()
-{
- gIMMgr->leaveSession(mChiclet->getSessionId());
- // This row panel will be removed from the list in LLSysWellWindow::sessionRemoved().
-}
-
-//---------------------------------------------------------------------------------
-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 */
/************************************************************************/
@@ -356,7 +219,7 @@ LLIMWellWindow::ObjectRowPanel::ObjectRowPanel(const LLUUID& notification_id, bo
: LLPanel()
, mChiclet(NULL)
{
- buildFromFile( "panel_active_object_row.xml", NULL);
+ buildFromFile( "panel_active_object_row.xml");
initChiclet(notification_id);
@@ -433,13 +296,19 @@ BOOL LLIMWellWindow::ObjectRowPanel::handleRightMouseDown(S32 x, S32 y, MASK mas
//////////////////////////////////////////////////////////////////////////
// PUBLIC METHODS
+LLNotificationWellWindow::WellNotificationChannel::WellNotificationChannel(LLNotificationWellWindow* well_window)
+: LLNotificationChannel(LLNotificationChannel::Params().name(well_window->getPathname())),
+ mWellWindow(well_window)
+{
+ connectToChannel("Notifications");
+ connectToChannel("Group Notifications");
+ connectToChannel("Offer");
+}
+
LLNotificationWellWindow::LLNotificationWellWindow(const LLSD& key)
-: LLSysWellWindow(key)
+: LLSysWellWindow(key)
{
- // init connections to the list's update events
- connectListUpdaterToSignal("notify");
- connectListUpdaterToSignal("groupnotify");
- connectListUpdaterToSignal("offer");
+ mNotificationUpdates.reset(new WellNotificationChannel(this));
}
// static
@@ -481,7 +350,6 @@ void LLNotificationWellWindow::addItem(LLSysWellItem::Params p)
{
mSysWellChiclet->updateWidget(isWindowEmpty());
reshapeWindow();
-
new_item->setOnItemCloseCallback(boost::bind(&LLNotificationWellWindow::onItemClose, this, _1));
new_item->setOnItemClickCallback(boost::bind(&LLNotificationWellWindow::onItemClick, this, _1));
}
@@ -519,7 +387,7 @@ void LLNotificationWellWindow::initChannel()
LLSysWellWindow::initChannel();
if(mChannel)
{
- mChannel->setOnStoreToastCallback(boost::bind(&LLNotificationWellWindow::onStoreToast, this, _1, _2));
+ mChannel->addOnStoreToastCallback(boost::bind(&LLNotificationWellWindow::onStoreToast, this, _1, _2));
}
}
@@ -546,20 +414,6 @@ void LLNotificationWellWindow::onStoreToast(LLPanel* info_panel, LLUUID id)
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();
@@ -574,7 +428,10 @@ void LLNotificationWellWindow::onItemClose(LLSysWellItem* item)
mChannel->killToastByNotificationID(id);
}
-
+void LLNotificationWellWindow::onAdd( LLNotificationPtr notify )
+{
+ removeItemByID(notify->getID());
+}
/************************************************************************/
/* LLIMWellWindow implementation */
@@ -585,12 +442,10 @@ void LLNotificationWellWindow::onItemClose(LLSysWellItem* item)
LLIMWellWindow::LLIMWellWindow(const LLSD& key)
: LLSysWellWindow(key)
{
- LLIMMgr::getInstance()->addSessionObserver(this);
}
LLIMWellWindow::~LLIMWellWindow()
{
- LLIMMgr::getInstance()->removeSessionObserver(this);
}
// static
@@ -611,47 +466,11 @@ BOOL LLIMWellWindow::postBuild()
BOOL rv = LLSysWellWindow::postBuild();
setTitle(getString("title_im_well_window"));
- LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLIMWellWindow::findIMChiclet, this, _1));
LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLIMWellWindow::findObjectChiclet, this, _1));
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)
{
if (!mMessageList) return NULL;
@@ -668,85 +487,13 @@ LLChiclet* LLIMWellWindow::findObjectChiclet(const LLUUID& notification_id)
//////////////////////////////////////////////////////////////////////////
// PRIVATE METHODS
-LLChiclet* LLIMWellWindow::findIMChiclet(const LLUUID& sessionId)
-{
- if (!mMessageList) return NULL;
-
- 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->addItem(item, sessionId))
- {
- mSysWellChiclet->updateWidget(isWindowEmpty());
- }
- 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))
- {
- mSysWellChiclet->updateWidget(isWindowEmpty());
- }
- 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->addItem(item, notification_id))
- {
- mSysWellChiclet->updateWidget(isWindowEmpty());
- }
- else
+ if (!mMessageList->addItem(item, notification_id))
{
llwarns << "Unable to add Object Row into the list, notificationID: " << notification_id << llendl;
item->die();
@@ -757,14 +504,7 @@ void LLIMWellWindow::addObjectRow(const LLUUID& notification_id, bool new_messag
void LLIMWellWindow::removeObjectRow(const LLUUID& notification_id)
{
- if (mMessageList->removeItemByValue(notification_id))
- {
- if (mSysWellChiclet)
- {
- mSysWellChiclet->updateWidget(isWindowEmpty());
- }
- }
- else
+ if (!mMessageList->removeItemByValue(notification_id))
{
llwarns << "Unable to remove Object Row from the list, notificationID: " << notification_id << llendl;
}
@@ -777,21 +517,6 @@ void LLIMWellWindow::removeObjectRow(const LLUUID& notification_id)
}
}
-
-void LLIMWellWindow::addIMRow(const LLUUID& session_id)
-{
- if (hasIMRow(session_id)) return;
-
- LLIMModel* im_model = LLIMModel::getInstance();
- addIMRow(session_id, 0, im_model->getName(session_id), im_model->getOtherParticipantID(session_id));
- reshapeWindow();
-}
-
-bool LLIMWellWindow::hasIMRow(const LLUUID& session_id)
-{
- return mMessageList->getItemByValue(session_id);
-}
-
void LLIMWellWindow::closeAll()
{
// Generate an ignorable alert dialog if there is an active voice IM sesion
@@ -836,13 +561,6 @@ void LLIMWellWindow::closeAllImpl()
{
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)
{
@@ -867,4 +585,4 @@ bool LLIMWellWindow::confirmCloseAll(const LLSD& notification, const LLSD& respo
return false;
}
-// EOF
+
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index 272e9cfcb1..cc5c057d8b 100644
--- a/indra/newview/llsyswellwindow.h
+++ b/indra/newview/llsyswellwindow.h
@@ -27,29 +27,26 @@
#ifndef LL_LLSYSWELLWINDOW_H
#define LL_LLSYSWELLWINDOW_H
+#include "llimview.h"
+#include "llnotifications.h"
+#include "llscreenchannel.h"
#include "llsyswellitem.h"
-
#include "lltransientdockablefloater.h"
-#include "llbutton.h"
-#include "llscreenchannel.h"
-#include "llscrollcontainer.h"
-#include "llimview.h"
-
-#include "boost/shared_ptr.hpp"
class LLAvatarName;
-class LLFlatListView;
class LLChiclet;
+class LLFlatListView;
class LLIMChiclet;
class LLScriptChiclet;
class LLSysWellChiclet;
-
class LLSysWellWindow : public LLTransientDockableFloater
{
public:
+ LOG_CLASS(LLSysWellWindow);
+
LLSysWellWindow(const LLSD& key);
- ~LLSysWellWindow();
+ virtual ~LLSysWellWindow();
BOOL postBuild();
// other interface functions
@@ -84,7 +81,6 @@ protected:
virtual const std::string& getAnchorViewName() = 0;
void reshapeWindow();
- void releaseNewMessagesState();
// pointer to a corresponding channel's instance
LLNotificationsUI::LLScreenChannel* mChannel;
@@ -111,7 +107,7 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void setVisible(BOOL visible);
-
+ /*virtual*/ void onAdd(LLNotificationPtr notify);
// Operating with items
void addItem(LLSysWellItem::Params p);
@@ -119,6 +115,18 @@ public:
void closeAll();
protected:
+ struct WellNotificationChannel : public LLNotificationChannel
+ {
+ WellNotificationChannel(LLNotificationWellWindow*);
+ void onDelete(LLNotificationPtr notify)
+ {
+ mWellWindow->removeItemByID(notify->getID());
+ }
+
+ LLNotificationWellWindow* mWellWindow;
+ };
+
+ LLNotificationChannelPtr mNotificationUpdates;
/*virtual*/ const std::string& getAnchorViewName() { return NOTIFICATION_WELL_ANCHOR_NAME; }
private:
@@ -126,12 +134,8 @@ private:
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);
@@ -146,7 +150,7 @@ private:
*
* It contains a list list of all active IM sessions.
*/
-class LLIMWellWindow : public LLSysWellWindow, LLIMSessionObserver, LLInitClass<LLIMWellWindow>
+class LLIMWellWindow : public LLSysWellWindow, LLInitClass<LLIMWellWindow>
{
public:
LLIMWellWindow(const LLSD& key);
@@ -158,57 +162,19 @@ public:
/*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.
- */
- class RowPanel: public LLPanel
- {
- public:
- RowPanel(const LLSysWellWindow* parent, const LLUUID& sessionId, S32 chicletCounter,
- const std::string& name, const LLUUID& otherParticipantId);
- virtual ~RowPanel();
- 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 onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
- void onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param);
- void onClosePanel();
- public:
- LLIMChiclet* mChiclet;
- private:
- LLButton* mCloseBtn;
- const LLSysWellWindow* mParent;
- };
-
class ObjectRowPanel: public LLPanel
{
public:
diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp
index 467115c928..ad09af6594 100644
--- a/indra/newview/lltexlayer.cpp
+++ b/indra/newview/lltexlayer.cpp
@@ -510,7 +510,13 @@ void LLTexLayerSetBuffer::doUpload()
BOOL valid = FALSE;
LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C;
S32 file_size = 0;
- U8* data = LLVFile::readFile(gVFS, asset_id, LLAssetType::AT_TEXTURE, &file_size);
+
+ //data buffer MUST be allocated using LLImageBase
+ LLVFile file(gVFS, asset_id, LLAssetType::AT_TEXTURE);
+ file_size = file.getSize();
+ U8* data = integrity_test->allocateData(file_size);
+ file.read(data, file_size);
+
if (data)
{
valid = integrity_test->validate(data, file_size); // integrity_test will delete 'data'
diff --git a/indra/newview/lltexlayerparams.h b/indra/newview/lltexlayerparams.h
index 2c0da60b48..c812199796 100644
--- a/indra/newview/lltexlayerparams.h
+++ b/indra/newview/lltexlayerparams.h
@@ -58,6 +58,7 @@ protected:
// LLTexLayerParamAlpha
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL_ALIGN_PREFIX(16)
class LLTexLayerParamAlpha : public LLTexLayerParam
{
public:
@@ -65,6 +66,16 @@ public:
LLTexLayerParamAlpha( LLVOAvatar* avatar );
/*virtual*/ ~LLTexLayerParamAlpha();
+ void* operator new(size_t size)
+ {
+ return ll_aligned_malloc_16(size);
+ }
+
+ void operator delete(void* ptr)
+ {
+ ll_aligned_free_16(ptr);
+ }
+
/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable = NULL) const;
// LLVisualParam Virtual functions
@@ -94,7 +105,7 @@ private:
LLPointer<LLImageRaw> mStaticImageRaw;
BOOL mNeedsCreateTexture;
BOOL mStaticImageInvalid;
- LLVector4a mAvgDistortionVec;
+ LL_ALIGN_16(LLVector4a mAvgDistortionVec);
F32 mCachedEffectiveWeight;
public:
@@ -104,7 +115,7 @@ public:
typedef std::list< LLTexLayerParamAlpha* > param_alpha_ptr_list_t;
static param_alpha_ptr_list_t sInstances;
-};
+} LL_ALIGN_POSTFIX(16);
class LLTexLayerParamAlphaInfo : public LLViewerVisualParamInfo
{
friend class LLTexLayerParamAlpha;
@@ -128,6 +139,8 @@ private:
// LLTexLayerParamColor
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+LL_ALIGN_PREFIX(16)
class LLTexLayerParamColor : public LLTexLayerParam
{
public:
@@ -141,6 +154,17 @@ public:
LLTexLayerParamColor( LLTexLayerInterface* layer );
LLTexLayerParamColor( LLVOAvatar* avatar );
+
+ void* operator new(size_t size)
+ {
+ return ll_aligned_malloc_16(size);
+ }
+
+ void operator delete(void* ptr)
+ {
+ ll_aligned_free_16(ptr);
+ }
+
/* virtual */ ~LLTexLayerParamColor();
/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable = NULL) const;
@@ -166,8 +190,8 @@ public:
protected:
virtual void onGlobalColorChanged(bool upload_bake) {}
private:
- LLVector4a mAvgDistortionVec;
-};
+ LL_ALIGN_16(LLVector4a mAvgDistortionVec);
+} LL_ALIGN_POSTFIX(16);
class LLTexLayerParamColorInfo : public LLViewerVisualParamInfo
{
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index a61e2d5c86..305f6fca0f 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -1861,7 +1861,12 @@ LLPointer<LLImageRaw> LLTextureCache::readFromFastCache(const LLUUID& id, S32& d
mFastCachep->seek(APR_SET, offset);
- llassert_always(mFastCachep->read(head, TEXTURE_FAST_CACHE_ENTRY_OVERHEAD) == TEXTURE_FAST_CACHE_ENTRY_OVERHEAD);
+ if(mFastCachep->read(head, TEXTURE_FAST_CACHE_ENTRY_OVERHEAD) != TEXTURE_FAST_CACHE_ENTRY_OVERHEAD)
+ {
+ //cache corrupted or under thread race condition
+ closeFastCache();
+ return NULL;
+ }
S32 image_size = head[0] * head[1] * head[2];
if(!image_size) //invalid
@@ -1872,7 +1877,13 @@ LLPointer<LLImageRaw> LLTextureCache::readFromFastCache(const LLUUID& id, S32& d
discardlevel = head[3];
data = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), image_size);
- llassert_always(mFastCachep->read(data, image_size) == image_size);
+ if(mFastCachep->read(data, image_size) != image_size)
+ {
+ FREE_MEM(LLImageBase::getPrivatePool(), data);
+ closeFastCache();
+ return NULL;
+ }
+
closeFastCache();
}
LLPointer<LLImageRaw> raw = new LLImageRaw(data, head[0], head[1], head[2], true);
@@ -1926,7 +1937,11 @@ bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 dis
openFastCache();
mFastCachep->seek(APR_SET, offset);
- llassert_always(mFastCachep->write(mFastCachePadBuffer, TEXTURE_FAST_CACHE_ENTRY_SIZE) == TEXTURE_FAST_CACHE_ENTRY_SIZE);
+
+ //no need to do this assertion check. When it fails, let it fail quietly.
+ //this failure could happen because other viewer removes the fast cache file when clearing cache.
+ //--> llassert_always(mFastCachep->write(mFastCachePadBuffer, TEXTURE_FAST_CACHE_ENTRY_SIZE) == TEXTURE_FAST_CACHE_ENTRY_SIZE);
+ mFastCachep->write(mFastCachePadBuffer, TEXTURE_FAST_CACHE_ENTRY_SIZE);
closeFastCache(true);
}
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index ec36cf48c2..007eb8e33f 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -39,7 +39,7 @@
#include "llfocusmgr.h"
#include "llviewertexture.h"
#include "llfolderview.h"
-#include "llfoldervieweventlistener.h"
+#include "llfolderviewmodel.h"
#include "llinventory.h"
#include "llinventoryfunctions.h"
#include "llinventorymodelbackgroundfetch.h"
@@ -58,6 +58,7 @@
#include "lltoolmgr.h"
#include "lltoolpipette.h"
#include "llfiltereditor.h"
+#include "llwindow.h"
#include "lltool.h"
#include "llviewerwindow.h"
@@ -186,7 +187,7 @@ protected:
F32 mContextConeOpacity;
LLSaveFolderState mSavedFolderState;
BOOL mSelectedItemPinned;
-
+
LLRadioGroup* mModeSelector;
LLScrollListCtrl* mLocalScrollCtrl;
@@ -372,7 +373,7 @@ BOOL LLFloaterTexturePicker::handleKeyHere(KEY key, MASK mask)
{
if (!root_folder->getCurSelectedItem())
{
- LLFolderViewItem* itemp = root_folder->getItemByID(gInventory.getRootFolderID());
+ LLFolderViewItem* itemp = mInventoryPanel->getItemByID(gInventory.getRootFolderID());
if (itemp)
{
root_folder->setSelection(itemp, FALSE, FALSE);
@@ -454,7 +455,7 @@ BOOL LLFloaterTexturePicker::postBuild()
// Commented out to scroll to currently selected texture. See EXT-5403.
// // store this filter as the default one
- // mInventoryPanel->getRootFolder()->getFilter()->markDefault();
+ // mInventoryPanel->getRootFolder()->getFilter().markDefault();
// Commented out to stop opening all folders with textures
// mInventoryPanel->openDefaultFolderForType(LLFolderType::FT_TEXTURE);
@@ -637,11 +638,10 @@ void LLFloaterTexturePicker::draw()
LLFolderView* folder_view = mInventoryPanel->getRootFolder();
if (!folder_view) return;
- LLInventoryFilter* filter = folder_view->getFilter();
- if (!filter) return;
+ LLFolderViewFilter& filter = static_cast<LLFolderViewModelInventory*>(folder_view->getFolderViewModel())->getFilter();
- bool is_filter_active = folder_view->getCompletedFilterGeneration() < filter->getCurrentGeneration() &&
- filter->isNotDefault();
+ bool is_filter_active = folder_view->getViewModelItem()->getLastFilterGeneration() < filter.getCurrentGeneration() &&
+ filter.isNotDefault();
// After inventory panel filter is applied we have to update
// constraint rect for the selected item because of folder view
@@ -651,26 +651,12 @@ void LLFloaterTexturePicker::draw()
if (!is_filter_active && !mSelectedItemPinned)
{
folder_view->setPinningSelectedItem(mSelectedItemPinned);
- folder_view->dirtyFilter();
- folder_view->arrangeFromRoot();
-
+ folder_view->getViewModelItem()->dirtyFilter();
mSelectedItemPinned = TRUE;
}
}
}
-// static
-/*
-void LLFloaterTexturePicker::onSaveAnotherCopyDialog( S32 option, void* userdata )
-{
- LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
- if( 0 == option )
- {
- self->copyToInventoryFinal();
- }
-}
-*/
-
const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, BOOL copyable_only)
{
LLViewerInventoryCategory::cat_array_t cats;
@@ -815,7 +801,7 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem
if (items.size())
{
LLFolderViewItem* first_item = items.front();
- LLInventoryItem* itemp = gInventory.getItem(first_item->getListener()->getUUID());
+ LLInventoryItem* itemp = gInventory.getItem(static_cast<LLFolderViewModelItemInventory*>(first_item->getViewModelItem())->getUUID());
mNoCopyTextureSelected = FALSE;
if (itemp)
{
@@ -1011,7 +997,7 @@ void LLFloaterTexturePicker::onFilterEdit(const std::string& search_string )
else if (mInventoryPanel->getFilterSubString().empty())
{
// first letter in search term, save existing folder open state
- if (!mInventoryPanel->getRootFolder()->isFilterModified())
+ if (!mInventoryPanel->getFilter().isNotDefault())
{
mSavedFolderState.setApply(FALSE);
mInventoryPanel->getRootFolder()->applyFunctorRecursively(mSavedFolderState);
@@ -1325,7 +1311,7 @@ void LLTextureCtrl::onFloaterCommit(ETexturePickOp op, LLUUID id)
// (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() || id.notNull()) // mModelView->setDirty does not work.
{
setTentative( FALSE );
@@ -1337,10 +1323,10 @@ void LLTextureCtrl::onFloaterCommit(ETexturePickOp op, LLUUID id)
}
else
{
- mImageItemID = floaterp->findItemID(floaterp->getAssetID(), FALSE);
- lldebugs << "mImageItemID: " << mImageItemID << llendl;
- mImageAssetID = floaterp->getAssetID();
- lldebugs << "mImageAssetID: " << mImageAssetID << llendl;
+ mImageItemID = floaterp->findItemID(floaterp->getAssetID(), FALSE);
+ lldebugs << "mImageItemID: " << mImageItemID << llendl;
+ mImageAssetID = floaterp->getAssetID();
+ lldebugs << "mImageAssetID: " << mImageAssetID << llendl;
}
if (op == TEXTURE_SELECT && mOnSelectCallback)
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 7adf5212c2..7de66b139f 100644..100755
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
* Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * Copyright (C) 2012, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -28,12 +28,12 @@
#include <iostream>
#include <map>
+#include <algorithm>
#include "llstl.h"
#include "lltexturefetch.h"
-#include "llcurl.h"
#include "lldir.h"
#include "llhttpclient.h"
#include "llhttpstatuscodes.h"
@@ -50,32 +50,219 @@
#include "llviewertexture.h"
#include "llviewerregion.h"
#include "llviewerstats.h"
+#include "llviewerstatsrecorder.h"
#include "llviewerassetstats.h"
#include "llworld.h"
#include "llsdutil.h"
#include "llstartup.h"
-#include "llviewerstats.h"
+#include "llsdserialize.h"
+
+#include "httprequest.h"
+#include "httphandler.h"
+#include "httpresponse.h"
+#include "bufferarray.h"
+#include "bufferstream.h"
bool LLTextureFetchDebugger::sDebuggerEnabled = false ;
LLStat LLTextureFetch::sCacheHitRate("texture_cache_hits", 128);
LLStat LLTextureFetch::sCacheReadLatency("texture_cache_read_latency", 128);
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// Introduction
+//
+// This is an attempt to document what's going on in here after-the-fact.
+// It's a sincere attempt to be accurate but there will be mistakes.
+//
+//
+// Purpose
+//
+// What is this module trying to do? It accepts requests to load textures
+// at a given priority and discard level and notifies the caller when done
+// (successfully or not). Additional constraints are:
+//
+// * Support a local texture cache. Don't hit network when possible
+// to avoid it.
+// * Use UDP or HTTP as directed or as fallback. HTTP is tried when
+// not disabled and a URL is available. UDP when a URL isn't
+// available or HTTP attempts fail.
+// * Asynchronous (using threads). Main thread is not to be blocked or
+// burdened.
+// * High concurrency. Many requests need to be in-flight and at various
+// stages of completion.
+// * Tolerate frequent re-prioritizations of requests. Priority is
+// a reflection of a camera's viewpoint and as that viewpoint changes,
+// objects and textures become more and less relevant and that is
+// expressed at this level by priority changes and request cancelations.
+//
+// The caller interfaces that fall out of the above and shape the
+// implementation are:
+// * createRequest - Load j2c image via UDP or HTTP at given discard level and priority
+// * deleteRequest - Request removal of prior request
+// * getRequestFinished - Test if request is finished returning data to caller
+// * updateRequestPriority - Change priority of existing request
+// * getFetchState - Retrieve progress on existing request
+//
+// Everything else in here is mostly plumbing, metrics and debug.
+//
+//
+// The Work Queue
+//
+// The two central classes are LLTextureFetch and LLTextureFetchWorker.
+// LLTextureFetch combines threading with a priority queue of work
+// requests. The priority queue is sorted by a U32 priority derived
+// from the F32 priority in the APIs. The *only* work request that
+// receives service time by this thread is the highest priority
+// request. All others wait until it is complete or a dynamic priority
+// change has re-ordered work.
+//
+// LLTextureFetchWorker implements the work request and is 1:1 with
+// texture fetch requests. Embedded in each is a state machine that
+// walks it through the cache, HTTP, UDP, image decode and retry
+// steps of texture acquisition.
+//
+//
+// Threads
+//
+// Several threads are actively invoking code in this module. They
+// include:
+//
+// 1. Tmain Main thread of execution
+// 2. Ttf LLTextureFetch's worker thread provided by LLQueuedThread
+// 3. Tcurl LLCurl's worker thread (should disappear over time)
+// 4. Ttc LLTextureCache's worker thread
+// 5. Tid Image decoder's worker thread
+// 6. Thl HTTP library's worker thread
+//
+//
+// Mutexes/Condition Variables
+//
+// 1. Mt Mutex defined for LLThread's condition variable (base class of
+// LLTextureFetch)
+// 2. Ct Condition variable for LLThread and used by lock/unlockData().
+// 3. Mwtd Special LLWorkerThread mutex used for request deletion
+// operations (base class of LLTextureFetch)
+// 4. Mfq LLTextureFetch's mutex covering request and command queue
+// data.
+// 5. Mfnq LLTextureFetch's mutex covering udp and http request
+// queue data.
+// 6. Mwc Mutex covering LLWorkerClass's members (base class of
+// LLTextureFetchWorker). One per request.
+// 7. Mw LLTextureFetchWorker's mutex. One per request.
+//
+//
+// Lock Ordering Rules
+//
+// Not an exhaustive list but shows the order of lock acquisition
+// needed to prevent deadlocks. 'A < B' means acquire 'A' before
+// acquiring 'B'.
+//
+// 1. Mw < Mfnq
+// (there are many more...)
+//
+//
+// Method and Member Definitions
+//
+// With the above, we'll try to document what threads can call what
+// methods (using T* for any), what locks must be held on entry and
+// are taken out during execution and what data is covered by which
+// lock (if any). This latter category will be especially prone to
+// error so be skeptical.
+//
+// A line like: "// Locks: M<xxx>" indicates a method that must
+// be invoked by a caller holding the 'M<xxx>' lock. Similarly,
+// "// Threads: T<xxx>" means that a caller should be running in
+// the indicated thread.
+//
+// For data members, a trailing comment like "// M<xxx>" means that
+// the data member is covered by the specified lock. Absence of a
+// comment can mean the member is unlocked or that I didn't bother
+// to do the archaeology. In the case of LLTextureFetchWorker,
+// most data members added by the leaf class are actually covered
+// by the Mw lock. You may also see "// T<xxx>" which means that
+// the member's usage is restricted to one thread (except for
+// perhaps construction and destruction) and so explicit locking
+// isn't used.
+//
+// In code, a trailing comment like "// [-+]M<xxx>" indicates a
+// lock acquision or release point.
+//
+//
+// Worker Lifecycle
+//
+// The threading and responder model makes it very likely that
+// other components are holding on to a pointer to a worker request.
+// So, uncoordinated deletions of requests is a guarantee of memory
+// corruption in a short time. So destroying a request involves
+// invocations's of LLQueuedThread/LLWorkerThread's abort/stop
+// logic that removes workers and puts them ona delete queue for
+// 2-phase destruction. That second phase is deferrable by calls
+// to deleteOK() which only allow final destruction (via dtor)
+// once deleteOK has determined that the request is in a safe
+// state.
+//
+//
+// Worker State Machine
+//
+// (ASCII art needed)
+//
+//
+// Priority Scheme
+//
+// [PRIORITY_LOW, PRIORITY_NORMAL) - for WAIT_HTTP_RESOURCE state
+// and other wait states
+// [PRIORITY_HIGH, PRIORITY_URGENT) - External event delivered,
+// rapidly transitioning through states,
+// no waiting allowed
+//
+// By itself, the above work queue model would fail the concurrency
+// and liveness requirements of the interface. A high priority
+// request could find itself on the head and stalled for external
+// reasons (see VWR-28996). So a few additional constraints are
+// required to keep things running:
+// * Anything that can make forward progress must be kept at a
+// higher priority than anything that can't.
+// * On completion of external events, the associated request
+// needs to be elevated beyond the normal range to handle
+// any data delivery and release any external resource.
+//
+// This effort is made to keep higher-priority entities moving
+// forward in their state machines at every possible step of
+// processing. It's not entirely proven that this produces the
+// experiencial benefits promised.
+//
+
+
+//////////////////////////////////////////////////////////////////////////////
+
+// Tuning/Parameterization Constants
+
+static const S32 HTTP_REQUESTS_IN_QUEUE_HIGH_WATER = 40; // Maximum requests to have active in HTTP
+static const S32 HTTP_REQUESTS_IN_QUEUE_LOW_WATER = 20; // Active level at which to refill
+
+
//////////////////////////////////////////////////////////////////////////////
-class LLTextureFetchWorker : public LLWorkerClass
+
+class LLTextureFetchWorker : public LLWorkerClass, public LLCore::HttpHandler
+
{
friend class LLTextureFetch;
- friend class HTTPGetResponder;
friend class LLTextureFetchDebugger;
private:
class CacheReadResponder : public LLTextureCache::ReadResponder
{
public:
+
+ // Threads: Ttf
CacheReadResponder(LLTextureFetch* fetcher, const LLUUID& id, LLImageFormatted* image)
: mFetcher(fetcher), mID(id)
{
setImage(image);
}
+
+ // Threads: Ttc
virtual void completed(bool success)
{
LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
@@ -92,10 +279,14 @@ private:
class CacheWriteResponder : public LLTextureCache::WriteResponder
{
public:
+
+ // Threads: Ttf
CacheWriteResponder(LLTextureFetch* fetcher, const LLUUID& id)
: mFetcher(fetcher), mID(id)
{
}
+
+ // Threads: Ttc
virtual void completed(bool success)
{
LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
@@ -112,10 +303,14 @@ private:
class DecodeResponder : public LLImageDecodeThread::Responder
{
public:
+
+ // Threads: Ttf
DecodeResponder(LLTextureFetch* fetcher, const LLUUID& id, LLTextureFetchWorker* worker)
: mFetcher(fetcher), mID(id), mWorker(worker)
{
}
+
+ // Threads: Tid
virtual void completed(bool success, LLImageRaw* raw, LLImageRaw* aux)
{
LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
@@ -148,22 +343,35 @@ private:
};
public:
+
+ // Threads: Ttf
/*virtual*/ bool doWork(S32 param); // Called from LLWorkerThread::processRequest()
+
+ // Threads: Ttf
/*virtual*/ void finishWork(S32 param, bool completed); // called from finishRequest() (WORK THREAD)
- /*virtual*/ bool deleteOK(); // called from update() (WORK THREAD)
-
+
+ // Threads: Tmain
+ /*virtual*/ bool deleteOK(); // called from update()
+
~LLTextureFetchWorker();
- // void relese() { --mActiveCount; }
- S32 callbackHttpGet(const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer,
- bool partial, bool success);
+ // Threads: Ttf
+ // Locks: Mw
+ S32 callbackHttpGet(LLCore::HttpResponse * response,
+ bool partial, bool success);
+
+ // Threads: Ttc
void callbackCacheRead(bool success, LLImageFormatted* image,
S32 imagesize, BOOL islocal);
+
+ // Threads: Ttc
void callbackCacheWrite(bool success);
+
+ // Threads: Tid
void callbackDecoded(bool success, LLImageRaw* raw, LLImageRaw* aux);
- void setGetStatus(U32 status, const std::string& reason)
+ // Threads: T*
+ void setGetStatus(LLCore::HttpStatus status, const std::string& reason)
{
LLMutexLock lock(&mWorkMutex);
@@ -175,35 +383,93 @@ public:
bool getCanUseHTTP() const { return mCanUseHTTP; }
LLTextureFetch & getFetcher() { return *mFetcher; }
+
+ // Inherited from LLCore::HttpHandler
+ // Threads: Ttf
+ virtual void onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response);
protected:
LLTextureFetchWorker(LLTextureFetch* fetcher, const std::string& url, const LLUUID& id, const LLHost& host,
F32 priority, S32 discard, S32 size);
private:
+
+ // Threads: Tmain
/*virtual*/ void startWork(S32 param); // called from addWork() (MAIN THREAD)
+
+ // Threads: Tmain
/*virtual*/ void endWork(S32 param, bool aborted); // called from doWork() (MAIN THREAD)
+ // Locks: Mw
void resetFormattedData();
+ // Locks: Mw
void setImagePriority(F32 priority);
+
+ // Locks: Mw (ctor invokes without lock)
void setDesiredDiscard(S32 discard, S32 size);
+
+ // Threads: T*
+ // Locks: Mw
bool insertPacket(S32 index, U8* data, S32 size);
+
+ // Locks: Mw
void clearPackets();
+
+ // Locks: Mw
void setupPacketData();
+
+ // Locks: Mw (ctor invokes without lock)
U32 calcWorkPriority();
+
+ // Locks: Mw
void removeFromCache();
+
+ // Threads: Ttf
+ // Locks: Mw
bool processSimulatorPackets();
+
+ // Threads: Ttf
bool writeToCacheComplete();
- void removeFromHTTPQueue();
+ // Threads: Ttf
+ void recordTextureStart(bool is_http);
+
+ // Threads: Ttf
+ void recordTextureDone(bool is_http);
void lockWorkMutex() { mWorkMutex.lock(); }
void unlockWorkMutex() { mWorkMutex.unlock(); }
+ // Threads: Ttf
+ // Locks: Mw
+ bool acquireHttpSemaphore()
+ {
+ llassert(! mHttpHasResource);
+ if (mFetcher->mHttpSemaphore <= 0)
+ {
+ return false;
+ }
+ mHttpHasResource = true;
+ mFetcher->mHttpSemaphore--;
+ return true;
+ }
+
+ // Threads: Ttf
+ // Locks: Mw
+ void releaseHttpSemaphore()
+ {
+ llassert(mHttpHasResource);
+ mHttpHasResource = false;
+ mFetcher->mHttpSemaphore++;
+ }
+
private:
enum e_state // mState
{
+ // *NOTE: Do not change the order/value of state variables, some code
+ // depends upon specific ordering/adjacency.
+
// NOTE: Affects LLTextureBar::draw in lltextureview.cpp (debug hack)
INVALID = 0,
INIT,
@@ -211,8 +477,10 @@ private:
CACHE_POST,
LOAD_FROM_NETWORK,
LOAD_FROM_SIMULATOR,
- SEND_HTTP_REQ,
- WAIT_HTTP_REQ,
+ WAIT_HTTP_RESOURCE, // Waiting for HTTP resources
+ WAIT_HTTP_RESOURCE2, // Waiting for HTTP resources
+ SEND_HTTP_REQ, // Commit to sending as HTTP
+ WAIT_HTTP_REQ, // Request sent, wait for completion
DECODE_IMAGE,
DECODE_IMAGE_UPDATE,
WRITE_TO_CACHE,
@@ -256,9 +524,8 @@ private:
F32 mCacheReadTime;
LLTextureCache::handle_t mCacheReadHandle;
LLTextureCache::handle_t mCacheWriteHandle;
- U8* mBuffer;
- S32 mBufferSize;
S32 mRequestedSize;
+ S32 mRequestedOffset;
S32 mDesiredSize;
S32 mFileSize;
S32 mCachedSize;
@@ -273,12 +540,9 @@ private:
BOOL mInCache;
bool mCanUseHTTP ;
bool mCanUseNET ; //can get from asset server.
- S32 mHTTPFailCount;
S32 mRetryAttempt;
S32 mActiveCount;
- U32 mGetStatus;
- U32 mHTTPHandle;
- F32 mDelay;
+ LLCore::HttpStatus mGetStatus;
std::string mGetReason;
// Work Data
@@ -298,105 +562,19 @@ private:
U8 mImageCodec;
LLViewerAssetStats::duration_t mMetricsStartTime;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-
-class HTTPGetResponder : public LLCurl::Responder
-{
- LOG_CLASS(HTTPGetResponder);
-public:
- HTTPGetResponder(LLTextureFetch* fetcher, const LLUUID& id, U64 startTime, S32 requestedSize, U32 offset, bool redir)
- : mFetcher(fetcher), mID(id), mStartTime(startTime), mRequestedSize(requestedSize), mOffset(offset), mFollowRedir(redir)
- {
- }
- ~HTTPGetResponder()
- {
- }
-
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
- {
- static LLCachedControl<bool> log_to_viewer_log(gSavedSettings,"LogTextureDownloadsToViewerLog");
- static LLCachedControl<bool> log_to_sim(gSavedSettings,"LogTextureDownloadsToSimulator");
- static LLCachedControl<bool> log_texture_traffic(gSavedSettings,"LogTextureNetworkTraffic") ;
-
- if (log_to_viewer_log || log_to_sim)
- {
- 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);
- }
-
- S32 data_size = 0;
- 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;
- }
- }
- if (!success)
- {
- worker->setGetStatus(status, reason);
-// llwarns << "CURL GET FAILED, status:" << status << " reason:" << reason << llendl;
- }
-
- data_size = worker->callbackHttpGet(channels, buffer, partial, success);
-
- if(log_texture_traffic && data_size > 0)
- {
- LLViewerTexture* tex = LLViewerTextureManager::findTexture(mID) ;
- if(tex)
- {
- gTotalTextureBytesPerBoostLevel[tex->getBoostLevel()] += data_size ;
- }
- }
-
- if (worker->mMetricsStartTime)
- {
- LLViewerAssetStatsFF::record_response_thread1(LLViewerAssetType::AT_TEXTURE,
- true,
- LLImageBase::TYPE_AVATAR_BAKE == worker->mType,
- LLViewerAssetStatsFF::get_timestamp() - worker->mMetricsStartTime);
- worker->mMetricsStartTime = 0;
- }
- LLViewerAssetStatsFF::record_dequeue_thread1(LLViewerAssetType::AT_TEXTURE,
- true,
- LLImageBase::TYPE_AVATAR_BAKE == worker->mType);
- }
- else
- {
- llwarns << "Worker not found: " << mID << llendl;
- }
-
- mFetcher->getCurlRequest().completeRequest(data_size);
- }
-
- virtual bool followRedir()
- {
- return mFollowRedir;
- }
-
-private:
- LLTextureFetch* mFetcher;
- LLUUID mID;
- U64 mStartTime;
- S32 mRequestedSize;
- U32 mOffset;
- bool mFollowRedir;
+ LLCore::HttpHandle mHttpHandle; // Handle of any active request
+ LLCore::BufferArray * mHttpBufferArray; // Refcounted pointer to response data
+ int mHttpPolicyClass;
+ bool mHttpActive; // Active request to http library
+ unsigned int mHttpReplySize; // Actual received data size
+ unsigned int mHttpReplyOffset; // Actual received data offset
+ bool mHttpHasResource; // Counts against Fetcher's mHttpSemaphore
+
+ // State history
+ U32 mCacheReadCount;
+ U32 mCacheWriteCount;
+ U32 mResourceWaitCount; // Requests entering WAIT_HTTP_RESOURCE2
};
//////////////////////////////////////////////////////////////////////////////
@@ -632,13 +810,15 @@ const char* LLTextureFetchWorker::sStateDescs[] = {
"CACHE_POST",
"LOAD_FROM_NETWORK",
"LOAD_FROM_SIMULATOR",
+ "WAIT_HTTP_RESOURCE",
+ "WAIT_HTTP_RESOURCE2",
"SEND_HTTP_REQ",
"WAIT_HTTP_REQ",
"DECODE_IMAGE",
"DECODE_IMAGE_UPDATE",
"WRITE_TO_CACHE",
"WAIT_ON_WRITE",
- "DONE",
+ "DONE"
};
// static
@@ -654,6 +834,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
S32 discard, // Desired discard
S32 size) // Desired size
: LLWorkerClass(fetcher, "TextureFetch"),
+ LLCore::HttpHandler(),
mState(INIT),
mWriteToCacheState(NOT_WRITE),
mFetcher(fetcher),
@@ -671,9 +852,8 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
mCacheReadTime(0.f),
mCacheReadHandle(LLTextureCache::nullHandle()),
mCacheWriteHandle(LLTextureCache::nullHandle()),
- mBuffer(NULL),
- mBufferSize(0),
mRequestedSize(0),
+ mRequestedOffset(0),
mDesiredSize(TEXTURE_CACHE_ENTRY_SIZE),
mFileSize(0),
mCachedSize(0),
@@ -687,18 +867,24 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
mInLocalCache(FALSE),
mInCache(FALSE),
mCanUseHTTP(true),
- mHTTPFailCount(0),
mRetryAttempt(0),
mActiveCount(0),
- mGetStatus(0),
mWorkMutex(NULL),
mFirstPacket(0),
mLastPacket(-1),
mTotalPackets(0),
mImageCodec(IMG_CODEC_INVALID),
mMetricsStartTime(0),
- mHTTPHandle(0),
- mDelay(-1.f)
+ mHttpHandle(LLCORE_HTTP_HANDLE_INVALID),
+ mHttpBufferArray(NULL),
+ mHttpPolicyClass(mFetcher->mHttpPolicyClass),
+ mHttpActive(false),
+ mHttpReplySize(0U),
+ mHttpReplyOffset(0U),
+ mHttpHasResource(false),
+ mCacheReadCount(0U),
+ mCacheWriteCount(0U),
+ mResourceWaitCount(0U)
{
mCanUseNET = mUrl.empty() ;
@@ -720,7 +906,20 @@ LLTextureFetchWorker::~LLTextureFetchWorker()
// << " Requested=" << mRequestedDiscard
// << " Desired=" << mDesiredDiscard << llendl;
llassert_always(!haveWork());
- lockWorkMutex();
+
+ lockWorkMutex(); // +Mw (should be useless)
+ if (mHttpHasResource)
+ {
+ // Last-chance catchall to recover the resource. Using an
+ // atomic datatype solely because this can be running in
+ // another thread.
+ releaseHttpSemaphore();
+ }
+ if (mHttpActive)
+ {
+ // Issue a cancel on a live request...
+ mFetcher->getHttpRequest().requestCancel(mHttpHandle, NULL);
+ }
if (mCacheReadHandle != LLTextureCache::nullHandle() && mFetcher->mTextureCache)
{
mFetcher->mTextureCache->readComplete(mCacheReadHandle, true);
@@ -731,22 +930,18 @@ LLTextureFetchWorker::~LLTextureFetchWorker()
}
mFormattedImage = NULL;
clearPackets();
- unlockWorkMutex();
-
- removeFromHTTPQueue();
-}
-
-void LLTextureFetchWorker::removeFromHTTPQueue()
-{
- if(mHTTPHandle > 0)
+ if (mHttpBufferArray)
{
- llassert_always(mState == WAIT_HTTP_REQ);
-
- mFetcher->getCurlRequest().removeRequest(mHTTPHandle);
- mHTTPHandle = 0;
+ mHttpBufferArray->release();
+ mHttpBufferArray = NULL;
}
+ unlockWorkMutex(); // -Mw
+ mFetcher->removeFromHTTPQueue(mID, 0);
+ mFetcher->removeHttpWaiter(mID);
+ mFetcher->updateStateStats(mCacheReadCount, mCacheWriteCount, mResourceWaitCount);
}
+// Locks: Mw
void LLTextureFetchWorker::clearPackets()
{
for_each(mPackets.begin(), mPackets.end(), DeletePointer());
@@ -756,6 +951,7 @@ void LLTextureFetchWorker::clearPackets()
mFirstPacket = 0;
}
+// Locks: Mw
void LLTextureFetchWorker::setupPacketData()
{
S32 data_size = 0;
@@ -788,6 +984,7 @@ void LLTextureFetchWorker::setupPacketData()
}
}
+// Locks: Mw (ctor invokes without lock)
U32 LLTextureFetchWorker::calcWorkPriority()
{
//llassert_always(mImagePriority >= 0 && mImagePriority <= LLViewerFetchedTexture::maxDecodePriority());
@@ -797,7 +994,7 @@ U32 LLTextureFetchWorker::calcWorkPriority()
return mWorkPriority;
}
-// mWorkMutex is locked
+// Locks: Mw (ctor invokes without lock)
void LLTextureFetchWorker::setDesiredDiscard(S32 discard, S32 size)
{
bool prioritize = false;
@@ -833,6 +1030,7 @@ void LLTextureFetchWorker::setDesiredDiscard(S32 discard, S32 size)
}
}
+// Locks: Mw
void LLTextureFetchWorker::setImagePriority(F32 priority)
{
// llassert_always(priority >= 0 && priority <= LLViewerTexture::maxDecodePriority());
@@ -842,35 +1040,41 @@ void LLTextureFetchWorker::setImagePriority(F32 priority)
mImagePriority = priority;
calcWorkPriority();
U32 work_priority = mWorkPriority | (getPriority() & LLWorkerThread::PRIORITY_HIGHBITS);
- mFetcher->getCurlRequest().updatePriority(mHTTPHandle, mWorkPriority);
setPriority(work_priority);
}
}
+// Locks: Mw
void LLTextureFetchWorker::resetFormattedData()
{
- FREE_MEM(LLImageBase::getPrivatePool(), mBuffer);
- mBuffer = NULL;
- mBufferSize = 0;
+ if (mHttpBufferArray)
+ {
+ mHttpBufferArray->release();
+ mHttpBufferArray = NULL;
+ }
if (mFormattedImage.notNull())
{
mFormattedImage->deleteData();
}
+ mHttpReplySize = 0;
+ mHttpReplyOffset = 0;
mHaveAllData = FALSE;
}
-// Called from MAIN thread
+// Threads: Tmain
void LLTextureFetchWorker::startWork(S32 param)
{
llassert(mFormattedImage.isNull());
}
-#include "llviewertexturelist.h" // debug
-
-// Called from LLWorkerThread::processRequest()
+// Threads: Ttf
bool LLTextureFetchWorker::doWork(S32 param)
{
- LLMutexLock lock(&mWorkMutex);
+ static const LLCore::HttpStatus http_not_found(HTTP_NOT_FOUND); // 404
+ static const LLCore::HttpStatus http_service_unavail(HTTP_SERVICE_UNAVAILABLE); // 503
+ static const LLCore::HttpStatus http_not_sat(HTTP_REQUESTED_RANGE_NOT_SATISFIABLE); // 416;
+
+ LLMutexLock lock(&mWorkMutex); // +Mw
if ((mFetcher->isQuitting() || getFlags(LLWorkerClass::WCF_DELETE_REQUESTED)))
{
@@ -914,22 +1118,26 @@ bool LLTextureFetchWorker::doWork(S32 param)
mLoadedDiscard = -1;
mDecodedDiscard = -1;
mRequestedSize = 0;
+ mRequestedOffset = 0;
mFileSize = 0;
mCachedSize = 0;
mLoaded = FALSE;
mSentRequest = UNSENT;
mDecoded = FALSE;
mWritten = FALSE;
- FREE_MEM(LLImageBase::getPrivatePool(), mBuffer);
- mBuffer = NULL;
- mBufferSize = 0;
+ if (mHttpBufferArray)
+ {
+ mHttpBufferArray->release();
+ mHttpBufferArray = NULL;
+ }
+ mHttpReplySize = 0;
+ mHttpReplyOffset = 0;
mHaveAllData = FALSE;
clearPackets(); // TODO: Shouldn't be necessary
mCacheReadHandle = LLTextureCache::nullHandle();
mCacheWriteHandle = LLTextureCache::nullHandle();
mState = LOAD_FROM_TEXTURE_CACHE;
mInCache = FALSE;
- mDelay = -1.f;
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;
@@ -945,7 +1153,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
S32 size = mDesiredSize - offset;
if (size <= 0)
{
- mState = CACHE_POST; //have enough data, will fall to decode
+ mState = CACHE_POST;
return false;
}
mFileSize = 0;
@@ -956,6 +1164,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it
// read file from local disk
+ ++mCacheReadCount;
std::string filename = mUrl.substr(7, std::string::npos);
CacheReadResponder* responder = new CacheReadResponder(mFetcher, mID, mFormattedImage);
mCacheReadHandle = mFetcher->mTextureCache->readFromCache(filename, mID, cache_priority,
@@ -966,6 +1175,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
{
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it
+ ++mCacheReadCount;
CacheReadResponder* responder = new CacheReadResponder(mFetcher, mID, mFormattedImage);
mCacheReadHandle = mFetcher->mTextureCache->readFromCache(mID, cache_priority,
offset, size, responder);
@@ -979,7 +1189,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
llwarns << "Unknown URL Type: " << mUrl << llendl;
}
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
- mState = SEND_HTTP_REQ;
+ mState = WAIT_HTTP_RESOURCE;
}
else
{
@@ -1082,7 +1292,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
if (mCanUseHTTP && !mUrl.empty())
{
- mState = SEND_HTTP_REQ;
+ mState = WAIT_HTTP_RESOURCE;
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
if(mWriteToCacheState != NOT_WRITE)
{
@@ -1099,13 +1309,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
mRequestedDiscard = mDesiredDiscard;
mSentRequest = QUEUED;
mFetcher->addToNetworkQueue(this);
- if (! mMetricsStartTime)
- {
- mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();
- }
- LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE,
- false,
- LLImageBase::TYPE_AVATAR_BAKE == mType);
+ recordTextureStart(false);
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
return false;
@@ -1116,12 +1320,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
//llassert_always(mFetcher->mNetworkQueue.find(mID) != mFetcher->mNetworkQueue.end());
// Make certain this is in the network queue
//mFetcher->addToNetworkQueue(this);
- //if (! mMetricsStartTime)
- //{
- // mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();
- //}
- //LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE, false,
- // LLImageBase::TYPE_AVATAR_BAKE == mType);
+ //recordTextureStart(false);
//setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
return false;
}
@@ -1146,193 +1345,201 @@ bool LLTextureFetchWorker::doWork(S32 param)
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
mState = DECODE_IMAGE;
mWriteToCacheState = SHOULD_WRITE;
-
- if (mMetricsStartTime)
- {
- LLViewerAssetStatsFF::record_response_thread1(LLViewerAssetType::AT_TEXTURE,
- false,
- LLImageBase::TYPE_AVATAR_BAKE == mType,
- LLViewerAssetStatsFF::get_timestamp() - mMetricsStartTime);
- mMetricsStartTime = 0;
- }
- LLViewerAssetStatsFF::record_dequeue_thread1(LLViewerAssetType::AT_TEXTURE,
- false,
- LLImageBase::TYPE_AVATAR_BAKE == mType);
+ recordTextureDone(false);
}
else
{
mFetcher->addToNetworkQueue(this); // failsafe
- if (! mMetricsStartTime)
- {
- mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();
- }
- LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE,
- false,
- LLImageBase::TYPE_AVATAR_BAKE == mType);
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
+ recordTextureStart(false);
}
return false;
}
+ if (mState == WAIT_HTTP_RESOURCE)
+ {
+ // NOTE:
+ // control the number of the http requests issued for:
+ // 1, not openning too many file descriptors at the same time;
+ // 2, control the traffic of http so udp gets bandwidth.
+ //
+ // If it looks like we're busy, keep this request here.
+ // Otherwise, advance into the HTTP states.
+ if (mFetcher->getHttpWaitersCount() || ! acquireHttpSemaphore())
+ {
+ mState = WAIT_HTTP_RESOURCE2;
+ setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
+ mFetcher->addHttpWaiter(this->mID);
+ ++mResourceWaitCount;
+ return false;
+ }
+
+ mState = SEND_HTTP_REQ;
+ // *NOTE: You must invoke releaseHttpSemaphore() if you transition
+ // to a state other than SEND_HTTP_REQ or WAIT_HTTP_REQ or abort
+ // the request.
+ }
+
+ if (mState == WAIT_HTTP_RESOURCE2)
+ {
+ // Just idle it if we make it to the head...
+ return false;
+ }
+
if (mState == SEND_HTTP_REQ)
{
- if(mCanUseHTTP)
+ if (! mCanUseHTTP)
{
- mFetcher->removeFromNetworkQueue(this, false);
+ releaseHttpSemaphore();
+ return true; // abort
+ }
+
+ mFetcher->removeFromNetworkQueue(this, false);
- S32 cur_size = 0;
- if (mFormattedImage.notNull())
+ S32 cur_size = 0;
+ if (mFormattedImage.notNull())
+ {
+ cur_size = mFormattedImage->getDataSize(); // amount of data we already have
+ if (mFormattedImage->getDiscardLevel() == 0)
{
- cur_size = mFormattedImage->getDataSize(); // amount of data we already have
- if (mFormattedImage->getDiscardLevel() == 0)
- {
- if(cur_size > 0)
- {
- // We already have all the data, just decode it
- mLoadedDiscard = mFormattedImage->getDiscardLevel();
- setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
- mState = DECODE_IMAGE;
- return false;
- }
- else
- {
- return true ; //abort.
- }
- }
- }
- mRequestedSize = mDesiredSize;
- mRequestedDiscard = mDesiredDiscard;
- mRequestedSize -= cur_size;
- S32 offset = cur_size;
- mBufferSize = cur_size; // This will get modified by callbackHttpGet()
-
- bool res = false;
- if (!mUrl.empty())
- {
- mRequestedTimer.reset();
-
- mLoaded = FALSE;
- mGetStatus = 0;
- mGetReason.clear();
- LL_DEBUGS("Texture") << "HTTP GET: " << mID << " Offset: " << offset
- << " Bytes: " << mRequestedSize
- << " Bandwidth(kbps): " << mFetcher->getTextureBandwidth() << "/" << mFetcher->mMaxBandwidth
- << LL_ENDL;
- setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
- mState = WAIT_HTTP_REQ;
-
- if (! mMetricsStartTime)
+ if (cur_size > 0)
{
- mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();
+ // We already have all the data, just decode it
+ mLoadedDiscard = mFormattedImage->getDiscardLevel();
+ setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
+ mState = DECODE_IMAGE;
+ releaseHttpSemaphore();
+ return false;
}
- LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE,
- true,
- LLImageBase::TYPE_AVATAR_BAKE == mType);
-
- // Will call callbackHttpGet when curl request completes
- std::vector<std::string> headers;
- headers.push_back("Accept: image/x-j2c");
- // If we try to fetch the whole file, we set the size to 0 so that we generate the correct curl range request
- // Note: it looks a bit hacky but we need to limit this (size==0) to mean "whole file" to HTTP only as it messes up UDP fetching
- if ((offset+mRequestedSize) == MAX_IMAGE_DATA_SIZE)
+ else
{
- mRequestedSize = 0;
+ releaseHttpSemaphore();
+ return true; // abort.
}
- mHTTPHandle = mFetcher->mCurlGetRequest->getByteRange(mUrl, headers, offset, mRequestedSize, mWorkPriority,
- new HTTPGetResponder(mFetcher, mID, LLTimer::getTotalTime(), mRequestedSize, offset, true), mDelay);
- mDelay = -1.f; //reset
- res = true;
- }
- if (!res)
- {
- llwarns << "HTTP GET request failed for " << mID << llendl;
- resetFormattedData();
- ++mHTTPFailCount;
- return true; // failed
}
- // fall through
}
- else //can not use http fetch.
+ mRequestedSize = mDesiredSize;
+ mRequestedDiscard = mDesiredDiscard;
+ mRequestedSize -= cur_size;
+ mRequestedOffset = cur_size;
+ if (mRequestedOffset)
{
- return true ; //abort
+ // Texture fetching often issues 'speculative' loads that
+ // start beyond the end of the actual asset. Some cache/web
+ // systems, e.g. Varnish, will respond to this not with a
+ // 416 but with a 200 and the entire asset in the response
+ // body. By ensuring that we always have a partially
+ // satisfiable Range request, we avoid that hit to the network.
+ // We just have to deal with the overlapping data which is made
+ // somewhat harder by the fact that grid services don't necessarily
+ // return the Content-Range header on 206 responses. *Sigh*
+ mRequestedOffset -= 1;
+ mRequestedSize += 1;
}
+
+ mHttpHandle = LLCORE_HTTP_HANDLE_INVALID;
+ if (!mUrl.empty())
+ {
+ mRequestedTimer.reset();
+ mLoaded = FALSE;
+ mGetStatus = LLCore::HttpStatus();
+ mGetReason.clear();
+ LL_DEBUGS("Texture") << "HTTP GET: " << mID << " Offset: " << mRequestedOffset
+ << " Bytes: " << mRequestedSize
+ << " Bandwidth(kbps): " << mFetcher->getTextureBandwidth() << "/" << mFetcher->mMaxBandwidth
+ << LL_ENDL;
+
+ // Will call callbackHttpGet when curl request completes
+ mHttpHandle = mFetcher->mHttpRequest->requestGetByteRange(mHttpPolicyClass,
+ mWorkPriority,
+ mUrl,
+ mRequestedOffset,
+ mRequestedSize,
+ mFetcher->mHttpOptions,
+ mFetcher->mHttpHeaders,
+ this);
+ }
+ if (LLCORE_HTTP_HANDLE_INVALID == mHttpHandle)
+ {
+ llwarns << "HTTP GET request failed for " << mID << llendl;
+ resetFormattedData();
+ releaseHttpSemaphore();
+ return true; // failed
+ }
+
+ mHttpActive = true;
+ mFetcher->addToHTTPQueue(mID);
+ recordTextureStart(true);
+ setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
+ mState = WAIT_HTTP_REQ;
+
+ // fall through
}
if (mState == WAIT_HTTP_REQ)
{
+ // *NOTE: As stated above, all transitions out of this state should
+ // call releaseHttpSemaphore().
if (mLoaded)
{
S32 cur_size = mFormattedImage.notNull() ? mFormattedImage->getDataSize() : 0;
if (mRequestedSize < 0)
{
- S32 max_attempts;
- if (mGetStatus == HTTP_NOT_FOUND)
+ if (http_not_found == mGetStatus)
{
if(mWriteToCacheState == NOT_WRITE) //map tiles
{
mState = DONE;
+ releaseHttpSemaphore();
return true; // failed, means no map tile on the empty region.
}
- mHTTPFailCount = max_attempts = 1; // Don't retry
llwarns << "Texture missing from server (404): " << mUrl << llendl;
- //roll back to try UDP
- if(mCanUseNET)
+ // roll back to try UDP
+ if (mCanUseNET)
{
- mState = INIT ;
- mCanUseHTTP = false ;
+ mState = INIT;
+ mCanUseHTTP = false;
mUrl.clear();
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
- return false ;
+ releaseHttpSemaphore();
+ return false;
}
}
- else if (mGetStatus == HTTP_SERVICE_UNAVAILABLE)
+ else if (http_service_unavail == mGetStatus)
{
- // *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;
- mDelay = 2.0f; //delay 2 second to re-issue the http request
+ }
+ else if (http_not_sat == mGetStatus)
+ {
+ // Allowed, we'll accept whatever data we have as complete.
+ mHaveAllData = TRUE;
}
else
{
- const S32 HTTP_MAX_RETRY_COUNT = 3;
- max_attempts = HTTP_MAX_RETRY_COUNT + 1;
- ++mHTTPFailCount;
- mDelay = 2.0f; //delay 2 second to re-issue the http request
-
llinfos << "HTTP GET failed for: " << mUrl
- << " Status: " << mGetStatus << " Reason: '" << mGetReason << "'"
- << " Attempt:" << mHTTPFailCount+1 << "/" << max_attempts << llendl;
+ << " Status: " << mGetStatus.toHex()
+ << " Reason: '" << mGetReason << "'"
+ << llendl;
}
- if (mHTTPFailCount >= max_attempts)
- {
- mUrl.clear();
- if (cur_size > 0)
- {
- // Use available data
- mLoadedDiscard = mFormattedImage->getDiscardLevel();
- setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
- mState = DECODE_IMAGE;
- return false;
- }
- else
- {
- resetFormattedData();
- mState = DONE;
- return true; // failed
- }
- }
- else
+ mUrl.clear();
+ if (cur_size > 0)
{
+ // Use available data
+ mLoadedDiscard = mFormattedImage->getDiscardLevel();
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
- mState = SEND_HTTP_REQ;
- return false; // retry
+ mState = DECODE_IMAGE;
+ releaseHttpSemaphore();
+ return false;
}
+
+ // Fail harder
+ resetFormattedData();
+ mState = DONE;
+ releaseHttpSemaphore();
+ return true; // failed
}
// Clear the url since we're done with the fetch
@@ -1342,18 +1549,46 @@ bool LLTextureFetchWorker::doWork(S32 param)
{
mUrl.clear();
}
-
- llassert_always(mBufferSize == cur_size + mRequestedSize);
- if(!mBufferSize)//no data received.
+
+ if (! mHttpBufferArray || ! mHttpBufferArray->size())
{
- FREE_MEM(LLImageBase::getPrivatePool(), mBuffer);
- mBuffer = NULL;
+ // no data received.
+ if (mHttpBufferArray)
+ {
+ mHttpBufferArray->release();
+ mHttpBufferArray = NULL;
+ }
- //abort.
+ // abort.
mState = DONE;
+ releaseHttpSemaphore();
return true;
}
+ S32 append_size(mHttpBufferArray->size());
+ S32 total_size(cur_size + append_size);
+ S32 src_offset(0);
+ llassert_always(append_size == mRequestedSize);
+ if (mHttpReplyOffset && mHttpReplyOffset != cur_size)
+ {
+ // In case of a partial response, our offset may
+ // not be trivially contiguous with the data we have.
+ // Get back into alignment.
+ if (mHttpReplyOffset > cur_size)
+ {
+ LL_WARNS("Texture") << "Partial HTTP response produces break in image data for texture "
+ << mID << ". Aborting load." << LL_ENDL;
+ mState = DONE;
+ releaseHttpSemaphore();
+ return true;
+ }
+ src_offset = cur_size - mHttpReplyOffset;
+ append_size -= src_offset;
+ total_size -= src_offset;
+ mRequestedSize -= src_offset; // Make requested values reflect useful part
+ mRequestedOffset += src_offset;
+ }
+
if (mFormattedImage.isNull())
{
// For now, create formatted image based on extension
@@ -1365,41 +1600,50 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
}
- if (mHaveAllData && mRequestedDiscard == 0) //the image file is fully loaded.
+ if (mHaveAllData) //the image file is fully loaded.
{
- mFileSize = mBufferSize;
+ mFileSize = total_size;
}
else //the file size is unknown.
{
- mFileSize = mBufferSize + 1 ; //flag the file is not fully loaded.
+ mFileSize = total_size + 1 ; //flag the file is not fully loaded.
}
- U8* buffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), mBufferSize);
+ U8 * buffer = (U8 *) ALLOCATE_MEM(LLImageBase::getPrivatePool(), total_size);
if (cur_size > 0)
{
memcpy(buffer, mFormattedImage->getData(), cur_size);
}
- memcpy(buffer + cur_size, mBuffer, mRequestedSize); // append
+ mHttpBufferArray->read(src_offset, (char *) buffer + cur_size, append_size);
+
// NOTE: setData releases current data and owns new data (buffer)
- mFormattedImage->setData(buffer, mBufferSize);
- // delete temp data
- FREE_MEM(LLImageBase::getPrivatePool(), mBuffer); // Note: not 'buffer' (assigned in setData())
- mBuffer = NULL;
- mBufferSize = 0;
+ mFormattedImage->setData(buffer, total_size);
+
+ // Done with buffer array
+ mHttpBufferArray->release();
+ mHttpBufferArray = NULL;
+ mHttpReplySize = 0;
+ mHttpReplyOffset = 0;
+
mLoadedDiscard = mRequestedDiscard;
mState = DECODE_IMAGE;
- if(mWriteToCacheState != NOT_WRITE)
+ if (mWriteToCacheState != NOT_WRITE)
{
mWriteToCacheState = SHOULD_WRITE ;
}
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
+ releaseHttpSemaphore();
return false;
}
else
{
- //
- //No need to timeout, the responder should be triggered automatically.
- //
+ // *HISTORY: There was a texture timeout test here originally that
+ // would cancel a request that was over 120 seconds old. That's
+ // probably not a good idea. Particularly rich regions can take
+ // an enormous amount of time to load textures. We'll revisit the
+ // various possible timeout components (total request time, connection
+ // time, I/O time, with and without retries, etc.) in the future.
+
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
return false;
}
@@ -1408,11 +1652,12 @@ bool LLTextureFetchWorker::doWork(S32 param)
if (mState == DECODE_IMAGE)
{
static LLCachedControl<bool> textures_decode_disabled(gSavedSettings,"TextureDecodeDisabled");
- if(textures_decode_disabled)
+
+ setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it
+ if (textures_decode_disabled)
{
// for debug use, don't decode
mState = DONE;
- setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
return true;
}
@@ -1420,7 +1665,6 @@ bool LLTextureFetchWorker::doWork(S32 param)
{
// We aborted, don't decode
mState = DONE;
- setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
return true;
}
@@ -1430,7 +1674,6 @@ bool LLTextureFetchWorker::doWork(S32 param)
//abort, don't decode
mState = DONE;
- setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
return true;
}
if (mLoadedDiscard < 0)
@@ -1439,10 +1682,9 @@ bool LLTextureFetchWorker::doWork(S32 param)
//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(mFormattedImage.notNull());
@@ -1528,6 +1770,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
U32 cache_priority = mWorkPriority;
mWritten = FALSE;
mState = WAIT_ON_WRITE;
+ ++mCacheWriteCount;
CacheWriteResponder* responder = new CacheWriteResponder(mFetcher, mID);
mCacheWriteHandle = mFetcher->mTextureCache->writeToCache(mID, cache_priority,
mFormattedImage->getData(), datasize,
@@ -1572,9 +1815,84 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
return false;
-}
+} // -Mw
-// Called from MAIN thread
+// Threads: Ttf
+// virtual
+void LLTextureFetchWorker::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response)
+{
+ static LLCachedControl<bool> log_to_viewer_log(gSavedSettings, "LogTextureDownloadsToViewerLog");
+ static LLCachedControl<bool> log_to_sim(gSavedSettings, "LogTextureDownloadsToSimulator");
+ static LLCachedControl<bool> log_texture_traffic(gSavedSettings, "LogTextureNetworkTraffic") ;
+
+ LLMutexLock lock(&mWorkMutex); // +Mw
+
+ mHttpActive = false;
+
+ if (log_to_viewer_log || log_to_sim)
+ {
+ U64 timeNow = LLTimer::getTotalTime();
+ mFetcher->mTextureInfo.setRequestStartTime(mID, mMetricsStartTime);
+ mFetcher->mTextureInfo.setRequestType(mID, LLTextureInfoDetails::REQUEST_TYPE_HTTP);
+ mFetcher->mTextureInfo.setRequestSize(mID, mRequestedSize);
+ mFetcher->mTextureInfo.setRequestOffset(mID, mRequestedOffset);
+ mFetcher->mTextureInfo.setRequestCompleteTimeAndLog(mID, timeNow);
+ }
+
+ bool success = true;
+ bool partial = false;
+ LLCore::HttpStatus status(response->getStatus());
+
+ lldebugs << "HTTP COMPLETE: " << mID
+ << " status: " << status.toHex()
+ << " '" << status.toString() << "'"
+ << llendl;
+// unsigned int offset(0), length(0), full_length(0);
+// response->getRange(&offset, &length, &full_length);
+// llwarns << "HTTP COMPLETE: " << mID << " handle: " << handle
+// << " status: " << status.toULong() << " '" << status.toString() << "'"
+// << " req offset: " << mRequestedOffset << " req length: " << mRequestedSize
+// << " offset: " << offset << " length: " << length
+// << llendl;
+
+ if (! status)
+ {
+ success = false;
+ std::string reason(status.toString());
+ setGetStatus(status, reason);
+ llwarns << "CURL GET FAILED, status: " << status.toHex()
+ << " reason: " << reason << llendl;
+ }
+ else
+ {
+ // A warning about partial (HTTP 206) data. Some grid services
+ // do *not* return a 'Content-Range' header in the response to
+ // Range requests with a 206 status. We're forced to assume
+ // we get what we asked for in these cases until we can fix
+ // the services.
+ static const LLCore::HttpStatus par_status(HTTP_PARTIAL_CONTENT);
+
+ partial = (par_status == status);
+ }
+
+ S32 data_size = callbackHttpGet(response, partial, success);
+
+ if (log_texture_traffic && data_size > 0)
+ {
+ LLViewerTexture* tex = LLViewerTextureManager::findTexture(mID);
+ if (tex)
+ {
+ gTotalTextureBytesPerBoostLevel[tex->getBoostLevel()] += data_size ;
+ }
+ }
+
+ mFetcher->removeFromHTTPQueue(mID, data_size);
+
+ recordTextureDone(true);
+} // -Mw
+
+
+// Threads: Tmain
void LLTextureFetchWorker::endWork(S32 param, bool aborted)
{
if (mDecodeHandle != 0)
@@ -1587,6 +1905,8 @@ void LLTextureFetchWorker::endWork(S32 param, bool aborted)
//////////////////////////////////////////////////////////////////////////////
+// Threads: Ttf
+
// virtual
void LLTextureFetchWorker::finishWork(S32 param, bool completed)
{
@@ -1603,10 +1923,37 @@ void LLTextureFetchWorker::finishWork(S32 param, bool completed)
}
}
+// LLQueuedThread's update() method is asking if it's okay to
+// delete this worker. You'll notice we're not locking in here
+// which is a slight concern. Caller is expected to have made
+// this request 'quiet' by whatever means...
+//
+// Threads: Tmain
+
// virtual
bool LLTextureFetchWorker::deleteOK()
{
bool delete_ok = true;
+
+ if (mHttpActive)
+ {
+ // HTTP library has a pointer to this worker
+ // and will dereference it to do notification.
+ delete_ok = false;
+ }
+
+ if (WAIT_HTTP_RESOURCE2 == mState)
+ {
+ if (mFetcher->isHttpWaiter(mID))
+ {
+ // Don't delete the worker out from under the releaseHttpWaiters()
+ // method. Keep the pointers valid, clean up after that method
+ // has recognized the cancelation and removed the UUID from the
+ // waiter list.
+ delete_ok = false;
+ }
+ }
+
// Allow any pending reads or writes to complete
if (mCacheReadHandle != LLTextureCache::nullHandle())
{
@@ -1641,6 +1988,7 @@ bool LLTextureFetchWorker::deleteOK()
return delete_ok;
}
+// Threads: Ttf
void LLTextureFetchWorker::removeFromCache()
{
if (!mInLocalCache)
@@ -1652,6 +2000,8 @@ void LLTextureFetchWorker::removeFromCache()
//////////////////////////////////////////////////////////////////////////////
+// Threads: Ttf
+// Locks: Mw
bool LLTextureFetchWorker::processSimulatorPackets()
{
if (mFormattedImage.isNull() || mRequestedSize < 0)
@@ -1712,14 +2062,13 @@ bool LLTextureFetchWorker::processSimulatorPackets()
//////////////////////////////////////////////////////////////////////////////
-S32 LLTextureFetchWorker::callbackHttpGet(const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer,
- bool partial, bool success)
+// Threads: Ttf
+// Locks: Mw
+S32 LLTextureFetchWorker::callbackHttpGet(LLCore::HttpResponse * response,
+ bool partial, bool success)
{
S32 data_size = 0 ;
- LLMutexLock lock(&mWorkMutex);
- mHTTPHandle = 0;
if (mState != WAIT_HTTP_REQ)
{
llwarns << "callbackHttpGet for unrequested fetch worker: " << mID
@@ -1734,27 +2083,69 @@ S32 LLTextureFetchWorker::callbackHttpGet(const LLChannelDescriptors& channels,
if (success)
{
// get length of stream:
- data_size = buffer->countAfter(channels.in(), NULL);
-
+ LLCore::BufferArray * body(response->getBody());
+ data_size = body ? body->size() : 0;
+
LL_DEBUGS("Texture") << "HTTP RECEIVED: " << mID.asString() << " Bytes: " << data_size << LL_ENDL;
if (data_size > 0)
{
+ LLViewerStatsRecorder::instance().textureFetch(data_size);
// *TODO: set the formatted image data here directly to avoid the copy
- mBuffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), data_size);
- buffer->readAfter(channels.in(), NULL, mBuffer, data_size);
- mBufferSize += data_size;
- if (mRequestedSize == 0)
+
+ // Hold on to body for later copy
+ llassert_always(NULL == mHttpBufferArray);
+ body->addRef();
+ mHttpBufferArray = body;
+
+ if (partial)
+ {
+ unsigned int offset(0), length(0), full_length(0);
+ response->getRange(&offset, &length, &full_length);
+ if (! offset && ! length)
+ {
+ // This is the case where we receive a 206 status but
+ // there wasn't a useful Content-Range header in the response.
+ // This could be because it was badly formatted but is more
+ // likely due to capabilities services which scrub headers
+ // from responses. Assume we got what we asked for...
+ mHttpReplySize = data_size;
+ mHttpReplyOffset = mRequestedOffset;
+ }
+ else
+ {
+ mHttpReplySize = length;
+ mHttpReplyOffset = offset;
+ }
+ }
+
+ if (! partial)
+ {
+ // Response indicates this is the entire asset regardless
+ // of our asking for a byte range. Mark it so and drop
+ // any partial data we might have so that the current
+ // response body becomes the entire dataset.
+ if (data_size <= mRequestedOffset)
+ {
+ LL_WARNS("Texture") << "Fetched entire texture " << mID
+ << " when it was expected to be marked complete. mImageSize: "
+ << mFileSize << " datasize: " << mFormattedImage->getDataSize()
+ << LL_ENDL;
+ }
+ mHaveAllData = TRUE;
+ llassert_always(mDecodeHandle == 0);
+ mFormattedImage = NULL; // discard any previous data we had
+ }
+ else if (data_size < mRequestedSize)
{
mHaveAllData = TRUE;
}
else if (data_size > mRequestedSize)
{
- // *TODO: This shouldn't be happening any more
+ // *TODO: This shouldn't be happening any more (REALLY don't expect this anymore)
llwarns << "data_size = " << data_size << " > requested: " << mRequestedSize << llendl;
mHaveAllData = TRUE;
llassert_always(mDecodeHandle == 0);
mFormattedImage = NULL; // discard any previous data we had
- mBufferSize = data_size;
}
}
else
@@ -1773,15 +2164,17 @@ S32 LLTextureFetchWorker::callbackHttpGet(const LLChannelDescriptors& channels,
mLoaded = TRUE;
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
+ LLViewerStatsRecorder::instance().log(0.2f);
return data_size ;
}
//////////////////////////////////////////////////////////////////////////////
+// Threads: Ttc
void LLTextureFetchWorker::callbackCacheRead(bool success, LLImageFormatted* image,
S32 imagesize, BOOL islocal)
{
- LLMutexLock lock(&mWorkMutex);
+ LLMutexLock lock(&mWorkMutex); // +Mw
if (mState != LOAD_FROM_TEXTURE_CACHE)
{
// llwarns << "Read callback for " << mID << " with state = " << mState << llendl;
@@ -1801,11 +2194,12 @@ void LLTextureFetchWorker::callbackCacheRead(bool success, LLImageFormatted* ima
}
mLoaded = TRUE;
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
-}
+} // -Mw
+// Threads: Ttc
void LLTextureFetchWorker::callbackCacheWrite(bool success)
{
- LLMutexLock lock(&mWorkMutex);
+ LLMutexLock lock(&mWorkMutex); // +Mw
if (mState != WAIT_ON_WRITE)
{
// llwarns << "Write callback for " << mID << " with state = " << mState << llendl;
@@ -1813,13 +2207,14 @@ void LLTextureFetchWorker::callbackCacheWrite(bool success)
}
mWritten = TRUE;
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
-}
+} // -Mw
//////////////////////////////////////////////////////////////////////////////
+// Threads: Tid
void LLTextureFetchWorker::callbackDecoded(bool success, LLImageRaw* raw, LLImageRaw* aux)
{
- LLMutexLock lock(&mWorkMutex);
+ LLMutexLock lock(&mWorkMutex); // +Mw
if (mDecodeHandle == 0)
{
return; // aborted, ignore
@@ -1852,10 +2247,11 @@ void LLTextureFetchWorker::callbackDecoded(bool success, LLImageRaw* raw, LLImag
// llinfos << mID << " : DECODE COMPLETE " << llendl;
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
mCacheReadTime = mCacheReadTimer.getElapsedTimeF32();
-}
+} // -Mw
//////////////////////////////////////////////////////////////////////////////
+// Threads: Ttf
bool LLTextureFetchWorker::writeToCacheComplete()
{
// Complete write to cache
@@ -1878,6 +2274,36 @@ bool LLTextureFetchWorker::writeToCacheComplete()
}
+// Threads: Ttf
+void LLTextureFetchWorker::recordTextureStart(bool is_http)
+{
+ if (! mMetricsStartTime)
+ {
+ mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();
+ }
+ LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE,
+ is_http,
+ LLImageBase::TYPE_AVATAR_BAKE == mType);
+}
+
+
+// Threads: Ttf
+void LLTextureFetchWorker::recordTextureDone(bool is_http)
+{
+ if (mMetricsStartTime)
+ {
+ LLViewerAssetStatsFF::record_response_thread1(LLViewerAssetType::AT_TEXTURE,
+ is_http,
+ LLImageBase::TYPE_AVATAR_BAKE == mType,
+ LLViewerAssetStatsFF::get_timestamp() - mMetricsStartTime);
+ mMetricsStartTime = 0;
+ }
+ LLViewerAssetStatsFF::record_dequeue_thread1(LLViewerAssetType::AT_TEXTURE,
+ is_http,
+ LLImageBase::TYPE_AVATAR_BAKE == mType);
+}
+
+
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// public
@@ -1893,14 +2319,23 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image
mTextureCache(cache),
mImageDecodeThread(imagedecodethread),
mTextureBandwidth(0),
- mCurlGetRequest(NULL),
+ mHTTPTextureBits(0),
+ mTotalHTTPRequests(0),
mQAMode(qa_mode),
+ mHttpRequest(NULL),
+ mHttpOptions(NULL),
+ mHttpHeaders(NULL),
+ mHttpMetricsHeaders(NULL),
+ mHttpPolicyClass(LLCore::HttpRequest::DEFAULT_POLICY_ID),
+ mHttpSemaphore(HTTP_REQUESTS_IN_QUEUE_HIGH_WATER),
+ mTotalCacheReadCount(0U),
+ mTotalCacheWriteCount(0U),
+ mTotalResourceWaitCount(0U),
mFetchDebugger(NULL),
mFetchSource(LLTextureFetch::FROM_ALL),
mOriginFetchSource(LLTextureFetch::FROM_ALL),
mFetcherLocked(FALSE)
{
- mCurlPOSTRequestCount = 0;
mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS");
mTextureInfo.setUpLogging(gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog"), gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"), gSavedSettings.getU32("TextureLoggingThreshold"));
@@ -1916,11 +2351,19 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image
}
mOriginFetchSource = mFetchSource;
}
+
+ mHttpRequest = new LLCore::HttpRequest;
+ mHttpOptions = new LLCore::HttpOptions;
+ mHttpHeaders = new LLCore::HttpHeaders;
+ mHttpHeaders->mHeaders.push_back("Accept: image/x-j2c");
+ mHttpMetricsHeaders = new LLCore::HttpHeaders;
+ mHttpMetricsHeaders->mHeaders.push_back("Content-Type: application/llsd+xml");
+ mHttpPolicyClass = LLAppViewer::instance()->getAppCoreHttp().getPolicyDefault();
}
LLTextureFetch::~LLTextureFetch()
{
- clearDeleteList() ;
+ clearDeleteList();
while (! mCommands.empty())
{
@@ -1928,10 +2371,34 @@ LLTextureFetch::~LLTextureFetch()
mCommands.erase(mCommands.begin());
delete req;
}
+
+ if (mHttpOptions)
+ {
+ mHttpOptions->release();
+ mHttpOptions = NULL;
+ }
+
+ if (mHttpHeaders)
+ {
+ mHttpHeaders->release();
+ mHttpHeaders = NULL;
+ }
+
+ if (mHttpMetricsHeaders)
+ {
+ mHttpMetricsHeaders->release();
+ mHttpMetricsHeaders = NULL;
+ }
+
+ mHttpWaitResource.clear();
- // ~LLQueuedThread() called here
+ delete mHttpRequest;
+ mHttpRequest = NULL;
delete mFetchDebugger;
+ mFetchDebugger = NULL;
+
+ // ~LLQueuedThread() called here
}
bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, const LLHost& host, F32 priority,
@@ -1997,7 +2464,7 @@ bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, con
{
return false; // need to wait for previous aborted request to complete
}
- worker->lockWorkMutex();
+ worker->lockWorkMutex(); // +Mw
worker->mActiveCount++;
worker->mNeedsAux = needs_aux;
worker->setImagePriority(priority);
@@ -2006,41 +2473,44 @@ bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, con
if (!worker->haveWork())
{
worker->mState = LLTextureFetchWorker::INIT;
- worker->unlockWorkMutex();
+ worker->unlockWorkMutex(); // -Mw
worker->addWork(0, LLWorkerThread::PRIORITY_HIGH | worker->mWorkPriority);
}
else
{
- worker->unlockWorkMutex();
+ worker->unlockWorkMutex(); // -Mw
}
}
else
{
worker = new LLTextureFetchWorker(this, url, id, host, priority, desired_discard, desired_size);
- lockQueue() ;
+ lockQueue(); // +Mfq
mRequestMap[id] = worker;
- unlockQueue() ;
+ unlockQueue(); // -Mfq
- worker->lockWorkMutex();
+ worker->lockWorkMutex(); // +Mw
worker->mActiveCount++;
worker->mNeedsAux = needs_aux;
worker->setCanUseHTTP(can_use_http) ;
- worker->unlockWorkMutex();
+ worker->unlockWorkMutex(); // -Mw
}
// llinfos << "REQUESTED: " << id << " Discard: " << desired_discard << llendl;
return true;
}
+
+// Threads: T* (but Ttf in practice)
+
// protected
void LLTextureFetch::addToNetworkQueue(LLTextureFetchWorker* worker)
{
- lockQueue() ;
+ lockQueue(); // +Mfq
bool in_request_map = (mRequestMap.find(worker->mID) != mRequestMap.end()) ;
- unlockQueue() ;
+ unlockQueue(); // -Mfq
- LLMutexLock lock(&mNetworkQueueMutex);
+ LLMutexLock lock(&mNetworkQueueMutex); // +Mfnq
if (in_request_map)
{
// only add to the queue if in the request map
@@ -2052,27 +2522,68 @@ void LLTextureFetch::addToNetworkQueue(LLTextureFetchWorker* worker)
{
iter1->second.erase(worker->mID);
}
-}
+} // -Mfnq
+// Threads: T*
void LLTextureFetch::removeFromNetworkQueue(LLTextureFetchWorker* worker, bool cancel)
{
- LLMutexLock lock(&mNetworkQueueMutex);
+ LLMutexLock lock(&mNetworkQueueMutex); // +Mfnq
size_t erased = mNetworkQueue.erase(worker->mID);
if (cancel && erased > 0)
{
mCancelQueue[worker->mHost].insert(worker->mID);
}
-}
+} // -Mfnq
+
+// Threads: T*
+//
+// protected
+void LLTextureFetch::addToHTTPQueue(const LLUUID& id)
+{
+ LLMutexLock lock(&mNetworkQueueMutex); // +Mfnq
+ mHTTPTextureQueue.insert(id);
+ mTotalHTTPRequests++;
+} // -Mfnq
+// Threads: T*
+void LLTextureFetch::removeFromHTTPQueue(const LLUUID& id, S32 received_size)
+{
+ LLMutexLock lock(&mNetworkQueueMutex); // +Mfnq
+ mHTTPTextureQueue.erase(id);
+ mHTTPTextureBits += received_size * 8; // Approximate - does not include header bits
+} // -Mfnq
+
+// NB: If you change deleteRequest() you should probably make
+// parallel changes in removeRequest(). They're functionally
+// identical with only argument variations.
+//
+// Threads: T*
void LLTextureFetch::deleteRequest(const LLUUID& id, bool cancel)
{
- lockQueue() ;
+ lockQueue(); // +Mfq
LLTextureFetchWorker* worker = getWorkerAfterLock(id);
- unlockQueue() ;
+ if (worker)
+ {
+ size_t erased_1 = mRequestMap.erase(worker->mID);
+ unlockQueue(); // -Mfq
+
+ llassert_always(erased_1 > 0) ;
+ removeFromNetworkQueue(worker, cancel);
+ llassert_always(!(worker->getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) ;
- removeRequest(worker, cancel);
+ worker->scheduleDelete();
+ }
+ else
+ {
+ unlockQueue(); // -Mfq
+ }
}
+// NB: If you change removeRequest() you should probably make
+// parallel changes in deleteRequest(). They're functionally
+// identical with only argument variations.
+//
+// Threads: T*
void LLTextureFetch::removeRequest(LLTextureFetchWorker* worker, bool cancel)
{
if(!worker)
@@ -2080,15 +2591,14 @@ void LLTextureFetch::removeRequest(LLTextureFetchWorker* worker, bool cancel)
return;
}
- lockQueue() ;
+ lockQueue(); // +Mfq
size_t erased_1 = mRequestMap.erase(worker->mID);
- unlockQueue() ;
+ unlockQueue(); // -Mfq
llassert_always(erased_1 > 0) ;
removeFromNetworkQueue(worker, cancel);
llassert_always(!(worker->getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) ;
- worker->removeFromHTTPQueue();
worker->scheduleDelete();
}
@@ -2110,16 +2620,39 @@ void LLTextureFetch::deleteAllRequests()
}
}
+// Threads: T*
S32 LLTextureFetch::getNumRequests()
{
- lockQueue() ;
+ lockQueue(); // +Mfq
S32 size = (S32)mRequestMap.size();
- unlockQueue() ;
+ unlockQueue(); // -Mfq
- return size ;
+ return size;
+}
+
+// Threads: T*
+S32 LLTextureFetch::getNumHTTPRequests()
+{
+ mNetworkQueueMutex.lock(); // +Mfq
+ S32 size = (S32)mHTTPTextureQueue.size();
+ mNetworkQueueMutex.unlock(); // -Mfq
+
+ return size;
+}
+
+// Threads: T*
+U32 LLTextureFetch::getTotalNumHTTPRequests()
+{
+ mNetworkQueueMutex.lock(); // +Mfq
+ U32 size = mTotalHTTPRequests;
+ mNetworkQueueMutex.unlock(); // -Mfq
+
+ return size;
}
// call lockQueue() first!
+// Threads: T*
+// Locks: Mfq
LLTextureFetchWorker* LLTextureFetch::getWorkerAfterLock(const LLUUID& id)
{
LLTextureFetchWorker* res = NULL;
@@ -2131,14 +2664,16 @@ LLTextureFetchWorker* LLTextureFetch::getWorkerAfterLock(const LLUUID& id)
return res;
}
+// Threads: T*
LLTextureFetchWorker* LLTextureFetch::getWorker(const LLUUID& id)
{
- LLMutexLock lock(&mQueueMutex) ;
+ LLMutexLock lock(&mQueueMutex); // +Mfq
- return getWorkerAfterLock(id) ;
-}
+ return getWorkerAfterLock(id);
+} // -Mfq
+// Threads: T*
bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level,
LLPointer<LLImageRaw>& raw, LLPointer<LLImageRaw>& aux)
{
@@ -2161,7 +2696,7 @@ bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level,
}
else if (worker->checkWork())
{
- worker->lockWorkMutex();
+ worker->lockWorkMutex(); // +Mw
discard_level = worker->mDecodedDiscard;
raw = worker->mRawImage;
aux = worker->mAuxImage;
@@ -2172,11 +2707,11 @@ bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level,
}
res = true;
LL_DEBUGS("Texture") << id << ": Request Finished. State: " << worker->mState << " Discard: " << discard_level << LL_ENDL;
- worker->unlockWorkMutex();
+ worker->unlockWorkMutex(); // -Mw
}
else
{
- worker->lockWorkMutex();
+ worker->lockWorkMutex(); // +Mw
if ((worker->mDecodedDiscard >= 0) &&
(worker->mDecodedDiscard < discard_level || discard_level < 0) &&
(worker->mState >= LLTextureFetchWorker::WAIT_ON_WRITE))
@@ -2186,7 +2721,7 @@ bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level,
raw = worker->mRawImage;
aux = worker->mAuxImage;
}
- worker->unlockWorkMutex();
+ worker->unlockWorkMutex(); // -Mw
}
}
else
@@ -2196,15 +2731,16 @@ bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level,
return res;
}
+// Threads: T*
bool LLTextureFetch::updateRequestPriority(const LLUUID& id, F32 priority)
{
bool res = false;
LLTextureFetchWorker* worker = getWorker(id);
if (worker)
{
- worker->lockWorkMutex();
+ worker->lockWorkMutex(); // +Mw
worker->setImagePriority(priority);
- worker->unlockWorkMutex();
+ worker->unlockWorkMutex(); // -Mw
res = true;
}
return res;
@@ -2219,24 +2755,24 @@ bool LLTextureFetch::updateRequestPriority(const LLUUID& id, F32 priority)
// in step, at least until this can be refactored and
// the redundancy eliminated.
//
-// May be called from any thread
+// Threads: T*
//virtual
S32 LLTextureFetch::getPending()
{
S32 res;
- lockData();
+ lockData(); // +Ct
{
- LLMutexLock lock(&mQueueMutex);
+ LLMutexLock lock(&mQueueMutex); // +Mfq
res = mRequestQueue.size();
- res += mCurlPOSTRequestCount;
res += mCommands.size();
- }
- unlockData();
+ } // -Mfq
+ unlockData(); // -Ct
return res;
}
+// Locks: Ct
// virtual
bool LLTextureFetch::runCondition()
{
@@ -2251,42 +2787,53 @@ bool LLTextureFetch::runCondition()
bool have_no_commands(false);
{
- LLMutexLock lock(&mQueueMutex);
+ LLMutexLock lock(&mQueueMutex); // +Mfq
have_no_commands = mCommands.empty();
- }
-
- bool have_no_curl_requests(0 == mCurlPOSTRequestCount);
+ } // -Mfq
return ! (have_no_commands
- && have_no_curl_requests
&& (mRequestQueue.empty() && mIdleThread)); // From base class
}
//////////////////////////////////////////////////////////////////////////////
-// MAIN THREAD (unthreaded envs), WORKER THREAD (threaded envs)
+// Threads: Ttf
void LLTextureFetch::commonUpdate()
{
+ // Release waiters
+ releaseHttpWaiters();
+
// Run a cross-thread command, if any.
cmdDoWork();
- // Update Curl on same thread as mCurlGetRequest was constructed
- S32 processed = mCurlGetRequest->process();
- if (processed > 0)
+ // Deliver all completion notifications
+ LLCore::HttpStatus status = mHttpRequest->update(0);
+ if (! status)
{
- lldebugs << "processed: " << processed << " messages." << llendl;
+ LL_INFOS_ONCE("Texture") << "Problem during HTTP servicing. Reason: "
+ << status.toString()
+ << LL_ENDL;
}
}
-// MAIN THREAD
+// Threads: Tmain
+
//virtual
S32 LLTextureFetch::update(F32 max_time_ms)
{
static LLCachedControl<F32> band_width(gSavedSettings,"ThrottleBandwidthKBPS");
- mMaxBandwidth = band_width ;
+ {
+ mNetworkQueueMutex.lock(); // +Mfnq
+ mMaxBandwidth = band_width;
+
+ gTextureList.sTextureBits += mHTTPTextureBits;
+ mHTTPTextureBits = 0;
+
+ mNetworkQueueMutex.unlock(); // -Mfnq
+ }
S32 res = LLWorkerThread::update(max_time_ms);
@@ -2304,19 +2851,9 @@ S32 LLTextureFetch::update(F32 max_time_ms)
if (!mThreaded)
{
commonUpdate();
-
- if(mCurlGetRequest)
- {
- mCurlGetRequest->nextRequests();
- }
}
- if(mCurlGetRequest)
- {
- gTextureList.sTextureBits += mCurlGetRequest->getTotalReceivedBits();
- }
-
- if(mFetchDebugger)
+ if (mFetchDebugger)
{
mFetchDebugger->tryToStopDebug(); //check if need to stop debugger.
}
@@ -2324,7 +2861,9 @@ S32 LLTextureFetch::update(F32 max_time_ms)
return res;
}
-//called in the MAIN thread after the TextureCacheThread shuts down.
+// called in the MAIN thread after the TextureCacheThread shuts down.
+//
+// Threads: Tmain
void LLTextureFetch::shutDownTextureCacheThread()
{
if(mTextureCache)
@@ -2334,7 +2873,9 @@ void LLTextureFetch::shutDownTextureCacheThread()
}
}
-//called in the MAIN thread after the ImageDecodeThread shuts down.
+// called in the MAIN thread after the ImageDecodeThread shuts down.
+//
+// Threads: Tmain
void LLTextureFetch::shutDownImageDecodeThread()
{
if(mImageDecodeThread)
@@ -2344,37 +2885,27 @@ void LLTextureFetch::shutDownImageDecodeThread()
}
}
-// WORKER THREAD
+// Threads: Ttf
void LLTextureFetch::startThread()
{
- // Construct mCurlGetRequest from Worker Thread
- mCurlGetRequest = new LLCurlTextureRequest(8);
-
- if(mFetchDebugger)
- {
- mFetchDebugger->setCurlGetRequest(mCurlGetRequest);
- }
}
-// WORKER THREAD
+// Threads: Ttf
void LLTextureFetch::endThread()
{
- // Destroy mCurlGetRequest from Worker Thread
- delete mCurlGetRequest;
- mCurlGetRequest = NULL;
- if(mFetchDebugger)
- {
- mFetchDebugger->setCurlGetRequest(NULL);
- }
+ LL_INFOS("Texture") << "CacheReads: " << mTotalCacheReadCount
+ << ", CacheWrites: " << mTotalCacheWriteCount
+ << ", ResWaits: " << mTotalResourceWaitCount
+ << ", TotalHTTPReq: " << getTotalNumHTTPRequests()
+ << LL_ENDL;
}
-// WORKER THREAD
+// Threads: Ttf
void LLTextureFetch::threadedUpdate()
{
- llassert_always(mCurlGetRequest);
-
- mCurlGetRequest->nextRequests();
+ llassert_always(mHttpRequest);
+#if 0
// Limit update frequency
const F32 PROCESS_TIME = 0.05f;
static LLFrameTimer process_timer;
@@ -2383,9 +2914,10 @@ void LLTextureFetch::threadedUpdate()
return;
}
process_timer.reset();
+#endif
commonUpdate();
-
+
#if 0
const F32 INFO_TIME = 1.0f;
static LLFrameTimer info_timer;
@@ -2399,11 +2931,11 @@ void LLTextureFetch::threadedUpdate()
}
}
#endif
-
}
//////////////////////////////////////////////////////////////////////////////
+// Threads: Tmain
void LLTextureFetch::sendRequestListToSimulators()
{
// All requests
@@ -2429,48 +2961,48 @@ void LLTextureFetch::sendRequestListToSimulators()
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++;
- LLTextureFetchWorker* req = getWorker(*curiter);
- if (!req)
- {
- 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->mSentRequest == LLTextureFetchWorker::SENT_SIM &&
- req->mTotalPackets > 0 &&
- req->mLastPacket >= req->mTotalPackets-1)
+ LLMutexLock lock2(&mNetworkQueueMutex); // +Mfnq
+ for (queue_t::iterator iter = mNetworkQueue.begin(); iter != mNetworkQueue.end(); )
{
- // We have all the packets... make sure this is high priority
+ queue_t::iterator curiter = iter++;
+ LLTextureFetchWorker* req = getWorker(*curiter);
+ if (!req)
+ {
+ 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->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 >= SIM_LAZY_FLUSH_TIMEOUT))
+ continue;
+ }
+ F32 elapsed = req->mRequestedTimer.getElapsedTimeF32();
{
- 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);
+ }
}
}
- }
- }
+ } // -Mfnq
for (work_request_map_t::iterator iter1 = requests.begin();
iter1 != requests.end(); ++iter1)
@@ -2493,9 +3025,9 @@ void LLTextureFetch::sendRequestListToSimulators()
if (req->mSentRequest != LLTextureFetchWorker::SENT_SIM)
{
// Initialize packet data based on data read from cache
- req->lockWorkMutex();
+ req->lockWorkMutex(); // +Mw
req->setupPacketData();
- req->unlockWorkMutex();
+ req->unlockWorkMutex(); // -Mw
}
if (0 == sim_request_count)
{
@@ -2524,12 +3056,12 @@ void LLTextureFetch::sendRequestListToSimulators()
mTextureInfo.setRequestType(req->mID, LLTextureInfoDetails::REQUEST_TYPE_UDP);
}
- req->lockWorkMutex();
+ req->lockWorkMutex(); // +Mw
req->mSentRequest = LLTextureFetchWorker::SENT_SIM;
req->mSimRequestedDiscard = req->mDesiredDiscard;
req->mRequestedPriority = req->mImagePriority;
req->mRequestedTimer.reset();
- req->unlockWorkMutex();
+ req->unlockWorkMutex(); // -Mw
sim_request_count++;
if (sim_request_count >= IMAGES_PER_REQUEST)
{
@@ -2550,55 +3082,57 @@ void LLTextureFetch::sendRequestListToSimulators()
// Send cancelations
{
- LLMutexLock lock2(&mNetworkQueueMutex);
- if (gMessageSystem && !mCancelQueue.empty())
- {
- for (cancel_queue_t::iterator iter1 = mCancelQueue.begin();
- iter1 != mCancelQueue.end(); ++iter1)
+ LLMutexLock lock2(&mNetworkQueueMutex); // +Mfnq
+ if (gMessageSystem && !mCancelQueue.empty())
{
- LLHost host = iter1->first;
- if (host == LLHost::invalid)
+ for (cancel_queue_t::iterator iter1 = mCancelQueue.begin();
+ iter1 != mCancelQueue.end(); ++iter1)
{
- host = gAgent.getRegionHost();
- }
- S32 request_count = 0;
- for (queue_t::iterator iter2 = iter1->second.begin();
- iter2 != iter1->second.end(); ++iter2)
- {
- if (0 == request_count)
+ LLHost host = iter1->first;
+ if (host == LLHost::invalid)
{
- gMessageSystem->newMessageFast(_PREHASH_RequestImage);
- gMessageSystem->nextBlockFast(_PREHASH_AgentData);
- gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ host = gAgent.getRegionHost();
}
- gMessageSystem->nextBlockFast(_PREHASH_RequestImage);
- gMessageSystem->addUUIDFast(_PREHASH_Image, *iter2);
- gMessageSystem->addS8Fast(_PREHASH_DiscardLevel, -1);
- gMessageSystem->addF32Fast(_PREHASH_DownloadPriority, 0);
- gMessageSystem->addU32Fast(_PREHASH_Packet, 0);
- gMessageSystem->addU8Fast(_PREHASH_Type, 0);
+ S32 request_count = 0;
+ for (queue_t::iterator iter2 = iter1->second.begin();
+ iter2 != iter1->second.end(); ++iter2)
+ {
+ if (0 == request_count)
+ {
+ gMessageSystem->newMessageFast(_PREHASH_RequestImage);
+ gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ }
+ gMessageSystem->nextBlockFast(_PREHASH_RequestImage);
+ gMessageSystem->addUUIDFast(_PREHASH_Image, *iter2);
+ gMessageSystem->addS8Fast(_PREHASH_DiscardLevel, -1);
+ gMessageSystem->addF32Fast(_PREHASH_DownloadPriority, 0);
+ gMessageSystem->addU32Fast(_PREHASH_Packet, 0);
+ gMessageSystem->addU8Fast(_PREHASH_Type, 0);
// llinfos << "CANCELING IMAGE REQUEST: " << (*iter2) << llendl;
- request_count++;
- if (request_count >= IMAGES_PER_REQUEST)
+ request_count++;
+ if (request_count >= IMAGES_PER_REQUEST)
+ {
+ gMessageSystem->sendSemiReliable(host, NULL, NULL);
+ request_count = 0;
+ }
+ }
+ if (request_count > 0 && request_count < IMAGES_PER_REQUEST)
{
gMessageSystem->sendSemiReliable(host, NULL, NULL);
- request_count = 0;
}
}
- if (request_count > 0 && request_count < IMAGES_PER_REQUEST)
- {
- gMessageSystem->sendSemiReliable(host, NULL, NULL);
- }
+ mCancelQueue.clear();
}
- mCancelQueue.clear();
- }
- }
+ } // -Mfnq
}
//////////////////////////////////////////////////////////////////////////////
+// Threads: T*
+// Locks: Mw
bool LLTextureFetchWorker::insertPacket(S32 index, U8* data, S32 size)
{
mRequestedTimer.reset();
@@ -2631,6 +3165,7 @@ bool LLTextureFetchWorker::insertPacket(S32 index, U8* data, S32 size)
return true;
}
+// Threads: T*
bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8 codec, U16 packets, U32 totalbytes,
U16 data_size, U8* data)
{
@@ -2665,15 +3200,19 @@ bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8
}
if (!res)
{
+ mNetworkQueueMutex.lock(); // +Mfnq
++mBadPacketCount;
- mNetworkQueueMutex.lock() ;
mCancelQueue[host].insert(id);
- mNetworkQueueMutex.unlock() ;
+ mNetworkQueueMutex.unlock(); // -Mfnq
return false;
}
+ LLViewerStatsRecorder::instance().textureFetch(data_size);
+ LLViewerStatsRecorder::instance().log(0.1f);
+
worker->lockWorkMutex();
+
// Copy header data into image object
worker->mImageCodec = codec;
worker->mTotalPackets = packets;
@@ -2683,10 +3222,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->unlockWorkMutex();
+ worker->unlockWorkMutex(); // -Mw
return res;
}
+
+// Threads: T*
bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U16 packet_num, U16 data_size, U8* data)
{
LLTextureFetchWorker* worker = getWorker(id);
@@ -2711,14 +3252,18 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1
}
if (!res)
{
+ mNetworkQueueMutex.lock(); // +Mfnq
++mBadPacketCount;
- mNetworkQueueMutex.lock() ;
mCancelQueue[host].insert(id);
- mNetworkQueueMutex.unlock() ;
+ mNetworkQueueMutex.unlock(); // -Mfnq
return false;
}
+
+ LLViewerStatsRecorder::instance().textureFetch(data_size);
+ LLViewerStatsRecorder::instance().log(0.1f);
worker->lockWorkMutex();
+
res = worker->insertPacket(packet_num, data, data_size);
@@ -2735,7 +3280,7 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1
removeFromNetworkQueue(worker, true); // failsafe
}
- if(packet_num >= (worker->mTotalPackets - 1))
+ if (packet_num >= (worker->mTotalPackets - 1))
{
static LLCachedControl<bool> log_to_viewer_log(gSavedSettings,"LogTextureDownloadsToViewerLog");
static LLCachedControl<bool> log_to_sim(gSavedSettings,"LogTextureDownloadsToSimulator");
@@ -2747,12 +3292,14 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1
mTextureInfo.setRequestCompleteTimeAndLog(id, timeNow);
}
}
- worker->unlockWorkMutex();
+ worker->unlockWorkMutex(); // -Mw
return res;
}
//////////////////////////////////////////////////////////////////////////////
+
+// Threads: T*
BOOL LLTextureFetch::isFromLocalCache(const LLUUID& id)
{
BOOL from_cache = FALSE ;
@@ -2760,14 +3307,15 @@ BOOL LLTextureFetch::isFromLocalCache(const LLUUID& id)
LLTextureFetchWorker* worker = getWorker(id);
if (worker)
{
- worker->lockWorkMutex() ;
- from_cache = worker->mInLocalCache ;
- worker->unlockWorkMutex() ;
+ worker->lockWorkMutex(); // +Mw
+ from_cache = worker->mInLocalCache;
+ worker->unlockWorkMutex(); // -Mw
}
return from_cache ;
}
+// Threads: T*
S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& requested_priority_p,
U32& fetch_priority_p, F32& fetch_dtime_p, F32& request_dtime_p, bool& can_use_http)
{
@@ -2781,7 +3329,7 @@ S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& r
LLTextureFetchWorker* worker = getWorker(id);
if (worker && worker->haveWork())
{
- worker->lockWorkMutex();
+ worker->lockWorkMutex(); // +Mw
state = worker->mState;
fetch_dtime = worker->mFetchTimer.getElapsedTimeF32();
request_dtime = worker->mRequestedTimer.getElapsedTimeF32();
@@ -2808,7 +3356,7 @@ S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& r
}
fetch_priority = worker->getPriority();
can_use_http = worker->getCanUseHTTP() ;
- worker->unlockWorkMutex();
+ worker->unlockWorkMutex(); // -Mw
}
data_progress_p = data_progress;
requested_priority_p = requested_priority;
@@ -2832,12 +3380,219 @@ void LLTextureFetch::dump()
<< " STATE: " << worker->sStateDescs[worker->mState]
<< llendl;
}
+
+ llinfos << "LLTextureFetch ACTIVE_HTTP:" << llendl;
+ for (queue_t::const_iterator iter(mHTTPTextureQueue.begin());
+ mHTTPTextureQueue.end() != iter;
+ ++iter)
+ {
+ llinfos << " ID: " << (*iter) << llendl;
+ }
+
+ llinfos << "LLTextureFetch WAIT_HTTP_RESOURCE:" << llendl;
+ for (wait_http_res_queue_t::const_iterator iter(mHttpWaitResource.begin());
+ mHttpWaitResource.end() != iter;
+ ++iter)
+ {
+ llinfos << " ID: " << (*iter) << llendl;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+// HTTP Resource Waiting Methods
+
+// Threads: Ttf
+void LLTextureFetch::addHttpWaiter(const LLUUID & tid)
+{
+ mNetworkQueueMutex.lock(); // +Mfnq
+ mHttpWaitResource.insert(tid);
+ mNetworkQueueMutex.unlock(); // -Mfnq
+}
+
+// Threads: Ttf
+void LLTextureFetch::removeHttpWaiter(const LLUUID & tid)
+{
+ mNetworkQueueMutex.lock(); // +Mfnq
+ wait_http_res_queue_t::iterator iter(mHttpWaitResource.find(tid));
+ if (mHttpWaitResource.end() != iter)
+ {
+ mHttpWaitResource.erase(iter);
+ }
+ mNetworkQueueMutex.unlock(); // -Mfnq
+}
+
+// Threads: T*
+bool LLTextureFetch::isHttpWaiter(const LLUUID & tid)
+{
+ mNetworkQueueMutex.lock(); // +Mfnq
+ wait_http_res_queue_t::iterator iter(mHttpWaitResource.find(tid));
+ const bool ret(mHttpWaitResource.end() != iter);
+ mNetworkQueueMutex.unlock(); // -Mfnq
+ return ret;
+}
+
+// Release as many requests as permitted from the WAIT_HTTP_RESOURCE2
+// state to the SEND_HTTP_REQ state based on their current priority.
+//
+// This data structures and code associated with this looks a bit
+// indirect and naive but it's done in the name of safety. An
+// ordered container may become invalid from time to time due to
+// priority changes caused by actions in other threads. State itself
+// could also suffer the same fate with canceled operations. Even
+// done this way, I'm not fully trusting we're truly safe. This
+// module is due for a major refactoring and we'll deal with it then.
+//
+// Threads: Ttf
+// Locks: -Mw (must not hold any worker when called)
+void LLTextureFetch::releaseHttpWaiters()
+{
+ // Use mHttpSemaphore rather than mHTTPTextureQueue.size()
+ // to avoid a lock.
+ if (mHttpSemaphore < (HTTP_REQUESTS_IN_QUEUE_HIGH_WATER - HTTP_REQUESTS_IN_QUEUE_LOW_WATER))
+ return;
+
+ // Quickly make a copy of all the LLUIDs. Get off the
+ // mutex as early as possible.
+ typedef std::vector<LLUUID> uuid_vec_t;
+ uuid_vec_t tids;
+
+ {
+ LLMutexLock lock(&mNetworkQueueMutex); // +Mfnq
+
+ if (mHttpWaitResource.empty())
+ return;
+ tids.reserve(mHttpWaitResource.size());
+ tids.assign(mHttpWaitResource.begin(), mHttpWaitResource.end());
+ } // -Mfnq
+
+ // Now lookup the UUUIDs to find valid requests and sort
+ // them in priority order, highest to lowest. We're going
+ // to modify priority later as a side-effect of releasing
+ // these objects. That, in turn, would violate the partial
+ // ordering assumption of std::set, std::map, etc. so we
+ // don't use those containers. We use a vector and an explicit
+ // sort to keep the containers valid later.
+ typedef std::vector<LLTextureFetchWorker *> worker_list_t;
+ worker_list_t tids2;
+
+ tids2.reserve(tids.size());
+ for (uuid_vec_t::iterator iter(tids.begin());
+ tids.end() != iter;
+ ++iter)
+ {
+ LLTextureFetchWorker * worker(getWorker(* iter));
+ if (worker)
+ {
+ tids2.push_back(worker);
+ }
+ else
+ {
+ // If worker isn't found, this should be due to a request
+ // for deletion. We signal our recognition that this
+ // uuid shouldn't be used for resource waiting anymore by
+ // erasing it from the resource waiter list. That allows
+ // deleteOK to do final deletion on the worker.
+ removeHttpWaiter(* iter);
+ }
+ }
+ tids.clear();
+
+ // Sort into priority order, if necessary and only as much as needed
+ if (tids2.size() > mHttpSemaphore)
+ {
+ LLTextureFetchWorker::Compare compare;
+ std::partial_sort(tids2.begin(), tids2.begin() + mHttpSemaphore, tids2.end(), compare);
+ }
+
+ // Release workers up to the high water mark. Since we aren't
+ // holding any locks at this point, we can be in competition
+ // with other callers. Do defensive things like getting
+ // refreshed counts of requests and checking if someone else
+ // has moved any worker state around....
+ for (worker_list_t::iterator iter2(tids2.begin()); tids2.end() != iter2; ++iter2)
+ {
+ LLTextureFetchWorker * worker(* iter2);
+
+ worker->lockWorkMutex(); // +Mw
+ if (LLTextureFetchWorker::WAIT_HTTP_RESOURCE2 != worker->mState)
+ {
+ // Not in expected state, remove it, try the next one
+ worker->unlockWorkMutex(); // -Mw
+ LL_WARNS("Texture") << "Resource-waited texture " << worker->mID
+ << " in unexpected state: " << worker->mState
+ << ". Removing from wait list."
+ << LL_ENDL;
+ removeHttpWaiter(worker->mID);
+ continue;
+ }
+
+ if (! worker->acquireHttpSemaphore())
+ {
+ // Out of active slots, quit
+ worker->unlockWorkMutex(); // -Mw
+ break;
+ }
+
+ worker->mState = LLTextureFetchWorker::SEND_HTTP_REQ;
+ worker->setPriority(LLWorkerThread::PRIORITY_HIGH | worker->mWorkPriority);
+ worker->unlockWorkMutex(); // -Mw
+
+ removeHttpWaiter(worker->mID);
+ }
+}
+
+// Threads: T*
+void LLTextureFetch::cancelHttpWaiters()
+{
+ mNetworkQueueMutex.lock(); // +Mfnq
+ mHttpWaitResource.clear();
+ mNetworkQueueMutex.unlock(); // -Mfnq
+}
+
+// Threads: T*
+int LLTextureFetch::getHttpWaitersCount()
+{
+ mNetworkQueueMutex.lock(); // +Mfnq
+ int ret(mHttpWaitResource.size());
+ mNetworkQueueMutex.unlock(); // -Mfnq
+ return ret;
+}
+
+
+// Threads: T*
+void LLTextureFetch::updateStateStats(U32 cache_read, U32 cache_write, U32 res_wait)
+{
+ LLMutexLock lock(&mQueueMutex); // +Mfq
+
+ mTotalCacheReadCount += cache_read;
+ mTotalCacheWriteCount += cache_write;
+ mTotalResourceWaitCount += res_wait;
+} // -Mfq
+
+
+// Threads: T*
+void LLTextureFetch::getStateStats(U32 * cache_read, U32 * cache_write, U32 * res_wait)
+{
+ U32 ret1(0U), ret2(0U), ret3(0U);
+
+ {
+ LLMutexLock lock(&mQueueMutex); // +Mfq
+ ret1 = mTotalCacheReadCount;
+ ret2 = mTotalCacheWriteCount;
+ ret3 = mTotalResourceWaitCount;
+ } // -Mfq
+
+ *cache_read = ret1;
+ *cache_write = ret2;
+ *res_wait = ret3;
}
//////////////////////////////////////////////////////////////////////////////
// cross-thread command methods
+// Threads: T*
void LLTextureFetch::commandSetRegion(U64 region_handle)
{
TFReqSetRegion * req = new TFReqSetRegion(region_handle);
@@ -2845,6 +3600,7 @@ void LLTextureFetch::commandSetRegion(U64 region_handle)
cmdEnqueue(req);
}
+// Threads: T*
void LLTextureFetch::commandSendMetrics(const std::string & caps_url,
const LLUUID & session_id,
const LLUUID & agent_id,
@@ -2855,6 +3611,7 @@ void LLTextureFetch::commandSendMetrics(const std::string & caps_url,
cmdEnqueue(req);
}
+// Threads: T*
void LLTextureFetch::commandDataBreak()
{
// The pedantically correct way to implement this is to create a command
@@ -2865,30 +3622,33 @@ void LLTextureFetch::commandDataBreak()
LLTextureFetch::svMetricsDataBreak = true;
}
+// Threads: T*
void LLTextureFetch::cmdEnqueue(TFRequest * req)
{
- lockQueue();
+ lockQueue(); // +Mfq
mCommands.push_back(req);
- unlockQueue();
+ unlockQueue(); // -Mfq
unpause();
}
+// Threads: T*
LLTextureFetch::TFRequest * LLTextureFetch::cmdDequeue()
{
TFRequest * ret = 0;
- lockQueue();
+ lockQueue(); // +Mfq
if (! mCommands.empty())
{
ret = mCommands.front();
mCommands.erase(mCommands.begin());
}
- unlockQueue();
+ unlockQueue(); // -Mfq
return ret;
}
+// Threads: Ttf
void LLTextureFetch::cmdDoWork()
{
if (mDebugPause)
@@ -2912,6 +3672,38 @@ void LLTextureFetch::cmdDoWork()
namespace
{
+
+// Example of a simple notification handler for metrics
+// delivery notification. Earlier versions of the code used
+// a Responder that tried harder to detect delivery breaks
+// but it really isn't that important. If someone wants to
+// revisit that effort, here is a place to start.
+class AssetReportHandler : public LLCore::HttpHandler
+{
+public:
+
+ // Threads: Ttf
+ virtual void onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response)
+ {
+ LLCore::HttpStatus status(response->getStatus());
+
+ if (status)
+ {
+ LL_DEBUGS("Texture") << "Successfully delivered asset metrics to grid."
+ << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS("Texture") << "Error delivering asset metrics to grid. Status: "
+ << status.toHex()
+ << ", Reason: " << status.toString() << LL_ENDL;
+ }
+ }
+}; // end class AssetReportHandler
+
+AssetReportHandler stats_handler;
+
+
/**
* Implements the 'Set Region' command.
*
@@ -2942,73 +3734,8 @@ TFReqSendMetrics::~TFReqSendMetrics()
bool
TFReqSendMetrics::doWork(LLTextureFetch * fetcher)
{
- /*
- * HTTP POST responder. Doesn't do much but tries to
- * detect simple breaks in recording the metrics stream.
- *
- * The 'volatile' modifiers don't indicate signals,
- * mmap'd memory or threads, really. They indicate that
- * the referenced data is part of a pseudo-closure for
- * this responder rather than being required for correct
- * operation.
- *
- * We don't try very hard with the POST request. We give
- * it one shot and that's more-or-less it. With a proper
- * refactoring of the LLQueuedThread usage, these POSTs
- * could be put in a request object and made more reliable.
- */
- class lcl_responder : public LLCurl::Responder
- {
- public:
- lcl_responder(LLTextureFetch * fetcher,
- S32 expected_sequence,
- volatile const S32 & live_sequence,
- volatile bool & reporting_break,
- volatile bool & reporting_started)
- : LLCurl::Responder(),
- mFetcher(fetcher),
- mExpectedSequence(expected_sequence),
- mLiveSequence(live_sequence),
- mReportingBreak(reporting_break),
- mReportingStarted(reporting_started)
- {
- mFetcher->incrCurlPOSTCount();
- }
-
- ~lcl_responder()
- {
- mFetcher->decrCurlPOSTCount();
- }
-
- // virtual
- void error(U32 status_num, const std::string & reason)
- {
- if (mLiveSequence == mExpectedSequence)
- {
- mReportingBreak = true;
- }
- LL_WARNS("Texture") << "Break in metrics stream due to POST failure to metrics collection service. Reason: "
- << reason << LL_ENDL;
- }
-
- // virtual
- void result(const LLSD & content)
- {
- if (mLiveSequence == mExpectedSequence)
- {
- mReportingBreak = false;
- mReportingStarted = true;
- }
- }
-
- private:
- LLTextureFetch * mFetcher;
- S32 mExpectedSequence;
- volatile const S32 & mLiveSequence;
- volatile bool & mReportingBreak;
- volatile bool & mReportingStarted;
-
- }; // class lcl_responder
+ static const U32 report_priority(1);
+ static LLCore::HttpHandler * const handler(fetcher->isQAMode() || true ? &stats_handler : NULL);
if (! gViewerAssetStatsThread1)
return true;
@@ -3036,21 +3763,26 @@ TFReqSendMetrics::doWork(LLTextureFetch * fetcher)
// Update sequence number
if (S32_MAX == ++report_sequence)
report_sequence = 0;
-
+ reporting_started = true;
+
// Limit the size of the stats report if necessary.
merged_llsd["truncated"] = truncate_viewer_metrics(10, merged_llsd);
if (! mCapsURL.empty())
{
- LLCurlRequest::headers_t headers;
- fetcher->getCurlRequest().post(mCapsURL,
- headers,
- merged_llsd,
- new lcl_responder(fetcher,
- report_sequence,
- report_sequence,
- LLTextureFetch::svMetricsDataBreak,
- reporting_started));
+ LLCore::BufferArray * ba = new LLCore::BufferArray;
+ LLCore::BufferArrayStream bas(ba);
+ LLSDSerialize::toXML(merged_llsd, bas);
+
+ fetcher->getHttpRequest().requestPost(fetcher->getPolicyClass(),
+ report_priority,
+ mCapsURL,
+ ba,
+ NULL,
+ fetcher->getMetricsHeaders(),
+ handler);
+ ba->release();
+ LLTextureFetch::svMetricsDataBreak = false;
}
else
{
@@ -3108,6 +3840,7 @@ truncate_viewer_metrics(int max_regions, LLSD & metrics)
} // end of anonymous namespace
+
///////////////////////////////////////////////////////////////////////////////////////////
//Start LLTextureFetchDebugger
///////////////////////////////////////////////////////////////////////////////////////////
@@ -3161,48 +3894,17 @@ private:
S32 mID;
};
-class LLDebuggerHTTPResponder : public LLCurl::Responder
-{
-public:
- LLDebuggerHTTPResponder(LLTextureFetchDebugger* debugger, S32 index)
- : mDebugger(debugger), mIndex(index)
- {
- }
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
- {
- 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;
- }
- }
- if (!success)
- {
- llinfos << "Fetch Debugger : CURL GET FAILED, index = " << mIndex << ", status:" << status << " reason:" << reason << llendl;
- }
- mDebugger->callbackHTTP(mIndex, channels, buffer, partial, success);
- mDebugger->getCurlGetRequest()->completeRequest(0);
- }
- virtual bool followRedir()
- {
- return true;
- }
-private:
- LLTextureFetchDebugger* mDebugger;
- S32 mIndex;
-};
LLTextureFetchDebugger::LLTextureFetchDebugger(LLTextureFetch* fetcher, LLTextureCache* cache, LLImageDecodeThread* imagedecodethread) :
+ LLCore::HttpHandler(),
mFetcher(fetcher),
mTextureCache(cache),
mImageDecodeThread(imagedecodethread),
- mCurlGetRequest(NULL)
+ mHttpHeaders(NULL),
+ mHttpPolicyClass(fetcher->getPolicyClass()),
+ mNbCurlCompleted(0),
+ mTempIndex(0),
+ mHistoryListIndex(0)
{
init();
}
@@ -3212,6 +3914,11 @@ LLTextureFetchDebugger::~LLTextureFetchDebugger()
mFetchingHistory.clear();
mStopDebug = TRUE;
tryToStopDebug();
+ if (mHttpHeaders)
+ {
+ mHttpHeaders->release();
+ mHttpHeaders = NULL;
+ }
}
void LLTextureFetchDebugger::init()
@@ -3223,6 +3930,7 @@ void LLTextureFetchDebugger::init()
mDecodingTime = -1.f;
mHTTPTime = -1.f;
mGLCreationTime = -1.f;
+
mTotalFetchingTime = 0.f;
mRefetchVisCacheTime = -1.f;
mRefetchVisHTTPTime = -1.f;
@@ -3249,6 +3957,15 @@ void LLTextureFetchDebugger::init()
mFreezeHistory = FALSE;
mStopDebug = FALSE;
mClearHistory = FALSE;
+ mRefetchNonVis = FALSE;
+
+ mNbCurlRequests = 0;
+
+ if (! mHttpHeaders)
+ {
+ mHttpHeaders = new LLCore::HttpHeaders;
+ mHttpHeaders->mHeaders.push_back("Accept: image/x-j2c");
+ }
}
void LLTextureFetchDebugger::startWork(e_debug_state state)
@@ -3316,7 +4033,8 @@ bool LLTextureFetchDebugger::processStartDebug(F32 max_time)
S32 pending = 0;
pending += LLAppViewer::getTextureCache()->update(1);
pending += LLAppViewer::getImageDecodeThread()->update(1);
- pending += LLAppViewer::getTextureFetch()->update(1);
+ // pending += LLAppViewer::getTextureFetch()->update(1); // This causes infinite recursion in some cases
+ pending += mNbCurlRequests;
if(!pending)
{
break;
@@ -3329,7 +4047,7 @@ bool LLTextureFetchDebugger::processStartDebug(F32 max_time)
}
//collect statistics
- mTotalFetchingTime = gDebugTimers[0].getElapsedTimeF32() - mTotalFetchingTime;
+ mTotalFetchingTime = gTextureTimer.getElapsedTimeF32() - mTotalFetchingTime;
std::set<LLUUID> fetched_textures;
S32 size = mFetchingHistory.size();
@@ -3386,7 +4104,7 @@ void LLTextureFetchDebugger::tryToStopDebug()
{
mTextureCache->readComplete(mFetchingHistory[i].mCacheHandle, true);
}
- }
+ }
break;
case WRITE_CACHE:
for(S32 i = 0 ; i < size; i++)
@@ -3428,8 +4146,9 @@ void LLTextureFetchDebugger::tryToStopDebug()
if(mClearHistory)
{
mFetchingHistory.clear();
+ mHandleToFetchIndex.clear();
init();
- mTotalFetchingTime = gDebugTimers[0].getElapsedTimeF32(); //reset
+ mTotalFetchingTime = gTextureTimer.getElapsedTimeF32(); //reset
}
}
}
@@ -3605,7 +4324,7 @@ void LLTextureFetchDebugger::debugHTTP()
{
mFetchingHistory[i].mCurlState = FetchEntry::CURL_NOT_DONE;
mFetchingHistory[i].mCurlReceivedSize = 0;
- mFetchingHistory[i].mHTTPFailCount = 0;
+ mFetchingHistory[i].mFormattedImage = NULL;
}
mNbCurlRequests = 0;
mNbCurlCompleted = 0;
@@ -3620,19 +4339,14 @@ S32 LLTextureFetchDebugger::fillCurlQueue()
mNbCurlCompleted = mFetchingHistory.size();
return 0;
}
- S32 size = mFetchingHistory.size();
-
- if (mNbCurlRequests == size) //all issued
+ if (mNbCurlRequests > HTTP_REQUESTS_IN_QUEUE_LOW_WATER)
{
- return 0;
- }
+ return mNbCurlRequests;
+ }
- S32 counter = 8;
- mNbCurlRequests = 0;
+ S32 size = mFetchingHistory.size();
for (S32 i = 0 ; i < size ; i++)
{
- mNbCurlRequests++;
-
if (mFetchingHistory[i].mCurlState != FetchEntry::CURL_NOT_DONE)
{
continue;
@@ -3643,15 +4357,37 @@ S32 LLTextureFetchDebugger::fillCurlQueue()
requestedSize = llmax(0,requestedSize);
// We request the whole file if the size was set to an absurdly high value (meaning all file)
requestedSize = (requestedSize == 33554432 ? 0 : requestedSize);
- std::vector<std::string> headers;
- headers.push_back("Accept: image/x-j2c");
- mCurlGetRequest->getByteRange(texture_url, headers, 0, requestedSize, 0x10000, new LLDebuggerHTTPResponder(this, i));
-
- mFetchingHistory[i].mCurlState = FetchEntry::CURL_IN_PROGRESS;
- counter--;
- if(counter < 1)
+
+ LLCore::HttpHandle handle = mFetcher->getHttpRequest().requestGetByteRange(mHttpPolicyClass,
+ LLWorkerThread::PRIORITY_LOWBITS,
+ texture_url,
+ 0,
+ requestedSize,
+ NULL,
+ mHttpHeaders,
+ this);
+ if (LLCORE_HTTP_HANDLE_INVALID != handle)
{
- break;
+ mHandleToFetchIndex[handle] = i;
+ mFetchingHistory[i].mHttpHandle = handle;
+ mFetchingHistory[i].mCurlState = FetchEntry::CURL_IN_PROGRESS;
+ mNbCurlRequests++;
+ if (mNbCurlRequests >= HTTP_REQUESTS_IN_QUEUE_HIGH_WATER) // emulate normal pipeline
+ {
+ break;
+ }
+ }
+ else
+ {
+ // Failed to queue request, log it and mark it done.
+ LLCore::HttpStatus status(mFetcher->getHttpRequest().getStatus());
+
+ LL_WARNS("Texture") << "Couldn't issue HTTP request in debugger for texture "
+ << mFetchingHistory[i].mID
+ << ", status: " << status.toHex()
+ << " reason: " << status.toString()
+ << LL_ENDL;
+ mFetchingHistory[i].mCurlState = FetchEntry::CURL_DONE;
}
}
//llinfos << "Fetch Debugger : Having " << mNbCurlRequests << " requests through the curl thread." << llendl;
@@ -3879,9 +4615,8 @@ bool LLTextureFetchDebugger::update(F32 max_time)
}
break;
case HTTP_FETCHING:
- mCurlGetRequest->process();
- mCurlGetRequest->nextRequests();
- LLCurl::getCurlThread()->update(1);
+ // Do some notifications...
+ mFetcher->getHttpRequest().update(10);
if (!fillCurlQueue() && mNbCurlCompleted == mFetchingHistory.size())
{
mHTTPTime = mTimer.getElapsedTimeF32() ;
@@ -3952,6 +4687,28 @@ bool LLTextureFetchDebugger::update(F32 max_time)
return mState == IDLE;
}
+void LLTextureFetchDebugger::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response)
+{
+ handle_fetch_map_t::iterator iter(mHandleToFetchIndex.find(handle));
+ if (mHandleToFetchIndex.end() == iter)
+ {
+ llinfos << "Fetch Debugger : Couldn't find handle " << handle << " in fetch list." << llendl;
+ return;
+ }
+
+ S32 fetch_ind(iter->second);
+ mHandleToFetchIndex.erase(iter);
+ if (fetch_ind >= mFetchingHistory.size() || mFetchingHistory[fetch_ind].mHttpHandle != handle)
+ {
+ llinfos << "Fetch Debugger : Handle and fetch object in disagreement. Punting." << llendl;
+ }
+ else
+ {
+ callbackHTTP(mFetchingHistory[fetch_ind], response);
+ mFetchingHistory[fetch_ind].mHttpHandle = LLCORE_HTTP_HANDLE_INVALID; // Not valid after notification
+ }
+}
+
void LLTextureFetchDebugger::callbackCacheRead(S32 id, bool success, LLImageFormatted* image,
S32 imagesize, BOOL islocal)
{
@@ -3978,52 +4735,50 @@ void LLTextureFetchDebugger::callbackDecoded(S32 id, bool success, LLImageRaw* r
}
}
-void LLTextureFetchDebugger::callbackHTTP(S32 id, const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer,
- bool partial, bool success)
+void LLTextureFetchDebugger::callbackHTTP(FetchEntry & fetch, LLCore::HttpResponse * response)
{
- if (success)
- {
- mFetchingHistory[id].mCurlState = FetchEntry::CURL_DONE;
- mNbCurlCompleted++;
-
- S32 data_size = buffer->countAfter(channels.in(), NULL);
- mFetchingHistory[id].mCurlReceivedSize += data_size;
- //llinfos << "Fetch Debugger : got results for " << id << ", data_size = " << data_size << ", received = " << mFetchingHistory[id].mCurlReceivedSize << ", requested = " << mFetchingHistory[id].mRequestedSize << ", partial = " << partial << llendl;
- if ((mFetchingHistory[id].mCurlReceivedSize >= mFetchingHistory[id].mRequestedSize) || !partial || (mFetchingHistory[id].mRequestedSize == 600))
+ static const LLCore::HttpStatus par_status(HTTP_PARTIAL_CONTENT);
+
+ LLCore::HttpStatus status(response->getStatus());
+ mNbCurlRequests--;
+ mNbCurlCompleted++;
+ fetch.mCurlState = FetchEntry::CURL_DONE;
+ if (status)
+ {
+ const bool partial(par_status == status);
+ LLCore::BufferArray * ba(response->getBody()); // *Not* holding reference to body
+
+ S32 data_size = ba ? ba->size() : 0;
+ fetch.mCurlReceivedSize += data_size;
+ //llinfos << "Fetch Debugger : got results for " << fetch.mID << ", data_size = " << data_size << ", received = " << fetch.mCurlReceivedSize << ", requested = " << fetch.mRequestedSize << ", partial = " << partial << llendl;
+ if ((fetch.mCurlReceivedSize >= fetch.mRequestedSize) || !partial || (fetch.mRequestedSize == 600))
{
U8* d_buffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), data_size);
- buffer->readAfter(channels.in(), NULL, d_buffer, data_size);
+ if (ba)
+ {
+ ba->read(0, d_buffer, data_size);
+ }
- mFetchingHistory[id].mFormattedImage = NULL;
+ llassert_always(fetch.mFormattedImage.isNull());
{
// For now, create formatted image based on extension
- std::string texture_url = mHTTPUrl + "/?texture_id=" + mFetchingHistory[id].mID.asString().c_str();
+ std::string texture_url = mHTTPUrl + "/?texture_id=" + fetch.mID.asString().c_str();
std::string extension = gDirUtilp->getExtension(texture_url);
- mFetchingHistory[id].mFormattedImage = LLImageFormatted::createFromType(LLImageBase::getCodecFromExtension(extension));
- if (mFetchingHistory[id].mFormattedImage.isNull())
+ fetch.mFormattedImage = LLImageFormatted::createFromType(LLImageBase::getCodecFromExtension(extension));
+ if (fetch.mFormattedImage.isNull())
{
- mFetchingHistory[id].mFormattedImage = new LLImageJ2C; // default
+ fetch.mFormattedImage = new LLImageJ2C; // default
}
}
- mFetchingHistory[id].mFormattedImage->setData(d_buffer, data_size);
+ fetch.mFormattedImage->setData(d_buffer, data_size);
}
}
else //failed
{
- mFetchingHistory[id].mHTTPFailCount++;
- if(mFetchingHistory[id].mHTTPFailCount < 5)
- {
- // Fetch will have to be redone
- mFetchingHistory[id].mCurlState = FetchEntry::CURL_NOT_DONE;
- mNbCurlRequests--;
- }
- else //skip
- {
- mFetchingHistory[id].mCurlState = FetchEntry::CURL_DONE;
- mNbCurlCompleted++;
- }
+ llinfos << "Fetch Debugger : CURL GET FAILED, ID = " << fetch.mID
+ << ", status: " << status.toHex()
+ << " reason: " << status.toString() << llendl;
}
}
diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h
index f5072a79f1..5ea3c14e1a 100644
--- a/indra/newview/lltexturefetch.h
+++ b/indra/newview/lltexturefetch.h
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
* Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * Copyright (C) 2012, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,19 +27,26 @@
#ifndef LL_LLTEXTUREFETCH_H
#define LL_LLTEXTUREFETCH_H
+#include <vector>
+#include <map>
+
#include "lldir.h"
#include "llimage.h"
#include "lluuid.h"
#include "llworkerthread.h"
-#include "llcurl.h"
#include "lltextureinfo.h"
#include "llapr.h"
#include "llimageworker.h"
-//#include "lltexturecache.h"
+#include "llstat.h"
+#include "llcurl.h"
+#include "llstat.h"
+#include "httprequest.h"
+#include "httpoptions.h"
+#include "httpheaders.h"
+#include "httphandler.h"
class LLViewerTexture;
class LLTextureFetchWorker;
-class HTTPGetResponder;
class LLImageDecodeThread;
class LLHost;
class LLViewerAssetStats;
@@ -47,10 +54,10 @@ class LLTextureFetchDebugger;
class LLTextureCache;
// Interface class
+
class LLTextureFetch : public LLWorkerThread
{
friend class LLTextureFetchWorker;
- friend class HTTPGetResponder;
public:
LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* imagedecodethread, bool threaded, bool qa_mode);
@@ -58,70 +65,201 @@ public:
class TFRequest;
- /*virtual*/ S32 update(F32 max_time_ms);
- void shutDownTextureCacheThread() ; //called in the main thread after the TextureCacheThread shuts down.
- void shutDownImageDecodeThread() ; //called in the main thread after the ImageDecodeThread shuts down.
+ // Threads: Tmain
+ /*virtual*/ S32 update(F32 max_time_ms);
+
+ // called in the main thread after the TextureCacheThread shuts down.
+ // Threads: Tmain
+ void shutDownTextureCacheThread();
+
+ //called in the main thread after the ImageDecodeThread shuts down.
+ // Threads: Tmain
+ void shutDownImageDecodeThread();
+ // Threads: T* (but Tmain mostly)
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, bool can_use_http);
+
+ // Requests that a fetch operation be deleted from the queue.
+ // If @cancel is true, also stops any I/O operations pending.
+ // Actual delete will be scheduled and performed later.
+ //
+ // Note: This *looks* like an override/variant of the
+ // base class's deleteRequest() but is functionally quite
+ // different.
+ //
+ // Threads: T*
void deleteRequest(const LLUUID& id, bool cancel);
+
void deleteAllRequests();
+
+ // Threads: T*
bool getRequestFinished(const LLUUID& id, S32& discard_level,
LLPointer<LLImageRaw>& raw, LLPointer<LLImageRaw>& aux);
+
+ // Threads: T*
bool updateRequestPriority(const LLUUID& id, F32 priority);
+ // Threads: T*
bool receiveImageHeader(const LLHost& host, const LLUUID& id, U8 codec, U16 packets, U32 totalbytes, U16 data_size, U8* data);
+
+ // Threads: T*
bool receiveImagePacket(const LLHost& host, const LLUUID& id, U16 packet_num, U16 data_size, U8* data);
+ // Threads: T* (but not safe)
void setTextureBandwidth(F32 bandwidth) { mTextureBandwidth = bandwidth; }
+
+ // Threads: T* (but not safe)
F32 getTextureBandwidth() { return mTextureBandwidth; }
- // Debug
+ // Threads: T*
BOOL isFromLocalCache(const LLUUID& id);
+
+ // @return Magic number giving the internal state of the
+ // request. We should make these codes public if we're
+ // going to return them as a status value.
+ //
+ // Threads: T*
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, bool& can_use_http);
+
+ // Debug utility - generally not safe
void dump();
- S32 getNumRequests() ;
+
+ // Threads: T*
+ S32 getNumRequests();
+
+ // Threads: T*
+ S32 getNumHTTPRequests();
+
+ // Threads: T*
+ U32 getTotalNumHTTPRequests();
- // Public for access by callbacks
+ // Threads: T*
S32 getPending();
+
+ // Threads: T*
void lockQueue() { mQueueMutex.lock(); }
+
+ // Threads: T*
void unlockQueue() { mQueueMutex.unlock(); }
+
+ // Threads: T*
LLTextureFetchWorker* getWorker(const LLUUID& id);
+
+ // Threads: T*
+ // Locks: Mfq
LLTextureFetchWorker* getWorkerAfterLock(const LLUUID& id);
- LLTextureInfo* getTextureInfo() { return &mTextureInfo; }
-
// Commands available to other threads to control metrics gathering operations.
+
+ // Threads: T*
void commandSetRegion(U64 region_handle);
+
+ // Threads: T*
void commandSendMetrics(const std::string & caps_url,
const LLUUID & session_id,
const LLUUID & agent_id,
LLViewerAssetStats * main_stats);
+
+ // Threads: T*
void commandDataBreak();
- LLCurlTextureRequest & getCurlRequest() { return *mCurlGetRequest; }
+ // Threads: T*
+ LLCore::HttpRequest & getHttpRequest() { return *mHttpRequest; }
+
+ // Threads: T*
+ LLCore::HttpRequest::policy_t getPolicyClass() const { return mHttpPolicyClass; }
+
+ // Return a pointer to the shared metrics headers definition.
+ // Does not increment the reference count, caller is required
+ // to do that to hold a reference for any length of time.
+ //
+ // Threads: T*
+ LLCore::HttpHeaders * getMetricsHeaders() const { return mHttpMetricsHeaders; }
bool isQAMode() const { return mQAMode; }
- // Curl POST counter maintenance
- inline void incrCurlPOSTCount() { mCurlPOSTRequestCount++; }
- inline void decrCurlPOSTCount() { mCurlPOSTRequestCount--; }
+ // ----------------------------------
+ // HTTP resource waiting methods
+
+ // Threads: T*
+ void addHttpWaiter(const LLUUID & tid);
+
+ // Threads: T*
+ void removeHttpWaiter(const LLUUID & tid);
+ // Threads: T*
+ bool isHttpWaiter(const LLUUID & tid);
+
+ // If there are slots, release one or more LLTextureFetchWorker
+ // requests from resource wait state (WAIT_HTTP_RESOURCE) to
+ // active (SEND_HTTP_REQ).
+ //
+ // Because this will modify state of many workers, you may not
+ // hold any Mw lock while calling. This makes it a little
+ // inconvenient to use but that's the rule.
+ //
+ // Threads: T*
+ // Locks: -Mw (must not hold any worker when called)
+ void releaseHttpWaiters();
+
+ // Threads: T*
+ void cancelHttpWaiters();
+
+ // Threads: T*
+ int getHttpWaitersCount();
+ // ----------------------------------
+ // Stats management
+
+ // Add given counts to the global totals for the states/requests
+ // Threads: T*
+ void updateStateStats(U32 cache_read, U32 cache_write, U32 res_wait);
+
+ // Return the global counts
+ // Threads: T*
+ void getStateStats(U32 * cache_read, U32 * cache_write, U32 * res_wait);
+
+ // ----------------------------------
+
protected:
+ // Threads: T* (but Ttf in practice)
void addToNetworkQueue(LLTextureFetchWorker* worker);
+
+ // Threads: T*
void removeFromNetworkQueue(LLTextureFetchWorker* worker, bool cancel);
+
+ // Threads: T*
void addToHTTPQueue(const LLUUID& id);
- void removeRequest(LLTextureFetchWorker* worker, bool cancel);
+ // XXX possible delete
+ // Threads: T*
+ void removeFromHTTPQueue(const LLUUID& id, S32 received_size);
+
+ // Identical to @deleteRequest but with different arguments
+ // (caller already has the worker pointer).
+ //
+ // Threads: T*
+ void removeRequest(LLTextureFetchWorker* worker, bool cancel);
+
// Overrides from the LLThread tree
+ // Locks: Ct
bool runCondition();
private:
+ // Threads: Tmain
void sendRequestListToSimulators();
+
+ // Threads: Ttf
/*virtual*/ void startThread(void);
+
+ // Threads: Ttf
/*virtual*/ void endThread(void);
+
+ // Threads: Ttf
/*virtual*/ void threadedUpdate(void);
+
+ // Threads: Ttf
void commonUpdate();
// Metrics command helpers
@@ -132,6 +270,8 @@ private:
* Takes ownership of the TFRequest object.
*
* Method locks the command queue.
+ *
+ * Threads: T*
*/
void cmdEnqueue(TFRequest *);
@@ -142,6 +282,8 @@ private:
* Caller acquires ownership of the object and must dispose of it.
*
* Method locks the command queue.
+ *
+ * Threads: T*
*/
TFRequest * cmdDequeue();
@@ -151,6 +293,8 @@ private:
* additional commands.
*
* Method locks the command queue.
+ *
+ * Threads: Ttf
*/
void cmdDoWork();
@@ -170,38 +314,64 @@ private:
LLTextureCache* mTextureCache;
LLImageDecodeThread* mImageDecodeThread;
- LLCurlTextureRequest* mCurlGetRequest;
-
+
// Map of all requests by UUID
typedef std::map<LLUUID,LLTextureFetchWorker*> map_t;
- map_t mRequestMap;
+ map_t mRequestMap; // Mfq
// Set of requests that require network data
typedef std::set<LLUUID> queue_t;
- queue_t mNetworkQueue;
- queue_t mHTTPTextureQueue;
+ queue_t mNetworkQueue; // Mfnq
+ queue_t mHTTPTextureQueue; // Mfnq
typedef std::map<LLHost,std::set<LLUUID> > cancel_queue_t;
- cancel_queue_t mCancelQueue;
- F32 mTextureBandwidth;
- F32 mMaxBandwidth;
+ cancel_queue_t mCancelQueue; // Mfnq
+ F32 mTextureBandwidth; // <none>
+ F32 mMaxBandwidth; // Mfnq
LLTextureInfo mTextureInfo;
+ // XXX possible delete
+ U32 mHTTPTextureBits; // Mfnq
+
+ // XXX possible delete
+ //debug use
+ U32 mTotalHTTPRequests;
+
// Out-of-band cross-thread command queue. This command queue
// is logically tied to LLQueuedThread's list of
// QueuedRequest instances and so must be covered by the
// same locks.
typedef std::vector<TFRequest *> command_queue_t;
- command_queue_t mCommands;
+ command_queue_t mCommands; // Mfq
// If true, modifies some behaviors that help with QA tasks.
const bool mQAMode;
- // Count of POST requests outstanding. We maintain the count
- // indirectly in the CURL request responder's ctor and dtor and
- // use it when determining whether or not to sleep the thread. Can't
- // use the LLCurl module's request counter as it isn't thread compatible.
- // *NOTE: Don't mix Atomic and static, apr_initialize must be called first.
- LLAtomic32<S32> mCurlPOSTRequestCount;
+ // Interfaces and objects into the core http library used
+ // to make our HTTP requests. These replace the various
+ // LLCurl interfaces used in the past.
+ LLCore::HttpRequest * mHttpRequest; // Ttf
+ LLCore::HttpOptions * mHttpOptions; // Ttf
+ LLCore::HttpHeaders * mHttpHeaders; // Ttf
+ LLCore::HttpHeaders * mHttpMetricsHeaders; // Ttf
+ LLCore::HttpRequest::policy_t mHttpPolicyClass; // T*
+
+ // We use a resource semaphore to keep HTTP requests in
+ // WAIT_HTTP_RESOURCE2 if there aren't sufficient slots in the
+ // transport. This keeps them near where they can be cheaply
+ // reprioritized rather than dumping them all across a thread
+ // where it's more expensive to get at them. Requests in either
+ // SEND_HTTP_REQ or WAIT_HTTP_REQ charge against the semaphore
+ // and tracking state transitions is critical to liveness.
+ LLAtomicS32 mHttpSemaphore; // Ttf + Tmain
+
+ typedef std::set<LLUUID> wait_http_res_queue_t;
+ wait_http_res_queue_t mHttpWaitResource; // Mfnq
+
+ // Cumulative stats on the states/requests issued by
+ // textures running through here.
+ U32 mTotalCacheReadCount; // Mfq
+ U32 mTotalCacheWriteCount; // Mfq
+ U32 mTotalResourceWaitCount; // Mfq
public:
// A probabilistically-correct indicator that the current
@@ -237,7 +407,7 @@ public:
//debug use
class LLViewerFetchedTexture;
-class LLTextureFetchDebugger
+class LLTextureFetchDebugger : public LLCore::HttpHandler
{
friend class LLTextureFetch;
public:
@@ -281,12 +451,13 @@ private:
LLPointer<LLImageRaw> mRawImage;
e_curl_state mCurlState;
S32 mCurlReceivedSize;
- S32 mHTTPFailCount;
+ LLCore::HttpHandle mHttpHandle;
FetchEntry() :
mDecodedLevel(-1),
mFetchedSize(0),
- mDecodedSize(0)
+ mDecodedSize(0),
+ mHttpHandle(LLCORE_HTTP_HANDLE_INVALID)
{}
FetchEntry(LLUUID& id, S32 r_size, /*S32 f_discard, S32 c,*/ S32 level, S32 f_size, S32 d_size) :
mID(id),
@@ -295,10 +466,14 @@ private:
mFetchedSize(f_size),
mDecodedSize(d_size),
mNeedsAux(false),
- mHTTPFailCount(0)
+ mHttpHandle(LLCORE_HTTP_HANDLE_INVALID)
{}
};
- std::vector<FetchEntry> mFetchingHistory;
+ typedef std::vector<FetchEntry> fetch_list_t;
+ fetch_list_t mFetchingHistory;
+
+ typedef std::map<LLCore::HttpHandle, S32> handle_fetch_map_t;
+ handle_fetch_map_t mHandleToFetchIndex;
e_debug_state mState;
@@ -319,7 +494,8 @@ private:
LLTextureFetch* mFetcher;
LLTextureCache* mTextureCache;
LLImageDecodeThread* mImageDecodeThread;
- LLCurlTextureRequest* mCurlGetRequest;
+ LLCore::HttpHeaders* mHttpHeaders;
+ LLCore::HttpRequest::policy_t mHttpPolicyClass;
S32 mNumFetchedTextures;
S32 mNumCacheHits;
@@ -359,21 +535,18 @@ public:
void clearHistory();
void addHistoryEntry(LLTextureFetchWorker* worker);
- void setCurlGetRequest(LLCurlTextureRequest* request) { mCurlGetRequest = request;}
- LLCurlTextureRequest* getCurlGetRequest() { return mCurlGetRequest;}
+ // Inherited from LLCore::HttpHandler
+ // Threads: Ttf
+ virtual void onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response);
void startWork(e_debug_state state);
void setStopDebug() {mStopDebug = TRUE;}
void tryToStopDebug(); //stop everything
-
void callbackCacheRead(S32 id, bool success, LLImageFormatted* image,
S32 imagesize, BOOL islocal);
void callbackCacheWrite(S32 id, bool success);
void callbackDecoded(S32 id, bool success, LLImageRaw* raw, LLImageRaw* aux);
- void callbackHTTP(S32 id, const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer,
- bool partial, bool success);
-
+ void callbackHTTP(FetchEntry & fetch, LLCore::HttpResponse * response);
e_debug_state getState() {return mState;}
S32 getNumFetchedTextures() {return mNumFetchedTextures;}
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index c60b4155a0..16c42dbd43 100755..100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * Copyright (C) 2012, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -74,7 +74,7 @@ static std::string title_string4(" W x H (Dis) Mem");
static S32 title_x1 = 0;
static S32 title_x2 = 460;
static S32 title_x3 = title_x2 + 40;
-static S32 title_x4 = title_x3 + 50;
+static S32 title_x4 = title_x3 + 46;
static S32 texture_bar_height = 8;
////////////////////////////////////////////////////////////////////////////
@@ -232,6 +232,8 @@ void LLTextureBar::draw()
{ "DSK", LLColor4::blue }, // CACHE_POST
{ "NET", LLColor4::green }, // LOAD_FROM_NETWORK
{ "SIM", LLColor4::green }, // LOAD_FROM_SIMULATOR
+ { "HTW", LLColor4::green }, // WAIT_HTTP_RESOURCE
+ { "HTW", LLColor4::green }, // WAIT_HTTP_RESOURCE2
{ "REQ", LLColor4::yellow },// SEND_HTTP_REQ
{ "HTP", LLColor4::green }, // WAIT_HTTP_REQ
{ "DEC", LLColor4::yellow },// DECODE_IMAGE
@@ -239,7 +241,7 @@ void LLTextureBar::draw()
{ "WRT", LLColor4::purple },// WRITE_TO_CACHE
{ "WRT", LLColor4::orange },// WAIT_ON_WRITE
{ "END", LLColor4::red }, // DONE
-#define LAST_STATE 12
+#define LAST_STATE 14
{ "CRE", LLColor4::magenta }, // LAST_STATE+1
{ "FUL", LLColor4::green }, // LAST_STATE+2
{ "BAD", LLColor4::red }, // LAST_STATE+3
@@ -345,7 +347,7 @@ void LLTextureBar::draw()
// draw the image size at the end
{
- std::string num_str = llformat("%3dx%3d (%d) %7d", mImagep->getWidth(), mImagep->getHeight(),
+ std::string num_str = llformat("%3dx%3d (%2d) %7d", mImagep->getWidth(), mImagep->getHeight(),
mImagep->getDiscardLevel(), mImagep->hasGLTexture() ? mImagep->getTextureMemory() : 0);
LLFontGL::getFontMonospace()->renderUTF8(num_str, 0, title_x4, getRect().getHeight(), color,
LLFontGL::LEFT, LLFontGL::TOP);
@@ -514,14 +516,18 @@ void LLGLTexMemBar::draw()
S32 v_offset = 0;//(S32)((texture_bar_height + 2.2f) * mTextureView->mNumTextureBars + 2.0f);
F32 total_texture_downloaded = (F32)gTotalTextureBytes / (1024 * 1024);
F32 total_object_downloaded = (F32)gTotalObjectBytes / (1024 * 1024);
- U32 total_http_requests = LLAppViewer::getTextureFetch()->getCurlRequest().getTotalIssuedRequests() ;
+ U32 total_http_requests = LLAppViewer::getTextureFetch()->getTotalNumHTTPRequests();
//----------------------------------------------------------------------------
LLGLSUIDefault gls_ui;
LLColor4 text_color(1.f, 1.f, 1.f, 0.75f);
LLColor4 color;
-
- std::string text = "";
+ // Gray background using completely magic numbers
+ gGL.color4f(0.f, 0.f, 0.f, 0.25f);
+ // const LLRect & rect(getRect());
+ // gl_rect_2d(-4, v_offset, rect.mRight - rect.mLeft + 2, v_offset + line_height*4);
+
+ std::string text = "";
LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*6,
text_color, LLFontGL::LEFT, LLFontGL::TOP);
@@ -531,14 +537,26 @@ void LLGLTexMemBar::draw()
bound_mem,
max_bound_mem,
LLRenderTarget::sBytesAllocated/(1024*1024),
- LLImageRaw::sGlobalRawMemory >> 20, discard_bias,
- cache_usage, cache_max_usage);
+ LLImageRaw::sGlobalRawMemory >> 20,
+ discard_bias,
+ cache_usage,
+ cache_max_usage);
+ //, cache_entries, cache_max_entries
+
LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*4,
text_color, LLFontGL::LEFT, LLFontGL::TOP);
- text = llformat("Net Tot Tex: %.1f MB Tot Obj: %.1f MB Tot Htp: %d",
- total_texture_downloaded, total_object_downloaded, total_http_requests);
- //, cache_entries, cache_max_entries
+ U32 cache_read(0U), cache_write(0U), res_wait(0U);
+ LLAppViewer::getTextureFetch()->getStateStats(&cache_read, &cache_write, &res_wait);
+
+ text = llformat("Net Tot Tex: %.1f MB Tot Obj: %.1f MB Tot Htp: %d Cread: %u Cwrite: %u Rwait: %u",
+ total_texture_downloaded,
+ total_object_downloaded,
+ total_http_requests,
+ cache_read,
+ cache_write,
+ res_wait);
+
LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*3,
text_color, LLFontGL::LEFT, LLFontGL::TOP);
@@ -552,7 +570,7 @@ void LLGLTexMemBar::draw()
LLAppViewer::getTextureCache()->getNumReads(), LLAppViewer::getTextureCache()->getNumWrites(),
LLLFSThread::sLocal->getPending(),
LLImageRaw::sRawImageCount,
- LLAppViewer::getTextureFetch()->getCurlRequest().getNumRequests(),
+ LLAppViewer::getTextureFetch()->getNumHTTPRequests(),
LLAppViewer::getImageDecodeThread()->getPending(),
gTextureList.mCreateTextureList.size());
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 0eec7f0afd..9dfb29b905 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -118,7 +118,7 @@ LLToast::LLToast(const LLToast::Params& p)
{
mTimer.reset(new LLToastLifeTimer(this, p.lifetime_secs));
- buildFromFile("panel_toast.xml", NULL);
+ buildFromFile("panel_toast.xml");
setCanDrag(FALSE);
diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h
index e1d99b1bcb..ea62f758f8 100644
--- a/indra/newview/lltoast.h
+++ b/indra/newview/lltoast.h
@@ -169,6 +169,7 @@ public:
// get/set Toast's flags or states
// get information whether the notification corresponding to the toast is valid or not
bool isNotificationValid();
+
// get toast's Notification ID
const LLUUID getNotificationID() const { return mNotificationID;}
// get toast's Session ID
@@ -212,7 +213,7 @@ private:
//LLRootHandle<LLToast> mHandle;
- LLPanel* mWrapperPanel;
+ LLPanel* mWrapperPanel;
// timer counts a lifetime of a toast
std::auto_ptr<LLToastLifeTimer> mTimer;
@@ -220,8 +221,8 @@ private:
F32 mToastLifetime; // in seconds
F32 mToastFadingTime; // in seconds
- LLPanel* mPanel;
- LLButton* mHideBtn;
+ LLPanel* mPanel;
+ LLButton* mHideBtn;
LLColor4 mBgColor;
bool mCanFade;
diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp
index 8fef2ed6d1..3f75f8da5e 100644
--- a/indra/newview/lltoastalertpanel.cpp
+++ b/indra/newview/lltoastalertpanel.cpp
@@ -357,6 +357,7 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
if (mLineEditor)
{
mLineEditor->selectAll();
+ mLineEditor->setFocus(TRUE);
}
if(mDefaultOption >= 0)
{
diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp
index 75178a6ef8..4dc0d424ac 100644
--- a/indra/newview/lltoastgroupnotifypanel.cpp
+++ b/indra/newview/lltoastgroupnotifypanel.cpp
@@ -51,7 +51,7 @@
const S32 LLToastGroupNotifyPanel::DEFAULT_MESSAGE_MAX_LINE_COUNT = 7;
-LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification)
+LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(const LLNotificationPtr& notification)
: LLToastPanel(notification),
mInventoryOffer(NULL)
{
@@ -69,10 +69,8 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification
//header title
std::string from_name = payload["sender_name"].asString();
- if (LLAvatarNameCache::useDisplayNames())
- {
- from_name = LLCacheName::buildUsername(from_name);
- }
+ from_name = LLCacheName::buildUsername(from_name);
+
std::stringstream from;
from << from_name << "/" << groupData.mName;
LLTextBox* pTitleText = getChild<LLTextBox>("title");
@@ -112,7 +110,7 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification
style.font = date_font;
pMessageText->appendText(timeStr + "\n", TRUE, style);
- style.font = pMessageText->getDefaultFont();
+ style.font = pMessageText->getFont();
pMessageText->appendText(message, TRUE, style);
//attachment
diff --git a/indra/newview/lltoastgroupnotifypanel.h b/indra/newview/lltoastgroupnotifypanel.h
index 7794ec9f63..dfdc6ae559 100644
--- a/indra/newview/lltoastgroupnotifypanel.h
+++ b/indra/newview/lltoastgroupnotifypanel.h
@@ -47,13 +47,10 @@ class LLToastGroupNotifyPanel
public:
void close();
- static bool onNewNotification(const LLSD& notification);
-
-
// Non-transient messages. You can specify non-default button
// layouts (like one for script dialogs) by passing various
// numbers in for "layout".
- LLToastGroupNotifyPanel(LLNotificationPtr& notification);
+ LLToastGroupNotifyPanel(const LLNotificationPtr& notification);
/*virtual*/ ~LLToastGroupNotifyPanel();
protected:
diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
index e0cb200ef5..75e6e3d13a 100644
--- a/indra/newview/lltoastimpanel.cpp
+++ b/indra/newview/lltoastimpanel.cpp
@@ -104,9 +104,9 @@ LLToastIMPanel::~LLToastIMPanel()
}
//virtual
-BOOL LLToastIMPanel::handleMouseDown(S32 x, S32 y, MASK mask)
+BOOL LLToastIMPanel::handleMouseUp(S32 x, S32 y, MASK mask)
{
- if (LLPanel::handleMouseDown(x,y,mask) == FALSE)
+ if (LLPanel::handleMouseUp(x,y,mask) == FALSE)
{
mNotification->respond(mNotification->getResponseTemplate());
}
diff --git a/indra/newview/lltoastimpanel.h b/indra/newview/lltoastimpanel.h
index a803387576..3eb11fb3bc 100644
--- a/indra/newview/lltoastimpanel.h
+++ b/indra/newview/lltoastimpanel.h
@@ -41,18 +41,18 @@ public:
struct Params
{
LLNotificationPtr notification;
- LLUUID avatar_id;
- LLUUID session_id;
- std::string from;
- std::string time;
- std::string message;
+ LLUUID avatar_id,
+ session_id;
+ std::string from,
+ time,
+ message;
Params() {}
};
LLToastIMPanel(LLToastIMPanel::Params &p);
virtual ~LLToastIMPanel();
- /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
private:
void showInspector();
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 602b924398..4ef5ad845c 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -40,11 +40,14 @@
#include "lltrans.h"
#include "llnotificationsutil.h"
#include "llviewermessage.h"
-#include "llimfloater.h"
+#include "llfloaterimsession.h"
const S32 BOTTOM_PAD = VPAD * 3;
const S32 IGNORE_BTN_TOP_DELTA = 3*VPAD;//additional ignore_btn padding
S32 BUTTON_WIDTH = 90;
+// *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;
+
//static
const LLFontGL* LLToastNotifyPanel::sFont = NULL;
@@ -52,172 +55,12 @@ const LLFontGL* LLToastNotifyPanel::sFontSmall = NULL;
LLToastNotifyPanel::button_click_signal_t LLToastNotifyPanel::sButtonClickSignal;
-LLToastNotifyPanel::LLToastNotifyPanel(const LLNotificationPtr& notification, const LLRect& rect, bool show_images) :
-LLToastPanel(notification),
-mTextBox(NULL),
-mInfoPanel(NULL),
-mControlPanel(NULL),
-mNumOptions(0),
-mNumButtons(0),
-mAddedDefaultBtn(false),
-mCloseNotificationOnDestroy(true)
+LLToastNotifyPanel::LLToastNotifyPanel(const LLNotificationPtr& notification, const LLRect& rect, bool show_images)
+: LLToastPanel(notification),
+ LLInstanceTracker<LLToastNotifyPanel, LLUUID>(notification->getID())
{
- buildFromFile( "panel_notification.xml");
- if(rect != LLRect::null)
- {
- this->setShape(rect);
- }
- mInfoPanel = getChild<LLPanel>("info_panel");
- mControlPanel = getChild<LLPanel>("control_panel");
- BUTTON_WIDTH = gSavedSettings.getS32("ToastButtonWidth");
- // customize panel's attributes
- // is it intended for displaying a tip?
- mIsTip = notification->getType() == "notifytip";
- // is it a script dialog?
- mIsScriptDialog = (notification->getName() == "ScriptDialog" || notification->getName() == "ScriptDialogGroup");
- // is it a caution?
- //
- // caution flag can be set explicitly by specifying it in the notification payload, or it can be set implicitly if the
- // notify xml template specifies that it is a caution
- // tip-style notification handle 'caution' differently -they display the tip in a different color
- mIsCaution = notification->getPriority() >= NOTIFICATION_PRIORITY_HIGH;
-
- // setup parameters
- // get a notification message
- mMessage = notification->getMessage();
- // init font variables
- if (!sFont)
- {
- sFont = LLFontGL::getFontSansSerif();
- sFontSmall = LLFontGL::getFontSansSerifSmall();
- }
- // initialize
- setFocusRoot(!mIsTip);
- // get a form for the notification
- LLNotificationFormPtr form(notification->getForm());
- // get number of elements
- mNumOptions = form->getNumElements();
-
- // customize panel's outfit
- // preliminary adjust panel's layout
- //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
- if (mIsCaution && !mIsTip)
- {
- mTextBox = getChild<LLTextBox>("caution_text_box");
- }
- else
- {
- mTextBox = getChild<LLTextEditor>("text_editor_box");
- }
-
- // *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->setPlainText(!show_images);
- mTextBox->setValue(notification->getMessage());
-
- // add buttons for a script notification
- 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);
- if (form_element["type"].asString() != "button")
- {
- // not a button.
- continue;
- }
- if (form_element["name"].asString() == TEXTBOX_MAGIC_TOKEN)
- {
- // a textbox pretending to be a button.
- continue;
- }
- 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 (buttons.empty())
- {
- 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
- */
- S32 button_per_row = button_panel_width / BUTTON_WIDTH;
- h_pad = (button_panel_width % BUTTON_WIDTH) / (button_per_row - 1);// -1 because we do not need space after last button in a row
- if(h_pad < 2*HPAD) // still not enough space between buttons ?
- {
- h_pad = 2*HPAD;
- }
- }
- if (mIsScriptDialog)
- {
- // 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);
- // save buttons for later use in disableButtons()
- mButtons.assign(buttons.begin(), buttons.end());
- }
+ init(rect, show_images);
}
- // adjust panel's height to the text size
- mInfoPanel->setFollowsAll();
- snapToMessageHeight(mTextBox, MAX_LENGTH);
-
- if(notification->isReusable())
- {
- mButtonClickConnection = sButtonClickSignal.connect(
- boost::bind(&LLToastNotifyPanel::onToastPanelButtonClicked, this, _1, _2));
-
- if(notification->isRespondedTo())
- {
- // User selected an option in toast, now disable required buttons in IM window
- disableRespondedOptions(notification);
- }
- }
-}
void LLToastNotifyPanel::addDefaultButton()
{
LLSD form_element;
@@ -235,7 +78,6 @@ void LLToastNotifyPanel::addDefaultButton()
}
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() : "";
@@ -245,14 +87,15 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, BOOL is_opt
LLButton::Params p;
bool make_small_btn = form_element["index"].asInteger() == -1 || form_element["index"].asInteger() == -2;
const LLFontGL* font = make_small_btn ? sFontSmall: sFont; // for block and ignore buttons in script dialog
- p.name(form_element["name"].asString());
- p.label(form_element["text"].asString());
- p.font(font);
+ 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_LEFT | FOLLOWS_BOTTOM);
+ p.enabled = !form_element.has("enabled") || form_element["enabled"].asBoolean();
if (mIsCaution)
{
p.image_color(LLUIColorTable::instance().getColor("ButtonCautionImageColor"));
@@ -287,16 +130,11 @@ LLToastNotifyPanel::~LLToastNotifyPanel()
mButtonClickConnection.disconnect();
std::for_each(mBtnCallbackData.begin(), mBtnCallbackData.end(), DeletePointer());
- if (mCloseNotificationOnDestroy && LLNotificationsUtil::find(mNotification->getID()) != NULL)
- {
- // let reusable notification be deleted
- mNotification->setReusable(false);
- if (!mNotification->isPersistent())
+ if (mIsTip)
{
LLNotifications::getInstance()->cancel(mNotification);
}
}
-}
void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair_t>& buttons, S32 h_pad)
{
@@ -385,210 +223,278 @@ void LLToastNotifyPanel::adjustPanelForTipNotice()
}
}
-typedef std::set<std::string> button_name_set_t;
-typedef std::map<std::string, button_name_set_t> disable_button_map_t;
-
-disable_button_map_t initUserGiveItemDisableButtonMap()
+// static
+void LLToastNotifyPanel::onClickButton(void* data)
{
- // see EXT-5905 for disable rules
-
- disable_button_map_t disable_map;
- button_name_set_t buttons;
-
- buttons.insert("Show");
- disable_map.insert(std::make_pair("Show", buttons));
+ InstanceAndS32* self_and_button = (InstanceAndS32*)data;
+ LLToastNotifyPanel* self = self_and_button->mSelf;
+ std::string button_name = self_and_button->mButtonName;
- buttons.insert("Discard");
- disable_map.insert(std::make_pair("Discard", buttons));
+ LLSD response = self->mNotification->getResponseTemplate();
+ if (!self->mAddedDefaultBtn && !button_name.empty())
+ {
+ response[button_name] = true;
+ }
- buttons.insert("Mute");
- disable_map.insert(std::make_pair("Mute", buttons));
+ // disable all buttons
+ self->mControlPanel->setEnabled(FALSE);
- return disable_map;
+ // this might repost notification with new form data/enabled buttons
+ self->mNotification->respond(response);
}
-disable_button_map_t initTeleportOfferedDisableButtonMap()
+void LLToastNotifyPanel::init( LLRect rect, bool show_images )
{
- disable_button_map_t disable_map;
- button_name_set_t buttons;
-
- buttons.insert("Teleport");
- buttons.insert("Cancel");
-
- disable_map.insert(std::make_pair("Teleport", buttons));
- disable_map.insert(std::make_pair("Cancel", buttons));
+ deleteAllChildren();
+
+ mTextBox = NULL;
+ mInfoPanel = NULL;
+ mControlPanel = NULL;
+ mNumOptions = 0;
+ mNumButtons = 0;
+ mAddedDefaultBtn = false;
+
+ LLRect current_rect = getRect();
+
+ setXMLFilename("");
+ buildFromFile("panel_notification.xml");
+
+ if(rect != LLRect::null)
+ {
+ this->setShape(rect);
+ }
+ mInfoPanel = getChild<LLPanel>("info_panel");
+
+ mControlPanel = getChild<LLPanel>("control_panel");
+ BUTTON_WIDTH = gSavedSettings.getS32("ToastButtonWidth");
+ // customize panel's attributes
+ // is it intended for displaying a tip?
+ mIsTip = mNotification->getType() == "notifytip";
+ // is it a script dialog?
+ mIsScriptDialog = (mNotification->getName() == "ScriptDialog" || mNotification->getName() == "ScriptDialogGroup");
+ // is it a caution?
+ //
+ // caution flag can be set explicitly by specifying it in the notification payload, or it can be set implicitly if the
+ // notify xml template specifies that it is a caution
+ // tip-style notification handle 'caution' differently -they display the tip in a different color
+ mIsCaution = mNotification->getPriority() >= NOTIFICATION_PRIORITY_HIGH;
+
+ // setup parameters
+ // get a notification message
+ mMessage = mNotification->getMessage();
+ // init font variables
+ if (!sFont)
+ {
+ sFont = LLFontGL::getFontSansSerif();
+ sFontSmall = LLFontGL::getFontSansSerifSmall();
+ }
+ // initialize
+ setFocusRoot(!mIsTip);
+ // get a form for the notification
+ LLNotificationFormPtr form(mNotification->getForm());
+ // get number of elements
+ mNumOptions = form->getNumElements();
+
+ // customize panel's outfit
+ // preliminary adjust panel's layout
+ //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
+ if (mIsCaution && !mIsTip)
+ {
+ mTextBox = getChild<LLTextBox>("caution_text_box");
+ }
+ else
+ {
+ mTextBox = getChild<LLTextEditor>("text_editor_box");
+ }
+
+ mTextBox->setMaxTextLength(MAX_LENGTH);
+ mTextBox->setVisible(TRUE);
+ mTextBox->setPlainText(!show_images);
+ mTextBox->setValue(mNotification->getMessage());
+
+ // add buttons for a script notification
+ 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);
+ if (form_element["type"].asString() != "button")
+ {
+ // not a button.
+ continue;
+ }
+ if (form_element["name"].asString() == TEXTBOX_MAGIC_TOKEN)
+ {
+ // a textbox pretending to be a button.
+ continue;
+ }
+ 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 (buttons.empty())
+ {
+ 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
+ */
+ S32 button_per_row = button_panel_width / BUTTON_WIDTH;
+ h_pad = (button_panel_width % BUTTON_WIDTH) / (button_per_row - 1);// -1 because we do not need space after last button in a row
+ if(h_pad < 2*HPAD) // still not enough space between buttons ?
+ {
+ h_pad = 2*HPAD;
+ }
+ }
+ if (mIsScriptDialog)
+ {
+ // 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);
+ // save buttons for later use in disableButtons()
+ //mButtons.assign(buttons.begin(), buttons.end());
+ }
+ }
+
+ //.xml file intially makes info panel only follow left/right/top. This is so that when control buttons are added the info panel
+ //can shift upward making room for the buttons inside mControlPanel. After the buttons are added, the info panel can then be set to follow 'all'.
+ mInfoPanel->setFollowsAll();
+ snapToMessageHeight(mTextBox, MAX_LENGTH);
- return disable_map;
+ // reshape the panel to its previous size
+ if (current_rect.notEmpty())
+ {
+ reshape(current_rect.getWidth(), current_rect.getHeight());
+ }
}
-disable_button_map_t initFriendshipOfferedDisableButtonMap()
-{
- disable_button_map_t disable_map;
- button_name_set_t buttons;
-
- buttons.insert("Accept");
- buttons.insert("Decline");
-
- disable_map.insert(std::make_pair("Accept", buttons));
- disable_map.insert(std::make_pair("Decline", buttons));
+//////////////////////////////////////////////////////////////////////////
- return disable_map;
+LLIMToastNotifyPanel::LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect /* = LLRect::null */,
+ bool show_images /* = true */, LLTextBase* parent_text)
+: mSessionID(session_id), LLToastNotifyPanel(pNotification, rect, show_images),
+ mParentText(parent_text)
+{
+ compactButtons();
}
-button_name_set_t getButtonDisableList(const std::string& notification_name, const std::string& button_name)
+LLIMToastNotifyPanel::~LLIMToastNotifyPanel()
{
- static disable_button_map_t user_give_item_disable_map = initUserGiveItemDisableButtonMap();
- static disable_button_map_t teleport_offered_disable_map = initTeleportOfferedDisableButtonMap();
- static disable_button_map_t friendship_offered_disable_map = initFriendshipOfferedDisableButtonMap();
-
- disable_button_map_t::const_iterator it;
- disable_button_map_t::const_iterator it_end;
- disable_button_map_t search_map;
-
- if("UserGiveItem" == notification_name)
- {
- search_map = user_give_item_disable_map;
- }
- else if(("TeleportOffered" == notification_name) || ("TeleportOffered_MaturityExceeded" == notification_name))
- {
- search_map = teleport_offered_disable_map;
- }
- else if("OfferFriendship" == notification_name)
- {
- search_map = friendship_offered_disable_map;
- }
-
- it = search_map.find(button_name);
- it_end = search_map.end();
-
- if(it_end != it)
- {
- return it->second;
- }
- return button_name_set_t();
}
-void LLToastNotifyPanel::disableButtons(const std::string& notification_name, const std::string& selected_button)
+void LLIMToastNotifyPanel::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */)
{
- button_name_set_t buttons = getButtonDisableList(notification_name, selected_button);
-
- std::vector<index_button_pair_t>::const_iterator it = mButtons.begin();
- for ( ; it != mButtons.end(); it++)
- {
- LLButton* btn = it->second;
- if(buttons.find(btn->getName()) != buttons.end())
- {
- btn->setEnabled(FALSE);
- }
- }
+ LLToastPanel::reshape(width, height, called_from_parent);
+ snapToMessageHeight();
}
-// static
-void LLToastNotifyPanel::onClickButton(void* data)
+void LLIMToastNotifyPanel::snapToMessageHeight()
{
- InstanceAndS32* self_and_button = (InstanceAndS32*)data;
- LLToastNotifyPanel* self = self_and_button->mSelf;
- std::string button_name = self_and_button->mButtonName;
-
- LLSD response = self->mNotification->getResponseTemplate();
- if (!self->mAddedDefaultBtn && !button_name.empty())
- {
- response[button_name] = true;
- }
-
- bool is_reusable = self->mNotification->isReusable();
- // When we call respond(), LLOfferInfo will delete itself in inventory_offer_callback(),
- // lets copy it while it's still valid.
- LLOfferInfo* old_info = static_cast<LLOfferInfo*>(self->mNotification->getResponder());
- LLOfferInfo* new_info = NULL;
- if(is_reusable && old_info)
+ if(!mTextBox)
{
- new_info = new LLOfferInfo(*old_info);
- self->mNotification->setResponder(new_info);
+ return;
}
- self->mNotification->respond(response);
-
- if(is_reusable)
- {
- sButtonClickSignal(self->mNotification->getID(), button_name);
- }
- else
+ //Add message height if it is visible
+ if (mTextBox->getVisible())
{
- // disable all buttons
- self->mControlPanel->setEnabled(FALSE);
- }
-}
+ S32 new_panel_height = computeSnappedToMessageHeight(mTextBox, MAX_LENGTH);
-void LLToastNotifyPanel::onToastPanelButtonClicked(const LLUUID& notification_id, const std::string btn_name)
-{
- if(mNotification->getID() == notification_id)
- {
- disableButtons(mNotification->getName(), btn_name);
+ //reshape the panel with new height
+ if (new_panel_height != getRect().getHeight())
+ {
+ LLToastNotifyPanel::reshape( getRect().getWidth(), new_panel_height);
+ }
}
}
-void LLToastNotifyPanel::disableRespondedOptions(const LLNotificationPtr& notification)
+void LLIMToastNotifyPanel::compactButtons()
{
- LLSD response = notification->getResponse();
- for (LLSD::map_const_iterator response_it = response.beginMap();
- response_it != response.endMap(); ++response_it)
+ //we can't set follows in xml since it broke toasts behavior
+ setFollows(FOLLOWS_LEFT|FOLLOWS_RIGHT|FOLLOWS_TOP);
+
+ const child_list_t* children = getControlPanel()->getChildList();
+ S32 offset = 0;
+ // Children were added by addChild() which uses push_front to insert them into list,
+ // so to get buttons in correct order reverse iterator is used (EXT-5906)
+ for (child_list_t::const_reverse_iterator it = children->rbegin(); it != children->rend(); it++)
{
- if (response_it->second.isBoolean() && response_it->second.asBoolean())
+ LLButton * button = dynamic_cast<LLButton*> (*it);
+ if (button != NULL)
{
- // that after multiple responses there can be many pressed buttons
- // need to process them all
- disableButtons(notification->getName(), response_it->first);
+ button->setOrigin( offset,button->getRect().mBottom);
+ button->setLeftHPad(2 * HPAD);
+ button->setRightHPad(2 * HPAD);
+ // set zero width before perform autoResize()
+ button->setRect(LLRect(button->getRect().mLeft,
+ button->getRect().mTop,
+ button->getRect().mLeft,
+ button->getRect().mBottom));
+ button->setAutoResize(true);
+ button->autoResize();
+ offset += HPAD + button->getRect().getWidth();
+ button->setFollowsNone();
}
}
-}
-
-//////////////////////////////////////////////////////////////////////////
-
-LLIMToastNotifyPanel::LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect /* = LLRect::null */,
- bool show_images /* = true */)
- : mSessionID(session_id), LLToastNotifyPanel(pNotification, rect, show_images)
-{
- mTextBox->setFollowsAll();
+ if (mParentText)
+ {
+ mParentText->needsReflow();
+ }
}
-LLIMToastNotifyPanel::~LLIMToastNotifyPanel()
-{
- // We shouldn't delete notification when IM floater exists
- // since that notification will be reused by IM floater.
- // This may happened when IM floater reloads messages, exactly when user
- // changes layout of IM chat log(disable/enable plaintext mode).
- // See EXT-6500
- LLIMFloater* im_floater = LLIMFloater::findInstance(mSessionID);
- if (im_floater != NULL && !im_floater->isDead())
+void LLIMToastNotifyPanel::updateNotification()
{
- mCloseNotificationOnDestroy = false;
+ init(LLRect(), true);
}
-}
-void LLIMToastNotifyPanel::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */)
+void LLIMToastNotifyPanel::init( LLRect rect, bool show_images )
{
- S32 text_height = mTextBox->getTextBoundingRect().getHeight();
- S32 widget_height = mTextBox->getRect().getHeight();
- S32 delta = text_height - widget_height;
- LLRect rc = getRect();
+ LLToastNotifyPanel::init(LLRect(), show_images);
- rc.setLeftTopAndSize(rc.mLeft, rc.mTop, width, height + delta);
- height = rc.getHeight();
- width = rc.getWidth();
-
- bool is_width_changed = width != getRect().getWidth();
-
- LLToastPanel::reshape(width, height, called_from_parent);
-
- // Notification height required to display the text message depends on
- // the width of the text box thus if panel width is changed the text box
- // width is also changed then reshape() is called to adjust proper height.
- if (is_width_changed)
- {
- reshape(width, height, called_from_parent);
- }
+ compactButtons();
}
// EOF
+
diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h
index db517ec858..d02171b512 100644
--- a/indra/newview/lltoastnotifypanel.h
+++ b/indra/newview/lltoastnotifypanel.h
@@ -47,7 +47,7 @@ class LLNotificationForm;
* @deprecated this class will be removed after all toast panel types are
* implemented in separate classes.
*/
-class LLToastNotifyPanel: public LLToastPanel
+class LLToastNotifyPanel: public LLToastPanel, public LLInstanceTracker<LLToastNotifyPanel, LLUUID>
{
public:
/**
@@ -61,10 +61,14 @@ public:
* implement right class for desired toast panel. @see LLGenericTipPanel as example.
*/
LLToastNotifyPanel(const LLNotificationPtr& pNotification, const LLRect& rect = LLRect::null, bool show_images = true);
+
+ virtual void init( LLRect rect, bool show_images );
+
virtual ~LLToastNotifyPanel();
LLPanel * getControlPanel() { return mControlPanel; }
- void setCloseNotificationOnDestroy(bool close) { mCloseNotificationOnDestroy = close; }
+ virtual void updateNotification() {}
+
protected:
LLButton* createButton(const LLSD& form_element, BOOL is_option);
@@ -76,8 +80,6 @@ protected:
};
std::vector<InstanceAndS32*> mBtnCallbackData;
- bool mCloseNotificationOnDestroy;
-
typedef std::pair<int,LLButton*> index_button_pair_t;
void adjustPanelForScriptNotice(S32 max_width, S32 max_height);
void adjustPanelForTipNotice();
@@ -93,9 +95,9 @@ protected:
/**
* Disable specific button(s) based on notification name and clicked button
*/
- void disableButtons(const std::string& notification_name, const std::string& selected_button);
+ //void disableButtons(const std::string& notification_name, const std::string& selected_button);
- std::vector<index_button_pair_t> mButtons;
+ //std::vector<index_button_pair_t> mButtons;
// panel elements
LLTextBase* mTextBox;
@@ -118,7 +120,7 @@ protected:
/**
* Process response data. Will disable selected options
*/
- void disableRespondedOptions(const LLNotificationPtr& notification);
+ //void disableRespondedOptions(const LLNotificationPtr& notification);
bool mIsTip;
bool mAddedDefaultBtn;
@@ -137,14 +139,27 @@ class LLIMToastNotifyPanel : public LLToastNotifyPanel
{
public:
- LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect = LLRect::null, bool show_images = true);
+ LLIMToastNotifyPanel(LLNotificationPtr& pNotification,
+ const LLUUID& session_id,
+ const LLRect& rect = LLRect::null,
+ bool show_images = true,
+ LLTextBase* parent_text = NULL);
+
+ void compactButtons();
+
+ virtual void updateNotification();
+ virtual void init( LLRect rect, bool show_images );
~LLIMToastNotifyPanel();
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
protected:
+ LLTextBase* mParentText;
LLUUID mSessionID;
+
+private:
+ void snapToMessageHeight();
};
#endif /* LLTOASTNOTIFYPANEL_H_ */
diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp
index c33fde99c5..a30f841980 100644
--- a/indra/newview/lltoastpanel.cpp
+++ b/indra/newview/lltoastpanel.cpp
@@ -58,6 +58,25 @@ const LLUUID& LLToastPanel::getID()
return mNotification->id();
}
+S32 LLToastPanel::computeSnappedToMessageHeight(LLTextBase* message, S32 maxLineCount)
+{
+ S32 heightDelta = 0;
+ S32 maxTextHeight = message->getFont()->getLineHeight() * maxLineCount;
+
+ LLRect messageRect = message->getRect();
+ S32 oldTextHeight = messageRect.getHeight();
+
+ //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->getTextBoundingRect().getHeight();
+ S32 newTextHeight = llmin(requiredTextHeight, maxTextHeight);
+
+ heightDelta = newTextHeight - oldTextHeight;
+ S32 new_panel_height = llmax(getRect().getHeight() + heightDelta, MIN_PANEL_HEIGHT);
+
+ return new_panel_height;
+}
+
//snap to the message height if it is visible
void LLToastPanel::snapToMessageHeight(LLTextBase* message, S32 maxLineCount)
{
@@ -69,22 +88,13 @@ void LLToastPanel::snapToMessageHeight(LLTextBase* message, S32 maxLineCount)
//Add message height if it is visible
if (message->getVisible())
{
- S32 heightDelta = 0;
- S32 maxTextHeight = message->getDefaultFont()->getLineHeight() * maxLineCount;
-
- LLRect messageRect = message->getRect();
- S32 oldTextHeight = messageRect.getHeight();
-
- //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->getTextBoundingRect().getHeight();
- S32 newTextHeight = llmin(requiredTextHeight, maxTextHeight);
-
- //Calculate last delta height deducting previous heightDelta
- heightDelta = newTextHeight - oldTextHeight - heightDelta;
+ S32 new_panel_height = computeSnappedToMessageHeight(message, maxLineCount);
//reshape the panel with new height
- reshape( getRect().getWidth(), llmax(getRect().getHeight() + heightDelta, MIN_PANEL_HEIGHT));
+ if (new_panel_height != getRect().getHeight())
+ {
+ reshape( getRect().getWidth(), new_panel_height);
+ }
}
}
@@ -98,7 +108,7 @@ LLToastPanel* LLToastPanel::buidPanelFromNotification(
if ("notifytip" == notification->getType())
{
// if it is online/offline notification
- if ("FriendOffline" == notification->getName() || "FriendOnline" == notification->getName())
+ if ("FriendOnlineOffline" == notification->getName())
{
res = new LLPanelOnlineStatus(notification);
}
diff --git a/indra/newview/lltoastpanel.h b/indra/newview/lltoastpanel.h
index 346e014d73..e4ab95007e 100644
--- a/indra/newview/lltoastpanel.h
+++ b/indra/newview/lltoastpanel.h
@@ -33,19 +33,13 @@
#include <string>
-class LLToastPanelBase: public LLPanel
-{
-public:
- virtual void init(LLSD& data){};
-};
-
/**
* Base class for all panels that can be added to the toast.
* All toast panels should contain necessary logic for representing certain notification
* but shouldn't contain logic related to this panel lifetime control and positioning
* on the parent view.
*/
-class LLToastPanel: public LLPanel {
+class LLToastPanel : public LLPanel {
public:
LLToastPanel(const LLNotificationPtr&);
virtual ~LLToastPanel() = 0;
@@ -65,6 +59,7 @@ public:
protected:
LLNotificationPtr mNotification;
void snapToMessageHeight(LLTextBase* message, S32 maxLineCount);
+ S32 computeSnappedToMessageHeight(LLTextBase* message, S32 maxLineCount);
};
#endif /* LL_TOASTPANEL_H */
diff --git a/indra/newview/lltoastscriptquestion.cpp b/indra/newview/lltoastscriptquestion.cpp
index feeb8ca77b..91ba8c0247 100644
--- a/indra/newview/lltoastscriptquestion.cpp
+++ b/indra/newview/lltoastscriptquestion.cpp
@@ -66,8 +66,8 @@ void LLToastScriptQuestion::snapToMessageHeight()
if (mMessage->getVisible() && mFooter->getVisible())
{
S32 heightDelta = 0;
- S32 maxTextHeight = (mMessage->getDefaultFont()->getLineHeight() * MAX_LINES_COUNT)
- + (mFooter->getDefaultFont()->getLineHeight() * MAX_LINES_COUNT);
+ S32 maxTextHeight = (mMessage->getFont()->getLineHeight() * MAX_LINES_COUNT)
+ + (mFooter->getFont()->getLineHeight() * MAX_LINES_COUNT);
LLRect messageRect = mMessage->getRect();
LLRect footerRect = mFooter->getRect();
diff --git a/indra/newview/lltoastscripttextbox.cpp b/indra/newview/lltoastscripttextbox.cpp
index 2529ec865a..45fbabad59 100644
--- a/indra/newview/lltoastscripttextbox.cpp
+++ b/indra/newview/lltoastscripttextbox.cpp
@@ -65,7 +65,7 @@ LLToastScriptTextbox::LLToastScriptTextbox(const LLNotificationPtr& notification
pMessageText->clear();
LLStyle::Params style;
- style.font = pMessageText->getDefaultFont();
+ style.font = pMessageText->getFont();
pMessageText->appendText(message, TRUE, style);
//submit button
diff --git a/indra/newview/lltoastscripttextbox.h b/indra/newview/lltoastscripttextbox.h
index 8e69d8834d..7d33446248 100644
--- a/indra/newview/lltoastscripttextbox.h
+++ b/indra/newview/lltoastscripttextbox.h
@@ -39,8 +39,6 @@ class LLToastScriptTextbox
public:
void close();
- static bool onNewNotification(const LLSD& notification);
-
// Non-transient messages. You can specify non-default button
// layouts (like one for script dialogs) by passing various
// numbers in for "layout".
diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp
index 81ad96f39e..b2318f9158 100644
--- a/indra/newview/lltoolbarview.cpp
+++ b/indra/newview/lltoolbarview.cpp
@@ -76,7 +76,8 @@ LLToolBarView::LLToolBarView(const LLToolBarView::Params& p)
mShowToolbars(true),
mDragToolbarButton(NULL),
mDragItem(NULL),
- mToolbarsLoaded(false)
+ mToolbarsLoaded(false),
+ mBottomToolbarPanel(NULL)
{
for (S32 i = 0; i < TOOLBAR_COUNT; i++)
{
@@ -100,6 +101,7 @@ BOOL LLToolBarView::postBuild()
mToolbars[TOOLBAR_LEFT] = getChild<LLToolBar>("toolbar_left");
mToolbars[TOOLBAR_RIGHT] = getChild<LLToolBar>("toolbar_right");
mToolbars[TOOLBAR_BOTTOM] = getChild<LLToolBar>("toolbar_bottom");
+ mBottomToolbarPanel = getChild<LLView>("bottom_toolbar_panel");
for (int i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++)
{
@@ -239,8 +241,9 @@ bool LLToolBarView::loadToolbars(bool force_default)
LLXUIParser parser;
if (!err)
{
- parser.readXUI(root, toolbar_set, toolbar_file);
+ parser.readXUI(root, toolbar_set, toolbar_file);
}
+
if (!err && !toolbar_set.validateBlock())
{
llwarns << "Unable to validate toolbars from file: " << toolbar_file << llendl;
@@ -252,8 +255,9 @@ bool LLToolBarView::loadToolbars(bool force_default)
if (force_default)
{
llerrs << "Unable to load toolbars from default file : " << toolbar_file << llendl;
- return false;
- }
+ return false;
+ }
+
// Try to load the default toolbars
return loadToolbars(true);
}
@@ -603,7 +607,7 @@ BOOL LLToolBarView::handleDragTool( S32 x, S32 y, const LLUUID& uuid, LLAssetTyp
BOOL LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* toolbar)
{
BOOL handled = FALSE;
- LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;
+ LLInventoryObject* inv_item = static_cast<LLInventoryObject*>(cargo_data);
LLAssetType::EType type = inv_item->getType();
if (type == LLAssetType::AT_WIDGET)
diff --git a/indra/newview/lltoolbarview.h b/indra/newview/lltoolbarview.h
index 9c4194ebed..7125dd9990 100644
--- a/indra/newview/lltoolbarview.h
+++ b/indra/newview/lltoolbarview.h
@@ -108,7 +108,8 @@ public:
static BOOL handleDropTool(void* cargo_data, S32 x, S32 y, LLToolBar* toolbar);
static void resetDragTool(LLToolBarButton* toolbarButton);
LLInventoryObject* getDragItem();
-
+ LLView* getBottomToolbar() { return mBottomToolbarPanel; }
+ LLToolBar* getToolbar(EToolBarLocation toolbar) { return mToolbars[toolbar]; }
bool isModified() const;
protected:
@@ -133,6 +134,7 @@ private:
LLToolBarButton* mDragToolbarButton;
LLInventoryObject* mDragItem;
bool mShowToolbars;
+ LLView* mBottomToolbarPanel;
};
extern LLToolBarView* gToolBarView;
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index c69999981c..94c97158a8 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -58,7 +58,6 @@
#include "llviewerwindow.h"
#include "llvoavatarself.h"
#include "llworld.h"
-#include "llclipboard.h"
// syntactic sugar
#define callMemberFunction(object,ptrToMember) ((object).*(ptrToMember))
@@ -654,33 +653,41 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
sOperationId++;
}
+ // For people drag and drop we don't need an actual inventory object,
+ // instead we need the current cargo id, which should be a person id.
+ bool is_uuid_dragged = (mSource == SOURCE_PEOPLE);
+
if (top_view)
{
handled = TRUE;
for (mCurItemIndex = 0; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++)
{
- LLInventoryObject* cargo = locateInventory(item, cat);
+ S32 local_x, local_y;
+ top_view->screenPointToLocal( x, y, &local_x, &local_y );
+ EAcceptance item_acceptance = ACCEPT_NO;
+ LLInventoryObject* cargo = locateInventory(item, cat);
if (cargo)
{
- S32 local_x, local_y;
- top_view->screenPointToLocal( x, y, &local_x, &local_y );
- EAcceptance item_acceptance = ACCEPT_NO;
handled = handled && top_view->handleDragAndDrop(local_x, local_y, mask, FALSE,
mCargoTypes[mCurItemIndex],
(void*)cargo,
&item_acceptance,
mToolTipMsg);
- if (handled)
- {
- // use sort order to determine priority of acceptance
- *acceptance = (EAcceptance)llmin((U32)item_acceptance, (U32)*acceptance);
- }
}
- else
+ else if (is_uuid_dragged)
{
- return;
+ handled = handled && top_view->handleDragAndDrop(local_x, local_y, mask, FALSE,
+ mCargoTypes[mCurItemIndex],
+ (void*)&mCargoIDs[mCurItemIndex],
+ &item_acceptance,
+ mToolTipMsg);
+ }
+ if (handled)
+ {
+ // use sort order to determine priority of acceptance
+ *acceptance = (EAcceptance)llmin((U32)item_acceptance, (U32)*acceptance);
}
}
@@ -697,20 +704,27 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
for (mCurItemIndex = 0; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++)
{
- LLInventoryObject* cargo = locateInventory(item, cat);
+ S32 local_x, local_y;
+ EAcceptance item_acceptance;
+ top_view->screenPointToLocal( x, y, &local_x, &local_y );
+ LLInventoryObject* cargo = locateInventory(item, cat);
if (cargo)
{
- S32 local_x, local_y;
-
- EAcceptance item_acceptance;
- top_view->screenPointToLocal( x, y, &local_x, &local_y );
handled = handled && top_view->handleDragAndDrop(local_x, local_y, mask, TRUE,
mCargoTypes[mCurItemIndex],
(void*)cargo,
&item_acceptance,
mToolTipMsg);
}
+ else if (is_uuid_dragged)
+ {
+ handled = handled && top_view->handleDragAndDrop(local_x, local_y, mask, FALSE,
+ mCargoTypes[mCurItemIndex],
+ (void*)&mCargoIDs[mCurItemIndex],
+ &item_acceptance,
+ mToolTipMsg);
+ }
}
}
if (handled)
@@ -727,17 +741,27 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
for (mCurItemIndex = 0; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++)
{
+ EAcceptance item_acceptance = ACCEPT_NO;
+
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],
- (void*)cargo,
- &item_acceptance,
- mToolTipMsg);
+ if (cargo)
+ {
+ handled = handled && root_view->handleDragAndDrop(x, y, mask, FALSE,
+ mCargoTypes[mCurItemIndex],
+ (void*)cargo,
+ &item_acceptance,
+ mToolTipMsg);
+ }
+ else if (is_uuid_dragged)
+ {
+ handled = handled && root_view->handleDragAndDrop(x, y, mask, FALSE,
+ mCargoTypes[mCurItemIndex],
+ (void*)&mCargoIDs[mCurItemIndex],
+ &item_acceptance,
+ mToolTipMsg);
+ }
if (handled)
{
// use sort order to determine priority of acceptance
@@ -757,17 +781,25 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
for (mCurItemIndex = 0; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++)
{
- LLInventoryObject* cargo = locateInventory(item, cat);
+ EAcceptance item_acceptance;
+ LLInventoryObject* cargo = locateInventory(item, cat);
if (cargo)
{
- EAcceptance item_acceptance;
handled = handled && root_view->handleDragAndDrop(x, y, mask, TRUE,
mCargoTypes[mCurItemIndex],
(void*)cargo,
&item_acceptance,
mToolTipMsg);
}
+ else if (is_uuid_dragged)
+ {
+ handled = handled && root_view->handleDragAndDrop(x, y, mask, TRUE,
+ mCargoTypes[mCurItemIndex],
+ (void*)&mCargoIDs[mCurItemIndex],
+ &item_acceptance,
+ mToolTipMsg);
+ }
}
}
@@ -780,7 +812,7 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
if (!handled)
{
// Disallow drag and drop to 3D from the outbox
- const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false);
+ const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
if (outbox_id.notNull())
{
for (S32 item_index = 0; item_index < (S32)mCargoIDs.size(); item_index++)
@@ -2509,7 +2541,13 @@ LLInventoryObject* LLToolDragAndDrop::locateInventory(
{
item = NULL;
cat = NULL;
- if(mCargoIDs.empty()) return NULL;
+
+ if (mCargoIDs.empty()
+ || (mSource == SOURCE_PEOPLE)) ///< There is no inventory item for people drag and drop.
+ {
+ return NULL;
+ }
+
if((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY))
{
// The object should be in user inventory.
@@ -2545,6 +2583,7 @@ LLInventoryObject* LLToolDragAndDrop::locateInventory(
{
item = (LLViewerInventoryItem*)gToolBarView->getDragItem();
}
+
if(item) return item;
if(cat) return cat;
return NULL;
diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h
index 41aee484db..f17300a76a 100644
--- a/indra/newview/lltooldraganddrop.h
+++ b/indra/newview/lltooldraganddrop.h
@@ -67,7 +67,8 @@ public:
SOURCE_WORLD,
SOURCE_NOTECARD,
SOURCE_LIBRARY,
- SOURCE_VIEWER
+ SOURCE_VIEWER,
+ SOURCE_PEOPLE
};
void beginDrag(EDragAndDropType type,
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 3cd761b73b..f24891baf6 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -125,9 +125,10 @@ BOOL LLToolPie::handleRightMouseDown(S32 x, S32 y, MASK mask)
mPick.mKeyMask = mask;
// claim not handled so UI focus stays same
-
- handleRightClickPick();
-
+ if(gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK)
+ {
+ handleRightClickPick();
+ }
return FALSE;
}
@@ -972,33 +973,16 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l
|| !existing_inspector->getVisible()
|| existing_inspector->getKey()["avatar_id"].asUUID() != hover_object->getID())
{
- // IDEVO: try to get display name + username
+ // Try to get display name + username
std::string final_name;
- std::string full_name;
- if (!gCacheName->getFullName(hover_object->getID(), full_name))
- {
- LLNameValue* firstname = hover_object->getNVPair("FirstName");
- LLNameValue* lastname = hover_object->getNVPair("LastName");
- if (firstname && lastname)
- {
- full_name = LLCacheName::buildFullName(
- firstname->getString(), lastname->getString());
- }
- else
- {
- full_name = LLTrans::getString("TooltipPerson");
- }
- }
-
LLAvatarName av_name;
- if (LLAvatarNameCache::useDisplayNames() &&
- LLAvatarNameCache::get(hover_object->getID(), &av_name))
+ if (LLAvatarNameCache::get(hover_object->getID(), &av_name))
{
final_name = av_name.getCompleteName();
}
else
{
- final_name = full_name;
+ final_name = LLTrans::getString("TooltipPerson");;
}
// *HACK: We may select this object, so pretend it was clicked
diff --git a/indra/newview/lltranslate.h b/indra/newview/lltranslate.h
index c58e1adb8c..db5ad9479c 100755
--- a/indra/newview/lltranslate.h
+++ b/indra/newview/lltranslate.h
@@ -263,8 +263,8 @@ public :
EService mService;
};
- typedef boost::intrusive_ptr<TranslationReceiver> TranslationReceiverPtr;
- typedef boost::intrusive_ptr<KeyVerificationReceiver> KeyVerificationReceiverPtr;
+ typedef LLPointer<TranslationReceiver> TranslationReceiverPtr;
+ typedef LLPointer<KeyVerificationReceiver> KeyVerificationReceiverPtr;
/**
* Translate given text.
diff --git a/indra/newview/llviewerassetstats.cpp b/indra/newview/llviewerassetstats.cpp
index 4c59fd0371..4c59fd0371 100755..100644
--- a/indra/newview/llviewerassetstats.cpp
+++ b/indra/newview/llviewerassetstats.cpp
diff --git a/indra/newview/llviewerassetstats.h b/indra/newview/llviewerassetstats.h
index 8319752230..8319752230 100755..100644
--- a/indra/newview/llviewerassetstats.h
+++ b/indra/newview/llviewerassetstats.h
diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp
index a4b1c2155f..08ba5a5f25 100644
--- a/indra/newview/llviewerassettype.cpp
+++ b/indra/newview/llviewerassettype.cpp
@@ -83,6 +83,8 @@ LLViewerAssetDictionary::LLViewerAssetDictionary()
addEntry(LLViewerAssetType::AT_WIDGET, new ViewerAssetEntry(DAD_WIDGET));
+ addEntry(LLViewerAssetType::AT_PERSON, new ViewerAssetEntry(DAD_PERSON));
+
addEntry(LLViewerAssetType::AT_NONE, new ViewerAssetEntry(DAD_NONE));
};
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index 8d8c401dac..564bf7997a 100644
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -30,6 +30,7 @@
#include "llagent.h"
#include "llagentcamera.h"
#include "llappviewer.h"
+#include "lldeferredsounds.h"
#include "llvieweraudio.h"
#include "llviewercamera.h"
#include "llviewercontrol.h"
@@ -388,6 +389,12 @@ void audio_update_volume(bool force_update)
gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff"));
gAudiop->setMuted(mute_audio || progress_view_visible);
+ //Play any deferred sounds when unmuted
+ if(!gAudiop->getMuted())
+ {
+ LLDeferredSounds::instance().playdeferredSounds();
+ }
+
if (force_update)
{
audio_update_wind(true);
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index dec1615246..051f5f4485 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -72,6 +72,8 @@
#include "llpanellogin.h"
#include "llpaneltopinfobar.h"
#include "llspellcheck.h"
+#include "llslurl.h"
+#include "llstartup.h"
#include "llupdaterservice.h"
// Third party library includes
@@ -496,6 +498,20 @@ bool handleForceShowGrid(const LLSD& newvalue)
return true;
}
+bool handleLoginLocationChanged()
+{
+ /*
+ * This connects the default preference setting to the state of the login
+ * panel if it is displayed; if you open the preferences panel before
+ * logging in, and change the default login location there, the login
+ * panel immediately changes to match your new preference.
+ */
+ std::string new_login_location = gSavedSettings.getString("LoginLocation");
+ LL_DEBUGS("AppInit")<<new_login_location<<LL_ENDL;
+ LLStartUp::setStartSLURL(LLSLURL(new_login_location));
+ return true;
+}
+
bool handleSpellCheckChanged()
{
if (gSavedSettings.getBOOL("SpellCheck"))
@@ -721,6 +737,7 @@ void settings_setup_listeners()
gSavedSettings.getControl("RenderTransparentWater")->getSignal()->connect(boost::bind(&handleRenderTransparentWaterChanged, _2));
gSavedSettings.getControl("SpellCheck")->getSignal()->connect(boost::bind(&handleSpellCheckChanged));
gSavedSettings.getControl("SpellCheckDictionary")->getSignal()->connect(boost::bind(&handleSpellCheckChanged));
+ gSavedSettings.getControl("LoginLocation")->getSignal()->connect(boost::bind(&handleLoginLocationChanged));
}
#if TEST_CACHED_CONTROL
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index d58ee05fb6..40577118ba 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -168,7 +168,6 @@ static LLFastTimer::DeclareTimer FTM_UPDATE_CAMERA("Update Camera");
void display_update_camera()
{
LLFastTimer t(FTM_UPDATE_CAMERA);
- LLMemType mt_uc(LLMemType::MTYPE_DISPLAY_UPDATE_CAMERA);
// TODO: cut draw distance down if customizing avatar?
// TODO: cut draw distance on per-parcel basis?
@@ -218,7 +217,7 @@ static LLFastTimer::DeclareTimer FTM_UPDATE_SKY("Update Sky");
static LLFastTimer::DeclareTimer FTM_UPDATE_TEXTURES("Update Textures");
static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE("Update Images");
static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_CLASS("Class");
-static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_BUMP("Bump");
+static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_BUMP("Image Update Bump");
static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_LIST("List");
static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_DELETE("Delete");
static LLFastTimer::DeclareTimer FTM_RESIZE_WINDOW("Resize Window");
@@ -230,7 +229,6 @@ static LLFastTimer::DeclareTimer FTM_TELEPORT_DISPLAY("Teleport Display");
// Paint the display!
void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
{
- LLMemType mt_render(LLMemType::MTYPE_RENDER);
LLFastTimer t(FTM_RENDER);
if (gWindowResized)
@@ -581,7 +579,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
if (!gDisconnected)
{
- LLMemType mt_du(LLMemType::MTYPE_DISPLAY_UPDATE);
LLAppViewer::instance()->pingMainloopTimeout("Display:Update");
if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD))
{ //don't draw hud objects in this frame
@@ -603,7 +600,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
// *TODO: merge these two methods
{
LLFastTimer t(FTM_HUD_UPDATE);
- LLMemType mt_uh(LLMemType::MTYPE_DISPLAY_UPDATE_HUD);
LLHUDManager::getInstance()->updateEffects();
LLHUDObject::updateAll();
stop_glerror();
@@ -611,7 +607,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
{
LLFastTimer t(FTM_DISPLAY_UPDATE_GEOM);
- LLMemType mt_ug(LLMemType::MTYPE_DISPLAY_UPDATE_GEOM);
const F32 max_geom_update_time = 0.005f*10.f*gFrameIntervalSeconds; // 50 ms/second update time
gPipeline.createObjects(max_geom_update_time);
gPipeline.processPartitionQ();
@@ -672,8 +667,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLAppViewer::instance()->pingMainloopTimeout("Display:Swap");
{
- LLMemType mt_ds(LLMemType::MTYPE_DISPLAY_SWAP);
-
if (gResizeScreenTexture)
{
gResizeScreenTexture = FALSE;
@@ -732,7 +725,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
//if (!for_snapshot)
{
- LLMemType mt_gw(LLMemType::MTYPE_DISPLAY_GEN_REFLECTION);
LLAppViewer::instance()->pingMainloopTimeout("Display:Imagery");
gPipeline.generateWaterReflection(*LLViewerCamera::getInstance());
gPipeline.generateHighlight(*LLViewerCamera::getInstance());
@@ -752,7 +744,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLAppViewer::instance()->pingMainloopTimeout("Display:UpdateImages");
{
- LLMemType mt_iu(LLMemType::MTYPE_DISPLAY_IMAGE_UPDATE);
LLFastTimer t(FTM_IMAGE_UPDATE);
{
@@ -796,7 +787,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLAppViewer::instance()->pingMainloopTimeout("Display:StateSort");
{
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
- LLMemType mt_ss(LLMemType::MTYPE_DISPLAY_STATE_SORT);
gPipeline.stateSort(*LLViewerCamera::getInstance(), result);
stop_glerror();
@@ -818,7 +808,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLPipeline::sUseOcclusion = occlusion;
{
- LLMemType mt_ds(LLMemType::MTYPE_DISPLAY_SKY);
LLAppViewer::instance()->pingMainloopTimeout("Display:Sky");
LLFastTimer t(FTM_UPDATE_SKY);
gSky.updateSky();
@@ -907,7 +896,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
&& !gRestoreGL)
{
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
- LLMemType mt_rg(LLMemType::MTYPE_DISPLAY_RENDER_GEOM);
if (gSavedSettings.getBOOL("RenderDepthPrePass") && LLGLSLShader::sNoFixedFunction)
{
@@ -968,7 +956,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
if (to_texture)
{
- LLMemType mt_rf(LLMemType::MTYPE_DISPLAY_RENDER_FLUSH);
if (LLPipeline::sRenderDeferred && !LLPipeline::sUnderWaterRender)
{
gPipeline.mDeferredScreen.flush();
@@ -1035,7 +1022,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
void render_hud_attachments()
{
- LLMemType mt_ra(LLMemType::MTYPE_DISPLAY_RENDER_ATTACHMENTS);
gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
gGL.matrixMode(LLRender::MM_MODELVIEW);
@@ -1052,7 +1038,6 @@ void render_hud_attachments()
if (LLPipeline::sShowHUDAttachments && !gDisconnected && setup_hud_matrices())
{
LLCamera hud_cam = *LLViewerCamera::getInstance();
- LLVector3 origin = hud_cam.getOrigin();
hud_cam.setOrigin(-1.f,0,0);
hud_cam.setAxes(LLVector3(1,0,0), LLVector3(0,1,0), LLVector3(0,0,1));
LLViewerCamera::updateFrustumPlanes(hud_cam, TRUE);
@@ -1225,7 +1210,6 @@ static LLFastTimer::DeclareTimer FTM_SWAP("Swap");
void render_ui(F32 zoom_factor, int subfield)
{
- LLMemType mt_ru(LLMemType::MTYPE_DISPLAY_RENDER_UI);
LLGLState::checkStates();
glh::matrix4f saved_view = glh_get_current_modelview();
diff --git a/indra/newview/llviewerdisplayname.cpp b/indra/newview/llviewerdisplayname.cpp
index 5741fab29a..6bd5631df6 100644
--- a/indra/newview/llviewerdisplayname.cpp
+++ b/indra/newview/llviewerdisplayname.cpp
@@ -53,6 +53,7 @@ namespace LLViewerDisplayName
sNameChangedSignal.connect(cb);
}
+ void doNothing() { }
}
class LLSetDisplayNameResponder : public LLHTTPClient::Responder
@@ -97,7 +98,7 @@ void LLViewerDisplayName::set(const std::string& display_name, const set_name_sl
// People API expects array of [ "old value", "new value" ]
LLSD change_array = LLSD::emptyArray();
- change_array.append(av_name.mDisplayName);
+ change_array.append(av_name.getDisplayName());
change_array.append(display_name);
llinfos << "Set name POST to " << cap_url << llendl;
@@ -139,9 +140,9 @@ public:
LLUUID agent_id = gAgent.getID();
// Flush stale data
LLAvatarNameCache::erase( agent_id );
- // Queue request for new data
- LLAvatarName ignored;
- LLAvatarNameCache::get( agent_id, &ignored );
+ // Queue request for new data: nothing to do on callback though...
+ // Note: no need to disconnect the callback as it never gets out of scope
+ LLAvatarNameCache::get(agent_id, boost::bind(&LLViewerDisplayName::doNothing));
// Kill name tag, as it is wrong
LLVOAvatar::invalidateNameTag( agent_id );
}
@@ -189,8 +190,8 @@ class LLDisplayNameUpdate : public LLHTTPNode
LLSD args;
args["OLD_NAME"] = old_display_name;
- args["SLID"] = av_name.mUsername;
- args["NEW_NAME"] = av_name.mDisplayName;
+ args["SLID"] = av_name.getUserName();
+ args["NEW_NAME"] = av_name.getDisplayName();
LLNotificationsUtil::add("DisplayNameUpdate", args);
if (agent_id == gAgent.getID())
{
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 1f7cf0cdd4..c6b28b9e5e 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -32,7 +32,6 @@
#include "llviewerfloaterreg.h"
#include "llfloaterautoreplacesettings.h"
#include "llcompilequeue.h"
-#include "llcallfloater.h"
#include "llfasttimerview.h"
#include "llfloaterabout.h"
#include "llfloaterauction.h"
@@ -50,6 +49,9 @@
#include "llfloaterbump.h"
#include "llfloaterbvhpreview.h"
#include "llfloatercamera.h"
+#include "llfloaterchatvoicevolume.h"
+#include "llfloaterconversationlog.h"
+#include "llfloaterconversationpreview.h"
#include "llfloaterdeleteenvpreset.h"
#include "llfloaterdisplayname.h"
#include "llfloatereditdaycycle.h"
@@ -69,7 +71,7 @@
#include "llfloatermediasettings.h"
#include "llfloaterhud.h"
#include "llfloaterimagepreview.h"
-#include "llimfloater.h"
+#include "llfloaterimsession.h"
#include "llfloaterinspect.h"
#include "llfloaterinventory.h"
#include "llfloaterjoystick.h"
@@ -114,17 +116,18 @@
#include "llfloatertranslationsettings.h"
#include "llfloateruipreview.h"
#include "llfloatervoiceeffect.h"
+#include "llfloatervoicevolume.h"
#include "llfloaterwhitelistentry.h"
#include "llfloaterwindowsize.h"
#include "llfloaterworldmap.h"
-#include "llimfloatercontainer.h"
+#include "llfloaterimcontainer.h"
#include "llinspectavatar.h"
#include "llinspectgroup.h"
#include "llinspectobject.h"
#include "llinspectremoteobject.h"
#include "llinspecttoast.h"
#include "llmoveview.h"
-#include "llnearbychat.h"
+#include "llfloaterimnearbychat.h"
#include "llpanelblockedlist.h"
#include "llpanelclassified.h"
#include "llpreviewanim.h"
@@ -137,7 +140,6 @@
#include "llscriptfloater.h"
#include "llfloatermodelpreview.h"
#include "llcommandhandler.h"
-#include "llnearbychatbar.h"
// *NOTE: Please add files in alphabetical order to keep merges easy.
@@ -190,9 +192,10 @@ 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_bar", "floater_chat_bar.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNearbyChatBar>);
-
+ LLFloaterReg::add("chat_voice", "floater_voice_chat_volume.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChatVoiceVolume>);
+ LLFloaterReg::add("nearby_chat", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterIMNearbyChat::buildFloater);
LLFloaterReg::add("compile_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCompileQueue>);
+ LLFloaterReg::add("conversation", "floater_conversation_log.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterConversationLog>);
LLFloaterReg::add("destinations", "floater_destinations.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDestinations>);
@@ -214,8 +217,8 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("help_browser", "floater_help_browser.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHelpBrowser>);
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("impanel", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterIMSession>);
+ LLFloaterReg::add("im_container", "floater_im_container.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterIMContainer>);
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_my_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
@@ -224,6 +227,7 @@ void LLViewerFloaterReg::registerFloaters()
LLInspectGroupUtil::registerFloater();
LLInspectObjectUtil::registerFloater();
LLInspectRemoteObjectUtil::registerFloater();
+ LLFloaterVoiceVolumeUtil::registerFloater();
LLNotificationsUI::registerFloater();
LLFloaterDisplayNameUtil::registerFloater();
@@ -268,6 +272,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("picks", "floater_picks.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("pref_joystick", "floater_joystick.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterJoystick>);
LLFloaterReg::add("preview_anim", "floater_preview_animation.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewAnim>, "preview");
+ LLFloaterReg::add("preview_conversation", "floater_conversation_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterConversationPreview>);
LLFloaterReg::add("preview_gesture", "floater_preview_gesture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewGesture>, "preview");
LLFloaterReg::add("preview_notecard", "floater_preview_notecard.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewNotecard>, "preview");
LLFloaterReg::add("preview_script", "floater_script_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewLSL>, "preview");
@@ -316,7 +321,6 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("upload_script", "floater_script_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptPreview>, "upload");
LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundPreview>, "upload");
- LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallFloater>);
LLFloaterReg::add("voice_effect", "floater_voice_effect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVoiceEffect>);
LLFloaterReg::add("web_content", "floater_web_content.xml", (LLFloaterBuildFunc)&LLFloaterWebContent::create);
diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp
index a179b61cff..a179b61cff 100644..100755
--- a/indra/newview/llviewerfoldertype.cpp
+++ b/indra/newview/llviewerfoldertype.cpp
diff --git a/indra/newview/llviewergesture.cpp b/indra/newview/llviewergesture.cpp
index a32a78cbf9..3f35a5001d 100644
--- a/indra/newview/llviewergesture.cpp
+++ b/indra/newview/llviewergesture.cpp
@@ -33,6 +33,7 @@
#include "llviewerinventory.h"
#include "sound_ids.h" // for testing
+#include "llfloaterreg.h"
#include "llkeyboard.h" // for key shortcuts for testing
#include "llinventorymodel.h"
#include "llvoavatar.h"
@@ -40,7 +41,7 @@
#include "llviewermessage.h" // send_guid_sound_trigger
#include "llviewernetwork.h"
#include "llagent.h"
-#include "llnearbychatbar.h"
+#include "llfloaterimnearbychat.h"
// Globals
LLViewerGestureList gGestureList;
@@ -130,7 +131,8 @@ void LLViewerGesture::doTrigger( BOOL send_chat )
{
// Don't play nodding animation, since that might not blend
// with the gesture animation.
- LLNearbyChatBar::getInstance()->sendChatFromViewer(mOutputString, CHAT_TYPE_NORMAL, FALSE);
+ (LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat"))->
+ sendChatFromViewer(mOutputString, CHAT_TYPE_NORMAL, FALSE);
}
}
diff --git a/indra/newview/llviewerhelp.cpp b/indra/newview/llviewerhelp.cpp
index a8a918f259..04c2e27c9d 100644
--- a/indra/newview/llviewerhelp.cpp
+++ b/indra/newview/llviewerhelp.cpp
@@ -71,12 +71,6 @@ LLHelpHandler gHelpHandler;
std::string LLViewerHelp::getURL(const std::string &topic)
{
- // allow overriding the help server with a local help file
- if( gSavedSettings.getBOOL("HelpUseLocal") )
- {
- return "__local";
- }
-
// if the help topic is empty, use the default topic
std::string help_topic = topic;
if (help_topic.empty())
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index b47a41c44c..a187318eb7 100755..100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -1030,12 +1030,7 @@ 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;
@@ -1308,7 +1303,7 @@ const std::string NEW_NOTECARD_NAME = "New Note"; // *TODO:Translate? (probably
const std::string NEW_GESTURE_NAME = "New Gesture"; // *TODO:Translate? (probably not)
// ! REFACTOR ! Really need to refactor this so that it's not a bunch of if-then statements...
-void menu_create_inventory_item(LLFolderView* root, LLFolderBridge *bridge, const LLSD& userdata, const LLUUID& default_parent_uuid)
+void menu_create_inventory_item(LLInventoryPanel* panel, LLFolderBridge *bridge, const LLSD& userdata, const LLUUID& default_parent_uuid)
{
std::string type_name = userdata.asString();
@@ -1332,7 +1327,7 @@ void menu_create_inventory_item(LLFolderView* root, LLFolderBridge *bridge, cons
LLUUID category = gInventory.createNewCategory(parent_id, preferred_type, LLStringUtil::null);
gInventory.notifyObservers();
- root->setSelectionByID(category, TRUE);
+ panel->setSelectionByID(category, TRUE);
}
else if ("lsl" == type_name)
{
@@ -1375,7 +1370,7 @@ void menu_create_inventory_item(LLFolderView* root, LLFolderBridge *bridge, cons
llwarns << "Can't create unrecognized type " << type_name << llendl;
}
}
- root->setNeedsAutoRename(TRUE);
+ panel->getRootFolder()->setNeedsAutoRename(TRUE);
}
LLAssetType::EType LLViewerInventoryItem::getType() const
@@ -1449,348 +1444,6 @@ const std::string& LLViewerInventoryItem::getName() const
return LLInventoryItem::getName();
}
-/**
- * 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>
-{
- LOG_CLASS(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);
-
- void getSLURL(const LLUUID& asset_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();
-
- void saveFavoritesSLURLs();
-
- // Remove record of current user's favorites from file on disk.
- void removeFavoritesRecordOfUser();
-
- void onLandmarkLoaded(const LLUUID& asset_id, LLLandmark* landmark);
- void storeFavoriteSLURL(const LLUUID& asset_id, std::string& slurl);
-
- typedef std::map<LLUUID, S32> sort_index_map_t;
- sort_index_map_t mSortIndexes;
-
- typedef std::map<LLUUID, std::string> slurls_map_t;
- slurls_map_t mSLURLs;
-
- bool mIsDirty;
-
- struct IsNotInFavorites
- {
- IsNotInFavorites(const LLInventoryModel::item_array_t& items)
- : mFavoriteItems(items)
- {
-
- }
-
- /**
- * 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;
-
- LLInventoryModel::item_array_t::const_iterator found_it =
- std::find(mFavoriteItems.begin(), mFavoriteItems.end(), item);
-
- return found_it == mFavoriteItems.end();
- }
- private:
- LLInventoryModel::item_array_t mFavoriteItems;
- };
-
-};
-
-const std::string LLFavoritesOrderStorage::SORTING_DATA_FILE_NAME = "landmarks_sorting.xml";
-const S32 LLFavoritesOrderStorage::NO_INDEX = -1;
-
-void LLFavoritesOrderStorage::setSortIndex(const LLUUID& inv_item_id, S32 sort_index)
-{
- mSortIndexes[inv_item_id] = sort_index;
- mIsDirty = true;
-}
-
-S32 LLFavoritesOrderStorage::getSortIndex(const LLUUID& inv_item_id)
-{
- sort_index_map_t::const_iterator it = mSortIndexes.find(inv_item_id);
- if (it != mSortIndexes.end())
- {
- return it->second;
- }
- return NO_INDEX;
-}
-
-void LLFavoritesOrderStorage::removeSortIndex(const LLUUID& inv_item_id)
-{
- mSortIndexes.erase(inv_item_id);
- mIsDirty = true;
-}
-
-void LLFavoritesOrderStorage::getSLURL(const LLUUID& asset_id)
-{
- slurls_map_t::iterator slurl_iter = mSLURLs.find(asset_id);
- if (slurl_iter != mSLURLs.end()) return; // SLURL for current landmark is already cached
-
- LLLandmark* lm = gLandmarkList.getAsset(asset_id,
- boost::bind(&LLFavoritesOrderStorage::onLandmarkLoaded, this, asset_id, _1));
- if (lm)
- {
- onLandmarkLoaded(asset_id, lm);
- }
-}
-
-// static
-void LLFavoritesOrderStorage::destroyClass()
-{
- LLFavoritesOrderStorage::instance().cleanup();
- if (gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin"))
- {
- LLFavoritesOrderStorage::instance().saveFavoritesSLURLs();
- }
- else
- {
- LLFavoritesOrderStorage::instance().removeFavoritesRecordOfUser();
- }
-}
-
-void LLFavoritesOrderStorage::load()
-{
- // load per-resident sorting information
- std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_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)
- {
- mSortIndexes.insert(std::make_pair(LLUUID(iter->first), (S32)iter->second.asInteger()));
- }
-}
-
-void LLFavoritesOrderStorage::saveFavoritesSLURLs()
-{
- // Do not change the file if we are not logged in yet.
- if (!LLLoginInstance::getInstance()->authSuccess())
- {
- llwarns << "Cannot save favorites: not logged in" << llendl;
- return;
- }
-
- std::string user_dir = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "");
- if (user_dir.empty())
- {
- llwarns << "Cannot save favorites: empty user dir name" << llendl;
- return;
- }
-
- std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");
- llifstream in_file;
- in_file.open(filename);
- LLSD fav_llsd;
- if (in_file.is_open())
- {
- LLSDSerialize::fromXML(fav_llsd, in_file);
- }
-
- 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);
-
- LLSD user_llsd;
- for (LLInventoryModel::item_array_t::iterator it = items.begin(); it != items.end(); it++)
- {
- LLSD value;
- value["name"] = (*it)->getName();
- value["asset_id"] = (*it)->getAssetUUID();
-
- slurls_map_t::iterator slurl_iter = mSLURLs.find(value["asset_id"]);
- if (slurl_iter != mSLURLs.end())
- {
- lldebugs << "Saving favorite: idx=" << (*it)->getSortField() << ", SLURL=" << slurl_iter->second << ", value=" << value << llendl;
- value["slurl"] = slurl_iter->second;
- user_llsd[(*it)->getSortField()] = value;
- }
- else
- {
- llwarns << "Not saving favorite " << value["name"] << ": no matching SLURL" << llendl;
- }
- }
-
- LLAvatarName av_name;
- LLAvatarNameCache::get( gAgentID, &av_name );
- lldebugs << "Saved favorites for " << av_name.getLegacyName() << llendl;
- fav_llsd[av_name.getLegacyName()] = user_llsd;
-
- llofstream file;
- file.open(filename);
- LLSDSerialize::toPrettyXML(fav_llsd, file);
-}
-
-void LLFavoritesOrderStorage::removeFavoritesRecordOfUser()
-{
- std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");
- LLSD fav_llsd;
- llifstream file;
- file.open(filename);
- if (!file.is_open()) return;
- LLSDSerialize::fromXML(fav_llsd, file);
-
- LLAvatarName av_name;
- LLAvatarNameCache::get( gAgentID, &av_name );
- lldebugs << "Removed favorites for " << av_name.getLegacyName() << llendl;
- if (fav_llsd.has(av_name.getLegacyName()))
- {
- fav_llsd.erase(av_name.getLegacyName());
- }
-
- llofstream out_file;
- out_file.open(filename);
- LLSDSerialize::toPrettyXML(fav_llsd, out_file);
-
-}
-
-void LLFavoritesOrderStorage::onLandmarkLoaded(const LLUUID& asset_id, LLLandmark* landmark)
-{
- if (!landmark) return;
-
- LLVector3d pos_global;
- if (!landmark->getGlobalPos(pos_global))
- {
- // If global position was unknown on first getGlobalPos() call
- // it should be set for the subsequent calls.
- landmark->getGlobalPos(pos_global);
- }
-
- if (!pos_global.isExactlyZero())
- {
- LLLandmarkActions::getSLURLfromPosGlobal(pos_global,
- boost::bind(&LLFavoritesOrderStorage::storeFavoriteSLURL, this, asset_id, _1));
- }
-}
-
-void LLFavoritesOrderStorage::storeFavoriteSLURL(const LLUUID& asset_id, std::string& slurl)
-{
- lldebugs << "Saving landmark SLURL: " << slurl << llendl;
- mSLURLs[asset_id] = slurl;
-}
-
-void LLFavoritesOrderStorage::save()
-{
- // 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())
- {
- 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);
- getSLURL();
-}
-
-void LLViewerInventoryItem::getSLURL()
-{
- LLFavoritesOrderStorage::instance().getSLURL(mAssetUUID);
-}
-
-const LLPermissions& LLViewerInventoryItem::getPermissions() const
-{
- // Use the actual permissions of the symlink, not its parent.
- return LLInventoryItem::getPermissions();
-}
-
const LLUUID& LLViewerInventoryItem::getCreatorUUID() const
{
if (const LLViewerInventoryItem *linked_item = getLinkedItem())
@@ -1861,17 +1514,6 @@ LLWearableType::EType LLViewerInventoryItem::getWearableType() const
return LLWearableType::EType(getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK);
}
-
-time_t LLViewerInventoryItem::getCreationDate() const
-{
- return LLInventoryItem::getCreationDate();
-}
-
-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)
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index 7822ef4da6..3cf03c3bc5 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -34,7 +34,7 @@
#include <boost/signals2.hpp> // boost::signals2::trackable
-class LLFolderView;
+class LLInventoryPanel;
class LLFolderBridge;
class LLViewerInventoryCategory;
@@ -60,10 +60,6 @@ public:
virtual const LLUUID& getAssetUUID() const;
virtual const LLUUID& getProtectedAssetUUID() const; // returns LLUUID::null if current agent does not have permission to expose this asset's UUID to the user
virtual const std::string& getName() const;
- virtual S32 getSortField() const;
- virtual void setSortField(S32 sortField);
- virtual void getSLURL(); //Caches SLURL for landmark. //*TODO: Find a better way to do it and remove this method from here.
- virtual const LLPermissions& getPermissions() const;
virtual const bool getIsFullPerm() const; // 'fullperm' in the popular sense: modify-ok & copy-ok & transfer-ok, no special god rules applied
virtual const LLUUID& getCreatorUUID() const;
virtual const std::string& getDescription() const;
@@ -72,8 +68,11 @@ public:
virtual bool isWearableType() const;
virtual LLWearableType::EType getWearableType() const;
virtual U32 getFlags() const;
- virtual time_t getCreationDate() const;
- virtual U32 getCRC32() const; // really more of a checksum.
+
+ using LLInventoryItem::getPermissions;
+ using LLInventoryItem::getCreationDate;
+ using LLInventoryItem::setCreationDate;
+ using LLInventoryItem::getCRC32;
static BOOL extractSortFieldAndDisplayName(const std::string& name, S32* sortField, std::string* displayName);
@@ -285,18 +284,6 @@ 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);
@@ -372,7 +359,7 @@ void copy_inventory_from_notecard(const LLUUID& destination_id,
U32 callback_id = 0);
-void menu_create_inventory_item(LLFolderView* root,
+void menu_create_inventory_item(LLInventoryPanel* root,
LLFolderBridge* bridge,
const LLSD& userdata,
const LLUUID& default_parent_uuid = LLUUID::null);
diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp
index 5d1aa870a3..5d1aa870a3 100755..100644
--- a/indra/newview/llviewerjointmesh.cpp
+++ b/indra/newview/llviewerjointmesh.cpp
diff --git a/indra/newview/llviewerjointmesh.h b/indra/newview/llviewerjointmesh.h
index dd5dae1dc1..dd5dae1dc1 100755..100644
--- a/indra/newview/llviewerjointmesh.h
+++ b/indra/newview/llviewerjointmesh.h
diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp
index 1aa9fd8a45..4ecdc31e21 100644
--- a/indra/newview/llviewerkeyboard.cpp
+++ b/indra/newview/llviewerkeyboard.cpp
@@ -27,11 +27,12 @@
#include "llviewerprecompiledheaders.h"
#include "llappviewer.h"
+#include "llfloaterreg.h"
#include "llviewerkeyboard.h"
#include "llmath.h"
#include "llagent.h"
#include "llagentcamera.h"
-#include "llnearbychatbar.h"
+#include "llfloaterimnearbychat.h"
#include "llviewercontrol.h"
#include "llfocusmgr.h"
#include "llmorphview.h"
@@ -534,7 +535,7 @@ void stop_moving( EKeystate s )
void start_chat( EKeystate s )
{
// start chat
- LLNearbyChatBar::startChat(NULL);
+ LLFloaterIMNearbyChat::startChat(NULL);
}
void start_gesture( EKeystate s )
@@ -543,15 +544,15 @@ void start_gesture( EKeystate s )
if (KEYSTATE_UP == s &&
! (focus_ctrlp && focus_ctrlp->acceptsTextInput()))
{
- if (LLNearbyChatBar::getInstance()->getCurrentChat().empty())
+ if ((LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat"))->getCurrentChat().empty())
{
// No existing chat in chat editor, insert '/'
- LLNearbyChatBar::startChat("/");
+ LLFloaterIMNearbyChat::startChat("/");
}
else
{
// Don't overwrite existing text in chat editor
- LLNearbyChatBar::startChat(NULL);
+ LLFloaterIMNearbyChat::startChat(NULL);
}
}
}
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 1eb4bedfaf..2df028de69 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -316,9 +316,13 @@ public:
/* virtual */ void completedHeader(U32 status, const std::string& reason, const LLSD& content)
{
LL_WARNS("MediaAuth") << "status = " << status << ", reason = " << reason << LL_ENDL;
- LL_WARNS("MediaAuth") << content << LL_ENDL;
+
+ LLSD stripped_content = content;
+ stripped_content.erase("set-cookie");
+ LL_WARNS("MediaAuth") << stripped_content << LL_ENDL;
std::string cookie = content["set-cookie"].asString();
+ LL_DEBUGS("MediaAuth") << "cookie = " << cookie << LL_ENDL;
LLViewerMedia::getCookieStore()->setCookiesFromHost(cookie, mHost);
@@ -1184,12 +1188,9 @@ void LLViewerMedia::clearAllCookies()
LLDirIterator dir_iter(base_dir, "*_*");
while (dir_iter.next(filename))
{
- target = base_dir;
- target += filename;
- target += gDirUtilp->getDirDelimiter();
- target += "browser_profile";
- target += gDirUtilp->getDirDelimiter();
- target += "cookies";
+ target = gDirUtilp->add(base_dir, filename);
+ gDirUtilp->append(target, "browser_profile");
+ gDirUtilp->append(target, "cookies");
lldebugs << "target = " << target << llendl;
if(LLFile::isfile(target))
{
@@ -1197,10 +1198,8 @@ void LLViewerMedia::clearAllCookies()
}
// Other accounts may have new-style cookie files too -- delete them as well
- target = base_dir;
- target += filename;
- target += gDirUtilp->getDirDelimiter();
- target += PLUGIN_COOKIE_FILE_NAME;
+ target = gDirUtilp->add(base_dir, filename);
+ gDirUtilp->append(target, PLUGIN_COOKIE_FILE_NAME);
lldebugs << "target = " << target << llendl;
if(LLFile::isfile(target))
{
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 01a54509ef..66db0ac8f3 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -59,6 +59,7 @@
#include "llbuycurrencyhtml.h"
#include "llfloatergodtools.h"
#include "llfloaterinventory.h"
+#include "llfloaterimcontainer.h"
#include "llfloaterland.h"
#include "llfloaterpathfindingcharacters.h"
#include "llfloaterpathfindinglinksets.h"
@@ -83,6 +84,7 @@
#include "llinventoryfunctions.h"
#include "llpanellogin.h"
#include "llpanelblockedlist.h"
+#include "llmenuoptionpathfindingrebakenavmesh.h"
#include "llmoveview.h"
#include "llparcel.h"
#include "llrootview.h"
@@ -106,6 +108,7 @@
#include "llviewerparcelmgr.h"
#include "llviewerstats.h"
#include "llvoavatarself.h"
+#include "llvoicevivox.h"
#include "llworldmap.h"
#include "pipeline.h"
#include "llviewerjoystick.h"
@@ -165,7 +168,6 @@ 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");
LLMenuGL* gAttachSubMenu = NULL;
@@ -178,9 +180,6 @@ LLContextMenu* gDetachPieMenu = NULL;
LLContextMenu* gDetachScreenPieMenu = NULL;
LLContextMenu* gDetachBodyPartPieMenus[8];
-LLMenuItemCallGL* gAFKMenu = NULL;
-LLMenuItemCallGL* gBusyMenu = NULL;
-
//
// Local prototypes
@@ -310,7 +309,6 @@ void handle_grab_baked_texture(void*);
BOOL enable_grab_baked_texture(void*);
void handle_dump_region_object_cache(void*);
-BOOL enable_save_into_inventory(void*);
BOOL enable_save_into_task_inventory(void*);
BOOL enable_detach(const LLSD& = LLSD());
@@ -341,7 +339,8 @@ LLMenuParcelObserver::~LLMenuParcelObserver()
void LLMenuParcelObserver::changed()
{
- gMenuHolder->childSetEnabled("Land Buy Pass", LLPanelLandGeneral::enableBuyPass(NULL));
+ LLParcel *parcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel();
+ gMenuHolder->childSetEnabled("Land Buy Pass", LLPanelLandGeneral::enableBuyPass(NULL) && !(parcel->getOwnerID()== gAgent.getID()));
BOOL buyable = enable_buy_land(NULL);
gMenuHolder->childSetEnabled("Land Buy", buyable);
@@ -470,8 +469,6 @@ void init_menus()
gMenuHolder->childSetLabelArg("Upload Animation", "[COST]", upload_cost);
gMenuHolder->childSetLabelArg("Bulk Upload", "[COST]", upload_cost);
- gAFKMenu = gMenuBarView->getChild<LLMenuItemCallGL>("Set Away", TRUE);
- gBusyMenu = gMenuBarView->getChild<LLMenuItemCallGL>("Set Busy", TRUE);
gAttachSubMenu = gMenuBarView->findChildMenuByName("Attach Object", TRUE);
gDetachSubMenu = gMenuBarView->findChildMenuByName("Detach Object", TRUE);
@@ -1316,22 +1313,6 @@ class LLAdvancedPrintAgentInfo : public view_listener_t
}
};
-
-
-////////////////////////////////
-// PRINT TEXTURE MEMORY STATS //
-////////////////////////////////
-
-
-class LLAdvancedPrintTextureMemoryStats : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- output_statistics(NULL);
- return true;
- }
-};
-
//////////////////
// DEBUG CLICKS //
//////////////////
@@ -1655,6 +1636,54 @@ class LLAdvancedForceParamsToDefault : public view_listener_t
};
+//////////////////////////
+// ANIMATION SPEED //
+//////////////////////////
+
+// Utility function to set all AV time factors to the same global value
+static void set_all_animation_time_factors(F32 time_factor)
+{
+ LLMotionController::setCurrentTimeFactor(time_factor);
+ for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
+ iter != LLCharacter::sInstances.end(); ++iter)
+ {
+ (*iter)->setAnimTimeFactor(time_factor);
+ }
+}
+
+class LLAdvancedAnimTenFaster : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ //llinfos << "LLAdvancedAnimTenFaster" << llendl;
+ F32 time_factor = LLMotionController::getCurrentTimeFactor();
+ time_factor = llmin(time_factor + 0.1f, 2.f); // Upper limit is 200% speed
+ set_all_animation_time_factors(time_factor);
+ return true;
+ }
+};
+
+class LLAdvancedAnimTenSlower : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ //llinfos << "LLAdvancedAnimTenSlower" << llendl;
+ F32 time_factor = LLMotionController::getCurrentTimeFactor();
+ time_factor = llmax(time_factor - 0.1f, 0.1f); // Lower limit is at 10% of normal speed
+ set_all_animation_time_factors(time_factor);
+ return true;
+ }
+};
+
+class LLAdvancedAnimResetAll : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ set_all_animation_time_factors(1.f);
+ return true;
+ }
+};
+
//////////////////////////
// RELOAD VERTEX SHADER //
@@ -3263,15 +3292,6 @@ bool enable_freeze_eject(const LLSD& avatar_id)
return new_value;
}
-
-void login_done(S32 which, void *user)
-{
- llinfos << "Login done " << which << llendl;
-
- LLPanelLogin::closePanel();
-}
-
-
bool callback_leave_group(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
@@ -3463,6 +3483,20 @@ bool enable_sitdown_self()
return isAgentAvatarValid() && !gAgentAvatarp->isSitting() && !gAgent.getFlying();
}
+class LLCheckPanelPeopleTab : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ std::string panel_name = userdata.asString();
+
+ LLPanel *panel = LLFloaterSidePanelContainer::getPanel("people", panel_name);
+ if(panel && panel->isInVisibleChain())
+ {
+ return true;
+ }
+ return false;
+ }
+};
// Toggle one of "People" panel tabs in side tray.
class LLTogglePanelPeopleTab : public view_listener_t
{
@@ -3475,7 +3509,8 @@ class LLTogglePanelPeopleTab : public view_listener_t
if ( panel_name == "friends_panel"
|| panel_name == "groups_panel"
- || panel_name == "nearby_panel")
+ || panel_name == "nearby_panel"
+ || panel_name == "blocked_panel")
{
return togglePeoplePanel(panel_name, param);
}
@@ -3911,25 +3946,27 @@ class LLViewToggleUI : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- LLNotification::Params params("ConfirmHideUI");
- params.functor.function(boost::bind(&LLViewToggleUI::confirm, this, _1, _2));
- LLSD substitutions;
+ if(gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK)
+ {
+ LLNotification::Params params("ConfirmHideUI");
+ params.functor.function(boost::bind(&LLViewToggleUI::confirm, this, _1, _2));
+ LLSD substitutions;
#if LL_DARWIN
- substitutions["SHORTCUT"] = "Cmd+Shift+U";
+ substitutions["SHORTCUT"] = "Cmd+Shift+U";
#else
- substitutions["SHORTCUT"] = "Ctrl+Shift+U";
+ substitutions["SHORTCUT"] = "Ctrl+Shift+U";
#endif
- params.substitutions = substitutions;
- if (gViewerWindow->getUIVisibility())
- {
- // hiding, so show notification
- LLNotifications::instance().add(params);
- }
- else
- {
- LLNotifications::instance().forceResponse(params, 0);
+ params.substitutions = substitutions;
+ if (!gSavedSettings.getBOOL("HideUIControls"))
+ {
+ // hiding, so show notification
+ LLNotifications::instance().add(params);
+ }
+ else
+ {
+ LLNotifications::instance().forceResponse(params, 0);
+ }
}
-
return true;
}
@@ -3939,7 +3976,9 @@ class LLViewToggleUI : public view_listener_t
if (option == 0) // OK
{
- gViewerWindow->setUIVisibility(!gViewerWindow->getUIVisibility());
+ gViewerWindow->setUIVisibility(gSavedSettings.getBOOL("HideUIControls"));
+ LLPanelStandStopFlying::getInstance()->setVisible(gSavedSettings.getBOOL("HideUIControls"));
+ gSavedSettings.setBOOL("HideUIControls",!gSavedSettings.getBOOL("HideUIControls"));
}
}
};
@@ -4834,18 +4873,6 @@ BOOL sitting_on_selection()
return (gAgentAvatarp->isSitting() && gAgentAvatarp->getRoot() == root_object);
}
-class LLToolsSaveToInventory : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- if(enable_save_into_inventory(NULL))
- {
- derez_objects(DRD_SAVE_INTO_AGENT_INVENTORY, LLUUID::null);
- }
- return true;
- }
-};
-
class LLToolsSaveToObjectInventory : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -4876,6 +4903,37 @@ class LLToolsEnablePathfindingView : public view_listener_t
}
};
+class LLToolsDoPathfindingRebakeRegion : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ bool hasPathfinding = (LLPathfindingManager::getInstance() != NULL);
+
+ if (hasPathfinding)
+ {
+ LLMenuOptionPathfindingRebakeNavmesh::getInstance()->sendRequestRebakeNavmesh();
+ }
+
+ return hasPathfinding;
+ }
+};
+
+class LLToolsEnablePathfindingRebakeRegion : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ bool returnValue = false;
+
+ if (LLPathfindingManager::getInstance() != NULL)
+ {
+ LLMenuOptionPathfindingRebakeNavmesh *rebakeInstance = LLMenuOptionPathfindingRebakeNavmesh::getInstance();
+ returnValue = (rebakeInstance->canRebakeRegion() &&
+ (rebakeInstance->getMode() == LLMenuOptionPathfindingRebakeNavmesh::kRebakeNavMesh_Available));
+ }
+ return returnValue;
+ }
+};
+
// Round the position of all root objects to the grid
class LLToolsSnapObjectXY : public view_listener_t
{
@@ -5134,12 +5192,6 @@ class LLEditDelete : public view_listener_t
}
};
-bool enable_object_return()
-{
- return (!LLSelectMgr::getInstance()->getSelection()->isEmpty() &&
- (gAgent.isGodlike() || can_derez(DRD_RETURN_TO_OWNER)));
-}
-
void handle_spellcheck_replace_with_suggestion(const LLUICtrl* ctrl, const LLSD& param)
{
const LLContextMenu* menu = dynamic_cast<const LLContextMenu*>(ctrl->getParent());
@@ -5212,6 +5264,12 @@ bool enable_spellcheck_add_to_ignore(const LLUICtrl* ctrl)
return (spellcheck_handler) && (spellcheck_handler->canAddToIgnore());
}
+bool enable_object_return()
+{
+ return (!LLSelectMgr::getInstance()->getSelection()->isEmpty() &&
+ (gAgent.isGodlike() || can_derez(DRD_RETURN_TO_OWNER)));
+}
+
bool enable_object_delete()
{
bool new_value =
@@ -5499,16 +5557,6 @@ void toggle_debug_menus(void*)
// gExportDialog = LLUploadDialog::modalUploadDialog("Exporting selected objects...");
// }
//
-
-class LLCommunicateBlockList : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD());
- return true;
- }
-};
-
class LLWorldSetHomeLocation : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -5582,18 +5630,18 @@ class LLWorldSetAway : public view_listener_t
}
};
-class LLWorldSetBusy : public view_listener_t
+class LLWorldSetDoNotDisturb : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- if (gAgent.getBusy())
+ if (gAgent.isDoNotDisturb())
{
- gAgent.clearBusy();
+ gAgent.setDoNotDisturb(false);
}
else
{
- gAgent.setBusy();
- LLNotificationsUtil::add("BusyModeSet");
+ gAgent.setDoNotDisturb(true);
+ LLNotificationsUtil::add("DoNotDisturbModeSet");
}
return true;
}
@@ -5755,7 +5803,7 @@ bool complete_give_money(const LLSD& notification, const LLSD& response, LLObjec
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
{
- gAgent.clearBusy();
+ gAgent.setDoNotDisturb(false);
}
LLViewerObject* objectp = selection->getPrimaryObject();
@@ -5788,12 +5836,12 @@ bool complete_give_money(const LLSD& notification, const LLSD& response, LLObjec
void handle_give_money_dialog()
{
- LLNotification::Params params("BusyModePay");
+ LLNotification::Params params("DoNotDisturbModePay");
params.functor.function(boost::bind(complete_give_money, _1, _2, LLSelectMgr::getInstance()->getSelection()));
- if (gAgent.getBusy())
+ if (gAgent.isDoNotDisturb())
{
- // warn users of being in busy mode during a transaction
+ // warn users of being in do not disturb mode during a transaction
LLNotifications::instance().add(params);
}
else
@@ -7107,50 +7155,6 @@ bool LLHasAsset::operator()(LLInventoryCategory* cat,
return FALSE;
}
-BOOL enable_save_into_inventory(void*)
-{
- // *TODO: clean this up
- // find the last root
- LLSelectNode* last_node = NULL;
- for (LLObjectSelection::root_iterator iter = LLSelectMgr::getInstance()->getSelection()->root_begin();
- iter != LLSelectMgr::getInstance()->getSelection()->root_end(); iter++)
- {
- last_node = *iter;
- }
-
-#ifdef HACKED_GODLIKE_VIEWER
- return TRUE;
-#else
-# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!LLGridManager::getInstance()->isInProductionGrid()
- && gAgent.isGodlike())
- {
- return TRUE;
- }
-# endif
- // check all pre-req's for save into inventory.
- if(last_node && last_node->mValid && !last_node->mItemID.isNull()
- && (last_node->mPermissions->getOwner() == gAgent.getID())
- && (gInventory.getItem(last_node->mItemID) != NULL))
- {
- LLViewerObject* obj = last_node->getObject();
- if( obj && !obj->isAttachment() )
- {
- return TRUE;
- }
- }
- return FALSE;
-#endif
-}
-
-class LLToolsEnableSaveToInventory : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- bool new_value = enable_save_into_inventory(NULL);
- return new_value;
- }
-};
BOOL enable_save_into_task_inventory(void*)
{
@@ -7532,6 +7536,7 @@ class LLToolsUseSelectionForGrid : public view_listener_t
} func;
LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func);
LLSelectMgr::getInstance()->setGridMode(GRID_MODE_REF_OBJECT);
+ LLFloaterTools::setGridMode((S32)GRID_MODE_REF_OBJECT);
return true;
}
};
@@ -7608,6 +7613,20 @@ void handle_web_content_test(const LLSD& param)
LLWeb::loadURLInternal(url);
}
+void handle_show_url(const LLSD& param)
+{
+ std::string url = param.asString();
+ if(gSavedSettings.getBOOL("UseExternalBrowser"))
+ {
+ LLWeb::loadURLExternal(url);
+ }
+ else
+ {
+ LLWeb::loadURLInternal(url);
+ }
+
+}
+
void handle_buy_currency_test(void*)
{
std::string url =
@@ -7861,6 +7880,22 @@ class LLViewCheckRenderType : public view_listener_t
}
};
+class LLViewStatusAway : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ return (gAgent.isInitialized() && gAgent.getAFK());
+ }
+};
+
+class LLViewStatusDoNotDisturb : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ return (gAgent.isInitialized() && gAgent.isDoNotDisturb());
+ }
+};
+
class LLViewShowHUDAttachments : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -8087,11 +8122,7 @@ class LLWorldPostProcess : public view_listener_t
void handle_flush_name_caches()
{
- // Toggle display names on and off to flush
- bool use_display_names = LLAvatarNameCache::useDisplayNames();
- LLAvatarNameCache::setUseDisplayNames(!use_display_names);
- LLAvatarNameCache::setUseDisplayNames(use_display_names);
-
+ LLAvatarNameCache::cleanupClass();
if (gCacheName) gCacheName->clear();
}
@@ -8116,6 +8147,11 @@ public:
}
};
+void handle_voice_morphing_subscribe()
+{
+ LLWeb::loadURLExternal(LLTrans::getString("voice_morphing_url"));
+}
+
class LLToggleUIHints : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -8249,6 +8285,7 @@ void initialize_menus()
commit.add("Inventory.NewWindow", boost::bind(&LLFloaterInventory::showAgentInventory));
+ enable.add("Conversation.IsConversationLoggingAllowed", boost::bind(&LLFloaterIMContainer::isConversationLoggingAllowed));
// Agent
commit.add("Agent.toggleFlying", boost::bind(&LLAgent::toggleFlying));
@@ -8294,14 +8331,21 @@ void initialize_menus()
view_listener_t::addMenu(new LLViewCheckShowHoverTips(), "View.CheckShowHoverTips");
view_listener_t::addMenu(new LLViewCheckHighlightTransparent(), "View.CheckHighlightTransparent");
view_listener_t::addMenu(new LLViewCheckRenderType(), "View.CheckRenderType");
+ view_listener_t::addMenu(new LLViewStatusAway(), "View.Status.CheckAway");
+ view_listener_t::addMenu(new LLViewStatusDoNotDisturb(), "View.Status.CheckDoNotDisturb");
view_listener_t::addMenu(new LLViewCheckHUDAttachments(), "View.CheckHUDAttachments");
-
+
// Me > Movement
view_listener_t::addMenu(new LLAdvancedAgentFlyingInfo(), "Agent.getFlying");
-
- // Communicate
- view_listener_t::addMenu(new LLCommunicateBlockList(), "Communicate.BlockList");
-
+
+ // Communicate > Voice morphing > Subscribe...
+ commit.add("Communicate.VoiceMorphing.Subscribe", boost::bind(&handle_voice_morphing_subscribe));
+ LLVivoxVoiceClient * voice_clientp = LLVivoxVoiceClient::getInstance();
+ enable.add("Communicate.VoiceMorphing.NoVoiceMorphing.Check"
+ , boost::bind(&LLVivoxVoiceClient::onCheckVoiceEffect, voice_clientp, "NoVoiceMorphing"));
+ commit.add("Communicate.VoiceMorphing.NoVoiceMorphing.Click"
+ , boost::bind(&LLVivoxVoiceClient::onClickVoiceEffect, voice_clientp, "NoVoiceMorphing"));
+
// World menu
view_listener_t::addMenu(new LLWorldAlwaysRun(), "World.AlwaysRun");
view_listener_t::addMenu(new LLWorldCreateLandmark(), "World.CreateLandmark");
@@ -8309,7 +8353,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLWorldSetHomeLocation(), "World.SetHomeLocation");
view_listener_t::addMenu(new LLWorldTeleportHome(), "World.TeleportHome");
view_listener_t::addMenu(new LLWorldSetAway(), "World.SetAway");
- view_listener_t::addMenu(new LLWorldSetBusy(), "World.SetBusy");
+ view_listener_t::addMenu(new LLWorldSetDoNotDisturb(), "World.SetDoNotDisturb");
view_listener_t::addMenu(new LLWorldEnableCreateLandmark(), "World.EnableCreateLandmark");
view_listener_t::addMenu(new LLWorldEnableSetHomeLocation(), "World.EnableSetHomeLocation");
@@ -8342,7 +8386,6 @@ void initialize_menus()
commit.add("Tools.LookAtSelection", boost::bind(&handle_look_at_selection, _2));
commit.add("Tools.BuyOrTake", boost::bind(&handle_buy_or_take));
commit.add("Tools.TakeCopy", boost::bind(&handle_take_copy));
- view_listener_t::addMenu(new LLToolsSaveToInventory(), "Tools.SaveToInventory");
view_listener_t::addMenu(new LLToolsSaveToObjectInventory(), "Tools.SaveToObjectInventory");
view_listener_t::addMenu(new LLToolsSelectedScriptAction(), "Tools.SelectedScriptAction");
@@ -8354,11 +8397,12 @@ void initialize_menus()
enable.add("Tools.EnableTakeCopy", boost::bind(&enable_object_take_copy));
enable.add("Tools.VisibleBuyObject", boost::bind(&tools_visible_buy_object));
enable.add("Tools.VisibleTakeObject", boost::bind(&tools_visible_take_object));
- view_listener_t::addMenu(new LLToolsEnableSaveToInventory(), "Tools.EnableSaveToInventory");
view_listener_t::addMenu(new LLToolsEnableSaveToObjectInventory(), "Tools.EnableSaveToObjectInventory");
view_listener_t::addMenu(new LLToolsEnablePathfinding(), "Tools.EnablePathfinding");
view_listener_t::addMenu(new LLToolsEnablePathfindingView(), "Tools.EnablePathfindingView");
+ view_listener_t::addMenu(new LLToolsDoPathfindingRebakeRegion(), "Tools.DoPathfindingRebakeRegion");
+ view_listener_t::addMenu(new LLToolsEnablePathfindingRebakeRegion(), "Tools.EnablePathfindingRebakeRegion");
// Help menu
// most items use the ShowFloater method
@@ -8425,6 +8469,7 @@ void initialize_menus()
// Advanced > UI
commit.add("Advanced.WebBrowserTest", boost::bind(&handle_web_browser_test, _2)); // sigh! this one opens the MEDIA browser
commit.add("Advanced.WebContentTest", boost::bind(&handle_web_content_test, _2)); // this one opens the Web Content floater
+ commit.add("Advanced.ShowURL", boost::bind(&handle_show_url, _2));
view_listener_t::addMenu(new LLAdvancedBuyCurrencyTest(), "Advanced.BuyCurrencyTest");
view_listener_t::addMenu(new LLAdvancedDumpSelectMgr(), "Advanced.DumpSelectMgr");
view_listener_t::addMenu(new LLAdvancedDumpInventory(), "Advanced.DumpInventory");
@@ -8432,7 +8477,6 @@ void initialize_menus()
commit.add("Advanced.DumpFocusHolder", boost::bind(&handle_dump_focus) );
view_listener_t::addMenu(new LLAdvancedPrintSelectedObjectInfo(), "Advanced.PrintSelectedObjectInfo");
view_listener_t::addMenu(new LLAdvancedPrintAgentInfo(), "Advanced.PrintAgentInfo");
- view_listener_t::addMenu(new LLAdvancedPrintTextureMemoryStats(), "Advanced.PrintTextureMemoryStats");
view_listener_t::addMenu(new LLAdvancedToggleDebugClicks(), "Advanced.ToggleDebugClicks");
view_listener_t::addMenu(new LLAdvancedCheckDebugClicks(), "Advanced.CheckDebugClicks");
view_listener_t::addMenu(new LLAdvancedCheckDebugViews(), "Advanced.CheckDebugViews");
@@ -8464,6 +8508,11 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedTestMale(), "Advanced.TestMale");
view_listener_t::addMenu(new LLAdvancedTestFemale(), "Advanced.TestFemale");
+ // Advanced > Character > Animation Speed
+ view_listener_t::addMenu(new LLAdvancedAnimTenFaster(), "Advanced.AnimTenFaster");
+ view_listener_t::addMenu(new LLAdvancedAnimTenSlower(), "Advanced.AnimTenSlower");
+ view_listener_t::addMenu(new LLAdvancedAnimResetAll(), "Advanced.AnimResetAll");
+
// Advanced > Character (toplevel)
view_listener_t::addMenu(new LLAdvancedForceParamsToDefault(), "Advanced.ForceParamsToDefault");
view_listener_t::addMenu(new LLAdvancedReloadVertexShader(), "Advanced.ReloadVertexShader");
@@ -8551,6 +8600,7 @@ void initialize_menus()
// we don't use boost::bind directly to delay side tray construction
view_listener_t::addMenu( new LLTogglePanelPeopleTab(), "SideTray.PanelPeopleTab");
+ view_listener_t::addMenu( new LLCheckPanelPeopleTab(), "SideTray.CheckPanelPeopleTab");
// Avatar pie menu
view_listener_t::addMenu(new LLObjectMute(), "Avatar.Mute");
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index 3515aa4302..01534503f3 100644
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -27,7 +27,7 @@
#ifndef LL_LLVIEWERMENU_H
#define LL_LLVIEWERMENU_H
-#include "llmenugl.h"
+#include "../llui/llmenugl.h"
#include "llsafehandle.h"
class LLMessageSystem;
@@ -49,7 +49,6 @@ void show_context_menu( S32 x, S32 y, MASK mask );
void show_build_mode_context_menu(S32 x, S32 y, MASK mask);
void show_navbar_context_menu(LLView* ctrl, S32 x, S32 y);
void show_topinfobar_context_menu(LLView* ctrl, S32 x, S32 y);
-BOOL enable_save_into_inventory(void*);
void handle_reset_view();
void handle_cut(void*);
void handle_copy(void*);
@@ -159,8 +158,6 @@ protected:
LLSafeHandle<LLObjectSelection> mObjectSelection;
};
-extern const std::string SAVE_INTO_INVENTORY;
-
extern LLMenuBarGL* gMenuBarView;
//extern LLView* gMenuBarHolder;
extern LLMenuGL* gEditMenu;
@@ -187,8 +184,6 @@ extern LLContextMenu* gDetachPieMenu;
extern LLContextMenu* gAttachBodyPartPieMenus[8];
extern LLContextMenu* gDetachBodyPartPieMenus[8];
-extern LLMenuItemCallGL* gAFKMenu;
-extern LLMenuItemCallGL* gBusyMenu;
extern LLMenuItemCallGL* gMutePieMenu;
extern LLMenuItemCallGL* gMuteObjectPieMenu;
extern LLMenuItemCallGL* gBuyPassPieMenu;
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index dc2ea4bd1f..be78603e2d 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -34,6 +34,7 @@
#include "llfilepicker.h"
#include "llfloaterreg.h"
#include "llbuycurrencyhtml.h"
+#include "llfloatermap.h"
#include "llfloatermodelpreview.h"
#include "llfloatersnapshot.h"
#include "llimage.h"
@@ -475,7 +476,7 @@ class LLFileEnableCloseWindow : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- bool new_value = NULL != LLFloater::getClosableFloaterFromFocus();
+ bool new_value = NULL != gFloaterView->getFrontmostClosableFloater();
return new_value;
}
};
@@ -484,8 +485,7 @@ class LLFileCloseWindow : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- LLFloater::closeFocusedFloater();
-
+ LLFloater::closeFrontmostFloater();
return true;
}
};
@@ -494,7 +494,7 @@ class LLFileEnableCloseAllWindows : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- bool open_children = gFloaterView->allChildrenClosed();
+ bool open_children = gFloaterView->allChildrenClosed() && !LLFloaterSnapshot::getInstance()->isInVisibleChain();
return !open_children;
}
};
@@ -505,7 +505,7 @@ class LLFileCloseAllWindows : public view_listener_t
{
bool app_quitting = false;
gFloaterView->closeAllChildren(app_quitting);
-
+ LLFloaterSnapshot::getInstance()->closeFloater(app_quitting);
return true;
}
};
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 903f4437a7..a13c793899 100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -65,10 +65,11 @@
#include "llfloatersnapshot.h"
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
+#include "llimview.h"
#include "llinventoryfunctions.h"
#include "llinventoryobserver.h"
#include "llinventorypanel.h"
-#include "llnearbychat.h"
+#include "llfloaterimnearbychat.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "llpanelgrouplandmoney.h"
@@ -120,6 +121,8 @@
#pragma warning (disable:4702)
#endif
+extern void on_new_message(const LLSD& msg);
+
//
// Constants
//
@@ -184,78 +187,82 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLMessageSystem* msg = gMessageSystem;
const LLSD& payload = notification["payload"];
-
- // add friend to recent people list
- LLRecentPeople::instance().add(payload["from_id"]);
-
- switch(option)
- {
- case 0:
- {
- // accept
- LLAvatarTracker::formFriendship(payload["from_id"]);
-
- const LLUUID fid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
-
- // This will also trigger an onlinenotification if the user is online
- msg->newMessageFast(_PREHASH_AcceptFriendship);
- 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->nextBlockFast(_PREHASH_FolderData);
- msg->addUUIDFast(_PREHASH_FolderID, fid);
- msg->sendReliable(LLHost(payload["sender"].asString()));
-
- LLSD payload = notification["payload"];
- payload["SUPPRESS_TOAST"] = true;
- LLNotificationsUtil::add("FriendshipAcceptedByMe",
- notification["substitutions"], payload);
- break;
- }
- case 1: // Decline
- {
- LLSD payload = notification["payload"];
- payload["SUPPRESS_TOAST"] = true;
- LLNotificationsUtil::add("FriendshipDeclinedByMe",
- notification["substitutions"], payload);
- }
- // fall-through
- case 2: // Send IM - decline and start IM session
- {
- // decline
- // 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;
- }
+ LLNotificationPtr notification_ptr = LLNotifications::instance().find(notification["id"].asUUID());
+
+ // this will be skipped if the user offering friendship is blocked
+ if (notification_ptr)
+ {
+ // add friend to recent people list
+ LLRecentPeople::instance().add(payload["from_id"]);
+
+ switch(option)
+ {
+ case 0:
+ {
+ // accept
+ LLAvatarTracker::formFriendship(payload["from_id"]);
+
+ const LLUUID fid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
+
+ // This will also trigger an onlinenotification if the user is online
+ msg->newMessageFast(_PREHASH_AcceptFriendship);
+ 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->nextBlockFast(_PREHASH_FolderData);
+ msg->addUUIDFast(_PREHASH_FolderID, fid);
+ msg->sendReliable(LLHost(payload["sender"].asString()));
+
+ LLSD payload = notification["payload"];
+ LLNotificationsUtil::add("FriendshipAcceptedByMe",
+ notification["substitutions"], payload);
+ break;
+ }
+ case 1: // Decline
+ {
+ LLSD payload = notification["payload"];
+ LLNotificationsUtil::add("FriendshipDeclinedByMe",
+ notification["substitutions"], payload);
+ }
+ // fall-through
+ 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;
+ }
+
+ LLNotificationFormPtr modified_form(new LLNotificationForm(*notification_ptr->getForm()));
+ modified_form->setElementEnabled("Accept", false);
+ modified_form->setElementEnabled("Decline", false);
+ notification_ptr->updateForm(modified_form);
+ notification_ptr->repost();
+ }
return false;
}
static LLNotificationFunctorRegistration friendship_offer_callback_reg("OfferFriendship", friendship_offer_callback);
static LLNotificationFunctorRegistration friendship_offer_callback_reg_nm("OfferFriendshipNoMessage", friendship_offer_callback);
-//const char BUSY_AUTO_RESPONSE[] = "The Resident you messaged is in 'busy mode' which means they have "
-// "requested not to be disturbed. Your message will still be shown in their IM "
-// "panel for later viewing.";
-
-//
// Functions
//
@@ -726,7 +733,7 @@ static void highlight_inventory_objects_in_panel(const std::vector<LLUUID>& item
LLFolderView* fv = inventory_panel->getRootFolder();
if (fv)
{
- LLFolderViewItem* fv_item = fv->getItemByID(item_id);
+ LLFolderViewItem* fv_item = inventory_panel->getItemByID(item_id);
if (fv_item)
{
LLFolderViewItem* fv_folder = fv_item->getParentFolder();
@@ -814,7 +821,13 @@ private:
mSelectedItems.clear();
if (LLInventoryPanel::getActiveInventoryPanel())
{
- mSelectedItems = LLInventoryPanel::getActiveInventoryPanel()->getRootFolder()->getSelectionList();
+ std::set<LLFolderViewItem*> selection = LLInventoryPanel::getActiveInventoryPanel()->getRootFolder()->getSelectionList();
+ for (std::set<LLFolderViewItem*>::iterator it = selection.begin(), end_it = selection.end();
+ it != end_it;
+ ++it)
+ {
+ mSelectedItems.insert(static_cast<LLFolderViewModelItemInventory*>((*it)->getViewModelItem())->getUUID());
+ }
}
mSelectedItems.erase(mMoveIntoFolderID);
}
@@ -849,7 +862,15 @@ private:
}
// get selected items (without destination folder)
- selected_items_t selected_items = active_panel->getRootFolder()->getSelectionList();
+ selected_items_t selected_items;
+
+ std::set<LLFolderViewItem*> selection = LLInventoryPanel::getActiveInventoryPanel()->getRootFolder()->getSelectionList();
+ for (std::set<LLFolderViewItem*>::iterator it = selection.begin(), end_it = selection.end();
+ it != end_it;
+ ++it)
+ {
+ selected_items.insert(static_cast<LLFolderViewModelItemInventory*>((*it)->getViewModelItem())->getUUID());
+ }
selected_items.erase(mMoveIntoFolderID);
// compare stored & current sets of selected items
@@ -1155,7 +1176,7 @@ bool check_offer_throttle(const std::string& from_name, bool check_only)
}
}
}
-
+
// Return "true" if we have a preview method for that asset type, "false" otherwise
bool check_asset_previewable(const LLAssetType::EType asset_type)
{
@@ -1344,6 +1365,8 @@ void inventory_offer_mute_callback(const LLUUID& blocked_id,
gSavedSettings.getString("NotificationChannelUUID")), OfferMatcher(blocked_id));
}
+std::string LLOfferInfo::mResponderType = "offer_info";
+
LLOfferInfo::LLOfferInfo()
: LLNotificationResponderInterface()
, mFromGroup(FALSE)
@@ -1389,6 +1412,7 @@ LLOfferInfo::LLOfferInfo(const LLOfferInfo& info)
LLSD LLOfferInfo::asLLSD()
{
LLSD sd;
+ sd["responder_type"] = mResponderType;
sd["im_type"] = mIM;
sd["from_id"] = mFromID;
sd["from_group"] = mFromGroup;
@@ -1478,16 +1502,15 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
itemp = (LLViewerInventoryItem*)gInventory.getItem(mObjectID);
}
+ LLNotificationPtr notification_ptr = LLNotifications::instance().find(notification["id"].asUUID());
+
// 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
+ if (IOR_MUTE == button) // Block
{
- LLNotificationPtr notification_ptr = LLNotifications::instance().find(notification["id"].asUUID());
-
- llassert(notification_ptr != NULL);
if (notification_ptr != NULL)
{
gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback, _1, _2, _3));
@@ -1500,8 +1523,8 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
// 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 = gAgent.getBusy();
-
+ LLNotificationFormPtr modified_form(notification_ptr ? new LLNotificationForm(*notification_ptr->getForm()) : new LLNotificationForm());
+
switch(button)
{
case IOR_SHOW:
@@ -1545,6 +1568,11 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
LL_WARNS("Messaging") << "inventory_offer_callback: unknown offer type" << LL_ENDL;
break;
}
+
+ if (modified_form != NULL)
+ {
+ modified_form->setElementEnabled("Show", false);
+ }
break;
// end switch (mIM)
@@ -1557,9 +1585,14 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
args["MESSAGE"] = log_message;
LLNotificationsUtil::add("SystemMessageTip", args);
}
+
break;
case IOR_MUTE:
+ if (modified_form != NULL)
+ {
+ modified_form->setElementEnabled("Mute", false);
+ }
// MUTE falls through to decline
case IOR_DECLINE:
{
@@ -1589,12 +1622,13 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
{
opener = discard_agent_offer;
}
-
-
- if (busy && (!mFromGroup && !mFromObject))
+
+ if (modified_form != NULL)
{
- busy_message(gMessageSystem, mFromID);
+ modified_form->setElementEnabled("Show", false);
+ modified_form->setElementEnabled("Discard", false);
}
+
break;
}
default:
@@ -1614,6 +1648,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
{
delete this;
}
+
return false;
}
@@ -1704,7 +1739,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
from_string = chatHistory_string = mFromName;
}
- bool busy = gAgent.getBusy();
+ bool is_do_not_disturb = gAgent.isDoNotDisturb();
switch(button)
{
@@ -1777,9 +1812,9 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
LLNotificationsUtil::add("SystemMessageTip", args);
}
- if (busy && (!mFromGroup && !mFromObject))
+ if (is_do_not_disturb && (!mFromGroup && !mFromObject))
{
- busy_message(msg,mFromID);
+ send_do_not_disturb_message(msg,mFromID);
}
break;
}
@@ -1931,6 +1966,7 @@ void inventory_offer_handler(LLOfferInfo* info)
p.substitutions(args).payload(payload).functor.responder(LLNotificationResponderPtr(info));
info->mPersist = true;
p.name = "UserGiveItem";
+ p.offer_from_agent = true;
// Prefetch the item into your local inventory.
LLInventoryFetchItemsObserver* fetch_item = new LLInventoryFetchItemsObserver(info->mObjectID);
@@ -1947,6 +1983,11 @@ void inventory_offer_handler(LLOfferInfo* info)
// In viewer 2 we're now auto receiving inventory offers and messaging as such (not sending reject messages).
info->send_auto_receive_response();
+ if (gAgent.isDoNotDisturb())
+ {
+ send_do_not_disturb_message(gMessageSystem, info->mFromID);
+ }
+
// Inform user that there is a script floater via toast system
{
payload["give_inventory_notification"] = TRUE;
@@ -1991,6 +2032,18 @@ bool lure_callback(const LLSD& notification, const LLSD& response)
lure_id);
break;
}
+
+ LLNotificationPtr notification_ptr = LLNotifications::instance().find(notification["id"].asUUID());
+
+ if (notification_ptr)
+ {
+ LLNotificationFormPtr modified_form(new LLNotificationForm(*notification_ptr->getForm()));
+ modified_form->setElementEnabled("Teleport", false);
+ modified_form->setElementEnabled("Cancel", false);
+ notification_ptr->updateForm(modified_form);
+ notification_ptr->repost();
+ }
+
return false;
}
static LLNotificationFunctorRegistration lure_callback_reg("TeleportOffered", lure_callback);
@@ -2152,7 +2205,7 @@ static std::string clean_name_from_im(const std::string& name, EInstantMessage t
case IM_SESSION_SEND:
case IM_SESSION_LEAVE:
//IM_FROM_TASK
- case IM_BUSY_AUTO_RESPONSE:
+ case IM_DO_NOT_DISTURB_AUTO_RESPONSE:
case IM_CONSOLE_AND_CHAT_HISTORY:
case IM_LURE_USER:
case IM_LURE_ACCEPTED:
@@ -2193,16 +2246,7 @@ static std::string clean_name_from_task_im(const std::string& msg,
// Don't try to clean up group names
if (!from_group)
{
- if (LLAvatarNameCache::useDisplayNames())
- {
- // ...just convert to username
- final += LLCacheName::buildUsername(name);
- }
- else
- {
- // ...strip out legacy "Resident" name
- final += LLCacheName::cleanFullName(name);
- }
+ final += LLCacheName::buildUsername(name);
}
final += match[3].str();
return final;
@@ -2210,13 +2254,13 @@ static std::string clean_name_from_task_im(const std::string& msg,
return msg;
}
-void notification_display_name_callback(const LLUUID& id,
+static void notification_display_name_callback(const LLUUID& id,
const LLAvatarName& av_name,
const std::string& name,
LLSD& substitutions,
const LLSD& payload)
{
- substitutions["NAME"] = av_name.mDisplayName;
+ substitutions["NAME"] = av_name.getDisplayName();
LLNotificationsUtil::add(name, substitutions, payload);
}
@@ -2234,7 +2278,7 @@ protected:
};
// Callback for name resolution of a god/estate message
-void god_message_name_cb(const LLAvatarName& av_name, LLChat chat, std::string message)
+static void god_message_name_cb(const LLAvatarName& av_name, LLChat chat, std::string message)
{
LLSD args;
args["NAME"] = av_name.getCompleteName();
@@ -2244,12 +2288,11 @@ void god_message_name_cb(const LLAvatarName& av_name, LLChat chat, std::string m
// Treat like a system message and put in chat history.
chat.mText = av_name.getCompleteName() + ": " + message;
- LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
- if(nearby_chat)
+ LLFloaterIMNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat");
+ if (nearby_chat)
{
nearby_chat->addMessage(chat);
}
-
}
void process_improved_im(LLMessageSystem *msg, void **user_data)
@@ -2302,16 +2345,15 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// IDEVO convert new-style "Resident" names for display
name = clean_name_from_im(name, dialog);
- BOOL is_busy = gAgent.getBusy();
+ BOOL is_do_not_disturb = gAgent.isDoNotDisturb();
BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat)
// object IMs contain sender object id in session_id (STORM-1209)
|| dialog == IM_FROM_TASK && LLMuteList::getInstance()->isMuted(session_id);
- BOOL is_linden = LLMuteList::getInstance()->isLinden(name);
BOOL is_owned_by_me = FALSE;
BOOL is_friend = (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL) ? false : true;
BOOL accept_im_from_only_friend = gSavedSettings.getBOOL("VoiceCallsFriendsOnly");
- chat.mMuted = is_muted && !is_linden;
+ chat.mMuted = is_muted;
chat.mFromID = from_id;
chat.mFromName = name;
chat.mSourceType = (from_id.isNull() || (name == std::string(SYSTEM_FROM))) ? CHAT_SOURCE_SYSTEM : CHAT_SOURCE_AGENT;
@@ -2329,7 +2371,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
LLNotification::Params params;
switch(dialog)
- {
+ {
case IM_CONSOLE_AND_CHAT_HISTORY:
args["MESSAGE"] = message;
payload["from_id"] = from_id;
@@ -2340,7 +2382,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
LLPostponedNotification::add<LLPostponedIMSystemTipNotification>(params, from_id, false);
break;
- case IM_NOTHING_SPECIAL:
+ case IM_NOTHING_SPECIAL: // p2p IM
// Don't show dialog, just do IM
if (!gAgent.isGodlike()
&& gAgent.getRegion()->isPrelude()
@@ -2349,29 +2391,18 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// do nothing -- don't distract newbies in
// Prelude with global IMs
}
- else if (offline == IM_ONLINE && !is_linden && is_busy && name != SYSTEM_FROM)
+ else if (offline == IM_ONLINE
+ && is_do_not_disturb
+ && from_id.notNull() //not a system message
+ && to_id.notNull()) //not global message
{
- // return a standard "busy" message, but only do it to online IM
+ // return a standard "do not disturb" message, but only do it to online IM
// (i.e. not other auto responses and not store-and-forward IM)
if (!gIMMgr->hasSession(session_id))
{
// if there is not a panel for this conversation (i.e. it is a new IM conversation
// initiated by the other party) then...
- std::string my_name;
- LLAgentUI::buildFullname(my_name);
- std::string response = gSavedPerAccountSettings.getString("BusyModeResponse");
- pack_instant_message(
- gMessageSystem,
- gAgent.getID(),
- FALSE,
- gAgent.getSessionID(),
- from_id,
- my_name,
- response,
- IM_ONLINE,
- IM_BUSY_AUTO_RESPONSE,
- session_id);
- gAgent.sendReliableMessage();
+ send_do_not_disturb_message(msg, from_id, session_id);
}
// now store incoming IM in chat history
@@ -2386,6 +2417,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
from_id,
name,
buffer,
+ IM_OFFLINE == offline,
LLStringUtil::null,
dialog,
parent_estate_id,
@@ -2420,24 +2452,25 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
bool mute_im = is_muted;
- if (accept_im_from_only_friend && !is_friend)
+ if(accept_im_from_only_friend&&!is_friend)
{
if (!gIMMgr->isNonFriendSessionNotified(session_id))
{
std::string message = LLTrans::getString("IM_unblock_only_groups_friends");
- gIMMgr->addMessage(session_id, from_id, name, message);
+ gIMMgr->addMessage(session_id, from_id, name, message, IM_OFFLINE == offline);
gIMMgr->addNotifiedNonFriendSessionID(session_id);
}
mute_im = true;
}
- if (!mute_im || is_linden)
+ if (!mute_im)
{
gIMMgr->addMessage(
session_id,
from_id,
name,
buffer,
+ IM_OFFLINE == offline,
LLStringUtil::null,
dialog,
parent_estate_id,
@@ -2582,7 +2615,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
payload["sender_name"] = name;
payload["group_id"] = group_id;
payload["inventory_name"] = item_name;
- payload["inventory_offer"] = info ? info->asLLSD() : LLSD();
+ if(info && info->asLLSD())
+ {
+ payload["inventory_offer"] = info->asLLSD();
+ }
LLSD args;
args["SUBJECT"] = subj;
@@ -2604,11 +2640,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
break;
case IM_GROUP_INVITATION:
{
- //if (!is_linden && (is_busy || is_muted))
- if ((is_busy || is_muted))
+ if (is_do_not_disturb || is_muted)
{
- LLMessageSystem *msg = gMessageSystem;
- busy_message(msg,from_id);
+ send_do_not_disturb_message(msg, from_id);
}
else
{
@@ -2691,7 +2725,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
info->mFromName = name;
info->mDesc = message;
info->mHost = msg->getSender();
- //if (((is_busy && !is_owned_by_me) || is_muted))
+ //if (((is_do_not_disturb && !is_owned_by_me) || is_muted))
if (is_muted)
{
// Prefetch the offered item so that it can be discarded by the appropriate observer. (EXT-4331)
@@ -2702,9 +2736,11 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// Same as closing window
info->forceResponse(IOR_DECLINE);
}
- else if (is_busy && dialog != IM_TASK_INVENTORY_OFFERED) // busy mode must not affect interaction with objects (STORM-565)
+ // old logic: busy mode must not affect interaction with objects (STORM-565)
+ // new logic: inventory offers from in-world objects should be auto-declined (CHUI-519)
+ else if (is_do_not_disturb && dialog == IM_TASK_INVENTORY_OFFERED)
{
- // Until throttling is implemented, busy mode should reject inventory instead of silently
+ // Until throttling is implemented, do not disturb mode should reject inventory instead of silently
// accepting it. SEE SL-39554
info->forceResponse(IOR_DECLINE);
}
@@ -2747,49 +2783,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
break;
- case IM_SESSION_SEND:
- {
- if (is_busy)
- {
- return;
- }
-
- // Only show messages if we have a session open (which
- // should happen after you get an "invitation"
- if ( !gIMMgr->hasSession(session_id) )
- {
- return;
- }
-
- // standard message, not from system
- std::string saved;
- if(offline == IM_OFFLINE)
- {
- saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
- }
- buffer = saved + message;
- BOOL is_this_agent = FALSE;
- if(from_id == gAgentID)
- {
- is_this_agent = TRUE;
- }
- gIMMgr->addMessage(
- session_id,
- from_id,
- name,
- buffer,
- ll_safe_string((char*)binary_bucket),
- IM_SESSION_INVITE,
- parent_estate_id,
- region_id,
- position,
- true);
- }
- break;
-
case IM_FROM_TASK:
{
- if (is_busy && !is_owned_by_me)
+ if (is_do_not_disturb && !is_owned_by_me)
{
return;
}
@@ -2841,13 +2837,12 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// Note: lie to Nearby Chat, pretending that this is NOT an IM, because
// IMs from obejcts don't open IM sessions.
- LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
+ LLFloaterIMNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat");
if(!chat_from_system && nearby_chat)
{
chat.mOwnerID = from_id;
LLSD args;
args["slurl"] = location;
- args["type"] = LLNotificationsUI::NT_NEARBYCHAT;
// Look for IRC-style emotes here so object name formatting is correct
std::string prefix = message.substr(0, 4);
@@ -2886,8 +2881,78 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
LLPostponedNotification::add<LLPostponedServerObjectNotification>(params, from_id, from_group);
}
break;
+
+ case IM_SESSION_SEND: // ad-hoc or group IMs
+
+ // Only show messages if we have a session open (which
+ // should happen after you get an "invitation"
+ if ( !gIMMgr->hasSession(session_id) )
+ {
+ return;
+ }
+
+ else if (offline == IM_ONLINE && is_do_not_disturb)
+ {
+
+ // return a standard "do not disturb" message, but only do it to online IM
+ // (i.e. not other auto responses and not store-and-forward IM)
+ if (!gIMMgr->hasSession(session_id))
+ {
+ // if there is not a panel for this conversation (i.e. it is a new IM conversation
+ // initiated by the other party) then...
+ send_do_not_disturb_message(msg, from_id, session_id);
+ }
+
+ // now store incoming IM in chat history
+
+ buffer = message;
+
+ LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
+
+ // add to IM panel, but do not bother the user
+ gIMMgr->addMessage(
+ session_id,
+ from_id,
+ name,
+ buffer,
+ IM_OFFLINE == offline,
+ ll_safe_string((char*)binary_bucket),
+ IM_SESSION_INVITE,
+ parent_estate_id,
+ region_id,
+ position,
+ true);
+ }
+ else
+ {
+ // standard message, not from system
+ std::string saved;
+ if(offline == IM_OFFLINE)
+ {
+ saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
+ }
+
+ buffer = saved + message;
+
+ LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
+
+ gIMMgr->addMessage(
+ session_id,
+ from_id,
+ name,
+ buffer,
+ IM_OFFLINE == offline,
+ ll_safe_string((char*)binary_bucket),
+ IM_SESSION_INVITE,
+ parent_estate_id,
+ region_id,
+ position,
+ true);
+ }
+ break;
+
case IM_FROM_TASK_AS_ALERT:
- if (is_busy && !is_owned_by_me)
+ if (is_do_not_disturb && !is_owned_by_me)
{
return;
}
@@ -2898,17 +2963,15 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
LLNotificationsUtil::add("ObjectMessage", args);
}
break;
- case IM_BUSY_AUTO_RESPONSE:
+ case IM_DO_NOT_DISTURB_AUTO_RESPONSE:
if (is_muted)
{
- LL_DEBUGS("Messaging") << "Ignoring busy response from " << from_id << LL_ENDL;
+ LL_DEBUGS("Messaging") << "Ignoring do-not-disturb response from " << from_id << LL_ENDL;
return;
}
else
{
- // TODO: after LLTrans hits release, get "busy response" into translatable file
- buffer = llformat("%s (%s): %s", name.c_str(), "busy response", message.c_str());
- gIMMgr->addMessage(session_id, from_id, name, buffer);
+ gIMMgr->addMessage(session_id, from_id, name, message);
}
break;
@@ -2918,9 +2981,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
{
return;
}
- else if (is_busy)
+ else if (is_do_not_disturb)
{
- busy_message(msg,from_id);
+ send_do_not_disturb_message(msg, from_id);
}
else
{
@@ -3007,11 +3070,11 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
else
{
- LLNotification::Params params("TeleportOffered");
- params.substitutions = args;
- params.payload = payload;
- LLPostponedNotification::add<LLPostponedOfferNotification>( params, from_id, false);
- }
+ LLNotification::Params params("TeleportOffered");
+ params.substitutions = args;
+ params.payload = payload;
+ LLPostponedNotification::add<LLPostponedOfferNotification>( params, from_id, false);
+ }
}
}
@@ -3102,10 +3165,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
else
{
- // do not show a message box, because you're about to be
- // teleported.
- LLNotifications::instance().forceResponse(LLNotification::Params("TeleportOffered").payload(payload), 0);
- }
+ // do not show a message box, because you're about to be
+ // teleported.
+ LLNotifications::instance().forceResponse(LLNotification::Params("TeleportOffered").payload(payload), 0);
+ }
}
break;
@@ -3141,17 +3204,16 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
payload["online"] = (offline == IM_ONLINE);
payload["sender"] = msg->getSender().getIPandPort();
- if (is_busy)
- {
- busy_message(msg, from_id);
- LLNotifications::instance().forceResponse(LLNotification::Params("OfferFriendship").payload(payload), 1);
- }
- else if (is_muted)
+ if (is_muted)
{
LLNotifications::instance().forceResponse(LLNotification::Params("OfferFriendship").payload(payload), 1);
}
else
{
+ if (is_do_not_disturb)
+ {
+ send_do_not_disturb_message(msg, from_id);
+ }
args["NAME_SLURL"] = LLSLURL("agent", from_id, "about").getSLURLString();
if(message.empty())
{
@@ -3184,12 +3246,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
args["NAME"] = name;
LLSD payload;
payload["from_id"] = from_id;
- LLAvatarNameCache::get(from_id, boost::bind(&notification_display_name_callback,
- _1,
- _2,
- "FriendshipAccepted",
- args,
- payload));
+ LLAvatarNameCache::get(from_id, boost::bind(&notification_display_name_callback,_1,_2,"FriendshipAccepted",args,payload));
}
break;
@@ -3207,15 +3264,15 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
}
-void busy_message (LLMessageSystem* msg, LLUUID from_id)
+void send_do_not_disturb_message (LLMessageSystem* msg, const LLUUID& from_id, const LLUUID& session_id)
{
- if (gAgent.getBusy())
+ if (gAgent.isDoNotDisturb())
{
std::string my_name;
LLAgentUI::buildFullname(my_name);
- std::string response = gSavedPerAccountSettings.getString("BusyModeResponse");
+ std::string response = gSavedPerAccountSettings.getString("DoNotDisturbModeResponse");
pack_instant_message(
- gMessageSystem,
+ msg,
gAgent.getID(),
FALSE,
gAgent.getSessionID(),
@@ -3223,7 +3280,8 @@ void busy_message (LLMessageSystem* msg, LLUUID from_id)
my_name,
response,
IM_ONLINE,
- IM_BUSY_AUTO_RESPONSE);
+ IM_DO_NOT_DISTURB_AUTO_RESPONSE,
+ session_id);
gAgent.sendReliableMessage();
}
}
@@ -3258,7 +3316,7 @@ bool callingcard_offer_callback(const LLSD& notification, const LLSD& response)
msg->nextBlockFast(_PREHASH_TransactionBlock);
msg->addUUIDFast(_PREHASH_TransactionID, notification["payload"]["transaction_id"].asUUID());
msg->sendReliable(LLHost(notification["payload"]["sender"].asString()));
- busy_message(msg, notification["payload"]["source_id"].asUUID());
+ send_do_not_disturb_message(msg, notification["payload"]["source_id"].asUUID());
break;
default:
// close button probably, possibly timed out
@@ -3300,7 +3358,7 @@ void process_offer_callingcard(LLMessageSystem* msg, void**)
if(!source_name.empty())
{
- if (gAgent.getBusy()
+ if (gAgent.isDoNotDisturb()
|| LLMuteList::getInstance()->isMuted(source_id, source_name, LLMute::flagTextChat))
{
// automatically decline offer
@@ -3340,9 +3398,9 @@ public :
{
}
- static boost::intrusive_ptr<ChatTranslationReceiver> build(const std::string &from_lang, const std::string &to_lang, const std::string &mesg, const LLChat &chat, const LLSD &toast_args)
+ static ChatTranslationReceiver* build(const std::string &from_lang, const std::string &to_lang, const std::string &mesg, const LLChat &chat, const LLSD &toast_args)
{
- return boost::intrusive_ptr<ChatTranslationReceiver>(new ChatTranslationReceiver(from_lang, to_lang, mesg, chat, toast_args));
+ return new ChatTranslationReceiver(from_lang, to_lang, mesg, chat, toast_args);
}
protected:
@@ -3417,7 +3475,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
LLAvatarName av_name;
if (LLAvatarNameCache::get(from_id, &av_name))
{
- chat.mFromName = av_name.mDisplayName;
+ chat.mFromName = av_name.getDisplayName();
}
else
{
@@ -3429,7 +3487,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
chat.mFromName = from_name;
}
- BOOL is_busy = gAgent.getBusy();
+ BOOL is_do_not_disturb = gAgent.isDoNotDisturb();
BOOL is_muted = FALSE;
BOOL is_linden = FALSE;
@@ -3463,7 +3521,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
// record last audible utterance
if (is_audible
- && (is_linden || (!is_muted && !is_busy)))
+ && (is_linden || (!is_muted && !is_do_not_disturb)))
{
if (chat.mChatType != CHAT_TYPE_START
&& chat.mChatType != CHAT_TYPE_STOP)
@@ -3558,7 +3616,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
LLLocalSpeakerMgr::getInstance()->setSpeakerTyping(from_id, FALSE);
((LLVOAvatar*)chatter)->stopTyping();
- if (!is_muted && !is_busy)
+ if (!is_muted && !is_do_not_disturb)
{
visible_in_chat_bubble = gSavedSettings.getBOOL("UseChatBubbles");
std::string formated_msg = "";
@@ -3591,7 +3649,6 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
// 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;
chat.mOwnerID = owner_id;
if (gSavedSettings.getBOOL("TranslateChat") && chat.mSourceType != CHAT_SOURCE_SYSTEM)
@@ -3610,6 +3667,11 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
{
LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args);
}
+
+ LLSD msg_notify = LLSD(LLSD::emptyMap());
+ msg_notify["session_id"] = LLUUID();
+ msg_notify["from_id"] = chat.mFromID;
+ on_new_message(msg_notify);
}
}
@@ -4097,14 +4159,14 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
gAgent.setFlying(gAgent.canFly());
}
- // force simulator to recognize busy state
- if (gAgent.getBusy())
+ // force simulator to recognize do not disturb state
+ if (gAgent.isDoNotDisturb())
{
- gAgent.setBusy();
+ gAgent.setDoNotDisturb(true);
}
else
{
- gAgent.clearBusy();
+ gAgent.setDoNotDisturb(false);
}
if (isAgentAvatarValid())
@@ -4276,7 +4338,7 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
msg_number += 1;
if (head_rot_chg < THRESHOLD_HEAD_ROT_QDOT)
{
- //LL_INFOS("Messaging") << " head rot " << head_rotation << LL_ENDL;
+ //LL_INFOS("Messaging") << "head rot " << head_rotation << LL_ENDL;
LL_INFOS("Messaging") << "msg " << msg_number << ", frame " << LLFrameTimer::getFrameCount() << ", head_rot_chg " << head_rot_chg << LL_ENDL;
}
if (cam_rot_chg.magVec() > ROTATION_THRESHOLD)
@@ -4295,7 +4357,7 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
{
LL_INFOS("Messaging") << "msg " << msg_number << ", frame " << LLFrameTimer::getFrameCount() << ", dcf = " << control_flag_change << LL_ENDL;
}
- */
+*/
duplicate_count = 0;
}
@@ -4420,7 +4482,6 @@ extern U32 gObjectBits;
void process_object_update(LLMessageSystem *mesgsys, void **user_data)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
// Update the data counters
if (mesgsys->getReceiveCompressedSize())
{
@@ -4437,7 +4498,6 @@ void process_object_update(LLMessageSystem *mesgsys, void **user_data)
void process_compressed_object_update(LLMessageSystem *mesgsys, void **user_data)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
// Update the data counters
if (mesgsys->getReceiveCompressedSize())
{
@@ -4454,7 +4514,6 @@ void process_compressed_object_update(LLMessageSystem *mesgsys, void **user_data
void process_cached_object_update(LLMessageSystem *mesgsys, void **user_data)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
// Update the data counters
if (mesgsys->getReceiveCompressedSize())
{
@@ -4472,7 +4531,6 @@ void process_cached_object_update(LLMessageSystem *mesgsys, void **user_data)
void process_terse_object_update_improved(LLMessageSystem *mesgsys, void **user_data)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
if (mesgsys->getReceiveCompressedSize())
{
gObjectBits += mesgsys->getReceiveCompressedSize() * 8;
@@ -4485,7 +4543,7 @@ void process_terse_object_update_improved(LLMessageSystem *mesgsys, void **user_
gObjectList.processCompressedObjectUpdate(mesgsys, user_data, OUT_TERSE_IMPROVED);
}
-static LLFastTimer::DeclareTimer FTM_PROCESS_OBJECTS("Process Objects");
+static LLFastTimer::DeclareTimer FTM_PROCESS_OBJECTS("Process Kill Objects");
void process_kill_object(LLMessageSystem *mesgsys, void **user_data)
@@ -5618,25 +5676,23 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
_1, _2, _3,
notification, final_args, payload));
}
- else {
- LLAvatarNameCache::get(name_id,
- boost::bind(&money_balance_avatar_notify,
- _1, _2,
- notification, final_args, payload));
+ else
+ {
+ LLAvatarNameCache::get(name_id, boost::bind(&money_balance_avatar_notify, _1, _2, notification, final_args, payload));
}
}
bool handle_prompt_for_maturity_level_change_callback(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-
+
if (0 == option)
{
// set the preference to the maturity of the region we're calling
U8 preferredMaturity = static_cast<U8>(notification["payload"]["_region_access"].asInteger());
gSavedSettings.setU32("PreferredMaturity", static_cast<U32>(preferredMaturity));
}
-
+
return false;
}
@@ -5699,7 +5755,7 @@ bool handle_special_notification(std::string notificationID, LLSD& llsdBlock)
gAgent.clearTeleportRequest();
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
returnValue = true;
-
+
notifySuffix = "_NotifyAdultsOnly";
}
else if (gAgent.prefersPG() || gAgent.prefersMature())
@@ -5796,7 +5852,7 @@ bool handle_teleport_access_blocked(LLSD& llsdBlock)
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
returnValue = true;
}
- }
+ }
if ((maturityLevelNotification == NULL) || maturityLevelNotification->isIgnored())
{
@@ -5962,8 +6018,8 @@ void process_alert_core(const std::string& message, BOOL modal)
std::string alert_name(message.substr(ALERT_PREFIX.length()));
if (!handle_special_alerts(alert_name))
{
- LLNotificationsUtil::add(alert_name);
- }
+ LLNotificationsUtil::add(alert_name);
+ }
}
else if (message.find(NOTIFY_PREFIX) == 0)
{
@@ -6798,7 +6854,6 @@ bool handle_lure_callback(const LLSD& notification, const LLSD& response)
//*TODO please rewrite all keys to the same case, lower or upper
payload["from_id"] = target_id;
- payload["SUPPRESS_TOAST"] = true;
LLNotificationsUtil::add("TeleportOfferSent", args, payload);
// Add the recepient to the recent people list.
@@ -6919,7 +6974,7 @@ void process_user_info_reply(LLMessageSystem* msg, void**)
std::string dir_visibility;
msg->getString( "UserData", "DirectoryVisibility", dir_visibility);
- LLFloaterPreference::updateUserInfo(dir_visibility, im_via_email, email);
+ LLFloaterPreference::updateUserInfo(dir_visibility, im_via_email);
LLFloaterSnapshot::setAgentEmail(email);
}
diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h
index 594c22ed9c..3237f3fbdd 100644
--- a/indra/newview/llviewermessage.h
+++ b/indra/newview/llviewermessage.h
@@ -67,7 +67,6 @@ enum InventoryOfferResponse
BOOL can_afford_transaction(S32 cost);
void give_money(const LLUUID& uuid, LLViewerRegion* region, S32 amount, BOOL is_group = FALSE,
S32 trx_type = TRANS_GIFT, const std::string& desc = LLStringUtil::null);
-void busy_message (LLMessageSystem* msg, LLUUID from_id);
void process_logout_reply(LLMessageSystem* msg, void**);
void process_layer_data(LLMessageSystem *mesgsys, void **user_data);
@@ -153,6 +152,8 @@ void send_group_notice(const LLUUID& group_id,
const std::string& message,
const LLInventoryItem* item);
+void send_do_not_disturb_message (LLMessageSystem* msg, const LLUUID& from_id, const LLUUID& session_id = LLUUID::null);
+
void handle_lure(const LLUUID& invitee);
void handle_lure(const uuid_vec_t& ids);
@@ -228,6 +229,7 @@ public:
void forceResponse(InventoryOfferResponse response);
+ static std::string mResponderType;
EInstantMessage mIM;
LLUUID mFromID;
BOOL mFromGroup;
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 444bbb2776..b1a60197a2 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -237,6 +237,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
mTimeDilation(1.f),
mRotTime(0.f),
mAngularVelocityRot(),
+ mPreviousRotation(),
mState(0),
mMedia(NULL),
mClickAction(0),
@@ -784,7 +785,7 @@ BOOL LLViewerObject::setDrawableParent(LLDrawable* parentp)
}
LLDrawable* old_parent = mDrawable->mParent;
mDrawable->mParent = parentp;
-
+
if (parentp && mDrawable->isActive())
{
parentp->makeActive();
@@ -875,7 +876,6 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
const EObjectUpdateType update_type,
LLDataPacker *dp)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
U32 retval = 0x0;
// If region is removed from the list it is also deleted.
@@ -1231,12 +1231,8 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
coloru.mV[3] = 255 - coloru.mV[3];
mText->setColor(LLColor4(coloru));
mText->setString(temp_string);
-
- if (mDrawable.notNull())
- {
- setChanged(MOVED | SILHOUETTE);
- gPipeline.markMoved(mDrawable, FALSE); // undamped
- }
+
+ setChanged(MOVED | SILHOUETTE);
}
else if (mText.notNull())
{
@@ -1410,9 +1406,10 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
#else
val = (U16 *) &data[count];
#endif
- setAngularVelocity( U16_to_F32(val[VX], -size, size),
+ new_angv.set(U16_to_F32(val[VX], -size, size),
U16_to_F32(val[VY], -size, size),
U16_to_F32(val[VZ], -size, size));
+ setAngularVelocity(new_angv);
break;
case 16:
@@ -1436,9 +1433,10 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
new_rot.mQ[VZ] = U8_to_F32(data[11], -1.f, 1.f);
new_rot.mQ[VW] = U8_to_F32(data[12], -1.f, 1.f);
- setAngularVelocity( U8_to_F32(data[13], -size, size),
+ new_angv.set(U8_to_F32(data[13], -size, size),
U8_to_F32(data[14], -size, size),
U8_to_F32(data[15], -size, size) );
+ setAngularVelocity(new_angv);
break;
}
@@ -1510,9 +1508,10 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
dp->unpackU16(val[VX], "AccX");
dp->unpackU16(val[VY], "AccY");
dp->unpackU16(val[VZ], "AccZ");
- setAngularVelocity( U16_to_F32(val[VX], -64.f, 64.f),
+ new_angv.set(U16_to_F32(val[VX], -64.f, 64.f),
U16_to_F32(val[VY], -64.f, 64.f),
U16_to_F32(val[VZ], -64.f, 64.f));
+ setAngularVelocity(new_angv);
}
break;
case OUT_FULL_COMPRESSED:
@@ -1556,8 +1555,8 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
if (value & 0x80)
{
- dp->unpackVector3(vec, "Omega");
- setAngularVelocity(vec);
+ dp->unpackVector3(new_angv, "Omega");
+ setAngularVelocity(new_angv);
}
if (value & 0x20)
@@ -2038,10 +2037,14 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
}
}
- if (new_rot != getRotation()
- || new_angv != old_angv)
+ if ((new_rot != getRotation())
+ || (new_angv != old_angv))
{
- if (new_angv != old_angv)
+ if (new_rot != mPreviousRotation)
+ {
+ resetRot();
+ }
+ else if (new_angv != old_angv)
{
if (flagUsePhysics())
{
@@ -2053,12 +2056,14 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
}
}
+ // Remember the last rotation value
+ mPreviousRotation = new_rot;
+
// Set the rotation of the object followed by adjusting for the accumulated angular velocity (llSetTargetOmega)
setRotation(new_rot * mAngularVelocityRot);
setChanged(ROTATED | SILHOUETTE);
}
-
if ( gShowObjectUpdates )
{
LLColor4 color;
@@ -2159,28 +2164,28 @@ void LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
if (!mDead)
{
- // CRO - don't velocity interp linked objects!
- // Leviathan - but DO velocity interp joints
- if (!mStatic && sVelocityInterpolate && !isSelected())
- {
- // calculate dt from last update
- F32 dt_raw = (F32)(time - mLastInterpUpdateSecs);
- F32 dt = mTimeDilation * dt_raw;
+ // CRO - don't velocity interp linked objects!
+ // Leviathan - but DO velocity interp joints
+ if (!mStatic && sVelocityInterpolate && !isSelected())
+ {
+ // calculate dt from last update
+ F32 dt_raw = (F32)(time - mLastInterpUpdateSecs);
+ F32 dt = mTimeDilation * dt_raw;
applyAngularVelocity(dt);
-
+
if (isAttachment())
- {
- mLastInterpUpdateSecs = time;
+ {
+ mLastInterpUpdateSecs = time;
return;
- }
- else
- { // Move object based on it's velocity and rotation
- interpolateLinearMotion(time, dt);
- }
}
+ else
+ { // Move object based on it's velocity and rotation
+ interpolateLinearMotion(time, dt);
+ }
+ }
- updateDrawable(FALSE);
+ updateDrawable(FALSE);
}
}
@@ -2341,8 +2346,6 @@ void LLViewerObject::interpolateLinearMotion(const F64 & time, const F32 & dt)
BOOL LLViewerObject::setData(const U8 *datap, const U32 data_size)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
-
delete [] mData;
if (datap)
@@ -2384,8 +2387,6 @@ void LLViewerObject::doUpdateInventory(
U8 key,
bool is_new)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
-
LLViewerInventoryItem* old_item = NULL;
if(TASK_INVENTORY_ITEM_KEY == key)
{
@@ -2469,8 +2470,6 @@ void LLViewerObject::saveScript(
BOOL active,
bool is_new)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
-
/*
* XXXPAM Investigate not making this copy. Seems unecessary, but I'm unsure about the
* interaction with doUpdateInventory() called below.
@@ -2546,8 +2545,6 @@ void LLViewerObject::dirtyInventory()
void LLViewerObject::registerInventoryListener(LLVOInventoryListener* listener, void* user_data)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
-
LLInventoryCallbackInfo* info = new LLInventoryCallbackInfo;
info->mListener = listener;
info->mInventoryData = user_data;
@@ -2645,8 +2642,6 @@ S32 LLFilenameAndTask::sCount = 0;
// static
void LLViewerObject::processTaskInv(LLMessageSystem* msg, void** user_data)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
-
LLUUID task_id;
msg->getUUIDFast(_PREHASH_InventoryData, _PREHASH_TaskID, task_id);
LLViewerObject* object = gObjectList.findObject(task_id);
@@ -2733,8 +2728,6 @@ void LLViewerObject::processTaskInvFile(void** user_data, S32 error_code, LLExtS
void LLViewerObject::loadTaskInvFile(const std::string& filename)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
-
std::string filename_and_local_path = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, filename);
llifstream ifs(filename_and_local_path);
if(ifs.good())
@@ -2858,23 +2851,6 @@ void LLViewerObject::updateInventory(
U8 key,
bool is_new)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
-
- std::list<LLUUID>::iterator begin = mPendingInventoryItemsIDs.begin();
- std::list<LLUUID>::iterator end = mPendingInventoryItemsIDs.end();
-
- bool is_fetching = std::find(begin, end, item->getAssetUUID()) != end;
- bool is_fetched = getInventoryItemByAsset(item->getAssetUUID()) != NULL;
-
- if (is_fetched || is_fetching)
- {
- return;
- }
- else
- {
- mPendingInventoryItemsIDs.push_back(item->getAssetUUID());
- }
-
// This slices the object into what we're concerned about on the
// viewer. The simulator will take the permissions and transfer
// ownership.
@@ -3883,8 +3859,6 @@ std::string LLViewerObject::getMediaURL() const
void LLViewerObject::setMediaURL(const std::string& media_url)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
-
if (!mMedia)
{
mMedia = new LLViewerObjectMedia;
@@ -3934,8 +3908,6 @@ BOOL LLViewerObject::setMaterial(const U8 material)
void LLViewerObject::setNumTEs(const U8 num_tes)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
-
U32 i;
if (num_tes != getNumTEs())
{
@@ -5384,9 +5356,9 @@ void LLViewerObject::setPhysicsShapeType(U8 type)
mPhysicsShapeUnknown = false;
if (type != mPhysicsShapeType)
{
- mPhysicsShapeType = type;
- mCostStale = true;
- }
+ mPhysicsShapeType = type;
+ mCostStale = true;
+}
}
void LLViewerObject::setPhysicsGravity(F32 gravity)
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 277bd1c430..97cf0a4850 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -34,7 +34,6 @@
#include "llhudicon.h"
#include "llinventory.h"
#include "llrefcount.h"
-#include "llmemtype.h"
#include "llprimitive.h"
#include "lluuid.h"
#include "llvoinventorylistener.h"
@@ -128,7 +127,6 @@ public:
typedef const child_list_t const_child_list_t;
LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp, BOOL is_global = FALSE);
- MEM_TYPE_NEW(LLMemType::MTYPE_OBJECT);
virtual void markDead(); // Mark this object as dead, and clean up its references
BOOL isDead() const {return mDead;}
@@ -725,6 +723,7 @@ protected:
F32 mTimeDilation; // Time dilation sent with the object.
F32 mRotTime; // Amount (in seconds) that object has rotated according to angular velocity (llSetTargetOmega)
LLQuaternion mAngularVelocityRot; // accumulated rotation from the angular velocity computations
+ LLQuaternion mPreviousRotation;
U8 mState; // legacy
LLViewerObjectMedia* mMedia; // NULL if no media associated
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index e399b45cba..4049e31472 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -230,7 +230,6 @@ void LLViewerObjectList::processUpdateCore(LLViewerObject* objectp,
LLDataPacker* dpp,
BOOL just_created)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT_PROCESS_UPDATE_CORE);
LLMessageSystem* msg = gMessageSystem;
// ignore returned flags
@@ -283,7 +282,6 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
const EObjectUpdateType update_type,
bool cached, bool compressed)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT_PROCESS_UPDATE);
LLFastTimer t(FTM_PROCESS_OBJECTS);
LLVector3d camera_global = gAgentCamera.getCameraPositionGlobal();
@@ -334,6 +332,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
U64 region_handle;
mesgsys->getU64Fast(_PREHASH_RegionData, _PREHASH_RegionHandle, region_handle);
+
LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(region_handle);
if (!regionp)
@@ -345,16 +344,14 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
U8 compressed_dpbuffer[2048];
LLDataPackerBinaryBuffer compressed_dp(compressed_dpbuffer, 2048);
LLDataPacker *cached_dpp = NULL;
-
-#if LL_RECORD_VIEWER_STATS
- LLViewerStatsRecorder::instance()->beginObjectUpdateEvents(regionp);
-#endif
+ LLViewerStatsRecorder& recorder = LLViewerStatsRecorder::instance();
for (i = 0; i < num_objects; i++)
{
// timer is unused?
LLTimer update_timer;
BOOL justCreated = FALSE;
+ S32 msg_size = 0;
if (cached)
{
@@ -362,6 +359,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
U32 crc;
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, id, i);
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_CRC, crc, i);
+ msg_size += sizeof(U32) * 2;
// Lookup data packer and add this id to cache miss lists if necessary.
U8 cache_miss_type = LLViewerRegion::CACHE_MISS_TYPE_NONE;
@@ -377,9 +375,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
else
{
// Cache Miss.
- #if LL_RECORD_VIEWER_STATS
- LLViewerStatsRecorder::instance()->recordCacheMissEvent(id, update_type, cache_miss_type);
- #endif
+ recorder.cacheMissEvent(id, update_type, cache_miss_type, msg_size);
continue; // no data packer, skip this object
}
@@ -422,6 +418,8 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
else if (update_type != OUT_FULL) // !compressed, !OUT_FULL ==> OUT_FULL_CACHED only?
{
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, local_id, i);
+ msg_size += sizeof(U32);
+
getUUIDFromLocal(fullid,
local_id,
gMessageSystem->getSenderIP(),
@@ -436,6 +434,8 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
{
mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_FullID, fullid, i);
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, local_id, i);
+ msg_size += sizeof(LLUUID);
+ msg_size += sizeof(U32);
// llinfos << "Full Update, obj " << local_id << ", global ID" << fullid << "from " << mesgsys->getSender() << llendl;
}
objectp = findObject(fullid);
@@ -481,9 +481,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
if (update_type == OUT_TERSE_IMPROVED)
{
// llinfos << "terse update for an unknown object (compressed):" << fullid << llendl;
- #if LL_RECORD_VIEWER_STATS
- LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type);
- #endif
+ recorder.objectUpdateFailure(local_id, update_type, msg_size);
continue;
}
}
@@ -495,22 +493,20 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
if (update_type != OUT_FULL)
{
//llinfos << "terse update for an unknown object:" << fullid << llendl;
- #if LL_RECORD_VIEWER_STATS
- LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type);
- #endif
+ recorder.objectUpdateFailure(local_id, update_type, msg_size);
continue;
}
mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_PCode, pcode, i);
+ msg_size += sizeof(U8);
+
}
#ifdef IGNORE_DEAD
if (mDeadObjects.find(fullid) != mDeadObjects.end())
{
mNumDeadObjectUpdates++;
//llinfos << "update for a dead object:" << fullid << llendl;
- #if LL_RECORD_VIEWER_STATS
- LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type);
- #endif
+ recorder.objectUpdateFailure(local_id, update_type, msg_size);
continue;
}
#endif
@@ -519,9 +515,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
if (!objectp)
{
llinfos << "createObject failure for object: " << fullid << llendl;
- #if LL_RECORD_VIEWER_STATS
- LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type);
- #endif
+ recorder.objectUpdateFailure(local_id, update_type, msg_size);
continue;
}
justCreated = TRUE;
@@ -547,12 +541,8 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
if (update_type != OUT_TERSE_IMPROVED) // OUT_FULL_COMPRESSED only?
{
bCached = true;
- #if LL_RECORD_VIEWER_STATS
LLViewerRegion::eCacheUpdateResult result = objectp->mRegionp->cacheFullUpdate(objectp, compressed_dp);
- LLViewerStatsRecorder::instance()->recordCacheFullUpdate(local_id, update_type, result, objectp);
- #else
- objectp->mRegionp->cacheFullUpdate(objectp, compressed_dp);
- #endif
+ recorder.cacheFullUpdate(local_id, update_type, result, objectp, msg_size);
}
}
else if (cached) // Cache hit only?
@@ -568,16 +558,12 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
}
processUpdateCore(objectp, user_data, i, update_type, NULL, justCreated);
}
- #if LL_RECORD_VIEWER_STATS
- LLViewerStatsRecorder::instance()->recordObjectUpdateEvent(local_id, update_type, objectp);
- #endif
+ recorder.objectUpdateEvent(local_id, update_type, objectp, msg_size);
objectp->setLastUpdateType(update_type);
objectp->setLastUpdateCached(bCached);
}
-#if LL_RECORD_VIEWER_STATS
- LLViewerStatsRecorder::instance()->endObjectUpdateEvents();
-#endif
+ recorder.log(0.2f);
LLVOAvatar::cullAvatarsByPixelArea();
}
@@ -866,8 +852,6 @@ private:
void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
-
// Update globals
LLViewerObject::setVelocityInterpolate( gSavedSettings.getBOOL("VelocityInterpolate") );
LLViewerObject::setPingInterpolate( gSavedSettings.getBOOL("PingInterpolate") );
@@ -915,12 +899,12 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
static std::vector<LLViewerObject*> idle_list;
U32 idle_count = 0;
-
+
static LLFastTimer::DeclareTimer idle_copy("Idle Copy");
{
LLFastTimer t(idle_copy);
-
+
for (std::vector<LLPointer<LLViewerObject> >::iterator active_iter = mActiveObjects.begin();
active_iter != mActiveObjects.end(); active_iter++)
{
@@ -929,9 +913,9 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
{
if (idle_count >= idle_list.size())
{
- idle_list.push_back( objectp );
- }
- else
+ idle_list.push_back( objectp );
+ }
+ else
{
idle_list[idle_count] = objectp;
}
@@ -948,7 +932,7 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
std::vector<LLViewerObject*>::iterator idle_end = idle_list.begin()+idle_count;
if (gSavedSettings.getBOOL("FreezeTime"))
- {
+ {
for (std::vector<LLViewerObject*>::iterator iter = idle_list.begin();
iter != idle_end; iter++)
@@ -969,14 +953,14 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
llassert(objectp->isActive());
objectp->idleUpdate(agent, world, frame_time);
- }
+ }
//update flexible objects
LLVolumeImplFlexible::updateClass();
//update animated textures
LLViewerTextureAnim::updateClass();
- }
+ }
@@ -1179,7 +1163,6 @@ void LLViewerObjectList::clearDebugText()
void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
if (mDeadObjects.find(objectp->mID) != mDeadObjects.end())
{
llinfos << "Object " << objectp->mID << " already on dead list!" << llendl;
@@ -1407,7 +1390,6 @@ void LLViewerObjectList::removeFromActiveList(LLViewerObject* objectp)
void LLViewerObjectList::updateActive(LLViewerObject *objectp)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
if (objectp->isDead())
{
return; // We don't update dead objects!
@@ -1424,10 +1406,10 @@ void LLViewerObjectList::updateActive(LLViewerObject *objectp)
{
mActiveObjects.push_back(objectp);
objectp->setListIndex(mActiveObjects.size()-1);
- objectp->setOnActiveList(TRUE);
- }
- else
- {
+ objectp->setOnActiveList(TRUE);
+ }
+ else
+ {
llassert(idx < mActiveObjects.size());
llassert(mActiveObjects[idx] == objectp);
@@ -1446,8 +1428,11 @@ void LLViewerObjectList::updateActive(LLViewerObject *objectp)
}
}
- llassert(objectp->isActive() || objectp->getListIndex() == -1);
+ //post condition: if object is active, it must be on the active list
+ llassert(!active || std::find(mActiveObjects.begin(), mActiveObjects.end(), objectp) != mActiveObjects.end());
+ //post condition: if object is not active, it must not be on the active list
+ llassert(active || std::find(mActiveObjects.begin(), mActiveObjects.end(), objectp) == mActiveObjects.end());
}
void LLViewerObjectList::updateObjectCost(LLViewerObject* object)
@@ -1553,13 +1538,13 @@ void LLViewerObjectList::shiftObjects(const LLVector3 &offset)
{
LLFastTimer t(FTM_PIPELINE_SHIFT);
- gPipeline.shiftObjects(offset);
+ gPipeline.shiftObjects(offset);
}
{
LLFastTimer t(FTM_REGION_SHIFT);
- LLWorld::getInstance()->shiftRegions(offset);
- }
+ LLWorld::getInstance()->shiftRegions(offset);
+}
}
void LLViewerObjectList::repartitionObjects()
@@ -1886,7 +1871,6 @@ void LLViewerObjectList::resetObjectBeacons()
LLViewerObject *LLViewerObjectList::createObjectViewer(const LLPCode pcode, LLViewerRegion *regionp)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
LLUUID fullid;
fullid.generate();
@@ -1907,13 +1891,9 @@ LLViewerObject *LLViewerObjectList::createObjectViewer(const LLPCode pcode, LLVi
}
-static LLFastTimer::DeclareTimer FTM_CREATE_OBJECT("Create Object");
-
LLViewerObject *LLViewerObjectList::createObject(const LLPCode pcode, LLViewerRegion *regionp,
const LLUUID &uuid, const U32 local_id, const LLHost &sender)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
- LLFastTimer t(FTM_CREATE_OBJECT);
LLUUID fullid;
if (uuid == LLUUID::null)
@@ -1977,7 +1957,6 @@ S32 LLViewerObjectList::findReferences(LLDrawable *drawablep) const
void LLViewerObjectList::orphanize(LLViewerObject *childp, U32 parent_id, U32 ip, U32 port)
{
- LLMemType mt(LLMemType::MTYPE_OBJECT);
#ifdef ORPHAN_SPAM
llinfos << "Orphaning object " << childp->getID() << " with parent " << parent_id << llendl;
#endif
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index 9936432a71..449a4633ff 100644
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -129,6 +129,7 @@ public:
LLViewerObject *getSelectedObject(const U32 object_id);
inline S32 getNumObjects() { return (S32) mObjects.size(); }
+ inline S32 getNumActiveObjects() { return (S32) mActiveObjects.size(); }
void addToMap(LLViewerObject *objectp);
void removeFromMap(LLViewerObject *objectp);
diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp
index a0cf2fc803..a1c12c5cd6 100644
--- a/indra/newview/llviewerparceloverlay.cpp
+++ b/indra/newview/llviewerparceloverlay.cpp
@@ -828,7 +828,6 @@ void LLViewerParcelOverlay::updateGL()
void LLViewerParcelOverlay::idleUpdate(bool force_update)
{
- LLMemType mt_iup(LLMemType::MTYPE_IDLE_UPDATE_PARCEL_OVERLAY);
if (gGLManager.mIsDisabled)
{
return;
diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp
index 345023dbfa..6bd9f66b9c 100644
--- a/indra/newview/llviewerpartsim.cpp
+++ b/indra/newview/llviewerpartsim.cpp
@@ -79,7 +79,6 @@ LLViewerPart::LLViewerPart() :
mVPCallback(NULL),
mImagep(NULL)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
mPartSourcep = NULL;
++LLViewerPartSim::sParticleCount2 ;
@@ -87,7 +86,6 @@ LLViewerPart::LLViewerPart() :
LLViewerPart::~LLViewerPart()
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
mPartSourcep = NULL;
--LLViewerPartSim::sParticleCount2 ;
@@ -95,7 +93,6 @@ LLViewerPart::~LLViewerPart()
void LLViewerPart::init(LLPointer<LLViewerPartSource> sourcep, LLViewerTexture *imagep, LLVPCallback cb)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
mPartID = LLViewerPart::sNextPartID;
LLViewerPart::sNextPartID++;
mFlags = 0x00f;
@@ -120,7 +117,6 @@ void LLViewerPart::init(LLPointer<LLViewerPartSource> sourcep, LLViewerTexture *
LLViewerPartGroup::LLViewerPartGroup(const LLVector3 &center_agent, const F32 box_side, bool hud)
: mHud(hud)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
mVOPartGroupp = NULL;
mUniformParticles = TRUE;
@@ -177,7 +173,6 @@ LLViewerPartGroup::LLViewerPartGroup(const LLVector3 &center_agent, const F32 bo
LLViewerPartGroup::~LLViewerPartGroup()
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
cleanup();
S32 count = (S32) mParticles.size();
@@ -192,7 +187,6 @@ LLViewerPartGroup::~LLViewerPartGroup()
void LLViewerPartGroup::cleanup()
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
if (mVOPartGroupp)
{
if (!mVOPartGroupp->isDead())
@@ -205,7 +199,6 @@ void LLViewerPartGroup::cleanup()
BOOL LLViewerPartGroup::posInGroup(const LLVector3 &pos, const F32 desired_size)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
if ((pos.mV[VX] < mMinObjPos.mV[VX])
|| (pos.mV[VY] < mMinObjPos.mV[VY])
|| (pos.mV[VZ] < mMinObjPos.mV[VZ]))
@@ -233,8 +226,6 @@ BOOL LLViewerPartGroup::posInGroup(const LLVector3 &pos, const F32 desired_size)
BOOL LLViewerPartGroup::addPart(LLViewerPart* part, F32 desired_size)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
-
if (part->mFlags & LLPartData::LL_PART_HUD && !mHud)
{
return FALSE;
@@ -261,7 +252,6 @@ BOOL LLViewerPartGroup::addPart(LLViewerPart* part, F32 desired_size)
void LLViewerPartGroup::updateParticles(const F32 lastdt)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
F32 dt;
LLVector3 gravity(0.f, 0.f, GRAVITY);
@@ -429,7 +419,6 @@ void LLViewerPartGroup::updateParticles(const F32 lastdt)
void LLViewerPartGroup::shift(const LLVector3 &offset)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
mCenterAgent += offset;
mMinObjPos += offset;
mMaxObjPos += offset;
@@ -442,8 +431,6 @@ void LLViewerPartGroup::shift(const LLVector3 &offset)
void LLViewerPartGroup::removeParticlesByID(const U32 source_id)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
-
for (S32 i = 0; i < (S32)mParticles.size(); i++)
{
if(mParticles[i]->mPartSourcep->getID() == source_id)
@@ -475,7 +462,6 @@ void LLViewerPartSim::checkParticleCount(U32 size)
LLViewerPartSim::LLViewerPartSim()
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
sMaxParticleCount = llmin(gSavedSettings.getS32("RenderMaxPartCount"), LL_MAX_PARTICLE_COUNT);
static U32 id_seed = 0;
mID = ++id_seed;
@@ -484,7 +470,6 @@ LLViewerPartSim::LLViewerPartSim()
void LLViewerPartSim::destroyClass()
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
S32 i;
S32 count;
@@ -500,9 +485,9 @@ void LLViewerPartSim::destroyClass()
mViewerPartSources.clear();
}
+//static
BOOL LLViewerPartSim::shouldAddPart()
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
if (sParticleCount > PART_THROTTLE_THRESHOLD*sMaxParticleCount)
{
@@ -525,7 +510,6 @@ BOOL LLViewerPartSim::shouldAddPart()
void LLViewerPartSim::addPart(LLViewerPart* part)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
if (sParticleCount < MAX_PART_COUNT)
{
put(part);
@@ -541,7 +525,6 @@ void LLViewerPartSim::addPart(LLViewerPart* part)
LLViewerPartGroup *LLViewerPartSim::put(LLViewerPart* part)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
const F32 MAX_MAG = 1000000.f*1000000.f; // 1 million
LLViewerPartGroup *return_group = NULL ;
if (part->mPosAgent.magVecSquared() > MAX_MAG || !part->mPosAgent.isFinite())
@@ -599,7 +582,6 @@ LLViewerPartGroup *LLViewerPartSim::put(LLViewerPart* part)
LLViewerPartGroup *LLViewerPartSim::createViewerPartGroup(const LLVector3 &pos_agent, const F32 desired_size, bool hud)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
//find a box that has a center position divisible by PART_SIM_BOX_SIDE that encompasses
//pos_agent
LLViewerPartGroup *groupp = new LLViewerPartGroup(pos_agent, desired_size, hud);
@@ -632,8 +614,6 @@ static LLFastTimer::DeclareTimer FTM_SIMULATE_PARTICLES("Simulate Particles");
void LLViewerPartSim::updateSimulation()
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
-
static LLFrameTimer update_timer;
const F32 dt = llmin(update_timer.getElapsedTimeAndResetF32(), 0.1f);
@@ -800,7 +780,6 @@ void LLViewerPartSim::updatePartBurstRate()
void LLViewerPartSim::addPartSource(LLPointer<LLViewerPartSource> sourcep)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
if (!sourcep)
{
llwarns << "Null part source!" << llendl;
@@ -817,7 +796,6 @@ void LLViewerPartSim::removeLastCreatedSource()
void LLViewerPartSim::cleanupRegion(LLViewerRegion *regionp)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
for (group_list_t::iterator i = mViewerPartGroups.begin(); i != mViewerPartGroups.end(); )
{
group_list_t::iterator iter = i++;
@@ -832,7 +810,6 @@ void LLViewerPartSim::cleanupRegion(LLViewerRegion *regionp)
void LLViewerPartSim::clearParticlesByID(const U32 system_id)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
for (group_list_t::iterator g = mViewerPartGroups.begin(); g != mViewerPartGroups.end(); ++g)
{
(*g)->removeParticlesByID(system_id);
@@ -850,7 +827,6 @@ void LLViewerPartSim::clearParticlesByID(const U32 system_id)
void LLViewerPartSim::clearParticlesByOwnerID(const LLUUID& task_id)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
for (source_list_t::iterator iter = mViewerPartSources.begin(); iter != mViewerPartSources.end(); ++iter)
{
if ((*iter)->getOwnerUUID() == task_id)
diff --git a/indra/newview/llviewerpartsim.h b/indra/newview/llviewerpartsim.h
index c9959c63ec..c91fcf0691 100644
--- a/indra/newview/llviewerpartsim.h
+++ b/indra/newview/llviewerpartsim.h
@@ -142,7 +142,7 @@ public:
void cleanupRegion(LLViewerRegion *regionp);
- BOOL shouldAddPart(); // Just decides whether this particle should be added or not (for particle count capping)
+ static BOOL shouldAddPart(); // Just decides whether this particle should be added or not (for particle count capping)
F32 maxRate() // Return maximum particle generation rate
{
if (sParticleCount >= MAX_PART_COUNT)
diff --git a/indra/newview/llviewerpartsource.cpp b/indra/newview/llviewerpartsource.cpp
index 4af92e79ff..b311f659fb 100644
--- a/indra/newview/llviewerpartsource.cpp
+++ b/indra/newview/llviewerpartsource.cpp
@@ -90,7 +90,6 @@ void LLViewerPartSource::setStart()
LLViewerPartSourceScript::LLViewerPartSourceScript(LLViewerObject *source_objp) :
LLViewerPartSource(LL_PART_SOURCE_SCRIPT)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
llassert(source_objp);
mSourceObjectp = source_objp;
mPosAgent = mSourceObjectp->getPositionAgent();
@@ -102,7 +101,6 @@ LLViewerPartSourceScript::LLViewerPartSourceScript(LLViewerObject *source_objp)
void LLViewerPartSourceScript::setDead()
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
mIsDead = TRUE;
mSourceObjectp = NULL;
mTargetObjectp = NULL;
@@ -113,7 +111,6 @@ void LLViewerPartSourceScript::update(const F32 dt)
if( mIsSuspended )
return;
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
F32 old_update_time = mLastUpdateTime;
mLastUpdateTime += dt;
@@ -394,7 +391,6 @@ void LLViewerPartSourceScript::update(const F32 dt)
// static
LLPointer<LLViewerPartSourceScript> LLViewerPartSourceScript::unpackPSS(LLViewerObject *source_objp, LLPointer<LLViewerPartSourceScript> pssp, const S32 block_num)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
if (!pssp)
{
if (LLPartSysData::isNullPS(block_num))
@@ -436,7 +432,6 @@ LLPointer<LLViewerPartSourceScript> LLViewerPartSourceScript::unpackPSS(LLViewer
LLPointer<LLViewerPartSourceScript> LLViewerPartSourceScript::unpackPSS(LLViewerObject *source_objp, LLPointer<LLViewerPartSourceScript> pssp, LLDataPacker &dp)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
if (!pssp)
{
LLPointer<LLViewerPartSourceScript> new_pssp = new LLViewerPartSourceScript(source_objp);
@@ -470,8 +465,6 @@ LLPointer<LLViewerPartSourceScript> LLViewerPartSourceScript::unpackPSS(LLViewer
/* static */
LLPointer<LLViewerPartSourceScript> LLViewerPartSourceScript::createPSS(LLViewerObject *source_objp, const LLPartSysData& particle_parameters)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
-
LLPointer<LLViewerPartSourceScript> new_pssp = new LLViewerPartSourceScript(source_objp);
new_pssp->mPartSysData = particle_parameters;
@@ -487,13 +480,11 @@ LLPointer<LLViewerPartSourceScript> LLViewerPartSourceScript::createPSS(LLViewer
void LLViewerPartSourceScript::setImage(LLViewerTexture *imagep)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
mImagep = imagep;
}
void LLViewerPartSourceScript::setTargetObject(LLViewerObject *objp)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
mTargetObjectp = objp;
}
@@ -509,7 +500,6 @@ LLViewerPartSourceSpiral::LLViewerPartSourceSpiral(const LLVector3 &pos) :
void LLViewerPartSourceSpiral::setDead()
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
mIsDead = TRUE;
mSourceObjectp = NULL;
}
@@ -517,7 +507,6 @@ void LLViewerPartSourceSpiral::setDead()
void LLViewerPartSourceSpiral::updatePart(LLViewerPart &part, const F32 dt)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
F32 frac = part.mLastUpdateTime/part.mMaxAge;
LLVector3 center_pos;
@@ -542,7 +531,6 @@ void LLViewerPartSourceSpiral::updatePart(LLViewerPart &part, const F32 dt)
void LLViewerPartSourceSpiral::update(const F32 dt)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
if (!mImagep)
{
mImagep = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c");
@@ -588,7 +576,6 @@ void LLViewerPartSourceSpiral::update(const F32 dt)
void LLViewerPartSourceSpiral::setSourceObject(LLViewerObject *objp)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
mSourceObjectp = objp;
}
@@ -612,7 +599,6 @@ LLViewerPartSourceBeam::~LLViewerPartSourceBeam()
void LLViewerPartSourceBeam::setDead()
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
mIsDead = TRUE;
mSourceObjectp = NULL;
mTargetObjectp = NULL;
@@ -626,7 +612,6 @@ void LLViewerPartSourceBeam::setColor(const LLColor4 &color)
void LLViewerPartSourceBeam::updatePart(LLViewerPart &part, const F32 dt)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
F32 frac = part.mLastUpdateTime/part.mMaxAge;
LLViewerPartSource *ps = (LLViewerPartSource*)part.mPartSourcep;
@@ -671,7 +656,6 @@ void LLViewerPartSourceBeam::updatePart(LLViewerPart &part, const F32 dt)
void LLViewerPartSourceBeam::update(const F32 dt)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
const F32 RATE = 0.025f;
mLastUpdateTime += dt;
@@ -743,13 +727,11 @@ void LLViewerPartSourceBeam::update(const F32 dt)
void LLViewerPartSourceBeam::setSourceObject(LLViewerObject* objp)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
mSourceObjectp = objp;
}
void LLViewerPartSourceBeam::setTargetObject(LLViewerObject* objp)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
mTargetObjectp = objp;
}
@@ -764,7 +746,6 @@ LLViewerPartSourceChat::LLViewerPartSourceChat(const LLVector3 &pos) :
void LLViewerPartSourceChat::setDead()
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
mIsDead = TRUE;
mSourceObjectp = NULL;
}
@@ -772,7 +753,6 @@ void LLViewerPartSourceChat::setDead()
void LLViewerPartSourceChat::updatePart(LLViewerPart &part, const F32 dt)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
F32 frac = part.mLastUpdateTime/part.mMaxAge;
LLVector3 center_pos;
@@ -797,7 +777,6 @@ void LLViewerPartSourceChat::updatePart(LLViewerPart &part, const F32 dt)
void LLViewerPartSourceChat::update(const F32 dt)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
if (!mImagep)
{
mImagep = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c");
@@ -853,7 +832,6 @@ void LLViewerPartSourceChat::update(const F32 dt)
void LLViewerPartSourceChat::setSourceObject(LLViewerObject *objp)
{
- LLMemType mt(LLMemType::MTYPE_PARTICLES);
mSourceObjectp = objp;
}
diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h
index 6c8a827ba3..0316f79973 100644
--- a/indra/newview/llviewerprecompiledheaders.h
+++ b/indra/newview/llviewerprecompiledheaders.h
@@ -59,8 +59,6 @@
#include "indra_constants.h"
#include "llinitparam.h"
-//#include "linden_common.h"
-//#include "llpreprocessor.h"
#include "llallocator.h"
#include "llapp.h"
#include "llcriticaldamp.h"
@@ -77,10 +75,8 @@
#include "llprocessor.h"
#include "llrefcount.h"
#include "llsafehandle.h"
-//#include "llsecondlifeurls.h"
#include "llsd.h"
#include "llsingleton.h"
-#include "llstat.h"
#include "llstl.h"
#include "llstrider.h"
#include "llstring.h"
@@ -88,11 +84,8 @@
#include "llthread.h"
#include "lltimer.h"
#include "lluuidhashmap.h"
-//#include "processor.h"
#include "stdenums.h"
#include "stdtypes.h"
-//#include "string_table.h"
-//#include "timer.h"
#include "timing.h"
#include "u64.h"
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index effa368b7a..e4234a538d 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -255,10 +255,9 @@ public:
}
}
- static boost::intrusive_ptr<BaseCapabilitiesComplete> build( U64 region_handle, S32 id )
+ static BaseCapabilitiesComplete* build( U64 region_handle, S32 id )
{
- return boost::intrusive_ptr<BaseCapabilitiesComplete>(
- new BaseCapabilitiesComplete(region_handle, id) );
+ return new BaseCapabilitiesComplete(region_handle, id);
}
private:
@@ -720,7 +719,6 @@ void LLViewerRegion::dirtyHeights()
BOOL LLViewerRegion::idleUpdate(F32 max_update_time)
{
- LLMemType mt_ivr(LLMemType::MTYPE_IDLE_UPDATE_VIEWER_REGION);
// did_update returns TRUE if we did at least one significant update
BOOL did_update = mImpl->mLandp->idleUpdate(max_update_time);
@@ -1343,11 +1341,8 @@ void LLViewerRegion::requestCacheMisses()
mCacheDirty = TRUE ;
// llinfos << "KILLDEBUG Sent cache miss full " << full_count << " crc " << crc_count << llendl;
- #if LL_RECORD_VIEWER_STATS
- LLViewerStatsRecorder::instance()->beginObjectUpdateEvents(this);
- LLViewerStatsRecorder::instance()->recordRequestCacheMissesEvent(full_count + crc_count);
- LLViewerStatsRecorder::instance()->endObjectUpdateEvents();
- #endif
+ LLViewerStatsRecorder::instance().requestCacheMissesEvent(full_count + crc_count);
+ LLViewerStatsRecorder::instance().log(0.2f);
}
void LLViewerRegion::dumpCache()
@@ -1524,11 +1519,9 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("CopyInventoryFromNotecard");
capabilityNames.append("CreateInventoryCategory");
capabilityNames.append("DispatchRegionInfo");
+ capabilityNames.append("EnvironmentSettings");
capabilityNames.append("EstateChangeInfo");
capabilityNames.append("EventQueueGet");
- capabilityNames.append("EnvironmentSettings");
- capabilityNames.append("ObjectMedia");
- capabilityNames.append("ObjectMediaNavigate");
if (gSavedSettings.getBOOL("UseHTTPInventory"))
{
@@ -1539,21 +1532,23 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
}
capabilityNames.append("GetDisplayNames");
- capabilityNames.append("GetTexture");
capabilityNames.append("GetMesh");
capabilityNames.append("GetObjectCost");
capabilityNames.append("GetObjectPhysicsData");
+ capabilityNames.append("GetTexture");
+ capabilityNames.append("GroupMemberData");
capabilityNames.append("GroupProposalBallot");
capabilityNames.append("HomeLocation");
capabilityNames.append("LandResources");
capabilityNames.append("MapLayer");
capabilityNames.append("MapLayerGod");
- capabilityNames.append("MeshUploadFlag");
+ capabilityNames.append("MeshUploadFlag");
capabilityNames.append("NavMeshGenerationStatus");
capabilityNames.append("NewFileAgentInventory");
+ capabilityNames.append("ObjectMedia");
+ capabilityNames.append("ObjectMediaNavigate");
capabilityNames.append("ObjectNavMeshProperties");
capabilityNames.append("ParcelPropertiesUpdate");
- capabilityNames.append("ParcelNavigateMedia");
capabilityNames.append("ParcelVoiceInfoRequest");
capabilityNames.append("ProductInfoRequest");
capabilityNames.append("ProvisionVoiceAccountRequest");
@@ -1567,10 +1562,9 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("SendUserReport");
capabilityNames.append("SendUserReportWithScreenshot");
capabilityNames.append("ServerReleaseNotes");
- capabilityNames.append("SimConsole");
- capabilityNames.append("SimulatorFeatures");
capabilityNames.append("SetDisplayName");
capabilityNames.append("SimConsoleAsync");
+ capabilityNames.append("SimulatorFeatures");
capabilityNames.append("StartGroupProposal");
capabilityNames.append("TerrainNavMeshProperties");
capabilityNames.append("TextureStats");
@@ -1578,16 +1572,16 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("UpdateAgentInformation");
capabilityNames.append("UpdateAgentLanguage");
capabilityNames.append("UpdateGestureAgentInventory");
- capabilityNames.append("UpdateNotecardAgentInventory");
- capabilityNames.append("UpdateScriptAgent");
capabilityNames.append("UpdateGestureTaskInventory");
+ capabilityNames.append("UpdateNotecardAgentInventory");
capabilityNames.append("UpdateNotecardTaskInventory");
+ capabilityNames.append("UpdateScriptAgent");
capabilityNames.append("UpdateScriptTask");
capabilityNames.append("UploadBakedTexture");
capabilityNames.append("ViewerMetrics");
capabilityNames.append("ViewerStartAuction");
capabilityNames.append("ViewerStats");
-
+
// Please add new capabilities alphabetically to reduce
// merge conflicts.
}
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 4b0e0598f6..ba9818946c 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -2025,18 +2025,19 @@ BOOL LLViewerShaderMgr::loadShadersObject()
if (success)
{
gObjectPreviewProgram.mName = "Simple Shader";
- gObjectPreviewProgram.mFeatures.calculatesLighting = true;
- gObjectPreviewProgram.mFeatures.calculatesAtmospherics = true;
- gObjectPreviewProgram.mFeatures.hasGamma = true;
- gObjectPreviewProgram.mFeatures.hasAtmospherics = true;
- gObjectPreviewProgram.mFeatures.hasLighting = true;
+ gObjectPreviewProgram.mFeatures.calculatesLighting = false;
+ gObjectPreviewProgram.mFeatures.calculatesAtmospherics = false;
+ gObjectPreviewProgram.mFeatures.hasGamma = false;
+ gObjectPreviewProgram.mFeatures.hasAtmospherics = false;
+ gObjectPreviewProgram.mFeatures.hasLighting = false;
gObjectPreviewProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectPreviewProgram.mFeatures.disableTextureIndex = true;
gObjectPreviewProgram.mShaderFiles.clear();
gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/previewV.glsl", GL_VERTEX_SHADER_ARB));
- gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/previewF.glsl", GL_FRAGMENT_SHADER_ARB));
gObjectPreviewProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
success = gObjectPreviewProgram.createShader(NULL, NULL);
+ gObjectPreviewProgram.mFeatures.hasLighting = true;
}
if (success)
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index d1c6b7ea79..35839ae459 100755..100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -290,19 +290,19 @@ LLViewerStats::~LLViewerStats()
void LLViewerStats::resetStats()
{
- LLViewerStats::getInstance()->mKBitStat.reset();
- LLViewerStats::getInstance()->mLayersKBitStat.reset();
- LLViewerStats::getInstance()->mObjectKBitStat.reset();
- LLViewerStats::getInstance()->mTextureKBitStat.reset();
- LLViewerStats::getInstance()->mVFSPendingOperations.reset();
- LLViewerStats::getInstance()->mAssetKBitStat.reset();
- LLViewerStats::getInstance()->mPacketsInStat.reset();
- LLViewerStats::getInstance()->mPacketsLostStat.reset();
- LLViewerStats::getInstance()->mPacketsOutStat.reset();
- LLViewerStats::getInstance()->mFPSStat.reset();
- LLViewerStats::getInstance()->mTexturePacketsStat.reset();
-
- LLViewerStats::getInstance()->mAgentPositionSnaps.reset();
+ LLViewerStats& stats = LLViewerStats::instance();
+ stats.mKBitStat.reset();
+ stats.mLayersKBitStat.reset();
+ stats.mObjectKBitStat.reset();
+ stats.mTextureKBitStat.reset();
+ stats.mVFSPendingOperations.reset();
+ stats.mAssetKBitStat.reset();
+ stats.mPacketsInStat.reset();
+ stats.mPacketsLostStat.reset();
+ stats.mPacketsOutStat.reset();
+ stats.mFPSStat.reset();
+ stats.mTexturePacketsStat.reset();
+ stats.mAgentPositionSnaps.reset();
}
@@ -327,55 +327,55 @@ void LLViewerStats::updateFrameStats(const F64 time_diff)
{
if (mPacketsLostPercentStat.getCurrent() > 5.0)
{
- incStat(LLViewerStats::ST_LOSS_05_SECONDS, time_diff);
+ incStat(ST_LOSS_05_SECONDS, time_diff);
}
if (mSimFPS.getCurrent() < 20.f && mSimFPS.getCurrent() > 0.f)
{
- incStat(LLViewerStats::ST_SIM_FPS_20_SECONDS, time_diff);
+ incStat(ST_SIM_FPS_20_SECONDS, time_diff);
}
if (mSimPhysicsFPS.getCurrent() < 20.f && mSimPhysicsFPS.getCurrent() > 0.f)
{
- incStat(LLViewerStats::ST_PHYS_FPS_20_SECONDS, time_diff);
+ incStat(ST_PHYS_FPS_20_SECONDS, time_diff);
}
if (time_diff >= 0.5)
{
- incStat(LLViewerStats::ST_FPS_2_SECONDS, time_diff);
+ incStat(ST_FPS_2_SECONDS, time_diff);
}
if (time_diff >= 0.125)
{
- incStat(LLViewerStats::ST_FPS_8_SECONDS, time_diff);
+ incStat(ST_FPS_8_SECONDS, time_diff);
}
if (time_diff >= 0.1)
{
- incStat(LLViewerStats::ST_FPS_10_SECONDS, time_diff);
+ incStat(ST_FPS_10_SECONDS, time_diff);
}
if (gFrameCount && mLastTimeDiff > 0.0)
{
// new "stutter" meter
- setStat(LLViewerStats::ST_FPS_DROP_50_RATIO,
- (getStat(LLViewerStats::ST_FPS_DROP_50_RATIO) * (F64)(gFrameCount - 1) +
+ setStat(ST_FPS_DROP_50_RATIO,
+ (getStat(ST_FPS_DROP_50_RATIO) * (F64)(gFrameCount - 1) +
(time_diff >= 2.0 * mLastTimeDiff ? 1.0 : 0.0)) / gFrameCount);
// old stats that were never really used
- setStat(LLViewerStats::ST_FRAMETIME_JITTER,
- (getStat(LLViewerStats::ST_FRAMETIME_JITTER) * (gFrameCount - 1) +
+ setStat(ST_FRAMETIME_JITTER,
+ (getStat(ST_FRAMETIME_JITTER) * (gFrameCount - 1) +
fabs(mLastTimeDiff - time_diff) / mLastTimeDiff) / gFrameCount);
F32 average_frametime = gRenderStartTime.getElapsedTimeF32() / (F32)gFrameCount;
- setStat(LLViewerStats::ST_FRAMETIME_SLEW,
- (getStat(LLViewerStats::ST_FRAMETIME_SLEW) * (gFrameCount - 1) +
+ setStat(ST_FRAMETIME_SLEW,
+ (getStat(ST_FRAMETIME_SLEW) * (gFrameCount - 1) +
fabs(average_frametime - time_diff) / average_frametime) / gFrameCount);
F32 max_bandwidth = gViewerThrottle.getMaxBandwidth();
F32 delta_bandwidth = gViewerThrottle.getCurrentBandwidth() - max_bandwidth;
- setStat(LLViewerStats::ST_DELTA_BANDWIDTH, delta_bandwidth / 1024.f);
+ setStat(ST_DELTA_BANDWIDTH, delta_bandwidth / 1024.f);
- setStat(LLViewerStats::ST_MAX_BANDWIDTH, max_bandwidth / 1024.f);
+ setStat(ST_MAX_BANDWIDTH, max_bandwidth / 1024.f);
}
@@ -403,155 +403,8 @@ void LLViewerStats::addToMessage(LLSD &body) const
<< "; Count = " << mAgentPositionSnaps.getCount() << llendl;
}
-// static
-// const std::string LLViewerStats::statTypeToText(EStatType type)
-// {
-// if (type >= 0 && type < ST_COUNT)
-// {
-// return STAT_INFO[type].mName;
-// }
-// else
-// {
-// return "Unknown statistic";
-// }
-// }
-
// *NOTE:Mani The following methods used to exist in viewer.cpp
// Moving them here, but not merging them into LLViewerStats yet.
-void reset_statistics()
-{
- if (LLSurface::sTextureUpdateTime)
- {
- LLSurface::sTexelsUpdated = 0;
- LLSurface::sTextureUpdateTime = 0.f;
- }
-}
-
-
-void output_statistics(void*)
-{
- llinfos << "Number of orphans: " << gObjectList.getOrphanCount() << llendl;
- llinfos << "Number of dead objects: " << gObjectList.mNumDeadObjects << llendl;
- llinfos << "Num images: " << gTextureList.getNumImages() << llendl;
- llinfos << "Texture usage: " << LLImageGL::sGlobalTextureMemoryInBytes << llendl;
- llinfos << "Texture working set: " << LLImageGL::sBoundTextureMemoryInBytes << llendl;
- llinfos << "Raw usage: " << LLImageRaw::sGlobalRawMemory << llendl;
- llinfos << "Formatted usage: " << LLImageFormatted::sGlobalFormattedMemory << llendl;
- llinfos << "Zombie Viewer Objects: " << LLViewerObject::getNumZombieObjects() << llendl;
- llinfos << "Number of lights: " << gPipeline.getLightCount() << llendl;
-
- llinfos << "Memory Usage:" << llendl;
- llinfos << "--------------------------------" << llendl;
- llinfos << "Pipeline:" << llendl;
- llinfos << llendl;
-
-#if LL_SMARTHEAP
- llinfos << "--------------------------------" << llendl;
- {
- llinfos << "sizeof(LLVOVolume) = " << sizeof(LLVOVolume) << llendl;
-
- U32 total_pool_size = 0;
- U32 total_used_size = 0;
- MEM_POOL_INFO pool_info;
- MEM_POOL_STATUS pool_status;
- U32 pool_num = 0;
- for(pool_status = MemPoolFirst( &pool_info, 1 );
- pool_status != MEM_POOL_END;
- pool_status = MemPoolNext( &pool_info, 1 ) )
- {
- llinfos << "Pool #" << pool_num << llendl;
- if( MEM_POOL_OK != pool_status )
- {
- llwarns << "Pool not ok" << llendl;
- continue;
- }
-
- llinfos << "Pool blockSizeFS " << pool_info.blockSizeFS
- << " pageSize " << pool_info.pageSize
- << llendl;
-
- U32 pool_count = MemPoolCount(pool_info.pool);
- llinfos << "Blocks " << pool_count << llendl;
-
- U32 pool_size = MemPoolSize( pool_info.pool );
- if( pool_size == MEM_ERROR_RET )
- {
- llinfos << "MemPoolSize() failed (" << pool_num << ")" << llendl;
- }
- else
- {
- llinfos << "MemPool Size " << pool_size / 1024 << "K" << llendl;
- }
-
- total_pool_size += pool_size;
-
- if( !MemPoolLock( pool_info.pool ) )
- {
- llinfos << "MemPoolLock failed (" << pool_num << ") " << llendl;
- continue;
- }
-
- U32 used_size = 0;
- MEM_POOL_ENTRY entry;
- entry.entry = NULL;
- while( MemPoolWalk( pool_info.pool, &entry ) == MEM_POOL_OK )
- {
- if( entry.isInUse )
- {
- used_size += entry.size;
- }
- }
-
- MemPoolUnlock( pool_info.pool );
-
- llinfos << "MemPool Used " << used_size/1024 << "K" << llendl;
- total_used_size += used_size;
- pool_num++;
- }
-
- llinfos << "Total Pool Size " << total_pool_size/1024 << "K" << llendl;
- llinfos << "Total Used Size " << total_used_size/1024 << "K" << llendl;
-
- }
-#endif
-
- llinfos << "--------------------------------" << llendl;
- llinfos << "Avatar Memory (partly overlaps with above stats):" << llendl;
- LLTexLayerStaticImageList::getInstance()->dumpByteCount();
- LLVOAvatarSelf::dumpScratchTextureByteCount();
- LLTexLayerSetBuffer::dumpTotalByteCount();
- LLVOAvatarSelf::dumpTotalLocalTextureByteCount();
- LLTexLayerParamAlpha::dumpCacheByteCount();
- LLVOAvatar::dumpBakedStatus();
-
- llinfos << llendl;
-
- llinfos << "Object counts:" << llendl;
- S32 i;
- S32 obj_counts[256];
-// S32 app_angles[256];
- for (i = 0; i < 256; i++)
- {
- obj_counts[i] = 0;
- }
- for (i = 0; i < gObjectList.getNumObjects(); i++)
- {
- LLViewerObject *objectp = gObjectList.getObject(i);
- if (objectp)
- {
- obj_counts[objectp->getPCode()]++;
- }
- }
- for (i = 0; i < 256; i++)
- {
- if (obj_counts[i])
- {
- llinfos << LLPrimitive::pCodeToString(i) << ":" << obj_counts[i] << llendl;
- }
- }
-}
-
-
U32 gTotalLandIn = 0, gTotalLandOut = 0;
U32 gTotalWaterIn = 0, gTotalWaterOut = 0;
@@ -569,20 +422,15 @@ U32 gTotalTextureBytesPerBoostLevel[LLViewerTexture::MAX_GL_IMAGE_CATEGORY]
extern U32 gVisCompared;
extern U32 gVisTested;
-std::map<S32,LLFrameTimer> gDebugTimers;
-std::map<S32,std::string> gDebugTimerLabel;
+LLFrameTimer gTextureTimer;
-void init_statistics()
-{
- // Label debug timers
- gDebugTimerLabel[0] = "Texture";
-}
-
-void update_statistics(U32 frame_count)
+void update_statistics()
{
gTotalWorldBytes += gVLManager.getTotalBytes();
gTotalObjectBytes += gObjectBits / 8;
+ LLViewerStats& stats = LLViewerStats::instance();
+
// make sure we have a valid time delta for this frame
if (gFrameIntervalSeconds > 0.f)
{
@@ -599,51 +447,47 @@ void update_statistics(U32 frame_count)
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TOOLBOX_SECONDS, gFrameIntervalSeconds);
}
}
- LLViewerStats::getInstance()->setStat(LLViewerStats::ST_ENABLE_VBO, (F64)gSavedSettings.getBOOL("RenderVBOEnable"));
- LLViewerStats::getInstance()->setStat(LLViewerStats::ST_LIGHTING_DETAIL, (F64)gPipeline.getLightingDetail());
- LLViewerStats::getInstance()->setStat(LLViewerStats::ST_DRAW_DIST, (F64)gSavedSettings.getF32("RenderFarClip"));
- LLViewerStats::getInstance()->setStat(LLViewerStats::ST_CHAT_BUBBLES, (F64)gSavedSettings.getBOOL("UseChatBubbles"));
-#if 0 // 1.9.2
- LLViewerStats::getInstance()->setStat(LLViewerStats::ST_SHADER_OBJECTS, (F64)gSavedSettings.getS32("VertexShaderLevelObject"));
- LLViewerStats::getInstance()->setStat(LLViewerStats::ST_SHADER_AVATAR, (F64)gSavedSettings.getBOOL("VertexShaderLevelAvatar"));
- LLViewerStats::getInstance()->setStat(LLViewerStats::ST_SHADER_ENVIRONMENT, (F64)gSavedSettings.getBOOL("VertexShaderLevelEnvironment"));
-#endif
- LLViewerStats::getInstance()->setStat(LLViewerStats::ST_FRAME_SECS, gDebugView->mFastTimerView->getTime("Frame"));
+ stats.setStat(LLViewerStats::ST_ENABLE_VBO, (F64)gSavedSettings.getBOOL("RenderVBOEnable"));
+ stats.setStat(LLViewerStats::ST_LIGHTING_DETAIL, (F64)gPipeline.getLightingDetail());
+ stats.setStat(LLViewerStats::ST_DRAW_DIST, (F64)gSavedSettings.getF32("RenderFarClip"));
+ stats.setStat(LLViewerStats::ST_CHAT_BUBBLES, (F64)gSavedSettings.getBOOL("UseChatBubbles"));
+
+ stats.setStat(LLViewerStats::ST_FRAME_SECS, gDebugView->mFastTimerView->getTime("Frame"));
F64 idle_secs = gDebugView->mFastTimerView->getTime("Idle");
F64 network_secs = gDebugView->mFastTimerView->getTime("Network");
- LLViewerStats::getInstance()->setStat(LLViewerStats::ST_UPDATE_SECS, idle_secs - network_secs);
- LLViewerStats::getInstance()->setStat(LLViewerStats::ST_NETWORK_SECS, network_secs);
- LLViewerStats::getInstance()->setStat(LLViewerStats::ST_IMAGE_SECS, gDebugView->mFastTimerView->getTime("Update Images"));
- LLViewerStats::getInstance()->setStat(LLViewerStats::ST_REBUILD_SECS, gDebugView->mFastTimerView->getTime("Sort Draw State"));
- LLViewerStats::getInstance()->setStat(LLViewerStats::ST_RENDER_SECS, gDebugView->mFastTimerView->getTime("Geometry"));
+ stats.setStat(LLViewerStats::ST_UPDATE_SECS, idle_secs - network_secs);
+ stats.setStat(LLViewerStats::ST_NETWORK_SECS, network_secs);
+ stats.setStat(LLViewerStats::ST_IMAGE_SECS, gDebugView->mFastTimerView->getTime("Update Images"));
+ stats.setStat(LLViewerStats::ST_REBUILD_SECS, gDebugView->mFastTimerView->getTime("Sort Draw State"));
+ stats.setStat(LLViewerStats::ST_RENDER_SECS, gDebugView->mFastTimerView->getTime("Geometry"));
LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(gAgent.getRegion()->getHost());
if (cdp)
{
- LLViewerStats::getInstance()->mSimPingStat.addValue(cdp->getPingDelay());
+ stats.mSimPingStat.addValue(cdp->getPingDelay());
gAvgSimPing = ((gAvgSimPing * (F32)gSimPingCount) + (F32)(cdp->getPingDelay())) / ((F32)gSimPingCount + 1);
gSimPingCount++;
}
else
{
- LLViewerStats::getInstance()->mSimPingStat.addValue(10000);
+ stats.mSimPingStat.addValue(10000);
}
- LLViewerStats::getInstance()->mFPSStat.addValue(1);
+ stats.mFPSStat.addValue(1);
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()->mVFSPendingOperations.addValue(LLVFile::getVFSThread()->getPending());
- LLViewerStats::getInstance()->mAssetKBitStat.addValue(gTransferManager.getTransferBitsIn(LLTCT_ASSET)/1024.f);
+ stats.mLayersKBitStat.addValue(layer_bits/1024.f);
+ stats.mObjectKBitStat.addValue(gObjectBits/1024.f);
+ stats.mVFSPendingOperations.addValue(LLVFile::getVFSThread()->getPending());
+ stats.mAssetKBitStat.addValue(gTransferManager.getTransferBitsIn(LLTCT_ASSET)/1024.f);
gTransferManager.resetTransferBitsIn(LLTCT_ASSET);
if (LLAppViewer::getTextureFetch()->getNumRequests() == 0)
{
- gDebugTimers[0].pause();
+ gTextureTimer.pause();
}
else
{
- gDebugTimers[0].unpause();
+ gTextureTimer.unpause();
}
{
@@ -655,7 +499,7 @@ void update_statistics(U32 frame_count)
visible_avatar_frames = 1.f;
avg_visible_avatars = (avg_visible_avatars * (F32)(visible_avatar_frames - 1.f) + visible_avatars) / visible_avatar_frames;
}
- LLViewerStats::getInstance()->setStat(LLViewerStats::ST_VISIBLE_AVATARS, (F64)avg_visible_avatars);
+ stats.setStat(LLViewerStats::ST_VISIBLE_AVATARS, (F64)avg_visible_avatars);
}
LLWorld::getInstance()->updateNetStats();
LLWorld::getInstance()->requestCacheMisses();
@@ -671,15 +515,14 @@ void update_statistics(U32 frame_count)
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);
+ stats.mTextureKBitStat.addValue(LLViewerTextureList::sTextureBits/1024.f);
+ stats.mTexturePacketsStat.addValue(LLViewerTextureList::sTexturePackets);
gTotalTextureBytes += LLViewerTextureList::sTextureBits / 8;
LLViewerTextureList::sTextureBits = 0;
LLViewerTextureList::sTexturePackets = 0;
texture_stats_timer.reset();
}
}
-
}
class ViewerStatsResponder : public LLHTTPClient::Responder
@@ -787,7 +630,7 @@ void send_stats()
"%-6s Class %d ",
gGLManager.mGLVendorShort.substr(0,6).c_str(),
(S32)LLFeatureManager::getInstance()->getGPUClass())
- + LLFeatureManager::getInstance()->getGPUString();
+ + gGLManager.getRawGLString();
system["gpu"] = gpu_desc;
system["gpu_class"] = (S32)LLFeatureManager::getInstance()->getGPUClass();
@@ -798,7 +641,18 @@ void send_stats()
S32 shader_level = 0;
if (LLPipeline::sRenderDeferred)
{
- shader_level = 3;
+ if (LLPipeline::RenderShadowDetail > 0)
+ {
+ shader_level = 5;
+ }
+ else if (LLPipeline::RenderDeferredSSAO)
+ {
+ shader_level = 4;
+ }
+ else
+ {
+ shader_level = 3;
+ }
}
else if (gPipeline.canUseWindLightShadersOnObjects())
{
@@ -857,10 +711,7 @@ void send_stats()
S32 window_height = gViewerWindow->getWindowHeightRaw();
S32 window_size = (window_width * window_height) / 1024;
misc["string_1"] = llformat("%d", window_size);
- if (gDebugTimers.find(0) != gDebugTimers.end() && gFrameTimeSeconds > 0)
- {
- misc["string_2"] = llformat("Texture Time: %.2f, Total Time: %.2f", gDebugTimers[0].getElapsedTimeF32(), gFrameTimeSeconds);
- }
+ misc["string_2"] = llformat("Texture Time: %.2f, Total Time: %.2f", gTextureTimer.getElapsedTimeF32(), gFrameTimeSeconds);
// misc["int_1"] = LLSD::Integer(gSavedSettings.getU32("RenderQualityPerformance")); // Steve: 1.21
// misc["int_2"] = LLSD::Integer(gFrameStalls); // Steve: 1.21
diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h
index 554e4d647e..e02a4ccdc7 100755..100644
--- a/indra/newview/llviewerstats.h
+++ b/indra/newview/llviewerstats.h
@@ -33,92 +33,90 @@
class LLViewerStats : public LLSingleton<LLViewerStats>
{
public:
- LLStat mKBitStat;
- LLStat mLayersKBitStat;
- LLStat mObjectKBitStat;
- LLStat mAssetKBitStat;
- LLStat mTextureKBitStat;
- LLStat mVFSPendingOperations;
- LLStat mObjectsDrawnStat;
- LLStat mObjectsCulledStat;
- LLStat mObjectsTestedStat;
- LLStat mObjectsComparedStat;
- LLStat mObjectsOccludedStat;
- LLStat mFPSStat;
- LLStat mPacketsInStat;
- LLStat mPacketsLostStat;
- LLStat mPacketsOutStat;
- LLStat mPacketsLostPercentStat;
- LLStat mTexturePacketsStat;
- LLStat mActualInKBitStat; // From the packet ring (when faking a bad connection)
- LLStat mActualOutKBitStat; // From the packet ring (when faking a bad connection)
- LLStat mTrianglesDrawnStat;
+ LLStat mKBitStat,
+ mLayersKBitStat,
+ mObjectKBitStat,
+ mAssetKBitStat,
+ mTextureKBitStat,
+ mVFSPendingOperations,
+ mObjectsDrawnStat,
+ mObjectsCulledStat,
+ mObjectsTestedStat,
+ mObjectsComparedStat,
+ mObjectsOccludedStat,
+ mFPSStat,
+ mPacketsInStat,
+ mPacketsLostStat,
+ mPacketsOutStat,
+ mPacketsLostPercentStat,
+ mTexturePacketsStat,
+ mActualInKBitStat, // From the packet ring (when faking a bad connection)
+ mActualOutKBitStat, // From the packet ring (when faking a bad connection)
+ mTrianglesDrawnStat;
// Simulator stats
- LLStat mSimTimeDilation;
-
- LLStat mSimFPS;
- LLStat mSimPhysicsFPS;
- LLStat mSimAgentUPS;
- LLStat mSimScriptEPS;
-
- LLStat mSimFrameMsec;
- LLStat mSimNetMsec;
- LLStat mSimSimOtherMsec;
- LLStat mSimSimPhysicsMsec;
-
- LLStat mSimSimPhysicsStepMsec;
- LLStat mSimSimPhysicsShapeUpdateMsec;
- LLStat mSimSimPhysicsOtherMsec;
-
- LLStat mSimSimAIStepMsec;
- LLStat mSimSimSkippedSilhouetteSteps;
- LLStat mSimSimPctSteppedCharacters;
-
- LLStat mSimAgentMsec;
- LLStat mSimImagesMsec;
- LLStat mSimScriptMsec;
- LLStat mSimSpareMsec;
- LLStat mSimSleepMsec;
- LLStat mSimPumpIOMsec;
-
- LLStat mSimMainAgents;
- LLStat mSimChildAgents;
- LLStat mSimObjects;
- LLStat mSimActiveObjects;
- LLStat mSimActiveScripts;
- LLStat mSimPctScriptsRun;
-
- LLStat mSimInPPS;
- LLStat mSimOutPPS;
- LLStat mSimPendingDownloads;
- LLStat mSimPendingUploads;
- LLStat mSimPendingLocalUploads;
- LLStat mSimTotalUnackedBytes;
-
- LLStat mPhysicsPinnedTasks;
- LLStat mPhysicsLODTasks;
- LLStat mPhysicsMemoryAllocated;
-
- LLStat mSimPingStat;
-
- LLStat mNumImagesStat;
- LLStat mNumRawImagesStat;
- LLStat mGLTexMemStat;
- LLStat mGLBoundMemStat;
- LLStat mRawMemStat;
- LLStat mFormattedMemStat;
-
- LLStat mNumObjectsStat;
- LLStat mNumActiveObjectsStat;
- LLStat mNumNewObjectsStat;
- LLStat mNumSizeCulledStat;
- LLStat mNumVisCulledStat;
+ LLStat mSimTimeDilation,
+
+ mSimFPS,
+ mSimPhysicsFPS,
+ mSimAgentUPS,
+ mSimScriptEPS,
+
+ mSimFrameMsec,
+ mSimNetMsec,
+ mSimSimOtherMsec,
+ mSimSimPhysicsMsec,
+
+ mSimSimPhysicsStepMsec,
+ mSimSimPhysicsShapeUpdateMsec,
+ mSimSimPhysicsOtherMsec,
+ mSimSimAIStepMsec,
+ mSimSimSkippedSilhouetteSteps,
+ mSimSimPctSteppedCharacters,
+
+ mSimAgentMsec,
+ mSimImagesMsec,
+ mSimScriptMsec,
+ mSimSpareMsec,
+ mSimSleepMsec,
+ mSimPumpIOMsec,
+
+ mSimMainAgents,
+ mSimChildAgents,
+ mSimObjects,
+ mSimActiveObjects,
+ mSimActiveScripts,
+ mSimPctScriptsRun,
+
+ mSimInPPS,
+ mSimOutPPS,
+ mSimPendingDownloads,
+ mSimPendingUploads,
+ mSimPendingLocalUploads,
+ mSimTotalUnackedBytes,
+
+ mPhysicsPinnedTasks,
+ mPhysicsLODTasks,
+ mPhysicsMemoryAllocated,
+
+ mSimPingStat,
+
+ mNumImagesStat,
+ mNumRawImagesStat,
+ mGLTexMemStat,
+ mGLBoundMemStat,
+ mRawMemStat,
+ mFormattedMemStat,
+
+ mNumObjectsStat,
+ mNumActiveObjectsStat,
+ mNumNewObjectsStat,
+ mNumSizeCulledStat,
+ mNumVisCulledStat;
void resetStats();
public:
- // If you change this, please also add a corresponding text label
- // in statTypeToText in llviewerstats.cpp
+ // If you change this, please also add a corresponding text label in llviewerstats.cpp
enum EStatType
{
ST_VERSION = 0,
@@ -183,7 +181,6 @@ public:
ST_COUNT = 58
};
-
LLViewerStats();
~LLViewerStats();
@@ -310,14 +307,10 @@ 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 update_statistics();
void send_stats();
-extern std::map<S32,LLFrameTimer> gDebugTimers;
-extern std::map<S32,std::string> gDebugTimerLabel;
+extern LLFrameTimer gTextureTimer;
extern U32 gTotalTextureBytes;
extern U32 gTotalObjectBytes;
extern U32 gTotalTextureBytesPerBoostLevel[] ;
diff --git a/indra/newview/llviewerstatsrecorder.cpp b/indra/newview/llviewerstatsrecorder.cpp
index e9d21b4848..91e485d01b 100644
--- a/indra/newview/llviewerstatsrecorder.cpp
+++ b/indra/newview/llviewerstatsrecorder.cpp
@@ -27,7 +27,6 @@
#include "llviewerprecompiledheaders.h"
#include "llviewerstatsrecorder.h"
-#if LL_RECORD_VIEWER_STATS
#include "llfile.h"
#include "llviewerregion.h"
@@ -45,9 +44,8 @@ LLViewerStatsRecorder* LLViewerStatsRecorder::sInstance = NULL;
LLViewerStatsRecorder::LLViewerStatsRecorder() :
mObjectCacheFile(NULL),
mTimer(),
- mRegionp(NULL),
- mStartTime(0.f),
- mProcessingTime(0.f)
+ mStartTime(0.0),
+ mLastSnapshotTime(0.0)
{
if (NULL != sInstance)
{
@@ -61,112 +59,77 @@ LLViewerStatsRecorder::~LLViewerStatsRecorder()
{
if (mObjectCacheFile != NULL)
{
+ // last chance snapshot
+ writeToLog(0.f);
LLFile::close(mObjectCacheFile);
mObjectCacheFile = NULL;
}
}
-// static
-void LLViewerStatsRecorder::initClass()
-{
- sInstance = new LLViewerStatsRecorder();
-}
-
-// static
-void LLViewerStatsRecorder::cleanupClass()
-{
- delete sInstance;
- sInstance = NULL;
-}
-
-
-void LLViewerStatsRecorder::initStatsRecorder(LLViewerRegion *regionp)
-{
- if (mObjectCacheFile == NULL)
- {
- mStartTime = LLTimer::getTotalTime();
- mObjectCacheFile = LLFile::fopen(STATS_FILE_NAME, "wb");
- if (mObjectCacheFile)
- { // Write column headers
- std::ostringstream data_msg;
- data_msg << "EventTime, "
- << "ProcessingTime, "
- << "CacheHits, "
- << "CacheFullMisses, "
- << "CacheCrcMisses, "
- << "FullUpdates, "
- << "TerseUpdates, "
- << "CacheMissRequests, "
- << "CacheMissResponses, "
- << "CacheUpdateDupes, "
- << "CacheUpdateChanges, "
- << "CacheUpdateAdds, "
- << "CacheUpdateReplacements, "
- << "UpdateFailures"
- << "\n";
-
- fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile );
- }
- }
-}
-
-void LLViewerStatsRecorder::beginObjectUpdateEvents(LLViewerRegion *regionp)
-{
- initStatsRecorder(regionp);
- mRegionp = regionp;
- mProcessingTime = LLTimer::getTotalTime();
- clearStats();
-}
-
void LLViewerStatsRecorder::clearStats()
{
mObjectCacheHitCount = 0;
+ mObjectCacheHitSize = 0;
mObjectCacheMissFullCount = 0;
+ mObjectCacheMissFullSize = 0;
mObjectCacheMissCrcCount = 0;
+ mObjectCacheMissCrcSize = 0;
mObjectFullUpdates = 0;
+ mObjectFullUpdatesSize = 0;
mObjectTerseUpdates = 0;
+ mObjectTerseUpdatesSize = 0;
mObjectCacheMissRequests = 0;
mObjectCacheMissResponses = 0;
+ mObjectCacheMissResponsesSize = 0;
mObjectCacheUpdateDupes = 0;
mObjectCacheUpdateChanges = 0;
mObjectCacheUpdateAdds = 0;
mObjectCacheUpdateReplacements = 0;
mObjectUpdateFailures = 0;
+ mObjectUpdateFailuresSize = 0;
+ mTextureFetchSize = 0;
}
-void LLViewerStatsRecorder::recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type)
+void LLViewerStatsRecorder::recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type, S32 msg_size)
{
mObjectUpdateFailures++;
+ mObjectUpdateFailuresSize += msg_size;
}
-void LLViewerStatsRecorder::recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type)
+void LLViewerStatsRecorder::recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type, S32 msg_size)
{
if (LLViewerRegion::CACHE_MISS_TYPE_FULL == cache_miss_type)
{
mObjectCacheMissFullCount++;
+ mObjectCacheMissFullSize += msg_size;
}
else
{
mObjectCacheMissCrcCount++;
+ mObjectCacheMissCrcSize += msg_size;
}
}
-void LLViewerStatsRecorder::recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp)
+void LLViewerStatsRecorder::recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp, S32 msg_size)
{
switch (update_type)
{
case OUT_FULL:
mObjectFullUpdates++;
+ mObjectFullUpdatesSize += msg_size;
break;
case OUT_TERSE_IMPROVED:
mObjectTerseUpdates++;
+ mObjectTerseUpdatesSize += msg_size;
break;
case OUT_FULL_COMPRESSED:
mObjectCacheMissResponses++;
+ mObjectCacheMissResponsesSize += msg_size;
break;
case OUT_FULL_CACHED:
mObjectCacheHitCount++;
+ mObjectCacheHitSize += msg_size;
break;
default:
llwarns << "Unknown update_type" << llendl;
@@ -174,7 +137,7 @@ void LLViewerStatsRecorder::recordObjectUpdateEvent(U32 local_id, const EObjectU
};
}
-void LLViewerStatsRecorder::recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp)
+void LLViewerStatsRecorder::recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp, S32 msg_size)
{
switch (update_result)
{
@@ -201,9 +164,15 @@ void LLViewerStatsRecorder::recordRequestCacheMissesEvent(S32 count)
mObjectCacheMissRequests += count;
}
-void LLViewerStatsRecorder::endObjectUpdateEvents()
+void LLViewerStatsRecorder::writeToLog( F32 interval )
{
- llinfos << "ILX: "
+ F64 delta_time = LLTimer::getTotalSeconds() - mLastSnapshotTime;
+ S32 total_objects = mObjectCacheHitCount + mObjectCacheMissCrcCount + mObjectCacheMissFullCount + mObjectFullUpdates + mObjectTerseUpdates + mObjectCacheMissRequests + mObjectCacheMissResponses + mObjectCacheUpdateDupes + mObjectCacheUpdateChanges + mObjectCacheUpdateAdds + mObjectCacheUpdateReplacements + mObjectUpdateFailures;
+
+ if ( delta_time < interval || total_objects == 0) return;
+
+ mLastSnapshotTime = LLTimer::getTotalSeconds();
+ lldebugs << "ILX: "
<< mObjectCacheHitCount << " hits, "
<< mObjectCacheMissFullCount << " full misses, "
<< mObjectCacheMissCrcCount << " crc misses, "
@@ -218,41 +187,81 @@ void LLViewerStatsRecorder::endObjectUpdateEvents()
<< mObjectUpdateFailures << " update failures"
<< llendl;
- S32 total_objects = mObjectCacheHitCount + mObjectCacheMissCrcCount + mObjectCacheMissFullCount + mObjectFullUpdates + mObjectTerseUpdates + mObjectCacheMissRequests + mObjectCacheMissResponses + mObjectCacheUpdateDupes + mObjectCacheUpdateChanges + mObjectCacheUpdateAdds + mObjectCacheUpdateReplacements + mObjectUpdateFailures;
- if (mObjectCacheFile != NULL &&
- total_objects > 0)
+ if (mObjectCacheFile == NULL)
{
- std::ostringstream data_msg;
- F32 processing32 = (F32) ((LLTimer::getTotalTime() - mProcessingTime) / 1000.0);
-
- data_msg << getTimeSinceStart()
- << ", " << processing32
- << ", " << mObjectCacheHitCount
- << ", " << mObjectCacheMissFullCount
- << ", " << mObjectCacheMissCrcCount
- << ", " << mObjectFullUpdates
- << ", " << mObjectTerseUpdates
- << ", " << mObjectCacheMissRequests
- << ", " << mObjectCacheMissResponses
- << ", " << mObjectCacheUpdateDupes
- << ", " << mObjectCacheUpdateChanges
- << ", " << mObjectCacheUpdateAdds
- << ", " << mObjectCacheUpdateReplacements
- << ", " << mObjectUpdateFailures
- << "\n";
+ mStartTime = LLTimer::getTotalSeconds();
+ mObjectCacheFile = LLFile::fopen(STATS_FILE_NAME, "wb");
+ if (mObjectCacheFile)
+ { // Write column headers
+ std::ostringstream data_msg;
+ data_msg << "EventTime(ms)\t"
+ << "Cache Hits\t"
+ << "Cache Full Misses\t"
+ << "Cache Crc Misses\t"
+ << "Full Updates\t"
+ << "Terse Updates\t"
+ << "Cache Miss Requests\t"
+ << "Cache Miss Responses\t"
+ << "Cache Update Dupes\t"
+ << "Cache Update Changes\t"
+ << "Cache Update Adds\t"
+ << "Cache Update Replacements\t"
+ << "Update Failures\t"
+ << "Cache Hits bps\t"
+ << "Cache Full Misses bps\t"
+ << "Cache Crc Misses bps\t"
+ << "Full Updates bps\t"
+ << "Terse Updates bps\t"
+ << "Cache Miss Responses bps\t"
+ << "Texture Fetch bps\t"
+ << "\n";
- fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile );
+ fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile );
+ }
+ else
+ {
+ llwarns << "Couldn't open " << STATS_FILE_NAME << " for logging." << llendl;
+ return;
+ }
}
+ std::ostringstream data_msg;
+
+ data_msg << getTimeSinceStart()
+ << "\t " << mObjectCacheHitCount
+ << "\t" << mObjectCacheMissFullCount
+ << "\t" << mObjectCacheMissCrcCount
+ << "\t" << mObjectFullUpdates
+ << "\t" << mObjectTerseUpdates
+ << "\t" << mObjectCacheMissRequests
+ << "\t" << mObjectCacheMissResponses
+ << "\t" << mObjectCacheUpdateDupes
+ << "\t" << mObjectCacheUpdateChanges
+ << "\t" << mObjectCacheUpdateAdds
+ << "\t" << mObjectCacheUpdateReplacements
+ << "\t" << mObjectUpdateFailures
+ << "\t" << (mObjectCacheHitSize * 8 / delta_time)
+ << "\t" << (mObjectCacheMissFullSize * 8 / delta_time)
+ << "\t" << (mObjectCacheMissCrcSize * 8 / delta_time)
+ << "\t" << (mObjectFullUpdatesSize * 8 / delta_time)
+ << "\t" << (mObjectTerseUpdatesSize * 8 / delta_time)
+ << "\t" << (mObjectCacheMissResponsesSize * 8 / delta_time)
+ << "\t" << (mTextureFetchSize * 8 / delta_time)
+ << "\n";
+
+ fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile );
clearStats();
}
F32 LLViewerStatsRecorder::getTimeSinceStart()
{
- return (F32) ((LLTimer::getTotalTime() - mStartTime) / 1000.0);
+ return (F32) (LLTimer::getTotalSeconds() - mStartTime);
}
-#endif
+void LLViewerStatsRecorder::recordTextureFetch( S32 msg_size )
+{
+ mTextureFetchSize += msg_size;
+}
diff --git a/indra/newview/llviewerstatsrecorder.h b/indra/newview/llviewerstatsrecorder.h
index 612ac380f7..d1744f4910 100644
--- a/indra/newview/llviewerstatsrecorder.h
+++ b/indra/newview/llviewerstatsrecorder.h
@@ -35,63 +35,111 @@
#define LL_RECORD_VIEWER_STATS 0
-#if LL_RECORD_VIEWER_STATS
#include "llframetimer.h"
#include "llviewerobject.h"
#include "llviewerregion.h"
class LLMutex;
-class LLViewerRegion;
class LLViewerObject;
-class LLViewerStatsRecorder
+class LLViewerStatsRecorder : public LLSingleton<LLViewerStatsRecorder>
{
public:
+ LOG_CLASS(LLViewerStatsRecorder);
LLViewerStatsRecorder();
~LLViewerStatsRecorder();
- static void initClass();
- static void cleanupClass();
- static LLViewerStatsRecorder* instance() {return sInstance; }
+ void objectUpdateFailure(U32 local_id, const EObjectUpdateType update_type, S32 msg_size)
+ {
+#if LL_RECORD_VIEWER_STATS
+ recordObjectUpdateFailure(local_id, update_type, msg_size);
+#endif
+ }
- void initStatsRecorder(LLViewerRegion *regionp);
+ void cacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type, S32 msg_size)
+ {
+#if LL_RECORD_VIEWER_STATS
+ recordCacheMissEvent(local_id, update_type, cache_miss_type, msg_size);
+#endif
+ }
- void beginObjectUpdateEvents(LLViewerRegion *regionp);
- void recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type);
- void recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type);
- void recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp);
- void recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp);
- void recordRequestCacheMissesEvent(S32 count);
- void endObjectUpdateEvents();
+ void objectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp, S32 msg_size)
+ {
+#if LL_RECORD_VIEWER_STATS
+ recordObjectUpdateEvent(local_id, update_type, objectp, msg_size);
+#endif
+ }
+
+ void cacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp, S32 msg_size)
+ {
+#if LL_RECORD_VIEWER_STATS
+ recordCacheFullUpdate(local_id, update_type, update_result, objectp, msg_size);
+#endif
+ }
+
+ void requestCacheMissesEvent(S32 count)
+ {
+#if LL_RECORD_VIEWER_STATS
+ recordRequestCacheMissesEvent(count);
+#endif
+ }
+
+ void textureFetch(S32 msg_size)
+ {
+#if LL_RECORD_VIEWER_STATS
+ recordTextureFetch(msg_size);
+#endif
+ }
+
+ void log(F32 interval)
+ {
+#if LL_RECORD_VIEWER_STATS
+ writeToLog(interval);
+#endif
+ }
F32 getTimeSinceStart();
private:
+ void recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type, S32 msg_size);
+ void recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type, S32 msg_size);
+ void recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp, S32 msg_size);
+ void recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp, S32 msg_size);
+ void recordRequestCacheMissesEvent(S32 count);
+ void recordTextureFetch(S32 msg_size);
+ void writeToLog(F32 interval);
+
static LLViewerStatsRecorder* sInstance;
LLFILE * mObjectCacheFile; // File to write data into
LLFrameTimer mTimer;
- LLViewerRegion* mRegionp;
F64 mStartTime;
- F64 mProcessingTime;
+ F64 mLastSnapshotTime;
S32 mObjectCacheHitCount;
+ S32 mObjectCacheHitSize;
S32 mObjectCacheMissFullCount;
+ S32 mObjectCacheMissFullSize;
S32 mObjectCacheMissCrcCount;
+ S32 mObjectCacheMissCrcSize;
S32 mObjectFullUpdates;
+ S32 mObjectFullUpdatesSize;
S32 mObjectTerseUpdates;
+ S32 mObjectTerseUpdatesSize;
S32 mObjectCacheMissRequests;
S32 mObjectCacheMissResponses;
+ S32 mObjectCacheMissResponsesSize;
S32 mObjectCacheUpdateDupes;
S32 mObjectCacheUpdateChanges;
S32 mObjectCacheUpdateAdds;
S32 mObjectCacheUpdateReplacements;
S32 mObjectUpdateFailures;
+ S32 mObjectUpdateFailuresSize;
+ S32 mTextureFetchSize;
void clearStats();
};
-#endif // LL_RECORD_VIEWER_STATS
#endif // LLVIEWERSTATSRECORDER_H
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index 99102309a1..122d8f4a96 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -1144,6 +1144,14 @@ void LLViewerTextEditor::openEmbeddedTexture( LLInventoryItem* item, llwchar wc
{
preview->setAuxItem( item );
preview->setNotecardInfo(mNotecardInventoryID, mObjectID);
+ if (preview->hasString("Title"))
+ {
+ LLStringUtil::format_map_t args;
+ args["[NAME]"] = item->getName();
+ LLUIString title = preview->getString("Title", args);
+ preview->setTitle(title.getString());
+ }
+ preview->getChild<LLUICtrl>("desc")->setValue(item->getDescription());
}
}
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 8eb8717de2..08fcb60d03 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -39,7 +39,6 @@
#include "llimagebmp.h"
#include "llimagej2c.h"
#include "llimagetga.h"
-#include "llmemtype.h"
#include "llstl.h"
#include "llvfile.h"
#include "llvfs.h"
@@ -624,6 +623,7 @@ LLViewerTexture::~LLViewerTexture()
void LLViewerTexture::init(bool firstinit)
{
mBoostLevel = LLViewerTexture::BOOST_NONE;
+ mSelectedTime = 0.f;
mFullWidth = 0;
mFullHeight = 0;
@@ -679,11 +679,18 @@ void LLViewerTexture::setBoostLevel(S32 level)
if(mBoostLevel != level)
{
mBoostLevel = level ;
- if(mBoostLevel != LLViewerTexture::BOOST_NONE)
+ if(mBoostLevel != LLViewerTexture::BOOST_NONE &&
+ mBoostLevel != LLViewerTexture::BOOST_SELECTED)
{
setNoDelete() ;
}
}
+
+ if (mBoostLevel == LLViewerTexture::BOOST_SELECTED)
+ {
+ mSelectedTime = gFrameTimeSeconds;
+ }
+
}
@@ -1904,13 +1911,34 @@ void LLViewerFetchedTexture::updateVirtualSize()
for(U32 i = 0 ; i < mNumFaces ; i++)
{
LLFace* facep = mFaceList[i] ;
- if(facep->getDrawable()->isRecentlyVisible())
+ if( facep )
{
- addTextureStats(facep->getVirtualSize()) ;
- setAdditionalDecodePriority(facep->getImportanceToCamera()) ;
+ LLDrawable* drawable = facep->getDrawable();
+ if (drawable)
+ {
+ if(drawable->isRecentlyVisible())
+ {
+ if (getBoostLevel() == LLViewerTexture::BOOST_NONE &&
+ drawable->getVObj() && drawable->getVObj()->isSelected())
+ {
+ setBoostLevel(LLViewerTexture::BOOST_SELECTED);
+ }
+ addTextureStats(facep->getVirtualSize()) ;
+ setAdditionalDecodePriority(facep->getImportanceToCamera()) ;
+ }
+ }
}
}
+ //reset whether or not a face was selected after 10 seconds
+ const F32 SELECTION_RESET_TIME = 10.f;
+
+ if (getBoostLevel() == LLViewerTexture::BOOST_SELECTED &&
+ gFrameTimeSeconds - mSelectedTime > SELECTION_RESET_TIME)
+ {
+ setBoostLevel(LLViewerTexture::BOOST_NONE);
+ }
+
if(mMaxVirtualSizeResetCounter > 0)
{
mMaxVirtualSizeResetCounter--;
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index 2ea9a07e9a..2e7949e9a3 100755..100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -275,6 +275,7 @@ private:
protected:
LLUUID mID;
S32 mBoostLevel; // enum describing priority level
+ F32 mSelectedTime; // time texture was last selected
S32 mFullWidth;
S32 mFullHeight;
BOOL mUseMipMaps ;
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index e4669cde34..b9f5c432d0 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -67,12 +67,12 @@ void (*LLViewerTextureList::sUUIDCallback)(void **, const LLUUID&) = NULL;
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);
+LLStat LLViewerTextureList::sNumImagesStat("Num Images", 32, TRUE);
+LLStat LLViewerTextureList::sNumRawImagesStat("Num Raw Images", 32, TRUE);
+LLStat LLViewerTextureList::sGLTexMemStat("GL Texture Mem", 32, TRUE);
+LLStat LLViewerTextureList::sGLBoundMemStat("GL Bound Mem", 32, TRUE);
+LLStat LLViewerTextureList::sRawMemStat("Raw Image Mem", 32, TRUE);
+LLStat LLViewerTextureList::sFormattedMemStat("Formatted Image Mem", 32, TRUE);
LLViewerTextureList gTextureList;
static LLFastTimer::DeclareTimer FTM_PROCESS_IMAGES("Process Images");
@@ -1006,14 +1006,6 @@ F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time)
break;
}
}
- //if (fetch_count == 0)
- //{
- // gDebugTimers[0].pause();
- //}
- //else
- //{
- // gDebugTimers[0].unpause();
- //}
return image_op_timer.getElapsedTimeF32();
}
@@ -1385,7 +1377,6 @@ void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_d
{
static LLCachedControl<bool> log_texture_traffic(gSavedSettings,"LogTextureNetworkTraffic") ;
- LLMemType mt1(LLMemType::MTYPE_APPFMTIMAGE);
LLFastTimer t(FTM_PROCESS_IMAGES);
// Receives image packet, copy into image object,
@@ -1686,49 +1677,43 @@ struct UIImageDeclarations : public LLInitParam::Block<UIImageDeclarations>
bool LLUIImageList::initFromFile()
{
- // construct path to canonical textures.xml in default skin dir
- std::string base_file_path = gDirUtilp->getExpandedFilename(LL_PATH_SKINS, "default", "textures", "textures.xml");
+ // Look for textures.xml in all the right places. Pass
+ // constraint=LLDir::ALL_SKINS because we want to overlay textures.xml
+ // from all the skins directories.
+ std::vector<std::string> textures_paths =
+ gDirUtilp->findSkinnedFilenames(LLDir::TEXTURES, "textures.xml", LLDir::ALL_SKINS);
+ std::vector<std::string>::const_iterator pi(textures_paths.begin()), pend(textures_paths.end());
+ if (pi == pend)
+ {
+ llwarns << "No textures.xml found in skins directories" << llendl;
+ return false;
+ }
+ // The first (most generic) file gets special validations
LLXMLNodePtr root;
-
- if (!LLXMLNode::parseFile(base_file_path, root, NULL))
+ if (!LLXMLNode::parseFile(*pi, root, NULL))
{
- llwarns << "Unable to parse UI image list file " << base_file_path << llendl;
+ llwarns << "Unable to parse UI image list file " << *pi << llendl;
return false;
}
if (!root->hasAttribute("version"))
{
- llwarns << "No valid version number in UI image list file " << base_file_path << llendl;
+ llwarns << "No valid version number in UI image list file " << *pi << llendl;
return false;
}
UIImageDeclarations images;
LLXUIParser parser;
- parser.readXUI(root, images, base_file_path);
-
- // add components defined in current skin
- std::string skin_update_path = gDirUtilp->getSkinDir()
- + gDirUtilp->getDirDelimiter()
- + "textures"
- + gDirUtilp->getDirDelimiter()
- + "textures.xml";
- LLXMLNodePtr update_root;
- if (skin_update_path != base_file_path
- && LLXMLNode::parseFile(skin_update_path, update_root, NULL))
- {
- parser.readXUI(update_root, images, skin_update_path);
- }
-
- // add components defined in user override of current skin
- skin_update_path = gDirUtilp->getUserSkinDir()
- + gDirUtilp->getDirDelimiter()
- + "textures"
- + gDirUtilp->getDirDelimiter()
- + "textures.xml";
- if (skin_update_path != base_file_path
- && LLXMLNode::parseFile(skin_update_path, update_root, NULL))
- {
- parser.readXUI(update_root, images, skin_update_path);
+ parser.readXUI(root, images, *pi);
+
+ // add components defined in the rest of the skin paths
+ while (++pi != pend)
+ {
+ LLXMLNodePtr update_root;
+ if (LLXMLNode::parseFile(*pi, update_root, NULL))
+ {
+ parser.readXUI(update_root, images, *pi);
+ }
}
if (!images.validateBlock()) return false;
diff --git a/indra/newview/llviewervisualparam.h b/indra/newview/llviewervisualparam.h
index 3bc95cbfbf..2826e6c316 100644
--- a/indra/newview/llviewervisualparam.h
+++ b/indra/newview/llviewervisualparam.h
@@ -65,6 +65,7 @@ protected:
// VIRTUAL CLASS
// a viewer side interface class for a generalized parametric modification of the avatar mesh
//-----------------------------------------------------------------------------
+LL_ALIGN_PREFIX(16)
class LLViewerVisualParam : public LLVisualParam
{
public:
@@ -104,6 +105,6 @@ public:
BOOL getCrossWearable() const { return getInfo()->mCrossWearable; }
-};
+} LL_ALIGN_POSTFIX(16);
#endif // LL_LLViewerVisualParam_H
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 1798d554b9..4afd90b44c 100755
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -37,8 +37,10 @@
#include "llagent.h"
#include "llagentcamera.h"
+#include "llcommunicationchannel.h"
#include "llfloaterreg.h"
#include "llmeshrepository.h"
+#include "llnotificationhandler.h"
#include "llpanellogin.h"
#include "llviewerkeyboard.h"
#include "llviewermenu.h"
@@ -56,6 +58,7 @@
// linden library includes
#include "llaudioengine.h" // mute on minimize
+#include "llchatentry.h"
#include "indra_constants.h"
#include "llassetstorage.h"
#include "llerrorcontrol.h"
@@ -77,6 +80,7 @@
#include "llmediaentry.h"
#include "llurldispatcher.h"
#include "raytrace.h"
+#include "llstat.h"
// newview includes
#include "llagent.h"
@@ -122,11 +126,12 @@
#include "llkeyboard.h"
#include "lllineeditor.h"
#include "llmenugl.h"
+#include "llmenuoptionpathfindingrebakenavmesh.h"
#include "llmodaldialog.h"
#include "llmorphview.h"
#include "llmoveview.h"
#include "llnavigationbar.h"
-#include "llpanelpathfindingrebakenavmesh.h"
+#include "llnotificationhandler.h"
#include "llpaneltopinfobar.h"
#include "llpopupview.h"
#include "llpreviewtexture.h"
@@ -187,7 +192,7 @@
#include "llviewerjoystick.h"
#include "llviewernetwork.h"
#include "llpostprocess.h"
-#include "llnearbychatbar.h"
+#include "llfloaterimnearbychat.h"
#include "llagentui.h"
#include "llwearablelist.h"
@@ -197,7 +202,6 @@
#include "llfloaternotificationsconsole.h"
-#include "llnearbychat.h"
#include "llwindowlistener.h"
#include "llviewerwindowlistener.h"
#include "llpaneltopinfobar.h"
@@ -334,27 +338,24 @@ public:
if (gSavedSettings.getBOOL("DebugShowTime"))
{
- const U32 y_inc2 = 15;
- for (std::map<S32,LLFrameTimer>::reverse_iterator iter = gDebugTimers.rbegin();
- iter != gDebugTimers.rend(); ++iter)
{
- S32 idx = iter->first;
- LLFrameTimer& timer = iter->second;
+ const U32 y_inc2 = 15;
+ LLFrameTimer& timer = gTextureTimer;
F32 time = timer.getElapsedTimeF32();
S32 hours = (S32)(time / (60*60));
S32 mins = (S32)((time - hours*(60*60)) / 60);
S32 secs = (S32)((time - hours*(60*60) - mins*60));
- 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;
+ addText(xpos, ypos, llformat("Texture: %d:%02d:%02d", hours,mins,secs)); ypos += y_inc2;
}
+ {
F32 time = gFrameTimeSeconds;
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("Time: %d:%02d:%02d", hours,mins,secs)); ypos += y_inc;
}
+ }
#if LL_WINDOWS
if (gSavedSettings.getBOOL("DebugShowMemory"))
@@ -563,6 +564,9 @@ public:
addText(xpos, ypos, llformat("%d Render Calls", gPipeline.mBatchCount));
ypos += y_inc;
+ addText(xpos, ypos, llformat("%d/%d Objects Active", gObjectList.getNumActiveObjects(), gObjectList.getNumObjects()));
+ ypos += y_inc;
+
addText(xpos, ypos, llformat("%d Matrix Ops", gPipeline.mMatrixOpCount));
ypos += y_inc;
@@ -615,7 +619,7 @@ public:
addText(xpos, ypos, llformat("%d/%d Mesh HTTP Requests/Retries", LLMeshRepository::sHTTPRequestCount,
LLMeshRepository::sHTTPRetryCount));
ypos += y_inc;
-
+
addText(xpos, ypos, llformat("%d/%d Mesh LOD Pending/Processing", LLMeshRepository::sLODPending, LLMeshRepository::sLODProcessing));
ypos += y_inc;
@@ -1542,7 +1546,8 @@ LLViewerWindow::LLViewerWindow(const Params& p)
mResDirty(false),
mStatesDirty(false),
mCurrResolutionIndex(0),
- mProgressView(NULL)
+ mProgressView(NULL),
+ mMouseVelocityStat(new LLStat("Mouse Velocity"))
{
// gKeyboard is still NULL, so it doesn't do LLWindowListener any good to
// pass its value right now. Instead, pass it a nullary function that
@@ -1550,16 +1555,17 @@ LLViewerWindow::LLViewerWindow(const Params& p)
// boost::lambda::var() constructs such a functor on the fly.
mWindowListener.reset(new LLWindowListener(this, boost::lambda::var(gKeyboard)));
mViewerWindowListener.reset(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"));
- LLNotifications::instance().getChannel("VW_alerts")->connectChanged(&LLViewerWindow::onAlert);
- LLNotifications::instance().getChannel("VW_alertmodal")->connectChanged(&LLViewerWindow::onAlert);
+ mSystemChannel.reset(new LLNotificationChannel("System", "Visible", LLNotificationFilters::includeEverything));
+ mCommunicationChannel.reset(new LLCommunicationChannel("Communication", "Visible"));
+ mAlertsChannel.reset(new LLNotificationsUI::LLViewerAlertHandler("VW_alerts", "alert"));
+ mModalAlertsChannel.reset(new LLNotificationsUI::LLViewerAlertHandler("VW_alertmodal", "alertmodal"));
+
bool ignore = gSavedSettings.getBOOL("IgnoreAllNotifications");
LLNotifications::instance().setIgnoreAllNotifications(ignore);
if (ignore)
{
- llinfos << "NOTE: ALL NOTIFICATIONS THAT OCCUR WILL GET ADDED TO IGNORE LIST FOR LATER RUNS." << llendl;
+ llinfos << "NOTE: ALL NOTIFICATIONS THAT OCCUR WILL GET ADDED TO IGNORE LIST FOR LATER RUNS." << llendl;
}
// Default to application directory.
@@ -1689,8 +1695,7 @@ LLViewerWindow::LLViewerWindow(const Params& p)
LLFontGL::initClass( gSavedSettings.getF32("FontScreenDPI"),
mDisplayScale.mV[VX],
mDisplayScale.mV[VY],
- gDirUtilp->getAppRODataDir(),
- LLUI::getXUIPaths());
+ gDirUtilp->getAppRODataDir());
// Create container for all sub-views
LLView::Params rvp;
@@ -1824,8 +1829,8 @@ void LLViewerWindow::initBase()
gDebugView->init();
gToolTipView = getRootView()->getChild<LLToolTipView>("tooltip view");
- // Initialize busy response message when logged in
- LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLFloaterPreference::initBusyResponse));
+ // Initialize do not disturb response message when logged in
+ LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLFloaterPreference::initDoNotDisturbResponse));
// Add the progress bar view (startup view), which overrides everything
mProgressView = getRootView()->findChild<LLProgressView>("progress_view");
@@ -1931,11 +1936,10 @@ void LLViewerWindow::initWorldUI()
LLPanelStandStopFlying* panel_stand_stop_flying = LLPanelStandStopFlying::getInstance();
panel_ssf_container->addChild(panel_stand_stop_flying);
- LLPanelPathfindingRebakeNavmesh *panel_rebake_navmesh = LLPanelPathfindingRebakeNavmesh::getInstance();
- panel_ssf_container->addChild(panel_rebake_navmesh);
-
panel_ssf_container->setVisible(TRUE);
-
+
+ LLMenuOptionPathfindingRebakeNavmesh::getInstance()->initialize();
+
// Load and make the toolbars visible
// Note: we need to load the toolbars only *after* the user is logged in and IW
if (gToolBarView)
@@ -1981,12 +1985,12 @@ void LLViewerWindow::shutdownViews()
gMorphView->setVisible(FALSE);
}
llinfos << "Global views cleaned." << llendl ;
-
+
// DEV-40930: Clear sModalStack. Otherwise, any LLModalDialog left open
// will crump with LL_ERRS.
LLModalDialog::shutdownModals();
llinfos << "LLModalDialog shut down." << llendl;
-
+
// destroy the nav bar, not currently part of gViewerWindow
// *TODO: Make LLNavigationBar part of gViewerWindow
if (LLNavigationBar::instanceExists())
@@ -1994,16 +1998,18 @@ void LLViewerWindow::shutdownViews()
delete LLNavigationBar::getInstance();
}
llinfos << "LLNavigationBar destroyed." << llendl ;
-
+
// destroy menus after instantiating navbar above, as it needs
// access to gMenuHolder
cleanup_menus();
llinfos << "menus destroyed." << llendl ;
-
+
// Delete all child views.
delete mRootView;
mRootView = NULL;
llinfos << "RootView deleted." << llendl ;
+
+ LLMenuOptionPathfindingRebakeNavmesh::getInstance()->quit();
// Automatically deleted as children of mRootView. Fix the globals.
gStatusBar = NULL;
@@ -2072,6 +2078,8 @@ LLViewerWindow::~LLViewerWindow()
delete mDebugText;
mDebugText = NULL;
+
+ delete mMouseVelocityStat;
}
@@ -2496,26 +2504,20 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
return TRUE;
}
- // Traverses up the hierarchy
+ LLFloater* focused_floaterp = gFloaterView->getFocusedFloater();
+ std::string focusedFloaterName = (focused_floaterp ? focused_floaterp->getInstanceName() : "");
+
if( keyboard_focus )
{
- LLNearbyChatBar* nearby_chat = LLFloaterReg::findTypedInstance<LLNearbyChatBar>("chat_bar");
-
- if (nearby_chat)
- {
- LLLineEditor* chat_editor = nearby_chat->getChatBox();
-
- // arrow keys move avatar while chatting hack
- if (chat_editor && chat_editor->hasFocus())
+ if ((focusedFloaterName == "nearby_chat") || (focusedFloaterName == "im_container") || (focusedFloaterName == "impanel"))
{
- // 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"))
+ if (gSavedSettings.getBOOL("ArrowKeysAlwaysMove"))
{
// let Control-Up and Control-Down through for chat line history,
if (!(key == KEY_UP && mask == MASK_CONTROL)
- && !(key == KEY_DOWN && mask == MASK_CONTROL))
+ && !(key == KEY_DOWN && mask == MASK_CONTROL)
+ && !(key == KEY_UP && mask == MASK_ALT)
+ && !(key == KEY_DOWN && mask == MASK_ALT))
{
switch(key)
{
@@ -2533,9 +2535,9 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
break;
}
}
- }
}
}
+
if (keyboard_focus->handleKey(key, mask, FALSE))
{
return TRUE;
@@ -2566,11 +2568,19 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
if ( gSavedSettings.getS32("LetterKeysFocusChatBar") && !gAgentCamera.cameraMouselook() &&
!keyboard_focus && key < 0x80 && (mask == MASK_NONE || mask == MASK_SHIFT) )
{
- LLLineEditor* chat_editor = LLFloaterReg::getTypedInstance<LLNearbyChatBar>("chat_bar")->getChatBox();
+ // Initialize nearby chat if it's missing
+ LLFloaterIMNearbyChat* nearby_chat = LLFloaterReg::findTypedInstance<LLFloaterIMNearbyChat>("nearby_chat");
+ if (!nearby_chat)
+ {
+ LLSD name("im_container");
+ LLFloaterReg::toggleInstanceOrBringToFront(name);
+ }
+
+ LLChatEntry* chat_editor = LLFloaterReg::findTypedInstance<LLFloaterIMNearbyChat>("nearby_chat")->getChatBox();
if (chat_editor)
{
// passing NULL here, character will be added later when it is handled by character handler.
- LLNearbyChatBar::getInstance()->startChat(NULL);
+ nearby_chat->startChat(NULL);
return TRUE;
}
}
@@ -2599,7 +2609,10 @@ BOOL LLViewerWindow::handleUnicodeChar(llwchar uni_char, MASK mask)
if ((uni_char == 13 && mask != MASK_CONTROL)
|| (uni_char == 3 && mask == MASK_NONE))
{
- return gViewerKeyboard.handleKey(KEY_RETURN, mask, gKeyboard->getKeyRepeated(KEY_RETURN));
+ if (mask != MASK_ALT)
+ {
+ return gViewerKeyboard.handleKey(KEY_RETURN, mask, gKeyboard->getKeyRepeated(KEY_RETURN));
+ }
}
// let menus handle navigation (jump) keys
@@ -2814,7 +2827,6 @@ void LLViewerWindow::updateUI()
BOOL handled = FALSE;
- BOOL handled_by_top_ctrl = FALSE;
LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
LLView* captor_view = dynamic_cast<LLView*>(mouse_captor);
@@ -2999,7 +3011,6 @@ void LLViewerWindow::updateUI()
S32 local_x, local_y;
top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleHover(local_x, local_y, mask);
- handled_by_top_ctrl = TRUE;
}
if ( !handled )
@@ -3245,7 +3256,7 @@ void LLViewerWindow::updateMouseDelta()
mouse_vel.setVec((F32) dx, (F32) dy);
}
- mMouseVelocityStat.addValue(mouse_vel.magVec());
+ mMouseVelocityStat->addValue(mouse_vel.magVec());
}
void LLViewerWindow::updateKeyboardFocus()
@@ -4234,14 +4245,48 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
image_height = llmin(image_height, window_height);
}
+ S32 original_width = 0;
+ S32 original_height = 0;
+ bool reset_deferred = false;
+
+ LLRenderTarget scratch_space;
+
F32 scale_factor = 1.0f ;
if (!keep_window_aspect || (image_width > window_width) || (image_height > window_height))
{
- // if image cropping or need to enlarge the scene, compute a scale_factor
- F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ;
- snapshot_width = (S32)(ratio * image_width) ;
- snapshot_height = (S32)(ratio * image_height) ;
- scale_factor = llmax(1.0f, 1.0f / ratio) ;
+ if ((image_width > window_width || image_height > window_height) && LLPipeline::sRenderDeferred && !show_ui)
+ {
+ if (scratch_space.allocate(image_width, image_height, GL_RGBA, true, true))
+ {
+ original_width = gPipeline.mDeferredScreen.getWidth();
+ original_height = gPipeline.mDeferredScreen.getHeight();
+
+ if (gPipeline.allocateScreenBuffer(image_width, image_height))
+ {
+ window_width = image_width;
+ window_height = image_height;
+ snapshot_width = image_width;
+ snapshot_height = image_height;
+ reset_deferred = true;
+ mWorldViewRectRaw.set(0, image_height, image_width, 0);
+ scratch_space.bindTarget();
+ }
+ else
+ {
+ scratch_space.release();
+ gPipeline.allocateScreenBuffer(original_width, original_height);
+ }
+ }
+ }
+
+ if (!reset_deferred)
+ {
+ // if image cropping or need to enlarge the scene, compute a scale_factor
+ F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ;
+ snapshot_width = (S32)(ratio * image_width) ;
+ snapshot_height = (S32)(ratio * image_height) ;
+ scale_factor = llmax(1.0f, 1.0f / ratio) ;
+ }
}
if (show_ui && scale_factor > 1.f)
@@ -4430,11 +4475,20 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
gPipeline.resetDrawOrders();
}
+ if (reset_deferred)
+ {
+ mWorldViewRectRaw = window_rect;
+ scratch_space.flush();
+ scratch_space.release();
+ gPipeline.allocateScreenBuffer(original_width, original_height);
+
+ }
+
if (high_res)
{
send_agent_resume();
}
-
+
return ret;
}
@@ -4726,7 +4780,7 @@ void LLViewerWindow::restoreGL(const std::string& progress_message)
LLViewerDynamicTexture::restoreGL();
LLVOAvatar::restoreGL();
LLVOPartGroup::restoreGL();
-
+
gResizeScreenTexture = TRUE;
gWindowResized = TRUE;
@@ -4761,8 +4815,7 @@ void LLViewerWindow::initFonts(F32 zoom_factor)
LLFontGL::initClass( gSavedSettings.getF32("FontScreenDPI"),
mDisplayScale.mV[VX] * zoom_factor,
mDisplayScale.mV[VY] * zoom_factor,
- gDirUtilp->getAppRODataDir(),
- LLUI::getXUIPaths());
+ gDirUtilp->getAppRODataDir());
// Force font reloads, which can be very slow
LLFontGL::loadDefaultFonts();
}
@@ -4954,7 +5007,7 @@ S32 LLViewerWindow::getChatConsoleBottomPad()
S32 offset = 0;
if(gToolBarView)
- offset += gToolBarView->getChild<LLView>("bottom_toolbar_panel")->getRect().getHeight();
+ offset += gToolBarView->getBottomToolbar()->getRect().getHeight();
return offset;
}
@@ -4991,25 +5044,6 @@ LLRect LLViewerWindow::getChatConsoleRect()
//----------------------------------------------------------------------------
-//static
-bool LLViewerWindow::onAlert(const LLSD& notify)
-{
- LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());
-
- if (gHeadlessClient)
- {
- llinfos << "Alert: " << notification->getName() << llendl;
- }
-
- // If we're in mouselook, the mouse is hidden and so the user can't click
- // the dialog buttons. In that case, change to First Person instead.
- if( gAgentCamera.cameraMouselook() )
- {
- gAgentCamera.changeCameraToDefault();
- }
- return false;
-}
-
void LLViewerWindow::setUIVisibility(bool visible)
{
mUIVisible = visible;
@@ -5214,8 +5248,8 @@ void LLPickInfo::getSurfaceInfo()
LLFace* facep = objectp->mDrawable->getFace(mObjectFace);
if (facep)
{
- mUVCoords = facep->surfaceToTexture(mSTCoords, mIntersection, mNormal);
- }
+ mUVCoords = facep->surfaceToTexture(mSTCoords, mIntersection, mNormal);
+ }
}
// and XY coords:
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 6efcaeaf18..b33488fd78 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -41,8 +41,8 @@
#include "llcursortypes.h"
#include "llwindowcallbacks.h"
#include "lltimer.h"
-#include "llstat.h"
#include "llmousehandler.h"
+#include "llnotifications.h"
#include "llhandle.h"
#include "llinitparam.h"
@@ -50,7 +50,7 @@
#include <boost/signals2.hpp>
#include <boost/scoped_ptr.hpp>
-
+class LLStat;
class LLView;
class LLViewerObject;
class LLUUID;
@@ -251,7 +251,7 @@ public:
S32 getCurrentMouseDX() const { return mCurrentMouseDelta.mX; }
S32 getCurrentMouseDY() const { return mCurrentMouseDelta.mY; }
LLCoordGL getCurrentMouseDelta() const { return mCurrentMouseDelta; }
- LLStat * getMouseVelocityStat() { return &mMouseVelocityStat; }
+ LLStat* getMouseVelocityStat() { return mMouseVelocityStat; }
BOOL getLeftMouseDown() const { return mLeftMouseDown; }
BOOL getMiddleMouseDown() const { return mMiddleMouseDown; }
BOOL getRightMouseDown() const { return mRightMouseDown; }
@@ -401,7 +401,6 @@ public:
private:
bool shouldShowToolTipFor(LLMouseHandler *mh);
- static bool onAlert(const LLSD& notify);
void switchToolByMask(MASK mask);
void destroyWindow();
@@ -418,6 +417,11 @@ private:
bool mActive;
bool mUIVisible;
+ LLNotificationChannelPtr mSystemChannel;
+ LLNotificationChannelPtr mCommunicationChannel;
+ LLNotificationChannelPtr mAlertsChannel;
+ LLNotificationChannelPtr mModalAlertsChannel;
+
LLRect mWindowRectRaw; // whole window, including UI
LLRect mWindowRectScaled; // whole window, scaled by UI size
LLRect mWorldViewRectRaw; // area of screen for 3D world
@@ -428,7 +432,7 @@ private:
LLCoordGL mCurrentMousePoint; // last mouse position in GL coords
LLCoordGL mLastMousePoint; // Mouse point at last frame.
LLCoordGL mCurrentMouseDelta; //amount mouse moved this frame
- LLStat mMouseVelocityStat;
+ LLStat* mMouseVelocityStat;
BOOL mLeftMouseDown;
BOOL mMiddleMouseDown;
BOOL mRightMouseDown;
diff --git a/indra/newview/llvlcomposition.cpp b/indra/newview/llvlcomposition.cpp
index ec932501e5..abb5153480 100644
--- a/indra/newview/llvlcomposition.cpp
+++ b/indra/newview/llvlcomposition.cpp
@@ -457,8 +457,6 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y,
texturep->createGLTexture(0, raw);
}
texturep->setSubImage(raw, tex_x_begin, tex_y_begin, tex_x_end - tex_x_begin, tex_y_end - tex_y_begin);
- LLSurface::sTextureUpdateTime += gen_timer.getElapsedTimeF32();
- LLSurface::sTexelsUpdated += (tex_x_end - tex_x_begin) * (tex_y_end - tex_y_begin);
for (S32 i = 0; i < 4; i++)
{
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 366b6004be..d295fc60cd 100755..100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -62,6 +62,7 @@
#include "llhudmanager.h"
#include "llhudnametag.h"
#include "llhudtext.h" // for mText/mDebugText
+#include "llinitparam.h"
#include "llkeyframefallmotion.h"
#include "llkeyframestandmotion.h"
#include "llkeyframewalkmotion.h"
@@ -191,6 +192,9 @@ const S32 MAX_BUBBLE_CHAT_LENGTH = DB_CHAT_MSG_STR_LEN;
const S32 MAX_BUBBLE_CHAT_UTTERANCES = 12;
const F32 CHAT_FADE_TIME = 8.0;
const F32 BUBBLE_CHAT_TIME = CHAT_FADE_TIME * 3.f;
+const F32 NAMETAG_UPDATE_THRESHOLD = 0.3f;
+const F32 NAMETAG_VERTICAL_SCREEN_OFFSET = 25.f;
+const F32 NAMETAG_VERT_OFFSET_WEIGHT = 0.17f;
const LLColor4 DUMMY_COLOR = LLColor4(0.5,0.5,0.5,1.0);
@@ -222,55 +226,62 @@ struct LLTextureMaskData
**/
//------------------------------------------------------------------------
-// LLVOBoneInfo
+// LLVOAvatarBoneInfo
// Trans/Scale/Rot etc. info about each avatar bone. Used by LLVOAvatarSkeleton.
//------------------------------------------------------------------------
-class LLVOAvatarBoneInfo
+struct LLVOAvatarCollisionVolumeInfo : public LLInitParam::Block<LLVOAvatarCollisionVolumeInfo>
{
- friend class LLVOAvatar;
- friend class LLVOAvatarSkeletonInfo;
-public:
- LLVOAvatarBoneInfo() : mIsJoint(FALSE) {}
- ~LLVOAvatarBoneInfo()
+ LLVOAvatarCollisionVolumeInfo()
+ : name("name"),
+ pos("pos"),
+ rot("rot"),
+ scale("scale")
+ {}
+
+ Mandatory<std::string> name;
+ Mandatory<LLVector3> pos,
+ rot,
+ scale;
+};
+
+struct LLVOAvatarChildJoint : public LLInitParam::ChoiceBlock<LLVOAvatarChildJoint>
{
- std::for_each(mChildList.begin(), mChildList.end(), DeletePointer());
- }
- BOOL parseXml(LLXmlTreeNode* node);
+ Alternative<Lazy<struct LLVOAvatarBoneInfo, IS_A_BLOCK> > bone;
+ Alternative<LLVOAvatarCollisionVolumeInfo> collision_volume;
-private:
- std::string mName;
- BOOL mIsJoint;
- LLVector3 mPos;
- LLVector3 mRot;
- LLVector3 mScale;
- LLVector3 mPivot;
- typedef std::vector<LLVOAvatarBoneInfo*> child_list_t;
- child_list_t mChildList;
+ LLVOAvatarChildJoint()
+ : bone("bone"),
+ collision_volume("collision_volume")
+ {}
+};
+
+struct LLVOAvatarBoneInfo : public LLInitParam::Block<LLVOAvatarBoneInfo, LLVOAvatarCollisionVolumeInfo>
+{
+ LLVOAvatarBoneInfo()
+ : pivot("pivot")
+ {}
+
+ Mandatory<LLVector3> pivot;
+ Multiple<LLVOAvatarChildJoint> children;
};
//------------------------------------------------------------------------
// LLVOAvatarSkeletonInfo
// Overall avatar skeleton
//------------------------------------------------------------------------
-class LLVOAvatarSkeletonInfo
+struct LLVOAvatarSkeletonInfo : public LLInitParam::Block<LLVOAvatarSkeletonInfo>
{
- friend class LLVOAvatar;
-public:
- LLVOAvatarSkeletonInfo() :
- mNumBones(0), mNumCollisionVolumes(0) {}
- ~LLVOAvatarSkeletonInfo()
- {
- std::for_each(mBoneInfoList.begin(), mBoneInfoList.end(), DeletePointer());
- }
- BOOL parseXml(LLXmlTreeNode* node);
- S32 getNumBones() const { return mNumBones; }
- S32 getNumCollisionVolumes() const { return mNumCollisionVolumes; }
+ LLVOAvatarSkeletonInfo()
+ : skeleton_root(""),
+ num_bones("num_bones"),
+ num_collision_volumes("num_collision_volumes"),
+ version("version")
+ {}
-private:
- S32 mNumBones;
- S32 mNumCollisionVolumes;
- typedef std::vector<LLVOAvatarBoneInfo*> bone_info_list_t;
- bone_info_list_t mBoneInfoList;
+ Mandatory<std::string> version;
+ Mandatory<S32> num_bones,
+ num_collision_volumes;
+ Mandatory<LLVOAvatarChildJoint> skeleton_root;
};
//-----------------------------------------------------------------------------
@@ -595,7 +606,7 @@ private:
// Static Data
//-----------------------------------------------------------------------------
LLXmlTree LLVOAvatar::sXMLTree;
-LLXmlTree LLVOAvatar::sSkeletonXMLTree;
+LLXMLNodePtr LLVOAvatar::sSkeletonXMLTree;
LLVOAvatarSkeletonInfo* LLVOAvatar::sAvatarSkeletonInfo = NULL;
LLVOAvatar::LLVOAvatarXmlInfo* LLVOAvatar::sAvatarXmlInfo = NULL;
LLVOAvatarDictionary *LLVOAvatar::sAvatarDictionary = NULL;
@@ -667,7 +678,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mNameString(),
mTitle(),
mNameAway(false),
- mNameBusy(false),
+ mNameDoNotDisturb(false),
mNameMute(false),
mNameAppearance(false),
mNameFriend(false),
@@ -695,7 +706,6 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mLastRezzedStatus(-1)
{
- LLMemType mt(LLMemType::MTYPE_AVATAR);
//VTResume(); // VTune
// mVoiceVisualizer is created by the hud effects manager and uses the HUD Effects pipeline
@@ -805,14 +815,14 @@ void LLVOAvatar::debugAvatarRezTime(std::string notification_name, std::string c
//------------------------------------------------------------------------
LLVOAvatar::~LLVOAvatar()
{
- if (!mFullyLoaded)
- {
+ if (!mFullyLoaded)
+ {
debugAvatarRezTime("AvatarRezLeftCloudNotification","left after ruth seconds as cloud");
- }
- else
- {
+ }
+ else
+ {
debugAvatarRezTime("AvatarRezLeftNotification","left sometime after declouding");
- }
+ }
lldebugs << "LLVOAvatar Destructor (0x" << this << ") id:" << mID << llendl;
@@ -1214,18 +1224,6 @@ void LLVOAvatar::initClass()
llerrs << "Error parsing skeleton file: " << skeleton_path << llendl;
}
- // Process XML data
-
- // avatar_skeleton.xml
- if (sAvatarSkeletonInfo)
- { //this can happen if a login attempt failed
- delete sAvatarSkeletonInfo;
- }
- sAvatarSkeletonInfo = new LLVOAvatarSkeletonInfo;
- if (!sAvatarSkeletonInfo->parseXml(sSkeletonXMLTree.getRoot()))
- {
- llerrs << "Error parsing skeleton XML file: " << skeleton_path << llendl;
- }
// parse avatar_lad.xml
if (sAvatarXmlInfo)
{ //this can happen if a login attempt failed
@@ -1274,7 +1272,7 @@ void LLVOAvatar::initClass()
void LLVOAvatar::cleanupClass()
{
deleteAndClear(sAvatarXmlInfo);
- sSkeletonXMLTree.cleanup();
+ sSkeletonXMLTree = NULL;
sXMLTree.cleanup();
}
@@ -1357,7 +1355,7 @@ void LLVOAvatar::initInstance(void)
if (LLCharacter::sInstances.size() == 1)
{
LLKeyframeMotion::setVFS(gStaticVFS);
- registerMotion( ANIM_AGENT_BUSY, LLNullMotion::create );
+ registerMotion( ANIM_AGENT_DO_NOT_DISTURB, LLNullMotion::create );
registerMotion( ANIM_AGENT_CROUCH, LLKeyframeStandMotion::create );
registerMotion( ANIM_AGENT_CROUCHWALK, LLKeyframeWalkMotion::create );
registerMotion( ANIM_AGENT_EXPRESS_AFRAID, LLEmote::create );
@@ -1739,38 +1737,42 @@ LLViewerObject* LLVOAvatar::lineSegmentIntersectRiggedAttachments(const LLVector
//-----------------------------------------------------------------------------
BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)
{
- LLMemType mt(LLMemType::MTYPE_AVATAR);
-
//-------------------------------------------------------------------------
// parse the file
//-------------------------------------------------------------------------
- BOOL parsesuccess = sSkeletonXMLTree.parseFile( filename, FALSE );
- if (!parsesuccess)
+ LLXMLNodePtr skeleton_xml;
+ BOOL parsesuccess = LLXMLNode::parseFile(filename, skeleton_xml, NULL);
+
+ if (!parsesuccess || skeleton_xml.isNull())
{
llerrs << "Can't parse skeleton file: " << filename << llendl;
return FALSE;
}
- // now sanity check xml file
- LLXmlTreeNode* root = sSkeletonXMLTree.getRoot();
- if (!root)
+ // Process XML data
+ if (sAvatarSkeletonInfo)
+ { //this can happen if a login attempt failed
+ delete sAvatarSkeletonInfo;
+ }
+ sAvatarSkeletonInfo = new LLVOAvatarSkeletonInfo;
+
+ LLXUIParser parser;
+ parser.readXUI(skeleton_xml, *sAvatarSkeletonInfo, filename);
+ if (!sAvatarSkeletonInfo->validateBlock())
{
- llerrs << "No root node found in avatar skeleton file: " << filename << llendl;
- return FALSE;
+ llerrs << "Error parsing skeleton XML file: " << filename << llendl;
}
- if( !root->hasName( "linden_skeleton" ) )
+ if( !skeleton_xml->hasName( "linden_skeleton" ) )
{
llerrs << "Invalid avatar skeleton file header: " << filename << llendl;
return FALSE;
}
- std::string version;
- static LLStdStringHandle version_string = LLXmlTree::addAttributeString("version");
- if( !root->getFastAttributeString( version_string, version ) || (version != "1.0") )
+ if (sAvatarSkeletonInfo->version() != "1.0")
{
- llerrs << "Invalid avatar skeleton file version: " << version << " in file: " << filename << llendl;
+ llerrs << "Invalid avatar skeleton file version: " << sAvatarSkeletonInfo->version() << " in file: " << filename << llendl;
return FALSE;
}
@@ -1779,14 +1781,11 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)
//-----------------------------------------------------------------------------
// setupBone()
-//-----------------------------------------------------------------------------
-BOOL LLVOAvatar::setupBone(const LLVOAvatarBoneInfo* info, LLViewerJoint* parent, S32 &volume_num, S32 &joint_num)
+//-----------------------------------------------------------
+BOOL LLVOAvatar::setupBone(const LLVOAvatarChildJoint& info, LLViewerJoint* parent, S32 &volume_num, S32 &joint_num)
{
- LLMemType mt(LLMemType::MTYPE_AVATAR);
-
LLViewerJoint* joint = NULL;
-
- if (info->mIsJoint)
+ if (info.bone.isChosen())
{
joint = (LLViewerJoint*)getCharacterJoint(joint_num);
if (!joint)
@@ -1794,7 +1793,23 @@ BOOL LLVOAvatar::setupBone(const LLVOAvatarBoneInfo* info, LLViewerJoint* parent
llwarns << "Too many bones" << llendl;
return FALSE;
}
- joint->setName( info->mName );
+ joint->setName( info.bone().name );
+ joint->setPosition(info.bone().pos);
+ joint->setRotation(mayaQ(info.bone().rot().mV[VX], info.bone().rot().mV[VY], info.bone().rot().mV[VZ], LLQuaternion::XYZ));
+ joint->setScale(info.bone().scale);
+ joint->setSkinOffset( info.bone().pivot );
+ joint_num++;
+
+ for (LLInitParam::ParamIterator<LLVOAvatarChildJoint>::const_iterator child_it = info.bone().children.begin(),
+ end_it = info.bone().children.end();
+ child_it != end_it;
+ ++child_it)
+ {
+ if (!setupBone(*child_it, joint, volume_num, joint_num))
+ {
+ return FALSE;
+ }
+ }
}
else // collision volume
{
@@ -1804,7 +1819,11 @@ BOOL LLVOAvatar::setupBone(const LLVOAvatarBoneInfo* info, LLViewerJoint* parent
return FALSE;
}
joint = (LLViewerJoint*)(&mCollisionVolumes[volume_num]);
- joint->setName( info->mName );
+ joint->setName( info.collision_volume.name);
+ joint->setPosition(info.collision_volume.pos);
+ joint->setRotation(mayaQ(info.collision_volume.rot().mV[VX], info.collision_volume.rot().mV[VY], info.collision_volume.rot().mV[VZ], LLQuaternion::XYZ));
+ joint->setScale(info.collision_volume.scale);
+ volume_num++;
}
// add to parent
@@ -1813,34 +1832,8 @@ BOOL LLVOAvatar::setupBone(const LLVOAvatarBoneInfo* info, LLViewerJoint* parent
parent->addChild( joint );
}
- joint->setPosition(info->mPos);
- joint->setRotation(mayaQ(info->mRot.mV[VX], info->mRot.mV[VY],
- info->mRot.mV[VZ], LLQuaternion::XYZ));
- joint->setScale(info->mScale);
-
joint->setDefaultFromCurrentXform();
- if (info->mIsJoint)
- {
- joint->setSkinOffset( info->mPivot );
- joint_num++;
- }
- else // collision volume
- {
- volume_num++;
- }
-
- // setup children
- LLVOAvatarBoneInfo::child_list_t::const_iterator iter;
- for (iter = info->mChildList.begin(); iter != info->mChildList.end(); ++iter)
- {
- LLVOAvatarBoneInfo *child_info = *iter;
- if (!setupBone(child_info, joint, volume_num, joint_num))
- {
- return FALSE;
- }
- }
-
return TRUE;
}
@@ -1849,41 +1842,35 @@ BOOL LLVOAvatar::setupBone(const LLVOAvatarBoneInfo* info, LLViewerJoint* parent
//-----------------------------------------------------------------------------
BOOL LLVOAvatar::buildSkeleton(const LLVOAvatarSkeletonInfo *info)
{
- LLMemType mt(LLMemType::MTYPE_AVATAR);
-
//-------------------------------------------------------------------------
// allocate joints
//-------------------------------------------------------------------------
- if (!allocateCharacterJoints(info->mNumBones))
+ if (!allocateCharacterJoints(info->num_bones))
{
- llerrs << "Can't allocate " << info->mNumBones << " joints" << llendl;
+ llerrs << "Can't allocate " << info->num_bones() << " joints" << llendl;
return FALSE;
}
//-------------------------------------------------------------------------
// allocate volumes
//-------------------------------------------------------------------------
- if (info->mNumCollisionVolumes)
+ if (info->num_collision_volumes)
{
- if (!allocateCollisionVolumes(info->mNumCollisionVolumes))
+ if (!allocateCollisionVolumes(info->num_collision_volumes))
{
- llerrs << "Can't allocate " << info->mNumCollisionVolumes << " collision volumes" << llendl;
+ llerrs << "Can't allocate " << info->num_collision_volumes() << " collision volumes" << llendl;
return FALSE;
}
}
S32 current_joint_num = 0;
S32 current_volume_num = 0;
- LLVOAvatarSkeletonInfo::bone_info_list_t::const_iterator iter;
- for (iter = info->mBoneInfoList.begin(); iter != info->mBoneInfoList.end(); ++iter)
+
+ if (!setupBone(info->skeleton_root, NULL, current_volume_num, current_joint_num))
{
- LLVOAvatarBoneInfo *info = *iter;
- if (!setupBone(info, NULL, current_volume_num, current_joint_num))
- {
llerrs << "Error parsing bone in skeleton file" << llendl;
return FALSE;
}
- }
return TRUE;
}
@@ -1921,8 +1908,6 @@ void LLVOAvatar::startDefaultMotions()
//-----------------------------------------------------------------------------
void LLVOAvatar::buildCharacter()
{
- LLMemType mt(LLMemType::MTYPE_AVATAR);
-
//-------------------------------------------------------------------------
// remove all references to our existing skeleton
// so we can rebuild it
@@ -2072,8 +2057,6 @@ void LLVOAvatar::buildCharacter()
//-----------------------------------------------------------------------------
void LLVOAvatar::releaseMeshData()
{
- LLMemType mt(LLMemType::MTYPE_AVATAR);
-
if (sInstances.size() < AVATAR_RELEASE_THRESHOLD || mIsDummy)
{
return;
@@ -2096,15 +2079,15 @@ void LLVOAvatar::releaseMeshData()
LLFace* facep = mDrawable->getFace(0);
if (facep)
{
- facep->setSize(0, 0);
- for(S32 i = mNumInitFaces ; i < mDrawable->getNumFaces(); i++)
- {
- facep = mDrawable->getFace(i);
+ facep->setSize(0, 0);
+ for(S32 i = mNumInitFaces ; i < mDrawable->getNumFaces(); i++)
+ {
+ facep = mDrawable->getFace(i);
if (facep)
{
- facep->setSize(0, 0);
- }
- }
+ facep->setSize(0, 0);
+ }
+ }
}
}
@@ -2128,7 +2111,6 @@ void LLVOAvatar::releaseMeshData()
void LLVOAvatar::restoreMeshData()
{
llassert(!isSelf());
- LLMemType mt(LLMemType::MTYPE_AVATAR);
//llinfos << "Restoring" << llendl;
mMeshValid = TRUE;
@@ -2344,8 +2326,6 @@ U32 LLVOAvatar::processUpdateMessage(LLMessageSystem *mesgsys,
U32 block_num, const EObjectUpdateType update_type,
LLDataPacker *dp)
{
- LLMemType mt(LLMemType::MTYPE_AVATAR);
-
LLVector3 old_vel = getVelocity();
const BOOL has_name = !getNVPair("FirstName");
@@ -2353,11 +2333,11 @@ U32 LLVOAvatar::processUpdateMessage(LLMessageSystem *mesgsys,
U32 retval = LLViewerObject::processUpdateMessage(mesgsys, user_data, block_num, update_type, dp);
// Print out arrival information once we have name of avatar.
- if (has_name && getNVPair("FirstName"))
- {
- mDebugExistenceTimer.reset();
+ if (has_name && getNVPair("FirstName"))
+ {
+ mDebugExistenceTimer.reset();
debugAvatarRezTime("AvatarRezArrivedNotification","avatar arrived");
- }
+ }
if(retval & LLViewerObject::INVALID_UPDATE)
{
@@ -2425,7 +2405,6 @@ void LLVOAvatar::dumpAnimationState()
//------------------------------------------------------------------------
void LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
{
- LLMemType mt(LLMemType::MTYPE_AVATAR);
LLFastTimer t(FTM_AVATAR_UPDATE);
if (isDead())
@@ -2866,8 +2845,8 @@ void LLVOAvatar::idleUpdateLoadingEffect()
{
LL_INFOS("Avatar") << avString() << "self isFullyLoaded, mFirstFullyVisible" << LL_ENDL;
mFirstFullyVisible = FALSE;
- LLAppearanceMgr::instance().onFirstFullyVisible();
- }
+ LLAppearanceMgr::instance().onFirstFullyVisible();
+ }
if (isFullyLoaded() && mFirstFullyVisible && !isSelf())
{
LL_INFOS("Avatar") << avString() << "other isFullyLoaded, mFirstFullyVisible" << LL_ENDL;
@@ -3021,7 +3000,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
mVisibleChat = visible_chat;
new_name = TRUE;
}
-
+
if (sRenderGroupTitles != mRenderGroupTitles)
{
mRenderGroupTitles = sRenderGroupTitles;
@@ -3064,7 +3043,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
if (!mNameText)
{
mNameText = static_cast<LLHUDNameTag*>( LLHUDObject::addHUDObject(
- LLHUDObject::LL_HUD_NAME_TAG) );
+ LLHUDObject::LL_HUD_NAME_TAG) );
//mNameText->setMass(10.f);
mNameText->setSourceObject(this);
mNameText->setVertAlignment(LLHUDNameTag::ALIGN_VERT_TOP);
@@ -3073,10 +3052,9 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
mNameText->setFadeDistance(CHAT_NORMAL_RADIUS, 5.f);
sNumVisibleChatBubbles++;
new_name = TRUE;
- }
+ }
- LLVector3 name_position = idleUpdateNameTagPosition(root_pos_last);
- mNameText->setPositionAgent(name_position);
+ idleUpdateNameTagPosition(root_pos_last);
idleUpdateNameTagText(new_name);
idleUpdateNameTagAlpha(new_name, alpha);
}
@@ -3091,7 +3069,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
if (!firstname || !lastname) return;
bool is_away = mSignaledAnimations.find(ANIM_AGENT_AWAY) != mSignaledAnimations.end();
- bool is_busy = mSignaledAnimations.find(ANIM_AGENT_BUSY) != mSignaledAnimations.end();
+ bool is_do_not_disturb = mSignaledAnimations.find(ANIM_AGENT_DO_NOT_DISTURB) != mSignaledAnimations.end();
bool is_appearance = mSignaledAnimations.find(ANIM_AGENT_CUSTOMIZE) != mSignaledAnimations.end();
bool is_muted;
if (isSelf())
@@ -3119,11 +3097,12 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
// Rebuild name tag if state change detected
if (mNameString.empty()
+ || (mNameString.size() == 2 && mNameString[0] == 10 && mNameString[1] == 10) // *TODO : find out why mNameString is sometimes ""
|| new_name
|| (!title && !mTitle.empty())
|| (title && mTitle != title->getString())
|| is_away != mNameAway
- || is_busy != mNameBusy
+ || is_do_not_disturb != mNameDoNotDisturb
|| is_muted != mNameMute
|| is_appearance != mNameAppearance
|| is_friend != mNameFriend
@@ -3133,7 +3112,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
clearNameTag();
- if (is_away || is_muted || is_busy || is_appearance)
+ if (is_away || is_muted || is_do_not_disturb || is_appearance)
{
std::string line;
if (is_away)
@@ -3141,9 +3120,9 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
line += LLTrans::getString("AvatarAway");
line += ", ";
}
- if (is_busy)
+ if (is_do_not_disturb)
{
- line += LLTrans::getString("AvatarBusy");
+ line += LLTrans::getString("AvatarDoNotDisturb");
line += ", ";
}
if (is_muted)
@@ -3164,7 +3143,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
// trim last ", "
line.resize( line.length() - 2 );
addNameTagLine(line, name_tag_color, LLFontGL::NORMAL,
- LLFontGL::getFontSansSerifSmall());
+ LLFontGL::getFontSansSerifSmall());
}
if (sRenderGroupTitles
@@ -3173,48 +3152,46 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
std::string title_str = title->getString();
LLStringFn::replace_ascii_controlchars(title_str,LL_UNKNOWN_CHAR);
addNameTagLine(title_str, name_tag_color, LLFontGL::NORMAL,
- LLFontGL::getFontSansSerifSmall());
+ LLFontGL::getFontSansSerifSmall());
}
static LLUICachedControl<bool> show_display_names("NameTagShowDisplayNames");
static LLUICachedControl<bool> show_usernames("NameTagShowUsernames");
- if (LLAvatarNameCache::useDisplayNames())
+ if (LLAvatarName::useDisplayNames())
{
LLAvatarName av_name;
if (!LLAvatarNameCache::get(getID(), &av_name))
{
- // ...call this function back when the name arrives
- // and force a rebuild
- LLAvatarNameCache::get(getID(),
- boost::bind(&LLVOAvatar::clearNameTag, this));
+ // Force a rebuild at next idle
+ // Note: do not connect a callback on idle().
+ clearNameTag();
}
// Might be blank if name not available yet, that's OK
if (show_display_names)
{
- addNameTagLine(av_name.mDisplayName, name_tag_color, LLFontGL::NORMAL,
- LLFontGL::getFontSansSerif());
+ addNameTagLine(av_name.getDisplayName(), name_tag_color, LLFontGL::NORMAL,
+ LLFontGL::getFontSansSerif());
}
// Suppress SLID display if display name matches exactly (ugh)
- if (show_usernames && !av_name.mIsDisplayNameDefault)
+ if (show_usernames && !av_name.isDisplayNameDefault())
{
// *HACK: Desaturate the color
LLColor4 username_color = name_tag_color * 0.83f;
- addNameTagLine(av_name.mUsername, username_color, LLFontGL::NORMAL,
- LLFontGL::getFontSansSerifSmall());
+ addNameTagLine(av_name.getUserName(), username_color, LLFontGL::NORMAL,
+ LLFontGL::getFontSansSerifSmall());
}
}
else
{
const LLFontGL* font = LLFontGL::getFontSansSerif();
- std::string full_name =
- LLCacheName::buildFullName( firstname->getString(), lastname->getString() );
+ std::string full_name = LLCacheName::buildFullName( firstname->getString(), lastname->getString() );
addNameTagLine(full_name, name_tag_color, LLFontGL::NORMAL, font);
}
mNameAway = is_away;
- mNameBusy = is_busy;
+ mNameDoNotDisturb = is_do_not_disturb;
mNameMute = is_muted;
mNameAppearance = is_appearance;
mNameFriend = is_friend;
@@ -3229,7 +3206,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
mNameText->setFont(LLFontGL::getFontSansSerif());
mNameText->setTextAlignment(LLHUDNameTag::ALIGN_TEXT_LEFT);
mNameText->setFadeDistance(CHAT_NORMAL_RADIUS * 2.f, 5.f);
-
+
char line[MAX_STRING]; /* Flawfinder: ignore */
line[0] = '\0';
std::deque<LLChat>::iterator chat_iter = mChats.begin();
@@ -3249,13 +3226,13 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
LLFontGL::StyleFlags style;
switch(chat_iter->mChatType)
{
- case CHAT_TYPE_WHISPER:
+ case CHAT_TYPE_WHISPER:
style = LLFontGL::ITALIC;
break;
- case CHAT_TYPE_SHOUT:
+ case CHAT_TYPE_SHOUT:
style = LLFontGL::BOLD;
break;
- default:
+ default:
style = LLFontGL::NORMAL;
break;
}
@@ -3282,13 +3259,13 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
S32 dot_count = (llfloor(mTypingTimer.getElapsedTimeF32() * 3.f) + 2) % 3 + 1;
switch(dot_count)
{
- case 1:
+ case 1:
mNameText->addLine(".", new_chat);
break;
- case 2:
+ case 2:
mNameText->addLine("..", new_chat);
break;
- case 3:
+ case 3:
mNameText->addLine("...", new_chat);
break;
}
@@ -3327,6 +3304,7 @@ void LLVOAvatar::clearNameTag()
mNameText->setLabel("");
mNameText->setString( "" );
}
+ mTimeVisible.reset();
}
//static
@@ -3352,34 +3330,45 @@ void LLVOAvatar::invalidateNameTags()
if (avatar->isDead()) continue;
avatar->clearNameTag();
-
}
}
// Compute name tag position during idle update
-LLVector3 LLVOAvatar::idleUpdateNameTagPosition(const LLVector3& root_pos_last)
+void LLVOAvatar::idleUpdateNameTagPosition(const LLVector3& root_pos_last)
{
LLQuaternion root_rot = mRoot.getWorldRotation();
+ LLQuaternion inv_root_rot = ~root_rot;
LLVector3 pixel_right_vec;
LLVector3 pixel_up_vec;
LLViewerCamera::getInstance()->getPixelVectors(root_pos_last, pixel_up_vec, pixel_right_vec);
LLVector3 camera_to_av = root_pos_last - LLViewerCamera::getInstance()->getOrigin();
camera_to_av.normalize();
- LLVector3 local_camera_at = camera_to_av * ~root_rot;
+ LLVector3 local_camera_at = camera_to_av * inv_root_rot;
LLVector3 local_camera_up = camera_to_av % LLViewerCamera::getInstance()->getLeftAxis();
local_camera_up.normalize();
- local_camera_up = local_camera_up * ~root_rot;
+ local_camera_up = local_camera_up * inv_root_rot;
+
+ LLVector3 avatar_ellipsoid(mBodySize.mV[VX] * 0.4f,
+ mBodySize.mV[VY] * 0.4f,
+ mBodySize.mV[VZ] * NAMETAG_VERT_OFFSET_WEIGHT);
- local_camera_up.scaleVec(mBodySize * 0.5f);
- local_camera_at.scaleVec(mBodySize * 0.5f);
+ local_camera_up.scaleVec(avatar_ellipsoid);
+ local_camera_at.scaleVec(avatar_ellipsoid);
+
+ LLVector3 head_offset = (mHeadp->getLastWorldPosition() - mRoot.getLastWorldPosition()) * inv_root_rot;
+
+ if (dist_vec(head_offset, mTargetRootToHeadOffset) > NAMETAG_UPDATE_THRESHOLD)
+ {
+ mTargetRootToHeadOffset = head_offset;
+ }
+
+ mCurRootToHeadOffset = lerp(mCurRootToHeadOffset, mTargetRootToHeadOffset, LLCriticalDamp::getInterpolant(0.2f));
- LLVector3 name_position = mRoot.getWorldPosition();
- name_position[VZ] -= mPelvisToFoot;
- name_position[VZ] += (mBodySize[VZ]* 0.55f);
+ LLVector3 name_position = mRoot.getLastWorldPosition() + (mCurRootToHeadOffset * root_rot);
name_position += (local_camera_up * root_rot) - (projected_vec(local_camera_at * root_rot, camera_to_av));
- name_position += pixel_up_vec * 15.f;
+ name_position += pixel_up_vec * NAMETAG_VERTICAL_SCREEN_OFFSET;
- return name_position;
+ mNameText->setPositionAgent(name_position);
}
void LLVOAvatar::idleUpdateNameTagAlpha(BOOL new_name, F32 alpha)
@@ -3402,20 +3391,18 @@ LLColor4 LLVOAvatar::getNameTagColor(bool is_friend)
{
color_name = "NameTagFriend";
}
- else if (LLAvatarNameCache::useDisplayNames())
+ else if (LLAvatarName::useDisplayNames())
{
- // ...color based on whether username "matches" a computed display
- // name
+ // ...color based on whether username "matches" a computed display name
LLAvatarName av_name;
- if (LLAvatarNameCache::get(getID(), &av_name)
- && av_name.mIsDisplayNameDefault)
+ if (LLAvatarNameCache::get(getID(), &av_name) && av_name.isDisplayNameDefault())
{
color_name = "NameTagMatch";
}
else
{
color_name = "NameTagMismatch";
- }
+ }
}
else
{
@@ -3452,9 +3439,9 @@ bool LLVOAvatar::isVisuallyMuted() const
static LLCachedControl<U32> max_attachment_bytes(gSavedSettings, "RenderAutoMuteByteLimit");
static LLCachedControl<F32> max_attachment_area(gSavedSettings, "RenderAutoMuteSurfaceAreaLimit");
- return LLMuteList::getInstance()->isMuted(getID()) ||
- (mAttachmentGeometryBytes > max_attachment_bytes && max_attachment_bytes > 0) ||
- (mAttachmentSurfaceArea > max_attachment_area && max_attachment_area > 0.f);
+ return LLMuteList::getInstance()->isMuted(getID())
+ || (mAttachmentGeometryBytes > max_attachment_bytes && max_attachment_bytes > 0)
+ || (mAttachmentSurfaceArea > max_attachment_area && max_attachment_area > 0.f);
}
//------------------------------------------------------------------------
@@ -3463,8 +3450,6 @@ bool LLVOAvatar::isVisuallyMuted() const
//------------------------------------------------------------------------
BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
{
- LLMemType mt(LLMemType::MTYPE_AVATAR);
-
// clear debug text
mDebugText.clear();
if (LLVOAvatar::sShowAnimationDebug)
@@ -3495,8 +3480,6 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
}
}
- LLVector3d root_pos_global;
-
if (!mIsBuilt)
{
return FALSE;
@@ -3511,7 +3494,6 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
mTimeVisible.reset();
}
-
//--------------------------------------------------------------------
// the rest should only be done occasionally for far away avatars
//--------------------------------------------------------------------
@@ -3914,10 +3896,6 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
if ( playSound )
{
-// F32 gain = clamp_rescale( mSpeedAccum,
-// AUDIO_STEP_LO_SPEED, AUDIO_STEP_HI_SPEED,
-// AUDIO_STEP_LO_GAIN, AUDIO_STEP_HI_GAIN );
-
const F32 STEP_VOLUME = 0.1f;
const LLUUID& step_sound_id = getStepSound();
@@ -4134,13 +4112,6 @@ void LLVOAvatar::updateVisibility()
{
releaseMeshData();
}
- // this breaks off-screen chat bubbles
- //if (mNameText)
- //{
- // mNameText->markDead();
- // mNameText = NULL;
- // sNumVisibleChatBubbles--;
- //}
}
mVisible = visible;
@@ -4156,46 +4127,6 @@ bool LLVOAvatar::shouldAlphaMask()
}
-U32 LLVOAvatar::renderSkinnedAttachments()
-{
- /*U32 num_indices = 0;
-
- const U32 data_mask = LLVertexBuffer::MAP_VERTEX |
- LLVertexBuffer::MAP_NORMAL |
- LLVertexBuffer::MAP_TEXCOORD0 |
- LLVertexBuffer::MAP_COLOR |
- LLVertexBuffer::MAP_WEIGHT4;
-
- for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin();
- iter != mAttachmentPoints.end();
- ++iter)
- {
- LLViewerJointAttachment* attachment = iter->second;
- for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
- attachment_iter != attachment->mAttachedObjects.end();
- ++attachment_iter)
- {
- const LLViewerObject* attached_object = (*attachment_iter);
- if (attached_object && !attached_object->isHUDAttachment())
- {
- const LLDrawable* drawable = attached_object->mDrawable;
- if (drawable)
- {
- for (S32 i = 0; i < drawable->getNumFaces(); ++i)
- {
- LLFace* face = drawable->getFace(i);
- if (face->isState(LLFace::RIGGED))
- {
-
- }
- }
- }
- }
-
- return num_indices;*/
- return 0;
-}
-
//-----------------------------------------------------------------------------
// renderSkinned()
//-----------------------------------------------------------------------------
@@ -4216,11 +4147,11 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
{ //LOD changed or new mesh created, allocate new vertex buffer if needed
if (needs_rebuild || mDirtyMesh >= 2 || mVisibilityRank <= 4)
{
- updateMeshData();
+ updateMeshData();
mDirtyMesh = 0;
- mNeedsSkin = TRUE;
- mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY);
- }
+ mNeedsSkin = TRUE;
+ mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY);
+ }
}
if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) <= 0)
@@ -4249,13 +4180,13 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
if (face)
{
LLVertexBuffer* vb = face->getVertexBuffer();
- if (vb)
- {
- vb->flush();
- }
+ if (vb)
+ {
+ vb->flush();
}
}
}
+ }
else
{
mNeedsSkin = FALSE;
@@ -4421,7 +4352,9 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass)
}
// Can't test for baked hair being defined, since that won't always be the case (not all viewers send baked hair)
// TODO: 1.25 will be able to switch this logic back to calling isTextureVisible();
- if (getImage(TEX_HAIR_BAKED, 0)->getID() != IMG_INVISIBLE || LLDrawPoolAlpha::sShowDebugAlpha)
+
+ if ( getImage(TEX_HAIR_BAKED, 0)
+ && getImage(TEX_HAIR_BAKED, 0)->getID() != IMG_INVISIBLE || LLDrawPoolAlpha::sShowDebugAlpha)
{
num_indices += mMeshLOD[MESH_ID_HAIR]->render(mAdjustedPixelArea, first_pass, mIsDummy);
first_pass = FALSE;
@@ -4565,7 +4498,20 @@ void LLVOAvatar::updateTextures()
LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)texture_index);
U32 num_wearables = gAgentWearables.getWearableCount(wearable_type);
const LLTextureEntry *te = getTE(texture_index);
- const F32 texel_area_ratio = fabs(te->mScaleS * te->mScaleT);
+
+ // getTE can return 0.
+ // Not sure yet why it does, but of course it crashes when te->mScale? gets used.
+ // Put safeguard in place so this corner case get better handling and does not result in a crash.
+ F32 texel_area_ratio = 1.0f;
+ if( te )
+ {
+ texel_area_ratio = fabs(te->mScaleS * te->mScaleT);
+ }
+ else
+ {
+ llwarns << "getTE( " << texture_index << " ) returned 0" <<llendl;
+ }
+
LLViewerFetchedTexture *imagep = NULL;
for (U32 wearable_index = 0; wearable_index < num_wearables; wearable_index++)
{
@@ -4793,8 +4739,6 @@ const LLUUID& LLVOAvatar::getStepSound() const
//-----------------------------------------------------------------------------
void LLVOAvatar::processAnimationStateChanges()
{
- LLMemType mt(LLMemType::MTYPE_AVATAR);
-
if ( isAnyAnimationSignaled(AGENT_WALK_ANIMS, NUM_AGENT_WALK_ANIMS) )
{
startMotion(ANIM_AGENT_WALK_ADJUST);
@@ -4885,8 +4829,6 @@ void LLVOAvatar::processAnimationStateChanges()
//-----------------------------------------------------------------------------
BOOL LLVOAvatar::processSingleAnimationStateChange( const LLUUID& anim_id, BOOL start )
{
- LLMemType mt(LLMemType::MTYPE_AVATAR);
-
BOOL result = FALSE;
if ( start ) // start animation
@@ -5021,8 +4963,6 @@ LLUUID LLVOAvatar::remapMotionID(const LLUUID& id)
//-----------------------------------------------------------------------------
BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset)
{
- LLMemType mt(LLMemType::MTYPE_AVATAR);
-
lldebugs << "motion requested " << id.asString() << " " << gAnimLibrary.animationName(id) << llendl;
LLUUID remap_id = remapMotionID(id);
@@ -5851,8 +5791,6 @@ BOOL LLVOAvatar::isActive() const
//-----------------------------------------------------------------------------
void LLVOAvatar::setPixelAreaAndAngle(LLAgent &agent)
{
- LLMemType mt(LLMemType::MTYPE_AVATAR);
-
if (mDrawable.isNull())
{
return;
@@ -5898,7 +5836,6 @@ BOOL LLVOAvatar::updateJointLODs()
F32 avatar_num_factor = clamp_rescale((F32)sNumVisibleAvatars, 8, 25, 1.f, avatar_num_min_factor);
F32 area_scale = 0.16f;
- {
if (isSelf())
{
if(gAgentCamera.cameraCustomizeAvatar() || gAgentCamera.cameraMouselook())
@@ -5928,7 +5865,6 @@ BOOL LLVOAvatar::updateJointLODs()
dirtyMesh(2);
return TRUE;
}
- }
return FALSE;
}
@@ -6217,14 +6153,9 @@ void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO )
if ( pVObj )
{
const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( pVObj->getVolume()->getParams().getSculptID(), pVObj );
- if ( pSkinData )
- {
- const int jointCnt = pSkinData->mJointNames.size();
- bool fullRig = ( jointCnt>=20 ) ? true : false;
- if ( fullRig )
- {
- const int bindCnt = pSkinData->mAlternateBindMatrix.size();
- if ( bindCnt > 0 )
+ if (pSkinData
+ && pSkinData->mJointNames.size() > 20 // full rig
+ && pSkinData->mAlternateBindMatrix.size() > 0)
{
LLVOAvatar::resetJointPositionsToDefault();
//Need to handle the repositioning of the cam, updating rig data etc during outfit editing
@@ -6239,8 +6170,6 @@ void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO )
}
}
}
- }
-}
//-----------------------------------------------------------------------------
// detachObject()
//-----------------------------------------------------------------------------
@@ -6389,11 +6318,7 @@ void LLVOAvatar::getOffObject()
at_axis.mV[VZ] = 0.f;
at_axis.normalize();
gAgent.resetAxes(at_axis);
-
- //reset orientation
-// mRoot.setRotation(avWorldRot);
gAgentCamera.setThirdPersonHeadOffset(LLVector3(0.f, 0.f, 1.f));
-
gAgentCamera.setSitCamera(LLUUID::null);
}
}
@@ -6443,7 +6368,6 @@ LLColor4 LLVOAvatar::getGlobalColor( const std::string& color_name ) const
}
else
{
-// return LLColor4( .5f, .5f, .5f, .5f );
return LLColor4( 0.f, 1.f, 1.f, 1.f ); // good debugging color
}
}
@@ -6608,8 +6532,8 @@ BOOL LLVOAvatar::processFullyLoadedChange(bool loading)
mFullyLoaded = (mFullyLoadedTimer.getElapsedTimeF32() > PAUSE);
- if (!mPreviousFullyLoaded && !loading && mFullyLoaded)
- {
+ if (!mPreviousFullyLoaded && !loading && mFullyLoaded)
+ {
debugAvatarRezTime("AvatarRezNotification","fully loaded");
}
@@ -7202,10 +7126,6 @@ LLBBox LLVOAvatar::getHUDBBox() const
return bbox;
}
-void LLVOAvatar::rebuildHUD()
-{
-}
-
//-----------------------------------------------------------------------------
// onFirstTEMessageReceived()
//-----------------------------------------------------------------------------
@@ -7297,8 +7217,6 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
return;
}
- LLMemType mt(LLMemType::MTYPE_AVATAR);
-
BOOL is_first_appearance_message = !mFirstAppearanceMessageReceived;
mFirstAppearanceMessageReceived = TRUE;
@@ -7331,7 +7249,10 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
&& baked_index != BAKED_SKIRT)
{
setTEImage(mBakedTextureDatas[baked_index].mTextureIndex,
- LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureIndex, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
+ LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureIndex,
+ TRUE,
+ LLViewerTexture::BOOST_NONE,
+ LLViewerTexture::LOD_TEXTURE));
}
}
@@ -7499,7 +7420,6 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture
if (!userdata) return;
//llinfos << "onBakedTextureMasksLoaded: " << src_vi->getID() << llendl;
- const LLMemType mt(LLMemType::MTYPE_AVATAR);
const LLUUID id = src_vi->getID();
LLTextureMaskData* maskData = (LLTextureMaskData*) userdata;
@@ -7590,7 +7510,7 @@ void LLVOAvatar::onInitialBakedTextureLoaded( BOOL success, LLViewerFetchedTextu
LLUUID *avatar_idp = (LLUUID *)userdata;
LLVOAvatar *selfp = (LLVOAvatar *)gObjectList.findObject(*avatar_idp);
-
+
if (selfp)
{
LL_DEBUGS("Avatar") << selfp->avString() << "discard_level " << discard_level << " success " << success << " final " << final << LL_ENDL;
@@ -7641,13 +7561,6 @@ void LLVOAvatar::onBakedTextureLoaded(BOOL success,
// Called when baked texture is loaded and also when we start up with a baked texture
void LLVOAvatar::useBakedTexture( const LLUUID& id )
{
-
-
- /* if(id == head_baked->getID())
- mHeadBakedLoaded = TRUE;
- mLastHeadBakedID = id;
- mHeadMesh0.setTexture( head_baked );
- mHeadMesh1.setTexture( head_baked ); */
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
{
LLViewerTexture* image_baked = getImage( mBakedTextureDatas[i].mTextureIndex, 0 );
@@ -7891,111 +7804,111 @@ LLVOAvatar::LLVOAvatarXmlInfo::~LLVOAvatarXmlInfo()
std::for_each(mMorphMaskInfoList.begin(), mMorphMaskInfoList.end(), DeletePointer());
}
-//-----------------------------------------------------------------------------
-// LLVOAvatarBoneInfo::parseXml()
-//-----------------------------------------------------------------------------
-BOOL LLVOAvatarBoneInfo::parseXml(LLXmlTreeNode* node)
-{
- if (node->hasName("bone"))
- {
- mIsJoint = TRUE;
- static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name");
- if (!node->getFastAttributeString(name_string, mName))
- {
- llwarns << "Bone without name" << llendl;
- return FALSE;
- }
- }
- else if (node->hasName("collision_volume"))
- {
- mIsJoint = FALSE;
- static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name");
- if (!node->getFastAttributeString(name_string, mName))
- {
- mName = "Collision Volume";
- }
- }
- else
- {
- llwarns << "Invalid node " << node->getName() << llendl;
- return FALSE;
- }
-
- static LLStdStringHandle pos_string = LLXmlTree::addAttributeString("pos");
- if (!node->getFastAttributeVector3(pos_string, mPos))
- {
- llwarns << "Bone without position" << llendl;
- return FALSE;
- }
-
- static LLStdStringHandle rot_string = LLXmlTree::addAttributeString("rot");
- if (!node->getFastAttributeVector3(rot_string, mRot))
- {
- llwarns << "Bone without rotation" << llendl;
- return FALSE;
- }
-
- static LLStdStringHandle scale_string = LLXmlTree::addAttributeString("scale");
- if (!node->getFastAttributeVector3(scale_string, mScale))
- {
- llwarns << "Bone without scale" << llendl;
- return FALSE;
- }
-
- if (mIsJoint)
- {
- static LLStdStringHandle pivot_string = LLXmlTree::addAttributeString("pivot");
- if (!node->getFastAttributeVector3(pivot_string, mPivot))
- {
- llwarns << "Bone without pivot" << llendl;
- return FALSE;
- }
- }
-
- // parse children
- LLXmlTreeNode* child;
- for( child = node->getFirstChild(); child; child = node->getNextChild() )
- {
- LLVOAvatarBoneInfo *child_info = new LLVOAvatarBoneInfo;
- if (!child_info->parseXml(child))
- {
- delete child_info;
- return FALSE;
- }
- mChildList.push_back(child_info);
- }
- return TRUE;
-}
-
-//-----------------------------------------------------------------------------
-// LLVOAvatarSkeletonInfo::parseXml()
-//-----------------------------------------------------------------------------
-BOOL LLVOAvatarSkeletonInfo::parseXml(LLXmlTreeNode* node)
-{
- static LLStdStringHandle num_bones_string = LLXmlTree::addAttributeString("num_bones");
- if (!node->getFastAttributeS32(num_bones_string, mNumBones))
- {
- llwarns << "Couldn't find number of bones." << llendl;
- return FALSE;
- }
-
- static LLStdStringHandle num_collision_volumes_string = LLXmlTree::addAttributeString("num_collision_volumes");
- node->getFastAttributeS32(num_collision_volumes_string, mNumCollisionVolumes);
-
- LLXmlTreeNode* child;
- for( child = node->getFirstChild(); child; child = node->getNextChild() )
- {
- LLVOAvatarBoneInfo *info = new LLVOAvatarBoneInfo;
- if (!info->parseXml(child))
- {
- delete info;
- llwarns << "Error parsing bone in skeleton file" << llendl;
- return FALSE;
- }
- mBoneInfoList.push_back(info);
- }
- return TRUE;
-}
+////-----------------------------------------------------------------------------
+//// LLVOAvatarBoneInfo::parseXml()
+////-----------------------------------------------------------------------------
+//BOOL LLVOAvatarBoneInfo::parseXml(LLXmlTreeNode* node)
+//{
+// if (node->hasName("bone"))
+// {
+// mIsJoint = TRUE;
+// static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name");
+// if (!node->getFastAttributeString(name_string, mName))
+// {
+// llwarns << "Bone without name" << llendl;
+// return FALSE;
+// }
+// }
+// else if (node->hasName("collision_volume"))
+// {
+// mIsJoint = FALSE;
+// static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name");
+// if (!node->getFastAttributeString(name_string, mName))
+// {
+// mName = "Collision Volume";
+// }
+// }
+// else
+// {
+// llwarns << "Invalid node " << node->getName() << llendl;
+// return FALSE;
+// }
+//
+// static LLStdStringHandle pos_string = LLXmlTree::addAttributeString("pos");
+// if (!node->getFastAttributeVector3(pos_string, mPos))
+// {
+// llwarns << "Bone without position" << llendl;
+// return FALSE;
+// }
+//
+// static LLStdStringHandle rot_string = LLXmlTree::addAttributeString("rot");
+// if (!node->getFastAttributeVector3(rot_string, mRot))
+// {
+// llwarns << "Bone without rotation" << llendl;
+// return FALSE;
+// }
+//
+// static LLStdStringHandle scale_string = LLXmlTree::addAttributeString("scale");
+// if (!node->getFastAttributeVector3(scale_string, mScale))
+// {
+// llwarns << "Bone without scale" << llendl;
+// return FALSE;
+// }
+//
+// if (mIsJoint)
+// {
+// static LLStdStringHandle pivot_string = LLXmlTree::addAttributeString("pivot");
+// if (!node->getFastAttributeVector3(pivot_string, mPivot))
+// {
+// llwarns << "Bone without pivot" << llendl;
+// return FALSE;
+// }
+// }
+//
+// // parse children
+// LLXmlTreeNode* child;
+// for( child = node->getFirstChild(); child; child = node->getNextChild() )
+// {
+// LLVOAvatarBoneInfo *child_info = new LLVOAvatarBoneInfo;
+// if (!child_info->parseXml(child))
+// {
+// delete child_info;
+// return FALSE;
+// }
+// mChildList.push_back(child_info);
+// }
+// return TRUE;
+//}
+//
+////-----------------------------------------------------------------------------
+//// LLVOAvatarSkeletonInfo::parseXml()
+////-----------------------------------------------------------------------------
+//BOOL LLVOAvatarSkeletonInfo::parseXml(LLXmlTreeNode* node)
+//{
+// static LLStdStringHandle num_bones_string = LLXmlTree::addAttributeString("num_bones");
+// if (!node->getFastAttributeS32(num_bones_string, mNumBones))
+// {
+// llwarns << "Couldn't find number of bones." << llendl;
+// return FALSE;
+// }
+//
+// static LLStdStringHandle num_collision_volumes_string = LLXmlTree::addAttributeString("num_collision_volumes");
+// node->getFastAttributeS32(num_collision_volumes_string, mNumCollisionVolumes);
+//
+// LLXmlTreeNode* child;
+// for( child = node->getFirstChild(); child; child = node->getNextChild() )
+// {
+// LLVOAvatarBoneInfo *info = new LLVOAvatarBoneInfo;
+// if (!info->parseXml(child))
+// {
+// delete info;
+// llwarns << "Error parsing bone in skeleton file" << llendl;
+// return FALSE;
+// }
+// mBoneInfoList.push_back(info);
+// }
+// return TRUE;
+//}
//-----------------------------------------------------------------------------
// parseXmlSkeletonNode(): parses <skeleton> nodes from XML tree
@@ -8705,6 +8618,12 @@ BOOL LLVOAvatar::isTextureDefined(LLVOAvatarDefines::ETextureIndex te, U32 index
return FALSE;
}
+ if( !getImage( te, index ) )
+ {
+ llwarns << "getImage( " << te << ", " << index << " ) returned 0" << llendl;
+ return FALSE;
+ }
+
return (getImage(te, index)->getID() != IMG_DEFAULT_AVATAR &&
getImage(te, index)->getID() != IMG_DEFAULT);
}
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 1adb680962..c59a3a150c 100755..100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -67,8 +67,9 @@ class LLVoiceVisualizer;
class LLHUDNameTag;
class LLHUDEffectSpiral;
class LLTexGlobalColor;
-class LLVOAvatarBoneInfo;
-class LLVOAvatarSkeletonInfo;
+struct LLVOAvatarBoneInfo;
+struct LLVOAvatarChildJoint;
+struct LLVOAvatarSkeletonInfo;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// LLVOAvatar
@@ -243,7 +244,7 @@ public:
void idleUpdateWindEffect();
void idleUpdateNameTag(const LLVector3& root_pos_last);
void idleUpdateNameTagText(BOOL new_name);
- LLVector3 idleUpdateNameTagPosition(const LLVector3& root_pos_last);
+ void idleUpdateNameTagPosition(const LLVector3& root_pos_last);
void idleUpdateNameTagAlpha(BOOL new_name, F32 alpha);
LLColor4 getNameTagColor(bool is_friend);
void clearNameTag();
@@ -363,6 +364,8 @@ public:
F32 mLastPelvisToFoot;
F32 mPelvisFixup;
F32 mLastPelvisFixup;
+ LLVector3 mCurRootToHeadOffset;
+ LLVector3 mTargetRootToHeadOffset;
LLVector3 mHeadOffset; // current head position
LLViewerJoint mRoot;
@@ -375,7 +378,7 @@ protected:
void buildCharacter();
virtual BOOL loadAvatar();
- BOOL setupBone(const LLVOAvatarBoneInfo* info, LLViewerJoint* parent, S32 &current_volume_num, S32 &current_joint_num);
+ BOOL setupBone(const LLVOAvatarChildJoint& info, LLViewerJoint* parent, S32 &current_volume_num, S32 &current_joint_num);
BOOL buildSkeleton(const LLVOAvatarSkeletonInfo *info);
private:
BOOL mIsBuilt; // state of deferred character building
@@ -419,7 +422,7 @@ public:
//--------------------------------------------------------------------
private:
static LLXmlTree sXMLTree; // avatar config file
- static LLXmlTree sSkeletonXMLTree; // avatar skeleton file
+ static LLXMLNodePtr sSkeletonXMLTree; // avatar skeleton file
/** Skeleton
** **
@@ -437,7 +440,6 @@ public:
U32 renderRigid();
U32 renderSkinned(EAvatarRenderPass pass);
F32 getLastSkinTime() { return mLastSkinTime; }
- U32 renderSkinnedAttachments();
U32 renderTransparent(BOOL first_pass);
void renderCollisionVolumes();
static void deleteCachedImages(bool clearAll=true);
@@ -786,7 +788,6 @@ public:
public:
BOOL hasHUDAttachment() const;
LLBBox getHUDBBox() const;
- void rebuildHUD();
void resetHUDAttachments();
BOOL canAttachMoreObjects() const;
BOOL canAttachMoreObjects(U32 n) const;
@@ -941,7 +942,7 @@ private:
std::string mNameString; // UTF-8 title + name + status
std::string mTitle;
bool mNameAway;
- bool mNameBusy;
+ bool mNameDoNotDisturb;
bool mNameMute;
bool mNameAppearance;
bool mNameFriend;
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 7a81063f83..e32fd3c3c8 100755..100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -257,8 +257,6 @@ BOOL LLVOAvatarSelf::loadAvatarSelf()
BOOL LLVOAvatarSelf::buildSkeletonSelf(const LLVOAvatarSkeletonInfo *info)
{
- LLMemType mt(LLMemType::MTYPE_AVATAR);
-
// add special-purpose "screen" joint
mScreenp = new LLViewerJoint("mScreen", NULL);
// for now, put screen at origin, as it is only used during special
@@ -652,8 +650,6 @@ BOOL LLVOAvatarSelf::loadLayersets()
// virtual
BOOL LLVOAvatarSelf::updateCharacter(LLAgent &agent)
{
- LLMemType mt(LLMemType::MTYPE_AVATAR);
-
// update screen joint size
if (mScreenp)
{
@@ -1008,8 +1004,6 @@ void LLVOAvatarSelf::idleUpdateTractorBeam()
// virtual
void LLVOAvatarSelf::restoreMeshData()
{
- LLMemType mt(LLMemType::MTYPE_AVATAR);
-
//llinfos << "Restoring" << llendl;
mMeshValid = TRUE;
updateJointLODs();
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index 7bd0c0bf93..7bd0c0bf93 100755..100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp
index 566c33c0af..4dca87652d 100644
--- a/indra/newview/llvograss.cpp
+++ b/indra/newview/llvograss.cpp
@@ -675,7 +675,6 @@ static LLFastTimer::DeclareTimer FTM_REBUILD_GRASS_VB("Grass VB");
void LLGrassPartition::getGeometry(LLSpatialGroup* group)
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
LLFastTimer ftm(FTM_REBUILD_GRASS_VB);
std::sort(mFaceList.begin(), mFaceList.end(), LLFace::CompareDistanceGreater());
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index bd12328a6b..ceff75a0cc 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -414,7 +414,7 @@ void LLVoiceChannel::doSetState(const EState& new_state)
mState = new_state;
if (!mStateChangedCallback.empty())
- mStateChangedCallback(old_state, mState, mCallDirection, mCallEndedByAgent);
+ mStateChangedCallback(old_state, mState, mCallDirection, mCallEndedByAgent, mSessionID);
}
//static
diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h
index b8597ee5cb..fed44974fd 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -52,7 +52,7 @@ public:
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;
+ typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state, const EDirection& direction, bool ended_by_agent, const LLUUID& session_id)> state_changed_signal_t;
// on current channel changed signal
typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t;
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 730f022c50..b46c55321c 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -541,6 +541,7 @@ void LLVoiceClient::setMuteMic(bool muted)
{
mMuteMic = muted;
updateMicMuteLogic();
+ mMicroChangedSignal();
}
@@ -551,6 +552,7 @@ void LLVoiceClient::setUserPTTState(bool ptt)
{
mUserPTTState = ptt;
updateMicMuteLogic();
+ mMicroChangedSignal();
}
bool LLVoiceClient::getUserPTTState()
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index c9aeea35a9..714dd6a9f2 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -303,6 +303,9 @@ public:
LLVoiceClient();
~LLVoiceClient();
+ typedef boost::signals2::signal<void(void)> micro_changed_signal_t;
+ micro_changed_signal_t mMicroChangedSignal;
+
void init(LLPumpIO *pump); // Call this once at application startup (creates connector)
void terminate(); // Call this to clean up during shutdown
@@ -401,6 +404,8 @@ public:
void keyUp(KEY key, MASK mask);
void middleMouseState(bool down);
+ boost::signals2::connection MicroChangedCallback(const micro_changed_signal_t::slot_type& cb ) { return mMicroChangedSignal.connect(cb); }
+
/////////////////////////////
// Accessors for data related to nearby speakers
@@ -456,6 +461,7 @@ protected:
LLVoiceModuleInterface* mVoiceModule;
LLPumpIO *m_servicePump;
+
LLCachedControl<bool> mVoiceEffectEnabled;
LLCachedControl<std::string> mVoiceEffectDefault;
diff --git a/indra/newview/llvoicevisualizer.cpp b/indra/newview/llvoicevisualizer.cpp
index 47060720e7..b497f80560 100644
--- a/indra/newview/llvoicevisualizer.cpp
+++ b/indra/newview/llvoicevisualizer.cpp
@@ -73,17 +73,6 @@ const F32 DEFAULT_MAXIMUM_GESTICULATION_AMPLITUDE = 1.0f;
const F32 ONE_HALF = 1.0f; // to clarify intent and reduce magic numbers in the code.
const LLVector3 WORLD_UPWARD_DIRECTION = LLVector3( 0.0f, 0.0f, 1.0f ); // Z is up in SL
-
-//------------------------------------------------------------------
-// handles parameter updates
-//------------------------------------------------------------------
-static bool handleVoiceVisualizerPrefsChanged(const LLSD& newvalue)
-{
- // Note: Ignore the specific event value, we look up the ones we want
- LLVoiceVisualizer::setPreferences();
- return true;
-}
-
//------------------------------------------------------------------
// Initialize the statics
//------------------------------------------------------------------
@@ -106,7 +95,7 @@ F32 LLVoiceVisualizer::sAahPowerTransfersf = 0.0f;
// constructor
//-----------------------------------------------
LLVoiceVisualizer::LLVoiceVisualizer( const U8 type )
-:LLHUDEffect( type )
+ : LLHUDEffect(type)
{
mCurrentTime = mTimer.getTotalSeconds();
mPreviousTime = mCurrentTime;
@@ -150,12 +139,12 @@ LLVoiceVisualizer::LLVoiceVisualizer( const U8 type )
setPreferences();
// Set up our listener to get updates on all prefs values we care about.
- gSavedSettings.getControl("LipSyncEnabled")->getSignal()->connect(boost::bind(&handleVoiceVisualizerPrefsChanged, _2));
- gSavedSettings.getControl("LipSyncOohAahRate")->getSignal()->connect(boost::bind(&handleVoiceVisualizerPrefsChanged, _2));
- gSavedSettings.getControl("LipSyncOoh")->getSignal()->connect(boost::bind(&handleVoiceVisualizerPrefsChanged, _2));
- gSavedSettings.getControl("LipSyncAah")->getSignal()->connect(boost::bind(&handleVoiceVisualizerPrefsChanged, _2));
- gSavedSettings.getControl("LipSyncOohPowerTransfer")->getSignal()->connect(boost::bind(&handleVoiceVisualizerPrefsChanged, _2));
- gSavedSettings.getControl("LipSyncAahPowerTransfer")->getSignal()->connect(boost::bind(&handleVoiceVisualizerPrefsChanged, _2));
+ gSavedSettings.getControl("LipSyncEnabled")->getSignal()->connect(boost::bind(&LLVoiceVisualizer::handleVoiceVisualizerPrefsChanged, _2));
+ gSavedSettings.getControl("LipSyncOohAahRate")->getSignal()->connect(boost::bind(&LLVoiceVisualizer::handleVoiceVisualizerPrefsChanged, _2));
+ gSavedSettings.getControl("LipSyncOoh")->getSignal()->connect(boost::bind(&LLVoiceVisualizer::handleVoiceVisualizerPrefsChanged, _2));
+ gSavedSettings.getControl("LipSyncAah")->getSignal()->connect(boost::bind(&LLVoiceVisualizer::handleVoiceVisualizerPrefsChanged, _2));
+ gSavedSettings.getControl("LipSyncOohPowerTransfer")->getSignal()->connect(boost::bind(&LLVoiceVisualizer::handleVoiceVisualizerPrefsChanged, _2));
+ gSavedSettings.getControl("LipSyncAahPowerTransfer")->getSignal()->connect(boost::bind(&LLVoiceVisualizer::handleVoiceVisualizerPrefsChanged, _2));
sPrefsInitialized = true;
}
@@ -217,6 +206,15 @@ void LLVoiceVisualizer::setSpeakingAmplitude( F32 a )
}//---------------------------------------------------
+//------------------------------------------------------------------
+// handles parameter updates
+//------------------------------------------------------------------
+bool LLVoiceVisualizer::handleVoiceVisualizerPrefsChanged(const LLSD& newvalue)
+{
+ // Note: Ignore the specific event value, we look up the ones we want
+ LLVoiceVisualizer::setPreferences();
+ return true;
+}
//---------------------------------------------------
void LLVoiceVisualizer::setPreferences( )
@@ -526,10 +524,6 @@ void LLVoiceVisualizer::render()
}//---------------------------------------------------
-
-
-
-
//---------------------------------------------------
void LLVoiceVisualizer::setVoiceSourceWorldPosition( const LLVector3 &p )
{
@@ -615,11 +609,3 @@ void LLVoiceVisualizer::markDead()
LLHUDEffect::markDead();
}//------------------------------------------------------------------
-
-
-
-
-
-
-
-
diff --git a/indra/newview/llvoicevisualizer.h b/indra/newview/llvoicevisualizer.h
index e434c7f3f1..36c78252d1 100644
--- a/indra/newview/llvoicevisualizer.h
+++ b/indra/newview/llvoicevisualizer.h
@@ -71,10 +71,8 @@ class LLVoiceVisualizer : public LLHUDEffect
// public methods
//---------------------------------------------------
public:
- LLVoiceVisualizer ( const U8 type ); //constructor
+ LLVoiceVisualizer( const U8 type ); //constructor
~LLVoiceVisualizer(); //destructor
-
- friend class LLHUDObject;
void setVoiceSourceWorldPosition( const LLVector3 &p ); // this should be the position of the speaking avatar's head
void setMinGesticulationAmplitude( F32 ); // the lower range of meaningful amplitude for setting gesticulation level
@@ -85,8 +83,6 @@ class LLVoiceVisualizer : public LLHUDEffect
void setStopSpeaking(); // tell me when the av stops speaking
bool getCurrentlySpeaking(); // the get for the above set
VoiceGesticulationLevel getCurrentGesticulationLevel(); // based on voice amplitude, I'll give you the current "energy level" of avatar speech
- static void setPreferences( );
- static void lipStringToF32s ( std::string& in_string, F32*& out_F32s, U32& count_F32s ); // convert a string of digits to an array of floats
void lipSyncOohAah( F32& ooh, F32& aah );
void render(); // inherited from HUD Effect
void packData(LLMessageSystem *mesgsys); // inherited from HUD Effect
@@ -108,7 +104,10 @@ class LLVoiceVisualizer : public LLHUDEffect
// private members
//---------------------------------------------------
private:
-
+ static bool handleVoiceVisualizerPrefsChanged(const LLSD& newvalue);
+ static void setPreferences( );
+ static void lipStringToF32s ( std::string& in_string, F32*& out_F32s, U32& count_F32s ); // convert a string of digits to an array of floats
+
struct SoundSymbol
{
F32 mWaveExpansion [ NUM_VOICE_SYMBOL_WAVES ];
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 820d1d73e1..f3342b7ff1 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -34,6 +34,7 @@
#include "llvoavatarself.h"
#include "llbufferstream.h"
#include "llfile.h"
+#include "llmenugl.h"
#ifdef LL_STANDALONE
# include "expat.h"
#else
@@ -70,6 +71,9 @@
#define USE_SESSION_GROUPS 0
+extern LLMenuBarGL* gMenuBarView;
+extern void handle_voice_morphing_subscribe();
+
const F32 VOLUME_SCALE_VIVOX = 0.01f;
const F32 SPEAKING_TIMEOUT = 1.f;
@@ -291,6 +295,7 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() :
mCaptureDeviceDirty(false),
mRenderDeviceDirty(false),
mSpatialCoordsDirty(false),
+ mIsInitialized(false),
mMuteMic(false),
mMuteMicDirty(false),
@@ -315,7 +320,9 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() :
mCaptureBufferRecording(false),
mCaptureBufferRecorded(false),
mCaptureBufferPlaying(false),
- mPlayRequestCount(0)
+ mPlayRequestCount(0),
+
+ mAvatarNameCacheConnection()
{
mSpeakerVolume = scale_speaker_volume(0);
@@ -348,6 +355,10 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() :
LLVivoxVoiceClient::~LLVivoxVoiceClient()
{
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
}
//---------------------------------------------------
@@ -520,7 +531,7 @@ void LLVivoxVoiceClient::requestVoiceAccountProvision(S32 retries)
{
LLViewerRegion *region = gAgent.getRegion();
- if ( region && mVoiceEnabled )
+ if ( region && (mVoiceEnabled || !mIsInitialized))
{
std::string url =
region->getCapability("ProvisionVoiceAccountRequest");
@@ -691,7 +702,7 @@ void LLVivoxVoiceClient::stateMachine()
setVoiceEnabled(false);
}
- if(mVoiceEnabled)
+ if(mVoiceEnabled || !mIsInitialized)
{
updatePosition();
}
@@ -736,7 +747,7 @@ void LLVivoxVoiceClient::stateMachine()
//MARK: stateDisabled
case stateDisabled:
- if(mTuningMode || (mVoiceEnabled && !mAccountName.empty()))
+ if(mTuningMode || ((mVoiceEnabled || !mIsInitialized) && !mAccountName.empty()))
{
setState(stateStart);
}
@@ -891,7 +902,7 @@ void LLVivoxVoiceClient::stateMachine()
mTuningExitState = stateIdle;
setState(stateMicTuningStart);
}
- else if(!mVoiceEnabled)
+ else if(!mVoiceEnabled && mIsInitialized)
{
// We never started up the connector. This will shut down the daemon.
setState(stateConnectorStopped);
@@ -1085,7 +1096,7 @@ void LLVivoxVoiceClient::stateMachine()
//MARK: stateConnectorStart
case stateConnectorStart:
- if(!mVoiceEnabled)
+ if(!mVoiceEnabled && mIsInitialized)
{
// We were never logged in. This will shut down the connector.
setState(stateLoggedOut);
@@ -1103,7 +1114,7 @@ void LLVivoxVoiceClient::stateMachine()
//MARK: stateConnectorStarted
case stateConnectorStarted: // connector handle received
- if(!mVoiceEnabled)
+ if(!mVoiceEnabled && mIsInitialized)
{
// We were never logged in. This will shut down the connector.
setState(stateLoggedOut);
@@ -1247,7 +1258,7 @@ void LLVivoxVoiceClient::stateMachine()
//MARK: stateCreatingSessionGroup
case stateCreatingSessionGroup:
- if(mSessionTerminateRequested || !mVoiceEnabled)
+ if(mSessionTerminateRequested || !mVoiceEnabled && mIsInitialized)
{
// *TODO: Question: is this the right way out of this state
setState(stateSessionTerminated);
@@ -1263,7 +1274,7 @@ void LLVivoxVoiceClient::stateMachine()
//MARK: stateRetrievingParcelVoiceInfo
case stateRetrievingParcelVoiceInfo:
// wait until parcel voice info is received.
- if(mSessionTerminateRequested || !mVoiceEnabled)
+ if(mSessionTerminateRequested || !mVoiceEnabled && mIsInitialized)
{
// if a terminate request has been received,
// bail and go to the stateSessionTerminated
@@ -1283,7 +1294,7 @@ void LLVivoxVoiceClient::stateMachine()
// Otherwise, if you log in but don't join a proximal channel (such as when your login location has voice disabled), your friends list won't sync.
sendFriendsListUpdates();
- if(mSessionTerminateRequested || !mVoiceEnabled)
+ if(mSessionTerminateRequested || !mVoiceEnabled && mIsInitialized)
{
// TODO: Question: Is this the right way out of this state?
setState(stateSessionTerminated);
@@ -1364,7 +1375,7 @@ void LLVivoxVoiceClient::stateMachine()
}
// joinedAudioSession() will transition from here to stateSessionJoined.
- if(!mVoiceEnabled)
+ if(!mVoiceEnabled && mIsInitialized)
{
// User bailed out during connect -- jump straight to teardown.
setState(stateSessionTerminated);
@@ -1411,7 +1422,7 @@ void LLVivoxVoiceClient::stateMachine()
notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_JOINED);
}
- else if(!mVoiceEnabled)
+ else if(!mVoiceEnabled && mIsInitialized)
{
// User bailed out during connect -- jump straight to teardown.
setState(stateSessionTerminated);
@@ -1431,7 +1442,7 @@ void LLVivoxVoiceClient::stateMachine()
//MARK: stateRunning
case stateRunning: // steady state
// Disabling voice or disconnect requested.
- if(!mVoiceEnabled || mSessionTerminateRequested)
+ if(!mVoiceEnabled && mIsInitialized || mSessionTerminateRequested)
{
leaveAudioSession();
}
@@ -1478,6 +1489,8 @@ void LLVivoxVoiceClient::stateMachine()
mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS);
sendPositionalUpdate();
}
+
+ mIsInitialized = true;
}
break;
@@ -1511,7 +1524,7 @@ void LLVivoxVoiceClient::stateMachine()
// Always reset the terminate request flag when we get here.
mSessionTerminateRequested = false;
- if(mVoiceEnabled && !mRelogRequested)
+ if((mVoiceEnabled || !mIsInitialized) && !mRelogRequested)
{
// Just leaving a channel, go back to stateNoChannel (the "logged in but have no channel" state).
setState(stateNoChannel);
@@ -1539,7 +1552,7 @@ void LLVivoxVoiceClient::stateMachine()
mAccountHandle.clear();
cleanUp();
- if(mVoiceEnabled && !mRelogRequested)
+ if((mVoiceEnabled || !mIsInitialized) && !mRelogRequested)
{
// User was logged out, but wants to be logged in. Send a new login request.
setState(stateNeedsLogin);
@@ -2665,7 +2678,7 @@ void LLVivoxVoiceClient::checkFriend(const LLUUID& id)
// *NOTE: For now, we feed legacy names to Vivox because I don't know
// if their service can support a mix of new and old clients with
// different sorts of names.
- std::string name = av_name.getLegacyName();
+ std::string name = av_name.getAccountName();
const LLRelationship* relationInfo = LLAvatarTracker::instance().getBuddyInfo(id);
bool canSeeMeOnline = false;
@@ -3712,8 +3725,7 @@ void LLVivoxVoiceClient::participantUpdatedEvent(
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()
+ So, we have to call LLSpeakerMgr::update() here.
*/
LLVoiceChannel* voice_cnl = LLVoiceChannel::getCurrentVoiceChannel();
@@ -3939,7 +3951,7 @@ void LLVivoxVoiceClient::messageEvent(
sessionState *session = findSession(sessionHandle);
if(session)
{
- bool is_busy = gAgent.getBusy();
+ bool is_do_not_disturb = gAgent.isDoNotDisturb();
bool is_muted = LLMuteList::getInstance()->isMuted(session->mCallerID, session->mName, LLMute::flagTextChat);
bool is_linden = LLMuteList::getInstance()->isLinden(session->mName);
bool quiet_chat = false;
@@ -3953,10 +3965,10 @@ void LLVivoxVoiceClient::messageEvent(
chat.mFromName = session->mName;
chat.mSourceType = CHAT_SOURCE_AGENT;
- if(is_busy && !is_linden)
+ if(is_do_not_disturb && !is_linden)
{
quiet_chat = true;
- // TODO: Question: Return busy mode response here? Or maybe when session is started instead?
+ // TODO: Question: Return do not disturb mode response here? Or maybe when session is started instead?
}
LL_DEBUGS("Voice") << "adding message, name " << session->mName << " session " << session->mIMSessionID << ", target " << session->mCallerID << LL_ENDL;
@@ -3964,6 +3976,7 @@ void LLVivoxVoiceClient::messageEvent(
session->mCallerID,
session->mName.c_str(),
message.c_str(),
+ false,
LLStringUtil::null, // default arg
IM_NOTHING_SPECIAL, // default arg
0, // default arg
@@ -6189,18 +6202,19 @@ void LLVivoxVoiceClient::notifyFriendObservers()
void LLVivoxVoiceClient::lookupName(const LLUUID &id)
{
- LLAvatarNameCache::get(id,
- boost::bind(&LLVivoxVoiceClient::onAvatarNameCache,
- this, _1, _2));
+ if (mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+ mAvatarNameCacheConnection = LLAvatarNameCache::get(id, boost::bind(&LLVivoxVoiceClient::onAvatarNameCache, this, _1, _2));
}
void LLVivoxVoiceClient::onAvatarNameCache(const LLUUID& agent_id,
const LLAvatarName& av_name)
{
- // For Vivox, we use the legacy name because I'm uncertain whether or
- // not their service can tolerate switching to Username or Display Name
- std::string legacy_name = av_name.getLegacyName();
- avatarNameResolved(agent_id, legacy_name);
+ mAvatarNameCacheConnection.disconnect();
+ std::string display_name = av_name.getDisplayName();
+ avatarNameResolved(agent_id, display_name);
}
void LLVivoxVoiceClient::avatarNameResolved(const LLUUID &id, const std::string &name)
@@ -6729,10 +6743,106 @@ void LLVivoxVoiceClient::removeObserver(LLVoiceEffectObserver* observer)
mVoiceFontObservers.erase(observer);
}
+// method checks the item in VoiceMorphing menu for appropriate current voice font
+bool LLVivoxVoiceClient::onCheckVoiceEffect(const std::string& voice_effect_name)
+{
+ LLVoiceEffectInterface * effect_interfacep = LLVoiceClient::instance().getVoiceEffectInterface();
+ if (NULL != effect_interfacep)
+ {
+ const LLUUID& currect_voice_effect_id = effect_interfacep->getVoiceEffect();
+
+ if (currect_voice_effect_id.isNull())
+ {
+ if (voice_effect_name == "NoVoiceMorphing")
+ {
+ return true;
+ }
+ }
+ else
+ {
+ const LLSD& voice_effect_props = effect_interfacep->getVoiceEffectProperties(currect_voice_effect_id);
+ if (voice_effect_props["name"].asString() == voice_effect_name)
+ {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+// method changes voice font for selected VoiceMorphing menu item
+void LLVivoxVoiceClient::onClickVoiceEffect(const std::string& voice_effect_name)
+{
+ LLVoiceEffectInterface * effect_interfacep = LLVoiceClient::instance().getVoiceEffectInterface();
+ if (NULL != effect_interfacep)
+ {
+ if (voice_effect_name == "NoVoiceMorphing")
+ {
+ effect_interfacep->setVoiceEffect(LLUUID());
+ return;
+ }
+ const voice_effect_list_t& effect_list = effect_interfacep->getVoiceEffectList();
+ if (!effect_list.empty())
+ {
+ for (voice_effect_list_t::const_iterator it = effect_list.begin(); it != effect_list.end(); ++it)
+ {
+ if (voice_effect_name == it->first)
+ {
+ effect_interfacep->setVoiceEffect(it->second);
+ return;
+ }
+ }
+ }
+ }
+}
+
+// it updates VoiceMorphing menu items in accordance with purchased properties
+void LLVivoxVoiceClient::updateVoiceMorphingMenu()
+{
+ if (mVoiceFontListDirty)
+ {
+ LLVoiceEffectInterface * effect_interfacep = LLVoiceClient::instance().getVoiceEffectInterface();
+ if (effect_interfacep)
+ {
+ const voice_effect_list_t& effect_list = effect_interfacep->getVoiceEffectList();
+ if (!effect_list.empty())
+ {
+ LLMenuGL * voice_morphing_menup = gMenuBarView->findChildMenuByName("VoiceMorphing", TRUE);
+
+ if (NULL != voice_morphing_menup)
+ {
+ S32 items = voice_morphing_menup->getItemCount();
+ if (items > 0)
+ {
+ voice_morphing_menup->erase(1, items - 3, false);
+
+ S32 pos = 1;
+ for (voice_effect_list_t::const_iterator it = effect_list.begin(); it != effect_list.end(); ++it)
+ {
+ LLMenuItemCheckGL::Params p;
+ p.name = it->first;
+ p.label = it->first;
+ p.on_check.function(boost::bind(&LLVivoxVoiceClient::onCheckVoiceEffect, this, it->first));
+ p.on_click.function(boost::bind(&LLVivoxVoiceClient::onClickVoiceEffect, this, it->first));
+ LLMenuItemCheckGL * voice_effect_itemp = LLUICtrlFactory::create<LLMenuItemCheckGL>(p);
+ voice_morphing_menup->insert(pos++, voice_effect_itemp, false);
+ }
+
+ voice_morphing_menup->needsArrange();
+ }
+ }
+ }
+ }
+ }
+}
+
void LLVivoxVoiceClient::notifyVoiceFontObservers()
{
LL_DEBUGS("Voice") << "Notifying voice effect observers. Lists changed: " << mVoiceFontListDirty << LL_ENDL;
+ updateVoiceMorphingMenu();
+
for (voice_font_observer_set_t::iterator it = mVoiceFontObservers.begin();
it != mVoiceFontObservers.end();
)
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index 1142a1a49c..574027de42 100644
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -246,6 +246,8 @@ public:
//@}
+ bool onCheckVoiceEffect(const std::string& voice_effect_name);
+ void onClickVoiceEffect(const std::string& voice_effect_name);
protected:
//////////////////////
@@ -641,6 +643,7 @@ protected:
void lookupName(const LLUUID &id);
void onAvatarNameCache(const LLUUID& id, const LLAvatarName& av_name);
void avatarNameResolved(const LLUUID &id, const std::string &name);
+ boost::signals2::connection mAvatarNameCacheConnection;
/////////////////////////////
// Voice fonts
@@ -741,6 +744,8 @@ private:
std::string mRenderDevice;
bool mCaptureDeviceDirty;
bool mRenderDeviceDirty;
+
+ bool mIsInitialized;
bool checkParcelChanged(bool update = false);
@@ -851,6 +856,7 @@ private:
void accountGetTemplateFontsSendMessage();
void sessionSetVoiceFontSendMessage(sessionState *session);
+ void updateVoiceMorphingMenu();
void notifyVoiceFontObservers();
typedef enum e_voice_font_type
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index e4f9915e93..0b34bbb90f 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -152,8 +152,8 @@ bool ll_is_part_idx_allocated(S32 idx, S32* start, S32* end)
void LLVOPartGroup::freeVBSlot(S32 idx)
{
llassert(idx < LL_MAX_PARTICLE_COUNT && idx >= 0);
- llassert(sVBSlotCursor > sVBSlotFree);
- llassert(ll_is_part_idx_allocated(idx, sVBSlotCursor, sVBSlotFree+LL_MAX_PARTICLE_COUNT));
+ //llassert(sVBSlotCursor > sVBSlotFree);
+ //llassert(ll_is_part_idx_allocated(idx, sVBSlotCursor, sVBSlotFree+LL_MAX_PARTICLE_COUNT));
if (sVBSlotCursor > sVBSlotFree)
{
@@ -599,7 +599,6 @@ static LLFastTimer::DeclareTimer FTM_REBUILD_PARTICLE_GEOM("Particle Geom");
void LLParticlePartition::getGeometry(LLSpatialGroup* group)
{
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
LLFastTimer ftm(FTM_REBUILD_PARTICLE_GEOM);
std::sort(mFaceList.begin(), mFaceList.end(), LLFace::CompareDistanceGreater());
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index e99898a83c..d94cd01a0b 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -1138,17 +1138,29 @@ void LLVOVolume::sculpt()
S32 current_discard = getVolume()->getSculptLevel() ;
if(current_discard < -2)
{
- llwarns << "WARNING!!: Current discard of sculpty at " << current_discard
- << " is less than -2." << llendl;
+ static S32 low_sculpty_discard_warning_count = 100;
+ if (++low_sculpty_discard_warning_count >= 100)
+ { // Log first time, then every 100 afterwards otherwise this can flood the logs
+ llwarns << "WARNING!!: Current discard for sculpty " << mSculptTexture->getID()
+ << " at " << current_discard
+ << " is less than -2." << llendl;
+ low_sculpty_discard_warning_count = 0;
+ }
// corrupted volume... don't update the sculpty
return;
}
else if (current_discard > MAX_DISCARD_LEVEL)
{
- llwarns << "WARNING!!: Current discard of sculpty at " << current_discard
- << " is more than than allowed max of " << MAX_DISCARD_LEVEL << llendl;
-
+ static S32 high_sculpty_discard_warning_count = 100;
+ if (++high_sculpty_discard_warning_count >= 100)
+ { // Log first time, then every 100 afterwards otherwise this can flood the logs
+ llwarns << "WARNING!!: Current discard for sculpty " << mSculptTexture->getID()
+ << " at " << current_discard
+ << " is more than than allowed max of " << MAX_DISCARD_LEVEL << llendl;
+ high_sculpty_discard_warning_count = 0;
+ }
+
// corrupted volume... don't update the sculpty
return;
}
@@ -1227,6 +1239,13 @@ BOOL LLVOVolume::calcLOD()
if (mDrawable->isState(LLDrawable::RIGGED))
{
LLVOAvatar* avatar = getAvatar();
+
+ // Not sure how this can really happen, but alas it does. Better exit here than crashing.
+ if( !avatar || !avatar->mDrawable )
+ {
+ return FALSE;
+ }
+
distance = avatar->mDrawable->mDistanceWRTCamera;
radius = avatar->getBinRadius();
}
@@ -1335,7 +1354,8 @@ BOOL LLVOVolume::setDrawableParent(LLDrawable* parentp)
void LLVOVolume::updateFaceFlags()
{
- for (S32 i = 0; i < getVolume()->getNumFaces(); i++)
+ // There's no guarantee that getVolume()->getNumFaces() == mDrawable->getNumFaces()
+ for (S32 i = 0; i < getVolume()->getNumFaces() && i < mDrawable->getNumFaces(); i++)
{
LLFace *face = mDrawable->getFace(i);
if (face)
@@ -1436,7 +1456,10 @@ BOOL LLVOVolume::genBBoxes(BOOL force_global)
volume = getVolume();
}
- for (S32 i = 0; i < getVolume()->getNumVolumeFaces(); i++)
+ // There's no guarantee that getVolume()->getNumFaces() == mDrawable->getNumFaces()
+ for (S32 i = 0;
+ i < getVolume()->getNumVolumeFaces() && i < mDrawable->getNumFaces() && i < getNumTEs();
+ i++)
{
LLFace *face = mDrawable->getFace(i);
if (!face)
@@ -1472,7 +1495,7 @@ BOOL LLVOVolume::genBBoxes(BOOL force_global)
updateRadius();
mDrawable->movePartition();
-
+
return res;
}
@@ -1737,6 +1760,11 @@ BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)
void LLVOVolume::updateFaceSize(S32 idx)
{
+ if( mDrawable->getNumFaces() <= idx )
+ {
+ return;
+ }
+
LLFace* facep = mDrawable->getFace(idx);
if (facep)
{
@@ -2427,7 +2455,12 @@ void LLVOVolume::addMediaImpl(LLViewerMediaImpl* media_impl, S32 texture_index)
//add the face to show the media if it is in playing
if(mDrawable)
{
- LLFace* facep = mDrawable->getFace(texture_index) ;
+ LLFace* facep(NULL);
+ if( texture_index < mDrawable->getNumFaces() )
+ {
+ facep = mDrawable->getFace(texture_index) ;
+ }
+
if(facep)
{
LLViewerMediaTexture* media_tex = LLViewerTextureManager::findMediaTexture(mMediaImplList[texture_index]->getMediaTextureID()) ;
@@ -3562,7 +3595,6 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
if (LLFloater::isVisible(gFloaterTools) && getAvatar()->isSelf())
{
updateRiggedVolume();
- genBBoxes(FALSE);
volume = mRiggedVolume;
transform = false;
}
@@ -3826,6 +3858,7 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons
LLVector4a* pos = dst_face.mPositions;
+ if( pos && weight && dst_face.mExtents )
{
LLFastTimer t(FTM_SKIN_RIGGED);
@@ -3961,7 +3994,6 @@ static LLFastTimer::DeclareTimer FTM_REGISTER_FACE("Register Face");
void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, U32 type)
{
LLFastTimer t(FTM_REGISTER_FACE);
- LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
if (facep->getViewerObject()->isSelected() && LLSelectMgr::getInstance()->mHideSelectedObjects)
{
@@ -4004,10 +4036,6 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
else
{
model_mat = &(drawable->getRegion()->mRenderMatrix);
- if (model_mat->isIdentity())
- {
- model_mat = NULL;
- }
}
//drawable->getVObj()->setDebugText(llformat("%d", drawable->isState(LLDrawable::ANIMATED_CHILD)));
@@ -4888,11 +4916,19 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
facep->setTextureIndex(cur_tex);
texture_list.push_back(tex);
- //if (can_batch_texture(facep))
- {
+ if (can_batch_texture(facep))
+ { //populate texture_list with any textures that can be batched
+ //move i to the next unbatchable face
while (i != faces.end())
{
facep = *i;
+
+ if (!can_batch_texture(facep))
+ { //face is bump mapped or has an animated texture matrix -- can't
+ //batch more than 1 texture at a time
+ break;
+ }
+
if (facep->getTexture() != tex)
{
if (distance_sort)
@@ -4918,12 +4954,6 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
cur_tex++;
}
- if (!can_batch_texture(facep))
- { //face is bump mapped or has an animated texture matrix -- can't
- //batch more than 1 texture at a time
- break;
- }
-
if (cur_tex >= texture_index_channels)
{ //cut batches when index channels are depleted
break;
diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp
index a33f42cf84..7f17fd3e56 100644
--- a/indra/newview/llvowlsky.cpp
+++ b/indra/newview/llvowlsky.cpp
@@ -301,7 +301,7 @@ void LLVOWLSky::restoreGL()
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
}
-static LLFastTimer::DeclareTimer FTM_GEO_SKY("Sky Geometry");
+static LLFastTimer::DeclareTimer FTM_GEO_SKY("Windlight Sky Geometry");
BOOL LLVOWLSky::updateGeometry(LLDrawable * drawable)
{
diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp
index e386112334..4f52ff9778 100644
--- a/indra/newview/llwaterparammanager.cpp
+++ b/indra/newview/llwaterparammanager.cpp
@@ -100,7 +100,7 @@ void LLWaterParamManager::loadPresetsFromDir(const std::string& dir)
break; // no more files
}
- std::string path = dir + file;
+ std::string path = gDirUtilp->add(dir, file);
if (!loadPreset(path))
{
llwarns << "Error loading water preset from " << path << llendl;
diff --git a/indra/newview/llwlhandlers.cpp b/indra/newview/llwlhandlers.cpp
index 2425b96678..be3e3ff30e 100644
--- a/indra/newview/llwlhandlers.cpp
+++ b/indra/newview/llwlhandlers.cpp
@@ -105,10 +105,16 @@ LLEnvironmentRequestResponder::LLEnvironmentRequestResponder()
return;
}
- if (unvalidated_content[0]["regionID"].asUUID() != gAgent.getRegion()->getRegionID())
+ LLUUID regionId;
+ if( gAgent.getRegion() )
+ {
+ regionId = gAgent.getRegion()->getRegionID();
+ }
+
+ if (unvalidated_content[0]["regionID"].asUUID() != regionId )
{
LL_WARNS("WindlightCaps") << "Not in the region from where this data was received (wanting "
- << gAgent.getRegion()->getRegionID() << " but got " << unvalidated_content[0]["regionID"].asUUID()
+ << regionId << " but got " << unvalidated_content[0]["regionID"].asUUID()
<< ") - ignoring..." << LL_ENDL;
return;
}
diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp
index 49d9d44d74..6077208799 100644
--- a/indra/newview/llwlparammanager.cpp
+++ b/indra/newview/llwlparammanager.cpp
@@ -283,7 +283,7 @@ void LLWLParamManager::loadPresetsFromDir(const std::string& dir)
break; // no more files
}
- std::string path = dir + file;
+ std::string path = gDirUtilp->add(dir, file);
if (!loadPreset(path))
{
llwarns << "Error loading sky preset from " << path << llendl;
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 78ee3e4fd9..793becf0c8 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -138,7 +138,6 @@ void LLWorld::destroyClass()
LLViewerRegion* LLWorld::addRegion(const U64 &region_handle, const LLHost &host)
{
- LLMemType mt(LLMemType::MTYPE_REGIONS);
llinfos << "Add region with handle: " << region_handle << " on host " << host << llendl;
LLViewerRegion *regionp = getRegionFromHandle(region_handle);
if (regionp)
@@ -644,7 +643,6 @@ void LLWorld::updateVisibilities()
void LLWorld::updateRegions(F32 max_update_time)
{
- LLMemType mt_ur(LLMemType::MTYPE_IDLE_UPDATE_REGIONS);
LLTimer update_timer;
BOOL did_one = FALSE;
@@ -1194,7 +1192,7 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi
{
LLVOAvatar* pVOAvatar = (LLVOAvatar*) *iter;
- if (!pVOAvatar->isDead() && !pVOAvatar->isSelf())
+ if (!pVOAvatar->isDead() && !pVOAvatar->mIsDummy)
{
LLVector3d pos_global = pVOAvatar->getPositionGlobal();
LLUUID uuid = pVOAvatar->getID();
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index a3ccf87cfc..11b2770ec0 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -965,8 +965,6 @@ void LLWorldMapView::drawTracking(const LLVector3d& pos_global, const LLColor4&
S32 text_x = x;
S32 text_y = (S32)(y - sTrackCircleImage->getHeight()/2 - font->getLineHeight());
- BOOL is_in_window = true;
-
if( x < 0
|| y < 0
|| x >= getRect().getWidth()
@@ -979,7 +977,6 @@ void LLWorldMapView::drawTracking(const LLVector3d& pos_global, const LLColor4&
text_x = sTrackingArrowX;
text_y = sTrackingArrowY;
}
- is_in_window = false;
}
else if (LLTracker::getTrackingStatus() == LLTracker::TRACKING_LOCATION &&
LLTracker::getTrackedLocationType() != LLTracker::LOCATION_NOTHING)
@@ -1320,7 +1317,7 @@ void LLWorldMapView::drawTrackingCircle( const LLRect& rect, S32 x, S32 y, const
gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
- gGL.translatef((F32)x, (F32)y, 0.f);
+ gGL.translatef((F32)x * LLUI::sGLScaleFactor.mV[VX], (F32)y * LLUI::sGLScaleFactor.mV[VY], 0.f);
gl_washer_segment_2d(inner_radius, outer_radius, start_theta, end_theta, 40, color, color);
gGL.popMatrix();
diff --git a/indra/newview/macutil_Prefix.h b/indra/newview/macutil_Prefix.h
index fd8e927a08..b54a764a62 100644
--- a/indra/newview/macutil_Prefix.h
+++ b/indra/newview/macutil_Prefix.h
@@ -33,7 +33,7 @@
*/
#include <Carbon/Carbon.h>
+#include "fix_macros.h"
-#undef check
#undef verify
#undef require
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 920bac93a2..9f0e2906d0 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -35,7 +35,6 @@
#include "llviewercontrol.h"
#include "llfasttimer.h"
#include "llfontgl.h"
-#include "llmemtype.h"
#include "llnamevalue.h"
#include "llpointer.h"
#include "llprimitive.h"
@@ -464,8 +463,6 @@ void LLPipeline::connectRefreshCachedSettingsSafe(const std::string name)
void LLPipeline::init()
{
- LLMemType mt(LLMemType::MTYPE_PIPELINE_INIT);
-
refreshCachedSettings();
gOctreeMaxCapacity = gSavedSettings.getU32("OctreeMaxNodeCapacity");
@@ -706,6 +703,8 @@ void LLPipeline::cleanup()
mInitialized = FALSE;
mDeferredVB = NULL;
+
+ mCubeVB = NULL;
}
//============================================================================
@@ -762,7 +761,16 @@ void LLPipeline::resizeScreenTexture()
GLuint resX = gViewerWindow->getWorldViewWidthRaw();
GLuint resY = gViewerWindow->getWorldViewHeightRaw();
- allocateScreenBuffer(resX,resY);
+ if (!allocateScreenBuffer(resX,resY))
+ { //FAILSAFE: screen buffer allocation failed, disable deferred rendering if it's enabled
+ //NOTE: if the session closes successfully after this call, deferred rendering will be
+ // disabled on future sessions
+ if (LLPipeline::sRenderDeferred)
+ {
+ gSavedSettings.setBOOL("RenderDeferred", FALSE);
+ LLPipeline::refreshCachedSettings();
+ }
+ }
}
}
@@ -777,18 +785,57 @@ void LLPipeline::allocatePhysicsBuffer()
}
}
-void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
+bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
{
refreshCachedSettings();
- U32 samples = RenderFSAASamples;
+
+ bool save_settings = sRenderDeferred;
+ if (save_settings)
+ {
+ // Set this flag in case we crash while resizing window or allocating space for deferred rendering targets
+ gSavedSettings.setBOOL("RenderInitError", TRUE);
+ gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
+ }
+
+ eFBOStatus ret = doAllocateScreenBuffer(resX, resY);
+
+ if (save_settings)
+ {
+ // don't disable shaders on next session
+ gSavedSettings.setBOOL("RenderInitError", FALSE);
+ gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
+ }
+
+ if (ret == FBO_FAILURE)
+ { //FAILSAFE: screen buffer allocation failed, disable deferred rendering if it's enabled
+ //NOTE: if the session closes successfully after this call, deferred rendering will be
+ // disabled on future sessions
+ if (LLPipeline::sRenderDeferred)
+ {
+ gSavedSettings.setBOOL("RenderDeferred", FALSE);
+ LLPipeline::refreshCachedSettings();
+ }
+ }
+
+ return ret == FBO_SUCCESS_FULLRES;
+}
- //try to allocate screen buffers at requested resolution and samples
+
+LLPipeline::eFBOStatus LLPipeline::doAllocateScreenBuffer(U32 resX, U32 resY)
+{
+ // try to allocate screen buffers at requested resolution and samples
// - on failure, shrink number of samples and try again
// - if not multisampled, shrink resolution and try again (favor X resolution over Y)
// Make sure to call "releaseScreenBuffers" after each failure to cleanup the partially loaded state
+ U32 samples = RenderFSAASamples;
+
+ eFBOStatus ret = FBO_SUCCESS_FULLRES;
if (!allocateScreenBuffer(resX, resY, samples))
{
+ //failed to allocate at requested specification, return false
+ ret = FBO_FAILURE;
+
releaseScreenBuffers();
//reduce number of samples
while (samples > 0)
@@ -796,7 +843,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
samples /= 2;
if (allocateScreenBuffer(resX, resY, samples))
{ //success
- return;
+ return FBO_SUCCESS_LOWRES;
}
releaseScreenBuffers();
}
@@ -809,22 +856,23 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
resY /= 2;
if (allocateScreenBuffer(resX, resY, samples))
{
- return;
+ return FBO_SUCCESS_LOWRES;
}
releaseScreenBuffers();
resX /= 2;
if (allocateScreenBuffer(resX, resY, samples))
{
- return;
+ return FBO_SUCCESS_LOWRES;
}
releaseScreenBuffers();
}
llwarns << "Unable to allocate screen buffer at any resolution!" << llendl;
}
-}
+ return ret;
+}
bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
{
@@ -852,10 +900,6 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
if (LLPipeline::sRenderDeferred)
{
- // Set this flag in case we crash while resizing window or allocating space for deferred rendering targets
- gSavedSettings.setBOOL("RenderInitError", TRUE);
- gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
-
S32 shadow_detail = RenderShadowDetail;
BOOL ssao = RenderDeferredSSAO;
@@ -867,7 +911,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
if (!mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
if (samples > 0)
{
- if (!mFXAABuffer.allocate(nhpo2(resX), nhpo2(resY), GL_RGBA, FALSE, FALSE, LLTexUnit::TT_TEXTURE, FALSE, samples)) return false;
+ if (!mFXAABuffer.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_TEXTURE, FALSE, samples)) return false;
}
else
{
@@ -901,7 +945,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
}
}
- U32 width = nhpo2(U32(resX*scale))/2;
+ U32 width = (U32) (resX*scale);
U32 height = width;
if (shadow_detail > 1)
@@ -920,9 +964,11 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
}
}
- // don't disable shaders on next session
- gSavedSettings.setBOOL("RenderInitError", FALSE);
- gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
+ //HACK make screenbuffer allocations start failing after 30 seconds
+ if (gSavedSettings.getBOOL("SimulateFBOFailure"))
+ {
+ return false;
+ }
}
else
{
@@ -1127,7 +1173,6 @@ void LLPipeline::releaseScreenBuffers()
void LLPipeline::createGLBuffers()
{
stop_glerror();
- LLMemType mt_cb(LLMemType::MTYPE_PIPELINE_CREATE_BUFFERS);
assertInitialized();
updateRenderDeferred();
@@ -1264,7 +1309,6 @@ void LLPipeline::createLUTBuffers()
void LLPipeline::restoreGL()
{
- LLMemType mt_cb(LLMemType::MTYPE_PIPELINE_RESTORE_GL);
assertInitialized();
if (mVertexShadersEnabled)
@@ -1326,7 +1370,6 @@ BOOL LLPipeline::canUseAntiAliasing() const
void LLPipeline::unloadShaders()
{
- LLMemType mt_us(LLMemType::MTYPE_PIPELINE_UNLOAD_SHADERS);
LLViewerShaderMgr::instance()->unloadShaders();
mVertexShadersLoaded = 0;
@@ -1358,7 +1401,6 @@ S32 LLPipeline::getMaxLightingDetail() const
S32 LLPipeline::setLightingDetail(S32 level)
{
- LLMemType mt_ld(LLMemType::MTYPE_PIPELINE_LIGHTING_DETAIL);
refreshCachedSettings();
if (level < 0)
@@ -1520,7 +1562,6 @@ LLDrawPool *LLPipeline::findPool(const U32 type, LLViewerTexture *tex0)
LLDrawPool *LLPipeline::getPool(const U32 type, LLViewerTexture *tex0)
{
- LLMemType mt(LLMemType::MTYPE_PIPELINE);
LLDrawPool *poolp = findPool(type, tex0);
if (poolp)
{
@@ -1537,7 +1578,6 @@ LLDrawPool *LLPipeline::getPool(const U32 type, LLViewerTexture *tex0)
// static
LLDrawPool* LLPipeline::getPoolFromTE(const LLTextureEntry* te, LLViewerTexture* imagep)
{
- LLMemType mt(LLMemType::MTYPE_PIPELINE);
U32 type = getPoolTypeFromTE(te, imagep);
return gPipeline.getPool(type, imagep);
}
@@ -1545,8 +1585,6 @@ LLDrawPool* LLPipeline::getPoolFromTE(const LLTextureEntry* te, LLViewerTexture*
//static
U32 LLPipeline::getPoolTypeFromTE(const LLTextureEntry* te, LLViewerTexture* imagep)
{
- LLMemType mt_gpt(LLMemType::MTYPE_PIPELINE_GET_POOL_TYPE);
-
if (!te || !imagep)
{
return 0;
@@ -1575,7 +1613,6 @@ U32 LLPipeline::getPoolTypeFromTE(const LLTextureEntry* te, LLViewerTexture* ima
void LLPipeline::addPool(LLDrawPool *new_poolp)
{
- LLMemType mt_a(LLMemType::MTYPE_PIPELINE_ADD_POOL);
assertInitialized();
mPools.insert(new_poolp);
addToQuickLookup( new_poolp );
@@ -1583,7 +1620,6 @@ void LLPipeline::addPool(LLDrawPool *new_poolp)
void LLPipeline::allocDrawable(LLViewerObject *vobj)
{
- LLMemType mt_ad(LLMemType::MTYPE_PIPELINE_ALLOCATE_DRAWABLE);
LLDrawable *drawable = new LLDrawable();
vobj->mDrawable = drawable;
@@ -1697,8 +1733,6 @@ void LLPipeline::removeMutedAVsLights(LLVOAvatar* muted_avatar)
U32 LLPipeline::addObject(LLViewerObject *vobj)
{
- LLMemType mt_ao(LLMemType::MTYPE_PIPELINE_ADD_OBJECT);
-
if (RenderDelayCreation)
{
mCreateQ.push_back(vobj);
@@ -1714,7 +1748,6 @@ U32 LLPipeline::addObject(LLViewerObject *vobj)
void LLPipeline::createObjects(F32 max_dtime)
{
LLFastTimer ftm(FTM_PIPELINE_CREATE);
- LLMemType mt(LLMemType::MTYPE_PIPELINE_CREATE_OBJECTS);
LLTimer update_timer;
@@ -1900,7 +1933,6 @@ static LLFastTimer::DeclareTimer FTM_UPDATE_MOVE("Update Move");
void LLPipeline::updateMove()
{
LLFastTimer t(FTM_UPDATE_MOVE);
- LLMemType mt_um(LLMemType::MTYPE_PIPELINE_UPDATE_MOVE);
if (FreezeTime)
{
@@ -2009,6 +2041,7 @@ void LLPipeline::grabReferences(LLCullResult& result)
void LLPipeline::clearReferences()
{
sCull = NULL;
+ mGroupSaveQ1.clear();
}
void check_references(LLSpatialGroup* group, LLDrawable* drawable)
@@ -2253,7 +2286,6 @@ static LLFastTimer::DeclareTimer FTM_CULL("Object Culling");
void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip, LLPlane* planep)
{
LLFastTimer t(FTM_CULL);
- LLMemType mt_uc(LLMemType::MTYPE_PIPELINE_UPDATE_CULL);
grabReferences(result);
@@ -2328,7 +2360,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
bound_shader = true;
gOcclusionCubeProgram.bind();
}
-
+
if (sUseOcclusion > 1)
{
if (mCubeVB.isNull())
@@ -2506,7 +2538,7 @@ void LLPipeline::doOcclusion(LLCamera& camera)
{
gOcclusionCubeProgram.bind();
}
- }
+ }
if (mCubeVB.isNull())
{ //cube VB will be used for issuing occlusion queries
@@ -2563,11 +2595,6 @@ void LLPipeline::updateGL()
glu->mInQ = FALSE;
LLGLUpdate::sGLQ.pop_front();
}
-
- { //seed VBO Pools
- LLFastTimer t(FTM_SEED_VBO_POOLS);
- LLVertexBuffer::seedPools();
- }
}
{ //seed VBO Pools
@@ -2580,26 +2607,59 @@ static LLFastTimer::DeclareTimer FTM_REBUILD_PRIORITY_GROUPS("Rebuild Priority G
void LLPipeline::clearRebuildGroups()
{
+ LLSpatialGroup::sg_vector_t hudGroups;
+
mGroupQ1Locked = true;
// Iterate through all drawables on the priority build queue,
for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ1.begin();
iter != mGroupQ1.end(); ++iter)
{
LLSpatialGroup* group = *iter;
- group->clearState(LLSpatialGroup::IN_BUILD_Q1);
+
+ // If the group contains HUD objects, save the group
+ if (group->isHUDGroup())
+ {
+ hudGroups.push_back(group);
+ }
+ // Else, no HUD objects so clear the build state
+ else
+ {
+ group->clearState(LLSpatialGroup::IN_BUILD_Q1);
+ }
}
+
+ // Clear the group
mGroupQ1.clear();
+
+ // Copy the saved HUD groups back in
+ mGroupQ1.assign(hudGroups.begin(), hudGroups.end());
mGroupQ1Locked = false;
+ // Clear the HUD groups
+ hudGroups.clear();
+
mGroupQ2Locked = true;
for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ2.begin();
iter != mGroupQ2.end(); ++iter)
{
LLSpatialGroup* group = *iter;
- group->clearState(LLSpatialGroup::IN_BUILD_Q2);
- }
+ // If the group contains HUD objects, save the group
+ if (group->isHUDGroup())
+ {
+ hudGroups.push_back(group);
+ }
+ // Else, no HUD objects so clear the build state
+ else
+ {
+ group->clearState(LLSpatialGroup::IN_BUILD_Q2);
+ }
+ }
+ // Clear the group
mGroupQ2.clear();
+
+ // Copy the saved HUD groups back in
+ mGroupQ2.assign(hudGroups.begin(), hudGroups.end());
mGroupQ2Locked = false;
}
@@ -2607,7 +2667,6 @@ void LLPipeline::rebuildPriorityGroups()
{
LLFastTimer t(FTM_REBUILD_PRIORITY_GROUPS);
LLTimer update_timer;
- LLMemType mt(LLMemType::MTYPE_PIPELINE);
assertInitialized();
gMeshRepo.notifyLoadedMeshes();
@@ -2622,6 +2681,7 @@ void LLPipeline::rebuildPriorityGroups()
group->clearState(LLSpatialGroup::IN_BUILD_Q1);
}
+ mGroupSaveQ1 = mGroupQ1;
mGroupQ1.clear();
mGroupQ1Locked = false;
@@ -2678,7 +2738,6 @@ void LLPipeline::rebuildGroups()
void LLPipeline::updateGeom(F32 max_dtime)
{
LLTimer update_timer;
- LLMemType mt(LLMemType::MTYPE_PIPELINE_UPDATE_GEOM);
LLPointer<LLDrawable> drawablep;
LLFastTimer t(FTM_GEO_UPDATE);
@@ -2772,8 +2831,6 @@ void LLPipeline::updateGeom(F32 max_dtime)
void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)
{
- LLMemType mt(LLMemType::MTYPE_PIPELINE_MARK_VISIBLE);
-
if(drawablep && !drawablep->isDead())
{
if (drawablep->isSpatialBridge())
@@ -2813,8 +2870,6 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)
void LLPipeline::markMoved(LLDrawable *drawablep, BOOL damped_motion)
{
- LLMemType mt_mm(LLMemType::MTYPE_PIPELINE_MARK_MOVED);
-
if (!drawablep)
{
//llerrs << "Sending null drawable to moved list!" << llendl;
@@ -2859,8 +2914,6 @@ void LLPipeline::markMoved(LLDrawable *drawablep, BOOL damped_motion)
void LLPipeline::markShift(LLDrawable *drawablep)
{
- LLMemType mt(LLMemType::MTYPE_PIPELINE_MARK_SHIFT);
-
if (!drawablep || drawablep->isDead())
{
return;
@@ -2886,8 +2939,6 @@ static LLFastTimer::DeclareTimer FTM_SHIFT_HUD("Shift HUD");
void LLPipeline::shiftObjects(const LLVector3 &offset)
{
- LLMemType mt(LLMemType::MTYPE_PIPELINE_SHIFT_OBJECTS);
-
assertInitialized();
glClear(GL_DEPTH_BUFFER_BIT);
@@ -2941,8 +2992,6 @@ void LLPipeline::shiftObjects(const LLVector3 &offset)
void LLPipeline::markTextured(LLDrawable *drawablep)
{
- LLMemType mt(LLMemType::MTYPE_PIPELINE_MARK_TEXTURED);
-
if (drawablep && !drawablep->isDead() && assertInitialized())
{
mRetexturedList.insert(drawablep);
@@ -2993,8 +3042,6 @@ void LLPipeline::markMeshDirty(LLSpatialGroup* group)
void LLPipeline::markRebuild(LLSpatialGroup* group, BOOL priority)
{
- LLMemType mt(LLMemType::MTYPE_PIPELINE);
-
if (group && !group->isDead() && group->mSpatialPartition)
{
if (group->mSpatialPartition->mPartitionType == LLViewerRegion::PARTITION_HUD)
@@ -3034,8 +3081,6 @@ void LLPipeline::markRebuild(LLSpatialGroup* group, BOOL priority)
void LLPipeline::markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags flag, BOOL priority)
{
- LLMemType mt(LLMemType::MTYPE_PIPELINE_MARK_REBUILD);
-
if (drawablep && !drawablep->isDead() && assertInitialized())
{
if (!drawablep->isState(LLDrawable::BUILT))
@@ -3082,7 +3127,6 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
}
LLFastTimer ftm(FTM_STATESORT);
- LLMemType mt(LLMemType::MTYPE_PIPELINE_STATE_SORT);
//LLVertexBuffer::unbind();
@@ -3183,7 +3227,6 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
void LLPipeline::stateSort(LLSpatialGroup* group, LLCamera& camera)
{
- LLMemType mt(LLMemType::MTYPE_PIPELINE_STATE_SORT);
if (group->changeLOD())
{
for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i)
@@ -3202,7 +3245,6 @@ void LLPipeline::stateSort(LLSpatialGroup* group, LLCamera& camera)
void LLPipeline::stateSort(LLSpatialBridge* bridge, LLCamera& camera)
{
- LLMemType mt(LLMemType::MTYPE_PIPELINE_STATE_SORT);
if (bridge->getSpatialGroup()->changeLOD())
{
bool force_update = false;
@@ -3212,8 +3254,6 @@ void LLPipeline::stateSort(LLSpatialBridge* bridge, LLCamera& camera)
void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera)
{
- LLMemType mt(LLMemType::MTYPE_PIPELINE_STATE_SORT);
-
if (!drawablep
|| drawablep->isDead()
|| !hasRenderType(drawablep->getRenderType()))
@@ -3376,11 +3416,11 @@ void renderScriptedTouchBeacons(LLDrawable* drawablep)
if (facep)
{
gPipeline.mHighlightFaces.push_back(facep);
- }
}
}
}
}
+}
void renderPhysicalBeacons(LLDrawable* drawablep)
{
@@ -3405,11 +3445,11 @@ void renderPhysicalBeacons(LLDrawable* drawablep)
if (facep)
{
gPipeline.mHighlightFaces.push_back(facep);
- }
}
}
}
}
+}
void renderMOAPBeacons(LLDrawable* drawablep)
{
@@ -3445,11 +3485,11 @@ void renderMOAPBeacons(LLDrawable* drawablep)
if (facep)
{
gPipeline.mHighlightFaces.push_back(facep);
- }
}
}
}
}
+}
void renderParticleBeacons(LLDrawable* drawablep)
{
@@ -3474,11 +3514,11 @@ void renderParticleBeacons(LLDrawable* drawablep)
if (facep)
{
gPipeline.mHighlightFaces.push_back(facep);
- }
}
}
}
}
+}
void renderSoundHighlights(LLDrawable* drawablep)
{
@@ -3496,15 +3536,14 @@ void renderSoundHighlights(LLDrawable* drawablep)
if (facep)
{
gPipeline.mHighlightFaces.push_back(facep);
- }
}
}
}
}
+}
void LLPipeline::postSort(LLCamera& camera)
{
- LLMemType mt(LLMemType::MTYPE_PIPELINE_POST_SORT);
LLFastTimer ftm(FTM_STATESORT_POSTSORT);
assertInitialized();
@@ -3713,7 +3752,7 @@ void LLPipeline::postSort(LLCamera& camera)
if (facep)
{
gPipeline.mSelectedFaces.push_back(facep);
- }
+ }
}
return true;
}
@@ -3756,7 +3795,6 @@ void LLPipeline::postSort(LLCamera& camera)
void render_hud_elements()
{
- LLMemType mt_rhe(LLMemType::MTYPE_PIPELINE_RENDER_HUD_ELS);
LLFastTimer t(FTM_RENDER_UI);
gPipeline.disableLights();
@@ -3811,8 +3849,6 @@ void render_hud_elements()
void LLPipeline::renderHighlights()
{
- LLMemType mt(LLMemType::MTYPE_PIPELINE_RENDER_HL);
-
assertInitialized();
// Draw 3D UI elements here (before we clear the Z buffer in POOL_HUD)
@@ -3976,7 +4012,6 @@ U32 LLPipeline::sCurRenderPoolType = 0 ;
void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
{
- LLMemType mt(LLMemType::MTYPE_PIPELINE_RENDER_GEOM);
LLFastTimer t(FTM_RENDER_GEOMETRY);
assertInitialized();
@@ -4229,7 +4264,6 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)
{
LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderGeomDeferred");
- LLMemType mt_rgd(LLMemType::MTYPE_PIPELINE_RENDER_GEOM_DEFFERRED);
LLFastTimer t(FTM_RENDER_GEOMETRY);
LLFastTimer t2(FTM_DEFERRED_POOLS);
@@ -4326,7 +4360,6 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)
void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
{
- LLMemType mt_rgpd(LLMemType::MTYPE_PIPELINE_RENDER_GEOM_POST_DEF);
LLFastTimer t(FTM_POST_DEFERRED_POOLS);
U32 cur_type = 0;
@@ -4422,7 +4455,6 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
void LLPipeline::renderGeomShadow(LLCamera& camera)
{
- LLMemType mt_rgs(LLMemType::MTYPE_PIPELINE_RENDER_GEOM_SHADOW);
U32 cur_type = 0;
LLGLEnable cull(GL_CULL_FACE);
@@ -4576,8 +4608,6 @@ void LLPipeline::renderPhysicsDisplay()
void LLPipeline::renderDebug()
{
- LLMemType mt(LLMemType::MTYPE_PIPELINE);
-
assertInitialized();
bool hud_only = hasRenderType(LLPipeline::RENDER_TYPE_HUD);
@@ -5230,7 +5260,6 @@ static LLFastTimer::DeclareTimer FTM_REBUILD_POOLS("Rebuild Pools");
void LLPipeline::rebuildPools()
{
LLFastTimer t(FTM_REBUILD_POOLS);
- LLMemType mt(LLMemType::MTYPE_PIPELINE_REBUILD_POOLS);
assertInitialized();
@@ -5261,17 +5290,10 @@ void LLPipeline::rebuildPools()
}
max_count--;
}
-
- if (isAgentAvatarValid())
- {
- gAgentAvatarp->rebuildHUD();
- }
}
void LLPipeline::addToQuickLookup( LLDrawPool* new_poolp )
{
- LLMemType mt(LLMemType::MTYPE_PIPELINE_QUICK_LOOKUP);
-
assertInitialized();
switch( new_poolp->getType() )
@@ -5437,7 +5459,6 @@ void LLPipeline::removePool( LLDrawPool* poolp )
void LLPipeline::removeFromQuickLookup( LLDrawPool* poolp )
{
assertInitialized();
- LLMemType mt(LLMemType::MTYPE_PIPELINE);
switch( poolp->getType() )
{
case LLDrawPool::POOL_SIMPLE:
@@ -5753,7 +5774,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
// crazy cast so that we can overwrite the fade value
// even though gcc enforces sets as const
// (fade value doesn't affect sort so this is safe)
- Light* farthest_light = ((Light*) (&(*(mNearbyLights.rbegin()))));
+ Light* farthest_light = (const_cast<Light*>(&(*(mNearbyLights.rbegin()))));
if (light->dist < farthest_light->dist)
{
if (farthest_light->fade >= 0.f)
@@ -6096,7 +6117,7 @@ void LLPipeline::enableLightsPreview()
LLVector4 light_pos(dir0, 0.0f);
- LLLightState* light = gGL.getLight(0);
+ LLLightState* light = gGL.getLight(1);
light->enable();
light->setPosition(light_pos);
@@ -6108,7 +6129,7 @@ void LLPipeline::enableLightsPreview()
light_pos = LLVector4(dir1, 0.f);
- light = gGL.getLight(1);
+ light = gGL.getLight(2);
light->enable();
light->setPosition(light_pos);
light->setDiffuse(diffuse1);
@@ -6118,7 +6139,7 @@ void LLPipeline::enableLightsPreview()
light->setSpotCutoff(180.f);
light_pos = LLVector4(dir2, 0.f);
- light = gGL.getLight(2);
+ light = gGL.getLight(3);
light->enable();
light->setPosition(light_pos);
light->setDiffuse(diffuse2);
@@ -6784,7 +6805,7 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable)
}
void LLPipeline::resetVertexBuffers()
-{
+{
mResetVertexBuffers = true;
}
@@ -6860,7 +6881,6 @@ void LLPipeline::doResetVertexBuffers()
void LLPipeline::renderObjects(U32 type, U32 mask, BOOL texture, BOOL batch_texture)
{
- LLMemType mt_ro(LLMemType::MTYPE_PIPELINE_RENDER_OBJECTS);
assertInitialized();
gGL.loadMatrix(gGLModelView);
gGLLastMatrix = NULL;
@@ -6933,7 +6953,6 @@ static LLFastTimer::DeclareTimer FTM_RENDER_BLOOM("Bloom");
void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
{
- LLMemType mt_ru(LLMemType::MTYPE_PIPELINE_RENDER_BLOOM);
if (!(gPipeline.canUseVertexShaders() &&
sRenderGlow))
{
@@ -7085,11 +7104,11 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
gGlowProgram.unbind();
- if (LLRenderTarget::sUseFBO)
+ /*if (LLRenderTarget::sUseFBO)
{
LLFastTimer ftm(FTM_RENDER_BLOOM_FBO);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
- }
+ }*/
gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
@@ -7965,10 +7984,6 @@ void LLPipeline::renderDeferredLighting()
gGL.popMatrix();
stop_glerror();
- //copy depth and stencil from deferred screen
- //mScreen.copyContents(mDeferredScreen, 0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight(),
- // 0, 0, mScreen.getWidth(), mScreen.getHeight(), GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
-
mScreen.bindTarget();
// clear color buffer here - zeroing alpha (glow) is important or it will accumulate against sky
glClearColor(0,0,0,0);
@@ -8740,8 +8755,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
}
last_update = LLDrawPoolWater::sNeedsReflectionUpdate && LLDrawPoolWater::sNeedsDistortionUpdate;
- LLRenderTarget::unbindTarget();
-
LLPipeline::sReflectionRender = FALSE;
if (!LLRenderTarget::sUseFBO)
@@ -9999,7 +10012,6 @@ static LLFastTimer::DeclareTimer FTM_IMPOSTOR_RESIZE("Impostor Resize");
void LLPipeline::generateImpostor(LLVOAvatar* avatar)
{
- LLMemType mt_gi(LLMemType::MTYPE_PIPELINE_GENERATE_IMPOSTOR);
LLGLState::checkStates();
LLGLState::checkTextureChannels();
LLGLState::checkClientArrays();
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index fd2a1e06cd..36abeca295 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -119,8 +119,25 @@ public:
void createGLBuffers();
void createLUTBuffers();
- void allocateScreenBuffer(U32 resX, U32 resY);
+ //allocate the largest screen buffer possible up to resX, resY
+ //returns true if full size buffer allocated, false if some other size is allocated
+ bool allocateScreenBuffer(U32 resX, U32 resY);
+
+ typedef enum {
+ FBO_SUCCESS_FULLRES = 0,
+ FBO_SUCCESS_LOWRES,
+ FBO_FAILURE
+ } eFBOStatus;
+
+private:
+ //implementation of above, wrapped for easy error handling
+ eFBOStatus doAllocateScreenBuffer(U32 resX, U32 resY);
+public:
+
+ //attempt to allocate screen buffers at resX, resY
+ //returns true if allocation successful, false otherwise
bool allocateScreenBuffer(U32 resX, U32 resY, U32 samples);
+
void allocatePhysicsBuffer();
void resetVertexBuffers(LLDrawable* drawable);
@@ -668,6 +685,8 @@ protected:
LLSpatialGroup::sg_vector_t mGroupQ1; //priority
LLSpatialGroup::sg_vector_t mGroupQ2; // non-priority
+ LLSpatialGroup::sg_vector_t mGroupSaveQ1; // a place to save mGroupQ1 until it is safe to unref
+
LLSpatialGroup::sg_vector_t mMeshDirtyGroup; //groups that need rebuildMesh called
U32 mMeshDirtyQueryObject;
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index 9bf2922033..0de217fc0d 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -1,103 +1,106 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<colors>
- <!-- Named Colors -->
- <color
- name="EmphasisColor"
- value="0.38 0.694 0.573 1" />
- <color
- name="EmphasisColor_13"
- value="0.38 0.694 0.573 0.13" />
- <color
- name="EmphasisColor_35"
- value="0.38 0.694 0.573 0.35" />
- <color
- name="White"
- value="1 1 1 1" />
- <color
- name="White_05"
- value="1 1 1 0.05" />
- <color
- name="White_10"
- value="1 1 1 0.1" />
- <color
- name="White_25"
- value="1 1 1 0.25" />
- <color
- name="White_50"
- value="1 1 1 0.5" />
- <color
- name="LtGray"
- value="0.75 0.75 0.75 1" />
- <color
- name="LtGray_35"
- value="0.75 0.75 0.75 0.35" />
- <color
- name="LtGray_50"
- value="0.75 0.75 0.75 0.50" />
- <color
- name="Gray"
- value="0.5 0.5 0.5 1" />
- <color
- name="DkGray"
- value="0.125 0.125 0.125 1" />
- <color
- name="DkGray_66"
- value="0.125 0.125 0.125 .66" />
- <color
- name="DkGray2"
- value="0.169 0.169 0.169 1" />
- <color
- name="MouseGray"
- value="0.191 0.191 0.191 1" />
- <color
- name="Black"
- value="0 0 0 1" />
- <colork
- name="Black_10"
- value="0 0 0 0.1" />
- <color
- name="Black_25"
- value="0 0 0 0.25" />
- <color
- name="Black_50"
- value="0 0 0 0.5" />
- <color
- name="FrogGreen"
- value="0.26 0.345 0.263 1" />
- <color
- name="Red"
- value="1 0 0 1" />
- <color
- name="Blue"
- value="0 0 1 1" />
- <color
- 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="DrYellow"
- value="1 0.86 0 1" />
- <color
- name="LtOrange"
- value="1 .85 .73 1" />
- <color
- name="MdBlue"
- value=".07 .38 .51 1" />
+ <!-- Named Colors -->
+ <color
+ name="EmphasisColor"
+ value="0.38 0.694 0.573 1" />
+ <color
+ name="EmphasisColor_13"
+ value="0.38 0.694 0.573 0.13" />
+ <color
+ name="EmphasisColor_35"
+ value="0.38 0.694 0.573 0.35" />
+ <color
+ name="BeaconColor"
+ value="0.749 0.298 0 1" />
+ <color
+ name="White"
+ value="1 1 1 1" />
+ <color
+ name="White_05"
+ value="1 1 1 0.05" />
+ <color
+ name="White_10"
+ value="1 1 1 0.1" />
+ <color
+ name="White_25"
+ value="1 1 1 0.25" />
+ <color
+ name="White_50"
+ value="1 1 1 0.5" />
+ <color
+ name="LtGray"
+ value="0.75 0.75 0.75 1" />
+ <color
+ name="LtGray_35"
+ value="0.75 0.75 0.75 0.35" />
+ <color
+ name="LtGray_50"
+ value="0.75 0.75 0.75 0.50" />
+ <color
+ name="Gray"
+ value="0.5 0.5 0.5 1" />
+ <color
+ name="DkGray"
+ value="0.125 0.125 0.125 1" />
+ <color
+ name="DkGray_66"
+ value="0.125 0.125 0.125 .66" />
+ <color
+ name="DkGray2"
+ value="0.169 0.169 0.169 1" />
+ <color
+ name="MouseGray"
+ value="0.191 0.191 0.191 1" />
+ <color
+ name="Black"
+ value="0 0 0 1" />
+ <colork
+ name="Black_10"
+ value="0 0 0 0.1" />
+ <color
+ name="Black_25"
+ value="0 0 0 0.25" />
+ <color
+ name="Black_50"
+ value="0 0 0 0.5" />
+ <color
+ name="FrogGreen"
+ value="0.26 0.345 0.263 1" />
+ <color
+ name="Red"
+ value="1 0 0 1" />
+ <color
+ name="Blue"
+ value="0 0 1 1" />
+ <color
+ 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="DrYellow"
+ value="1 0.86 0 1" />
+ <color
+ name="LtOrange"
+ value="1 .85 .73 1" />
+ <color
+ name="MdBlue"
+ value=".07 .38 .51 1" />
<color
name="LtRed"
value="1 0.2 0.2 1" />
@@ -115,527 +118,530 @@
value="0 0 1 0.8" />
<!-- 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. -->
+ 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" />
+ name="Unused?"
+ value=".831 1 0 1" />
<!-- UI Definitions -->
- <color
- name="AccordionHeaderTextColor"
- reference="LtGray" />
- <color
- name="AgentChatColor"
- reference="White" />
- <color
- name="AlertBoxColor"
- value="0.24 0.24 0.24 1" />
- <color
- name="AlertCautionBoxColor"
- value="1 0.82 0.46 1" />
- <color
- name="AlertCautionTextColor"
- reference="LtYellow" />
- <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="BadgeImageColor"
- value="1.0 0.40 0.0 1.0" />
- <color
- name="BadgeBorderColor"
- value="0.9 0.9 0.9 1.0" />
- <color
- name="BadgeLabelColor"
- reference="White" />
- <color
- name="ButtonBorderColor"
- reference="Unused?" />
- <color
- name="ButtonCautionImageColor"
- reference="Unused?" />
- <color
- name="ButtonColor"
- reference="Unused?" />
- <color
- name="ButtonFlashBgColor"
- reference="Unused?" />
- <color
- name="ButtonImageColor"
- reference="White" />
- <color
- name="ButtonLabelColor"
- reference="LtGray" />
- <color
- name="ButtonLabelDisabledColor"
- reference="White_25" />
- <color
- name="ButtonLabelSelectedColor"
- reference="White" />
- <color
- name="ButtonLabelSelectedDisabledColor"
- reference="White_25" />
- <color
- name="ButtonSelectedBgColor"
- reference="Unused?" />
- <color
- name="ButtonSelectedColor"
- reference="Unused?" />
- <color
- name="ButtonUnselectedBgColor"
- reference="Unused?" />
- <color
- name="ButtonUnselectedFgColor"
- reference="Unused?" />
- <color
- name="ChatHistoryBgColor"
- reference="Transparent" />
- <color
- name="ChatHistoryTextColor"
- reference="LtGray" />
- <color
- name="ChicletFlashColor"
- value="0.114 0.65 0.1" />
- <color
- name="ColorDropShadow"
- reference="Black_50" />
- <color
- name="ColorPaletteEntry01"
- reference="Black" />
- <color
- name="ColorPaletteEntry02"
- reference="Gray" />
- <color
- name="ColorPaletteEntry03"
- value="0.5 0 0 1" />
- <color
- name="ColorPaletteEntry04"
- value="0.5 0.5 0 1" />
- <color
- name="ColorPaletteEntry05"
- value="0 0.5 0 1" />
- <color
- name="ColorPaletteEntry06"
- value="0 0.5 0.5 1" />
- <color
- name="ColorPaletteEntry07"
- value="0 0 0.5 1" />
- <color
- name="ColorPaletteEntry08"
- value="0.5 0 0.5 1" />
- <color
- name="ColorPaletteEntry09"
- value="0.5 0.5 0 1" />
- <color
- name="ColorPaletteEntry10"
- value="0 0.25 0.25 1" />
- <color
- name="ColorPaletteEntry11"
- value="0 0.5 1 1" />
- <color
- name="ColorPaletteEntry12"
- value="0 0.25 0.5 1" />
- <color
- name="ColorPaletteEntry13"
- value="0.5 0 1 1" />
- <color
- name="ColorPaletteEntry14"
- value="0.5 0.25 0 1" />
- <color
- name="ColorPaletteEntry15"
- reference="White" />
- <color
- name="ColorPaletteEntry16"
- reference="LtYellow" />
- <color
- name="ColorPaletteEntry17"
- reference="White" />
- <color
- name="ColorPaletteEntry18"
- reference="LtGray" />
- <color
- name="ColorPaletteEntry19"
- reference="Red" />
- <color
- name="ColorPaletteEntry20"
- reference="Yellow" />
- <color
- name="ColorPaletteEntry21"
- reference="Green" />
- <color
- name="ColorPaletteEntry22"
- value="0 1 1 1" />
- <color
- name="ColorPaletteEntry23"
- reference="Blue" />
- <color
- name="ColorPaletteEntry24"
- reference="Purple" />
- <color
- name="ColorPaletteEntry25"
- value="1 1 0.5 1" />
- <color
- name="ColorPaletteEntry26"
- value="0 1 0.5 1" />
- <color
- name="ColorPaletteEntry27"
- value="0.5 1 1 1" />
- <color
- name="ColorPaletteEntry28"
- value="0.5 0.5 1 1" />
- <color
- name="ColorPaletteEntry29"
- value="1 0 0.5 1" />
- <color
- name="ColorPaletteEntry30"
- value="1 0.5 0 1" />
- <color
- name="ColorPaletteEntry31"
- reference="White" />
- <color
- name="ColorPaletteEntry32"
- reference="White" />
- <color
- name="ComboListBgColor"
- reference="DkGray" />
- <color
- name="ConsoleBackground"
- reference="Black" />
- <color
- name="ContextSilhouetteColor"
- reference="EmphasisColor" />
- <color
- name="DefaultHighlightDark"
- reference="White_10" />
- <color
- name="DefaultHighlightLight"
- reference="White_25" />
- <color
- name="DefaultShadowDark"
- reference="Black_50" />
- <color
- name="DefaultShadowLight"
- reference="Black_50" />
- <color
- name="EffectColor"
- reference="White" />
- <color
- name="FilterBackgroundColor"
- reference="Black" />
- <color
- name="FilterTextColor"
- value="0.38 0.69 0.57 1" />
- <color
- name="FloaterButtonImageColor"
- reference="LtGray" />
- <color
- name="FloaterDefaultBackgroundColor"
- reference="DkGray_66" />
- <color
- name="FloaterFocusBackgroundColor"
- reference="DkGray2" />
- <color
- name="FloaterFocusBorderColor"
- reference="Black_50" />
- <color
- name="FloaterUnfocusBorderColor"
- reference="Black_50" />
- <color
- name="FocusColor"
- reference="EmphasisColor" />
- <color
- name="FolderViewLoadingMessageTextColor"
- value="0.3344 0.5456 0.5159 1" />
- <color
- name="GridFocusPointColor"
- reference="White_50" />
- <color
- name="GridlineBGColor"
- value="0.92 0.92 1 0.78" />
- <color
- name="GridlineColor"
- reference="White" />
- <color
- name="GridlineShadowColor"
- value="0 0 0 0.31" />
- <color
- name="GroupNotifyBoxColor"
- value="0.3344 0.5456 0.5159 1" />
- <color
- name="GroupNotifyTextColor"
- reference="White"/>
- <color
- name="GroupNotifyDimmedTextColor"
- reference="LtGray" />
- <color
- name="GroupOverTierColor"
- value="0.43 0.06 0.06 1" />
- <color
- name="HTMLLinkColor"
- reference="EmphasisColor" />
- <color
- name="HealthTextColor"
- reference="White" />
- <color
- name="HelpBgColor"
- reference="Unused?" />
- <color
- name="HelpFgColor"
- reference="Unused?" />
- <color
- name="HelpScrollHighlightColor"
- reference="Unused?" />
- <color
- name="HelpScrollShadowColor"
- reference="Unused?" />
- <color
- name="HelpScrollThumbColor"
- reference="Unused?" />
- <color
- name="HelpScrollTrackColor"
- reference="Unused?" />
- <color
- name="HighlightChildColor"
- reference="Yellow" />
- <color
- name="HighlightInspectColor"
- value="1 0 1 1" />
- <color
- name="HighlightParentColor"
- value="0.67 0.83 0.96 1" />
- <color
- name="IMHistoryBgColor"
- reference="Unused?" />
- <color
- name="IMHistoryTextColor"
- reference="Unused?" />
- <color
- name="IconDisabledColor"
- reference="White_25" />
- <color
- name="IconEnabledColor"
- reference="White" />
- <color
- name="InventoryBackgroundColor"
- reference="DkGray2" />
- <color
- name="InventoryFocusOutlineColor"
- reference="White_25" />
- <color
- name="InventoryItemSuffixColor"
- reference="White_25" />
- <color
- name="InventoryItemLibraryColor"
- reference="EmphasisColor" />
- <color
- name="InventoryItemLinkColor"
- reference="LtGray_50" />
- <color
- name="InventoryMouseOverColor"
- reference="LtGray_35" />
- <color
- name="InventorySearchStatusColor"
- reference="EmphasisColor" />
- <color
- name="LabelDisabledColor"
- reference="White_25" />
- <color
- name="LabelSelectedColor"
- reference="White" />
- <color
- name="LabelSelectedDisabledColor"
- reference="White_25" />
- <color
- name="LabelTextColor"
- reference="LtGray" />
- <color
- name="LoginProgressBarBgColor"
- reference="Unused?" />
- <color
- name="LoginProgressBarFgColor"
- reference="Unused?" />
- <color
- name="LoginProgressBoxBorderColor"
- value="0 0.12 0.24 0" />
- <color
- name="LoginProgressBoxCenterColor"
- value="0 0 0 0.78" />
- <color
- name="LoginProgressBoxShadowColor"
- value="0 0 0 0.78" />
- <color
- name="LoginProgressBoxTextColor"
- reference="White" />
- <color
- name="MapAvatarColor"
- reference="Green" />
- <color
- name="MapAvatarFriendColor"
- reference="Yellow" />
- <color
- name="MapAvatarSelfColor"
- value="0.53125 0 0.498047 1" />
- <color
- name="MapFrustumColor"
- reference="White_10" />
- <color
- name="MapFrustumRotatingColor"
- value="1 1 1 0.2" />
- <color
- name="MapTrackColor"
- reference="Red" />
- <color
- name="MapTrackDisabledColor"
- value="0.5 0 0 1" />
- <color
- name="MenuBarBgColor"
- reference="DkGray" />
- <color
- name="MenuBarGodBgColor"
- reference="FrogGreen" />
- <color
- name="MenuDefaultBgColor"
- reference="DkGray2" />
- <color
- name="MenuItemDisabledColor"
- reference="LtGray_50" />
- <color
- name="MenuItemEnabledColor"
- reference="LtGray" />
- <color
- name="MenuItemHighlightBgColor"
- reference="EmphasisColor_35" />
- <color
- name="MenuItemHighlightFgColor"
- reference="White" />
- <color
- name="MenuNonProductionBgColor"
- reference="Black" />
- <color
- name="MenuNonProductionGodBgColor"
- value="0.263 0.325 0.345 1" />
- <color
- name="MenuPopupBgColor"
- reference="DkGray2" />
- <color
- name="ModelUploaderLabels"
- value="1 0.6 0 1" />
- <color
- name="MultiSliderDisabledThumbColor"
- reference="Black" />
- <color
- name="MultiSliderThumbCenterColor"
- reference="White" />
- <color
- name="MultiSliderThumbCenterSelectedColor"
- reference="Green" />
- <color
- name="MultiSliderThumbOutlineColor"
- reference="Unused?" />
- <color
- name="MultiSliderTrackColor"
- reference="LtGray" />
- <color
- name="MultiSliderTriangleColor"
- reference="Yellow" />
+ <color
+ name="AccordionHeaderTextColor"
+ reference="LtGray" />
+ <color
+ name="AgentChatColor"
+ reference="White" />
+ <color
+ name="AlertBoxColor"
+ value="0.24 0.24 0.24 1" />
+ <color
+ name="AlertCautionBoxColor"
+ value="1 0.82 0.46 1" />
+ <color
+ name="AlertCautionTextColor"
+ reference="LtYellow" />
+ <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="BadgeImageColor"
+ value="1.0 0.40 0.0 1.0" />
+ <color
+ name="BadgeBorderColor"
+ value="0.9 0.9 0.9 1.0" />
+ <color
+ name="BadgeLabelColor"
+ reference="White" />
+ <color
+ name="ButtonBorderColor"
+ reference="Unused?" />
+ <color
+ name="ButtonCautionImageColor"
+ reference="Unused?" />
+ <color
+ name="ButtonColor"
+ reference="Unused?" />
+ <color
+ name="ButtonFlashBgColor"
+ reference="Unused?" />
+ <color
+ name="ButtonImageColor"
+ reference="White" />
+ <color
+ name="ButtonLabelColor"
+ reference="LtGray" />
+ <color
+ name="ButtonLabelDisabledColor"
+ reference="White_25" />
+ <color
+ name="ButtonLabelSelectedColor"
+ reference="White" />
+ <color
+ name="ButtonLabelSelectedDisabledColor"
+ reference="White_25" />
+ <color
+ name="ButtonSelectedBgColor"
+ reference="Unused?" />
+ <color
+ name="ButtonSelectedColor"
+ reference="Unused?" />
+ <color
+ name="ButtonUnselectedBgColor"
+ reference="Unused?" />
+ <color
+ name="ButtonUnselectedFgColor"
+ reference="Unused?" />
+ <color
+ name="ChatHistoryBgColor"
+ reference="Transparent" />
+ <color
+ name="ChatHistoryTextColor"
+ reference="LtGray" />
+ <color
+ name="ChicletFlashColor"
+ value="0.114 0.65 0.1" />
+ <color
+ name="ColorDropShadow"
+ reference="Black_50" />
+ <color
+ name="ColorPaletteEntry01"
+ reference="Black" />
+ <color
+ name="ColorPaletteEntry02"
+ reference="Gray" />
+ <color
+ name="ColorPaletteEntry03"
+ value="0.5 0 0 1" />
+ <color
+ name="ColorPaletteEntry04"
+ value="0.5 0.5 0 1" />
+ <color
+ name="ColorPaletteEntry05"
+ value="0 0.5 0 1" />
+ <color
+ name="ColorPaletteEntry06"
+ value="0 0.5 0.5 1" />
+ <color
+ name="ColorPaletteEntry07"
+ value="0 0 0.5 1" />
+ <color
+ name="ColorPaletteEntry08"
+ value="0.5 0 0.5 1" />
+ <color
+ name="ColorPaletteEntry09"
+ value="0.5 0.5 0 1" />
+ <color
+ name="ColorPaletteEntry10"
+ value="0 0.25 0.25 1" />
+ <color
+ name="ColorPaletteEntry11"
+ value="0 0.5 1 1" />
+ <color
+ name="ColorPaletteEntry12"
+ value="0 0.25 0.5 1" />
+ <color
+ name="ColorPaletteEntry13"
+ value="0.5 0 1 1" />
+ <color
+ name="ColorPaletteEntry14"
+ value="0.5 0.25 0 1" />
+ <color
+ name="ColorPaletteEntry15"
+ reference="White" />
+ <color
+ name="ColorPaletteEntry16"
+ reference="LtYellow" />
+ <color
+ name="ColorPaletteEntry17"
+ reference="White" />
+ <color
+ name="ColorPaletteEntry18"
+ reference="LtGray" />
+ <color
+ name="ColorPaletteEntry19"
+ reference="Red" />
+ <color
+ name="ColorPaletteEntry20"
+ reference="Yellow" />
+ <color
+ name="ColorPaletteEntry21"
+ reference="Green" />
+ <color
+ name="ColorPaletteEntry22"
+ value="0 1 1 1" />
+ <color
+ name="ColorPaletteEntry23"
+ reference="Blue" />
+ <color
+ name="ColorPaletteEntry24"
+ reference="Purple" />
+ <color
+ name="ColorPaletteEntry25"
+ value="1 1 0.5 1" />
+ <color
+ name="ColorPaletteEntry26"
+ value="0 1 0.5 1" />
+ <color
+ name="ColorPaletteEntry27"
+ value="0.5 1 1 1" />
+ <color
+ name="ColorPaletteEntry28"
+ value="0.5 0.5 1 1" />
+ <color
+ name="ColorPaletteEntry29"
+ value="1 0 0.5 1" />
+ <color
+ name="ColorPaletteEntry30"
+ value="1 0.5 0 1" />
+ <color
+ name="ColorPaletteEntry31"
+ reference="White" />
+ <color
+ name="ColorPaletteEntry32"
+ reference="White" />
+ <color
+ name="ComboListBgColor"
+ reference="DkGray" />
+ <color
+ name="ConsoleBackground"
+ reference="Black" />
+ <color
+ name="ContextSilhouetteColor"
+ reference="EmphasisColor" />
+ <color
+ name="DefaultHighlightDark"
+ reference="White_10" />
+ <color
+ name="DefaultHighlightLight"
+ reference="White_25" />
+ <color
+ name="DefaultShadowDark"
+ reference="Black_50" />
+ <color
+ name="DefaultShadowLight"
+ reference="Black_50" />
+ <color
+ name="EffectColor"
+ reference="White" />
+ <color
+ name="FilterBackgroundColor"
+ reference="Black" />
+ <color
+ name="FilterTextColor"
+ value="0.38 0.69 0.57 1" />
+ <color
+ name="FloaterButtonImageColor"
+ reference="LtGray" />
+ <color
+ name="FloaterDefaultBackgroundColor"
+ reference="DkGray_66" />
+ <color
+ name="FloaterFocusBackgroundColor"
+ reference="DkGray2" />
+ <color
+ name="FloaterFocusBorderColor"
+ reference="Black_50" />
+ <color
+ name="FloaterUnfocusBorderColor"
+ reference="Black_50" />
+ <color
+ name="FocusColor"
+ reference="EmphasisColor" />
+ <color
+ name="FolderViewLoadingMessageTextColor"
+ value="0.3344 0.5456 0.5159 1" />
+ <color
+ name="GridFocusPointColor"
+ reference="White_50" />
+ <color
+ name="GridlineBGColor"
+ value="0.92 0.92 1 0.78" />
+ <color
+ name="GridlineColor"
+ reference="White" />
+ <color
+ name="GridlineShadowColor"
+ value="0 0 0 0.31" />
+ <color
+ name="GroupNotifyBoxColor"
+ value="0.3344 0.5456 0.5159 1" />
+ <color
+ name="GroupNotifyTextColor"
+ reference="White"/>
+ <color
+ name="GroupNotifyDimmedTextColor"
+ reference="LtGray" />
+ <color
+ name="GroupOverTierColor"
+ value="0.43 0.06 0.06 1" />
+ <color
+ name="HTMLLinkColor"
+ reference="EmphasisColor" />
+ <color
+ name="HealthTextColor"
+ reference="White" />
+ <color
+ name="HelpBgColor"
+ reference="Unused?" />
+ <color
+ name="HelpFgColor"
+ reference="Unused?" />
+ <color
+ name="HelpScrollHighlightColor"
+ reference="Unused?" />
+ <color
+ name="HelpScrollShadowColor"
+ reference="Unused?" />
+ <color
+ name="HelpScrollThumbColor"
+ reference="Unused?" />
+ <color
+ name="HelpScrollTrackColor"
+ reference="Unused?" />
+ <color
+ name="HighlightChildColor"
+ reference="Yellow" />
+ <color
+ name="HighlightInspectColor"
+ value="1 0 1 1" />
+ <color
+ name="HighlightParentColor"
+ value="0.67 0.83 0.96 1" />
+ <color
+ name="IMHistoryBgColor"
+ reference="Unused?" />
+ <color
+ name="IMHistoryTextColor"
+ reference="Unused?" />
+ <color
+ name="IconDisabledColor"
+ reference="White_25" />
+ <color
+ name="IconEnabledColor"
+ reference="White" />
+ <color
+ name="InventoryBackgroundColor"
+ reference="DkGray2" />
+ <color
+ name="InventoryFocusOutlineColor"
+ reference="White_25" />
+ <color
+ name="InventoryItemSuffixColor"
+ reference="White_25" />
+ <color
+ name="InventoryItemLibraryColor"
+ reference="EmphasisColor" />
+ <color
+ name="InventoryItemLinkColor"
+ reference="LtGray_50" />
+ <color
+ name="InventoryMouseOverColor"
+ reference="LtGray_35" />
+ <color
+ name="InventorySearchStatusColor"
+ reference="EmphasisColor" />
+ <color
+ name="LabelDisabledColor"
+ reference="White_25" />
+ <color
+ name="LabelSelectedColor"
+ reference="White" />
+ <color
+ name="LabelSelectedDisabledColor"
+ reference="White_25" />
+ <color
+ name="LabelTextColor"
+ reference="LtGray" />
+ <color
+ name="LoginProgressBarBgColor"
+ reference="Unused?" />
+ <color
+ name="LoginProgressBarFgColor"
+ reference="Unused?" />
+ <color
+ name="LoginProgressBoxBorderColor"
+ value="0 0.12 0.24 0" />
+ <color
+ name="LoginProgressBoxCenterColor"
+ value="0 0 0 0.78" />
+ <color
+ name="LoginProgressBoxShadowColor"
+ value="0 0 0 0.78" />
+ <color
+ name="LoginProgressBoxTextColor"
+ reference="White" />
+ <color
+ name="MapAvatarColor"
+ reference="Green" />
+ <color
+ name="MapAvatarFriendColor"
+ reference="Yellow" />
+ <color
+ name="MapAvatarSelfColor"
+ value="0.53125 0 0.498047 1" />
+ <color
+ name="MapFrustumColor"
+ reference="White_10" />
+ <color
+ name="MapFrustumRotatingColor"
+ value="1 1 1 0.2" />
+ <color
+ name="MapTrackColor"
+ reference="Red" />
+ <color
+ name="MapTrackDisabledColor"
+ value="0.5 0 0 1" />
+ <color
+ name="MenuBarBgColor"
+ reference="DkGray" />
+ <color
+ name="MenuBarGodBgColor"
+ reference="FrogGreen" />
+ <color
+ name="MenuDefaultBgColor"
+ reference="DkGray2" />
+ <color
+ name="MenuItemDisabledColor"
+ reference="LtGray_50" />
+ <color
+ name="MenuItemEnabledColor"
+ reference="LtGray" />
+ <color
+ name="MenuItemHighlightBgColor"
+ reference="EmphasisColor_35" />
+ <color
+ name="MenuItemFlashBgColor"
+ reference="BeaconColor" />
+ <color
+ name="MenuItemHighlightFgColor"
+ reference="White" />
+ <color
+ name="MenuNonProductionBgColor"
+ reference="Black" />
+ <color
+ name="MenuNonProductionGodBgColor"
+ value="0.263 0.325 0.345 1" />
+ <color
+ name="MenuPopupBgColor"
+ reference="DkGray2" />
+ <color
+ name="ModelUploaderLabels"
+ value="1 0.6 0 1" />
+ <color
+ name="MultiSliderDisabledThumbColor"
+ reference="Black" />
+ <color
+ name="MultiSliderThumbCenterColor"
+ reference="White" />
+ <color
+ name="MultiSliderThumbCenterSelectedColor"
+ reference="Green" />
+ <color
+ name="MultiSliderThumbOutlineColor"
+ reference="Unused?" />
+ <color
+ name="MultiSliderTrackColor"
+ reference="LtGray" />
+ <color
+ name="MultiSliderTriangleColor"
+ reference="Yellow" />
<!--
- <color
+ <color
name="NameTagBackground"
value="0.85 0.85 0.85 0.80" />
- -->
- <color
+ -->
+ <color
name="NameTagBackground"
value="0 0 0 1" />
- <color
- name="NameTagChat"
- reference="White" />
- <color
- name="NameTagFriend"
- value="0.447 0.784 0.663 1" />
- <color
- name="NameTagLegacy"
- reference="White" />
- <color
- name="NameTagMatch"
- reference="White" />
- <color
- name="NameTagMismatch"
- reference="White" />
- <color
- name="NetMapBackgroundColor"
- value="0 0 0 1" />
- <color
- name="NetMapGroupOwnAboveWater"
- reference="Purple" />
- <color
- name="NetMapGroupOwnBelowWater"
- value="0.78 0 0.78 1" />
- <color
- name="NetMapOtherOwnAboveWater"
- value="0.24 0.24 0.24 1" />
- <color
- name="NetMapOtherOwnBelowWater"
- value="0.12 0.12 0.12 1" />
- <color
- name="NetMapYouOwnAboveWater"
- value="0 1 1 1" />
- <color
- name="NetMapYouOwnBelowWater"
- value="0 0.78 0.78 1" />
- <color
- name="NotifyBoxColor"
- value="LtGray" />
- <color
- name="NotifyCautionBoxColor"
- value="1 0.82 0.46 1" />
- <color
- name="NotifyCautionWarnColor"
- reference="White" />
- <color
- name="NotifyTextColor"
- reference="White" />
- <color
- name="ObjectBubbleColor"
- reference="DkGray_66" />
- <color
- name="ObjectChatColor"
- reference="EmphasisColor" />
- <color
- name="OverdrivenColor"
- reference="Red" />
- <color
- name="PanelDefaultBackgroundColor"
- reference="DkGray" />
- <color
- name="PanelDefaultHighlightLight"
- reference="White_50" />
- <color
- name="PanelFocusBackgroundColor"
- reference="DkGray2" />
- <color
- name="PanelNotificationBackground"
- value="1 0.3 0.3 0" />
- <color
- name="ParcelHoverColor"
- reference="White" />
- <color
+ <color
+ name="NameTagChat"
+ reference="White" />
+ <color
+ name="NameTagFriend"
+ value="0.447 0.784 0.663 1" />
+ <color
+ name="NameTagLegacy"
+ reference="White" />
+ <color
+ name="NameTagMatch"
+ reference="White" />
+ <color
+ name="NameTagMismatch"
+ reference="White" />
+ <color
+ name="NetMapBackgroundColor"
+ value="0 0 0 1" />
+ <color
+ name="NetMapGroupOwnAboveWater"
+ reference="Purple" />
+ <color
+ name="NetMapGroupOwnBelowWater"
+ value="0.78 0 0.78 1" />
+ <color
+ name="NetMapOtherOwnAboveWater"
+ value="0.24 0.24 0.24 1" />
+ <color
+ name="NetMapOtherOwnBelowWater"
+ value="0.12 0.12 0.12 1" />
+ <color
+ name="NetMapYouOwnAboveWater"
+ value="0 1 1 1" />
+ <color
+ name="NetMapYouOwnBelowWater"
+ value="0 0.78 0.78 1" />
+ <color
+ name="NotifyBoxColor"
+ value="LtGray" />
+ <color
+ name="NotifyCautionBoxColor"
+ value="1 0.82 0.46 1" />
+ <color
+ name="NotifyCautionWarnColor"
+ reference="White" />
+ <color
+ name="NotifyTextColor"
+ reference="White" />
+ <color
+ name="ObjectBubbleColor"
+ reference="DkGray_66" />
+ <color
+ name="ObjectChatColor"
+ reference="EmphasisColor" />
+ <color
+ name="OverdrivenColor"
+ reference="Red" />
+ <color
+ name="PanelDefaultBackgroundColor"
+ reference="DkGray" />
+ <color
+ name="PanelDefaultHighlightLight"
+ reference="White_50" />
+ <color
+ name="PanelFocusBackgroundColor"
+ reference="DkGray2" />
+ <color
+ name="PanelNotificationBackground"
+ value="1 0.3 0.3 0" />
+ <color
+ name="ParcelHoverColor"
+ reference="White" />
+ <color
name="PathfindingErrorColor"
reference="LtRed" />
<color
@@ -657,205 +663,205 @@
name="PathfindingCharacterBeaconColor"
reference="Red_80" />
<color
- name="PieMenuBgColor"
- value="0.24 0.24 0.24 0.59" />
- <color
- name="PieMenuLineColor"
- value="0 0 0 0.5" />
- <color
- name="PieMenuSelectedColor"
- value="0.72 0.72 0.74 0.3" />
- <color
- name="PropertyColorAuction"
- value="0.5 0 1 0.4" />
- <color
- name="PropertyColorAvail"
- reference="Transparent" />
- <color
- name="PropertyColorForSale"
- value="1 0.5 0 0.4" />
- <color
- name="PropertyColorGroup"
- value="0 0.72 0.72 0.4" />
- <color
- name="PropertyColorOther"
- value="1 0 0 0.4" />
- <color
- name="PropertyColorSelf"
- value="0 1 0 0.4" />
- <color
- name="ScriptBgReadOnlyColor"
- value="0.39 0.39 0.39 1" />
- <color
- name="ScriptErrorColor"
- reference="Red" />
- <color
- name="ScrollBGStripeColor"
- reference="Transparent" />
- <color
- name="ScrollBgReadOnlyColor"
+ name="PieMenuBgColor"
+ value="0.24 0.24 0.24 0.59" />
+ <color
+ name="PieMenuLineColor"
+ value="0 0 0 0.5" />
+ <color
+ name="PieMenuSelectedColor"
+ value="0.72 0.72 0.74 0.3" />
+ <color
+ name="PropertyColorAuction"
+ value="0.5 0 1 0.4" />
+ <color
+ name="PropertyColorAvail"
+ reference="Transparent" />
+ <color
+ name="PropertyColorForSale"
+ value="1 0.5 0 0.4" />
+ <color
+ name="PropertyColorGroup"
+ value="0 0.72 0.72 0.4" />
+ <color
+ name="PropertyColorOther"
+ value="1 0 0 0.4" />
+ <color
+ name="PropertyColorSelf"
+ value="0 1 0 0.4" />
+ <color
+ name="ScriptBgReadOnlyColor"
+ value="0.39 0.39 0.39 1" />
+ <color
+ name="ScriptErrorColor"
+ reference="Red" />
+ <color
+ name="ScrollBGStripeColor"
+ reference="Transparent" />
+ <color
+ name="ScrollBgReadOnlyColor"
reference="Transparent" />
- <color
- name="ScrollBgWriteableColor"
- reference="White_05" />
- <color
- name="ScrollDisabledColor"
- reference="White_25" />
- <color
- name="ScrollHighlightedColor"
- reference="Unused?" />
- <color
- name="ScrollHoveredColor"
- reference="EmphasisColor_13" />
- <color
- name="ScrollSelectedBGColor"
- reference="EmphasisColor_35" />
- <color
- name="ScrollSelectedFGColor"
- reference="White" />
- <color
- name="ScrollUnselectedColor"
- reference="LtGray" />
- <color
- name="ScrollbarThumbColor"
- reference="White" />
- <color
- name="ScrollbarTrackColor"
- reference="Black" />
- <color
- name="SelectedOutfitTextColor"
- reference="EmphasisColor" />
- <color
- name="SilhouetteChildColor"
- value="0.13 0.42 0.77 1" />
- <color
- name="SilhouetteParentColor"
- reference="Yellow" />
- <color
- name="SliderDisabledThumbColor"
- reference="White_25" />
- <color
- name="SliderThumbCenterColor"
- reference="White" />
- <color
- name="SliderThumbOutlineColor"
- reference="White" />
- <color
- name="SliderTrackColor"
- reference="Unused?" />
- <color
- name="SpeakingColor"
- reference="FrogGreen" />
- <color
- name="SystemChatColor"
- reference="LtGray" />
- <color
- name="TextBgFocusColor"
- reference="White" />
- <color
- name="TextBgReadOnlyColor"
- reference="White_05" />
- <color
- name="TextBgWriteableColor"
- reference="LtGray" />
- <color
- name="TextCursorColor"
- reference="Black" />
- <color
- name="TextDefaultColor"
- reference="Black" />
- <color
- name="TextEmbeddedItemColor"
- value="0 0 0.5 1" />
- <color
- name="TextEmbeddedItemReadOnlyColor"
- reference="Unused?" />
- <color
- name="TextFgColor"
- value="0.102 0.102 0.102 1" />
- <color
- name="TextFgReadOnlyColor"
- reference="LtGray" />
- <color
- name="TextFgTentativeColor"
- value="0.4 0.4 0.4 1" />
- <color
- name="TimeTextColor"
- reference="LtGray" />
- <color
- name="TitleBarFocusColor"
- reference="White_10" />
- <color
- name="ToastBackground"
- value="0.3 0.3 0.3 0" />
- <color
- name="ToolTipBgColor"
- value="0.937 0.89 0.655 1" />
- <color
- name="ToolTipBorderColor"
- value="0.812 0.753 0.451 1" />
- <color
- name="ToolTipTextColor"
- reference="DkGray2" />
- <color
- name="InspectorTipTextColor"
- reference="LtGray" />
- <color
- name="UserChatColor"
- reference="White" />
- <color
- name="llOwnerSayChatColor"
- reference="LtYellow" />
+ <color
+ name="ScrollBgWriteableColor"
+ reference="White_05" />
+ <color
+ name="ScrollDisabledColor"
+ reference="White_25" />
+ <color
+ name="ScrollHighlightedColor"
+ reference="Unused?" />
+ <color
+ name="ScrollHoveredColor"
+ reference="EmphasisColor_13" />
+ <color
+ name="ScrollSelectedBGColor"
+ reference="EmphasisColor_35" />
+ <color
+ name="ScrollSelectedFGColor"
+ reference="White" />
+ <color
+ name="ScrollUnselectedColor"
+ reference="LtGray" />
+ <color
+ name="ScrollbarThumbColor"
+ reference="White" />
+ <color
+ name="ScrollbarTrackColor"
+ reference="Black" />
+ <color
+ name="SelectedOutfitTextColor"
+ reference="EmphasisColor" />
+ <color
+ name="SilhouetteChildColor"
+ value="0.13 0.42 0.77 1" />
+ <color
+ name="SilhouetteParentColor"
+ reference="Yellow" />
+ <color
+ name="SliderDisabledThumbColor"
+ reference="White_25" />
+ <color
+ name="SliderThumbCenterColor"
+ reference="White" />
+ <color
+ name="SliderThumbOutlineColor"
+ reference="White" />
+ <color
+ name="SliderTrackColor"
+ reference="Unused?" />
+ <color
+ name="SpeakingColor"
+ reference="FrogGreen" />
+ <color
+ name="SystemChatColor"
+ reference="LtGray" />
+ <color
+ name="TextBgFocusColor"
+ reference="White" />
+ <color
+ name="TextBgReadOnlyColor"
+ reference="White_05" />
+ <color
+ name="TextBgWriteableColor"
+ reference="LtGray" />
+ <color
+ name="TextCursorColor"
+ reference="Black" />
+ <color
+ name="TextDefaultColor"
+ reference="Black" />
+ <color
+ name="TextEmbeddedItemColor"
+ value="0 0 0.5 1" />
+ <color
+ name="TextEmbeddedItemReadOnlyColor"
+ reference="Unused?" />
+ <color
+ name="TextFgColor"
+ value="0.102 0.102 0.102 1" />
+ <color
+ name="TextFgReadOnlyColor"
+ reference="LtGray" />
+ <color
+ name="TextFgTentativeColor"
+ value="0.4 0.4 0.4 1" />
+ <color
+ name="TimeTextColor"
+ reference="LtGray" />
+ <color
+ name="TitleBarFocusColor"
+ reference="White_10" />
+ <color
+ name="ToastBackground"
+ value="0.3 0.3 0.3 0" />
+ <color
+ name="ToolTipBgColor"
+ value="0.937 0.89 0.655 1" />
+ <color
+ name="ToolTipBorderColor"
+ value="0.812 0.753 0.451 1" />
+ <color
+ name="ToolTipTextColor"
+ reference="DkGray2" />
+ <color
+ name="InspectorTipTextColor"
+ reference="LtGray" />
+ <color
+ name="UserChatColor"
+ reference="Yellow" />
+ <color
+ name="llOwnerSayChatColor"
+ reference="LtYellow" />
- <!-- New Colors -->
- <color
- name="OutputMonitorMutedColor"
- reference="DkGray2" />
- <color
- name="SysWellItemUnselected"
- value="0 0 0 0" />
- <color
- name="SysWellItemSelected"
- value="0.3 0.3 0.3 1.0" />
- <color
- name="ColorSwatchBorderColor"
- value="0.45098 0.517647 0.607843 1"/>
- <color
- name="ChatTimestampColor"
- reference="White" />
- <color
- name="MenuBarProjectBgColor"
- reference="MdBlue" />
+ <!-- New Colors -->
+ <color
+ name="OutputMonitorMutedColor"
+ reference="DkGray2" />
+ <color
+ name="SysWellItemUnselected"
+ value="0 0 0 0" />
+ <color
+ name="SysWellItemSelected"
+ value="0.3 0.3 0.3 1.0" />
+ <color
+ name="ColorSwatchBorderColor"
+ value="0.45098 0.517647 0.607843 1"/>
+ <color
+ name="ChatTimestampColor"
+ reference="White" />
+ <color
+ name="MenuBarProjectBgColor"
+ reference="MdBlue" />
- <color
+ <color
name="MeshImportTableNormalColor"
value="1 1 1 1"/>
- <color
+ <color
name="MeshImportTableHighlightColor"
value="0.2 0.8 1 1"/>
- <color
- name="DirectChatColor"
- reference="LtOrange" />
+ <color
+ name="DirectChatColor"
+ reference="LtOrange" />
- <color
+ <color
name="ToolbarDropZoneColor"
value=".48 .69 1 .5" />
- <!-- Generic color names (legacy) -->
+ <!-- Generic color names (legacy) -->
<color
- name="white"
- value="1 1 1 1"/>
+ name="white"
+ value="1 1 1 1"/>
<color
- name="black"
- value="0 0 0 1"/>
+ name="black"
+ value="0 0 0 1"/>
<color
- name="red"
- value="1 0 0 1"/>
+ name="red"
+ value="1 0 0 1"/>
<color
- name="green"
- value="0 1 0 1"/>
+ name="green"
+ value="0 1 0 1"/>
<color
- name="blue"
- value="0 0 1 1"/>
+ name="blue"
+ value="0 0 1 1"/>
</colors>
diff --git a/indra/newview/skins/default/textures/bottomtray/Unread_IM.png b/indra/newview/skins/default/textures/bottomtray/Unread_IM.png
deleted file mode 100644
index 5c0c85b864..0000000000
--- a/indra/newview/skins/default/textures/bottomtray/Unread_IM.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png
deleted file mode 100644
index 857fa1e047..0000000000
--- a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png
deleted file mode 100644
index 453bb53673..0000000000
--- a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png
deleted file mode 100644
index 135a66ca0d..0000000000
--- a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png
deleted file mode 100644
index a63aec5e6d..0000000000
--- a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png
deleted file mode 100644
index 1719eb3e84..0000000000
--- a/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_log_inbox.png b/indra/newview/skins/default/textures/icons/Conv_log_inbox.png
new file mode 100644
index 0000000000..bb6ca28147
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Conv_log_inbox.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_add_person.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_add_person.png
new file mode 100755
index 0000000000..0631f16f3b
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Conv_toolbar_add_person.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_arrow_ne.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_arrow_ne.png
new file mode 100755
index 0000000000..578482f5ed
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Conv_toolbar_arrow_ne.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_arrow_sw.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_arrow_sw.png
new file mode 100755
index 0000000000..7676131790
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Conv_toolbar_arrow_sw.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_call_log.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_call_log.png
new file mode 100755
index 0000000000..2880eb766a
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Conv_toolbar_call_log.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_close.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_close.png
new file mode 100755
index 0000000000..d009c8f446
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Conv_toolbar_close.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_collapse.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_collapse.png
new file mode 100755
index 0000000000..8d82960e28
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Conv_toolbar_collapse.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_expand.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_expand.png
new file mode 100755
index 0000000000..f718d3fc60
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Conv_toolbar_expand.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_hang_up.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_hang_up.png
new file mode 100755
index 0000000000..315e2c581a
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Conv_toolbar_hang_up.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_open_call.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_open_call.png
new file mode 100755
index 0000000000..732ab02a20
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Conv_toolbar_open_call.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_plus.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_plus.png
new file mode 100755
index 0000000000..25a32cb2ba
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Conv_toolbar_plus.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_sort.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_sort.png
new file mode 100755
index 0000000000..08debeb91f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Conv_toolbar_sort.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/collapse_to_one_line.png b/indra/newview/skins/default/textures/icons/collapse_to_one_line.png
new file mode 100644
index 0000000000..d57144a645
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/collapse_to_one_line.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/expand_one_liner.png b/indra/newview/skins/default/textures/icons/expand_one_liner.png
new file mode 100644
index 0000000000..58b7d90131
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/expand_one_liner.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/nearby_chat_icon.png b/indra/newview/skins/default/textures/icons/nearby_chat_icon.png
new file mode 100644
index 0000000000..5ac4258b9d
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/nearby_chat_icon.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 06f8f8c670..93c9cb02cb 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -162,7 +162,24 @@ with the same filename but different name
<texture name="ComboButton_On" file_name="widgets/ComboButton_On.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="Conv_toolbar_add_person" file_name="icons/Conv_toolbar_add_person.png" preload="false" />
+ <texture name="Conv_toolbar_arrow_ne" file_name="icons/Conv_toolbar_arrow_ne.png" preload="false" />
+ <texture name="Conv_toolbar_arrow_sw" file_name="icons/Conv_toolbar_arrow_sw.png" preload="false" />
+ <texture name="Conv_toolbar_call_log" file_name="icons/Conv_toolbar_call_log.png" preload="false" />
+ <texture name="Conv_toolbar_close" file_name="icons/Conv_toolbar_close.png" preload="false" />
+ <texture name="Conv_toolbar_collapse" file_name="icons/Conv_toolbar_collapse.png" preload="false" />
+ <texture name="Conv_collapse_to_one_line" file_name="icons/collapse_to_one_line.png" preload="false" />
+ <texture name="Conv_expand_one_line" file_name="icons/expand_one_liner.png" preload="false" />
+ <texture name="Conv_toolbar_expand" file_name="icons/Conv_toolbar_expand.png" preload="false" />
+ <texture name="Conv_toolbar_hang_up" file_name="icons/Conv_toolbar_hang_up.png" preload="false" />
+ <texture name="Conv_toolbar_open_call" file_name="icons/Conv_toolbar_open_call.png" preload="false" />
+ <texture name="Conv_toolbar_plus" file_name="icons/Conv_toolbar_plus.png" preload="false" />
+ <texture name="Conv_toolbar_sort" file_name="icons/Conv_toolbar_sort.png" preload="false" />
+ <texture name="Conv_log_inbox" file_name="icons/Conv_log_inbox.png" preload="false" />
+
<texture name="Copy" file_name="icons/Copy.png" preload="false" />
<texture name="DisclosureArrow_Opened_Off" file_name="widgets/DisclosureArrow_Opened_Off.png" preload="true" />
@@ -348,6 +365,8 @@ with the same filename but different name
<texture name="NavBar_BG_NoFav_Bevel" file_name="navbar/NavBar_BG_NoFav_Bevel.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
<texture name="NavBar_BG_NoNav_Bevel" file_name="navbar/NavBar_BG_NoNav_Bevel.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
+ <texture name="Nearby_chat_icon" file_name="icons/nearby_chat_icon.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" />
@@ -625,7 +644,6 @@ with the same filename but different name
<texture name="TrashItem_Press" file_name="icons/TrashItem_Press.png" preload="false" />
<texture name="Unread_Chiclet" file_name="bottomtray/Unread_Chiclet.png" preload="false" />
- <texture name="Unread_IM" file_name="bottomtray/Unread_IM.png" preload="false" />
<texture name="UpArrow_Off" file_name="icons/UpArrow_Off.png" preload="false" />
@@ -638,12 +656,6 @@ with the same filename but different name
<texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" />
<texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" />
- <texture name="VoicePTT_Lvl1_Dark" file_name="bottomtray/VoicePTT_Lvl1_Dark.png" preload="false" />
- <texture name="VoicePTT_Lvl2_Dark" file_name="bottomtray/VoicePTT_Lvl2_Dark.png" preload="false" />
- <texture name="VoicePTT_Lvl3_Dark" file_name="bottomtray/VoicePTT_Lvl3_Dark.png" preload="false" />
- <texture name="VoicePTT_Off_Dark" file_name="bottomtray/VoicePTT_Off_Dark.png" preload="false" />
- <texture name="VoicePTT_On_Dark" file_name="bottomtray/VoicePTT_On_Dark.png" preload="false" />
-
<texture name="Wearables_Divider" file_name="windows/Wearables_Divider.png" preload="false" />
<texture name="Web_Profile_Off" file_name="icons/Web_Profile_Off.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/da/menu_im_well_button.xml b/indra/newview/skins/default/xui/da/menu_im_well_button.xml
deleted file mode 100644
index 4889230919..0000000000
--- a/indra/newview/skins/default/xui/da/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="IM Well Button Context Menu">
- <menu_item_call label="Luk alle" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml
index 949cbcbd7b..eb104201f8 100644
--- a/indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="chat_bar">
+<panel name="nearby_chat">
<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/de/floater_chat_bar.xml b/indra/newview/skins/default/xui/de/floater_chat_bar.xml
index 2464a55665..ab77d4dae5 100644
--- a/indra/newview/skins/default/xui/de/floater_chat_bar.xml
+++ b/indra/newview/skins/default/xui/de/floater_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="chat_bar" title="CHAT IN DER NÄHE">
+<floater name="nearby_chat" title="CHAT IN DER NÄHE">
<panel name="bottom_panel">
<line_editor label="Zum Chatten hier klicken." name="chat_box" tool_tip="Eingabetaste zum Sprechen, Strg+Eingabe zum Rufen"/>
<button name="show_nearby_chat" tool_tip="Chatprotokoll in der Nähe ein-/ausblenden"/>
diff --git a/indra/newview/skins/default/xui/de/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/de/floater_pathfinding_linksets.xml
index f1d561e51b..0d3ba59efb 100644
--- a/indra/newview/skins/default/xui/de/floater_pathfinding_linksets.xml
+++ b/indra/newview/skins/default/xui/de/floater_pathfinding_linksets.xml
@@ -30,6 +30,9 @@
<floater.string name="linkset_terrain_owner">
--
</floater.string>
+ <floater.string name="linkset_terrain_scripted">
+ --
+ </floater.string>
<floater.string name="linkset_terrain_land_impact">
--
</floater.string>
@@ -45,6 +48,15 @@
<floater.string name="linkset_owner_group">
[Gruppe]
</floater.string>
+ <floater.string name="linkset_is_scripted">
+ Ja
+ </floater.string>
+ <floater.string name="linkset_is_not_scripted">
+ Nein
+ </floater.string>
+ <floater.string name="linkset_is_unknown_scripted">
+ Unbekannt
+ </floater.string>
<floater.string name="linkset_use_walkable">
Begehbar
</floater.string>
@@ -94,6 +106,7 @@
<scroll_list.columns label="Name (Hauptprim)" name="name"/>
<scroll_list.columns label="Beschreibung (Hauptprim)" name="description"/>
<scroll_list.columns label="Eigentümer" name="owner"/>
+ <scroll_list.columns label="Geskriptet" name="scripted"/>
<scroll_list.columns label="Belastung" name="land_impact"/>
<scroll_list.columns label="Abstand" name="dist_from_you"/>
<scroll_list.columns label="Linkset-Nutzung" name="linkset_use"/>
diff --git a/indra/newview/skins/default/xui/de/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/de/floater_texture_fetch_debugger.xml
index 0f407cb15c..97b0364832 100644
--- a/indra/newview/skins/default/xui/de/floater_texture_fetch_debugger.xml
+++ b/indra/newview/skins/default/xui/de/floater_texture_fetch_debugger.xml
@@ -45,10 +45,23 @@
<text name="total_time_refetch_vis_cache_label">
15, Neuabruf sichtbarer Texturen aus Cache, Zeit: [TIME] s, Abrufmenge: [SIZE2] KB, [PIXEL] MPixel
</text>
+ <text name="total_time_refetch_all_cache_label">
+ 16, Neuabruf aller Texturen aus Cache, Zeit: [TIME] s, Abrufmenge: [SIZE2] KB, [PIXEL] MPixel
+ </text>
<text name="total_time_refetch_vis_http_label">
- 16, Neuabruf sichtbarer Texturen von HTTP, Zeit: [TIME] s, Abrufmenge: [SIZE2] KB, [PIXEL] MPixel
+ 17, Neuabruf sichtbarer Texturen von HTTP, Zeit: [TIME] s, Abrufmenge: [SIZE2] KB, [PIXEL] MPixel
+ </text>
+ <text name="total_time_refetch_all_http_label">
+ 18, Neuabruf aller Texturen von HTTP, Zeit: [TIME] s, Abrufmenge: [SIZE2] KB, [PIXEL] MPixel
+ </text>
+ <spinner label="19, Verhältnis Texel/Pixel:" name="texel_pixel_ratio"/>
+ <text name="texture_source_label">
+ 20, Texturquelle:
</text>
- <spinner label="17, Verhältnis Texel/Pixel:" name="texel_pixel_ratio"/>
+ <radio_group name="texture_source">
+ <radio_item label="Cache + HTTP" name="0"/>
+ <radio_item label="Nur HTTP" name="1"/>
+ </radio_group>
<button label="Starten" name="start_btn"/>
<button label="Zurücksetzen" name="clear_btn"/>
<button label="Schließen" name="close_btn"/>
@@ -58,5 +71,7 @@
<button label="Decodieren" name="decode_btn"/>
<button label="GL-Textur" name="gl_btn"/>
<button label="Neuabruf sichtbarer Texturen (Cache)" name="refetchviscache_btn"/>
+ <button label="Neuabruf des gesamten Cache" name="refetchallcache_btn"/>
<button label="Neuabruf sichtbarer Texturen (HTTP)" name="refetchvishttp_btn"/>
+ <button label="Neuabruf des gesamten HTTP" name="refetchallhttp_btn"/>
</floater>
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
deleted file mode 100644
index f464b71f4a..0000000000
--- a/indra/newview/skins/default/xui/de/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?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_inventory.xml b/indra/newview/skins/default/xui/de/menu_inventory.xml
index 39b3099336..cd2fca313e 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory.xml
@@ -68,6 +68,7 @@
<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="SLurl kopieren" name="url_copy"/>
<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"/>
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index 6ee708ed62..845df1f050 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -21,6 +21,7 @@
<menu_item_call label="Beschäftigt" name="Set Busy"/>
</menu>
<menu_item_call label="L$ kaufen..." name="Buy and Sell L$"/>
+ <menu_item_call label="Händler-Outbox..." name="MerchantOutbox"/>
<menu_item_call label="Kontoübersicht..." 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>
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index 33dfcdcc84..4b7a60b4eb 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -1221,7 +1221,7 @@ in „[THIS_GPU]“
Sie wurden zur nächstgelegenen Region teleportiert.
</notification>
<notification name="AvatarMovedLast">
- Ihr letzter Standort ist zurzeit nicht verfügbar.
+ Ihr angeforderter Standort ist zurzeit nicht verfügbar.
Sie wurden zur nächstgelegenen Region teleportiert.
</notification>
<notification name="AvatarMovedHome">
@@ -1240,7 +1240,7 @@ Sie können [SECOND_LIFE] normal verwenden. Andere Benutzer können Sie korrekt
Installation von [APP_NAME] vollständig abgeschlossen.
Falls Sie [SECOND_LIFE] zum ersten Mal verwenden, müssen Sie zuerst ein Konto erstellen, bevor Sie sich anmelden können.
- <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Neues Konto..."/>
+ <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Konto erstellen..."/>
</notification>
<notification name="LoginPacketNeverReceived">
Es gibt Probleme mit der Verbindung. Möglicherweise besteht ein Problem mit Ihrer Internetverbindung oder dem [SECOND_LIFE_GRID].
@@ -3246,19 +3246,58 @@ Durch Ausblenden der Schaltfläche „Sprechen“ wird die Sprechfunktion deakti
Durch diese Aktion werden alle Menüelemente und Schaltflächen ausgeblendet. Um sie wieder anzuzeigen, klicken Sie erneut auf [SHORTCUT].
<usetemplate ignoretext="Vor Ausblenden der UI bestätigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnRestricted">
- Einige der ausgewählten Linksets können aufgrund von Berechtigungseinschränkungen nicht auf „[REQUESTED_TYPE]“ gesetzt werden. Diese Linksets werden stattdessen auf „[RESTRICTED_TYPE]“ gesetzt.
+ <notification name="PathfindingLinksets_WarnOnPhantom">
+ Bei einigen ausgewählten Linksets wird die Phantom-Markierung umgeschaltet.
+
+Möchten Sie fortfahren?
+ <usetemplate ignoretext="Bei einigen ausgewählten Linksets wird die Phantom-Markierung umgeschaltet." name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted">
+ Einige der ausgewählten Linksets können aufgrund von Berechtigungseinschränkungen nicht auf „[REQUESTED_TYPE]“ gesetzt werden. Diese Linksets werden stattdessen auf „[RESTRICTED_TYPE]“ gesetzt.
+
+Möchten Sie fortfahren?
<usetemplate ignoretext="Einige der ausgewählten Linksets können aufgrund von Berechtigungseinschränkungen nicht gesetzt werden." name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnVolume">
+ <notification name="PathfindingLinksets_MismatchOnVolume">
Einige der ausgewählten Linksets können nicht auf „[REQUESTED_TYPE]“ gesetzt werden, da die Form nicht konvex ist.
+
+Möchten Sie fortfahren?
<usetemplate ignoretext="Einige der ausgewählten Linksets können nicht gesetzt werden, da die Form nicht konvex ist." name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnRestrictedAndVolume">
- Einige der ausgewählten Linksets können aufgrund von Berechtigungseinschränkungen nicht auf „[REQUESTED_TYPE]“ gesetzt werden. Diese Linksets werden stattdessen auf „[RESTRICTED_TYPE]“ gesetzt.
- Einige der ausgewählten Linksets können nicht auf „[REQUESTED_TYPE]“ gesetzt werden, da die Form nicht konvex ist. Die Nutzungsarten dieser Linksets bleiben unverändert.
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted">
+ Bei einigen ausgewählten Linksets wird die Phantom-Markierung umgeschaltet.
+
+Einige der ausgewählten Linksets können aufgrund von Berechtigungseinschränkungen nicht auf „[REQUESTED_TYPE]“ gesetzt werden. Diese Linksets werden stattdessen auf „[RESTRICTED_TYPE]“ gesetzt.
+
+Möchten Sie fortfahren?
+ <usetemplate ignoretext="Bei einigen ausgewählten Linksets wird die Phantom-Markierung umgeschaltet und andere können aufgrund von Berechtigungseinschränkungen nicht gesetzt werden." name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnVolume">
+ Bei einigen ausgewählten Linksets wird die Phantom-Markierung umgeschaltet.
+
+Einige der ausgewählten Linksets können nicht auf „[REQUESTED_TYPE]“ gesetzt werden, da die Form nicht konvex ist.
+
+Möchten Sie fortfahren?
+ <usetemplate ignoretext="Bei einigen ausgewählten Linksets wird die Phantom-Markierung umgeschaltet und andere können nicht gesetzt werden, da die Form nicht konvex ist." name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted_MismatchOnVolume">
+ Einige der ausgewählten Linksets können aufgrund von Berechtigungseinschränkungen nicht auf „[REQUESTED_TYPE]“ gesetzt werden. Diese Linksets werden stattdessen auf „[RESTRICTED_TYPE]“ gesetzt.
+
+Einige der ausgewählten Linksets können nicht auf „[REQUESTED_TYPE]“ gesetzt werden, da die Form nicht konvex ist. Die Nutzungsarten dieser Linksets bleiben unverändert.
+
+Möchten Sie fortfahren?
<usetemplate ignoretext="Einige der ausgewählten Linksets können nicht gesetzt werden, da die Berechtigungen eingeschränkt sind und die Form nicht konvex ist." name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted_MismatchOnVolume">
+ Bei einigen ausgewählten Linksets wird die Phantom-Markierung umgeschaltet.
+
+Einige der ausgewählten Linksets können aufgrund von Berechtigungseinschränkungen nicht auf „[REQUESTED_TYPE]“ gesetzt werden. Diese Linksets werden stattdessen auf „[RESTRICTED_TYPE]“ gesetzt.
+
+Einige der ausgewählten Linksets können nicht auf „[REQUESTED_TYPE]“ gesetzt werden, da die Form nicht konvex ist. Die Nutzungsarten dieser Linksets bleiben unverändert.
+
+Möchten Sie fortfahren?
+ <usetemplate ignoretext="Bei einigen ausgewählten Linksets wird die Phantom-Markierung umgeschaltet und andere können nicht gesetzt werden, da die Berechtigungen für das Linkset eingeschränkt sind und die Form nicht konvex ist." name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ </notification>
<notification name="PathfindingLinksets_ChangeToFlexiblePath">
Das ausgewählte Objekt wirkt sich auf das Navmesh aus. Wenn Sie es in einen flexiblen Pfad ändern, wird es aus dem Navmesh entfernt.
<usetemplate ignoretext="Das ausgewählte Objekt wirkt sich auf das Navmesh aus. Wenn Sie es in einen flexiblen Pfad ändern, wird es aus dem Navmesh entfernt." name="okcancelignore" notext="Abbrechen" yestext="OK"/>
diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml
index 2203b6d310..8cc467185c 100644
--- a/indra/newview/skins/default/xui/de/panel_login.xml
+++ b/indra/newview/skins/default/xui/de/panel_login.xml
@@ -18,7 +18,7 @@
</layout_panel>
<layout_panel name="start_location_panel">
<text name="start_location_text">
- Hier anfangen:
+ Hier starten:
</text>
<combo_box name="start_location_combo">
<combo_box.item label="Mein letzter Standort" name="MyLastLocation"/>
@@ -28,19 +28,19 @@
</layout_panel>
<layout_panel name="links_login_panel">
<text name="login_help">
- Sie brauchen Hilfe?
+ Brauchen Sie Hilfe beim Anmelden?
</text>
<text name="forgot_password_text">
Benutzernamen oder Kennwort vergessen?
</text>
<button label="Anmelden" name="connect_btn"/>
- <check_box label="Kennwort merken" name="remember_check"/>
+ <check_box label="Kennwort speichern" name="remember_check"/>
</layout_panel>
<layout_panel name="links">
<text name="create_account_text">
- CREATE YǾUR ACCǾUNT
+ IHR KONTO ERSTELLEN
</text>
- <button name="create_new_account_btn" label="Registrieren"/>
+ <button label="Jetzt starten" name="create_new_account_btn"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/de/panel_navmesh_rebake.xml
deleted file mode 100644
index 44be6d67b1..0000000000
--- a/indra/newview/skins/default/xui/de/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_navmesh_rebake">
- <button label="Region neu formen" name="navmesh_btn" tool_tip="Klicken, um das Navmesh der Region neu zu formen."/>
- <button label="Neuformen wird angefordert" name="navmesh_btn_sending" tool_tip="Anforderung zum Neuformen wird an den Server gesendet."/>
- <button label="Region wird neu geformt" name="navmesh_btn_baking" tool_tip="Region wird neu geformt. Nach Abschluss des Vorgangs verschwindet diese Schaltfläche."/>
-</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml
index 08cc0b0ec8..69cf6d98de 100644
--- a/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="chat_bar">
+<panel name="nearby_chat">
<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_region_debug.xml b/indra/newview/skins/default/xui/de/panel_region_debug.xml
index 4a85bd85fd..a03a0b8b7b 100644
--- a/indra/newview/skins/default/xui/de/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_debug.xml
@@ -36,5 +36,5 @@
<button label="?" name="top_scripts_help"/>
<button label="Region neu starten" name="restart_btn" tool_tip="2-Minuten-Countdown und Region neu starten"/>
<button label="?" name="restart_help"/>
- <button label="Neustart abbrechen" name="cancel_restart_btn" tool_tip="Regionsneustart um eine Stunde verschieben"/>
+ <button label="Neustart abbrechen" name="cancel_restart_btn" tool_tip="Regionsneustart abbrechen"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/de/panel_volume_pulldown.xml
index e6ab9165d7..3d43200e48 100644
--- a/indra/newview/skins/default/xui/de/panel_volume_pulldown.xml
+++ b/indra/newview/skins/default/xui/de/panel_volume_pulldown.xml
@@ -1,15 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="volumepulldown_floater" width="240">
<button left="217" name="prefs_btn"/>
- <slider label="Master" name="System Volume" label_width="80" width="180"/>
- <slider label="Schaltflächen" label_width="80" width="180" name="UI Volume"/>
- <slider label="Umgebung" label_width="80" width="180" name="Wind Volume"/>
- <slider label="Soundeffekte" label_width="80" width="180" name="SFX Volume"/>
- <check_box name="gesture_audio_play_btn" tool_tip="Sounds von Gesten abspielen"/>
- <slider label="Musikstream" label_width="80" width="180" name="Music Volume"/>
- <check_box tool_tip="Musikstream aktivieren" name="enable_music"/>
- <slider label="Medien" label_width="80" width="180" name="Media Volume"/>
- <check_box tool_tip="Medienstream aktivieren" name="enable_media"/>
- <slider label="Voice-Chat" label_width="80" width="180" name="Voice Volume"/>
- <check_box tool_tip="Voice-Chat aktivieren" name="enable_voice_check"/>
+ <slider label="Master" label_width="80" name="System Volume" width="180"/>
+ <slider label="Schaltflächen" label_width="80" name="UI Volume" width="180"/>
+ <slider label="Umgebung" label_width="80" name="Wind Volume" width="180"/>
+ <slider label="Sounds" label_width="80" name="SFX Volume" width="180"/>
+ <check_box name="gesture_audio_play_btn" tool_tip="Sounds von Gesten aktivieren"/>
+ <slider label="Musik" label_width="80" name="Music Volume" width="180"/>
+ <check_box name="enable_music" tool_tip="Streaming-Musik aktivieren"/>
+ <slider label="Medien" label_width="80" name="Media Volume" width="180"/>
+ <check_box name="enable_media" tool_tip="Streaming-Medien aktivieren"/>
+ <slider label="Voice" label_width="80" name="Voice Volume" width="180"/>
+ <check_box name="enable_voice_check" tool_tip="Voice-Chat aktivieren"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 206b631874..79cb73ecf9 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -137,7 +137,7 @@
Beenden
</string>
<string name="create_account_url">
- http://join.secondlife.com/index.php?lang=de-DE
+ http://join.secondlife.com/index.php?lang=de-DE&amp;sourceid=[sourceid]
</string>
<string name="LoginFailedViewerNotPermitted">
Mit dem von Ihnen verwendeten Viewer ist der Zugriff auf Second Life nicht mehr möglich. Laden Sie von den folgenden Seite einen neuen Viewer herunter:
@@ -1414,6 +1414,12 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="InvFolder favorite">
Meine Favoriten
</string>
+ <string name="InvFolder Favorites">
+ Meine Favoriten
+ </string>
+ <string name="InvFolder favorites">
+ Meine Favoriten
+ </string>
<string name="InvFolder Current Outfit">
Aktuelles Outfit
</string>
@@ -1429,6 +1435,12 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="InvFolder Meshes">
Netze
</string>
+ <string name="InvFolder Received Items">
+ Erhaltene Artikel
+ </string>
+ <string name="InvFolder Merchant Outbox">
+ Händler-Outbox
+ </string>
<string name="InvFolder Friends">
Freunde
</string>
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 4e0cfb0cd4..e7ab3cacdc 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="ADJUST CONTENT PERMISSIONS"
width="410">
<floater.string
name="nothing_to_modify_text">
@@ -192,7 +192,7 @@
name="newperms"
top="90"
width="250">
- New Content Permissions
+ Adjust Content Permissions To
</text>
<text
type="string"
@@ -292,11 +292,22 @@
height="23"
label="OK"
layout="topleft"
- left="205"
- name="apply"
+ left="110"
+ name="ok"
top_pad="10"
width="90">
<button.commit_callback
+ function="BulkPermission.Ok"/>
+ </button>
+ <button
+ follows="left|top"
+ height="23"
+ label="Apply"
+ layout="topleft"
+ left_pad="5"
+ name="apply"
+ width="90">
+ <button.commit_callback
function="BulkPermission.Apply"/>
</button>
<button
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index 22bc488a92..521389d7b3 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
positioning="specified"
- left="458"
- bottom="-80"
+ right="-460"
+ bottom="-50"
follows="left|bottom"
legacy_header_height="18"
can_minimize="true"
diff --git a/indra/newview/skins/default/xui/en/floater_chat_bar.xml b/indra/newview/skins/default/xui/en/floater_chat_bar.xml
deleted file mode 100644
index 405557242f..0000000000
--- a/indra/newview/skins/default/xui/en/floater_chat_bar.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- positioning="specified"
- left="10"
- bottom="-10"
- height="60"
- layout="topleft"
- legacy_header_height="25"
- single_instance="true"
- title="NEARBY CHAT"
- save_rect="true"
- save_visibility="true"
- can_close="true"
- can_minimize="true"
- help_topic="chat_bar"
- min_height="60"
- min_width="150"
- can_resize="true"
- default_tab_group="1"
- name="chat_bar"
- width="300">
- <panel
- top="20"
- class="panel_nearby_chat"
- follow="all"
- width="300"
- height="0"
- visible="false"
- filename="panel_nearby_chat.xml"
- name="nearby_chat" />
- <panel width="300"
- height="31"
- left="0"
- name="bottom_panel"
- bottom="-1"
- follows="left|right|bottom"
- tab_group="1">
- <line_editor
- border_style="line"
- border_thickness="1"
- follows="left|right"
- height="23"
- label="Click here to chat."
- layout="topleft"
- left_delta="7"
- left="0"
- max_length_bytes="1023"
- name="chat_box"
- spellcheck="true"
- text_pad_left="5"
- text_pad_right="25"
- tool_tip="Press Enter to say, Ctrl+Enter to shout"
- top="2"
- width="255" />
- <output_monitor
- auto_update="true"
- follows="right"
- draw_border="false"
- height="16"
- layout="topleft"
- left_pad="-24"
- mouse_opaque="true"
- name="chat_zone_indicator"
- top="6"
- visible="true"
- width="20" />
- <button
- follows="right"
- is_toggle="true"
- width="20"
- top="2"
- layout="topleft"
- left_pad="12"
- image_disabled="ComboButton_UpOff"
- image_unselected="ComboButton_UpOff"
- image_selected="ComboButton_On"
- image_pressed="ComboButton_UpSelected"
- image_pressed_selected="ComboButton_Selected"
- height="23"
- chrome="true"
- name="show_nearby_chat"
- tool_tip="Shows/hides nearby chat log">
- </button>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_conversation_log.xml b/indra/newview/skins/default/xui/en/floater_conversation_log.xml
new file mode 100644
index 0000000000..19a4cbc119
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_conversation_log.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+
+<floater
+ can_resize="true"
+ positioning="cascading"
+ help_topic="conversation_log"
+ height="200"
+ min_height="100"
+ min_width="230"
+ layout="topleft"
+ name="floater_conversation_log"
+ save_rect="true"
+ single_instance="true"
+ reuse_instance="true"
+ title="CONVERSATION LOG"
+ width="300">
+ <panel
+ follows="left|top|right"
+ height="32"
+ left="0"
+ name="buttons_panel"
+ top="0">
+ <filter_editor
+ follows="left|top|right"
+ height="23"
+ layout="topleft"
+ left="8"
+ label="Filter People"
+ max_length_chars="300"
+ name="people_filter_input"
+ text_color="Black"
+ text_pad_left="10"
+ top="4"
+ width="204" />
+ <menu_button
+ follows="top|right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_sort"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="8"
+ menu_filename="menu_conversation_log_view.xml"
+ menu_position="bottomleft"
+ name="conversation_view_btn"
+ tool_tip="View/sort options"
+ top="3"
+ width="31" />
+ <menu_button
+ follows="top|right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="8"
+ name="conversations_gear_btn"
+ tool_tip="Actions on selected person or group"
+ top="3"
+ width="31" />
+ </panel>
+ <panel
+ bottom="-1"
+ follows="all"
+ left="0"
+ name="log_panel"
+ right="-1"
+ top="32">
+ <conversation_log_list
+ allow_select="true"
+ bottom="-8"
+ opaque="true"
+ follows="all"
+ left="8"
+ keep_selection_visible_on_reshape="true"
+ item_pad="2"
+ multi_select="false"
+ name="conversation_log_list"
+ right="-8"
+ top="0" />
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_conversation_preview.xml b/indra/newview/skins/default/xui/en/floater_conversation_preview.xml
new file mode 100644
index 0000000000..764b9d8385
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_conversation_preview.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_resize="true"
+ default_tab_group="1"
+ help_topic="conversation_preview"
+ height="391"
+ layout="topleft"
+ min_height="243"
+ min_width="234"
+ name="preview_conversation"
+ title="CONVERSATION:"
+ width="400">
+ <floater.string
+ name="Title">
+ CONVERSATION: [NAME]
+ </floater.string>
+ <chat_history
+ font="SansSerifSmall"
+ follows="all"
+ visible="true"
+ height="330"
+ name="chat_history"
+ notify_unread_msg="false"
+ parse_highlights="true"
+ parse_urls="true"
+ left="5"
+ top_pad="25"
+ width="390">
+ </chat_history>
+ <text
+ follows="bottom|right"
+ font="SansSerif"
+ height="22"
+ layout="topleft"
+ name="page_label"
+ right="-110"
+ top_pad="7"
+ value="Page"
+ width="35">
+ </text>
+ <spinner
+ allow_digits_only="true"
+ decimal_digits="0"
+ follows="bottom|right"
+ height="23"
+ increment="1"
+ label_width="40"
+ layout="topleft"
+ left_pad="0"
+ name="history_page_spin"
+ top_delta="-3"
+ width="50"/>
+ <text
+ follows="bottom|right"
+ font="SansSerif"
+ height="22"
+ layout="topleft"
+ name="page_num_label"
+ left_pad="5"
+ top_delta="4"
+ width="40">
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_destinations.xml b/indra/newview/skins/default/xui/en/floater_destinations.xml
index 39aa8e07bb..94ebaa9cb2 100644
--- a/indra/newview/skins/default/xui/en/floater_destinations.xml
+++ b/indra/newview/skins/default/xui/en/floater_destinations.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
- positioning="cascading"
+ positioning="cascading"
ignore_ui_scale="false"
legacy_header_height="225"
can_minimize="true"
@@ -17,11 +17,11 @@
save_rect="true"
save_visibility="true"
title="DESTINATIONS"
- width="840">
+ width="550">
<web_browser
top="25"
height="200"
- width="840"
+ width="550"
follows="all"
name="destination_guide_contents"
trusted_content="true"/>
diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml
index e123de46c2..65f623a47e 100644
--- a/indra/newview/skins/default/xui/en/floater_im_container.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_container.xml
@@ -1,49 +1,180 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<multi_floater
- can_close="false"
+ can_close="true"
can_minimize="true"
can_resize="true"
- height="390"
+ height="210"
layout="topleft"
name="floater_im_box"
help_topic="floater_im_box"
save_rect="true"
save_visibility="true"
single_instance="true"
+ reuse_instance="true"
title="CONVERSATIONS"
- width="396">
- <tab_container
- follows="left|right|top|bottom"
- height="390"
+ bottom="-50"
+ right="-5"
+ width="450"
+ min_width="38">
+ <string
+ name="collapse_icon"
+ value="Conv_toolbar_collapse"/>
+ <string
+ name="expand_icon"
+ value="Conv_toolbar_expand"/>
+ <layout_stack
+ animate="true"
+ bottom="-1"
+ follows="all"
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"
- halign="left"
- use_ellipses="true"
- top="0"
- width="394">
- <first_tab
- tab_bottom_image_flash="Toolbar_Left_Flash"/>
- <middle_tab
- tab_bottom_image_flash="Toolbar_Middle_Flash"/>
- <last_tab
- tab_bottom_image_flash="Toolbar_Right_Flash"/>
- </tab_container>
- <icon
- color="DefaultShadowLight"
- enabled="false"
- follows="left|right|bottom"
- height="17"
- image_name="tabarea.tga"
- layout="bottomleft"
- left="1"
- name="im_box_tab_container_icon"
- bottom="10"
- width="394" />
+ left="0"
+ name="conversations_stack"
+ orientation="horizontal"
+ right="-1"
+ top="0">
+ <layout_panel
+ auto_resize="false"
+ user_resize="true"
+ name="conversations_layout_panel"
+ min_dim="38"
+ expanded_min_dim="156">
+ <layout_stack
+ animate="false"
+ follows="left|top|right"
+ height="35"
+ layout="topleft"
+ left="0"
+ name="conversations_pane_buttons_stack"
+ orientation="horizontal"
+ right="-1"
+ top="0">
+ <layout_panel
+ auto_resize="true"
+ height="35"
+ name="conversations_pane_buttons_expanded">
+ <menu_button
+ follows="top|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_sort"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ menu_filename="menu_participant_view.xml"
+ layout="topleft"
+ left="5"
+ name="sort_btn"
+ tool_tip="View/sort options"
+ top="5"
+ width="31" />
+ <button
+ follows="top|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_plus"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ top="5"
+ left_pad="2"
+ name="add_btn"
+ tool_tip="Start a new conversation"
+ width="31"/>
+ <button
+ follows="top|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Command_Speak_Icon"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ top="5"
+ left_pad="2"
+ name="speak_btn"
+ tool_tip="Speak with people using your microphone"
+ width="31"/>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ height="35"
+ name="conversations_pane_buttons_collapsed"
+ width="41">
+ <button
+ follows="right|top"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_collapse"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ top="5"
+ left="1"
+ name="expand_collapse_btn"
+ tool_tip="Collapse/Expand this list"
+ width="31" />
+ </layout_panel>
+ </layout_stack>
+ <panel
+ bottom="-1"
+ follows="all"
+ layout="topleft"
+ name="conversations_list_panel"
+ opaque="true"
+ top="35"
+ left="5"
+ right="-1"/>
+ </layout_panel>
+ <layout_panel
+ auto_resize="true"
+ user_resize="true"
+ name="messages_layout_panel"
+ expanded_min_dim="222">
+ <panel_container
+ bottom="-1"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="im_box_tab_container"
+ right="-1"
+ top="0">
+ <panel
+ bottom="-1"
+ follows="all"
+ layout="topleft"
+ name="stub_panel"
+ opaque="true"
+ top_pad="0"
+ left="0"
+ right="-1">
+ <button
+ follows="right|top"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_collapse"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ top="5"
+ right="-10"
+ name="stub_collapse_btn"
+ tool_tip="Collapse this pane"
+ width="31" />
+ <text
+ type="string"
+ clip_partial="false"
+ follows="left|top|right"
+ layout="topleft"
+ left="15"
+ right="-15"
+ name="stub_textbox"
+ top="25"
+ height="40"
+ valign="center"
+ parse_urls="true"
+ wrap="true">
+ This conversation is in a separate window. [secondlife:/// Bring it back.]
+ </text>
+ </panel>
+ </panel_container>
+ </layout_panel>
+ </layout_stack>
</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 040b66623e..d8b085063f 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
- legacy_header_height="18"
background_visible="true"
default_tab_group="1"
height="355"
@@ -10,84 +9,393 @@
can_dock="false"
can_minimize="true"
can_close="true"
+ save_rect="true"
visible="false"
width="394"
can_resize="true"
- min_width="250"
- min_height="190">
+ can_tear_off="false"
+ min_height="190"
+ positioning="relative">
+ <floater.string name="call_btn_start">Conv_toolbar_open_call</floater.string>
+ <floater.string name="call_btn_stop">Conv_toolbar_hang_up</floater.string>
+ <floater.string
+ name="collapseline_icon"
+ value="Conv_collapse_to_one_line"/>
+ <floater.string
+ name="expandline_icon"
+ value="Conv_expand_one_line"/>
+ <floater.string
+ name="collapse_icon"
+ value="Conv_toolbar_collapse"/>
+ <floater.string
+ name="expand_icon"
+ value="Conv_toolbar_expand"/>
+ <floater.string
+ name="tear_off_icon"
+ value="Conv_toolbar_arrow_ne"/>
+ <floater.string
+ name="return_icon"
+ value="Conv_toolbar_arrow_sw"/>
+ <floater.string
+ name="participant_added"
+ value="[NAME] was invited to the conversation."/>
+ <floater.string
+ name="multiple_participants_added"
+ value="[NAME] were invited to the conversation."/>
+ <floater.string
+ name="tooltip_to_separate_window"
+ value="Move this conversation to a separate window"/>
+ <floater.string
+ name="tooltip_to_main_window"
+ value="Move this conversation back to main window"/>
+ <floater.string
+ name="start_call_button_tooltip"
+ value="Open voice connection"/>
+ <floater.string
+ name="end_call_button_tooltip"
+ value="Close voice connection"/>
+ <floater.string
+ name="expcol_button_not_tearoff_tooltip"
+ value="Collapse this pane"/>
+ <floater.string
+ name="expcol_button_tearoff_and_expanded_tooltip"
+ value="Collapse participant list"/>
+ <floater.string
+ name="expcol_button_tearoff_and_collapsed_tooltip"
+ value="Expand participant list"/>
+ <view
+ follows="all"
+ layout="topleft"
+ name="contents_view"
+ top="0"
+ left="0"
+ height="355"
+ width="394">
+ <layout_stack
+ animate="false"
+ default_tab_group="2"
+ follows="all"
+ height="355"
+ width="394"
+ layout="topleft"
+ orientation="vertical"
+ name="main_stack"
+ tab_group="1"
+ top="0"
+ left="0">
+
+ <layout_panel
+ follows="left|top|right"
+ layout="topleft"
+ name="toolbar_panel"
+ top="0"
+ left="0"
+ height="35"
+ min_height="35"
+ width="394">
+ <menu_button
+ menu_filename="menu_im_session_showmodes.xml"
+ follows="top|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_sort"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left="5"
+ name="view_options_btn"
+ tool_tip="View/sort options"
+ top="5"
+ width="31" />
+ <menu_button
+ menu_filename="menu_im_conversation.xml"
+ follows="top|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ top="5"
+ left_pad="2"
+ name="gear_btn"
+ visible="false"
+ tool_tip="Actions on selected person"
+ width="31"/>
+ <button
+ enabled="false"
+ follows="top|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_add_person"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ top="5"
+ left_pad="2"
+ name="add_btn"
+ tool_tip="Add someone to this conversation"
+ width="31"/>
+ <button
+ follows="top|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_open_call"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ top="5"
+ left_pad="2"
+ name="voice_call_btn"
+ tool_tip="Open voice connection"
+ width="31"/>
+ <output_monitor
+ auto_update="true"
+ follows="top|left"
+ draw_border="false"
+ height="16"
+ layout="topleft"
+ top="10"
+ left_pad="10"
+ mouse_opaque="true"
+ name="speaking_indicator"
+ visible="false"
+ width="20" />
+ <button
+ follows="right|top"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_close"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ top="5"
+ left="292"
+ name="close_btn"
+ tool_tip="End this conversation"
+ width="31" />
+ <button
+ follows="right|top"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_collapse"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ top="5"
+ left_pad="2"
+ name="expand_collapse_btn"
+ tool_tip="Collapse/Expand this pane"
+ width="31" />
+ <button
+ follows="right|top"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_arrow_ne"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ top="5"
+ left_pad="2"
+ name="tear_off_btn"
+ width="31" />
+ </layout_panel>
+ <layout_panel
+ name="body_panel"
+ follows="all"
+ width="394"
+ height="235"
+ user_resize="false"
+ auto_resize="true">
<layout_stack
animate="true"
default_tab_group="2"
follows="all"
- height="320"
+ height="275"
width="394"
layout="topleft"
orientation="horizontal"
name="im_panels"
tab_group="1"
- top="20"
+ top_pad="0"
left="0">
<layout_panel
- name="im_control_panel_holder"
- min_width="115"
+ name="speakers_list_panel"
+ follows="all"
+ expanded_min_dim="115"
+ min_dim="0"
width="150"
- height="320"
+ height="275"
+ user_resize="true"
auto_resize="false">
- <panel
- name="panel_im_control_panel"
- layout="topleft"
- height="320"
- width="150"
- follows="all"/>
</layout_panel>
<layout_panel
default_tab_group="3"
left="0"
tab_group="2"
+ follows="all"
top="0"
- height="200"
- width="244"
- user_resize="true">
- <button
- height="20"
- follows="left|top"
- top="0"
- left="2"
- image_overlay="TabIcon_Open_Off"
+ height="275"
+ width="244"
+ layout="topleft"
+ user_resize="true"
+ auto_resize="true"
+ visible="true"
+ name="right_part_holder"
+ min_width="221">
+ <panel
+ name="trnsAndChat_panel"
+ follows="all"
+ layout="topleft"
+ visible="true"
+ height="240"
+ width="244">
+ <layout_stack
+ animate="true"
+ default_tab_group="2"
+ follows="all"
+ height="240"
+ width="244"
layout="topleft"
- width="25"
- name="slide_left_btn" />
- <button
- height="20"
- follows="left|top"
+ visible="true"
+ orientation="vertical"
+ name="translate_and_chat_stack"
+ tab_group="1"
+ left_pad="0"
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"
- parse_urls="true"
- left="1"
- width="238">
- </chat_history>
- <line_editor
- bottom="0"
- left="3"
- follows="left|right|bottom"
- font="SansSerifSmall"
- height="20"
- label="To"
- layout="bottomleft"
- name="chat_editor"
- spellcheck="true"
- tab_group="3"
- width="236">
- </line_editor>
+ left="0">
+ <layout_panel
+ auto_resize="false"
+ user_resize="false"
+ height="26"
+ layout="topleft"
+ left_delta="0"
+ name="translate_chat_checkbox_lp"
+ top_delta="0"
+ visible="true"
+ width="210">
+ <check_box
+ top="10"
+ control_name="TranslateChat"
+ enabled="true"
+ height="16"
+ label="Translate chat"
+ layout="topleft"
+ left="5"
+ name="translate_chat_checkbox"
+ width="230" />
+ </layout_panel>
+ <layout_panel
+ width="210"
+ layout="topleft"
+ follows="all"
+ left_delta="0"
+ top_delta="0"
+ bottom="0"
+ visible="true"
+ user_resize="false"
+ auto_resize="true"
+ name="chat_holder">
+ <chat_history
+ font="SansSerifSmall"
+ follows="all"
+ visible="true"
+ name="chat_history"
+ parse_highlights="true"
+ parse_urls="true"
+ layout="topleft"
+ right="-5"
+ left="5"
+ top="0"
+ bottom="1">
+ </chat_history>
+ </layout_panel>
+ </layout_stack>
+ </panel>
</layout_panel>
</layout_stack>
+ </layout_panel>
+ <layout_panel
+ height="35"
+ layout="topleft"
+ follows="left|right|bottom"
+ left_delta="0"
+ right="0"
+ top_delta="0"
+ bottom="0"
+ visible="true"
+ user_resize="false"
+ auto_resize="false"
+ name="chat_layout_panel">
+ <layout_stack
+ animate="true"
+ default_tab_group="2"
+ follows="all"
+ height="35"
+ right="0"
+ layout="topleft"
+ orientation="horizontal"
+ name="input_panels"
+ top_pad="0"
+ left="0">
+ <layout_panel
+ height="35"
+ layout="topleft"
+ follows="left|right|bottom"
+ left_delta="0"
+ top_delta="0"
+ bottom="0"
+ visible="true"
+ user_resize="false"
+ auto_resize="true"
+ name="input_editor_layout_panel">
+ <chat_editor
+ expand_lines_count="5"
+ follows="left|right|bottom"
+ font="SansSerifSmall"
+ visible="true"
+ height="20"
+ is_expandable="true"
+ label="To"
+ text_tentative_color="TextFgTentativeColor"
+ layout="topleft"
+ name="chat_editor"
+ max_length="1023"
+ spellcheck="true"
+ tab_group="3"
+ width="160"
+ top="6"
+ left="5"
+ right="-5"
+ wrap="true">
+ </chat_editor>
+ </layout_panel>
+ <layout_panel
+ height="35"
+ layout="topleft"
+ follows="left|right|bottom"
+ left_delta="0"
+ top_delta="0"
+ bottom="0"
+ width="35"
+ visible="true"
+ user_resize="false"
+ auto_resize="false"
+ name="input_button_layout_panel">
+ <button
+ follows="left|right|bottom"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_expand_one_line"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ name="minz_btn"
+ tool_tip="Shows/hides message panel"
+ width="28"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+ </view>
</floater>
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 81194f61cf..a7864381a9 100644
--- a/indra/newview/skins/default/xui/en/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
@@ -8,8 +8,8 @@
layout="topleft"
name="incoming call"
help_topic="incoming_call"
- title="Incoming call"
- width="410">
+ sound_flags="0"
+ width="550">
<floater.string
name="lifetime">
5
@@ -24,7 +24,7 @@
</floater.string>
<floater.string
name="VoiceInviteP2P">
- is calling.
+ is calling you.
</floater.string>
<floater.string
name="VoiceInviteAdHoc">
@@ -49,14 +49,14 @@
image_name="icon_avatar_online.tga"
layout="topleft"
left_delta="19"
- top="35"
+ top="20"
width="36" />
<group_icon
enabled="false"
follows="left|top"
height="36"
layout="topleft"
- top="35"
+ top="20"
width="36" />
<text
clip_partial="true"
@@ -67,43 +67,43 @@
name="caller name"
top="20"
use_ellipses="true"
- width="315"
+ width="475"
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
+ <button
height="24"
- label="Accept"
- label_selected="Accept"
+ label="Answer"
+ label_selected="Answer"
layout="topleft"
left="70"
name="Accept"
- top="92"
- width="100" />
+ top_pad="5"
+ width="120" />
<button
height="24"
- label="Reject"
- label_selected="Reject"
+ label="Ignore"
+ label_selected="Ignore"
layout="topleft"
name="Reject"
left_pad="10"
- width="100" />
+ width="120" />
<button
height="24"
- label="Start IM"
+ label="Open IM instead"
layout="topleft"
name="Start IM"
left_pad="10"
- width="100" />
+ width="120" />
+ <text
+ clip_partial="true"
+ font="SansSerif"
+ height="30"
+ layout="topleft"
+ left="77"
+ name="question"
+ top_pad="5"
+ use_ellipses="true"
+ width="475"
+ word_wrap="true">
+ If you answer, you will be disconnected from your current voice conversation.
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_moveview.xml b/indra/newview/skins/default/xui/en/floater_moveview.xml
index 4e7ee7913f..5e84283ab0 100644
--- a/indra/newview/skins/default/xui/en/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/en/floater_moveview.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
positioning="specified"
- left="320"
- bottom="-80"
+ right="-693"
+ bottom="-50"
legacy_header_height="18"
can_dock="false"
can_minimize="true"
diff --git a/indra/newview/skins/default/xui/en/floater_my_inventory.xml b/indra/newview/skins/default/xui/en/floater_my_inventory.xml
index ea44fd493e..178987962b 100644
--- a/indra/newview/skins/default/xui/en/floater_my_inventory.xml
+++ b/indra/newview/skins/default/xui/en/floater_my_inventory.xml
@@ -6,7 +6,7 @@
height="570"
help_topic="sidebar_inventory"
min_width="333"
- min_height="560"
+ min_height="570"
name="floater_my_inventory"
save_rect="true"
save_visibility="true"
diff --git a/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml
index 2629313069..79f2027c31 100644
--- a/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml
+++ b/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml
@@ -152,7 +152,7 @@
</text>
<check_box
height="19"
- label="World"
+ label="Test"
layout="topleft"
name="show_world"
top_pad="4"
diff --git a/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml
index 9bc5c7d5a4..4a457fb929 100644
--- a/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml
+++ b/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml
@@ -6,7 +6,7 @@
height="395"
width="1075"
min_height="395"
- min_width="1075"
+ min_width="990"
layout="topleft"
name="floater_pathfinding_linksets"
help_topic="floater_pathfinding_linksets"
@@ -524,7 +524,7 @@
tool_tip="Walkability for characters of type D. Example character type is other."
width="45" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="21"
label="Apply changes"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_people.xml b/indra/newview/skins/default/xui/en/floater_people.xml
index 08d0b00a83..701233ba4a 100644
--- a/indra/newview/skins/default/xui/en/floater_people.xml
+++ b/indra/newview/skins/default/xui/en/floater_people.xml
@@ -6,21 +6,21 @@
can_resize="true"
height="570"
help_topic="sidebar_people"
- min_height="440"
- min_width="333"
+ min_height="220"
+ min_width="260"
layout="topleft"
name="floater_people"
save_rect="true"
single_instance="true"
reuse_instance="true"
title="PEOPLE"
- width="333">
+ width="370">
<panel_container
default_panel_name="panel_people"
follows="all"
height="570"
name="main_panel"
- width="333">
+ width="370">
<panel
class="panel_people"
name="panel_people"
@@ -31,11 +31,5 @@
filename="panel_group_info_sidetray.xml"
label="Group Profile"
font="SansSerifBold"/>
- <panel
- class="panel_block_list_sidetray"
- name="panel_block_list_sidetray"
- filename="panel_block_list_sidetray.xml"
- label="Blocked Residents &amp; Objects"
- font="SansSerifBold"/>
</panel_container>
</floater>
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 2e29c61cb2..6021ba0a5a 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
@@ -134,16 +134,6 @@
top_delta="-25"
name="Pipette"
width="28" />
- <check_box
- follows="left|bottom"
- height="20"
- initial_value="true"
- label="Live Preview"
- layout="topleft"
- left="4"
- name="apply_immediate_check"
- top="262"
- width="120" />
<text
follows="left|bottom"
height="20"
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 5204efbf65..436e9f8fed 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -2994,7 +2994,7 @@ even though the user gets a free copy.
use_ellipses="true"
read_only="true"
name="media_info"
- width="280" />
+ width="180" />
<web_browser
visible="false"
enabled="false"
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 06d4327293..eb01294831 100644
--- a/indra/newview/skins/default/xui/en/floater_ui_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_ui_preview.xml
@@ -5,7 +5,7 @@
height="640"
layout="topleft"
min_height="230"
- min_width="650"
+ min_width="750"
name="gui_preview_tool"
help_topic="gui_preview_tool"
single_instance="true"
diff --git a/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml
new file mode 100644
index 0000000000..5c71fd3bc6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+
+<floater
+ legacy_header_height="25"
+ bevel_style="in"
+ bg_opaque_image="Inspector_Background"
+ can_close="false"
+ can_minimize="false"
+ height="90"
+ layout="topleft"
+ name="floater_voice_volume"
+ single_instance="true"
+ sound_flags="0"
+ title="VOICE CHAT VOLUME"
+ visible="true"
+ width="245">
+ <slider
+ control_name="AudioLevelVoice"
+ disabled_control="MuteAudio"
+ follows="left|top"
+ height="16"
+ increment="0.025"
+ initial_value="0.5"
+ label="Voice Chat"
+ label_width="50"
+ layout="topleft"
+ left="15"
+ top="50"
+ name="chat_voice_volume"
+ show_text="false"
+ slider_label.halign="right"
+ volume="true"
+ width="200">
+ </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" />
+</floater> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
deleted file mode 100644
index dce2720cf8..0000000000
--- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml
+++ /dev/null
@@ -1,155 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- positioning="cascading"
- can_resize="true"
- can_minimize="true"
- can_close="true"
- chrome="true"
- height="205"
- layout="topleft"
- min_height="124"
- min_width="190"
- name="floater_voice_controls"
- help_topic="floater_voice_controls"
- title="VOICE CONTROLS"
- save_dock_state="true"
- save_visibility="true"
- save_rect="true"
- single_instance="true"
- width="282">
- <string
- name="title_nearby">
- VOICE SETTINGS
- </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"
- auto_resize="false"
- layout="topleft"
- min_height="20"
- height="20"
- 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="My 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 name="leave_call_panel" height="26" min_height="26" auto_resize="false">
- <layout_stack
- clip="true"
- follows="left|top|right"
- height="26"
- layout="topleft"
- mouse_opaque="false"
- name="voice_effect_and_leave_call_stack"
- orientation="horizontal"
- width="262">
- <layout_panel
- height="26"
- width="200">
- <panel
- class="panel_voice_effect"
- name="panel_voice_effect"
- visiblity_control="VoiceMorphingEnabled"
- filename="panel_voice_effect.xml" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|right"
- height="23"
- visible="true"
- layout="topleft"
- name="leave_call_btn_panel"
- width="100">
- <button
- follows="right|top"
- height="23"
- label="Leave Call"
- name="leave_call_btn"
- width="100" />
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel
- follows="all"
- layout="topleft"
- left="2"
- top_pad="0"
- height="132"
- name="callers_panel"
- auto_resize="true"
- 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_voice_effect.xml b/indra/newview/skins/default/xui/en/floater_voice_effect.xml
index 35cb2670d0..146c3d7e30 100644
--- a/indra/newview/skins/default/xui/en/floater_voice_effect.xml
+++ b/indra/newview/skins/default/xui/en/floater_voice_effect.xml
@@ -5,12 +5,13 @@
height="500"
name="voice_effects"
help_topic="voice_effects"
- title="VOICE MORPHING"
+ title="VOICE MORPHING PREVIEW"
background_visible="true"
label="Places"
layout="topleft"
min_height="360"
min_width="200"
+ save_rect="true"
width="300">
<string name="no_voice_effect">
(No Voice Morph)
diff --git a/indra/newview/skins/default/xui/en/floater_voice_volume.xml b/indra/newview/skins/default/xui/en/floater_voice_volume.xml
new file mode 100644
index 0000000000..9346295d5b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_voice_volume.xml
@@ -0,0 +1,59 @@
+<?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="90"
+ layout="topleft"
+ name="floater_voice_volume"
+ single_instance="true"
+ sound_flags="0"
+ title="VOICE VOLUME"
+ visible="true"
+ width="245">
+ <text
+ follows="top|left|right"
+ font="SansSerifSmall"
+ height="21"
+ left="10"
+ name="avatar_name"
+ parse_urls="false"
+ top="35"
+ text_color="White"
+ translate="false"
+ use_ellipses="true"
+ value="TestString PleaseIgnore"
+ width="225" />
+ <slider
+ follows="top|left"
+ height="23"
+ increment="0.01"
+ left="1"
+ max_val="0.95"
+ min_val="0.05"
+ name="volume_slider"
+ show_text="false"
+ tool_tip="Voice volume"
+ top_pad="0"
+ value="0.5"
+ width="200" />
+ <button
+ follows="top|left"
+ height="16"
+ 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"
+ width="16" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml
index bc3bcd331b..ef4f19cd4c 100644
--- a/indra/newview/skins/default/xui/en/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml
@@ -2,14 +2,14 @@
<!--
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="164"
+ height="160"
layout="topleft"
name="inspect_avatar"
single_instance="true"
@@ -98,13 +98,13 @@
follows="top|left"
height="23"
increment="0.01"
- left="1"
+ left="10"
max_val="0.95"
min_val="0.05"
name="volume_slider"
show_text="false"
tool_tip="Voice volume"
- top_pad="0"
+ top_pad="5"
value="0.5"
width="200" />
<button
@@ -116,10 +116,21 @@
image_selected="AudioMute_Off"
image_unselected="Audio_Off"
is_toggle="true"
- left_pad="0"
+ left_pad="5"
top_delta="4"
name="mute_btn"
width="16" />
+ <text
+ follows="top|left"
+ height="16"
+ left="8"
+ name="avatar_profile_link"
+ font="SansSerifSmall"
+ text_color="White"
+ top_pad="5"
+ translate="false"
+ value="[[LINK] View full profile]"
+ width="175" />
<avatar_icon
follows="top|left"
height="38"
@@ -130,83 +141,4 @@
name="avatar_icon"
top="10"
width="38" />
-<!-- Overlapping buttons for default actions
- llinspectavatar.cpp makes visible the most likely default action
--->
- <button
- follows="top|left"
- height="20"
- label="Add Friend"
- left="8"
- top="135"
- name="add_friend_btn"
- 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="20"
- layout="topleft"
- image_overlay="OptionsMenu_Off"
- menu_filename="menu_inspect_avatar_gear.xml"
- name="gear_btn"
- right="-5"
- top_delta="0"
- width="35" />
- <menu_button
- follows="top|left"
- height="20"
- image_overlay="OptionsMenu_Off"
- menu_filename="menu_inspect_self_gear.xml"
- name="gear_self_btn"
- right="-5"
- top_delta="0"
- width="35" />
- <panel
- follows="top|left"
- top="164"
- 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/menu_cof_gear.xml b/indra/newview/skins/default/xui/en/menu_cof_gear.xml
index a6e9a40e31..45cf780557 100644
--- a/indra/newview/skins/default/xui/en/menu_cof_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_cof_gear.xml
@@ -9,5 +9,5 @@
<menu
label="New Body Parts"
layout="topleft"
- name="COF.Geear.New_Body_Parts" />
+ name="COF.Gear.New_Body_Parts" />
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_conversation.xml b/indra/newview/skins/default/xui/en/menu_conversation.xml
new file mode 100644
index 0000000000..5a13ef0a59
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_conversation.xml
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ bottom="806"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="menu_conversation_participant"
+ visible="false">
+ <menu_item_call
+ label="Close conversation"
+ layout="topleft"
+ name="close_conversation">
+ <on_click function="Avatar.DoToSelected" parameter="close_conversation"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Open voice conversation"
+ layout="topleft"
+ name="open_voice_conversation">
+ <on_click function="Avatar.DoToSelected" parameter="open_voice_conversation"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Disconnect from voice"
+ layout="topleft"
+ name="disconnect_from_voice">
+ <on_click function="Avatar.DoToSelected" parameter="disconnect_from_voice"/>
+ </menu_item_call>
+ <menu_item_separator layout="topleft" name="separator_disconnect_from_voice"/>
+ <menu_item_call
+ label="View Profile"
+ layout="topleft"
+ name="view_profile">
+ <on_click function="Avatar.DoToSelected" parameter="view_profile"/>
+ <on_enable function="Avatar.EnableItem" parameter="can_view_profile"/>
+ </menu_item_call>
+ <menu_item_call
+ label="IM"
+ layout="topleft"
+ name="im">
+ <on_click function="Avatar.DoToSelected" parameter="im"/>
+ <on_enable function="Avatar.EnableItem" parameter="can_im"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Offer teleport"
+ layout="topleft"
+ name="offer_teleport">
+ <on_click function="Avatar.DoToSelected" parameter="offer_teleport"/>
+ <on_enable function="Avatar.EnableItem" parameter="can_offer_teleport"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Voice call"
+ layout="topleft"
+ name="voice_call">
+ <on_click function="Avatar.DoToSelected" parameter="voice_call"/>
+ <on_enable function="Avatar.EnableItem" parameter="can_call" />
+ </menu_item_call>
+ <menu_item_call
+ label="Chat history..."
+ layout="topleft"
+ name="chat_history">
+ <on_click function="Avatar.DoToSelected" parameter="chat_history"/>
+ <on_enable function="Avatar.EnableItem" parameter="can_chat_history"/>
+ </menu_item_call>
+ <menu_item_separator layout="topleft" name="separator_chat_history"/>
+ <menu_item_call
+ label="Add friend"
+ layout="topleft"
+ name="add_friend">
+ <on_click function="Avatar.DoToSelected" parameter="add_friend"/>
+ <on_enable function="Avatar.EnableItem" parameter="can_add" />
+ </menu_item_call>
+ <menu_item_call
+ label="Remove friend"
+ layout="topleft"
+ name="remove_friend">
+ <on_click function="Avatar.DoToSelected" parameter="remove_friend" />
+ <on_enable function="Avatar.EnableItem" parameter="can_delete" />
+ </menu_item_call>
+ <menu_item_call
+ label="Remove friends"
+ layout="topleft"
+ name="remove_friends">
+ <on_click function="Avatar.DoToSelected" parameter="remove_friend" />
+ <on_enable function="Avatar.EnableItem" parameter="can_delete" />
+ </menu_item_call>
+ <menu_item_call
+ label="Invite to group..."
+ layout="topleft"
+ name="invite_to_group">
+ <on_click function="Avatar.DoToSelected" parameter="invite_to_group" />
+ <on_enable function="Avatar.EnableItem" parameter="can_invite" />
+ </menu_item_call>
+ <menu_item_separator layout="topleft" name="separator_invite_to_group"/>
+ <menu_item_call
+ label="Zoom In"
+ layout="topleft"
+ name="zoom_in">
+ <on_click function="Avatar.DoToSelected" parameter="zoom_in" />
+ <on_enable function="Avatar.EnableItem" parameter="can_zoom_in" />
+ </menu_item_call>
+ <menu_item_call
+ label="Map"
+ layout="topleft"
+ name="map">
+ <on_click function="Avatar.DoToSelected" parameter="map" />
+ <on_enable function="Avatar.EnableItem" parameter="can_show_on_map" />
+ </menu_item_call>
+ <menu_item_call
+ label="Share"
+ layout="topleft"
+ name="share">
+ <on_click function="Avatar.DoToSelected" parameter="share" />
+ <on_enable function="Avatar.EnableItem" parameter="can_share" />
+ </menu_item_call>
+ <menu_item_call
+ label="Pay"
+ layout="topleft"
+ name="pay">
+ <on_click function="Avatar.DoToSelected" parameter="pay" />
+ <on_enable function="Avatar.EnableItem" parameter="can_pay" />
+ </menu_item_call>
+ <menu_item_check
+ label="Block Voice"
+ layout="topleft"
+ name="block_unblock">
+ <on_click function="Avatar.DoToSelected" parameter="block_unblock" />
+ <on_check function="Avatar.CheckItem" parameter="is_blocked" />
+ <on_enable function="Avatar.EnableItem" parameter="can_block" />
+ </menu_item_check>
+ <menu_item_check
+ label="Block Text"
+ layout="topleft"
+ name="MuteText">
+ <on_click function="Avatar.DoToSelected" parameter="mute_unmute" />
+ <on_check function="Avatar.CheckItem" parameter="is_muted" />
+ <on_enable function="Avatar.EnableItem" parameter="can_block" />
+ </menu_item_check>
+ <menu_item_call
+ label="Group Profile"
+ layout="topleft"
+ name="group_profile">
+ <on_click function="Group.DoToSelected" parameter="group_profile"/>
+ <on_enable function="Avatar.EnableItem" parameter="can_group_profile" />
+ </menu_item_call>
+ <menu_item_call
+ label="Activate Group"
+ layout="topleft"
+ name="activate_group">
+ <on_click function="Group.DoToSelected" parameter="activate_group"/>
+ <on_enable function="Avatar.EnableItem" parameter="can_activate_group" />
+ </menu_item_call>
+ <menu_item_call
+ label="Leave Group"
+ layout="topleft"
+ name="leave_group">
+ <on_click function="Group.DoToSelected" parameter="leave_group"/>
+ <on_enable function="Avatar.EnableItem" parameter="can_leave_group" />
+ </menu_item_call>
+ <menu_item_separator layout="topleft" name="Moderator Options Separator"/>
+ <context_menu
+ label="Moderator Options"
+ layout="topleft"
+ name="Moderator Options">
+ <menu_item_check
+ label="Allow text chat"
+ layout="topleft"
+ name="AllowTextChat">
+ <on_check function="Avatar.CheckItem" parameter="is_allowed_text_chat" />
+ <on_click function="Avatar.DoToSelected" parameter="toggle_allow_text_chat" />
+ <on_enable function="Avatar.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="Avatar.DoToSelected" parameter="selected" />
+ <on_enable function="Avatar.EnableItem" parameter="can_mute" />
+ <on_visible function="Avatar.VisibleItem" parameter="show_mute" />
+ </menu_item_call>
+ <menu_item_call
+ label="Unmute this participant"
+ layout="topleft"
+ name="ModerateVoiceUnMuteSelected">
+ <on_click function="Avatar.DoToSelected" parameter="selected" />
+ <on_enable function="Avatar.EnableItem" parameter="can_unmute" />
+ <on_visible function="Avatar.VisibleItem" parameter="show_unmute" />
+ </menu_item_call>
+ <menu_item_call
+ label="Mute everyone"
+ layout="topleft"
+ name="ModerateVoiceMute">
+ <on_click function="Avatar.DoToSelected" parameter="mute_all" />
+ <on_enable function="Avatar.EnableItem" parameter="can_moderate_voice" />
+ </menu_item_call>
+ <menu_item_call
+ label="Unmute everyone"
+ layout="topleft"
+ name="ModerateVoiceUnmute">
+ <on_click function="Avatar.DoToSelected" parameter="unmute_all" />
+ <on_enable function="Avatar.EnableItem" parameter="can_moderate_voice" />
+ </menu_item_call>
+ </context_menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/en/menu_conversation_log_gear.xml
new file mode 100644
index 0000000000..8796b87955
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_conversation_log_gear.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ layout="topleft"
+ name="Conversation Context Menu">
+ <menu_item_call
+ label="IM..."
+ layout="topleft"
+ name="IM">
+ <on_click
+ function="Calllog.Action"
+ parameter="im" />
+ <on_enable
+ function="Calllog.Enable"
+ parameter="can_im" />
+ </menu_item_call>
+ <menu_item_call
+ label="Voice call..."
+ layout="topleft"
+ name="Call">
+ <on_click
+ function="Calllog.Action"
+ parameter="call" />
+ <on_enable
+ function="Calllog.Enable"
+ parameter="can_call" />
+ </menu_item_call>
+ <menu_item_call
+ label="Open chat history..."
+ layout="topleft"
+ name="Chat history">
+ <on_click
+ function="Calllog.Action"
+ parameter="chat_history" />
+ <on_enable
+ function="Calllog.Enable"
+ parameter="can_view_chat_history" />
+ </menu_item_call>
+ <menu_item_call
+ label="View Profile"
+ layout="topleft"
+ name="View Profile">
+ <on_click
+ function="Calllog.Action"
+ parameter="view_profile" />
+ <on_enable
+ function="Calllog.Enable"
+ parameter="can_view_profile" />
+ </menu_item_call>
+ <menu_item_call
+ label="Offer Teleport"
+ name="teleport">
+ <on_click
+ function="Calllog.Action"
+ parameter="offer_teleport"/>
+ <on_enable
+ function="Calllog.Enable"
+ parameter="can_offer_teleport"/>
+ </menu_item_call>
+ <menu_item_separator />
+ <menu_item_call
+ label="Add Friend"
+ layout="topleft"
+ name="add_friend">
+ <on_click
+ function="Calllog.Action"
+ parameter="add_friend"/>
+ <on_visible
+ function="Calllog.Check"
+ parameter="is_not_friend" />
+ </menu_item_call>
+ <menu_item_call
+ label="Remove Friend"
+ layout="topleft"
+ name="remove_friend">
+ <on_click
+ function="Calllog.Action"
+ parameter="remove_friend"/>
+ <on_visible
+ function="Calllog.Check"
+ parameter="is_friend" />
+ </menu_item_call>
+ <menu_item_call
+ label="Invite to group..."
+ layout="topleft"
+ name="Invite">
+ <on_click
+ function="Calllog.Action"
+ parameter="invite_to_group"/>
+ <on_enable
+ function="Calllog.Enable"
+ parameter="can_invite_to_group" />
+ </menu_item_call>
+ <menu_item_separator />
+ <menu_item_call
+ label="Map"
+ layout="topleft"
+ name="Map">
+ <on_click
+ function="Calllog.Action"
+ parameter="show_on_map" />
+ <on_enable
+ function="Calllog.Enable"
+ parameter="can_show_on_map" />
+ </menu_item_call>
+ <menu_item_call
+ label="Share"
+ layout="topleft"
+ name="Share">
+ <on_click
+ function="Calllog.Action"
+ parameter="share" />
+ <on_enable
+ function="Calllog.Enable"
+ parameter="can_share" />
+ </menu_item_call>
+ <menu_item_call
+ label="Pay"
+ layout="topleft"
+ name="Pay">
+ <on_click
+ function="Calllog.Action"
+ parameter="pay" />
+ <on_enable
+ function="Calllog.Enable"
+ parameter="can_pay" />
+ </menu_item_call>
+ <menu_item_check
+ label="Block/Unblock"
+ layout="topleft"
+ name="Block/Unblock">
+ <menu_item_check.on_click
+ function="Calllog.Action"
+ parameter="block"/>
+ <menu_item_check.on_check
+ function="Calllog.Check"
+ parameter="is_blocked" />
+ <menu_item_check.on_enable
+ function="Calllog.Enable"
+ parameter="can_block" />
+ </menu_item_check>
+
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/en/menu_conversation_log_view.xml
new file mode 100644
index 0000000000..ce65b23971
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_conversation_log_view.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ name="menu_conversation_view"
+ left="0" bottom="0" visible="false"
+ mouse_opaque="false">
+ <menu_item_check
+ label="Sort by name"
+ name="sort_by_name">
+ <on_click
+ function="CallLog.Action"
+ parameter="sort_by_name"/>
+ <on_check
+ function="CallLog.Check"
+ parameter="sort_by_name"/>
+ </menu_item_check>
+ <menu_item_check
+ label="Sort by date"
+ name="sort_by_date">
+ <on_click
+ function="CallLog.Action"
+ parameter="sort_by_date" />
+ <on_check
+ function="CallLog.Check"
+ parameter="sort_by_date" />
+ </menu_item_check>
+ <menu_item_separator />
+ <menu_item_check
+ label="Sort friends on top"
+ name="sort_by_friends">
+ <on_click
+ function="CallLog.Action"
+ parameter="sort_friends_on_top" />
+ <on_check
+ function="CallLog.Check"
+ parameter="sort_friends_on_top" />
+ </menu_item_check>
+ <menu_item_separator />
+ <menu_item_call
+ label="View Nearby chat history..."
+ name="view_nearby_chat_history">
+ <on_click
+ function="CallLog.Action"
+ parameter="view_nearby_chat_history" />
+ </menu_item_call>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_group_plus.xml b/indra/newview/skins/default/xui/en/menu_group_plus.xml
index fce7414d80..eca9e7f3c9 100644
--- a/indra/newview/skins/default/xui/en/menu_group_plus.xml
+++ b/indra/newview/skins/default/xui/en/menu_group_plus.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu name="menu_group_plus"
+<toggleable_menu name="menu_group_plus"
left="0" bottom="0" visible="false"
mouse_opaque="false">
<menu_item_call name="item_join" label="Join Group...">
@@ -8,4 +8,4 @@
<menu_item_call name="item_new" label="New Group...">
<menu_item_call.on_click function="People.Group.Plus.Action" userdata="new_group" />
</menu_item_call>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_im_conversation.xml b/indra/newview/skins/default/xui/en/menu_im_conversation.xml
new file mode 100644
index 0000000000..43287c6ec3
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_im_conversation.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ layout="topleft"
+ name="Conversation Gear Menu">
+ <menu_item_call
+ label="View Profile"
+ layout="topleft"
+ name="View Profile">
+ <on_click function="Avatar.GearDoToSelected" parameter="view_profile" />
+ <on_enable function="Avatar.EnableGearItem" parameter="can_view_profile" />
+ </menu_item_call>
+ <menu_item_call
+ label="Add Friend"
+ layout="topleft"
+ name="Add Friend">
+ <on_click function="Avatar.GearDoToSelected" parameter="add_friend" />
+ <on_enable function="Avatar.EnableGearItem" parameter="can_add" />
+ </menu_item_call>
+ <menu_item_call
+ label="Remove friend"
+ layout="topleft"
+ name="remove_friend">
+ <on_click function="Avatar.GearDoToSelected" parameter="remove_friend" />
+ <on_enable function="Avatar.EnableGearItem" parameter="can_delete" />
+ </menu_item_call>
+ <menu_item_call
+ label="Offer teleport"
+ layout="topleft"
+ name="offer_teleport">
+ <on_click function="Avatar.GearDoToSelected" parameter="offer_teleport"/>
+ <on_enable function="Avatar.EnableGearItem" parameter="can_offer_teleport"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Invite to group..."
+ layout="topleft"
+ name="invite_to_group">
+ <on_click function="Avatar.GearDoToSelected" parameter="invite_to_group" />
+ <on_enable function="Avatar.EnableGearItem" parameter="can_invite" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="View Icons Separator" />
+ <menu_item_call
+ label="Chat history..."
+ layout="topleft"
+ name="chat_history">
+ <on_click function="Avatar.GearDoToSelected" parameter="chat_history"/>
+ <on_enable function="Avatar.EnableGearItem" parameter="can_chat_history"/>
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"/>
+ <menu_item_call
+ label="Zoom In"
+ layout="topleft"
+ name="zoom_in">
+ <on_click function="Avatar.DoToSelected" parameter="zoom_in" />
+ <on_enable function="Avatar.EnableItem" parameter="can_zoom_in" />
+ </menu_item_call>
+ <menu_item_call
+ label="Map"
+ layout="topleft"
+ name="map">
+ <on_click function="Avatar.GearDoToSelected" parameter="map" />
+ <on_enable function="Avatar.EnableGearItem" parameter="can_show_on_map" />
+ </menu_item_call>
+ <menu_item_call
+ label="Share"
+ layout="topleft"
+ name="Share">
+ <on_click function="Avatar.GearDoToSelected" parameter="share" />
+ <on_enable function="Avatar.EnableGearItem" parameter="can_share" />
+ </menu_item_call>
+ <menu_item_call
+ label="Pay"
+ layout="topleft"
+ name="Pay">
+ <on_click function="Avatar.GearDoToSelected" parameter="pay" />
+ <on_enable function="Avatar.EnableGearItem" parameter="can_pay" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"/>
+ <menu_item_check
+ label="Block Voice"
+ layout="topleft"
+ name="Block/Unblock">
+ <on_check function="Avatar.CheckGearItem" parameter="is_blocked" />
+ <on_click function="Avatar.GearDoToSelected" parameter="block_unblock" />
+ <on_enable function="Avatar.EnableGearItem" parameter="can_block" />
+ </menu_item_check>
+ <menu_item_check
+ label="Block Text"
+ layout="topleft"
+ name="MuteText">
+ <on_check function="Avatar.CheckGearItem" parameter="is_muted" />
+ <on_click function="Avatar.GearDoToSelected" parameter="mute_unmute" />
+ <on_enable function="Avatar.EnableGearItem" parameter="can_block" />
+ </menu_item_check>
+ <menu_item_separator
+ layout="topleft"/>
+</toggleable_menu>
+
diff --git a/indra/newview/skins/default/xui/en/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/en/menu_im_session_showmodes.xml
new file mode 100644
index 0000000000..b0adca0e0e
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_im_session_showmodes.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ name="menu_modes"
+ left="0" bottom="0" visible="false"
+ mouse_opaque="false">
+ <menu_item_check
+ label="Compact view"
+ name="compact_view">
+ <menu_item_check.on_click
+ function="IMSession.Menu.Action"
+ parameter="compact_view"/>
+ <menu_item_check.on_check
+ function="IMSession.Menu.CompactExpandedModes.CheckItem"
+ parameter="compact_view"/>
+ </menu_item_check>
+ <menu_item_check
+ label="Expanded view"
+ name="expanded_view">
+ <menu_item_check.on_click
+ function="IMSession.Menu.Action"
+ parameter="expanded_view"/>
+ <menu_item_check.on_check
+ function="IMSession.Menu.CompactExpandedModes.CheckItem"
+ parameter="expanded_view"/>
+ </menu_item_check>
+ <menu_item_separator layout="topleft" />
+ <menu_item_check name="IMShowTime" label="Show time">
+ <menu_item_check.on_click
+ function="IMSession.Menu.Action"
+ parameter="IMShowTime" />
+ <menu_item_check.on_check
+ function="IMSession.Menu.ShowModes.CheckItem"
+ parameter="IMShowTime" />
+ <menu_item_check.on_enable
+ function="IMSession.Menu.ShowModes.Enable"
+ parameter="IMShowTime" />
+ </menu_item_check>
+ <menu_item_check name="IMShowNamesForP2PConv" label="Show names in one-to-one conversations">
+ <menu_item_check.on_click
+ function="IMSession.Menu.Action"
+ parameter="IMShowNamesForP2PConv" />
+ <menu_item_check.on_check
+ function="IMSession.Menu.ShowModes.CheckItem"
+ parameter="IMShowNamesForP2PConv" />
+ <menu_item_check.on_enable
+ function="IMSession.Menu.ShowModes.Enable"
+ parameter="IMShowNamesForP2PConv" />
+ </menu_item_check>
+</toggleable_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
deleted file mode 100644
index f8dfba91ff..0000000000
--- a/indra/newview/skins/default/xui/en/menu_im_well_button.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu
- layout="topleft"
- name="IM Well Button Context Menu">
- <menu_item_call
- label="Close All"
- layout="topleft"
- name="Close All">
- <menu_item_call.on_click
- function="IMWellChicletMenu.Action"
- parameter="close all" />
- <menu_item_call.on_enable
- function="IMWellChicletMenu.EnableItem"
- parameter="can close all" />
- </menu_item_call>
-</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
deleted file mode 100644
index 76b188220d..0000000000
--- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,143 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_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.on_enable
- function="InspectAvatar.Gear.EnableTeleportOffer"/>
- </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.VisibleFreeze"/>
- </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.VisibleEject"/>
- </menu_item_call>
- <menu_item_call
- label="Kick"
- name="kick">
- <menu_item_call.on_click
- function="InspectAvatar.Kick"/>
- <menu_item_call.on_visible
- function="InspectAvatar.EnableGod"/>
- </menu_item_call>
- <menu_item_call
- label="CSR"
- name="csr">
- <menu_item_call.on_click
- function="InspectAvatar.CSR" />
- <menu_item_call.on_visible
- function="InspectAvatar.EnableGod" />
- </menu_item_call>
- <menu_item_call
- label="Debug Textures"
- name="debug">
- <menu_item_call.on_click
- function="Avatar.Debug"/>
- <menu_item_call.on_visible
- function="IsGodCustomerService"/>
- </menu_item_call>
- <menu_item_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>
-</toggleable_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 63e154697b..2c420aa1e3 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
@@ -57,7 +57,7 @@
layout="topleft"
name="take_copy">
<menu_item_call.on_click
- function="InspectObject.TakeFreeCopy"/>
+ function="Tools.TakeCopy"/>
<menu_item_call.on_visible
function="Tools.EnableTakeCopy"/>
</menu_item_call>
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
deleted file mode 100644
index 5e7b16ed4a..0000000000
--- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,252 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu
- layout="topleft"
- name="Self Pie">
- <menu_item_call
- label="Sit Down"
- layout="topleft"
- name="Sit Down Here">
- <menu_item_call.on_click
- function="Self.SitDown"
- parameter="" />
- <menu_item_call.on_enable
- function="Self.EnableSitDown" />
- </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>
- <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="Change Outfit"
- layout="topleft"
- name="Chenge Outfit">
- <menu_item_call.on_click
- function="CustomizeAvatar" />
- <menu_item_call.on_enable
- function="Edit.EnableCustomizeAvatar" />
- </menu_item_call>
- <menu_item_call label="Edit My Outfit"
- layout="topleft"
- name="Edit Outfit">
- <menu_item_call.on_click
- function="EditOutfit" />
- <menu_item_call.on_enable
- function="Edit.EnableCustomizeAvatar" />
- </menu_item_call>
- <menu_item_call label="Edit My Shape"
- layout="topleft"
- name="Edit My Shape">
- <menu_item_call.on_click
- function="EditShape" />
- <menu_item_call.on_enable
- function="Edit.EnableEditShape" />
- </menu_item_call>
- <menu_item_call
- label="My Friends"
- layout="topleft"
- name="Friends...">
- <menu_item_call.on_click
- function="SideTray.PanelPeopleTab"
- parameter="friends_panel" />
- </menu_item_call>
- <menu_item_call
- label="My Groups"
- layout="topleft"
- name="Groups...">
- <menu_item_call.on_click
- function="SideTray.PanelPeopleTab"
- parameter="groups_panel" />
- </menu_item_call>
- <menu_item_call
- label="My Profile"
- layout="topleft"
- name="Profile...">
- <menu_item_call.on_click
- function="ShowAgentProfile"
- parameter="agent" />
- </menu_item_call>
- <menu_item_call
- label="Debug Textures"
- name="Debug...">
- <menu_item_call.on_click
- function="Avatar.Debug" />
- <menu_item_call.on_visible
- function="IsGodCustomerService"/>
- </menu_item_call>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_add.xml b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
index e91f5af3d5..29720a680b 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
@@ -3,7 +3,7 @@
layout="topleft"
left="0"
mouse_opaque="false"
- can_tear_off="true"
+ can_tear_off="false"
name="menu_inventory_add"
visible="false">
<menu
diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml
index 52b9524b11..f6004621a6 100644
--- a/indra/newview/skins/default/xui/en/menu_object.xml
+++ b/indra/newview/skins/default/xui/en/menu_object.xml
@@ -30,26 +30,6 @@
function="EnableEdit"/>
</menu_item_call>
<menu_item_call
- label="Show in linksets"
- name="show_in_linksets">
- <menu_item_call.on_click
- function="Pathfinding.Linksets.Select" />
- <menu_item_call.on_enable
- function="EnableSelectInPathfindingLinksets"/>
- <menu_item_call.on_visible
- function="EnableSelectInPathfindingLinksets"/>
- </menu_item_call>
- <menu_item_call
- label="Show in characters"
- name="show_in_characters">
- <menu_item_call.on_click
- function="Pathfinding.Characters.Select" />
- <menu_item_call.on_enable
- function="EnableSelectInPathfindingCharacters"/>
- <menu_item_call.on_visible
- function="EnableSelectInPathfindingCharacters"/>
- </menu_item_call>
- <menu_item_call
enabled="false"
label="Open"
name="Open">
@@ -90,6 +70,26 @@
<menu_item_call.on_click
function="Object.ZoomIn" />
</menu_item_call>
+ <menu_item_call
+ label="Show in linksets"
+ name="show_in_linksets">
+ <menu_item_call.on_click
+ function="Pathfinding.Linksets.Select" />
+ <menu_item_call.on_enable
+ function="EnableSelectInPathfindingLinksets"/>
+ <menu_item_call.on_visible
+ function="EnableSelectInPathfindingLinksets"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Show in characters"
+ name="show_in_characters">
+ <menu_item_call.on_click
+ function="Pathfinding.Characters.Select" />
+ <menu_item_call.on_enable
+ function="EnableSelectInPathfindingCharacters"/>
+ <menu_item_call.on_visible
+ function="EnableSelectInPathfindingCharacters"/>
+ </menu_item_call>
<menu_item_separator layout="topleft" />
<context_menu
label="Put On"
diff --git a/indra/newview/skins/default/xui/en/menu_object_icon.xml b/indra/newview/skins/default/xui/en/menu_object_icon.xml
index 0c8a2af002..2d4f1792c2 100644
--- a/indra/newview/skins/default/xui/en/menu_object_icon.xml
+++ b/indra/newview/skins/default/xui/en/menu_object_icon.xml
@@ -24,4 +24,22 @@
function="ObjectIcon.Action"
parameter="block" />
</menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="Show on Map"
+ layout="topleft"
+ name="show_on_map">
+ <menu_item_call.on_click
+ function="ObjectIcon.Action"
+ parameter="map" />
+ </menu_item_call>
+ <menu_item_call
+ label="Teleport to Object Location"
+ layout="topleft"
+ name="teleport_to_object">
+ <menu_item_call.on_click
+ function="ObjectIcon.Action"
+ parameter="teleport" />
+ </menu_item_call>
</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
index fc7272b904..3b8ace6308 100644
--- a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
@@ -195,6 +195,20 @@
<menu_item_separator name="sepatator2" />
<menu_item_call
+ label="Expand all folders"
+ layout="topleft"
+ name="expand">
+ <on_click
+ function="Gear.Expand" />
+ </menu_item_call>
+ <menu_item_call
+ label="Collapse all folders"
+ layout="topleft"
+ name="collapse">
+ <on_click
+ function="Gear.Collapse" />
+ </menu_item_call>
+ <menu_item_call
label="Rename Outfit"
layout="topleft"
name="rename">
diff --git a/indra/newview/skins/default/xui/en/menu_participant_view.xml b/indra/newview/skins/default/xui/en/menu_participant_view.xml
new file mode 100644
index 0000000000..7ea87ee05c
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_participant_view.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ layout="topleft"
+ name="participant_manu_view">
+ <menu_item_check
+ label="Sort conversations by type"
+ layout="topleft"
+ name="sort_sessions_by_type">
+ <on_click
+ function="IMFloaterContainer.Action"
+ parameter="sort_sessions_by_type" />
+ <on_check
+ function="IMFloaterContainer.Check"
+ parameter="sort_sessions_by_type" />
+ </menu_item_check>
+ <menu_item_check
+ label="Sort conversations by name"
+ layout="topleft"
+ name="sort_sessions_by_name">
+ <on_click
+ function="IMFloaterContainer.Action"
+ parameter="sort_sessions_by_name" />
+ <on_check
+ function="IMFloaterContainer.Check"
+ parameter="sort_sessions_by_name" />
+ </menu_item_check>
+ <menu_item_check
+ label="Sort conversations by recent activity"
+ layout="topleft"
+ name="sort_sessions_by_recent">
+ <on_click
+ function="IMFloaterContainer.Action"
+ parameter="sort_sessions_by_recent" />
+ <on_check
+ function="IMFloaterContainer.Check"
+ parameter="sort_sessions_by_recent" />
+ </menu_item_check>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_check
+ label="Sort participants by name"
+ layout="topleft"
+ name="sort_participants_by_name">
+ <on_click
+ function="IMFloaterContainer.Action"
+ parameter="sort_participants_by_name" />
+ <on_check
+ function="IMFloaterContainer.Check"
+ parameter="sort_participants_by_name" />
+ </menu_item_check>
+ <menu_item_check
+ label="Sort participants by recent activity"
+ layout="topleft"
+ name="sort_participants_by_recent">
+ <on_click
+ function="IMFloaterContainer.Action"
+ parameter="sort_participants_by_recent" />
+ <on_check
+ function="IMFloaterContainer.Check"
+ parameter="sort_participants_by_recent" />
+ </menu_item_check>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="Chat preferences..."
+ name="chat_preferences">
+ <on_click
+ function="IMFloaterContainer.Action"
+ parameter="chat_preferences" />
+ </menu_item_call>
+ <menu_item_call
+ label="Privacy preferences..."
+ name="privacy_preferences">
+ <on_click
+ function="IMFloaterContainer.Action"
+ parameter="privacy_preferences" />
+ </menu_item_call>
+ <menu_item_check
+ label="Conversation log..."
+ name="Conversation"
+ visible="true">
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="conversation" />
+ <menu_item_check.on_click
+ function="Floater.Toggle"
+ parameter="conversation" />
+ <menu_item_check.on_enable
+ function="Avatar.EnableItem"
+ parameter="conversation_log" />
+ </menu_item_check>
+ <menu_item_separator layout="topleft" />
+ <menu_item_check name="Translate_chat" label="Translate Nearby chat">
+ <menu_item_check.on_click
+ function="IMFloaterContainer.Action"
+ parameter="Translating.Toggle" />
+ <menu_item_check.on_check
+ function="IMFloaterContainer.Check"
+ parameter="Translating.On" />
+ <menu_item_check.on_enable
+ function="IMFloaterContainer.Check"
+ parameter="Translating.Enabled" />
+ </menu_item_check>
+ <menu_item_check name="Translation_settings" label="Translation settings...">
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="prefs_translation" />
+ <menu_item_check.on_click
+ function="Floater.Toggle"
+ parameter="prefs_translation" />
+ </menu_item_check>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/en/menu_people_blocked_gear.xml
new file mode 100644
index 0000000000..63295ea27b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_people_blocked_gear.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ name="menu_blocked_gear"
+ left="0" bottom="0" visible="false"
+ mouse_opaque="false">
+ <menu_item_call
+ label="Unblock"
+ name="unblock">
+ <on_click
+ function="Block.Action"
+ parameter="unblock_item" />
+ <on_enable
+ function="Block.Enable"
+ parameter="unblock_item" />
+ </menu_item_call>
+ <menu_item_call
+ label="Profile..."
+ name="profile">
+ <on_click
+ function="Block.Action"
+ parameter="profile_item"/>
+ <on_enable
+ function="Block.Enable"
+ parameter="profile_item" />
+ </menu_item_call>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/en/menu_people_blocked_plus.xml
new file mode 100644
index 0000000000..0c7155667e
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_people_blocked_plus.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ name="menu_blocked_plus"
+ left="0" bottom="0" visible="false"
+ mouse_opaque="false">
+ <menu_item_call
+ label="Block Resident by name..."
+ name="block_resident_by_name">
+ <on_click
+ function="Block.Action"
+ parameter="block_res_by_name"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Block object by name"
+ name="block_object_by_name">
+ <on_click
+ function="Block.Action"
+ parameter="block_obj_by_name"/>
+ </menu_item_call>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/en/menu_people_blocked_view.xml
new file mode 100644
index 0000000000..2efb70ee37
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_people_blocked_view.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ name="menu_blocked_view"
+ left="0" bottom="0" visible="false"
+ mouse_opaque="false">
+ <menu_item_check
+ label="Sort by name"
+ name="sort_by_name">
+ <on_click
+ function="Block.Action"
+ parameter="sort_by_name"/>
+ <on_check
+ function="Block.Check"
+ parameter="sort_by_name"/>
+ </menu_item_check>
+ <menu_item_check
+ label="Sort by type"
+ name="sort_by_type">
+ <on_click
+ function="Block.Action"
+ parameter="sort_by_type" />
+ <on_check
+ function="Block.Check"
+ parameter="sort_by_type" />
+ </menu_item_check>
+</toggleable_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.xml
index b452f96e7a..dde9432867 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.xml
@@ -40,8 +40,12 @@
function="CheckControl"
parameter="FriendsListShowPermissions" />
</menu_item_check>
- <menu_item_separator layout="topleft" />
- <menu_item_call name="show_blocked_list" label="Show Blocked Residents &amp; Objects">
- <menu_item_call.on_click function="People.Friends.ViewSort.Action" parameter="panel_block_list_sidetray" />
- </menu_item_call>
+ <menu_item_check name="view_conversation" label="View Conversation Log...">
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="conversation" />
+ <menu_item_check.on_click
+ function="Floater.Toggle"
+ parameter="conversation" />
+ </menu_item_check>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_groups.xml b/indra/newview/skins/default/xui/en/menu_people_groups.xml
index 8f89d37dbb..1e0364b84e 100644
--- a/indra/newview/skins/default/xui/en/menu_people_groups.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_groups.xml
@@ -1,8 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu name="menu_group_plus"
+<toggleable_menu name="menu_group_plus"
left="0" bottom="0" visible="false"
mouse_opaque="false" opaque="true" color="MenuDefaultBgColor">
<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_call
label="View Info"
name="View Info">
<menu_item_call.on_click
@@ -23,7 +33,7 @@
parameter="chat" />
</menu_item_call>
<menu_item_call
- label="Call"
+ label="Voice call"
name="Call">
<menu_item_call.on_click
function="People.Groups.Action"
@@ -34,17 +44,6 @@
</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
@@ -54,4 +53,4 @@
function="People.Groups.Enable"
parameter="leave" />
</menu_item_call>
-</menu>
+</toggleable_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.xml
index c710fe3b9b..73f79f1e70 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.xml
@@ -14,13 +14,4 @@
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>
</toggleable_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 d2e35e4cc0..3abb5f7bc8 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
@@ -1,28 +1,69 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<context_menu
layout="topleft"
- name="Avatar Context Menu">
+ name="Nearby People Context Menu">
<menu_item_call
label="View Profile"
layout="topleft"
- name="View Profile">
+ name="view_profile">
<menu_item_call.on_click
function="Avatar.Profile" />
</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="Avatar.EnableItem"
+ parameter="can_im"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Offer Teleport"
+ name="offer_teleport">
+ <menu_item_call.on_click
+ function="Avatar.OfferTeleport"/>
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_offer_teleport"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Voice call"
+ layout="topleft"
+ name="voice_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_separator />
+ <menu_item_call
+ label="View chat history..."
+ layout="topleft"
+ name="chat_history">
+ <menu_item_call.on_click
+ function="Avatar.Calllog" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_callog"/>
+ </menu_item_call>
+ <menu_item_separator name="separator_chat_history"/>
+ <menu_item_call
label="Add Friend"
layout="topleft"
- name="Add Friend">
+ name="add_friend">
<menu_item_call.on_click
function="Avatar.AddFriend" />
- <menu_item_call.on_enable
+ <menu_item_call.on_visible
function="Avatar.EnableItem"
parameter="can_add" />
</menu_item_call>
<menu_item_call
label="Remove Friend"
layout="topleft"
- name="Remove Friend">
+ name="remove_friend">
<menu_item_call.on_click
function="Avatar.RemoveFriend" />
<menu_item_call.on_enable
@@ -30,26 +71,30 @@
parameter="can_delete" />
</menu_item_call>
<menu_item_call
- label="IM"
+ label="Invite to group..."
layout="topleft"
- name="IM">
+ name="invite_to_group">
<menu_item_call.on_click
- function="Avatar.IM" />
+ function="Avatar.InviteToGroup" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_invite"/>
</menu_item_call>
+ <menu_item_separator name="separator_invite_to_group"/>
<menu_item_call
- label="Call"
+ label="Zoom In"
layout="topleft"
- name="Call">
- <menu_item_call.on_click
- function="Avatar.Call" />
- <menu_item_call.on_enable
- function="Avatar.EnableItem"
- parameter="can_call" />
+ name="zoom_in">
+ <menu_item_call.on_click
+ function="Avatar.ZoomIn" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_zoom_in"/>
</menu_item_call>
<menu_item_call
label="Map"
layout="topleft"
- name="Map">
+ name="map">
<menu_item_call.on_click
function="Avatar.ShowOnMap" />
<menu_item_call.on_enable
@@ -59,21 +104,27 @@
<menu_item_call
label="Share"
layout="topleft"
- name="Share">
+ name="share">
<menu_item_call.on_click
function="Avatar.Share" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_share"/>
</menu_item_call>
<menu_item_call
label="Pay"
layout="topleft"
- name="Pay">
+ name="pay">
<menu_item_call.on_click
function="Avatar.Pay" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_pay"/>
</menu_item_call>
<menu_item_check
label="Block/Unblock"
layout="topleft"
- name="Block/Unblock">
+ name="block_unblock">
<menu_item_check.on_click
function="Avatar.BlockUnblock" />
<menu_item_check.on_check
@@ -83,13 +134,5 @@
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.on_enable
- function="Avatar.EnableItem"
- parameter="can_offer_teleport"/>
- </menu_item_call>
+ <menu_item_separator />
</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 5d58a9d289..5f973088fd 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
@@ -6,7 +6,7 @@
enabled="false"
label="Add Friends"
layout="topleft"
- name="Add Friends">
+ name="add_friends">
<on_click
function="Avatar.AddFriends" />
<on_enable
@@ -16,7 +16,7 @@
<menu_item_call
label="Remove Friends"
layout="topleft"
- name="Remove Friend">
+ name="remove_friends">
<menu_item_call.on_click
function="Avatar.RemoveFriend" />
<menu_item_call.on_enable
@@ -26,7 +26,7 @@
<menu_item_call
label="IM"
layout="topleft"
- name="IM">
+ name="im">
<on_click
function="Avatar.IM" />
</menu_item_call>
@@ -34,7 +34,7 @@
enabled="false"
label="Call"
layout="topleft"
- name="Call">
+ name="call">
<on_click
function="Avatar.Call" />
<on_enable
@@ -45,7 +45,7 @@
enabled="false"
label="Share"
layout="topleft"
- name="Share">
+ name="share">
<on_click
function="Avatar.Share" />
</menu_item_call>
@@ -53,13 +53,13 @@
enabled="false"
label="Pay"
layout="topleft"
- name="Pay">
+ name="pay">
<on_click
function="Avatar.Pay" />
</menu_item_call>
<menu_item_call
label="Offer Teleport"
- name="teleport">
+ name="offer_teleport">
<menu_item_call.on_click
function="Avatar.OfferTeleport"/>
<menu_item_call.on_enable
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml
new file mode 100644
index 0000000000..da88ca9f4d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ name="menu_group_plus"
+ left="0" bottom="0" visible="false"
+ mouse_opaque="false">
+ <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
+ function="People.Nearby.ViewSort.Action"
+ parameter="view_icons" />
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="NearbyListShowIcons" />
+ </menu_item_check>
+ <menu_item_check name ="view_map" label="View Map">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="NearbyListShowMap" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="NearbyListShowMap" />
+ </menu_item_check>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
deleted file mode 100644
index 614dd693c5..0000000000
--- a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu
- name="menu_group_plus"
- left="0" bottom="0" visible="false"
- mouse_opaque="false">
- <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
- function="People.Nearby.ViewSort.Action"
- parameter="view_icons" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="NearbyListShowIcons" />
- </menu_item_check>
- <menu_item_check name ="view_map" label="View Map">
- <menu_item_check.on_check
- function="CheckControl"
- parameter="NearbyListShowMap" />
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="NearbyListShowMap" />
- </menu_item_check>
- <menu_item_separator layout="topleft" />
- <menu_item_call name="show_blocked_list" label="Show Blocked Residents &amp; Objects">
- <menu_item_call.on_click function="People.Nearby.ViewSort.Action" userdata="panel_block_list_sidetray" />
- </menu_item_call>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_recent_view.xml
index 485a5a658c..1dbc90dd2b 100644
--- a/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_recent_view.xml
@@ -32,8 +32,4 @@
function="CheckControl"
parameter="RecentListShowIcons" />
</menu_item_check>
- <menu_item_separator layout="topleft" />
- <menu_item_call name="show_blocked_list" label="Show Blocked Residents &amp; Objects">
- <menu_item_call.on_click function="People.Recent.ViewSort.Action" userdata="panel_block_list_sidetray" />
- </menu_item_call>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_url_agent.xml b/indra/newview/skins/default/xui/en/menu_url_agent.xml
index 73f0fa7979..7cd56f257a 100644
--- a/indra/newview/skins/default/xui/en/menu_url_agent.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_agent.xml
@@ -1,13 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<context_menu
layout="topleft"
- name="Url Popup">
+ name="Url Popup">
<menu_item_call
- label="Show Resident Profile"
+ label="View Profile"
layout="topleft"
name="show_agent">
<menu_item_call.on_click
- function="Url.ShowProfile" />
+ function="Url.ShowProfile" />
+ </menu_item_call>
+ <menu_item_call
+ label="Send IM..."
+ layout="topleft"
+ name="send_im">
+ <menu_item_call.on_click
+ function="Url.SendIM" />
+ </menu_item_call>
+ <menu_item_call
+ label="Add Friend..."
+ layout="topleft"
+ name="add_friend">
+ <menu_item_call.on_click
+ function="Url.AddFriend" />
</menu_item_call>
<menu_item_separator
layout="topleft" />
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 35c2269b0d..87ab58e622 100644
--- a/indra/newview/skins/default/xui/en/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_objectim.xml
@@ -3,7 +3,7 @@
layout="topleft"
name="Url Popup">
<menu_item_call
- label="Show Object Information"
+ label="Object Profile..."
layout="topleft"
name="show_object">
<menu_item_call.on_click
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 1aa55acf2d..544f06ac0c 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -130,19 +130,22 @@
label="Status"
name="Status"
tear_off="true">
- <menu_item_call
- label="Away"
- name="Set Away">
- <menu_item_call.on_click
+ <menu_item_check
+ label="Away">
+ <menu_item_check.on_check
+ function="View.Status.CheckAway" />
+ <menu_item_check.on_click
function="World.SetAway" />
- </menu_item_call>
- <menu_item_call
- label="Busy"
- name="Set Busy">
- <menu_item_call.on_click
- function="World.SetBusy"/>
- </menu_item_call>
- </menu>
+ </menu_item_check>
+ <menu_item_check
+ label="Do Not Disturb">
+ <menu_item_check.on_check
+ function="View.Status.CheckDoNotDisturb" />
+ <menu_item_check.on_click
+ function="World.SetDoNotDisturb"/>
+ </menu_item_check>
+
+ </menu>
<menu_item_separator/>
@@ -180,8 +183,7 @@
</menu_item_call>
<menu_item_call
label="Toolbar buttons..."
- name="Toolbars"
- shortcut="control|T">
+ name="Toolbars">
<menu_item_call.on_click
function="Floater.Toggle"
parameter="toybox" />
@@ -218,17 +220,28 @@
label="Communicate"
name="Communicate"
tear_off="true">
- <menu_item_check
- label="Chat..."
+ <menu_item_check
+ label="Conversations..."
+ name="Conversations"
+ shortcut="control|T">
+ <menu_item_check.on_check
+ function="Floater.IsOpen"
+ parameter="im_container" />
+ <menu_item_check.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="im_container" />
+ </menu_item_check>
+ <menu_item_check
+ label="Nearby Chat..."
name="Nearby Chat"
shortcut="control|H"
use_mac_ctrl="true">
<menu_item_check.on_check
function="Floater.Visible"
- parameter="chat_bar" />
+ parameter="nearby_chat" />
<menu_item_check.on_click
- function="Floater.Toggle"
- parameter="chat_bar" />
+ function="Floater.ToggleOrBringToFront"
+ parameter="nearby_chat" />
</menu_item_check>
<menu_item_check
label="Speak"
@@ -244,26 +257,47 @@
parameter="speak" />
</menu_item_check>
<menu_item_check
- label="Voice settings..."
- name="Nearby Voice">
+ label="Conversation Log...">
<menu_item_check.on_check
function="Floater.Visible"
- parameter="voice_controls" />
+ parameter="conversation" />
+ <menu_item_check.on_enable
+ function="Conversation.IsConversationLoggingAllowed" />
<menu_item_check.on_click
function="Floater.Toggle"
- parameter="voice_controls" />
+ parameter="conversation" />
</menu_item_check>
- <menu_item_check
- label="Voice morphing..."
- name="ShowVoice"
+ <menu_item_separator/>
+ <menu
+ label="Voice morphing"
+ name="VoiceMorphing"
visibility_control="VoiceMorphingEnabled">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="voice_effect" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="voice_effect" />
- </menu_item_check>
+ <menu_item_check
+ label="No voice morphing"
+ name="NoVoiceMorphing">
+ <menu_item_check.on_check
+ function="Communicate.VoiceMorphing.NoVoiceMorphing.Check" />
+ <menu_item_check.on_click
+ function="Communicate.VoiceMorphing.NoVoiceMorphing.Click" />
+ </menu_item_check>
+ <menu_item_separator/>
+ <menu_item_check
+ label="Preview..."
+ name="Preview">
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="voice_effect" />
+ <menu_item_check.on_click
+ function="Floater.Toggle"
+ parameter="voice_effect" />
+ </menu_item_check>
+ <menu_item_call
+ label="Subscribe..."
+ name="Subscribe">
+ <menu_item_call.on_click
+ function="Communicate.VoiceMorphing.Subscribe" />
+ </menu_item_call>
+ </menu>
<menu_item_check
label="Gestures..."
name="Gestures"
@@ -276,36 +310,55 @@
parameter="gestures" />
</menu_item_check>
<menu_item_separator/>
- <menu_item_call
+ <menu_item_check
label="Friends"
name="My Friends"
shortcut="control|shift|F">
- <menu_item_call.on_click
+ <menu_item_check.on_check
+ function="SideTray.CheckPanelPeopleTab"
+ parameter="friends_panel" />
+ <menu_item_check.on_click
function="SideTray.PanelPeopleTab"
parameter="friends_panel" />
- </menu_item_call>
- <menu_item_call
+ </menu_item_check>
+ <menu_item_check
label="Groups"
name="My Groups"
shortcut="control|shift|G">
- <menu_item_call.on_click
+ <menu_item_check.on_check
+ function="SideTray.CheckPanelPeopleTab"
+ parameter="groups_panel" />
+ <menu_item_check.on_click
function="SideTray.PanelPeopleTab"
parameter="groups_panel" />
- </menu_item_call>
- <menu_item_call
+ </menu_item_check>
+ <menu_item_check
label="Nearby people"
name="Active Speakers"
shortcut="control|shift|A">
- <menu_item_call.on_click
+ <menu_item_check.on_check
+ function="SideTray.CheckPanelPeopleTab"
+ parameter="nearby_panel" />
+ <menu_item_check.on_click
function="SideTray.PanelPeopleTab"
parameter="nearby_panel" />
- </menu_item_call>
+ </menu_item_check>
<menu_item_call
label="Block List"
name="Block List">
<menu_item_call.on_click
- function="Communicate.BlockList" />
+ function="SideTray.PanelPeopleTab"
+ parameter="blocked_panel" />
</menu_item_call>
+ <menu_item_separator/>
+ <menu_item_check
+ label="Do Not Disturb">
+ <menu_item_check.on_check
+ function="View.Status.CheckDoNotDisturb" />
+ <menu_item_check.on_click
+ function="World.SetDoNotDisturb"/>
+ </menu_item_check>
+
</menu>
<menu
create_jump_keys="true"
@@ -876,14 +929,6 @@
function="Tools.EnableTakeCopy" />
</menu_item_call>
<menu_item_call
- label="Save Back to My Inventory"
- name="Save Object Back to My Inventory">
- <menu_item_call.on_click
- function="Tools.SaveToInventory" />
- <menu_item_call.on_enable
- function="Tools.EnableSaveToInventory" />
- </menu_item_call>
- <menu_item_call
label="Save Back to Object Contents"
name="Save Object Back to Object Contents">
<menu_item_call.on_click
@@ -956,7 +1001,7 @@
create_jump_keys="true"
label="Pathfinding"
name="Pathfinding"
- tear_off="false">
+ tear_off="true">
<menu_item_call
label="Linksets..."
name="pathfinding_linksets_menu_item">
@@ -984,6 +1029,14 @@
<menu_item_call.on_enable
function="Tools.EnablePathfindingView" />
</menu_item_call>
+ <menu_item_call
+ label="Rebake region"
+ name="pathfinding_rebake_navmesh_item">
+ <menu_item_call.on_click
+ function="Tools.DoPathfindingRebakeRegion"/>
+ <menu_item_call.on_enable
+ function="Tools.EnablePathfindingRebakeRegion" />
+ </menu_item_call>
</menu>
@@ -1242,7 +1295,58 @@
function="Floater.Show"
parameter="hud" />
</menu_item_call>-->
-
+ <menu_item_separator/>
+
+ <menu_item_call
+ label="User’s guide"
+ name="User’s guide">
+ <menu_item_call.on_click
+ function="Advanced.ShowURL"
+ parameter="http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-User-s-Guide/ta-p/1244857"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Knowledge Base"
+ name="Knowledge Base">
+ <menu_item_call.on_click
+ function="Advanced.ShowURL"
+ parameter="http://community.secondlife.com/t5/tkb/communitypage"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Wiki"
+ name="Wiki">
+ <menu_item_call.on_click
+ function="Advanced.ShowURL"
+ parameter="http://wiki.secondlife.com"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Community Forums"
+ name="Community Forums">
+ <menu_item_call.on_click
+ function="Advanced.ShowURL"
+ parameter="http://community.secondlife.com/t5/Forums/ct-p/Forums"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Support portal"
+ name="Support portal">
+ <menu_item_call.on_click
+ function="Advanced.ShowURL"
+ parameter="https://support.secondlife.com/"/>
+ </menu_item_call>
+ <menu_item_separator/>
+ <menu_item_call
+ label="[SECOND_LIFE] News"
+ name="Second Life News">
+ <menu_item_call.on_click
+ function="Advanced.ShowURL"
+ parameter="http://community.secondlife.com/t5/Featured-News/bg-p/blog_feature_news"/>
+ </menu_item_call>
+ <menu_item_call
+ label="[SECOND_LIFE] Blogs"
+ name="Second Life Blogs">
+ <menu_item_call.on_click
+ function="Advanced.ShowURL"
+ parameter="http://community.secondlife.com/t5/Blogs/ct-p/Blogs"/>
+ </menu_item_call>
<menu_item_separator/>
<menu_item_call
@@ -3177,6 +3281,40 @@
parameter="AllowSelectAvatar" />
</menu_item_check>
</menu>
+ <menu
+ create_jump_keys="true"
+ label="Animation Speed"
+ name="Animation Speed"
+ tear_off="true">
+ <menu_item_call
+ label="All Animations 10% Faster"
+ name="All Animations 10 Faster">
+ <menu_item_call.on_click
+ function="Advanced.AnimTenFaster" />
+ </menu_item_call>
+ <menu_item_call
+ label="All Animations 10% Slower"
+ name="All Animations 10 Slower">
+ <menu_item_call.on_click
+ function="Advanced.AnimTenSlower" />
+ </menu_item_call>
+ <menu_item_call
+ label="Reset All Animation Speed"
+ name="Reset All Animation Speed">
+ <menu_item_call.on_click
+ function="Advanced.AnimResetAll" />
+ </menu_item_call>
+ <menu_item_check
+ label="Slow Motion Animations"
+ name="Slow Motion Animations">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="SlowMotionAnimation" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="SlowMotionAnimation" />
+ </menu_item_check>
+ </menu>
<menu_item_call
label="Force Params to Default"
name="Force Params to Default">
@@ -3194,16 +3332,6 @@
parameter="" />
</menu_item_check>
<menu_item_check
- label="Slow Motion Animations"
- name="Slow Motion Animations">
- <menu_item_check.on_check
- function="CheckControl"
- parameter="SlowMotionAnimation" />
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="SlowMotionAnimation" />
- </menu_item_check>
- <menu_item_check
label="Show Look At"
name="Show Look At">
<menu_item_check.on_check
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index f0a126724b..c681e39002 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -1293,6 +1293,45 @@ Visit [_URL] for more information?
<notification
icon="alertmodal.tga"
+ name="AMDOldDriver"
+ type="alertmodal">
+ There is likely a newer driver for your graphics chip. Updating graphics drivers can substantially improve performance.
+
+ Visit [_URL] to check for driver updates?
+ <tag>confirm</tag>
+ <url option="0" name="url">
+ http://support.amd.com/us/Pages/AMDSupportHub.aspx
+ </url>
+ <usetemplate
+ ignoretext="My graphics driver is out of date"
+ name="okcancelignore"
+ notext="No"
+ yestext="Yes"/>
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NVIDIAOldDriver"
+ type="alertmodal">
+ There is likely a newer driver for your graphics chip. Updating graphics drivers can substantially improve performance.
+
+ Visit [_URL] to check for driver updates?
+ <tag>confirm</tag>
+ <url option="0" name="url">
+ http://www.nvidia.com/Download/index.aspx?lang=en-us
+ </url>
+ <usetemplate
+ ignoretext="My graphics driver is out of date"
+ name="okcancelignore"
+ notext="No"
+ yestext="Yes"/>
+ <tag>fail</tag>
+ </notification>
+
+
+ <notification
+ icon="alertmodal.tga"
name="UnknownGPU"
type="alertmodal">
Your system contains a graphics card that [APP_NAME] doesn't recognize.
@@ -3046,6 +3085,7 @@ Would you like to trust this authority?
icon="alertmodal.tga"
name="GrantedModifyRights"
persist="true"
+ log_to_im="true"
type="notify">
[NAME] has given you permission to edit their objects.
</notification>
@@ -3054,6 +3094,7 @@ Would you like to trust this authority?
icon="alertmodal.tga"
name="RevokedModifyRights"
persist="true"
+ log_to_im="true"
type="notify">
Your privilege to modify [NAME]&apos;s objects has been revoked
</notification>
@@ -3687,12 +3728,15 @@ Cannot offer friendship at this time. Please try again in a moment.
<notification
icon="alert.tga"
- name="BusyModeSet"
+ name="DoNotDisturbModeSet"
type="alert">
-Busy mode is set.
-Chat and instant messages will be hidden. Instant messages will get your Busy mode response. All teleportation offers will be declined. All inventory offers will go to your Trash.
+Do Not Disturb is on. You will not be notified of incoming communications.
+
+- Other residents will receive your Do Not Disturb response (set in Preferences &gt; General).
+- Teleportation offers will be declined.
+- Voice calls will be rejected.
<usetemplate
- ignoretext="I change my status to Busy mode"
+ ignoretext="I change my status to Do Not Disturb mode"
name="okignore"
yestext="OK"/>
</notification>
@@ -4238,6 +4282,8 @@ Are you sure you want to change the Estate Covenant?
<notification
icon="notifytip.tga"
name="RegionEntryAccessBlocked_Notify"
+ log_to_im="false"
+ log_to_chat="true"
type="notifytip">
<tag>fail</tag>
The region you're trying to visit contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content.
@@ -4246,6 +4292,8 @@ The region you're trying to visit contains [REGIONMATURITY] content, but your cu
<notification
icon="notifytip.tga"
name="RegionEntryAccessBlocked_NotifyAdultsOnly"
+ log_to_im="false"
+ log_to_chat="true"
type="notifytip">
<tag>fail</tag>
The region you're trying to visit contains [REGIONMATURITY] content, which is accessible to adults only.
@@ -4317,6 +4365,8 @@ The region you're trying to visit contains [REGIONMATURITY] content, but your cu
<notification
icon="notifytip.tga"
name="TeleportEntryAccessBlocked_Notify"
+ log_to_im="false"
+ log_to_chat="true"
type="notifytip">
<unique>
<context>REGIONMATURITY</context>
@@ -4328,6 +4378,8 @@ The region you're trying to visit contains [REGIONMATURITY] content, but your cu
<notification
icon="notifytip.tga"
name="TeleportEntryAccessBlocked_NotifyAdultsOnly"
+ log_to_im="false"
+ log_to_chat="true"
type="notifytip">
<unique>
<context>REGIONMATURITY</context>
@@ -4448,6 +4500,8 @@ You won't receive any more notifications that you're about to visit a region wit
<notification
icon="notifytip.tga"
name="LandClaimAccessBlocked_Notify"
+ log_to_im="false"
+ log_to_chat="true"
type="notifytip">
The land you're trying to claim contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content.
<tag>fail</tag>
@@ -4456,6 +4510,8 @@ You won't receive any more notifications that you're about to visit a region wit
<notification
icon="notifytip.tga"
name="LandClaimAccessBlocked_NotifyAdultsOnly"
+ log_to_im="false"
+ log_to_chat="true"
type="notifytip">
<tag>fail</tag>
The land you're trying to claim contains [REGIONMATURITY] content, which is accessible to adults only.
@@ -4513,6 +4569,8 @@ You won't receive any more notifications that you're about to visit a region wit
<notification
icon="notifytip.tga"
name="LandBuyAccessBlocked_Notify"
+ log_to_im="false"
+ log_to_chat="true"
type="notifytip">
The land you're trying to buy contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content.
<tag>fail</tag>
@@ -4521,6 +4579,8 @@ You won't receive any more notifications that you're about to visit a region wit
<notification
icon="notifytip.tga"
name="LandBuyAccessBlocked_NotifyAdultsOnly"
+ log_to_im="false"
+ log_to_chat="true"
type="notifytip">
<tag>fail</tag>
The land you're trying to buy contains [REGIONMATURITY] content, which is accessible to adults only.
@@ -4966,6 +5026,20 @@ Go to your [http://secondlife.com/account/ Dashboard] to see your account histor
<notification
icon="alertmodal.tga"
+ name="ConfirmAddingChatParticipants"
+ type="alertmodal">
+ <unique/>
+When you add a person to an existing conversation, a new conversation will be created. All participants will receive new conversation notifications.
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Confirm adding chat paticipants"
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="Ok"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="ConfirmQuit"
type="alertmodal">
<unique/>
@@ -5133,25 +5207,25 @@ Do you want to replace it with the selected object?
<notification
icon="alert.tga"
- label="Busy Mode Warning"
- name="BusyModePay"
+ label="Do Not Disturb Mode Warning"
+ name="DoNotDisturbModePay"
type="alert">
-You are in Busy Mode, which means you will not receive any items offered in exchange for this payment.
+You have turned on Do Not Disturb. You will not receive any items offered in exchange for this payment.
-Would you like to leave Busy Mode before completing this transaction?
+Would you like to turn off Do Not Disturb before completing this transaction?
<tag>confirm</tag>
<form name="form">
<ignore name="ignore"
save_option="true"
- text="I am about to pay a person or object while I am in Busy mode"/>
+ text="I am about to pay a person or object while I am in Do Not Disturb mode"/>
<button
default="true"
- ignore="Always leave Busy Mode"
+ ignore="Always leave Do Not Disturb Mode"
index="0"
name="Yes"
text="OK"/>
<button
- ignore="Never leave Busy Mode"
+ ignore="Never leave Do Not Disturb Mode"
index="1"
name="No"
text="Cancel"/>
@@ -5462,6 +5536,8 @@ The string [STRING_NAME] is missing from strings.xml
<notification
icon="notifytip.tga"
name="IMSystemMessageTip"
+ log_to_im="true"
+ log_to_chat="false"
type="notifytip">
[MESSAGE]
</notification>
@@ -5505,18 +5581,14 @@ Topic: [SUBJECT], Message: [MESSAGE]
<notification
icon="notifytip.tga"
- name="FriendOnline"
+ name="FriendOnlineOffline"
+ log_to_chat="false"
type="notifytip">
<tag>friendship</tag>
-&lt;nolink&gt;[NAME]&lt;/nolink&gt; is Online
- </notification>
-
- <notification
- icon="notifytip.tga"
- name="FriendOffline"
- type="notifytip">
- <tag>friendship</tag>
-&lt;nolink&gt;[NAME]&lt;/nolink&gt; is Offline
+&lt;nolink&gt;[NAME]&lt;/nolink&gt; is [STATUS]
+ <unique combine="cancel_old">
+ <context>NAME</context>
+ </unique>
</notification>
<notification
@@ -5760,6 +5832,8 @@ You don&apos;t have permission to copy this.
<notification
icon="notifytip.tga"
name="InventoryAccepted"
+ log_to_im="true"
+ log_to_chat="false"
type="notifytip">
[NAME] received your inventory offer.
</notification>
@@ -5767,6 +5841,8 @@ You don&apos;t have permission to copy this.
<notification
icon="notifytip.tga"
name="InventoryDeclined"
+ log_to_im="true"
+ log_to_chat="false"
type="notifytip">
[NAME] declined your inventory offer.
</notification>
@@ -5848,6 +5924,7 @@ Please select at least one type of content to search (General, Moderate, or Adul
<notification
icon="notify.tga"
name="PaymentReceived"
+ log_to_im="true"
persist="true"
type="notify">
<tag>funds</tag>
@@ -5857,6 +5934,7 @@ Please select at least one type of content to search (General, Moderate, or Adul
<notification
icon="notify.tga"
name="PaymentSent"
+ log_to_im="true"
persist="true"
type="notify">
<tag>funds</tag>
@@ -6001,6 +6079,7 @@ The objects on the selected parcel that are NOT owned by you have been returned
<notification
icon="notify.tga"
name="ServerObjectMessage"
+ log_to_im="true"
persist="true"
type="notify">
Message from [NAME]:
@@ -6076,26 +6155,6 @@ This area has building disabled. You can&apos;t build or rez objects here.
<notification
icon="alertmodal.tga"
- name="PathfindingRebakeNavmesh"
- type="alertmodal">
- <unique/>
- Changing certain objects in this region could cause other moving objects to behave incorrectly. To make moving objects behave correctly, click the “Rebake region” button. Choose “Help” for more information.
- <url
- option="1"
- name="url"
- target = "_external">
- http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer
- </url>
- <usetemplate
- name="okhelpignore"
- ignoretext="Changing certain objects in this region could cause other moving objects to behave incorrectly."
- yestext="OK"
- helptext="Help"
- />
- </notification>
-
- <notification
- icon="alertmodal.tga"
name="PathfindingCannotRebakeNavmesh"
type="alertmodal">
<unique/>
@@ -6419,7 +6478,9 @@ Your object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; has given you th
<notification
icon="notify.tga"
name="UserGiveItem"
- type="offer">
+ log_to_im ="true"
+ type="offer"
+ sound="UISndNewIncomingIMSession">
[NAME_SLURL] has given you this [OBJECTTYPE]:
[ITEM_SLURL]
<form name="form">
@@ -6474,7 +6535,10 @@ Your object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; has given you th
<notification
icon="notify.tga"
name="TeleportOffered"
- type="offer">
+ log_to_im="true"
+ log_to_chat="false"
+ type="offer"
+ sound="UISndNewIncomingIMSession">
[NAME_SLURL] has offered to teleport you to their location:
“[MESSAGE]”
@@ -6495,6 +6559,8 @@ Your object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; has given you th
<notification
icon="notify.tga"
name="TeleportOffered_MaturityExceeded"
+ log_to_im="true"
+ log_to_chat="false"
type="offer">
[NAME_SLURL] has offered to teleport you to their location:
@@ -6518,6 +6584,8 @@ This region contains [REGION_CONTENT_MATURITY] content, but your current prefere
<notification
icon="notify.tga"
name="TeleportOffered_MaturityBlocked"
+ log_to_im="true"
+ log_to_chat="false"
type="notifytip">
[NAME_SLURL] has offered to teleport you to their location:
@@ -6531,7 +6599,10 @@ However, this region contains content accessible to adults only.
<notification
icon="notify.tga"
name="TeleportOfferSent"
- type="offer">
+ log_to_im="true"
+ log_to_chat="false"
+ show_toast="false"
+ type="notify">
Teleport offer sent to [TO_NAME]
</notification>
@@ -6558,6 +6629,7 @@ However, this region contains content accessible to adults only.
<notification
icon="notify.tga"
name="OfferFriendship"
+ log_to_im="true"
type="offer">
<tag>friendship</tag>
<tag>confirm</tag>
@@ -6581,7 +6653,9 @@ However, this region contains content accessible to adults only.
<notification
icon="notify.tga"
name="FriendshipOffered"
- type="offer">
+ log_to_im="true"
+ show_toast="false"
+ type="notify">
<tag>friendship</tag>
You have offered friendship to [TO_NAME]
</notification>
@@ -6610,7 +6684,8 @@ However, this region contains content accessible to adults only.
<notification
icon="notify.tga"
name="FriendshipAccepted"
- type="offer">
+ log_to_im="true"
+ type="notify">
<tag>friendship</tag>
&lt;nolink&gt;[NAME]&lt;/nolink&gt; accepted your friendship offer.
</notification>
@@ -6618,6 +6693,7 @@ However, this region contains content accessible to adults only.
<notification
icon="notify.tga"
name="FriendshipDeclined"
+ log_to_im="true"
persist="true"
type="notify">
<tag>friendship</tag>
@@ -6627,7 +6703,9 @@ However, this region contains content accessible to adults only.
<notification
icon="notify.tga"
name="FriendshipAcceptedByMe"
- type="offer">
+ log_to_im="true"
+ show_toast="false"
+ type="notify">
<tag>friendship</tag>
Friendship offer accepted.
</notification>
@@ -6635,7 +6713,9 @@ Friendship offer accepted.
<notification
icon="notify.tga"
name="FriendshipDeclinedByMe"
- type="offer">
+ log_to_im="true"
+ show_toast="false"
+ type="notify">
<tag>friendship</tag>
Friendship offer declined.
</notification>
@@ -6684,6 +6764,7 @@ If you stay in this region you will be logged out.
<notification
icon="notify.tga"
name="LoadWebPage"
+ show_toast="false"
type="notify">
Load web page [URL]?
@@ -6764,7 +6845,7 @@ Is this OK?
type="notify">
Warning: The object &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; wants total access to your Linden Dollars account. If you allow access, it can remove funds from your account at any time, or empty your account completely, on an ongoing basis with no additional warnings.
-It is rare that such a request is legitimate. Do not allow access if you do not fully understand why it wants access to your account.
+Do not allow access if you do not fully understand why it wants access to your account.
<tag>confirm</tag>
<form name="form">
@@ -6786,6 +6867,7 @@ It is rare that such a request is legitimate. Do not allow access if you do not
<notification
icon="notify.tga"
name="ScriptDialog"
+ show_toast="false"
type="notify">
[NAME]&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
[MESSAGE]
@@ -6804,6 +6886,7 @@ It is rare that such a request is legitimate. Do not allow access if you do not
<notification
icon="notify.tga"
name="ScriptDialogGroup"
+ show_toast="false"
type="notify">
<tag>group</tag>
[GROUPNAME]&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
@@ -7576,18 +7659,6 @@ We cannot display a preview of this texture because it is no-copy and/or no-tran
<notification
icon="alertmodal.tga"
- name="LivePreviewUnavailable"
- type="alert">
-
-We cannot display a preview of this texture because it is no-copy and/or no-transfer.
- <usetemplate
- ignoretext="Warn me that Live Preview mode is not available for no-copy and/or no-transfer textures"
- name="okignore"
- yestext="OK"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
name="ConfirmLeaveCall"
type="alert">
Are you sure you want to leave this call?
@@ -8284,4 +8355,1680 @@ Attempt cancelled.
yestext="Yes"/>
</notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AvatarFrozen"
+ type="notify">
+ <tag>fail</tag>
+[AV_FREEZER] has frozen you. You cannot move or interact with the world.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AvatarFrozenDuration"
+ type="notify">
+ <tag>fail</tag>
+[AV_FREEZER] has frozen you for [AV_FREEZE_TIME] seconds. You cannot move or interact with the world.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="YouFrozeAvatar"
+ type="notify">
+ <tag>fail</tag>
+Avatar frozen.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AvatarHasUnFrozenYou"
+ type="notify">
+ <tag>fail</tag>
+[AV_FREEZER] has unfrozen you.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AvatarUnFrozen"
+ type="notify">
+ <tag>fail</tag>
+Avatar unfrozen.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AvatarFreezeFailure"
+ type="notify">
+ <tag>fail</tag>
+Freeze failed because you don't have admin permission for that parcel.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AvatarFreezeThaw"
+ type="notify">
+ <tag>fail</tag>
+Your freeze expired, go about your business.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AvatarCantFreeze"
+ type="notify">
+ <tag>fail</tag>
+Sorry, can't freeze that user.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NowOwnObject"
+ type="notify">
+ <tag>fail</tag>
+You are now the owner of object [OBJECT_NAME]
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantRezOnLand"
+ type="notify">
+ <tag>fail</tag>
+Can't rez object at [OBJECT_POS] because the owner of this land does not allow it. Use the land tool to see land ownership.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="RezFailTooManyRequests"
+ type="notify">
+ <tag>fail</tag>
+Object can not be rezzed because there are too many requests.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SitFailCantMove"
+ type="notify">
+ <tag>fail</tag>
+You cannot sit because you cannot move at this time.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SitFailNotAllowedOnLand"
+ type="notify">
+ <tag>fail</tag>
+You cannot sit because you are not allowed on that land.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SitFailNotSameRegion"
+ type="notify">
+ <tag>fail</tag>
+Try moving closer. Can't sit on object because
+it is not in the same region as you.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoNewObjectRegionFull"
+ type="notify">
+ <tag>fail</tag>
+Unable to create new object. The region is full.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="FailedToPlaceObject"
+ type="notify">
+ <tag>fail</tag>
+Failed to place object at specified location. Please try again.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoOwnNoGardening"
+ type="notify">
+ <tag>fail</tag>
+You Can't create trees and grass on land you don't own.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoCopyPermsNoObject"
+ type="notify">
+ <tag>fail</tag>
+Copy failed because you lack permission to copy the object '[OBJ_NAME]'.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoTransPermsNoObject"
+ type="notify">
+ <tag>fail</tag>
+Copy failed because the object '[OBJ_NAME]' cannot be transferred to you.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AddToNavMeshNoCopy"
+ type="notify">
+ <tag>fail</tag>
+Copy failed because the object '[OBJ_NAME]' contributes to navmesh.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="DupeWithNoRootsSelected"
+ type="notify">
+ <tag>fail</tag>
+Duplicate with no root objects selected.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantDupeCuzRegionIsFull"
+ type="notify">
+ <tag>fail</tag>
+Can't duplicate objects because the region is full.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantDupeCuzParcelNotFound"
+ type="notify">
+ <tag>fail</tag>
+Can't duplicate objects - Can't find the parcel they are on.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantCreateCuzParcelFull"
+ type="notify">
+ <tag>fail</tag>
+Can't create object because
+the parcel is full.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="RezAttemptFailed"
+ type="notify">
+ <tag>fail</tag>
+Attempt to rez an object failed.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ToxicInvRezAttemptFailed"
+ type="notify">
+ <tag>fail</tag>
+Unable to create item that has caused problems on this region.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="InvItemIsBlacklisted"
+ type="notify">
+ <tag>fail</tag>
+That inventory item has been blacklisted.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoCanRezObjects"
+ type="notify">
+ <tag>fail</tag>
+You are not currently allowed to create objects.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LandSearchBlocked"
+ type="notify">
+ <tag>fail</tag>
+Land Search Blocked.
+You have performed too many land searches too quickly.
+Please try again in a minute.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NotEnoughResourcesToAttach"
+ type="notify">
+ <tag>fail</tag>
+Not enough script resources available to attach object!
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="YouDiedAndGotTPHome"
+ type="notify">
+ <tag>fail</tag>
+You died and have been teleported to your home location
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="EjectComingSoon"
+ type="notify">
+ <tag>fail</tag>
+You are no longer allowed here and have [EJECT_TIME] seconds to leave.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoEnterServerFull"
+ type="notify">
+ <tag>fail</tag>
+You can't enter this region because
+the server is full.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SaveBackToInvDisabled"
+ type="notify">
+ <tag>fail</tag>
+Save Back To Inventory has been disabled.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoExistNoSaveToContents"
+ type="notify">
+ <tag>fail</tag>
+Cannot save '[OBJ_NAME]' to object contents because the object it was rezzed from no longer exists.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoModNoSaveToContents"
+ type="notify">
+ <tag>fail</tag>
+Cannot save '[OBJ_NAME]' to object contents because you do not have permission to modify the object '[DEST_NAME]'.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoSaveBackToInvDisabled"
+ type="notify">
+ <tag>fail</tag>
+Cannot save '[OBJ_NAME]' back to inventory -- this operation has been disabled.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoCopyNoSelCopy"
+ type="notify">
+ <tag>fail</tag>
+You cannot copy your selection because you do not have permission to copy the object '[OBJ_NAME]'.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoTransNoSelCopy"
+ type="notify">
+ <tag>fail</tag>
+You cannot copy your selection because the object '[OBJ_NAME]' is not transferrable.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoTransNoCopy"
+ type="notify">
+ <tag>fail</tag>
+You cannot copy your selection because the object '[OBJ_NAME]' is not transferrable.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoPermsNoRemoval"
+ type="notify">
+ <tag>fail</tag>
+Removal of the object '[OBJ_NAME]' from the simulator is disallowed by the permissions system.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoModNoSaveSelection"
+ type="notify">
+ <tag>fail</tag>
+Cannot save your selection because you do not have permission to modify the object '[OBJ_NAME]'.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoCopyNoSaveSelection"
+ type="notify">
+ <tag>fail</tag>
+Cannot save your selection because the object '[OBJ_NAME]' is not copyable.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoModNoTaking"
+ type="notify">
+ <tag>fail</tag>
+You cannot take your selection because you do not have permission to modify the object '[OBJ_NAME]'.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="RezDestInternalError"
+ type="notify">
+ <tag>fail</tag>
+Internal Error: Unknown destination type.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="DeleteFailObjNotFound"
+ type="notify">
+ <tag>fail</tag>
+Delete failed because object not found
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SorryCantEjectUser"
+ type="notify">
+ <tag>fail</tag>
+Sorry, can't eject that user.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="RegionSezNotAHome"
+ type="notify">
+ <tag>fail</tag>
+This region does not allow you to set your home location here.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="HomeLocationLimits"
+ type="notify">
+ <tag>fail</tag>
+You can only set your 'Home Location' on your land or at a mainland Infohub.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="HomePositionSet"
+ type="notify">
+ <tag>fail</tag>
+Home position set.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AvatarEjected"
+ type="notify">
+ <tag>fail</tag>
+Avatar ejected.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AvatarEjectFailed"
+ type="notify">
+ <tag>fail</tag>
+Eject failed because you don't have admin permission for that parcel.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantMoveObjectParcelFull"
+ type="notify">
+ <tag>fail</tag>
+Can't move object '[OBJECT_NAME]' to
+[OBJ_POSITION] in region [REGION_NAME] because the parcel is full.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantMoveObjectParcelPerms"
+ type="notify">
+ <tag>fail</tag>
+Can't move object '[OBJECT_NAME]' to
+[OBJ_POSITION] in region [REGION_NAME] because your objects are not allowed on this parcel.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantMoveObjectParcelResources"
+ type="notify">
+ <tag>fail</tag>
+Can't move object '[OBJECT_NAME]' to
+[OBJ_POSITION] in region [REGION_NAME] because there are not enough resources for this object on this parcel.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantMoveObjectRegionVersion"
+ type="notify">
+ <tag>fail</tag>
+Can't move object '[OBJECT_NAME]' to
+[OBJ_POSITION] in region [REGION_NAME] because the other region is running an older version which does not support receiving this object via region crossing.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantMoveObjectNavMesh"
+ type="notify">
+ <tag>fail</tag>
+Can't move object '[OBJECT_NAME]' to
+[OBJ_POSITION] in region [REGION_NAME] because you cannot modify the navmesh across region boundaries.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantMoveObjectWTF"
+ type="notify">
+ <tag>fail</tag>
+Can't move object '[OBJECT_NAME]' to
+[OBJ_POSITION] in region [REGION_NAME] because of an unknown reason. ([FAILURE_TYPE])
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoPermModifyObject"
+ type="notify">
+ <tag>fail</tag>
+You don't have permission to modify that object
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantEnablePhysObjContributesToNav"
+ type="notify">
+ <tag>fail</tag>
+Can't enable physics for an object that contributes to the navmesh.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantEnablePhysKeyframedObj"
+ type="notify">
+ <tag>fail</tag>
+Can't enable physics for keyframed objects.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantEnablePhysNotEnoughLandResources"
+ type="notify">
+ <tag>fail</tag>
+Can't enable physics for object -- insufficient land resources.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantEnablePhysCostTooGreat"
+ persist="true"
+ type="notify">
+ <tag>fail</tag>
+Can't enable physics for object with physics resource cost greater than [MAX_OBJECTS]
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="PhantomWithConcavePiece"
+ type="notify">
+ <tag>fail</tag>
+This object cannot have a concave piece because it is phantom and contributes to the navmesh.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="UnableAddItem"
+ type="notify">
+ <tag>fail</tag>
+Unable to add item!
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="UnableEditItem"
+ type="notify">
+ <tag>fail</tag>
+Unable to edit this!
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoPermToEdit"
+ type="notify">
+ <tag>fail</tag>
+Not permitted to edit this.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoPermToCopyInventory"
+ type="notify">
+ <tag>fail</tag>
+Not permitted to copy that inventory.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantSaveItemDoesntExist"
+ type="notify">
+ <tag>fail</tag>
+Cannot save to object contents: Item no longer exists.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantSaveItemAlreadyExists"
+ type="notify">
+ <tag>fail</tag>
+Cannot save to object contents: Item with that name already exists in inventory
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantSaveModifyAttachment"
+ type="notify">
+ <tag>fail</tag>
+Cannot save to object contents: This would modify the attachment permissions.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="TooManyScripts"
+ type="notify">
+ <tag>fail</tag>
+Too many scripts.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="UnableAddScript"
+ type="notify">
+ <tag>fail</tag>
+Unable to add script!
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AssetServerTimeoutObjReturn"
+ type="notify">
+ <tag>fail</tag>
+Asset server didn't respond in a timely fashion. Object returned to sim.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="RegionDisablePhysicsShapes"
+ type="notify">
+ <tag>fail</tag>
+This region does not have physics shapes enabled.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoModNavmeshAcrossRegions"
+ type="notify">
+ <tag>fail</tag>
+You cannot modify the navmesh across region boundaries.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoSetPhysicsPropertiesOnObjectType"
+ type="notify">
+ <tag>fail</tag>
+Cannot set physics properties on that object type.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoSetRootPrimWithNoShape"
+ type="notify">
+ <tag>fail</tag>
+Cannot set root prim to have no shape.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoRegionSupportPhysMats"
+ type="notify">
+ <tag>fail</tag>
+This region does not have physics materials enabled.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="OnlyRootPrimPhysMats"
+ type="notify">
+ <tag>fail</tag>
+Only root prims may have their physics materials adjusted.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoSupportCharacterPhysMats"
+ type="notify">
+ <tag>fail</tag>
+Setting physics materials on characters is not yet supported.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="InvalidPhysMatProperty"
+ type="notify">
+ <tag>fail</tag>
+One or more of the specified physics material properties was invalid.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoPermsAlterStitchingMeshObj"
+ type="notify">
+ <tag>fail</tag>
+You may not alter the stitching type of a mesh object.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoPermsAlterShapeMeshObj"
+ type="notify">
+ <tag>fail</tag>
+You may not alter the shape of a mesh object
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="FullRegionCantEnter"
+ type="notify">
+ <tag>fail</tag>
+You can't enter this region because \nthe region is full.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LinkFailedOwnersDiffer"
+ type="notify">
+ <tag>fail</tag>
+Link failed -- owners differ
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LinkFailedNoModNavmeshAcrossRegions"
+ type="notify">
+ <tag>fail</tag>
+Link failed -- cannot modify the navmesh across region boundaries.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LinkFailedNoPermToEdit"
+ type="notify">
+ <tag>fail</tag>
+Link failed because you do not have edit permission.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LinkFailedTooManyPrims"
+ type="notify">
+ <tag>fail</tag>
+Link failed -- too many primitives
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LinkFailedCantLinkNoCopyNoTrans"
+ type="notify">
+ <tag>fail</tag>
+Link failed -- cannot link no-copy with no-transfer
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LinkFailedNothingLinkable"
+ type="notify">
+ <tag>fail</tag>
+Link failed -- nothing linkable.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LinkFailedTooManyPathfindingChars"
+ type="notify">
+ <tag>fail</tag>
+Link failed -- too many pathfinding characters
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LinkFailedInsufficientLand"
+ type="notify">
+ <tag>fail</tag>
+Link failed -- insufficient land resources
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LinkFailedTooMuchPhysics"
+ type="notify">
+ <tag>fail</tag>
+Object uses too many physics resources -- its dynamics have been disabled.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="TeleportedHomeByObjectOnParcel"
+ persist="true"
+ type="notify">
+ <tag>fail</tag>
+You have been teleported home by the object '[OBJECT_NAME]' on the parcel '[PARCEL_NAME]'
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="TeleportedHomeByObject"
+ persist="true"
+ type="notify">
+ <tag>fail</tag>
+You have been teleported home by the object '[OBJECT_NAME]'
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="TeleportedByAttachment"
+ type="notify">
+ <tag>fail</tag>
+You have been teleported by an attachment on [ITEM_ID]
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="TeleportedByObjectOnParcel"
+ type="notify">
+ <tag>fail</tag>
+You have been teleported by the object '[OBJECT_NAME]' on the parcel '[PARCEL_NAME]'
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="TeleportedByObjectOwnedBy"
+ type="notify">
+ <tag>fail</tag>
+You have been teleported by the object '[OBJECT_NAME]' owned by [OWNER_ID]
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="TeleportedByObjectUnknownUser"
+ type="notify">
+ <tag>fail</tag>
+You have been teleported by the object '[OBJECT_NAME]' owned by an unknown user.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantCreateObjectRegionFull"
+ type="notify">
+ <tag>fail</tag>
+Unable to create requested object. The region is full.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantAttackMultipleObjOneSpot"
+ type="notify">
+ <tag>fail</tag>
+You can't attach multiple objects to one spot.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantCreateMultipleObjAtLoc"
+ type="notify">
+ <tag>fail</tag>
+You can't create multiple objects here.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="UnableToCreateObjTimeOut"
+ type="notify">
+ <tag>fail</tag>
+Unable to create requested object. Object is missing from database.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="UnableToCreateObjUnknown"
+ type="notify">
+ <tag>fail</tag>
+Unable to create requested object. The request timed out. Please try again.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="UnableToCreateObjMissingFromDB"
+ type="notify">
+ <tag>fail</tag>
+Unable to create requested object. Please try again.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="RezFailureTookTooLong"
+ type="notify">
+ <tag>fail</tag>
+Rez failed, requested object took too long to load.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="FailedToPlaceObjAtLoc"
+ type="notify">
+ <tag>fail</tag>
+Failed to place object at specified location. Please try again.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantCreatePlantsOnLand"
+ type="notify">
+ <tag>fail</tag>
+You cannot create plants on this land.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantRestoreObjectNoWorldPos"
+ type="notify">
+ <tag>fail</tag>
+Cannot restore object. No world position found.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantRezObjectInvalidMeshData"
+ type="notify">
+ <tag>fail</tag>
+Unable to rez object because its mesh data is invalid.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantRezObjectTooManyScripts"
+ type="notify">
+ <tag>fail</tag>
+Unable to rez object because there are already too many scripts in this region.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantCreateObjectNoAccess"
+ type="notify">
+ <tag>fail</tag>
+Your access privileges don't allow you to create objects there.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantCreateObject"
+ type="notify">
+ <tag>fail</tag>
+You are not currently allowed to create objects.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="InvalidObjectParams"
+ type="notify">
+ <tag>fail</tag>
+Invalid object parameters
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantDuplicateObjectNoAcess"
+ type="notify">
+ <tag>fail</tag>
+Your access privileges don't allow you to duplicate objects here.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantChangeShape"
+ type="notify">
+ <tag>fail</tag>
+You are not allowed to change this shape.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoAccessToClaimObjects"
+ type="notify">
+ <tag>fail</tag>
+Your access privileges don't allow you to claim objects here.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="DeedFailedNoPermToDeedForGroup"
+ type="notify">
+ <tag>fail</tag>
+Deed failed because you do not have permission to deed objects for your group.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoPrivsToBuyObject"
+ type="notify">
+ <tag>fail</tag>
+Your access privileges don't allow you to buy objects here.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantAttachObjectAvatarSittingOnIt"
+ type="notify">
+ <tag>fail</tag>
+Cannot attach object because an avatar is sitting on it.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="WhyAreYouTryingToWearShrubbery"
+ type="notify">
+ <tag>fail</tag>
+Trees and grasses cannot be worn as attachments.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantAttachGroupOwnedObjs"
+ type="notify">
+ <tag>fail</tag>
+Cannot attach group-owned objects.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantAttachObjectsNotOwned"
+ type="notify">
+ <tag>fail</tag>
+Cannot attach objects that you don't own.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantAttachNavmeshObjects"
+ type="notify">
+ <tag>fail</tag>
+Cannot attach objects that contribute to navmesh.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantAttachObjectNoMovePermissions"
+ type="notify">
+ <tag>fail</tag>
+Cannot attach object because you do not have permission to move it.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantAttachNotEnoughScriptResources"
+ type="notify">
+ <tag>fail</tag>
+Not enough script resources available to attach object!
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantDropItemTrialUser"
+ type="notify">
+ <tag>fail</tag>
+You can't drop objects here; try the Free Trial area.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantDropMeshAttachment"
+ type="notify">
+ <tag>fail</tag>
+You can't drop mesh attachments. Detach to inventory and then rez in world.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantDropAttachmentNoPermission"
+ type="notify">
+ <tag>fail</tag>
+Failed to drop attachment: you don't have permission to drop there.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantDropAttachmentInsufficientLandResources"
+ type="notify">
+ <tag>fail</tag>
+Failed to drop attachment: insufficient available land resource.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantDropAttachmentInsufficientResources"
+ type="notify">
+ <tag>fail</tag>
+Failed to drop attachments: insufficient available resources.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantDropObjectFullParcel"
+ type="notify">
+ <tag>fail</tag>
+Cannot drop object here. Parcel is full.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantTouchObjectBannedFromParcel"
+ type="notify">
+ <tag>fail</tag>
+Can't touch/grab this object because you are banned from the land parcel.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="PlzNarrowDeleteParams"
+ type="notify">
+ <tag>fail</tag>
+Please narrow your delete parameters.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="UnableToUploadAsset"
+ type="notify">
+ <tag>fail</tag>
+Unable to upload asset.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantTeleportCouldNotFindUser"
+ type="notify">
+ <tag>fail</tag>
+Could not find user to teleport home
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="GodlikeRequestFailed"
+ type="notify">
+ <tag>fail</tag>
+godlike request failed
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="GenericRequestFailed"
+ type="notify">
+ <tag>fail</tag>
+generic request failed
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantUploadPostcard"
+ type="notify">
+ <tag>fail</tag>
+Unable to upload postcard. Try again later.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantFetchInventoryForGroupNotice"
+ type="notify">
+ <tag>fail</tag>
+Unable to fetch inventory details for the group notice.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantSendGroupNoticeNotPermitted"
+ type="notify">
+ <tag>fail</tag>
+Unable to send group notice -- not permitted.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantSendGroupNoticeCantConstructInventory"
+ type="notify">
+ <tag>fail</tag>
+Unable to send group notice -- could not construct inventory.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantParceInventoryInNotice"
+ type="notify">
+ <tag>fail</tag>
+Unable to parse inventory in notice.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="TerrainUploadFailed"
+ type="notify">
+ <tag>fail</tag>
+Terrain upload failed.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="TerrainFileWritten"
+ type="notify">
+ <tag>fail</tag>
+Terrain file written.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="TerrainFileWrittenStartingDownload"
+ type="notify">
+ <tag>fail</tag>
+Terrain file written, starting download...
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="TerrainBaked"
+ type="notify">
+ <tag>fail</tag>
+Terrain baked.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="TenObjectsDisabledPlzRefresh"
+ type="notify">
+ <tag>fail</tag>
+Only the first 10 selected objects have been disabled. Refresh and make additional selections if required.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="UpdateViewerBuyParcel"
+ type="notify">
+ <tag>fail</tag>
+You need to update your viewer to buy this parcel.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LandBuyAccessBlocked"
+ type="notify">
+ <tag>fail</tag>
+You can't buy this land due to your maturity Rating. You may need to validate your age and/or install the latest Viewer. Please go to the Knowledge Base for details on accessing areas with this maturity Rating.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantBuyParcelNotForSale"
+ type="notify">
+ <tag>fail</tag>
+Unable to buy, this parcel is not for sale.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantBuySalePriceOrLandAreaChanged"
+ type="notify">
+ <tag>fail</tag>
+Unable to buy, the sale price or land area has changed.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantBuyParcelNotAuthorized"
+ type="notify">
+ <tag>fail</tag>
+You are not the authorized buyer for this parcel.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantBuyParcelAwaitingPurchaseAuth"
+ type="notify">
+ <tag>fail</tag>
+You cannot purchase this parcel because it is already awaiting purchase aut
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantBuildOverflowParcel"
+ type="notify">
+ <tag>fail</tag>
+You cannot build objects here because doing so would overflow the parcel.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SelectedMultipleOwnedLand"
+ type="notify">
+ <tag>fail</tag>
+You selected land with different owners. Please select a smaller area and try again.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantJoinTooFewLeasedParcels"
+ type="notify">
+ <tag>fail</tag>
+Not enough leased parcels in selection to join.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantDivideLandMultipleParcelsSelected"
+ type="notify">
+ <tag>fail</tag>
+Can't divide land.\nThere is more than one parcel selected.\nTry selecting a smaller piece of land.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantDivideLandCantFindParcel"
+ type="notify">
+ <tag>fail</tag>
+Can't divide land.\nCan't find the parcel.\nPlease report with Help -> Reprt Bug...
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantDivideLandWholeParcelSelected"
+ type="notify">
+ <tag>fail</tag>
+Can't divide land. Whole parcel is selected.\nTry selecting a smaller piece of land.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LandHasBeenDivided"
+ type="notify">
+ <tag>fail</tag>
+Land has been divided.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="PassPurchased"
+ type="notify">
+ <tag>fail</tag>
+You purchased a pass.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="RegionDisallowsClassifieds"
+ type="notify">
+ <tag>fail</tag>
+Region does not allow classified advertisements.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LandPassExpireSoon"
+ type="notify">
+ <tag>fail</tag>
+Your pass to this land is about to expire.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantSitNoSuitableSurface"
+ type="notify">
+ <tag>fail</tag>
+There is no suitable surface to sit on, try another spot.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantSitNoRoom"
+ type="notify">
+ <tag>fail</tag>
+No room to sit here, try another spot.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ClaimObjectFailedNoPermission"
+ type="notify">
+ <tag>fail</tag>
+Claim object failed because you don't have permission
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ClaimObjectFailedNoMoney"
+ type="notify">
+ <tag>fail</tag>
+Claim object failed because you don't have enough L$.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantDeedGroupLand"
+ type="notify">
+ <tag>fail</tag>
+Cannot deed group-owned land.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="BuyObjectFailedNoMoney"
+ type="notify">
+ <tag>fail</tag>
+Buy object failed because you don't have enough L$.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="BuyInventoryFailedNoMoney"
+ type="notify">
+ <tag>fail</tag>
+Buy inventory failed because you do not have enough L$
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="BuyPassFailedNoMoney"
+ type="notify">
+ <tag>fail</tag>
+You don't have enough L$ to buy a pass to this land.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantBuyPassTryAgain"
+ type="notify">
+ <tag>fail</tag>
+Unable to buy pass right now. Try again later.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantCreateObjectParcelFull"
+ type="notify">
+ <tag>fail</tag>
+Can't create object because \nthe parcel is full.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="FailedPlacingObject"
+ type="notify">
+ <tag>fail</tag>
+Failed to place object at specified location. Please try again.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantCreateLandmarkForEvent"
+ type="notify">
+ <tag>fail</tag>
+Unable to create landmark for event.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="GodBeatsFreeze"
+ type="notify">
+ <tag>fail</tag>
+Your godlike powers break the freeze!
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SpecialPowersRequestFailedLogged"
+ type="notify">
+ <tag>fail</tag>
+Request for special powers failed. This request has been logged.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ExpireExplanation"
+ type="notify">
+ <tag>fail</tag>
+The system is currently unable to process your request. The request timed out.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="DieExplanation"
+ type="notify">
+ <tag>fail</tag>
+The system is unable to process your request.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AddPrimitiveFailure"
+ type="notify">
+ <tag>fail</tag>
+Insufficient funds to create primitve.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="RezObjectFailure"
+ type="notify">
+ <tag>fail</tag>
+Insufficient funds to create object.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ResetHomePositionNotLegal"
+ type="notify">
+ <tag>fail</tag>
+Reset Home position since Home wasn't legal.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantInviteRegionFull"
+ type="notify">
+ <tag>fail</tag>
+You cannot currently invite anyone to your location because the region is full. Try again later.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantSetHomeAtRegion"
+ type="notify">
+ <tag>fail</tag>
+This region does not allow you to set your home location here.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ListValidHomeLocations"
+ type="notify">
+ <tag>fail</tag>
+You can only set your 'Home Location' on your land or at a mainland Infohub.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SetHomePosition"
+ type="notify">
+ <tag>fail</tag>
+Home position set.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantDerezInventoryError"
+ type="notify">
+ <tag>fail</tag>
+Cannot derez object due to inventory fault.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantCreateRequestedInv"
+ type="notify">
+ <tag>fail</tag>
+Cannot create requested inventory.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantCreateRequestedInvFolder"
+ type="notify">
+ <tag>fail</tag>
+Cannot create requested inventory folder.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantCreateInventory"
+ type="notify">
+ <tag>fail</tag>
+Cannot create that inventory.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantCreateLandmark"
+ type="notify">
+ <tag>fail</tag>
+Cannot create landmark.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantCreateOutfit"
+ type="notify">
+ <tag>fail</tag>
+Cannot create outfit right now. Try again in a minute.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="InventoryNotForSale"
+ type="notify">
+ <tag>fail</tag>
+Inventory is not for sale.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantFindInvItem"
+ type="notify">
+ <tag>fail</tag>
+Unable to find inventory item.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantFindObject"
+ type="notify">
+ <tag>fail</tag>
+Unable to find object.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantTransfterMoneyRegionDisabled"
+ type="notify">
+ <tag>fail</tag>
+Money transfers to objects are currently disabled in this region.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantPayNoAgent"
+ type="notify">
+ <tag>fail</tag>
+Could not figure out who to pay.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="CantDonateToPublicObjects"
+ type="notify">
+ <tag>fail</tag>
+You cannot give L$ to public objects.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="InventoryCreationInWorldObjectFailed"
+ type="notify">
+ <tag>fail</tag>
+Inventory creation on in-world object failed.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="UserBalanceOrLandUsageError"
+ type="notify">
+ <tag>fail</tag>
+An internal error prevented us from properly updating your viewer. The L$ balance or parcel holdings displayed in your viewer may not reflect your actual balance on the servers.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LargePrimAgentIntersect"
+ type="notify">
+ <tag>fail</tag>
+Cannot create large prims that intersect other players. Please re-try when other players have moved.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="PreferenceChatClearLog"
+ type="alertmodal">
+ This will delete the logs of previous conversations, and any backups of that file.
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Confirm before I delete the log of previous conversations."
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="PreferenceChatDeleteTranscripts"
+ type="alertmodal">
+ This will delete the transcripts for all previous conversations. The list of past conversations will not be affected. All files with the suffixes .txt and txt.backup in the folder [FOLDER] will be deleted.
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Confirm before I delete transcripts."
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alert.tga"
+ name="PreferenceChatPathChanged"
+ type="alert">
+ Unable to move files. Restored previous path.
+ <usetemplate
+ ignoretext="Unable to move files. Restored previous path."
+ name="okignore"
+ yestext="OK"/>
+ </notification>
+
</notifications>
diff --git a/indra/newview/skins/default/xui/en/panel_activeim_row.xml b/indra/newview/skins/default/xui/en/panel_activeim_row.xml
deleted file mode 100644
index 9369d1b5cf..0000000000
--- a/indra/newview/skins/default/xui/en/panel_activeim_row.xml
+++ /dev/null
@@ -1,97 +0,0 @@
-<?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_im_p2p
- name="p2p_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_im_p2p>
- <chiclet_im_group
- name="group_chiclet"
- layout="topleft"
- follows="left"
- top="3"
- left="5"
- height="25"
- 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
- translate="false"
- type="string"
- name="contact_name"
- layout="topleft"
- top="10"
- left_pad="10"
- height="14"
- width="250"
- length="1"
- follows="right|left"
- parse_urls="false"
- use_ellipses="true"
- font="SansSerifBold">
- TestString PleaseIgnore
- </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_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
deleted file mode 100644
index d68fa6ca6c..0000000000
--- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,95 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- border="false"
- follows="all"
- height="215"
- 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="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">
- <avatar_list
- color="DkGray2"
- follows="all"
- height="130"
- ignore_online_status="true"
- layout="topleft"
- name="speakers_list"
- opaque="false"
- show_info_btn="true"
- 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"
- visible="false">
- <button
- follows="all"
- height="20"
- label="Call"
- name="call_btn"
- width="130"
- top="0" />
- </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"
- visible="false">
- <button
- follows="all"
- height="20"
- label="Leave Call"
- name="end_call_btn"
- top="0"/>
- </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"
- visible="false">
- <button
- follows="all"
- height="20"
- label="Voice Controls"
- name="voice_ctrls_btn"
- top="0"
- 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 b7c58eb6ab..aa1b929412 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
@@ -129,6 +129,7 @@
left_pad="3"
right="-53"
name="info_btn"
+ tool_tip="More info"
tab_stop="false"
top_delta="0"
width="16" />
diff --git a/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml
index 7c67fd7f83..53d0252215 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
@@ -4,88 +4,99 @@
follows="left|top|right|bottom"
height="305"
layout="topleft"
+ left="0"
name="block_list_panel"
help_topic="blocked_list"
min_height="350"
min_width="240"
- width="280">
- <button
- follows="top|left"
- height="24"
- image_hover_unselected="BackButton_Over"
- image_pressed="BackButton_Press"
- image_unselected="BackButton_Off"
- layout="topleft"
- name="back"
- left="4"
- tab_stop="false"
- top="1"
- width="30"/>
- <text
- follows="top|left|right"
- font="SansSerifLargeBold"
- height="20"
- layout="topleft"
- left_pad="10"
- name="title_text"
- text_color="White"
- top="5"
- width="250">
- Block List
- </text>
- <scroll_list
+ width="323">
+ <panel
+ follows="left|top|right"
+ height="27"
+ label="bottom_panel"
+ layout="topleft"
+ left="0"
+ name="blocked_buttons_panel"
+ right="-1"
+ top="0">
+ <filter_editor
+ follows="left|top|right"
+ height="23"
+ layout="topleft"
+ left="6"
+ label="Filter"
+ max_length_chars="300"
+ name="blocked_filter_input"
+ text_color="Black"
+ text_pad_left="10"
+ top="4"
+ width="177" />
+ <menu_button
+ follows="right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="8"
+ menu_filename="menu_people_blocked_gear.xml"
+ menu_position="bottomleft"
+ name="blocked_gear_btn"
+ tool_tip="Actions on selected person or object"
+ top="3"
+ width="31" />
+ <menu_button
+ follows="right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_sort"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="2"
+ menu_filename="menu_people_blocked_view.xml"
+ menu_position="bottomleft"
+ name="view_btn"
+ tool_tip="Sort options"
+ top_delta="0"
+ width="31" />
+ <menu_button
+ follows="right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="AddItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="2"
+ menu_filename="menu_people_blocked_plus.xml"
+ menu_position="bottomleft"
+ name="plus_btn"
+ tool_tip="Pick a Resident or an object to block"
+ top_delta="0"
+ width="31"/>
+ <button
+ follows="right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="TrashItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ left_pad="2"
+ layout="topleft"
+ name="unblock_btn"
+ tool_tip="Remove Resident or object from blocked list"
+ top_delta="0"
+ width="31"/>
+ </panel>
+ <block_list
follows="all"
- height="190"
+ height="273"
layout="topleft"
- left="5"
+ left="3"
name="blocked"
tool_tip="List of currently blocked Residents"
- top="30"
- width="270">
- <scroll_list.columns
- name="item_name" />
- <scroll_list.columns
- name="item_type"
- width="96" />
- </scroll_list>
- <button
- follows="left|bottom"
- height="23"
- label="Block person"
- layout="topleft"
- left_delta="0"
- name="Block resident..."
- tool_tip="Pick a Resident to block"
- top_pad="4"
- width="210">
- <button.commit_callback
- function="Block.ClickPick" />
- </button>
- <button
- follows="left|bottom"
- 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
- function="Block.ClickBlockByName" />
- </button>
- <button
- enabled="false"
- follows="left|bottom"
- height="23"
- label="Unblock"
- layout="topleft"
- left_delta="0"
- name="Unblock"
- tool_tip="Remove Resident or object from blocked list"
- top_pad="4"
- width="210" >
- <button.commit_callback
- function="Block.ClickRemove" />
- </button>
+ top="31"
+ right="-1"/>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_blocked_list_item.xml b/indra/newview/skins/default/xui/en/panel_blocked_list_item.xml
new file mode 100644
index 0000000000..752321b949
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_blocked_list_item.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ follows="top|right|left"
+ height="23"
+ layout="topleft"
+ left="0"
+ name="blocked_list_item"
+ top="0"
+ width="380">
+ <icon
+ height="24"
+ follows="top|right|left"
+ image_name="ListItem_Select"
+ layout="topleft"
+ left="0"
+ name="selected_icon"
+ top="0"
+ visible="false"
+ width="380" />
+ <icon
+ follows="top|right|left"
+ height="24"
+ image_name="ListItem_Over"
+ layout="topleft"
+ left="0"
+ name="hovered_icon"
+ top="0"
+ visible="false"
+ width="380" />
+ <avatar_icon
+ default_icon_name="Generic_Person"
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left="5"
+ mouse_opaque="true"
+ top="2"
+ visible="false"
+ width="20" />
+ <group_icon
+ default_icon_name="Generic_Group"
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left="5"
+ mouse_opaque="true"
+ top="2"
+ visible="false"
+ width="20" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="Inv_Object"
+ layout="topleft"
+ left="7"
+ name="object_icon"
+ top="4"
+ visible="false"
+ width="16" />
+ <text
+ follows="left|right"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="5"
+ name="item_name"
+ parse_urls="false"
+ top="6"
+ use_ellipses="true"
+ width="180" />
+</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml
index f4722b05d6..27a27473d8 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml
@@ -46,7 +46,7 @@
follows="left|right"
top="4"
width="310"
- name="chat_bar"
+ name="nearby_chat"
mouse_opaque="false"/>
</layout_panel>
<layout_panel
diff --git a/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml
index ff0146490b..fc321fdd23 100644
--- a/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml
@@ -87,54 +87,6 @@
layout="topleft"
min_height="28"
min_width="37"
- name="im_well_panel"
- top="0"
- width="37">
- <chiclet_im_well
- follows="right"
- height="28"
- layout="topleft"
- left="0"
- max_displayed_count="99"
- 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="false"
- 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">
- <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"
- min_width="37"
name="notification_well_panel"
top="0"
width="37">
diff --git a/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml
new file mode 100644
index 0000000000..a054e71e34
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ follows="left|top|right"
+ height="24"
+ layout="topleft"
+ name="conversation_list_item"
+ mouse_opaque="false"
+ width="120">
+ <avatar_icon
+ follows="top|left"
+ height="20"
+ default_icon_name="Generic_Person"
+ layout="topleft"
+ left="5"
+ top="2"
+ visible="false"
+ width="20" />
+ <group_icon
+ follows="top|left"
+ height="20"
+ default_icon_name="Generic_Group"
+ layout="topleft"
+ left="5"
+ top="2"
+ visible="false"
+ width="20" />
+ <icon
+ follows="top|left"
+ height="20"
+ image_name="Nearby_chat_icon"
+ layout="topleft"
+ left="5"
+ name="nearby_chat_icon"
+ top="2"
+ visible="false"
+ width="20"/>
+ <layout_stack
+ animate="false"
+ follows="all"
+ height="24"
+ layout="topleft"
+ left="30"
+ mouse_opaque="false"
+ name="conversation_item_stack"
+ orientation="horizontal"
+ top="0"
+ width="90">
+ <layout_panel
+ auto_resize="false"
+ user_resize="false"
+ height="24"
+ mouse_opaque="false"
+ name="call_icon_panel"
+ visible="false"
+ width="20">
+ <icon
+ height="18"
+ follows="top|right|left"
+ image_name="Conv_toolbar_open_call"
+ layout="topleft"
+ left="0"
+ name="selected_icon"
+ top="3"
+ width="18" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="true"
+ user_resize="false"
+ height="24"
+ mouse_opaque="false"
+ name="conversation_title_panel"
+ width="70">
+ <text
+ follows="left|top|right"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left="5"
+ name="conversation_title"
+ parse_urls="false"
+ top="6"
+ use_ellipses="true"
+ value="(loading)"
+ width="35" />
+ <output_monitor
+ auto_update="true"
+ follows="top|right"
+ draw_border="false"
+ height="16"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="true"
+ name="speaking_indicator"
+ visible="false"
+ width="20" />
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/en/panel_conversation_log_list_item.xml
new file mode 100644
index 0000000000..78d4c174d2
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_conversation_log_list_item.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ follows="top|right|left"
+ height="23"
+ layout="topleft"
+ left="0"
+ name="conversation_log_list_item"
+ top="0"
+ width="380">
+ <icon
+ height="24"
+ follows="top|right|left"
+ image_name="ListItem_Select"
+ layout="topleft"
+ left="0"
+ name="selected_icon"
+ top="0"
+ visible="false"
+ width="380" />
+ <icon
+ follows="top|right|left"
+ height="24"
+ image_name="ListItem_Over"
+ layout="topleft"
+ left="0"
+ name="hovered_icon"
+ top="0"
+ visible="false"
+ width="380" />
+ <icon
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left="5"
+ image_name="Conv_toolbar_open_call"
+ mouse_opaque="true"
+ name="voice_session_icon"
+ tool_tip="Included a voice conversation"
+ top="2"
+ visible="false"
+ width="20" />
+ <icon
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left="5"
+ image_name="Conv_log_inbox"
+ mouse_opaque="false"
+ name="unread_ims_icon"
+ tool_tip="Messages arrived while you were logged out"
+ top="2"
+ visible="false"
+ width="20" />
+ <avatar_icon
+ default_icon_name="Generic_Person"
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="true"
+ top="2"
+ visible="false"
+ width="20" />
+ <group_icon
+ default_icon_name="Generic_Group"
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ mouse_opaque="true"
+ top="2"
+ visible="false"
+ width="20" />
+ <text
+ follows="left|right"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="5"
+ name="conversation_name"
+ parse_urls="false"
+ top="6"
+ use_ellipses="true"
+ width="180" />
+ <text
+ follows="right"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="5"
+ name="date_time"
+ parse_urls="false"
+ top="6"
+ use_ellipses="true"
+ width="110"/>
+ <button
+ name="delete_btn"
+ tool_tip="Remove this entry"
+ layout="topleft"
+ follows="top|right"
+ image_unselected="Conv_toolbar_close"
+ image_selected="Conv_toolbar_close"
+ top="5"
+ left_pad="0"
+ height="14"
+ width="14"
+ tab_stop="false"/>
+</panel> \ No newline at end of file
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
deleted file mode 100644
index ad10e53a4e..0000000000
--- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- border="false"
- follows="all"
- height="238"
- name="panel_im_control_panel"
- width="150">
- <layout_stack
- mouse_opaque="false"
- border_size="0"
- clip="false"
- follows="all"
- height="238"
- layout="topleft"
- 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">
- <avatar_list
- color="DkGray2"
- follows="all"
- height="100"
- ignore_online_status="true"
- layout="topleft"
- name="speakers_list"
- opaque="false"
- show_info_btn="true"
- 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">
- <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">
- <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"
- 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"
- 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_list_item.xml b/indra/newview/skins/default/xui/en/panel_group_list_item.xml
index 12735026fa..cfe3aeb7c9 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
@@ -56,6 +56,7 @@
left_pad="3"
right="-31"
name="info_btn"
+ tool_tip="More info"
tab_stop="false"
top_delta="-2"
width="16" />
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 6d5fb51e85..c8ce5cdebf 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -202,14 +202,14 @@ Maximum 200 per group daily
Drag and drop item here to attach it:
</text>
<icon
- height="72"
+ height="48"
image_name="DropTarget"
layout="topleft"
left_pad="10"
mouse_opaque="true"
name="drop_icon"
top_delta="-10"
- width="72" />
+ width="110" />
<button
follows="left|top"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml
index eea2606125..df91ad8b5e 100644
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -254,7 +254,7 @@ things in this group. There&apos;s a broad variety of Abilities.
column_padding="0"
draw_stripes="true"
height="200"
- follows="left|top"
+ follows="left|top|right"
layout="topleft"
left="0"
right="-1"
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
deleted file mode 100644
index 8fcd6ccbaf..0000000000
--- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
+++ /dev/null
@@ -1,166 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- border="false"
- height="300"
- name="panel_im_control_panel"
- width="150">
- <avatar_icon
- follows="left|top"
- height="105"
- left_delta="20"
- name="avatar_icon"
- top="-5"
- width="114"/>
- <layout_stack
- mouse_opaque="false"
- border_size="0"
- clip="false"
- follows="all"
- height="183"
- layout="topleft"
- left="5"
- name="button_stack"
- orientation="vertical"
- top_pad="5"
- width="145">
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="20"
- layout="topleft"
- left="2"
- min_height="20"
- width="140"
- name="view_profile_btn_panel"
- top="0" >
- <button
- follows="left|top|right"
- height="23"
- label="Profile"
- name="view_profile_btn"
- top="0"
- width="140" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="25"
- layout="topleft"
- min_height="25"
- width="140"
- name="add_friend_btn_panel">
- <button
- follows="left|top|right"
- height="23"
- label="Add Friend"
- name="add_friend_btn"
- top="5"
- width="140" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="25"
- layout="topleft"
- min_height="25"
- width="140"
- name="teleport_btn_panel">
- <button
- auto_resize="false"
- follows="left|top|right"
- height="23"
- label="Teleport"
- name="teleport_btn"
- tool_tip = "Offer to teleport this person"
- width="140" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="25"
- layout="topleft"
- min_height="25"
- width="140"
- name="share_btn_panel">
- <button
- auto_resize="true"
- follows="left|top|right"
- height="23"
- label="Share"
- name="share_btn"
- width="140" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="25"
- layout="topleft"
- min_height="25"
- width="140"
- name="pay_btn_panel">
- <button
- auto_resize="true"
- follows="left|top|right"
- height="23"
- label="Pay"
- name="pay_btn"
- width="140" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="25"
- layout="topleft"
- min_height="25"
- width="140"
- name="call_btn_panel">
- <button
- follows="left|top|right"
- height="23"
- label="Call"
- name="call_btn"
- width="140" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="25"
- layout="topleft"
- min_height="25"
- width="140"
- name="end_call_btn_panel"
- visible="false">
- <button
- follows="left|top|right"
- height="23"
- label="End Call"
- name="end_call_btn"
- width="140" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="25"
- layout="topleft"
- min_height="25"
- width="140"
- name="voice_ctrls_btn_panel"
- visible="false">
- <button
- follows="left|top|right"
- height="23"
- label="Voice Controls"
- name="voice_ctrls_btn"
- width="140" />
- </layout_panel>
- <layout_panel
- mouse_opaque="false"
- auto_resize="true"
- follows="top|left"
- height="0"
- layout="topleft"
- min_height="0"
- width="140"
- name="spacer"/>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml b/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml
index 413e22e444..433a3181cd 100644
--- a/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml
@@ -2,7 +2,7 @@
<inbox_inventory_panel
accepts_drag_and_drop="false"
name="inventory_inbox"
- start_folder="Received Items"
+ start_folder.type="inbox"
follows="all" layout="topleft"
top="0" left="0" height="165" width="308"
top_pad="0"
diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml
index 2a5933e3e9..67a09949ce 100644
--- a/indra/newview/skins/default/xui/en/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml
@@ -35,7 +35,9 @@
left="0"
mouse_opaque="true"
name="favorites_list"
- start_folder="Favorites"
+ scroll.hide_scrollbar="true"
+ folder_view.use_ellipses="true"
+ start_folder.name="Favorites"
width="307"/>
</accordion_tab>
<accordion_tab
@@ -51,7 +53,9 @@
left="0"
mouse_opaque="true"
name="landmarks_list"
- start_folder="Landmarks"
+ scroll.hide_scrollbar="true"
+ folder_view.use_ellipses="true"
+ start_folder.name="Landmarks"
width="307"/>
</accordion_tab>
<accordion_tab
@@ -67,7 +71,9 @@
left="0"
mouse_opaque="true"
name="my_inventory_list"
- start_folder="My Inventory"
+ scroll.hide_scrollbar="true"
+ folder_view.use_ellipses="true"
+ start_folder.name="My Inventory"
width="307"/>
</accordion_tab>
<accordion_tab
@@ -83,7 +89,9 @@
left="0"
mouse_opaque="true"
name="library_list"
- start_folder="LIBRARY"
+ scroll.hide_scrollbar="true"
+ folder_view.use_ellipses="true"
+ start_folder.name="LIBRARY"
width="313"/>
</accordion_tab>
</accordion>
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index 9c96143aa3..134ca75018 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -31,6 +31,7 @@
width="996"/>
<layout_stack
animate="false"
+ clip="false"
follows="left|bottom|right"
name="login_widgets"
layout="topleft"
@@ -68,12 +69,16 @@
width="150">
Username:
</text>
+ <!-- STEAM-14: Turn off commit_on_focus_lost so if user presses Enter
+ with focus in this combo_box, we can use commit action to initiate
+ login -->
<combo_box
allow_text_entry="true"
follows="left|bottom"
height="22"
left_delta="0"
max_chars="128"
+ commit_on_focus_lost="false"
combo_editor.prevalidate_callback="ascii"
tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine"
top_pad="0"
@@ -96,6 +101,9 @@
width="150">
Password:
</text>
+ <!-- STEAM-14: Turn off commit_on_focus_lost so if user presses Enter
+ with focus in this line_editor, we can use commit action to
+ initiate login -->
<line_editor
follows="left|bottom"
height="22"
@@ -103,6 +111,7 @@
name="password_edit"
is_password="true"
select_on_focus="true"
+ commit_on_focus_lost="false"
top_pad="0"
width="135" />
</layout_panel>
@@ -223,7 +232,7 @@
follows="right|bottom"
name="links"
width="210"
- min_width="210"
+ min_width="100"
height="80">
<text
follows="right|bottom"
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 cdf14572fe..e844a15118 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
@@ -30,7 +30,7 @@
(This page does not pass the specified whitelist)
</text>
<line_editor
- max_length="1024"
+ max_length_bytes="1024"
bottom_delta="-24"
enabled="true"
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/en/panel_navmesh_rebake.xml
deleted file mode 100644
index 90308a2ca9..0000000000
--- a/indra/newview/skins/default/xui/en/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- height="25"
- layout="topleft"
- name="panel_navmesh_rebake"
- mouse_opaque="false"
- visible="true"
- width="133">
- <button
- follows="left|bottom"
- height="19"
- label="Rebake region"
- layout="topleft"
- left="10"
- name="navmesh_btn"
- tool_tip="Click to rebake the region&apos;s navmesh."
- top="2"
- visible="false"
- enabled="true"
- width="120" />
- <button
- follows="left|bottom"
- height="19"
- label="Requesting rebake"
- layout="topleft"
- left="10"
- name="navmesh_btn_sending"
- tool_tip="Sending rebake request to the server."
- top="2"
- visible="false"
- enabled="false"
- width="120" />
- <button
- follows="left|bottom"
- height="19"
- label="Region is rebaking"
- layout="topleft"
- left="10"
- name="navmesh_btn_baking"
- tool_tip="Region is being rebaked. When completed, this button will disappear."
- top="2"
- visible="false"
- enabled="false"
- width="120" />
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat.xml
index d683116eb8..4de56b424e 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat.xml
@@ -1,20 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel
follows="all"
- height="300"
+ top="0"
+ bottom_delta="10"
help_topic="nearby_chat"
layout="topleft"
name="nearby_chat"
- width="320">
+ width="242"
+ height="169">
<layout_stack
follows="all"
- height="295"
+ height="164"
layout="topleft"
left="0"
name="stack"
top="5"
orientation="vertical"
- width="320">
+ width="242">
<layout_panel
auto_resize="false"
height="26"
@@ -23,7 +25,7 @@
name="translate_chat_checkbox_lp"
top_delta="0"
visible="true"
- width="313">
+ width="230">
<check_box
top="10"
control_name="TranslateChat"
@@ -33,15 +35,15 @@
layout="topleft"
left="5"
name="translate_chat_checkbox"
- width="300" />
+ width="230" />
</layout_panel>
<layout_panel
auto_resize="true"
- height="277"
+ height="138"
left_delta="0"
layout="topleft"
name="chat_history_lp"
- width="318">
+ width="242">
<chat_history
bg_readonly_color="ChatHistoryBgColor"
bg_writeable_color="ChatHistoryBgColor"
@@ -49,7 +51,7 @@
layout="topleft"
left="5"
left_widget_pad="0"
- height="272"
+ height="138"
name="chat_history"
parse_highlights="true"
parse_urls="true"
@@ -57,7 +59,7 @@
text_color="ChatHistoryTextColor"
text_readonly_color="ChatHistoryTextColor"
top="0"
- width="313" />
+ width="237" />
</layout_panel>
</layout_stack>
</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 6bc9c48729..19143cef89 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
@@ -5,7 +5,7 @@
height="25"
layout="topleft"
left="0"
- name="chat_bar"
+ name="nearby_chat"
top="21"
width="308">
<line_editor
diff --git a/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml
index a3d39e55af..c80e5b168a 100644
--- a/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml
@@ -1,7 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<outbox_inventory_panel
+<inventory_panel
name="inventory_outbox"
- start_folder="Outbox"
+ start_folder.name="Outbox"
+ show_empty_message="false"
+ show_load_status="false"
+ start_folder.type="outbox"
follows="all" layout="topleft"
top="0" left="0" height="165" width="308"
top_pad="0"
@@ -12,6 +15,18 @@
bevel_style="none"
show_item_link_overlays="true"
tool_tip="Drag and drop items here to prepare them for sale on your storefront"
- >
- <scroll reserve_scroll_corner="false" />
-</outbox_inventory_panel>
+ scroll.reserve_scroll_corner="false">
+ <folder folder_arrow_image="Folder_Arrow"
+ folder_indentation="8"
+ item_height="20"
+ item_top_pad="4"
+ selection_image="Rounded_Square"
+ left_pad="5"
+ icon_pad="2"
+ icon_width="16"
+ text_pad="1"
+ text_pad_right="4"
+ arrow_size="12"
+ max_folder_item_overlap="2"/>
+ <item allow_open="false"/>
+</inventory_panel>
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 98c7c49ff4..ed274d0233 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -38,12 +38,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
name="no_filtered_friends_msg">
Didn't find what you're looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search].
</string>
- <string
- name="people_filter_label"
- value="Filter People" />
- <string
- name="groups_filter_label"
- value="Filter Groups" />
<!--
*WORKAROUND: for group_list.no_items_msg & group_list.no_filtered_items_msg attributes.
They are not defined as translatable in VLT. See EXT-5931
@@ -60,21 +54,9 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
<string
name="AltMiniMapToolTipMsg"
value="[REGION](Double-click to teleport, shift-drag to pan)"/>
- <filter_editor
- follows="left|top|right"
- height="23"
- layout="topleft"
- left="10"
- label="Filter"
- max_length_chars="300"
- name="filter_input"
- text_color="Black"
- text_pad_left="10"
- top="3"
- width="303" />
<tab_container
+ bottom="-10"
follows="all"
- height="383"
layout="topleft"
left="3"
name="tabs"
@@ -82,31 +64,120 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
tab_min_width="70"
tab_height="30"
tab_position="top"
- top_pad="10"
+ top="0"
halign="center"
- width="319">
- <panel
+ right="-5">
+
+<!-- ================================= NEARBY tab =========================== -->
+
+ <panel
background_opaque="true"
background_visible="true"
bg_alpha_color="DkGray"
bg_opaque_color="DkGray"
+ bottom="-1"
follows="all"
- height="383"
label="NEARBY"
layout="topleft"
left="0"
help_topic="people_nearby_tab"
name="nearby_panel"
- top="0"
- width="313">
+ right="-1"
+ top="0">
+ <panel
+ follows="left|top|right"
+ height="27"
+ label="bottom_panel"
+ layout="topleft"
+ left="0"
+ name="nearby_buttons_panel"
+ right="-1"
+ top="0">
+ <filter_editor
+ follows="left|top|right"
+ height="23"
+ layout="topleft"
+ left="6"
+ label="Filter People"
+ max_length_chars="300"
+ name="nearby_filter_input"
+ text_color="Black"
+ text_pad_left="10"
+ top="4"
+ width="178" />
+ <button
+ commit_callback.function="People.Gear"
+ follows="right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="7"
+ name="gear_btn"
+ tool_tip="Actions on selected person"
+ top="3"
+ width="31" />
+ <menu_button
+ follows="right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_sort"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="2"
+ menu_filename="menu_people_nearby_view.xml"
+ menu_position="bottomleft"
+ name="nearby_view_btn"
+ tool_tip="View/sort options"
+ top_delta="0"
+ width="31" />
+ <button
+ follows="right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="AddItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="2"
+ name="add_friend_btn"
+ tool_tip="Offer friendship to a resident"
+ top_delta="0"
+ width="31">
+ <commit_callback
+ function="People.AddFriend" />
+ </button>
+ <dnd_button
+ enabled="false"
+ follows="right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="TrashItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ left_pad="2"
+ layout="topleft"
+ name="nearby_del_btn"
+ tool_tip="Remove selected person as a friend"
+ top_delta="0"
+ width="31">
+ <commit_callback
+ function="People.DelFriend" />
+ </dnd_button>
+ </panel>
<layout_stack
clip="false"
follows="all"
- height="355"
+ height="410"
layout="topleft"
+ left="0"
mouse_opaque="false"
orientation="vertical"
- width="313">
+ right="-1"
+ top_pad="0">
<layout_panel
height="142"
layout="topleft"
@@ -123,16 +194,16 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
left="3"
mouse_opaque="false"
name="Net Map"
- top="4"
- width="305"/>
+ right="-1"
+ top="4" />
</layout_panel>
<layout_panel
height="213"
layout="topleft"
min_dim="100"
mouse_opaque="false"
- user_resize="true"
- width="313">
+ right="-1"
+ user_resize="true">
<avatar_list
allow_select="true"
follows="all"
@@ -143,84 +214,122 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
keep_one_selected="false"
multi_select="true"
name="avatar_list"
- top="2"
- width="306" />
+ right="-1"
+ top="2" />
</layout_panel>
</layout_stack>
- <panel
- background_visible="true"
- follows="left|right|bottom"
- height="27"
- label="bottom_panel"
- layout="topleft"
- left="3"
- name="bottom_panel"
- top_pad="0"
- width="313">
- <menu_button
- follows="bottom|left"
- height="25"
- image_hover_unselected="Toolbar_Left_Over"
- image_overlay="OptionsMenu_Off"
- image_selected="Toolbar_Left_Selected"
- image_unselected="Toolbar_Left_Off"
- layout="topleft"
- left="0"
- name="nearby_view_sort_btn"
- tool_tip="Options"
- top="1"
- width="31" />
- <button
- follows="bottom|left"
- height="25"
- image_hover_unselected="Toolbar_Middle_Over"
- image_overlay="AddItem_Off"
- image_selected="Toolbar_Middle_Selected"
- image_unselected="Toolbar_Middle_Off"
- layout="topleft"
- left_pad="1"
- name="add_friend_btn"
- tool_tip="Add selected Resident to your friends List"
- width="31">
- <commit_callback
- function="People.addFriend" />
- </button>
- <icon
- follows="bottom|left|right"
- height="25"
- image_name="Toolbar_Right_Off"
- layout="topleft"
- left_pad="1"
- name="dummy_icon"
- width="243"
- />
- </panel>
</panel>
+
+<!-- ================================= FRIENDS tab ========================== -->
+
<panel
background_opaque="true"
background_visible="true"
bg_alpha_color="DkGray"
bg_opaque_color="DkGray"
+ bottom="-1"
follows="all"
- height="383"
- label="MY FRIENDS"
+ label="FRIENDS"
layout="topleft"
left="0"
help_topic="people_friends_tab"
name="friends_panel"
- top="0"
- width="313">
+ right="-1"
+ top="0">
+ <panel
+ follows="left|top|right"
+ height="27"
+ label="bottom_panel"
+ layout="topleft"
+ left="0"
+ name="friends_buttons_panel"
+ right="-1"
+ top="0">
+ <filter_editor
+ follows="left|top|right"
+ height="23"
+ layout="topleft"
+ left="6"
+ label="Filter People"
+ max_length_chars="300"
+ name="friends_filter_input"
+ text_color="Black"
+ text_pad_left="10"
+ top="4"
+ width="177" />
+ <button
+ commit_callback.function="People.Gear"
+ follows="right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="8"
+ name="gear_btn"
+ tool_tip="Actions on selected person"
+ top="3"
+ width="31" />
+ <menu_button
+ follows="right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_sort"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="2"
+ menu_filename="menu_people_friends_view.xml"
+ menu_position="bottomleft"
+ name="friends_view_btn"
+ tool_tip="View/sort options"
+ top_delta="0"
+ width="31" />
+ <button
+ follows="right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="AddItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="2"
+ name="friends_add_btn"
+ tool_tip="Offer friendship to a resident"
+ top_delta="0"
+ width="31">
+ <commit_callback
+ function="People.AddFriendWizard" />
+ </button>
+ <dnd_button
+ follows="right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="TrashItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ left_pad="2"
+ layout="topleft"
+ name="friends_del_btn"
+ tool_tip="Remove selected person as a friend"
+ top_delta="0"
+ width="31">
+ <commit_callback
+ function="People.DelFriend" />
+ </dnd_button>
+ </panel>
<accordion
background_visible="true"
bg_alpha_color="DkGray2"
bg_opaque_color="DkGray2"
follows="all"
- height="356"
+ height="408"
layout="topleft"
left="3"
name="friends_accordion"
- top="0"
- width="307">
+ right="-2"
+ top_pad="2">
<accordion_tab
layout="topleft"
height="172"
@@ -257,247 +366,145 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
width="307" />
</accordion_tab>
</accordion>
- <panel
- background_visible="true"
- follows="left|right|bottom"
- height="27"
- label="bottom_panel"
- layout="topleft"
- left="3"
- name="bottom_panel"
- top_pad="0"
- width="313">
-
- <layout_stack
- animate="false"
- border_size="0"
- follows="left|right|bottom"
- height="25"
- layout="topleft"
- orientation="horizontal"
- top_pad="1"
- left="0"
- name="bottom_panel"
- width="308">
- <layout_panel
- auto_resize="false"
- height="25"
- layout="topleft"
- name="options_gear_btn_panel"
- width="32">
- <menu_button
- follows="bottom|left"
- tool_tip="Show additional options"
- height="25"
- image_hover_unselected="Toolbar_Left_Over"
- image_overlay="OptionsMenu_Off"
- image_selected="Toolbar_Left_Selected"
- image_unselected="Toolbar_Left_Off"
- layout="topleft"
- left="0"
- name="friends_viewsort_btn"
- top="0"
- width="31" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- height="25"
- layout="topleft"
- name="add_btn_panel"
- width="32">
- <button
- follows="bottom|left"
- height="25"
- image_hover_unselected="Toolbar_Middle_Over"
- image_overlay="AddItem_Off"
- image_selected="Toolbar_Middle_Selected"
- image_unselected="Toolbar_Middle_Off"
- layout="topleft"
- left="0"
- name="add_btn"
- tool_tip="Offer friendship to a Resident"
- top="0"
- width="31" />
- </layout_panel>
- <layout_panel
- auto_resize="true"
- height="25"
- layout="topleft"
- name="dummy_panel"
- width="210">
- <icon
- follows="bottom|left|right"
- height="25"
- image_name="Toolbar_Middle_Off"
- layout="topleft"
- left="0"
- top="0"
- name="dummy_icon"
- width="210" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- height="25"
- layout="topleft"
- name="trash_btn_panel"
- width="31">
- <dnd_button
- follows="bottom|left"
- height="25"
- image_hover_unselected="Toolbar_Right_Over"
- image_overlay="TrashItem_Off"
- image_selected="Toolbar_Right_Selected"
- image_unselected="Toolbar_Right_Off"
- left="0"
- layout="topleft"
- name="del_btn"
- tool_tip="Remove selected person from your Friends list"
- top="0"
- width="31"/>
- </layout_panel>
- </layout_stack><!--
-
- <button
- follows="bottom|left"
- tool_tip="Options"
- height="25"
- image_hover_unselected="Toolbar_Left_Over"
- image_overlay="OptionsMenu_Off"
- image_selected="Toolbar_Left_Selected"
- image_unselected="Toolbar_Left_Off"
- layout="topleft"
- left="0"
- name="friends_viewsort_btn"
- top="1"
- width="31" />
- <button
- follows="bottom|left"
- height="25"
- image_hover_unselected="Toolbar_Middle_Over"
- image_overlay="AddItem_Off"
- image_selected="Toolbar_Middle_Selected"
- image_unselected="Toolbar_Middle_Off"
- layout="topleft"
- left_pad="1"
- name="add_btn"
- tool_tip="Offer friendship to a Resident"
- width="31" />
- <icon
- follows="bottom|left|right"
- height="25"
- image_name="Toolbar_Middle_Off"
- layout="topleft"
- left_pad="1"
- name="dummy_icon"
- width="209"
- />
- <button
- follows="bottom|left"
- height="25"
- image_hover_unselected="Toolbar_Right_Over"
- image_overlay="TrashItem_Off"
- image_selected="Toolbar_Right_Selected"
- image_unselected="Toolbar_Right_Off"
- layout="topleft"
- left_pad="1"
- name="del_btn"
- tool_tip="Remove selected person from your Friends list"
- width="31" />
- --></panel>
<text
follows="all"
height="450"
left="13"
name="no_friends_help_text"
- top="10"
- width="293"
+ right="-13"
+ top="37"
wrap="true" />
</panel>
+
+<!-- ================================= GROUPS tab =========================== -->
+
<panel
background_opaque="true"
background_visible="true"
bg_alpha_color="DkGray"
bg_opaque_color="DkGray"
+ bottom="-1"
follows="all"
- height="383"
- label="MY GROUPS"
+ label="GROUPS"
layout="topleft"
left="0"
help_topic="people_groups_tab"
name="groups_panel"
- top="0"
- width="313">
+ right="-1"
+ top="0">
<!--
*NOTE: no_groups_msg & group_list attributes are not defined as translatable in VLT. See EXT-5931
Values are set from appropriate strings at the top of file via LLPeoplePanel::postBuild()
-->
- <group_list
- allow_select="true"
- follows="all"
- height="356"
- layout="topleft"
- left="3"
- name="group_list"
- top="0"
- width="307" />
<panel
- background_visible="true"
- follows="left|right|bottom"
+ follows="left|top|right"
height="27"
label="bottom_panel"
layout="topleft"
left="0"
- name="bottom_panel"
- top_pad="0"
- width="313">
- <menu_button
- follows="bottom|left"
- tool_tip="Options"
- height="25"
- image_hover_unselected="Toolbar_Left_Over"
- image_overlay="OptionsMenu_Off"
- image_selected="Toolbar_Left_Selected"
- image_unselected="Toolbar_Left_Off"
- layout="topleft"
- left="3"
- name="groups_viewsort_btn"
- top="1"
- width="31" />
- <button
- follows="bottom|left"
+ name="groups_buttons_panel"
+ right="-1"
+ top="0">
+ <filter_editor
+ follows="left|top|right"
+ height="23"
+ layout="topleft"
+ left="6"
+ label="Filter Groups"
+ max_length_chars="300"
+ name="groups_filter_input"
+ text_color="Black"
+ text_pad_left="10"
+ top="4"
+ width="177" />
+ <menu_button
+ follows="right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="8"
+ name="groups_gear_btn"
+ tool_tip="Actions on selected group"
+ top="3"
+ width="31" />
+ <menu_button
+ follows="right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_sort"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="2"
+ menu_filename="menu_people_groups_view.xml"
+ menu_position="bottomleft"
+ name="groups_view_btn"
+ tool_tip="View/sort options"
+ top_delta="0"
+ width="31" />
+ <menu_button
+ follows="right"
height="25"
image_hover_unselected="Toolbar_Middle_Over"
image_overlay="AddItem_Off"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
layout="topleft"
- left_pad="1"
+ left_pad="2"
+ menu_filename="menu_group_plus.xml"
+ menu_position="bottomleft"
name="plus_btn"
tool_tip="Join group/Create new group"
- width="31" />
- <button
- follows="bottom|left"
+ top_delta="0"
+ width="31">
+ <validate_callback
+ function="People.Group.Plus.Validate" />
+ </menu_button>
+ <dnd_button
+ follows="right"
height="25"
image_hover_unselected="Toolbar_Middle_Over"
- image_overlay="Activate_Checkmark"
+ image_overlay="TrashItem_Off"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
+ left_pad="2"
layout="topleft"
- left_pad="1"
- name="activate_btn"
- tool_tip="Activate selected group"
- width="31" />
- <icon
- follows="bottom|left|right"
- height="25"
- image_name="Toolbar_Right_Off"
- layout="topleft"
- left_pad="1"
- name="dummy_icon"
- width="212"
- />
+ name="minus_btn"
+ tool_tip="Leave selected group"
+ top_delta="0"
+ width="31">
+ <commit_callback
+ function="People.Group.Minus" />
+ </dnd_button>
</panel>
+ <text
+ type="string"
+ length="1"
+ follows="all"
+ height="14"
+ layout="topleft"
+ right="-10"
+ top_pad="4"
+ left="3"
+ name="groupcount">
+ You belong to [COUNT] groups, and can join [REMAINING] more.
+ </text>
+ <group_list
+ allow_select="true"
+ follows="all"
+ height="388"
+ layout="topleft"
+ left="3"
+ name="group_list"
+ right="-2"
+ top_pad="4" />
</panel>
+
+<!-- ================================= RECENT tab =========================== -->
+
<panel
background_opaque="true"
background_visible="true"
@@ -510,265 +517,133 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
left="0"
help_topic="people_recent_tab"
name="recent_panel"
- top="0"
- width="313">
- <avatar_list
- allow_select="true"
- follows="all"
- height="356"
- layout="topleft"
- left="3"
- multi_select="true"
- name="avatar_list"
- show_last_interaction_time="true"
- top="0"
- width="307" />
+ right="-1"
+ top="0">
<panel
- background_visible="true"
- follows="left|right|bottom"
+ follows="left|top|right"
height="27"
label="bottom_panel"
layout="topleft"
- left="3"
- name="bottom_panel"
- top_pad="0"
- width="313">
- <menu_button
- follows="bottom|left"
- tool_tip="Options"
- height="25"
- image_hover_unselected="Toolbar_Left_Over"
- image_overlay="OptionsMenu_Off"
- image_selected="Toolbar_Left_Selected"
- image_unselected="Toolbar_Left_Off"
- layout="topleft"
- name="recent_viewsort_btn"
- top="1"
- width="31" />
- <button
- follows="bottom|left"
+ left="0"
+ name="recent_buttons_panel"
+ right="-1"
+ top="0">
+ <filter_editor
+ follows="left|top|right"
+ height="23"
+ layout="topleft"
+ left="6"
+ label="Filter People"
+ max_length_chars="300"
+ name="recent_filter_input"
+ text_color="Black"
+ text_pad_left="10"
+ top="4"
+ width="177" />
+ <button
+ commit_callback.function="People.Gear"
+ follows="right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="8"
+ name="gear_btn"
+ tool_tip="Actions on selected person"
+ top="3"
+ width="31" />
+ <menu_button
+ follows="right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_sort"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="2"
+ menu_filename="menu_people_recent_view.xml"
+ menu_position="bottomleft"
+ name="recent_view_btn"
+ tool_tip="View/sort options"
+ top_delta="0"
+ width="31" />
+ <button
+ follows="right"
height="25"
image_hover_unselected="Toolbar_Middle_Over"
image_overlay="AddItem_Off"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
layout="topleft"
- left_pad="1"
+ left_pad="2"
name="add_friend_btn"
- tool_tip="Add selected Resident to your friends List"
+ tool_tip="Offer friendship to a resident"
+ top_delta="0"
width="31">
- <commit_callback
- function="People.addFriend" />
- </button>
- <icon
- follows="bottom|left|right"
- height="25"
- image_name="Toolbar_Right_Off"
- layout="topleft"
- left_pad="1"
- name="dummy_icon"
- width="244"
- />
+ <commit_callback
+ function="People.AddFriend" />
+ </button>
+ <dnd_button
+ enabled="false"
+ follows="right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="TrashItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ left_pad="2"
+ layout="topleft"
+ name="recent_del_btn"
+ tool_tip="Remove selected person as a friend"
+ top_delta="0"
+ width="31">
+ <commit_callback
+ function="People.DelFriend" />
+ </dnd_button>
</panel>
+ <avatar_list
+ allow_select="true"
+ follows="all"
+ height="351"
+ layout="topleft"
+ left="3"
+ multi_select="true"
+ name="avatar_list"
+ show_last_interaction_time="true"
+ right="-2"
+ top_pad="4" />
</panel>
- </tab_container>
- <panel
- follows="bottom|left|right"
- height="23"
- layout="topleft"
- left="8"
- top_pad="4"
- name="button_bar"
- width="313">
-<!--********************************Profile; IM; Call, Share, Teleport********************************-->
- <layout_stack
- follows="bottom|left|right"
- height="23"
- layout="topleft"
- name="bottom_bar_ls"
- left="0"
- orientation="horizontal"
- top_pad="0"
- width="313">
+<!-- ================================= BLOCKED tab ========================== -->
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left="0"
- name="view_profile_btn_lp"
- auto_resize="true"
- width="68">
- <button
- follows="bottom|left|right"
- height="23"
- label="Profile"
- layout="topleft"
- left="1"
- name="view_profile_btn"
- tool_tip="Show picture, groups, and other Residents information"
- top="0"
- width="67" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="im_btn_lp"
- auto_resize="true"
- width="41">
- <button
- follows="bottom|left|right"
- left="1"
- height="23"
- label="IM"
- layout="topleft"
- name="im_btn"
- tool_tip="Open instant message session"
- top="0"
- width="40" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="call_btn_lp"
- auto_resize="true"
- width="52">
- <button
- follows="bottom|left|right"
- left="1"
- height="23"
- label="Call"
- layout="topleft"
- name="call_btn"
- tool_tip="Call this Resident"
- top="0"
- width="51" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="share_btn_lp"
- auto_resize="true"
- width="66">
- <button
- follows="bottom|left|right"
- left="1"
- height="23"
- label="Share"
- layout="topleft"
- name="share_btn"
- tool_tip="Share an inventory item"
- top="0"
- width="65" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="teleport_btn_lp"
- auto_resize="true"
- width="77">
- <button
- follows="bottom|left|right"
- left="1"
- height="23"
- label="Teleport"
- layout="topleft"
- name="teleport_btn"
- tool_tip="Offer teleport"
- top="0"
- width="76" />
- </layout_panel>
- </layout_stack>
-
-<!--********************************Group Profile; Group Chat; Group Call buttons************************-->
- <layout_stack
- follows="bottom|left|right"
- height="23"
- layout="topleft"
- mouse_opaque="false"
- name="bottom_bar_ls1"
- left="0"
- orientation="horizontal"
- top="0"
- width="313">
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left="0"
- mouse_opaque="false"
- name="group_info_btn_lp"
- auto_resize="true"
- width="108">
- <button
- follows="bottom|left|right"
- left="1"
- height="23"
- label="Group Profile"
- layout="topleft"
- mouse_opaque="false"
- name="group_info_btn"
- tool_tip="Show group information"
- top="0"
- width="107" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- mouse_opaque="false"
- name="chat_btn_lp"
- auto_resize="true"
- width="101">
- <button
- follows="bottom|left|right"
- left="1"
- height="23"
- label="Group Chat"
- layout="topleft"
- mouse_opaque="false"
- name="chat_btn"
- tool_tip="Open chat session"
- top="0"
- width="100" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- mouse_opaque="false"
- name="group_call_btn_lp"
- auto_resize="true"
- width="96">
- <button
- follows="bottom|left|right"
- left="1"
- height="23"
- label="Group Call"
- layout="topleft"
- mouse_opaque="false"
- name="group_call_btn"
- tool_tip="Call this group"
- top="0"
- width="95" />
- </layout_panel>
- </layout_stack>
- </panel>
+ <panel
+ background_opaque="true"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ bg_opaque_color="DkGray"
+ follows="all"
+ height="383"
+ label="BLOCKED"
+ layout="topleft"
+ left="0"
+ help_topic="people_blocked_tab"
+ name="blocked_panel"
+ right="-1"
+ top="0">
+ <panel
+ class="panel_block_list_sidetray"
+ height="383"
+ name="panel_block_list_sidetray"
+ filename="panel_block_list_sidetray.xml"
+ follows="all"
+ label="Blocked Residents &amp; Objects"
+ layout="topleft"
+ left="0"
+ font="SansSerifBold"
+ top="0"
+ right="-1" />
+ </panel>
+ </tab_container>
</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 2cc9d9c1b0..50fd57494f 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -138,7 +138,7 @@
initial_value="1"
layout="topleft"
left_pad="0"
- max_val="1.4"
+ max_val="1.5"
min_val="0.75"
name="ui_scale_slider"
top_pad="-14"
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 27193a984f..bd096ebb88 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -1,242 +1,493 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- border="true"
- follows="left|top|right|bottom"
- height="408"
- label="Text Chat"
- layout="topleft"
- left="102"
- name="chat"
- top="1"
- width="517">
- <text
- follows="left|top"
- layout="topleft"
- left="30"
- height="12"
- name="font_size"
- width="120"
- top="10">
- Font size:
- </text>
- <radio_group
- height="30"
- layout="topleft"
- left="40"
- control_name="ChatFontSize"
- name="chat_font_size"
- 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
- height="16"
- label="Medium"
- layout="topleft"
- left_delta="145"
- name="radio2"
- value="1"
- top_delta="0"
- width="125" />
- <radio_item
- height="16"
- label="Large"
- layout="topleft"
- left_delta="170"
- name="radio3"
- value="2"
- top_delta="0"
- width="125" />
- </radio_group>
-
+ border="true"
+ has_border="true"
+ height="408"
+ label="Text Chat"
+ layout="topleft"
+ left="102"
+ name="chat"
+ top="1"
+ width="517">
+
+ <panel
+ border="false"
+ height="60"
+ layout="topleft"
+ top="10"
+ left="13"
+ width="517">
+
<check_box
- control_name="PlayTypingAnim"
- height="16"
- initial_value="true"
- label="Play typing animation when chatting"
- layout="topleft"
- left="30"
- name="play_typing_animation"
- top_pad="10"
- width="400" />
+ control_name="PlayTypingAnim"
+ height="16"
+ initial_value="true"
+ label="Play typing animation when chatting"
+ layout="topleft"
+ top="0"
+ name="play_typing_animation"
+ width="330">
+ </check_box>
+
<check_box
- enabled="false"
- height="16"
- label="Email me IMs when I'm offline"
- layout="topleft"
- left_delta="0"
- name="send_im_to_email"
- top_pad="5"
- width="400" />
+ enabled="false"
+ height="16"
+ label="Email me IMs when I'm offline"
+ layout="topleft"
+ name="send_im_to_email"
+ top_pad="6"
+ width="330">
+ </check_box>
+
<check_box
- enabled="false"
- height="16"
- label="Enable plain text IM and chat history"
- layout="topleft"
- left_delta="0"
- name="plain_text_chat_history"
- top_pad="5"
- width="400" />
+ control_name="VoiceCallsFriendsOnly"
+ height="16"
+ label="Only friends and groups can call or IM me"
+ layout="topleft"
+ name="voice_call_friends_only_check"
+ top_pad="6"
+ width="350">
+ </check_box>
+
+ <text
+ layout="topleft"
+ left="345"
+ height="12"
+ name="font_size"
+ width="120"
+ top="0">
+ Font size:
+ </text>
+
+ <combo_box
+ control_name="ChatFontSize"
+ height="23"
+ layout="topleft"
+ left="341"
+ name="chat_font_size"
+ top_pad="5"
+ width="100">
+ <item
+ label="Small"
+ name="Small"
+ value="0"/>
+ <item
+ label="Medium"
+ name="Medium"
+ value="1"/>
+ <item
+ label="Large"
+ name="Large"
+ value="2"/>
+ </combo_box>
+
<check_box
- control_name="UseChatBubbles"
- follows="left|top"
- height="16"
- label="Bubble Chat"
- layout="topleft"
- left_delta="0"
- top_pad="5"
- name="bubble_text_chat"
- width="150" />
+ control_name="UseChatBubbles"
+ height="16"
+ label="Bubble Chat"
+ layout="topleft"
+ top_pad="4"
+ name="bubble_text_chat"
+ width="330">
+ </check_box>
+
+ </panel>
+
+ <panel
+ border="false"
+ height="165"
+ layout="topleft"
+ left="13"
+ width="517">
+
<text
- name="show_ims_in_label"
- follows="left|top"
- layout="topleft"
- left="30"
- height="20"
- width="170"
- top_pad="15">
- Show IMs in:
+ layout="topleft"
+ height="12"
+ name="notifications"
+ left="0"
+ width="120">
+ Notifications
</text>
<text
- name="requires_restart_label"
- follows="left|top"
- layout="topleft"
- top_delta="0"
- left="170"
- height="20"
- width="130"
- text_color="White_25">
- (requires restart)
- </text>
- <radio_group
- follows="left|top"
- height="30"
- 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="150">
- <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"
+ height="12"
+ name="friend_ims"
+ width="145"
+ left="0"
+ top_pad="13">
+ Friend IMs:
+ </text>
+ <combo_box
+ control_name="NotificationFriendIMOptions"
+ height="23"
+ layout="topleft"
+ left_pad="5"
+ top_delta="-6"
+ name="FriendIMOptions"
+ width="223">
+ <item
+ label="Open Conversations window"
+ name="OpenConversationsWindow"
+ value="openconversations"/>
+ <item
+ label="Pop up the message"
+ name="PopUpMessage"
+ value="toast"/>
+ <item
+ label="Flash toolbar button"
+ name="FlashToolbarButton"
+ value="flash"/>
+ <item
+ label="None"
+ name="None"
+ value="none"/>
+ </combo_box>
+ <text
+ layout="topleft"
+ height="12"
+ name="non_friend_ims"
+ width="145"
+ left="0"
+ top_pad="9">
+ Non-friend IMs:
+ </text>
+ <combo_box
+ control_name="NotificationNonFriendIMOptions"
+ height="23"
+ layout="topleft"
+ left_pad="5"
+ top_delta="-6"
+ name="NonFriendIMOptions"
+ width="223">
+ <item
+ label="Open Conversations window"
+ name="OpenConversationsWindow"
+ value="openconversations"/>
+ <item
+ label="Pop up the message"
+ name="PopUpMessage"
+ value="toast"/>
+ <item
+ label="Flash toolbar button"
+ name="FlashToolbarButton"
+ value="flash"/>
+ <item
+ label="None"
+ name="None"
+ value="none"/>
+ </combo_box>
+ <text
+ layout="topleft"
+ left="0"
+ height="13"
+ name="conference_ims"
+ width="145"
+ top_pad="9">
+ Conference IMs:
+ </text>
+ <combo_box
+ control_name="NotificationConferenceIMOptions"
+ height="23"
+ layout="topleft"
+ left_pad="5"
+ top_delta="-6"
+ name="ConferenceIMOptions"
+ width="223">
+ <item
+ label="Open Conversations window"
+ name="OpenConversationsWindow"
+ value="openconversations"/>
+ <item
+ label="Pop up the message"
+ name="PopUpMessage"
+ value="toast"/>
+ <item
+ label="Flash toolbar button"
+ name="FlashToolbarButton"
+ value="flash"/>
+ <item
+ label="None"
+ name="None"
+ value="none"/>
+ </combo_box>
+ <text
+ layout="topleft"
+ left="0"
+ height="13"
+ name="group_chat"
+ width="145"
+ top_pad="9">
+ Group chat:
+ </text>
+ <combo_box
+ control_name="NotificationGroupChatOptions"
+ height="23"
+ layout="topleft"
+ left_pad="5"
+ top_delta="-6"
+ name="GroupChatOptions"
+ width="223">
+ <item
+ label="Open Conversations window"
+ name="OpenConversationsWindow"
+ value="openconversations"/>
+ <item
+ label="Pop up the message"
+ name="PopUpMessage"
+ value="toast"/>
+ <item
+ label="Flash toolbar button"
+ name="FlashToolbarButton"
+ value="flash"/>
+ <item
+ label="None"
+ name="None"
+ value="none"/>
+ </combo_box>
+ <text
+ layout="topleft"
+ left="0"
+ height="12"
+ name="nearby_chat"
+ width="145"
+ top_pad="9">
+ Nearby chat:
+ </text>
+ <combo_box
+ control_name="NotificationNearbyChatOptions"
+ height="23"
+ layout="topleft"
+ left_pad="5"
+ top_delta="-6"
+ name="NearbyChatOptions"
+ width="223">
+ <item
+ label="Open Conversations window"
+ name="OpenConversationsWindow"
+ value="openconversations"/>
+ <item
+ label="Pop up the message"
+ name="PopUpMessage"
+ value="toast"/>
+ <item
+ label="Flash toolbar button"
+ name="FlashToolBarButton"
+ value="flash"/>
+ <item
+ label="None"
+ name="None"
+ value="none"/>
+ </combo_box>
+ <text
+ layout="topleft"
+ left="0"
+ height="13"
+ name="notifications_alert"
+ width="500"
+ top_pad="9"
+ visible="true"
+ text_color="DrYellow">
+ To temporarily stop all notifications, use Communicate &gt; Do Not Disturb.
+ </text>
+
+ </panel>
+
+ <panel
+ border="false"
+ height="50"
layout="topleft"
- left_delta="0"
- name="radio2"
- value="1"
- top_pad="5"
- width="150" />
- </radio_group>
+ left="13"
+ top_pad="10"
+ width="517">
+
<text
- name="disable_toast_label"
- follows="left|top"
- layout="topleft"
- top_pad="20"
- left="30"
- height="10"
- width="400">
- Enable incoming chat popups:
- </text>
+ layout="topleft"
+ left="0"
+ name="play_sound"
+ width="100"
+ top_pad="8"
+ visible="true">
+ Play sound:
+ </text>
+ <check_box
+ control_name="PlaySoundNewConversation"
+ height="16"
+ label="New conversation"
+ layout="topleft"
+ left_pad="15"
+ top_pad="-10"
+ name="new_conversation"
+ width="150" />
<check_box
- control_name="EnableGroupChatPopups"
- name="EnableGroupChatPopups"
- label="Group Chats"
- layout="topleft"
- top_pad="5"
- left_delta="10"
- height="20"
- tool_tip="Check to see popups when a Group Chat message arrives"
- width="400" />
+ control_name="PlaySoundIncomingVoiceCall"
+ height="16"
+ label="Incoming voice call"
+ layout="topleft"
+ top_pad="6"
+ name="incoming_voice_call"
+ width="150" />
<check_box
- control_name="EnableIMChatPopups"
- name="EnableIMChatPopups"
- label="IM Chats"
- layout="topleft"
- top_pad="5"
- height="16"
- tool_tip="Check to see popups when an instant message arrives"
- width="400" />
- <spinner
- control_name="NearbyToastLifeTime"
- decimal_digits="0"
- follows="left|top"
- height="23"
- increment="1"
- initial_value="23"
- label="Nearby chat toasts life time:"
- label_width="285"
- layout="topleft"
- left="45"
- max_val="60"
- min_val="1"
- name="nearby_toasts_lifetime"
- top_pad="10"
- width="325" />
- <spinner
- control_name="NearbyToastFadingTime"
- decimal_digits="0"
- follows="left|top"
- height="23"
- increment="1"
- initial_value="3"
- label="Nearby chat toasts fading time:"
- label_width="285"
- layout="topleft"
- left_delta="0"
- max_val="60"
- min_val="0"
- name="nearby_toasts_fadingtime"
- top_pad="3"
- width="325" />
+ control_name="PlaySoundTeleportOffer"
+ height="16"
+ label="Teleport offer"
+ layout="topleft"
+ left_pad="35"
+ top_pad="-38"
+ name="teleport_offer"
+ width="150" />
+ <check_box
+ control_name="PlaySoundInventoryOffer"
+ height="16"
+ label="Inventory offer"
+ layout="topleft"
+ top_pad="6"
+ name="inventory_offer"
+ width="150" />
+
+ </panel>
+
+ <view_border
+ bevel_style="none"
+ height="0"
+ layout="topleft"
+ left="13"
+ name="cost_text_border"
+ top_pad="5"
+ width="495"/>
+
+ <panel
+ height="50"
+ layout="topleft"
+ left="13"
+ top_pad="10"
+ width="505">
+
+ <text
+ layout="topleft"
+ left="0"
+ text_color="White"
+ height="12"
+ top="5"
+ width="55">
+ Save:
+ </text>
+
+ <combo_box
+ enabled="false"
+ control_name="KeepConversationLogTranscripts"
+ height="23"
+ layout="topleft"
+ left_pad="5"
+ name="chat_font_size"
+ top="0"
+ width="165">
+ <item
+ label="Log and transcripts"
+ value="2"/>
+ <item
+ label="Log only"
+ value="1"/>
+ <item
+ label="No log or transcripts"
+ value="0"/>
+ </combo_box>
+
+ <button
+ enabled="false"
+ height="23"
+ label="Clear log..."
+ layout="topleft"
+ left_pad="5"
+ top="0"
+ name="clear_log"
+ width="110">
+ <commit_callback
+ function="Pref.ClearLog" />
+ </button>
+
+ <button
+ enabled="false"
+ height="23"
+ label="Delete transcripts..."
+ layout="topleft"
+ left_pad="5"
+ top="0"
+ name="delete_transcripts"
+ width="147">
+ <button.commit_callback
+ function="Pref.DeleteTranscripts" />
+ </button>
+
+ <text
+ layout="topleft"
+ left="0"
+ text_color="White"
+ height="12"
+ top_pad="15"
+ width="55">
+ Location:
+ </text>
+
+ <line_editor
+ control_name="InstantMessageLogPath"
+ border_style="line"
+ border_thickness="1"
+ font="SansSerif"
+ height="23"
+ layout="topleft"
+ left_pad="55"
+ max_length="4096"
+ name="log_path_string"
+ top_delta="-5"
+ width="185">
+ </line_editor>
+
+ <button
+ enabled="false"
+ follows="left|top"
+ height="23"
+ label="Browse..."
+ label_selected="Browse"
+ layout="topleft"
+ left_pad="5"
+ name="log_path_button"
+ top_delta="0"
+ width="112">
+ <commit_callback function="Pref.LogPath" />
+ </button>
+
+ </panel>
+
<button
- follows="left|top"
- height="23"
- label="Translation..."
- layout="topleft"
- left="30"
- name="ok_btn"
- top="-50"
- width="170">
- <button.commit_callback
- function="Pref.TranslationSettings" />
+ height="23"
+ label="Translation..."
+ layout="topleft"
+ left="9"
+ name="ok_btn"
+ top="-29"
+ width="170">
+ <commit_callback
+ function="Pref.TranslationSettings" />
</button>
<button
- follows="top|left"
- height="23"
- layout="topleft"
- top_pad="-23"
- left_pad="5"
- name="autoreplace_showgui"
- commit_callback.function="Pref.AutoReplace"
- label="Auto-Replace..."
- width="150">
+ height="23"
+ layout="topleft"
+ top_pad="-23"
+ left_pad="5"
+ name="autoreplace_showgui"
+ commit_callback.function="Pref.AutoReplace"
+ label="Auto-Replace..."
+ width="150">
</button>
<button
- follows="top|left"
- height="23"
- layout="topleft"
- top_pad="-23"
- left_pad="5"
- name="spellcheck_showgui"
- commit_callback.function="Pref.SpellChecker"
- label="Spell Checking..."
- width="150">
+ height="23"
+ layout="topleft"
+ top_pad="-23"
+ left_pad="5"
+ name="spellcheck_showgui"
+ commit_callback.function="Pref.SpellChecker"
+ label="Spell Checking..."
+ width="150">
</button>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
index 2b22f0d6e3..9e825fe516 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
@@ -362,7 +362,7 @@
follows="left|top"
height="16"
increment="0.01"
- initial_value="0.8"
+ initial_value="1.0"
layout="topleft"
label_width="115"
label="Active:"
@@ -380,7 +380,7 @@
follows="left|top"
height="16"
increment="0.01"
- initial_value="0.5"
+ initial_value="0.95"
layout="topleft"
label_width="115"
label="Inactive:"
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 24882988b0..ea0f7d8593 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -409,10 +409,10 @@
name="text_box3"
top_pad="3"
width="240">
- Busy mode response:
+ Do Not Disturb response:
</text>
<text_editor
- control_name="BusyModeResponse"
+ control_name="DoNotDisturbModeResponse"
text_readonly_color="LabelDisabledColor"
bg_writeable_color="LtGray"
use_ellipses="false"
@@ -421,7 +421,7 @@
height="29"
layout="topleft"
left="30"
- name="busy_response"
+ name="do_not_disturb_response"
width="470"
word_wrap="true">
log_in_to_change
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 f7666bdc4c..cd243d40a4 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -55,30 +55,57 @@
name="LowGraphicsDivet"
top_delta="-2"
width="2" />
+ <icon
+ color="0.12 0.12 0.12 1"
+ height="14"
+ image_name="Rounded_Square"
+ layout="topleft"
+ left_pad="41"
+ name="LowMidraphicsDivet"
+ top_delta="-2"
+ width="2" />
<icon
color="0.12 0.12 0.12 1"
height="14"
image_name="Rounded_Square"
layout="topleft"
- left_pad="83"
+ left_pad="41"
name="MidGraphicsDivet"
top_delta="0"
width="2" />
+ <icon
+ color="0.12 0.12 0.12 1"
+ height="14"
+ image_name="Rounded_Square"
+ layout="topleft"
+ left_pad="41"
+ name="MidHighGraphicsDivet"
+ top_delta="0"
+ width="2" />
<icon
color="0.12 0.12 0.12 1"
height="14"
image_name="Rounded_Square"
layout="topleft"
- left_pad="85"
+ left_pad="41"
name="HighGraphicsDivet"
top_delta="0"
width="2" />
+ <icon
+ color="0.12 0.12 0.12 1"
+ height="14"
+ image_name="Rounded_Square"
+ layout="topleft"
+ left_pad="41"
+ name="HighUltraGraphicsDivet"
+ top_delta="0"
+ width="2" />
<icon
color="0.12 0.12 0.12 1"
height="14"
image_name="Rounded_Square"
layout="topleft"
- left_pad="83"
+ left_pad="41"
name="UltraGraphicsDivet"
top_delta="0"
width="2" />
@@ -91,7 +118,7 @@
initial_value="0"
layout="topleft"
left="120"
- max_val="3"
+ max_val="6"
name="QualityPerformanceSelection"
show_text="false"
top_delta="-2"
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 587c461bee..78743d26bb 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -1,72 +1,69 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- border="true"
- follows="left|top|right|bottom"
- height="408"
- label="Communication"
- layout="topleft"
- left="102"
- name="im"
- top="1"
- width="517">
- <panel.string
- name="log_in_to_change">
- log in to change
- </panel.string>
- <button
- follows="left|bottom"
- height="23"
- label="Clear History"
- tool_tip="Clear login image, last location, teleport history, web, and texture cache"
- layout="topleft"
- left="30"
- name="clear_cache"
- top="10"
- width="145">
- <button.commit_callback
- function="Pref.WebClearCache" />
- </button>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_pad="10"
- mouse_opaque="false"
- name="cache_size_label_l"
- top_delta="3"
- text_color="LtGray_50"
- width="300">
- (Locations, images, web, search history)
- </text>
- <check_box
- height="16"
- enabled="false"
- label="Show me in Search results"
- layout="topleft"
- left="30"
- name="online_searchresults"
- top_pad="20"
- width="350" />
- <check_box
- height="16"
- enabled="false"
- label="Only friends and groups know I'm online"
- layout="topleft"
- left="30"
- name="online_visibility"
- top_pad="30"
- width="350" />
- <check_box
- control_name="VoiceCallsFriendsOnly"
- height="16"
- label="Only friends and groups can call or IM me"
- layout="topleft"
- left="30"
- name="voice_call_friends_only_check"
- top_pad="10"
- width="350" />
+ border="true"
+ follows="left|top|right|bottom"
+ height="408"
+ label="Communication"
+ layout="topleft"
+ left="102"
+ name="im"
+ top="1"
+ width="517">
+
+ <panel.string
+ name="log_in_to_change">
+ log in to change
+ </panel.string>
+
+ <button
+ follows="left|bottom"
+ height="23"
+ label="Clear History"
+ tool_tip="Clear login image, last location, teleport history, web, and texture cache"
+ layout="topleft"
+ left="30"
+ name="clear_cache"
+ top="10"
+ width="145">
+ <button.commit_callback
+ function="Pref.WebClearCache" />
+ </button>
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="10"
+ mouse_opaque="false"
+ name="cache_size_label_l"
+ top_delta="3"
+ text_color="LtGray_50"
+ width="300">
+ (Locations, images, web, search history)
+ </text>
+
+ <check_box
+ height="16"
+ enabled="false"
+ label="Show me in Search results"
+ layout="topleft"
+ left="30"
+ name="online_searchresults"
+ top_pad="20"
+ width="350" />
+
+ <check_box
+ height="16"
+ enabled="false"
+ label="Only friends and groups know I'm online"
+ layout="topleft"
+ left="30"
+ name="online_visibility"
+ top_pad="30"
+ width="350" />
+
<check_box
enabled_control="EnableVoiceChat"
control_name="AutoDisengageMic"
@@ -87,100 +84,7 @@
name="favorites_on_login_check"
top_pad="10"
width="350" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="30"
- mouse_opaque="false"
- name="Logs:"
- top_pad="20"
- width="350">
- Chat Logs:
- </text>
- <check_box
- enabled="false"
- control_name="LogNearbyChat"
- 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 IM logs on my computer"
- layout="topleft"
- left="30"
- name="log_instant_messages"
- top_pad="10"
- width="350">
- </check_box>
- <check_box
- control_name="LogTimestamp"
- enabled="false"
- height="16"
- label="Add timestamp to each line in chat log"
- layout="topleft"
- left_delta="0"
- name="show_timestamps_check_im"
- top_pad="10"
- width="237" />
- <check_box
- control_name="LogFileNamewithDate"
- enabled="false"
- height="16"
- label="Add datestamp to log file name."
- layout="topleft"
- left_delta="5"
- name="logfile_name_datestamp"
- top_pad="10"
- width="350"/>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="0"
- mouse_opaque="false"
- name="log_path_desc"
- top_pad="30"
- 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="23"
- label="Browse"
- label_selected="Browse"
- layout="topleft"
- left_pad="5"
- name="log_path_button"
- top_delta="0"
- width="145">
- <button.commit_callback
- function="Pref.LogPath" />
- </button>
+
<button
follows="left|bottom"
height="23"
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 f6a8af0973..765b07ed8b 100644
--- a/indra/newview/skins/default/xui/en/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml
@@ -158,6 +158,7 @@
text_readonly_color="DkGray"
width="487"
show_line_numbers="true"
+ enable_tooltip_paste="true"
word_wrap="true">
Loading...
</text_editor>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
index e9a787cef0..6ee8fc3a4c 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
@@ -1,36 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- height="570"
- layout="topleft"
- name="object properties"
- help_topic="object_properties"
- 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
+ height="570"
+ layout="topleft"
+ name="object properties"
+ help_topic="object_properties"
+ 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 info 5">
You can't modify this object across a region boundary
</panel.string>
@@ -39,399 +39,403 @@
You can't modify these objects across a region boundary
</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|left"
- height="24"
- image_hover_unselected="BackButton_Over"
- image_pressed="BackButton_Press"
- image_unselected="BackButton_Off"
- layout="topleft"
- left="8"
- name="back_btn"
- tab_stop="false"
- top="0"
- width="30"
- use_draw_context_alpha="false" />
- <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="290" />
- <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=""
- name="properties_panel"
- 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_bytes="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_bytes="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"
- translate="false"
- use_ellipses="true"
- width="225">
- TestString PleaseIgnore
- </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"
- translate="false"
- use_ellipses="true"
- width="225">
- TestString PleaseIgnore
- </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>
+ 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|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"
- 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)"
+ follows="top|left"
+ height="24"
+ image_hover_unselected="BackButton_Over"
+ image_pressed="BackButton_Press"
+ image_unselected="BackButton_Off"
+ layout="topleft"
+ left="8"
+ name="back_btn"
+ tab_stop="false"
+ top="0"
+ width="30"
+ use_draw_context_alpha="false" />
+ <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="290" />
+ <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=""
+ name="properties_panel"
+ 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_bytes="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_bytes="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"
+ translate="false"
+ use_ellipses="true"
+ width="225">
+ TestString PleaseIgnore
+ </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"
+ translate="false"
+ use_ellipses="true"
+ width="225">
+ TestString PleaseIgnore
+ </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"
+ 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" />
- <combo_box.item
- label="Sit on object"
- name="Sitonobject"
+ <combo_box.item
+ label="Sit on object"
+ name="Sitonobject"
value="Sit" />
- <combo_box.item
- label="Buy object"
- name="Buyobject"
+ <combo_box.item
+ label="Buy object"
+ name="Buyobject"
value="Buy" />
- <combo_box.item
- label="Pay object"
- name="Payobject"
+ <combo_box.item
+ label="Pay object"
+ name="Payobject"
value="Pay" />
- <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"
+ <combo_box.item
+ label="Open"
+ name="Open"
+ value="Open" />
+ <combo_box.item
+ label="Zoom"
+ name="Zoom"
+ value="Zoom" />
+ </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="5"
- top_pad="15"
- text_color="EmphasisColor"
- height="15"
- follows="left|top|right"
- layout="topleft"
- name="perm_modify"
- width="310">
- 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
+ top_pad="15"
+ text_color="EmphasisColor"
+ height="15"
+ follows="left|top|right"
+ layout="topleft"
+ name="perm_modify"
+ width="310">
+ 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"
@@ -445,17 +449,17 @@
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"
+ <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"
follows="left|top"
name="pathfinding_attributes_label"
top_pad="6"
@@ -466,7 +470,7 @@
<text
type="string"
follows="left|top"
- text_color="EmphasisColor"
+ text_color="EmphasisColor"
name="pathfinding_attributes_value"
width="130"
word_wrap="false"
@@ -475,120 +479,120 @@
<text
type="string"
text_color="EmphasisColor"
- length="1"
+ length="1"
top_pad="10"
- 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="73" />
- <button
- follows="bottom|left"
- height="23"
- label="Pay"
- layout="topleft"
- left_pad="5"
- name="pay_btn"
- top="0"
- width="73" />
- <button
- follows="bottom|left"
- height="23"
- label="Buy"
- layout="topleft"
- left_pad="5"
- name="buy_btn"
- top="0"
- width="73" />
- <button
- follows="bottom|left"
- height="23"
- label="Details"
- layout="topleft"
- left_pad="5"
- name="details_btn"
- top="0"
- width="74" />
+ 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="73" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Pay"
+ layout="topleft"
+ left_pad="5"
+ name="pay_btn"
+ top="0"
+ width="73" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Buy"
+ layout="topleft"
+ left_pad="5"
+ name="buy_btn"
+ top="0"
+ width="73" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Details"
+ layout="topleft"
+ left_pad="5"
+ name="details_btn"
+ top="0"
+ width="74" />
- </panel>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 15eb46c348..5aa743b32d 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -59,7 +59,7 @@
<string name="LoginFailedNoNetwork">Network error: Could not establish connection, please check your network connection.</string>
<string name="LoginFailed">Login failed.</string>
<string name="Quit">Quit</string>
- <string name="create_account_url">http://join.secondlife.com/</string>
+ <string name="create_account_url">http://join.secondlife.com/?sourceid=[sourceid]</string>
<string name="LoginFailedViewerNotPermitted">
The viewer you are using can no longer access Second Life. Please visit the following page to download a new viewer:
@@ -295,7 +295,7 @@ Please try logging in again in a minute.</string>
<!-- llvoavatar. Displayed in the avatar chat bubble -->
<string name="AvatarEditingAppearance">(Editing Appearance)</string>
<string name="AvatarAway">Away</string>
- <string name="AvatarBusy">Busy</string>
+ <string name="AvatarDoNotDisturb">Do Not Disturb</string>
<string name="AvatarMuted">Blocked</string>
<!-- animations -->
@@ -384,6 +384,8 @@ Please try logging in again in a minute.</string>
<string name="ST_NO_JOINT">Can't find ROOT or JOINT.</string>
<!-- Chat -->
+ <string name="NearbyChatTitle">Nearby chat</string>
+ <string name="NearbyChatLabel">(Nearby chat)</string>
<string name="whisper">whispers:</string>
<string name="shout">shouts:</string>
<string name="ringing">Connecting to in-world Voice Chat...</string>
@@ -405,8 +407,9 @@ Please try logging in again in a minute.</string>
<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>
+ <string name="AgentNameSubst">(You)</string> <!-- Substitution for agent name -->
<string name="TeleportYourAgent">Teleport you</string>
- <string name="NotConnected">Not Connected</string>
<!-- Sim Access labels -->
<string name="SIM_ACCESS_PG">General</string>
@@ -1447,7 +1450,7 @@ integer llScriptDanger(vector pos)
Returns TRUE if pos is over public land, sandbox land, land that doesn&apos;t allow everyone to edit and build, or land that doesn&apos;t allow outside scripts
</string>
<string name="LSLTipText_llDialog" translate="false">
-llDialog(key avatar, string message, list buttons, integer chat_channel
+llDialog(key avatar, string message, list buttons, integer chat_channel)
Shows a dialog box on the avatar&apos;s screen with a message and up to 12 buttons.
If a button is pressed, the avatar says the text of the button label on chat_channel.
</string>
@@ -2071,12 +2074,6 @@ For AI Character: Get the closest navigable point to the point provided.
</string>
- <!-- Avatar busy/away mode -->
- <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>
@@ -2270,7 +2267,8 @@ Drag folders to this area and click "Send to Marketplace" to list them for sale
<string name="InvFolder Gestures">Gestures</string>
<string name="InvFolder Favorite">My Favorites</string>
<!-- historically default name of the Favorites folder can start from either "f" or "F" letter.
- We should localize both of them with the same value -->
+ Also, it can be written as "Favorite" or "Favorites".
+ We should localize all variants of them with the same value -->
<string name="InvFolder favorite">My Favorites</string>
<string name="InvFolder Favorites">My Favorites</string>
<string name="InvFolder favorites">My Favorites</string>
@@ -2284,6 +2282,7 @@ Drag folders to this area and click "Send to Marketplace" to list them for sale
<!-- are used for Friends and Friends/All folders in Inventory "Calling cards" folder. See EXT-694-->
<string name="InvFolder Friends">Friends</string>
+ <string name="InvFolder Received Items">Received Items</string>
<string name="InvFolder All">All</string>
<string name="no_attachments">No attachments worn</string>
@@ -2524,7 +2523,7 @@ Drag folders to this area and click "Send to Marketplace" to list them for sale
<string name="PanelContentsNewScript">New Script</string>
<!-- panel preferences general -->
- <string name="BusyModeResponseDefault">The Resident you messaged is in &apos;busy mode&apos; which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing.</string>
+ <string name="DoNotDisturbModeResponseDefault">This resident has turned on &apos;Do Not Disturb&apos; and will see your message later.</string>
<!-- Mute -->
<string name="MuteByName">(By name)</string>
@@ -2583,9 +2582,6 @@ Drag folders to this area and click "Send to Marketplace" to list them for sale
<string name="GroupMoneyDebits">Debits</string>
<string name="GroupMoneyDate">[weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]</string>
- <!-- viewer object -->
- <string name="ViewerObjectContents">Contents</string>
-
<!-- Viewer menu -->
<string name="AcquiredItems">Acquired Items</string>
<string name="Cancel">Cancel</string>
@@ -3330,7 +3326,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="LocationCtrlAdultIconTooltip">Adult Region</string>
<string name="LocationCtrlModerateIconTooltip">Moderate Region</string>
<string name="LocationCtrlGeneralIconTooltip">General Region</string>
- <string name="LocationCtrlSeeAVsTooltip">Avatars visible and chat allowed outside of this parcel</string>
+ <string name="LocationCtrlSeeAVsTooltip">Avatars inside this parcel cannot be seen or heard by avatars outside this parcel</string>
<string name="LocationCtrlPathfindingDirtyTooltip">Objects that move may not behave correctly in this region until the region is rebaked.</string>
<string name="LocationCtrlPathfindingDisabledTooltip">Dynamic pathfinding is not enabled on this region.</string>
<!-- Strings used by the (currently Linux) auto-updater app -->
@@ -3381,12 +3377,15 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="IM_moderator_label">(Moderator)</string>
<string name="Saved_message">(Saved [LONG_TIMESTAMP])</string>
<string name="IM_unblock_only_groups_friends">To see this message, you must uncheck &apos;Only friends and groups can call or IM me&apos; in Preferences/Privacy.</string>
+ <string name="OnlineStatus">Online</string>
+ <string name="OfflineStatus">Offline</string>
<!-- voice calls -->
<string name="answered_call">Your call has been answered</string>
<string name="you_started_call">You started a voice call</string>
<string name="you_joined_call">You joined the voice call</string>
- <string name="name_started_call">[NAME] started a voice call</string>
+ <string name="you_auto_rejected_call-im">You automatically rejected the voice call while &apos;Do Not Disturb&apos; was on.</string>
+ <string name="name_started_call">[NAME] started a voice call</string>
<string name="ringing-im">
Joining voice call...
@@ -3401,7 +3400,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Connecting...
</string>
<string name="conference-title">
- Ad-hoc Conference
+ Multi-person chat
</string>
<string name="conference-title-incoming">
Conference with [AGENT_NAME]
@@ -3827,6 +3826,7 @@ Try enclosing path to the editor with double quotes.
<string name="Command_Avatar_Label">Avatar</string>
<string name="Command_Build_Label">Build</string>
<string name="Command_Chat_Label">Chat</string>
+ <string name="Command_Conversations_Label">Conversations</string>
<string name="Command_Compass_Label">Compass</string>
<string name="Command_Destinations_Label">Destinations</string>
<string name="Command_Gestures_Label">Gestures</string>
@@ -3853,6 +3853,7 @@ Try enclosing path to the editor with double quotes.
<string name="Command_Avatar_Tooltip">Choose a complete avatar</string>
<string name="Command_Build_Tooltip">Building objects and reshaping terrain</string>
<string name="Command_Chat_Tooltip">Chat with people nearby using text</string>
+ <string name="Command_Conversations_Tooltip">Converse with everyone</string>
<string name="Command_Compass_Tooltip">Compass</string>
<string name="Command_Destinations_Tooltip">Destinations of interest</string>
<string name="Command_Gestures_Tooltip">Gestures for your avatar</string>
@@ -3907,4 +3908,15 @@ Try enclosing path to the editor with double quotes.
<!-- Spell check settings floater -->
<string name="UserDictionary">[User]</string>
+ <!-- Conversation log messages -->
+ <string name="logging_calls_disabled_log_empty">
+ Conversations are not being logged. To begin keeping a log, choose "Save: Log only" or "Save: Log and transcripts" under Preferences > Chat.
+ </string>
+ <string name="logging_calls_disabled_log_not_empty">
+ No more conversations will be logged. To resume keeping a log, choose "Save: Log only" or "Save: Log and transcripts" under Preferences > Chat.
+ </string>
+ <string name="logging_calls_enabled_log_empty">
+ There are no logged conversations. After you contact someone, or someone contacts you, a log entry will be shown here.
+ </string>
+
</strings>
diff --git a/indra/newview/skins/default/xui/en/widgets/chat_editor.xml b/indra/newview/skins/default/xui/en/widgets/chat_editor.xml
new file mode 100644
index 0000000000..f9facb593a
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/chat_editor.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<chat_editor
+ name="chat_editor"
+ show_context_menu="true"/>
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
deleted file mode 100644
index 0e29ed0d0b..0000000000
--- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?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
- image_mute="Parcel_VoiceNo_Light"
- image_off="VoicePTT_Off_Dark"
- image_on="VoicePTT_On_Dark"
- image_level_1="VoicePTT_Lvl1_Dark"
- image_level_2="VoicePTT_Lvl2_Dark"
- image_level_3="VoicePTT_Lvl3_Dark"
- auto_update="true"
- draw_border="false"
- height="24"
- left="25"
- bottom="1"
- name="speaker"
- visible="false"
- width="20" />
- <chiclet_im_adhoc.avatar_icon
- bottom="3"
- follows="left|top|bottom"
- height="20"
- left="2"
- mouse_opaque="false"
- 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
deleted file mode 100644
index 77011139bf..0000000000
--- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?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
- image_mute="Parcel_VoiceNo_Light"
- image_off="VoicePTT_Off_Dark"
- image_on="VoicePTT_On_Dark"
- image_level_1="VoicePTT_Lvl1_Dark"
- image_level_2="VoicePTT_Lvl2_Dark"
- image_level_3="VoicePTT_Lvl3_Dark"
- auto_update="true"
- draw_border="false"
- height="24"
- left="25"
- bottom="1"
- 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
deleted file mode 100644
index 8b56a8f0f6..0000000000
--- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?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
- image_mute="Parcel_VoiceNo_Light"
- image_off="VoicePTT_Off_Dark"
- image_on="VoicePTT_On_Dark"
- image_level_1="VoicePTT_Lvl1_Dark"
- image_level_2="VoicePTT_Lvl2_Dark"
- image_level_3="VoicePTT_Lvl3_Dark"
- auto_update="true"
- draw_border="false"
- height="24"
- left="25"
- bottom="1"
- name="speaker"
- visible="false"
- width="20" />
- <chiclet_im_p2p.avatar_icon
- bottom="3"
- color="white"
- 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/conversation_view_participant.xml b/indra/newview/skins/default/xui/en/widgets/conversation_view_participant.xml
new file mode 100755
index 0000000000..b83d9122f7
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/conversation_view_participant.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<conversation_view_participant
+ folder_arrow_image="Folder_Arrow"
+ item_height="24"
+ item_top_pad="0"
+ selection_image="Rounded_Square"
+ mouse_opaque="true"
+ follows="left|top|right"
+ left_pad="0"
+ icon_pad="10"
+ icon_width="20"
+ text_pad="7"
+ text_pad_right="4"
+ arrow_size="12"
+ max_folder_item_overlap="2"
+>
+<avatar_icon
+ follows="left"
+ height="20"
+ default_icon_name="Generic_Person"
+ layout="topleft"
+ top="2"
+ width="20" />
+<info_button
+ follows="right"
+ height="16"
+ image_pressed="Info_Press"
+ image_unselected="Info_Over"
+ right="-28"
+ name="info_btn"
+ width="16" />
+<output_monitor
+ follows="right"
+ auto_update="true"
+ draw_border="false"
+ height="16"
+ right="-3"
+ mouse_opaque="true"
+ name="speaking_indicator"
+ visible="true"
+ width="20" />
+</conversation_view_participant>
diff --git a/indra/newview/skins/default/xui/en/widgets/conversation_view_session.xml b/indra/newview/skins/default/xui/en/widgets/conversation_view_session.xml
new file mode 100644
index 0000000000..b8c39eec1d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/conversation_view_session.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<conversation_view_session
+ folder_arrow_image="Folder_Arrow"
+ folder_indentation="8"
+ item_height="24"
+ item_top_pad="4"
+ selection_image="Rounded_Square"
+ mouse_opaque="true"
+ follows="left|top|right"
+ left_pad="5"
+ icon_pad="2"
+ icon_width="16"
+ text_pad="1"
+ text_pad_right="4"
+ arrow_size="12"
+ max_folder_item_overlap="2"/>
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
index 6fa74f403d..bbd53ccb12 100644
--- a/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml
+++ b/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml
@@ -7,4 +7,10 @@
selection_image="Rounded_Square"
mouse_opaque="true"
follows="left|top|right"
- />
+ left_pad="5"
+ icon_pad="2"
+ icon_width="16"
+ text_pad="1"
+ text_pad_right="4"
+ arrow_size="12"
+ max_folder_item_overlap="2"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml
index 77d8024cb2..590a4730a9 100644
--- a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml
+++ b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml
@@ -5,7 +5,13 @@
item_height="20"
item_top_pad="4"
selection_image="Rounded_Square"
- >
+ left_pad="5"
+ icon_pad="2"
+ icon_width="16"
+ text_pad="1"
+ text_pad_right="4"
+ arrow_size="12"
+ max_folder_item_overlap="2">
<new_badge
label="New"
label_offset_horiz="-1"
diff --git a/indra/newview/skins/default/xui/en/widgets/inbox_inventory_panel.xml b/indra/newview/skins/default/xui/en/widgets/inbox_inventory_panel.xml
index 830c27bdac..d5b10e7f51 100644
--- a/indra/newview/skins/default/xui/en/widgets/inbox_inventory_panel.xml
+++ b/indra/newview/skins/default/xui/en/widgets/inbox_inventory_panel.xml
@@ -1,2 +1,3 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<inbox_inventory_panel show_load_status="false" />
+<inbox_inventory_panel show_load_status="false"
+ start_folder.type="inbox"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml b/indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml
deleted file mode 100644
index d19c47f54f..0000000000
--- a/indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<outbox_folder_view_folder
- folder_arrow_image="Folder_Arrow"
- folder_indentation="8"
- item_height="20"
- item_top_pad="4"
- selection_image="Rounded_Square"
- >
-</outbox_folder_view_folder>
diff --git a/indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml b/indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml
deleted file mode 100644
index 3964569da2..0000000000
--- a/indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<outbox_inventory_panel show_empty_message="false" show_load_status="false" />
diff --git a/indra/newview/skins/default/xui/en/widgets/text.xml b/indra/newview/skins/default/xui/en/widgets/text.xml
index 134f2d7522..2102074674 100644
--- a/indra/newview/skins/default/xui/en/widgets/text.xml
+++ b/indra/newview/skins/default/xui/en/widgets/text.xml
@@ -9,6 +9,7 @@
h_pad="0"
allow_scroll="false"
text_readonly_color="LabelTextColor"
+ text_tentative_color="TextFgTentativeColor"
bg_writeable_color="FloaterDefaultBackgroundColor"
use_ellipses="false"
bg_visible="false"
diff --git a/indra/newview/skins/default/xui/en/widgets/toolbar.xml b/indra/newview/skins/default/xui/en/widgets/toolbar.xml
index 0aa478ace9..0ace37a5dc 100644
--- a/indra/newview/skins/default/xui/en/widgets/toolbar.xml
+++ b/indra/newview/skins/default/xui/en/widgets/toolbar.xml
@@ -30,9 +30,9 @@
image_overlay_alignment="left"
use_ellipses="true"
auto_resize="true"
- button_flash_count="99999"
- button_flash_rate="1.0"
- flash_color="EmphasisColor"/>
+ button_flash_count="4"
+ button_flash_rate="0.5"
+ flash_color="BeaconColor"/>
<button_icon pad_left="10"
pad_right="10"
image_bottom_pad="10"
@@ -51,7 +51,7 @@
chrome="true"
use_ellipses="true"
auto_resize="true"
- button_flash_count="99999"
- button_flash_rate="1.0"
- flash_color="EmphasisColor"/>
+ button_flash_count="4"
+ button_flash_rate="0.5"
+ flash_color="BeaconColor"/>
</toolbar>
diff --git a/indra/newview/skins/default/xui/es/floater_chat_bar.xml b/indra/newview/skins/default/xui/es/floater_chat_bar.xml
index 2e94805057..02369c9a43 100644
--- a/indra/newview/skins/default/xui/es/floater_chat_bar.xml
+++ b/indra/newview/skins/default/xui/es/floater_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="chat_bar" title="CHAT">
+<floater name="nearby_chat" title="CHAT">
<panel name="bottom_panel">
<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"/>
diff --git a/indra/newview/skins/default/xui/es/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/es/floater_pathfinding_linksets.xml
index 266e8138c9..e6f864eef5 100644
--- a/indra/newview/skins/default/xui/es/floater_pathfinding_linksets.xml
+++ b/indra/newview/skins/default/xui/es/floater_pathfinding_linksets.xml
@@ -30,6 +30,9 @@
<floater.string name="linkset_terrain_owner">
--
</floater.string>
+ <floater.string name="linkset_terrain_scripted">
+ --
+ </floater.string>
<floater.string name="linkset_terrain_land_impact">
--
</floater.string>
@@ -45,6 +48,15 @@
<floater.string name="linkset_owner_group">
[grupo]
</floater.string>
+ <floater.string name="linkset_is_scripted">
+ Sí
+ </floater.string>
+ <floater.string name="linkset_is_not_scripted">
+ No
+ </floater.string>
+ <floater.string name="linkset_is_unknown_scripted">
+ Desconocido
+ </floater.string>
<floater.string name="linkset_use_walkable">
Objeto transitable
</floater.string>
@@ -94,6 +106,7 @@
<scroll_list.columns label="Nombre (prim raíz)" name="name"/>
<scroll_list.columns label="Descripción (prim raíz)" name="description"/>
<scroll_list.columns label="Propietario" name="owner"/>
+ <scroll_list.columns label="Con scripts" name="scripted"/>
<scroll_list.columns label="Impacto" name="land_impact"/>
<scroll_list.columns label="Distancia" name="dist_from_you"/>
<scroll_list.columns label="Utilización de linkset" name="linkset_use"/>
diff --git a/indra/newview/skins/default/xui/es/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/es/floater_texture_fetch_debugger.xml
index 29fd2ab2a3..59aaf7f74a 100644
--- a/indra/newview/skins/default/xui/es/floater_texture_fetch_debugger.xml
+++ b/indra/newview/skins/default/xui/es/floater_texture_fetch_debugger.xml
@@ -45,10 +45,23 @@
<text name="total_time_refetch_vis_cache_label">
15, Volviendo a obtener visibles de la caché, Tiempo: [TIME] segundos, Obtenidos: [SIZE] KB, [PIXEL] MPíxeles
</text>
+ <text name="total_time_refetch_all_cache_label">
+ 16, Volviendo a obtener todas las texturas de caché, Tiempo: [TIME] segundos, Obtenidos: [SIZE] KB, [PIXEL] MPíxeles
+ </text>
<text name="total_time_refetch_vis_http_label">
- 16, Volviendo a obtener visibles de HTTP, Tiempo: [TIME] segundos, Obtenidos: [SIZE] KB, [PIXEL] MPíxeles
+ 17, Volviendo a obtener visibles de HTTP, Tiempo: [TIME] segundos, Obtenidos: [SIZE] KB, [PIXEL] MPíxeles
+ </text>
+ <text name="total_time_refetch_all_http_label">
+ 18, Volviendo a obtener todas las texturas de HTTP, Tiempo: [TIME] segundos, Obtenidos: [SIZE] KB, [PIXEL] MPíxeles
+ </text>
+ <spinner label="19, Proporción de texeles/píxeles:" name="texel_pixel_ratio"/>
+ <text name="texture_source_label">
+ 20, Fuente de texturas:
</text>
- <spinner label="17, Proporción de texeles/píxeles:" name="texel_pixel_ratio"/>
+ <radio_group name="texture_source">
+ <radio_item label="Caché + HTTP" name="0"/>
+ <radio_item label="Solo HTTP" name="1"/>
+ </radio_group>
<button label="Iniciar" name="start_btn"/>
<button label="Restablecer" name="clear_btn"/>
<button label="Cerrar" name="close_btn"/>
@@ -58,5 +71,7 @@
<button label="Descodificar" name="decode_btn"/>
<button label="Textura GL" name="gl_btn"/>
<button label="Volver a obtener caché de vis." name="refetchviscache_btn"/>
+ <button label="Volver a obtener toda la caché" name="refetchallcache_btn"/>
<button label="Volver a obtener HTTP de vis." name="refetchvishttp_btn"/>
+ <button label="Volver a obtener todo el HTTP" name="refetchallhttp_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/menu_im_well_button.xml b/indra/newview/skins/default/xui/es/menu_im_well_button.xml
deleted file mode 100644
index c8f6c217cc..0000000000
--- a/indra/newview/skins/default/xui/es/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="IM Well Button Context Menu">
- <menu_item_call label="Cerrar todo" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inventory.xml b/indra/newview/skins/default/xui/es/menu_inventory.xml
index 4a8f37dee4..803d3f1331 100644
--- a/indra/newview/skins/default/xui/es/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/es/menu_inventory.xml
@@ -67,6 +67,7 @@
<menu_item_call label="Borrar carpeta del sistema" name="Delete System Folder"/>
<menu_item_call label="Empezar multiconferencia" name="Conference Chat Folder"/>
<menu_item_call label="Escuchar" name="Sound Play"/>
+ <menu_item_call label="Copiar la SLurl" name="url_copy"/>
<menu_item_call label="Acerca del hito" name="About Landmark"/>
<menu_item_call label="Escuchar en el mundo" name="Animation Play"/>
<menu_item_call label="Ejecutarla para usted" name="Animation Audition"/>
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index 991a079be5..7dfb27717d 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -1211,7 +1211,7 @@ a &apos;[THIS_GPU]&apos;
Se te ha llevado a una región cercana.
</notification>
<notification name="AvatarMovedLast">
- En estos momentos no está disponible tu última posición.
+ En estos momentos no está disponible la posición solicitada.
Se te ha llevado a una región cercana.
</notification>
<notification name="AvatarMovedHome">
@@ -1229,8 +1229,8 @@ Puedes usar [SECOND_LIFE] de forma normal; los demás residentes te verán corre
<notification name="FirstRun">
Se ha completado la instalación de [SECOND_LIFE].
-Si es la primera vez que usas [SECOND_LIFE], debes crear una cuenta antes de poder iniciar una sesión.
- <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Cuenta nueva..."/>
+Si es la primera vez que usas [SECOND_LIFE], debes crear una cuenta para poder iniciar una sesión.
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Crear cuenta..."/>
</notification>
<notification name="LoginPacketNeverReceived">
Tenemos problemas de conexión. Puede deberse a un problema de tu conexión a Internet o de [SECOND_LIFE_GRID].
@@ -3231,19 +3231,58 @@ Al ocultar el botón Hablar se desactiva la función de voz.
Esta acción ocultará todos los botones y elementos de menú. Para restaurarlos, pulsa otra vez en [SHORTCUT].
<usetemplate ignoretext="Confirmar antes de ocultar la IU" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnRestricted">
- Algunos de los linksets seleccionados no pueden configurarse como &apos;[REQUESTED_TYPE]&apos; debido a restricciones de los permisos del linkset. Estos linksets se configurarán como &apos;[RESTRICTED_TYPE]&apos;.
+ <notification name="PathfindingLinksets_WarnOnPhantom">
+ El indicador de inmaterial de algunos linksets seleccionados se conmutará.
+
+¿Quieres continuar?
+ <usetemplate ignoretext="El indicador de inmaterial de algunos linksets seleccionados se conmutará." name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted">
+ Algunos de los linksets seleccionados no pueden configurarse como &apos;[REQUESTED_TYPE]&apos; debido a restricciones de los permisos del linkset. Estos linksets se configurarán como &apos;[RESTRICTED_TYPE]&apos;.
+
+¿Quieres continuar?
<usetemplate ignoretext="Algunos de los linksets seleccionados no pueden configurarse debido a restricciones de los permisos del linkset." name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnVolume">
+ <notification name="PathfindingLinksets_MismatchOnVolume">
Algunos de los linksets seleccionados no pueden configurarse como &apos;[REQUESTED_TYPE]&apos; porque su forma no es convexa.
+
+¿Quieres continuar?
<usetemplate ignoretext="Algunos de los linksets seleccionados no pueden configurarse porque su forma no es convexa." name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnRestrictedAndVolume">
- Algunos de los linksets seleccionados no pueden configurarse como &apos;[REQUESTED_TYPE]&apos; debido a restricciones de los permisos del linkset. Estos linksets se configurarán como &apos;[RESTRICTED_TYPE]&apos;.
- Algunos de los linksets seleccionados no pueden configurarse como &apos;[REQUESTED_TYPE]&apos; porque su forma no es convexa. Los tipos de utilización de estos linksets no cambiarán.
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted">
+ El indicador de inmaterial de algunos linksets seleccionados se conmutará.
+
+Algunos de los linksets seleccionados no pueden configurarse como &apos;[REQUESTED_TYPE]&apos; debido a restricciones de los permisos del linkset. Estos linksets se configurarán como &apos;[RESTRICTED_TYPE]&apos;.
+
+¿Quieres continuar?
+ <usetemplate ignoretext="El indicador de inmaterial de algunos linksets seleccionados se conmutará y otros no se podrán establecer debido a restricciones de los permisos del linkset." name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnVolume">
+ El indicador de inmaterial de algunos linksets seleccionados se conmutará.
+
+Algunos de los linksets seleccionados no pueden configurarse como &apos;[REQUESTED_TYPE]&apos; porque su forma no es convexa.
+
+¿Quieres continuar?
+ <usetemplate ignoretext="El indicador de inmaterial de algunos linksets seleccionados se conmutará y otros no se podrán establecer porque la forma no es convexa" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted_MismatchOnVolume">
+ Algunos de los linksets seleccionados no pueden configurarse como &apos;[REQUESTED_TYPE]&apos; debido a restricciones de los permisos del linkset. Estos linksets se configurarán como &apos;[RESTRICTED_TYPE]&apos;.
+
+Algunos de los linksets seleccionados no pueden configurarse como &apos;[REQUESTED_TYPE]&apos; porque su forma no es convexa. Los tipos de utilización de estos linksets no cambiarán.
+
+¿Quieres continuar?
<usetemplate ignoretext="Algunos de los linksets seleccionados no pueden configurarse debido a restricciones de los permisos del linkset y porque su forma no es convexa." name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted_MismatchOnVolume">
+ El indicador de inmaterial de algunos linksets seleccionados se conmutará.
+
+Algunos de los linksets seleccionados no pueden configurarse como &apos;[REQUESTED_TYPE]&apos; debido a restricciones de los permisos del linkset. Estos linksets se configurarán como &apos;[RESTRICTED_TYPE]&apos;.
+
+Algunos de los linksets seleccionados no pueden configurarse como &apos;[REQUESTED_TYPE]&apos; porque su forma no es convexa. Los tipos de utilización de estos linksets no cambiarán.
+
+¿Quieres continuar?
+ <usetemplate ignoretext="El indicador de inmaterial de algunos linksets seleccionados se conmutará y otros no se podrán establecer debido a restricciones de los permisos del linkset y porque su forma no es convexa." name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="PathfindingLinksets_ChangeToFlexiblePath">
El objeto que has seleccionado afecta al navmesh. Al cambiarlo a una Ruta flexible se eliminará del navmesh.
<usetemplate ignoretext="El objeto que has seleccionado afecta al navmesh. Al cambiarlo a una Ruta flexible se eliminará del navmesh." name="okcancelignore" notext="Cancelar" yestext="OK"/>
diff --git a/indra/newview/skins/default/xui/es/panel_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml
index 683e0a096a..1d7f077fe7 100644
--- a/indra/newview/skins/default/xui/es/panel_login.xml
+++ b/indra/newview/skins/default/xui/es/panel_login.xml
@@ -23,7 +23,7 @@
<combo_box name="start_location_combo">
<combo_box.item label="Mi última posición" name="MyLastLocation"/>
<combo_box.item label="Mi Base" name="MyHome"/>
- <combo_box.item label="&lt;Escribe en qué región&gt;" name="Typeregionname"/>
+ <combo_box.item label="&lt;Escribe el nombre de la región&gt;" name="Typeregionname"/>
</combo_box>
</layout_panel>
<layout_panel name="links_login_panel">
@@ -38,9 +38,9 @@
</layout_panel>
<layout_panel name="links">
<text name="create_account_text">
- CREATE YǾUR ACCǾUNT
+ CREA TU CUENTA
</text>
- <button name="create_new_account_btn" label="Registrarme"/>
+ <button label="Iniciar ahora" name="create_new_account_btn"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/es/panel_navmesh_rebake.xml
deleted file mode 100644
index 96df844512..0000000000
--- a/indra/newview/skins/default/xui/es/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_navmesh_rebake">
- <button label="Recargar la región" name="navmesh_btn" tool_tip="Pulsa para recargar el navmesh de la región."/>
- <button label="Solicitando recarga" name="navmesh_btn_sending" tool_tip="Enviando la solicitud de recarga al servidor."/>
- <button label="La región se está recargando" name="navmesh_btn_baking" tool_tip="La región se está recargando. Este botón desaparecerá cuando finalice la recarga."/>
-</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
index af2b6e920b..e6ca59f912 100644
--- a/indra/newview/skins/default/xui/es/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/es/panel_nearby_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="chat_bar">
+<panel name="nearby_chat">
<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_region_debug.xml b/indra/newview/skins/default/xui/es/panel_region_debug.xml
index f07f3d3951..71bdba1a25 100644
--- a/indra/newview/skins/default/xui/es/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_debug.xml
@@ -36,5 +36,5 @@
<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="Cancelar reinicio" name="cancel_restart_btn" tool_tip="Retrasar una hora el reinicio de la región"/>
+ <button label="Cancelar reinicio" name="cancel_restart_btn" tool_tip="Cancelar el reinicio de región"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/es/panel_volume_pulldown.xml
index 9193da6cde..426783aa8e 100644
--- a/indra/newview/skins/default/xui/es/panel_volume_pulldown.xml
+++ b/indra/newview/skins/default/xui/es/panel_volume_pulldown.xml
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="volumepulldown_floater" width="215">
- <slider label="Maestro" name="System Volume" label_width="55" width="155"/>
- <slider label="Botones" name="UI Volume" label_width="55" width="155"/>
- <slider label="Ambiente" name="Wind Volume" label_width="55" width="155"/>
- <slider label="Sonidos" name="SFX Volume" label_width="55" width="155"/>
- <check_box name="gesture_audio_play_btn" tool_tip="Activa el sonido de los gestos"/>
- <slider label="Música" name="Music Volume" label_width="55" width="155"/>
- <check_box tool_tip="Activa el flujo de audio" name="enable_music"/>
- <slider label="Medios" name="Media Volume" label_width="55" width="155"/>
- <check_box tool_tip="Activa el flujo de medios" name="enable_media"/>
- <slider label="Voz" name="Voice Volume" label_width="55" width="155"/>
- <check_box tool_tip="Activar chat de voz" name="enable_voice_check"/>
+ <slider label="General" label_width="55" name="System Volume" width="155"/>
+ <slider label="Botones" label_width="55" name="UI Volume" width="155"/>
+ <slider label="Ambiental" label_width="55" name="Wind Volume" width="155"/>
+ <slider label="Sonidos" label_width="55" name="SFX Volume" width="155"/>
+ <check_box name="gesture_audio_play_btn" tool_tip="Activar sonidos de los gestos"/>
+ <slider label="Música" label_width="55" name="Music Volume" width="155"/>
+ <check_box name="enable_music" tool_tip="Activar música en streaming"/>
+ <slider label="Media" label_width="55" name="Media Volume" width="155"/>
+ <check_box name="enable_media" tool_tip="Activar media en streaming"/>
+ <slider label="Voz" label_width="55" name="Voice Volume" width="155"/>
+ <check_box name="enable_voice_check" tool_tip="Activar el chat de voz"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index d4698b8cb3..52bcab54e5 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -128,7 +128,7 @@
Salir
</string>
<string name="create_account_url">
- http://join.secondlife.com/index.php?lang=es-ES
+ http://join.secondlife.com/index.php?lang=es-ES&amp;sourceid=[sourceid]
</string>
<string name="LoginFailedViewerNotPermitted">
Ya no puedes acceder a Second Life con el visor que estás utilizando. Visita la siguiente página para descargar un nuevo visor:
@@ -1390,6 +1390,12 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="InvFolder favorite">
Mis Favoritos
</string>
+ <string name="InvFolder Favorites">
+ Mis Favoritos
+ </string>
+ <string name="InvFolder favorites">
+ Mis Favoritos
+ </string>
<string name="InvFolder Current Outfit">
Vestuario actual
</string>
@@ -1405,6 +1411,12 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="InvFolder Meshes">
Redes
</string>
+ <string name="InvFolder Received Items">
+ Objetos recibidos
+ </string>
+ <string name="InvFolder Merchant Outbox">
+ Buzón de salida de comerciante
+ </string>
<string name="InvFolder Friends">
Amigos
</string>
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 26844d9849..25c49b97b5 100644
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -339,7 +339,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
<check_box label="Groupe" name="check group scripts"/>
<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 label="Pas de bousculades" 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 label="Afficher le lieu dans la recherche (30 L$/semaine)" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/>
+ <check_box label="Voir le lieu dans la recherche (30 L$/sem.)" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/>
<combo_box name="land category with adult">
<combo_box.item label="Toutes catégories" name="item0"/>
<combo_box.item label="Appartenant aux Lindens" name="item1"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_chat_bar.xml b/indra/newview/skins/default/xui/fr/floater_chat_bar.xml
index 890411d091..7dcb9a280d 100644
--- a/indra/newview/skins/default/xui/fr/floater_chat_bar.xml
+++ b/indra/newview/skins/default/xui/fr/floater_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="chat_bar" title="CHAT PRÈS DE MOI">
+<floater name="nearby_chat" title="CHAT PRÈS DE MOI">
<panel name="bottom_panel">
<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="Afficher/masquer le journal de chat près de vous."/>
diff --git a/indra/newview/skins/default/xui/fr/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/fr/floater_edit_day_cycle.xml
index de1ba220a0..5ec68458e1 100644
--- a/indra/newview/skins/default/xui/fr/floater_edit_day_cycle.xml
+++ b/indra/newview/skins/default/xui/fr/floater_edit_day_cycle.xml
@@ -22,13 +22,13 @@
Remarque : si vous changez votre préréglage de nom, un nouveau préréglage sera créé et celui existant restera tel quel.
</text>
<text name="hint_item1">
- - Modifier un réglage de ciel et d&apos;heure : clic sur le repère
+ - Modifier un réglage de ciel/heure : clic sur le repère
</text>
<text name="hint_item2">
- - Définir les heures de transition : clic et glissement des repères
+ - Heures de transition : clic-glissement des repères
</text>
<text name="hint_item3">
- - Afficher un aperçu du cycle du jour : déplacer le triangle
+ - Aperçu du cycle du jour : déplacement du triangle
</text>
<panel name="day_cycle_slider_panel">
<multi_slider initial_value="0" name="WLTimeSlider"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_model_preview.xml b/indra/newview/skins/default/xui/fr/floater_model_preview.xml
index 0f717cb2cd..bd3dae6599 100644
--- a/indra/newview/skins/default/xui/fr/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_model_preview.xml
@@ -201,7 +201,7 @@
Passes :
</text>
<text name="Detail Scale label">
- Échelle de détail :
+ Échelle détail :
</text>
<text name="Retain%_label">
Retenue :
@@ -227,7 +227,7 @@
</panel>
<panel label="Option de chargement" name="modifiers_panel">
<text name="scale_label">
- Echelle (1 = pas d&apos;échelle) :
+ Échelle (1 = aucune) :
</text>
<spinner name="import_scale" value="1.0"/>
<text name="dimensions_label">
@@ -238,12 +238,12 @@
</text>
<check_box label="Inclure les textures" name="upload_textures"/>
<text name="include_label">
- Pour les modèles d&apos;avatar uniquement :
+ Modèles d&apos;avatar uniquement :
</text>
- <check_box label="Inclure la pondération de la peau :" name="upload_skin"/>
- <check_box label="Inclure la position des articulations :" name="upload_joints"/>
+ <check_box label="Inclure pondération de la peau :" name="upload_skin"/>
+ <check_box label="Inclure position des articulations :" name="upload_joints"/>
<text name="pelvis_offset_label">
- Décalage Z (élever ou abaisser l&apos;avatar) :
+ Décalage Z (élever/abaisser l&apos;avatar) :
</text>
<spinner name="pelvis_offset" value="0.0"/>
</panel>
@@ -252,7 +252,7 @@
<button label="Calculer les poids et les frais" name="calculate_btn" tool_tip="Calculer les poids et les frais."/>
<button label="Annuler" name="cancel_btn"/>
<button label="Charger le modèle" name="ok_btn" tool_tip="Charger dans le simulateur"/>
- <button label="Effacer les paramètres et réinitialiser le formulaire" name="reset_btn"/>
+ <button label="Effacer les paramètres / réinitialiser le formulaire" name="reset_btn"/>
<text name="upload_fee">
Frais de chargement : [FEE] L$
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/fr/floater_pathfinding_console.xml
index 6d85f8035d..02d969dc08 100644
--- a/indra/newview/skins/default/xui/fr/floater_pathfinding_console.xml
+++ b/indra/newview/skins/default/xui/fr/floater_pathfinding_console.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_pathfinding_console" title="Vue / test de recherche de chemin">
+<floater name="floater_pathfinding_console" title="Vue/Test de recherche de chemin">
<floater.string name="navmesh_viewer_status_library_not_implemented">
Implémentation de la bibliothèque de recherche de chemin introuvable
</floater.string>
@@ -93,10 +93,10 @@
</panel>
<panel label="Chemin test" name="test_panel">
<text name="ctrl_click_label">
- Ctrl-clic : sélection du point de départ
+ Ctrl-clic : sélection point de départ
</text>
<text name="shift_click_label">
- Maj-clic : sélection du point d&apos;arrivée
+ Maj-clic : sélection point d&apos;arrivée
</text>
<text name="character_width_label">
Largeur du personnage
@@ -115,7 +115,7 @@
<combo_box.item label="C" name="path_character_type_c"/>
<combo_box.item label="D" name="path_character_type_d"/>
</combo_box>
- <button label="Effacer le chemin" name="clear_path"/>
+ <button label="Effacer chemin" name="clear_path"/>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/fr/floater_pathfinding_linksets.xml
index 3abddd54ce..894ec6dd9c 100644
--- a/indra/newview/skins/default/xui/fr/floater_pathfinding_linksets.xml
+++ b/indra/newview/skins/default/xui/fr/floater_pathfinding_linksets.xml
@@ -30,6 +30,9 @@
<floater.string name="linkset_terrain_owner">
--
</floater.string>
+ <floater.string name="linkset_terrain_scripted">
+ --
+ </floater.string>
<floater.string name="linkset_terrain_land_impact">
--
</floater.string>
@@ -45,6 +48,15 @@
<floater.string name="linkset_owner_group">
[Groupe]
</floater.string>
+ <floater.string name="linkset_is_scripted">
+ Oui
+ </floater.string>
+ <floater.string name="linkset_is_not_scripted">
+ Non
+ </floater.string>
+ <floater.string name="linkset_is_unknown_scripted">
+ Inconnu
+ </floater.string>
<floater.string name="linkset_use_walkable">
Marche possible
</floater.string>
@@ -94,6 +106,7 @@
<scroll_list.columns label="Nom (prim racine)" name="name"/>
<scroll_list.columns label="Description (prim racine)" name="description"/>
<scroll_list.columns label="Propriétaire" name="owner"/>
+ <scroll_list.columns label="Scripté" name="scripted"/>
<scroll_list.columns label="Impact" name="land_impact"/>
<scroll_list.columns label="Distance" name="dist_from_you"/>
<scroll_list.columns label="Usage du groupe de liens" name="linkset_use"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_spellcheck.xml b/indra/newview/skins/default/xui/fr/floater_spellcheck.xml
index 077ce25828..635db52ffa 100644
--- a/indra/newview/skins/default/xui/fr/floater_spellcheck.xml
+++ b/indra/newview/skins/default/xui/fr/floater_spellcheck.xml
@@ -2,7 +2,7 @@
<floater name="spellcheck_floater" title="Paramètres du vérificateur orthographique">
<check_box label="Activer le vérificateur orthographique" name="spellcheck_enable"/>
<text name="spellcheck_main">
- Dictionnaire principal :
+ Diction. principal :
</text>
<text label="Journaux :" name="spellcheck_additional">
Dictionnaires supplémentaires :
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 43397c2acd..f86c1a4217 100644
--- a/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
@@ -20,7 +20,7 @@
<button label="Vierge" label_selected="Vierge" name="Blank" width="60"/>
<button label="Aucune" label_selected="Aucune" left="68" name="None" width="60"/>
<button bottom="-240" label="" label_selected="" name="Pipette"/>
- <check_box initial_value="true" label="Aperçu en direct" name="apply_immediate_check"/>
+ <check_box initial_value="true" label="Aperçu direct" name="apply_immediate_check"/>
<text name="preview_disabled" value="Aperçu désactivé"/>
<filter_editor label="Filtrer les textures" name="inventory search editor"/>
<check_box initial_value="false" label="Afficher les dossiers" name="show_folders_check"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/fr/floater_texture_fetch_debugger.xml
index f0cc95319d..caae15ea17 100644
--- a/indra/newview/skins/default/xui/fr/floater_texture_fetch_debugger.xml
+++ b/indra/newview/skins/default/xui/fr/floater_texture_fetch_debugger.xml
@@ -45,10 +45,23 @@
<text name="total_time_refetch_vis_cache_label">
15, nouvelle récupération des données visibles du cache, Durée : [TIME] secondes, Récupéré : [SIZE] Ko, [PIXEL] Mpixels
</text>
+ <text name="total_time_refetch_all_cache_label">
+ 16, nouvelle récupération de toutes les textures du cache, Durée : [TIME] secondes, Récupéré : [SIZE] Ko, [PIXEL] Mpixels
+ </text>
<text name="total_time_refetch_vis_http_label">
- 16, nouvelle récupération des données visibles de la requête HTTP, Durée : [TIME] secondes, Récupéré : [SIZE] Ko, [PIXEL] Mpixels
+ 17, nouvelle récupération des données visibles de la requête HTTP, Durée : [TIME] secondes, Récupéré : [SIZE] Ko, [PIXEL] Mpixels
+ </text>
+ <text name="total_time_refetch_all_http_label">
+ 18, nouvelle récupération de toutes les textures de la requête HTTP, Durée : [TIME] secondes, Récupéré : [SIZE] Ko, [PIXEL] Mpixels
+ </text>
+ <spinner label="19, taux de texels/pixels :" name="texel_pixel_ratio"/>
+ <text name="texture_source_label">
+ 20, source des textures :
</text>
- <spinner label="17, taux de texels/pixels :" name="texel_pixel_ratio"/>
+ <radio_group name="texture_source">
+ <radio_item label="Cache + HTTP" name="0"/>
+ <radio_item label="HTTP uniquement" name="1"/>
+ </radio_group>
<button label="Démarrer" name="start_btn"/>
<button label="Réinitialiser" name="clear_btn"/>
<button label="Fermer" name="close_btn"/>
@@ -58,5 +71,7 @@
<button label="Décoder" name="decode_btn"/>
<button label="Texture GL" name="gl_btn"/>
<button label="Récupérer à nouveau les données visibles du cache" name="refetchviscache_btn"/>
+ <button label="Récupérer cache" name="refetchallcache_btn"/>
<button label="Récupérer à nouveau les données visibles de la requête HTTP" name="refetchvishttp_btn"/>
+ <button label="Récupérer HTTP" name="refetchallhttp_btn"/>
</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 aeeb462ac6..eb084d9184 100644
--- a/indra/newview/skins/default/xui/fr/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/fr/floater_top_objects.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="top_objects" title="Objets les plus utilisés">
+<floater name="top_objects" title="Objets les plus consommateurs">
<floater.string name="top_scripts_title">
Scripts les plus consommateurs
</floater.string>
@@ -45,7 +45,7 @@
<text name="owner_name_text">
Propriétaire :
</text>
- <button label="Filtre" name="filter_owner_btn"/>
+ <button label="Filtrer" name="filter_owner_btn"/>
<text name="parcel_name_text">
Parcelle :
</text>
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
deleted file mode 100644
index 8ef1529e6b..0000000000
--- a/indra/newview/skins/default/xui/fr/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?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_inventory.xml b/indra/newview/skins/default/xui/fr/menu_inventory.xml
index 59dcff9075..627d3068c3 100644
--- a/indra/newview/skins/default/xui/fr/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inventory.xml
@@ -68,6 +68,7 @@
<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="Copier la SLurl" name="url_copy"/>
<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"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index 3982a6159f..85020afe25 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -8,7 +8,7 @@
<menu_item_call label="Nouvelle fenêtre d&apos;inventaire" name="NewInventoryWindow"/>
<menu_item_call label="Endroits..." name="Places"/>
<menu_item_call label="Favoris..." name="Picks"/>
- <menu_item_call label="Caméra..." name="Camera Controls"/>
+ <menu_item_call label="Contrôles de la caméra..." name="Camera Controls"/>
<menu label="Déplacement" name="Movement">
<menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
<menu_item_check label="Voler" name="Fly"/>
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index bb23a1063d..30154d1873 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -1202,7 +1202,7 @@ par une carte [THIS_GPU].
Vous avez été téléporté vers une région voisine.
</notification>
<notification name="AvatarMovedLast">
- Votre dernière destination n&apos;est pas disponible actuellement.
+ La destination demandée n&apos;est pas disponible actuellement.
Vous avez été téléporté vers une région voisine.
</notification>
<notification name="AvatarMovedHome">
@@ -1221,7 +1221,7 @@ Vous pouvez utiliser [SECOND_LIFE] normalement, les autres résidents vous voien
L&apos;installation de [APP_NAME] est terminée.
Si vous utilisez [SECOND_LIFE] pour la première fois, vous devez ouvrir un compte avant de pouvoir vous connecter.
- <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Nouveau compte..."/>
+ <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Créer un compte..."/>
</notification>
<notification name="LoginPacketNeverReceived">
Nous avons des difficultés à vous connecter. Il y a peut-être un problème avec votre connexion Internet ou la [SECOND_LIFE_GRID].
@@ -3233,19 +3233,58 @@ Cliquez sur un point dans le monde et faites glisser votre souris pour faire tou
Cette action masquera tous les boutons et articles de menu. Pour les récupérer, cliquez de nouveau sur [SHORTCUT].
<usetemplate ignoretext="Confirmer avant de masquer l&apos;interface" name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnRestricted">
- Certains groupes de liens sélectionnés ne peuvent pas être définis sur [REQUESTED_TYPE] en raison des restrictions d&apos;autorisation définies les concernant. Ces groupes de liens seront définis sur [RESTRICTED_TYPE].
+ <notification name="PathfindingLinksets_WarnOnPhantom">
+ L&apos;indicateur Fantôme de certains groupes de liens sélectionnés basculera.
+
+Voulez-vous continuer ?
+ <usetemplate ignoretext="L&apos;indicateur Fantôme de certains groupes de liens basculera." name="okcancelignore" notext="Annuler" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted">
+ Certains groupes de liens sélectionnés ne peuvent pas être définis sur [REQUESTED_TYPE] en raison des restrictions d&apos;autorisation les concernant. Ces groupes de liens seront définis sur [RESTRICTED_TYPE].
+
+Voulez-vous continuer ?
<usetemplate ignoretext="Certains groupes de liens sélectionnés ne peuvent pas être définis en raison des restrictions d&apos;autorisation les concernant." name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnVolume">
+ <notification name="PathfindingLinksets_MismatchOnVolume">
Certains groupes de liens sélectionnés ne peuvent pas être définis sur [REQUESTED_TYPE] en raison d&apos;une forme non convexe.
+
+Voulez-vous continuer ?
<usetemplate ignoretext="Certains groupes de liens sélectionnés ne peuvent pas être définis en raison d&apos;une forme non convexe." name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnRestrictedAndVolume">
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted">
+ L&apos;indicateur Fantôme de certains groupes de liens sélectionnés basculera.
+
+Certains groupes de liens sélectionnés ne peuvent pas être définis sur [REQUESTED_TYPE] en raison des restrictions d&apos;autorisation les concernant. Ces groupes de liens seront définis sur [RESTRICTED_TYPE].
+
+Voulez-vous continuer ?
+ <usetemplate ignoretext="L&apos;indicateur Fantôme de certains groupes de liens sélectionnés basculera et d&apos;autres ne peuvent pas être définis en raison de restrictions d&apos;autorisation sur les groupes de liens." name="okcancelignore" notext="Annuler" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnVolume">
+ L&apos;indicateur Fantôme de certains groupes de liens sélectionnés basculera.
+
+Certains groupes de liens sélectionnés ne peuvent pas être définis sur [REQUESTED_TYPE] en raison d&apos;une forme non convexe.
+
+Voulez-vous continuer ?
+ <usetemplate ignoretext="L&apos;indicateur Fantôme de certains groupes de liens sélectionnés basculera et d&apos;autres ne peuvent pas être définis en raison d&apos;une forme non convexe." name="okcancelignore" notext="Annuler" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted_MismatchOnVolume">
Certains groupes de liens sélectionnés ne peuvent pas être définis sur [REQUESTED_TYPE] en raison des restrictions d&apos;autorisation les concernant. Ces groupes de liens seront définis sur [RESTRICTED_TYPE].
- Certains groupes de liens sélectionnés ne peuvent pas être définis sur [REQUESTED_TYPE] en raison d&apos;une forme non convexe. Les types d&apos;usage de ces groupes de liens ne seront pas modifiés.
+
+Certains groupes de liens sélectionnés ne peuvent pas être définis sur [REQUESTED_TYPE] en raison d&apos;une forme non convexe. Les types d&apos;usage de ces groupes de liens ne seront pas modifiés.
+
+Voulez-vous continuer ?
<usetemplate ignoretext="Certains groupes de liens sélectionnés ne peuvent pas être définis en raison des restrictions d&apos;autorisation les concernant et d&apos;une forme non convexe." name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted_MismatchOnVolume">
+ L&apos;indicateur Fantôme de certains groupes de liens sélectionnés basculera.
+
+Certains groupes de liens sélectionnés ne peuvent pas être définis sur [REQUESTED_TYPE] en raison des restrictions d&apos;autorisation les concernant. Ces groupes de liens seront définis sur [RESTRICTED_TYPE].
+
+Certains groupes de liens sélectionnés ne peuvent pas être définis sur [REQUESTED_TYPE] en raison d&apos;une forme non convexe. Les types d&apos;usage de ces groupes de liens ne seront pas modifiés.
+
+Voulez-vous continuer ?
+ <usetemplate ignoretext="L&apos;indicateur Fantôme de certains groupes de liens sélectionnés basculera et d&apos;autres ne peuvent pas être définis en raison de restrictions d&apos;autorisation sur les groupes de liens et d&apos;une forme non convexe." name="okcancelignore" notext="Annuler" yestext="OK"/>
+ </notification>
<notification name="PathfindingLinksets_ChangeToFlexiblePath">
L&apos;objet sélectionné affecte le maillage de navigation. Si vous le modifiez en Flexibilité, il sera supprimé de ce maillage.
<usetemplate ignoretext="L&apos;objet sélectionné affecte le maillage de navigation. Si vous le modifiez en Flexibilité, il sera supprimé de ce maillage." name="okcancelignore" notext="Annuler" yestext="OK"/>
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
index f54bed4fae..96add2a74b 100644
--- a/indra/newview/skins/default/xui/fr/panel_block_list_sidetray.xml
+++ b/indra/newview/skins/default/xui/fr/panel_block_list_sidetray.xml
@@ -5,6 +5,6 @@
</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="Ignorer un objet par son nom" label_selected="Ignorer un objet par son 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_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml
index 7843513e00..c8a1fe8751 100644
--- a/indra/newview/skins/default/xui/fr/panel_login.xml
+++ b/indra/newview/skins/default/xui/fr/panel_login.xml
@@ -23,7 +23,7 @@
<combo_box name="start_location_combo">
<combo_box.item label="Dernier emplacement" name="MyLastLocation"/>
<combo_box.item label="Domicile" name="MyHome"/>
- <combo_box.item label="&lt;Saisir le nom de la région&gt;" name="Typeregionname"/>
+ <combo_box.item label="&lt;Nom de la région&gt;" name="Typeregionname"/>
</combo_box>
</layout_panel>
<layout_panel name="links_login_panel">
@@ -38,9 +38,9 @@
</layout_panel>
<layout_panel name="links">
<text name="create_account_text">
- CREATE YǾUR ACCǾUNT
+ CRÉER VOTRE COMPTE
</text>
- <button name="create_new_account_btn" label="S&apos;inscrire"/>
+ <button label="Commencer" name="create_new_account_btn"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/fr/panel_navmesh_rebake.xml
deleted file mode 100644
index 7acf092257..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_navmesh_rebake">
- <button label="Refiger la région" name="navmesh_btn" tool_tip="Cliquer pour refiger le maillage de navigation de la région."/>
- <button label="Demande consistant à refiger la région en cours..." name="navmesh_btn_sending" tool_tip="Envoi de la demande consistant à refiger la région au serveur..."/>
- <button label="La région se refige..." name="navmesh_btn_baking" tool_tip="La région se refige. Ce bouton disparaîtra lorsque le processus sera terminé."/>
-</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml
index 82cdf292ab..762dee01bb 100644
--- a/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="chat_bar">
+<panel name="nearby_chat">
<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_postcard_settings.xml b/indra/newview/skins/default/xui/fr/panel_postcard_settings.xml
index 6f4e9c23f9..945a5e0272 100644
--- a/indra/newview/skins/default/xui/fr/panel_postcard_settings.xml
+++ b/indra/newview/skins/default/xui/fr/panel_postcard_settings.xml
@@ -9,12 +9,12 @@
</combo_box>
<layout_stack name="postcard_image_params_ls">
<layout_panel name="postcard_image_size_lp">
- <spinner label="Largeur" name="postcard_snapshot_width"/>
- <spinner label="Hauteur" name="postcard_snapshot_height"/>
+ <spinner label="Larg." name="postcard_snapshot_width"/>
+ <spinner label="Haut." name="postcard_snapshot_height"/>
<check_box label="Conserver les proportions" name="postcard_keep_aspect_check"/>
</layout_panel>
<layout_panel name="postcard_image_format_quality_lp">
- <slider label="Qualité de l&apos;image" name="image_quality_slider"/>
+ <slider label="Qualité image" name="image_quality_slider"/>
<text name="image_quality_level">
([QLVL])
</text>
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 b15af0d1f2..98ae250215 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_debug.xml
@@ -36,5 +36,5 @@
<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="?" left="177" name="restart_help"/>
- <button label="Annuler le redémarrage" name="cancel_restart_btn" tool_tip="Retarder le redémarrage de la région d&apos;une heure" width="160"/>
+ <button label="Annuler le redémarrage" name="cancel_restart_btn" tool_tip="Annuler le redémarrage de la région." width="160"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
index f40bcec908..472c4a5e8f 100644
--- a/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
@@ -4,7 +4,7 @@
Enregistrer dans l&apos;inventaire
</text>
<text name="hint_lbl">
- L&apos;enregistrement d&apos;une image dans votre inventaire coûte [UPLOAD_COST] L$. Pour enregistrer votre image sous forme de texture, sélectionnez l&apos;un des formats carrés.
+ L&apos;enregistrement d&apos;une image dans l&apos;inventaire coûte [UPLOAD_COST] L$. Pour enregistrer votre image sous forme de texture, sélectionnez un format carré.
</text>
<combo_box label="Résolution" name="texture_size_combo">
<combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_local.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_local.xml
index 48ccacb374..97dc3e7e2b 100644
--- a/indra/newview/skins/default/xui/fr/panel_snapshot_local.xml
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_local.xml
@@ -25,7 +25,7 @@
<combo_box.item label="JPEG" name="JPEG"/>
<combo_box.item label="BMP (sans perte)" name="BMP"/>
</combo_box>
- <slider label="Qualité d&apos;image" name="image_quality_slider"/>
+ <slider label="Qualité image" name="image_quality_slider"/>
<text name="image_quality_level">
([QLVL])
</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/fr/panel_volume_pulldown.xml
new file mode 100644
index 0000000000..e05c93a4ac
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_volume_pulldown.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="volumepulldown_floater">
+ <slider label="Principal" name="System Volume"/>
+ <slider label="Boutons" name="UI Volume"/>
+ <slider label="Ambiant" name="Wind Volume"/>
+ <slider label="Sons" name="SFX Volume"/>
+ <check_box name="gesture_audio_play_btn" tool_tip="Activer les sons des gestes."/>
+ <slider label="Musique" name="Music Volume"/>
+ <check_box name="enable_music" tool_tip="Activer les flux de musique."/>
+ <slider label="Médias" name="Media Volume"/>
+ <check_box name="enable_media" tool_tip="Activer les flux de média."/>
+ <slider label="Voix" name="Voice Volume"/>
+ <check_box name="enable_voice_check" tool_tip="Activer le chat vocal."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 6dc1439593..6a2a3f559a 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -137,7 +137,7 @@
Quitter
</string>
<string name="create_account_url">
- http://join.secondlife.com/index.php?lang=fr-FR
+ http://join.secondlife.com/index.php?lang=fr-FR&amp;sourceid=[sourceid]
</string>
<string name="LoginFailedViewerNotPermitted">
Le client que vous utilisez ne permet plus d&apos;accéder à Second Life. Téléchargez un nouveau client à la page suivante :
@@ -1414,6 +1414,12 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="InvFolder favorite">
Mes Favoris
</string>
+ <string name="InvFolder Favorites">
+ Mes favoris
+ </string>
+ <string name="InvFolder favorites">
+ Mes favoris
+ </string>
<string name="InvFolder Current Outfit">
Tenue actuelle
</string>
@@ -1429,6 +1435,12 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="InvFolder Meshes">
Maillages
</string>
+ <string name="InvFolder Received Items">
+ Articles reçus
+ </string>
+ <string name="InvFolder Merchant Outbox">
+ Boîte d&apos;envoi vendeur
+ </string>
<string name="InvFolder Friends">
Amis
</string>
@@ -4902,7 +4914,7 @@ Essayez avec le chemin d&apos;accès à l&apos;éditeur entre guillemets doubles
Parler
</string>
<string name="Command_View_Label">
- Paramètres de la caméra
+ Caméra
</string>
<string name="Command_Voice_Label">
Paramètres vocaux
diff --git a/indra/newview/skins/default/xui/it/floater_chat_bar.xml b/indra/newview/skins/default/xui/it/floater_chat_bar.xml
index 94c85b50c8..b47e32ce90 100644
--- a/indra/newview/skins/default/xui/it/floater_chat_bar.xml
+++ b/indra/newview/skins/default/xui/it/floater_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="chat_bar" title="CHAT NEI DINTORNI">
+<floater name="nearby_chat" title="CHAT NEI DINTORNI">
<panel name="bottom_panel">
<line_editor label="Clicca qui per la chat." name="chat_box" tool_tip="Premi Invio per parlare, Ctrl+Invio per gridare"/>
<button name="show_nearby_chat" tool_tip="Mostra/Nasconde il registro della chat nei dintorni"/>
diff --git a/indra/newview/skins/default/xui/it/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/it/floater_pathfinding_linksets.xml
index 2c6d620b0a..7edac3ff46 100644
--- a/indra/newview/skins/default/xui/it/floater_pathfinding_linksets.xml
+++ b/indra/newview/skins/default/xui/it/floater_pathfinding_linksets.xml
@@ -30,6 +30,9 @@
<floater.string name="linkset_terrain_owner">
--
</floater.string>
+ <floater.string name="linkset_terrain_scripted">
+ --
+ </floater.string>
<floater.string name="linkset_terrain_land_impact">
--
</floater.string>
@@ -45,6 +48,15 @@
<floater.string name="linkset_owner_group">
[gruppo]
</floater.string>
+ <floater.string name="linkset_is_scripted">
+ Sì
+ </floater.string>
+ <floater.string name="linkset_is_not_scripted">
+ No
+ </floater.string>
+ <floater.string name="linkset_is_unknown_scripted">
+ Sconosciuto
+ </floater.string>
<floater.string name="linkset_use_walkable">
Camminabile
</floater.string>
@@ -94,6 +106,7 @@
<scroll_list.columns label="Nome (prim principale)" name="name"/>
<scroll_list.columns label="Descrizione (prim principale)" name="description"/>
<scroll_list.columns label="Proprietario" name="owner"/>
+ <scroll_list.columns label="Scriptato" name="scripted"/>
<scroll_list.columns label="Impatto" name="land_impact"/>
<scroll_list.columns label="Distanza" name="dist_from_you"/>
<scroll_list.columns label="Uso set collegati" name="linkset_use"/>
diff --git a/indra/newview/skins/default/xui/it/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/it/floater_texture_fetch_debugger.xml
index 57e65c3456..49b6453319 100644
--- a/indra/newview/skins/default/xui/it/floater_texture_fetch_debugger.xml
+++ b/indra/newview/skins/default/xui/it/floater_texture_fetch_debugger.xml
@@ -45,10 +45,23 @@
<text name="total_time_refetch_vis_cache_label">
15, Nuovo fetching elementi visibili dalla cache, Tempo: [TIME] secondi, fetching: [SIZE] KB, [PIXEL] MPixels
</text>
+ <text name="total_time_refetch_all_cache_label">
+ 16, Nuovo fetching di tutte le texture dalla cache, Tempo: [TIME] secondi, fetching: [SIZE] KB, [PIXEL] MPixels
+ </text>
<text name="total_time_refetch_vis_http_label">
- 16, Nuovo fetching elementi visibili da HTTP, Tempo: [TIME] secondi, fetching: [SIZE] KB, [PIXEL] MPixels
+ 17, Nuovo fetching elementi visibili da HTTP, Tempo: [TIME] secondi, fetching: [SIZE] KB, [PIXEL] MPixels
+ </text>
+ <text name="total_time_refetch_all_http_label">
+ 18, Nuovo fetching di tutte le texture da HTTP, Tempo: [TIME] secondi, fetching: [SIZE] KB, [PIXEL] MPixels
+ </text>
+ <spinner label="19, Rapporto Texel/Pixel:" name="texel_pixel_ratio"/>
+ <text name="texture_source_label">
+ 20, Fonte texture:
</text>
- <spinner label="17, Rapporto Texel/Pixel:" name="texel_pixel_ratio"/>
+ <radio_group name="texture_source">
+ <radio_item label="Cache + HTTP" name="0"/>
+ <radio_item label="Solo HTTP" name="1"/>
+ </radio_group>
<button label="Attiva" name="start_btn"/>
<button label="Reimposta" name="clear_btn"/>
<button label="Chiudi" name="close_btn"/>
@@ -58,5 +71,7 @@
<button label="Decodifica" name="decode_btn"/>
<button label="Texture GL" name="gl_btn"/>
<button label="Nuovo fetch visibili cache" name="refetchviscache_btn"/>
+ <button label="Nuovo fetching di tutta la cache" name="refetchallcache_btn"/>
<button label="Nuovo fetch visibili HTTP" name="refetchvishttp_btn"/>
+ <button label="Nuovo fetching di tutto il contenuto HTTP" name="refetchallhttp_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/menu_im_well_button.xml b/indra/newview/skins/default/xui/it/menu_im_well_button.xml
deleted file mode 100644
index 9e471b771c..0000000000
--- a/indra/newview/skins/default/xui/it/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="IM Well Button Context Menu">
- <menu_item_call label="Chiudi tutto" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inventory.xml b/indra/newview/skins/default/xui/it/menu_inventory.xml
index 4bf6be82fd..b31e35771d 100644
--- a/indra/newview/skins/default/xui/it/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/it/menu_inventory.xml
@@ -68,6 +68,7 @@
<menu_item_call label="Elimina la cartella di sistema" name="Delete System Folder"/>
<menu_item_call label="Inizia la conferenza chat" name="Conference Chat Folder"/>
<menu_item_call label="Esegui" name="Sound Play"/>
+ <menu_item_call label="Copia SLurl" name="url_copy"/>
<menu_item_call label="Informazioni sul punto di riferimento" name="About Landmark"/>
<menu_item_call label="Riproduci in Second Life" name="Animation Play"/>
<menu_item_call label="Esegui localmente" name="Animation Audition"/>
diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml
index 9bdce2e2f6..d5fdde4e7d 100644
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -1207,7 +1207,7 @@ a &apos;[THIS_GPU]&apos;
Sei stato trasferito in una regione vicina.
</notification>
<notification name="AvatarMovedLast">
- La tua ultima posizione non è al momento disponibile.
+ La posizione richiesta non è al momento disponibile.
Sei stato trasferito in una regione vicina.
</notification>
<notification name="AvatarMovedHome">
@@ -1226,7 +1226,7 @@ Puoi comunque usare [SECOND_LIFE] normalmente e gli altri residenti ti vedranno
L&apos;installazione di [APP_NAME] è terminata.
Se questa è la prima volta che usi [SECOND_LIFE], devi creare un account prima che tu possa effettuare l&apos;accesso.
- <usetemplate name="okcancelbuttons" notext="Continua" yestext="Nuovo Account..."/>
+ <usetemplate name="okcancelbuttons" notext="Continua" yestext="Crea account..."/>
</notification>
<notification name="LoginPacketNeverReceived">
Ci sono problemi di connessione. È possibile che ci siano problemi con la tua connessione Internet oppure sulla [SECOND_LIFE_GRID].
@@ -3238,19 +3238,58 @@ Clicca e trascina dovunque nel mondo per ruotare la visuale
Questa azione cancellerà tutte le voci di menu e i pulsanti. Per visualizzarli nuovamente cliccare ancora [SHORTCUT].
<usetemplate ignoretext="Conferma prima di nascondere l&apos;interfaccia" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnRestricted">
+ <notification name="PathfindingLinksets_WarnOnPhantom">
+ L&apos;indicatore oggetto fantasma di alcuni set collegati verrà commutato.
+
+Vuoi continuare?
+ <usetemplate ignoretext="L&apos;indicatore oggetto fantasma di alcuni set collegati verrà commutato." name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted">
Alcuni set collegati selezionati non possono essere impostati su &apos;[REQUESTED_TYPE]&apos; a causa di limitazioni nelle autorizzazioni per i set collegati. Questi set collegati verranno invece impostati su &apos;[RESTRICTED_TYPE]&apos;.
+
+Vuoi continuare?
<usetemplate ignoretext="Alcuni set collegati selezionati non possono essere impostati a causa di limitazioni nelle autorizzazioni per i set collegati." name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnVolume">
+ <notification name="PathfindingLinksets_MismatchOnVolume">
Alcuni set collegati selezionati non possono essere impostati a &apos;[REQUESTED_TYPE]&apos; perché la forma è non-convessa.
+
+Vuoi continuare?
<usetemplate ignoretext="Alcuni set collegati selezionati non possono essere impostati perché la forma è non-convessa." name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnRestrictedAndVolume">
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted">
+ L&apos;indicatore oggetto fantasma di alcuni set collegati verrà commutato.
+
+Alcuni set collegati selezionati non possono essere impostati su &apos;[REQUESTED_TYPE]&apos; a causa di limitazioni nelle autorizzazioni per i set collegati. Questi set collegati verranno invece impostati su &apos;[RESTRICTED_TYPE]&apos;.
+
+Vuoi continuare?
+ <usetemplate ignoretext="L&apos;indicatore oggetto fantasma per alcuni set collegati selezionati verrà commutato, mentre quello degli altri non può essere impostato a causa di limitazioni nelle autorizzazioni per i set collegati." name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnVolume">
+ L&apos;indicatore oggetto fantasma di alcuni set collegati verrà commutato.
+
+Alcuni set collegati selezionati non possono essere impostati a &apos;[REQUESTED_TYPE]&apos; perché la forma è non-convessa.
+
+Vuoi continuare?
+ <usetemplate ignoretext="L&apos;indicatore oggetto fantasma per alcuni set collegati selezionati verrà commutato, mentre quello degli altri non può essere impostato perché la forma è non-convessa." name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted_MismatchOnVolume">
Alcuni set collegati selezionati non possono essere impostati su &apos;[REQUESTED_TYPE]&apos; a causa di limitazioni nelle autorizzazioni per i set collegati. Questi set collegati verranno invece impostati su &apos;[RESTRICTED_TYPE]&apos;.
- Alcuni set collegati selezionati non possono essere impostati a &apos;[REQUESTED_TYPE]&apos; perché la forma è non-convessa. Il tipo di utilizzo di questi set collegati non cambierà.
+
+Alcuni set collegati selezionati non possono essere impostati a &apos;[REQUESTED_TYPE]&apos; perché la forma è non-convessa. Il tipo di utilizzo di questi set collegati non cambierà.
+
+Vuoi continuare?
<usetemplate ignoretext="Alcuni set collegati selezionati non possono essere impostati a causa delle limitazioni nelle autorizzazioni per il set collegato e perché la forma è non-convessa." name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted_MismatchOnVolume">
+ L&apos;indicatore oggetto fantasma di alcuni set collegati verrà commutato.
+
+Alcuni set collegati selezionati non possono essere impostati su &apos;[REQUESTED_TYPE]&apos; a causa di limitazioni nelle autorizzazioni per i set collegati. Questi set collegati verranno invece impostati su &apos;[RESTRICTED_TYPE]&apos;.
+
+Alcuni set collegati selezionati non possono essere impostati a &apos;[REQUESTED_TYPE]&apos; perché la forma è non-convessa. Il tipo di utilizzo di questi set collegati non cambierà.
+
+Vuoi continuare?
+ <usetemplate ignoretext="L&apos;indicatore oggetto fantasma per alcuni set collegati selezionati verrà commutato, mentre quello degli altri non può essere impostato a causa delle limitazioni nelle autorizzazioni per il set collegato e perché la forma è non-convessa." name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
<notification name="PathfindingLinksets_ChangeToFlexiblePath">
L&apos;oggetto selezionato influenza il navmesh. Se lo si trasforma in un percorso flessibile verrà rimosso dal navmesh.
<usetemplate ignoretext="L&apos;oggetto selezionato influenza il navmesh. Se lo si trasforma in un percorso flessibile verrà rimosso dal navmesh." name="okcancelignore" notext="Annulla" yestext="OK"/>
diff --git a/indra/newview/skins/default/xui/it/panel_login.xml b/indra/newview/skins/default/xui/it/panel_login.xml
index 02a3f8271c..2afde40940 100644
--- a/indra/newview/skins/default/xui/it/panel_login.xml
+++ b/indra/newview/skins/default/xui/it/panel_login.xml
@@ -38,9 +38,9 @@
</layout_panel>
<layout_panel name="links">
<text name="create_account_text">
- CREATE YǾUR ACCǾUNT
+ CREA IL TUO ACCOUNT
</text>
- <button name="create_new_account_btn" label="Iscriviti"/>
+ <button label="Inizia adesso" name="create_new_account_btn"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/it/panel_navmesh_rebake.xml
deleted file mode 100644
index 432754076a..0000000000
--- a/indra/newview/skins/default/xui/it/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_navmesh_rebake">
- <button label="Rebake regione" name="navmesh_btn" tool_tip="Fai clic per eseguire rebake sul navmesh della regione"/>
- <button label="Richiesta rebake" name="navmesh_btn_sending" tool_tip="Invio richiesta rebake al server."/>
- <button label="Rebake regione in corso" name="navmesh_btn_baking" tool_tip="Rebake della regione in corso. Al termine, questo pulsante non sarà più visibile."/>
-</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/it/panel_nearby_chat_bar.xml
index 6317d3192e..1fef88870a 100644
--- a/indra/newview/skins/default/xui/it/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/it/panel_nearby_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="chat_bar">
+<panel name="nearby_chat">
<string name="min_width">
192
</string>
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 789dade097..aba60d03aa 100644
--- a/indra/newview/skins/default/xui/it/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/it/panel_region_debug.xml
@@ -36,5 +36,5 @@
<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="Annulla riavvio" name="cancel_restart_btn" tool_tip="Ritarda il riavvio della regione di un&apos;ora"/>
+ <button label="Annulla riavvio" name="cancel_restart_btn" tool_tip="Annulla riavvio regione"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/it/panel_volume_pulldown.xml
index 1792b09413..bc17fc0c89 100644
--- a/indra/newview/skins/default/xui/it/panel_volume_pulldown.xml
+++ b/indra/newview/skins/default/xui/it/panel_volume_pulldown.xml
@@ -1,15 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="volumepulldown_floater" width="220">
- <button left="197" name="prefs_btn"/>
- <slider label="Generale" name="System Volume" label_width="60" width="160"/>
- <slider label="Interfaccia" name="UI Volume" label_width="60" width="160"/>
- <slider label="Ambiente" name="Wind Volume" label_width="60" width="160"/>
- <slider label="Suoni" name="SFX Volume" label_width="60" width="160"/>
- <check_box name="gesture_audio_play_btn" tool_tip="Attiva suoni Gesture"/>
- <slider label="Musica" name="Music Volume" label_width="60" width="160"/>
- <check_box tool_tip="Abilita musica in streaming" name="enable_music"/>
- <slider label="Media" name="Media Volume" label_width="60" width="160"/>
- <check_box tool_tip="Abilita riproduzione media" name="enable_media"/>
- <slider label="Voice" name="Voice Volume" label_width="60" width="160"/>
- <check_box tool_tip="Abilita il voice" name="enable_voice_check"/>
+ <button left="197" name="prefs_btn"/>
+ <slider label="Principale" label_width="60" name="System Volume" width="160"/>
+ <slider label="Pulsanti" label_width="60" name="UI Volume" width="160"/>
+ <slider label="Ambiente" label_width="60" name="Wind Volume" width="160"/>
+ <slider label="Suoni" label_width="60" name="SFX Volume" width="160"/>
+ <check_box name="gesture_audio_play_btn" tool_tip="Attiva suoni dai gesti"/>
+ <slider label="Musica" label_width="60" name="Music Volume" width="160"/>
+ <check_box name="enable_music" tool_tip="Attiva streaming musica"/>
+ <slider label="Multimedia" label_width="60" name="Media Volume" width="160"/>
+ <check_box name="enable_media" tool_tip="Attiva streaming multimediale"/>
+ <slider label="Voce" label_width="60" name="Voice Volume" width="160"/>
+ <check_box name="enable_voice_check" tool_tip="Attiva chat vocale"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index f2afcafbea..fb1e387468 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -134,7 +134,7 @@
Esci
</string>
<string name="create_account_url">
- http://join.secondlife.com/index.php?lang=it-IT
+ http://join.secondlife.com/index.php?lang=it-IT&amp;sourceid=[sourceid]
</string>
<string name="LoginFailedViewerNotPermitted">
Il viewer utilizzato non è più in grado di accedere a Second Life. Visita la parina seguente per scaricare un nuovo viewer:
@@ -1399,6 +1399,12 @@ Prova ad accedere nuovamente tra un minuto.
<string name="InvFolder favorite">
I miei preferiti
</string>
+ <string name="InvFolder Favorites">
+ I miei preferiti
+ </string>
+ <string name="InvFolder favorites">
+ I miei preferiti
+ </string>
<string name="InvFolder Current Outfit">
Abbigliamento attuale
</string>
@@ -1414,6 +1420,12 @@ Prova ad accedere nuovamente tra un minuto.
<string name="InvFolder Meshes">
Reticoli
</string>
+ <string name="InvFolder Received Items">
+ Oggetti ricevuti
+ </string>
+ <string name="InvFolder Merchant Outbox">
+ Casella venditore in uscita
+ </string>
<string name="InvFolder Friends">
Amici
</string>
diff --git a/indra/newview/skins/default/xui/ja/floater_chat_bar.xml b/indra/newview/skins/default/xui/ja/floater_chat_bar.xml
index 11f223ade6..9f5df6fb85 100644
--- a/indra/newview/skins/default/xui/ja/floater_chat_bar.xml
+++ b/indra/newview/skins/default/xui/ja/floater_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="chat_bar" title="近くのチャット">
+<floater name="nearby_chat" title="近くのチャット">
<panel name="bottom_panel">
<line_editor label="ここをクリックしてチャットを開始します。" name="chat_box" tool_tip="Enter キーを押して話し、Ctrl + Enter キーで叫びます。"/>
<button name="show_nearby_chat" tool_tip="近くのチャットログを表示/非表示"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml
index d05a74fe09..4441d5e738 100644
--- a/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml
@@ -30,6 +30,9 @@
<floater.string name="linkset_terrain_owner">
--
</floater.string>
+ <floater.string name="linkset_terrain_scripted">
+ --
+ </floater.string>
<floater.string name="linkset_terrain_land_impact">
--
</floater.string>
@@ -45,6 +48,15 @@
<floater.string name="linkset_owner_group">
[group]
</floater.string>
+ <floater.string name="linkset_is_scripted">
+ はい
+ </floater.string>
+ <floater.string name="linkset_is_not_scripted">
+ いいえ
+ </floater.string>
+ <floater.string name="linkset_is_unknown_scripted">
+ 不明
+ </floater.string>
<floater.string name="linkset_use_walkable">
歩行可能
</floater.string>
@@ -94,6 +106,7 @@
<scroll_list.columns label="名前(ルートプリム)" name="name"/>
<scroll_list.columns label="説明(ルートプリム)" name="description"/>
<scroll_list.columns label="所有者" name="owner"/>
+ <scroll_list.columns label="スクリプト" name="scripted"/>
<scroll_list.columns label="負荷" name="land_impact"/>
<scroll_list.columns label="距離" name="dist_from_you"/>
<scroll_list.columns label="リンクセットの用途" name="linkset_use"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/ja/floater_texture_fetch_debugger.xml
index 4efdf7d40d..adc35137b5 100644
--- a/indra/newview/skins/default/xui/ja/floater_texture_fetch_debugger.xml
+++ b/indra/newview/skins/default/xui/ja/floater_texture_fetch_debugger.xml
@@ -45,10 +45,23 @@
<text name="total_time_refetch_vis_cache_label">
15, キャッシュから表示テクスチャを再取得、時間:[TIME] 秒、取得:[SIZE]KB、[PIXEL]メガピクセル
</text>
+ <text name="total_time_refetch_all_cache_label">
+ 16、キャッシュからすべてのテクスチャを再フェッチ中、時間: [TIME] 秒、フェッチ済み: [SIZE]KB、[PIXEL]メガピクセル
+ </text>
<text name="total_time_refetch_vis_http_label">
- 16, HTTP から表示テクスチャを再取得、時間:[TIME] 秒、取得:[SIZE]KB、[PIXEL]メガピクセル
+ 17、HTTP から可視ファイルを再フェッチ中、時間: [TIME] 秒、フェッチ済み: [SIZE]KB、[PIXEL]メガピクセル
+ </text>
+ <text name="total_time_refetch_all_http_label">
+ 18、HTTP からすべてのテクスチャを再フェッチ中、時間: [TIME] 秒、フェッチ済み: [SIZE]KB、[PIXEL]メガピクセル
+ </text>
+ <spinner label="19、テセル/ピクセル比:" name="texel_pixel_ratio"/>
+ <text name="texture_source_label">
+ 20、テクスチャ ソース:
</text>
- <spinner label="17, テクセル/ピクセルの比率:" name="texel_pixel_ratio"/>
+ <radio_group name="texture_source">
+ <radio_item label="キャッシュ + HTTP" name="0"/>
+ <radio_item label="HTTP のみ" name="1"/>
+ </radio_group>
<button label="開始" name="start_btn"/>
<button label="リセット" name="clear_btn"/>
<button label="閉じる" name="close_btn"/>
@@ -58,5 +71,7 @@
<button label="デコード" name="decode_btn"/>
<button label="GL テクスチャ" name="gl_btn"/>
<button label="キャッシュ表示テクスチャ再取得" name="refetchviscache_btn"/>
+ <button label="すべてのキャッシュを再フェッチ" name="refetchallcache_btn"/>
<button label="HTTP表示テクスチャ再取得" name="refetchvishttp_btn"/>
+ <button label="すべての HTTP を再フェッチ" name="refetchallhttp_btn"/>
</floater>
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
deleted file mode 100644
index 3397004bd7..0000000000
--- a/indra/newview/skins/default/xui/ja/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?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_inventory.xml b/indra/newview/skins/default/xui/ja/menu_inventory.xml
index d1893a0fc8..106b09453a 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml
@@ -68,6 +68,7 @@
<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="SLurl をコピー" name="url_copy"/>
<menu_item_call label="ランドマークの情報" name="About Landmark"/>
<menu_item_call label="インワールドで再生する" name="Animation Play"/>
<menu_item_call label="ローカルで再生する" name="Animation Audition"/>
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index 9453e9ba3b..d5cff18a24 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -1240,7 +1240,7 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries を参照してく
近くのリージョンに移動しました。
</notification>
<notification name="AvatarMovedLast">
- 前回いた場所は現在ご利用いただけません。
+ リクエストされた場所は現在ご利用いただけません。
近くのリージョンに移動しました。
</notification>
<notification name="AvatarMovedHome">
@@ -1259,7 +1259,7 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries を参照してく
[APP_NAME] のインストールが完了しました。
[SECOND_LIFE] を使ったことがない場合は、ログインする前にアカウントの作成を行ってください。
- <usetemplate name="okcancelbuttons" notext="続行" yestext="新規アカウント..."/>
+ <usetemplate name="okcancelbuttons" notext="続行" yestext="アカウントを作成..."/>
</notification>
<notification name="LoginPacketNeverReceived">
接続がなかなかできません。 お使いのインターネット接続か、[SECOND_LIFE_GRID] の問題と考えられます。
@@ -3278,19 +3278,58 @@ M キーを押して変更します。
この操作により、全てのメニュー項目とボタンが非表示になります。再び表示するには [SHORTCUT] をもう一度クリックしてください。
<usetemplate ignoretext="UI を非表示にする前に確認" name="okcancelignore" notext="取り消し" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnRestricted">
+ <notification name="PathfindingLinksets_WarnOnPhantom">
+ 選択された一部のリンクセットはファントムフラグが切り替えられます。
+
+続けますか?
+ <usetemplate ignoretext="選択された一部のリンクセットのファントムフラグが切り替えられます。" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted">
一部の選択されたリンクセットは、リンクセットへの権限が制限されているため、&apos;[REQUESTED_TYPE]&apos; に設定できません。これらのリンクセットは代わりに &apos;[RESTRICTED_TYPE]&apos; に設定されます。
+
+続けますか?
<usetemplate ignoretext="一部の選択されたリンクセットは、リンクセットへの権限が制限されているため設定できません。" name="okcancelignore" notext="取り消し" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnVolume">
+ <notification name="PathfindingLinksets_MismatchOnVolume">
選択された一部のリンクセットは、形状が凸状でないため、&apos;[REQUESTED_TYPE]&apos; に設定できません。
+
+続けますか?
<usetemplate ignoretext="選択された一部のリンクセットは、形状が凸状でないため設定できません。" name="okcancelignore" notext="取り消し" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnRestrictedAndVolume">
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted">
+ 選択された一部のリンクセットはファントムフラグが切り替えられます。
+
+一部の選択されたリンクセットは、リンクセットへの権限が制限されているため、&apos;[REQUESTED_TYPE]&apos; に設定できません。これらのリンクセットは代わりに &apos;[RESTRICTED_TYPE]&apos; に設定されます。
+
+続けますか?
+ <usetemplate ignoretext="選択された一部のリンクセットのファントムフラグが切り替えられ、他のリンクセットはリンクセットへの権限が制限されているため設定できません。" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnVolume">
+ 選択された一部のリンクセットはファントムフラグが切り替えられます。
+
+選択された一部のリンクセットは、形状が凸状でないため、&apos;[REQUESTED_TYPE]&apos; に設定できません。
+
+続けますか?
+ <usetemplate ignoretext="選択された一部のリンクセットのファントムフラグが切り替えられ、他のリンクセットは形状が凸状でないため設定できません。" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted_MismatchOnVolume">
一部の選択されたリンクセットは、リンクセットへの権限が制限されているため、&apos;[REQUESTED_TYPE]&apos; に設定できません。これらのリンクセットは代わりに &apos;[RESTRICTED_TYPE]&apos; に設定されます。
+
選択された一部のリンクセットは、形状が凸状でないため、&apos;[REQUESTED_TYPE]&apos; に設定できません。これらのリンクセットの用途タイプは変わりません。
+
+続けますか?
<usetemplate ignoretext="一部の選択されたリンクセットは、リンクセットへの権限が制限されており、また形状が凸状でないため設定できません。" name="okcancelignore" notext="取り消し" yestext="OK"/>
</notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted_MismatchOnVolume">
+ 選択された一部のリンクセットはファントムフラグが切り替えられます。
+
+一部の選択されたリンクセットは、リンクセットへの権限が制限されているため、&apos;[REQUESTED_TYPE]&apos; に設定できません。これらのリンクセットは代わりに &apos;[RESTRICTED_TYPE]&apos; に設定されます。
+
+選択された一部のリンクセットは、形状が凸状でないため、&apos;[REQUESTED_TYPE]&apos; に設定できません。これらのリンクセットの用途タイプは変わりません。
+
+続けますか?
+ <usetemplate ignoretext="選択された一部のリンクセットのファントムフラグが切り替えられ、他のリンクセットはリンクセットへの権限が制限され、また形状が凸状でないため設定できません。" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ </notification>
<notification name="PathfindingLinksets_ChangeToFlexiblePath">
選択されたオブジェクトはナビメッシュに影響を与えます。オブジェクトをフレキシブルパスに変更すると、ナビメッシュから削除されます。
<usetemplate ignoretext="選択されたオブジェクトはナビメッシュに影響を与えます。オブジェクトをフレキシブルパスに変更すると、ナビメッシュから削除されます。" name="okcancelignore" notext="取り消し" yestext="OK"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml
index 780f7aa1ae..396d9e65b1 100644
--- a/indra/newview/skins/default/xui/ja/panel_login.xml
+++ b/indra/newview/skins/default/xui/ja/panel_login.xml
@@ -38,9 +38,9 @@
</layout_panel>
<layout_panel name="links">
<text name="create_account_text">
- CREATE YǾUR ACCǾUNT
+ アカウントを作成してください
</text>
- <button name="create_new_account_btn" label="お申し込み"/>
+ <button label="今すぐ開始" name="create_new_account_btn"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/ja/panel_navmesh_rebake.xml
deleted file mode 100644
index ea3ec32424..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_navmesh_rebake">
- <button label="地域の再構築" name="navmesh_btn" tool_tip="クリックしてこの地域のナビメッシュを再構築します。"/>
- <button label="再構築をリクエスト中" name="navmesh_btn_sending" tool_tip="再構築リクエストをサーバーに送信しています。"/>
- <button label="地域(リージョン)を再構築中" name="navmesh_btn_baking" tool_tip="地域を再構築しています。完了すると、このボタンは消えます。"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml
index 5998206f27..201fb0a376 100644
--- a/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="chat_bar">
+<panel name="nearby_chat">
<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_region_debug.xml b/indra/newview/skins/default/xui/ja/panel_region_debug.xml
index 7d1d837b73..169da27ce5 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_debug.xml
@@ -36,5 +36,5 @@
<button label="?" name="top_scripts_help"/>
<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="リージョンの再起動をキャンセル"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/ja/panel_volume_pulldown.xml
new file mode 100644
index 0000000000..967dedf061
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_volume_pulldown.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="volumepulldown_floater">
+ <slider label="マスター" name="System Volume"/>
+ <slider label="ボタン" name="UI Volume"/>
+ <slider label="環境音" name="Wind Volume"/>
+ <slider label="サウンド" name="SFX Volume"/>
+ <check_box name="gesture_audio_play_btn" tool_tip="ジェスチャーの音を有効にする"/>
+ <slider label="音楽" name="Music Volume"/>
+ <check_box name="enable_music" tool_tip="ストリーミング音楽を有効にする"/>
+ <slider label="メディア" name="Media Volume"/>
+ <check_box name="enable_media" tool_tip="ストリーミングメディアを有効にする"/>
+ <slider label="ボイス" name="Voice Volume"/>
+ <check_box name="enable_voice_check" tool_tip="ボイスチャットを有効にする"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index 7c3f9489da..50697e5500 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -137,7 +137,7 @@
終了
</string>
<string name="create_account_url">
- http://join.secondlife.com/index.php?lang=ja-JP
+ http://join.secondlife.com/index.php?lang=ja-JP&amp;sourceid=[sourceid]
</string>
<string name="LoginFailedViewerNotPermitted">
お使いの古いビューワでは Second Life にアクセスできません。以下のページから新しいビューワをダウンロードしてください:
@@ -1414,6 +1414,12 @@ support@secondlife.com にお問い合わせください。
<string name="InvFolder favorite">
お気に入り
</string>
+ <string name="InvFolder Favorites">
+ お気に入り
+ </string>
+ <string name="InvFolder favorites">
+ お気に入り
+ </string>
<string name="InvFolder Current Outfit">
着用中のアウトフィット
</string>
@@ -1429,6 +1435,12 @@ support@secondlife.com にお問い合わせください。
<string name="InvFolder Meshes">
メッシュ
</string>
+ <string name="InvFolder Received Items">
+ 受け取った商品
+ </string>
+ <string name="InvFolder Merchant Outbox">
+ マーチャントのアウトボックス
+ </string>
<string name="InvFolder Friends">
フレンド
</string>
diff --git a/indra/newview/skins/default/xui/pl/menu_im_well_button.xml b/indra/newview/skins/default/xui/pl/menu_im_well_button.xml
deleted file mode 100644
index 207bc2211b..0000000000
--- a/indra/newview/skins/default/xui/pl/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="IM Well Button Context Menu">
- <menu_item_call label="Zamknij wszystkie" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/pl/panel_nearby_chat_bar.xml
index 63cf96b571..4ed3ff669b 100644
--- a/indra/newview/skins/default/xui/pl/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/pl/panel_nearby_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="chat_bar">
+<panel name="nearby_chat">
<string name="min_width">
192
</string>
diff --git a/indra/newview/skins/default/xui/pt/floater_chat_bar.xml b/indra/newview/skins/default/xui/pt/floater_chat_bar.xml
index 72016c6b40..2eb2c94940 100644
--- a/indra/newview/skins/default/xui/pt/floater_chat_bar.xml
+++ b/indra/newview/skins/default/xui/pt/floater_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="chat_bar" title="BATE-PAPO LOCAL">
+<floater name="nearby_chat" title="BATE-PAPO LOCAL">
<panel name="bottom_panel">
<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"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/pt/floater_pathfinding_linksets.xml
index 8dc14a79a5..e0c60679dd 100644
--- a/indra/newview/skins/default/xui/pt/floater_pathfinding_linksets.xml
+++ b/indra/newview/skins/default/xui/pt/floater_pathfinding_linksets.xml
@@ -30,6 +30,9 @@
<floater.string name="linkset_terrain_owner">
--
</floater.string>
+ <floater.string name="linkset_terrain_scripted">
+ --
+ </floater.string>
<floater.string name="linkset_terrain_land_impact">
--
</floater.string>
@@ -45,6 +48,15 @@
<floater.string name="linkset_owner_group">
[grupo]
</floater.string>
+ <floater.string name="linkset_is_scripted">
+ Sim
+ </floater.string>
+ <floater.string name="linkset_is_not_scripted">
+ Não
+ </floater.string>
+ <floater.string name="linkset_is_unknown_scripted">
+ Desconhecido
+ </floater.string>
<floater.string name="linkset_use_walkable">
Caminhável
</floater.string>
@@ -94,6 +106,7 @@
<scroll_list.columns label="Nome (prim raiz)" name="name"/>
<scroll_list.columns label="Descrição (prim raiz)" name="description"/>
<scroll_list.columns label="Proprietário" name="owner"/>
+ <scroll_list.columns label="Com script" name="scripted"/>
<scroll_list.columns label="Impacto" name="land_impact"/>
<scroll_list.columns label="Distância" name="dist_from_you"/>
<scroll_list.columns label="Uso do linkset" name="linkset_use"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/pt/floater_texture_fetch_debugger.xml
index f20d50362e..0e897aea09 100644
--- a/indra/newview/skins/default/xui/pt/floater_texture_fetch_debugger.xml
+++ b/indra/newview/skins/default/xui/pt/floater_texture_fetch_debugger.xml
@@ -45,10 +45,23 @@
<text name="total_time_refetch_vis_cache_label">
15, Obtendo novamente visíveis do cache, Tempo: [TIME] segundos, Obtidos: [SIZE]KB, [PIXEL]MPixels
</text>
+ <text name="total_time_refetch_all_cache_label">
+ 16, Obtendo novamente todas as texturas do cache, Tempo: [TIME] segundos, Obtidos: [SIZE]KB, [PIXEL]MPixels
+ </text>
<text name="total_time_refetch_vis_http_label">
- 16, Obtendo novamente visíveis do HTTP, Tempo: [TIME] segundos, Obtidos: [SIZE]KB, [PIXEL]MPixels
+ 17, Obtendo novamente visíveis do HTTP, Tempo: [TIME] segundos, Obtidos: [SIZE]KB, [PIXEL]MPixels
+ </text>
+ <text name="total_time_refetch_all_http_label">
+ 18, Obtendo novamente todas as texturas do HTTP, Tempo: [TIME] segundos, Obtidos: [SIZE]KB, [PIXEL]MPixels
+ </text>
+ <spinner label="19, Proporção de texel/pixel:" name="texel_pixel_ratio"/>
+ <text name="texture_source_label">
+ 20, Origem da textura:
</text>
- <spinner label="17, Proporção de texel/pixel:" name="texel_pixel_ratio"/>
+ <radio_group name="texture_source">
+ <radio_item label="Cache + HTTP" name="0"/>
+ <radio_item label="Apenas HTTP" name="1"/>
+ </radio_group>
<button label="Iniciar" name="start_btn"/>
<button label="Redefinir" name="clear_btn"/>
<button label="Fechar" name="close_btn"/>
@@ -58,5 +71,7 @@
<button label="Decodificar" name="decode_btn"/>
<button label="Textura GL" name="gl_btn"/>
<button label="Obter novamente cache visível" name="refetchviscache_btn"/>
+ <button label="Obter todo o cache novamente" name="refetchallcache_btn"/>
<button label="Obter novamente HTTP visível" name="refetchvishttp_btn"/>
+ <button label="Obter todo o HTTP novamente" name="refetchallhttp_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/menu_im_well_button.xml b/indra/newview/skins/default/xui/pt/menu_im_well_button.xml
deleted file mode 100644
index 2d37cefd6f..0000000000
--- a/indra/newview/skins/default/xui/pt/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="IM Well Button Context Menu">
- <menu_item_call label="Fechar tudo" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inventory.xml b/indra/newview/skins/default/xui/pt/menu_inventory.xml
index 09e1fbf72e..a3a648eb34 100644
--- a/indra/newview/skins/default/xui/pt/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/menu_inventory.xml
@@ -68,6 +68,7 @@
<menu_item_call label="Excluir pasta do sistema" name="Delete System Folder"/>
<menu_item_call label="Pasta conversa em conferência" name="Conference Chat Folder"/>
<menu_item_call label="Executar som" name="Sound Play"/>
+ <menu_item_call label="Copiar SLurl" name="url_copy"/>
<menu_item_call label="Sobre o marco" name="About Landmark"/>
<menu_item_call label="Executar animação" name="Animation Play"/>
<menu_item_call label="Executar áudio" name="Animation Audition"/>
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index 11d987d73a..ff7382bf80 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -1196,7 +1196,7 @@ para &apos;[THIS_GPU]&apos;
Você chegou a uma região próxima.
</notification>
<notification name="AvatarMovedLast">
- Esse destino não está disponível no momento.
+ O destino solicitado não está disponível no momento.
Você chegou a uma região próxima.
</notification>
<notification name="AvatarMovedHome">
@@ -1212,10 +1212,10 @@ Enquando isso, use o [SECOND_LIFE] normalmente. Seu visual será exibido correta
</form>
</notification>
<notification name="FirstRun">
- A instalação do [APP_NAME] está pronta.
+ A instalação do [APP_NAME] está pronta.
Se você ainda não conhece o [SECOND_LIFE], basta criar uma conta para começar.
- <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Nova conta.."/>
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Criar conta"/>
</notification>
<notification name="LoginPacketNeverReceived">
Estamos detectando um problema de conexão. Pode haver um problema com a sua conexão à internet ou com o [SECOND_LIFE_GRID].
@@ -3210,18 +3210,57 @@ Se o botão Falar for ocultado, o recurso de voz será desabilitado.
Essa ação irá ocultar todos os itens de menu e botões. Para trazê-los de volta, clique em [SHORTCUT] novamente.
<usetemplate ignoretext="Confirmar antes de ocultar interface" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnRestricted">
- Alguns linksets selecionados não podem ser definidos como &apos;[REQUESTED_TYPE]&apos; devido às restrições de permissão no linkset. Ao invés disso, estes linksets serão definidos como &apos;[RESTRICTED_TYPE]&apos;.
+ <notification name="PathfindingLinksets_WarnOnPhantom">
+ Alguns linksets selecionados terão suas sinalizações fantasmas alternadas.
+
+Deseja continuar?
+ <usetemplate ignoretext="Algumas sinalizações fantasmas dos linksets selecionados serão alternadas." name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted">
+ Algumas sinalizações fantasmas dos linksets selecionados não podem ser definidas como &apos;[REQUESTED_TYPE]&apos; devido às restrições de permissão no linkset. Ao invés disso, estes linksets serão definidos como &apos;[RESTRICTED_TYPE]&apos;.
+
+Deseja continuar?
<usetemplate ignoretext="Alguns linksets selecionados não podem ser definidos devido às restrições de permissão no linkset." name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnVolume">
+ <notification name="PathfindingLinksets_MismatchOnVolume">
Alguns linksets selecionados não podem ser definidos como &apos;[REQUESTED_TYPE]&apos;, pois a forma não é convexa.
+
+Deseja continuar?
<usetemplate ignoretext="Alguns linksets selecionados não podem ser definidos, pois a forma não é convexa." name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnRestrictedAndVolume">
- Alguns linksets selecionados não podem ser definidos como &apos;[REQUESTED_TYPE]&apos; devido às restrições de permissão no linkset. Ao invés disso, estes linksets serão definidos como &apos;[RESTRICTED_TYPE]&apos;.
- Alguns linksets selecionados não podem ser definidos como &apos;[REQUESTED_TYPE]&apos;, pois a forma não é convexa. Estes tipos de uso de linksets não mudarão.
- <usetemplate ignoretext="Alguns linksets selecionados não podem ser definido devido às restrições de permissão no linkset e porque a forma não é convexa." name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted">
+ Alguns linksets selecionados terão suas sinalizações fantasmas alternadas.
+
+Algumas sinalizações fantasmas dos linksets selecionados não podem ser definidas como &apos;[REQUESTED_TYPE]&apos; devido às restrições de permissão no linkset. Ao invés disso, estes linksets serão definidos como &apos;[RESTRICTED_TYPE]&apos;.
+
+Deseja continuar?
+ <usetemplate ignoretext="Algumas sinalizações fantasmas dos linksets selecionados serão alternadas e outras não poderão ser definidas devido às restrições de permissão no linkset." name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnVolume">
+ Alguns linksets selecionados terão suas sinalizações fantasmas alternadas.
+
+Alguns linksets selecionados não podem ser definidos como &apos;[REQUESTED_TYPE]&apos;, pois a forma não é convexa.
+
+Deseja continuar?
+ <usetemplate ignoretext="Algumas sinalizações fantasmas dos linksets selecionados serão alternadas e outros não podem ser definidas, pois a forma não é convexa." name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted_MismatchOnVolume">
+ Algumas sinalizações fantasmas dos linksets selecionados não podem ser definidas como &apos;[REQUESTED_TYPE]&apos; devido às restrições de permissão no linkset. Ao invés disso, estes linksets serão definidos como &apos;[RESTRICTED_TYPE]&apos;.
+
+Alguns linksets selecionados não podem ser definidos como &apos;[REQUESTED_TYPE]&apos;, pois a forma não é convexa. Estes tipos de uso de linksets não mudarão.
+
+Deseja continuar?
+ <usetemplate ignoretext="Alguns linksets selecionados não podem ser definidos devido às restrições de permissão no linkset e porque a forma não é convexa." name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted_MismatchOnVolume">
+ Alguns linksets selecionados terão suas sinalizações fantasmas alternadas.
+
+Algumas sinalizações fantasmas dos linksets selecionados não podem ser definidas como &apos;[REQUESTED_TYPE]&apos; devido às restrições de permissão no linkset. Ao invés disso, estes linksets serão definidos como &apos;[RESTRICTED_TYPE]&apos;.
+
+Alguns linksets selecionados não podem ser definidos como &apos;[REQUESTED_TYPE]&apos;, pois a forma não é convexa. Estes tipos de uso de linksets não mudarão.
+
+Deseja continuar?
+ <usetemplate ignoretext="Algumas sinalizações fantasmas dos linksets selecionados serão alternadas e outras não poderão ser definidas, pois a forma não é convexa." name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="PathfindingLinksets_ChangeToFlexiblePath">
O objeto selecionado afeta o navmesh. Alterá-lo para um Caminho Flexível irá removê-lo do navmesh.
diff --git a/indra/newview/skins/default/xui/pt/panel_login.xml b/indra/newview/skins/default/xui/pt/panel_login.xml
index 25a2c9fda0..d7e9fa76ea 100644
--- a/indra/newview/skins/default/xui/pt/panel_login.xml
+++ b/indra/newview/skins/default/xui/pt/panel_login.xml
@@ -6,7 +6,7 @@
<layout_stack name="login_widgets">
<layout_panel name="login">
<text name="log_in_text">
- CONECTAR
+ LOGIN
</text>
<text name="username_text">
Nome de usuário:
@@ -22,24 +22,25 @@
</text>
<combo_box name="start_location_combo">
<combo_box.item label="Última posição" name="MyLastLocation"/>
- <combo_box.item label="Meu início" name="MyHome"/>
+ <combo_box.item label="Minha casa" name="MyHome"/>
+ <combo_box.item label="&lt;Digite o nome da região&gt;" name="Typeregionname"/>
</combo_box>
</layout_panel>
<layout_panel name="links_login_panel">
<text name="login_help">
- Precisa de ajuda ao conectar?
+ Precisa de ajuda com o login?
</text>
<text name="forgot_password_text">
Esqueceu seu nome ou senha?
</text>
- <button label="conectar" name="connect_btn"/>
+ <button label="Login" name="connect_btn"/>
<check_box label="Lembrar senha" name="remember_check"/>
</layout_panel>
<layout_panel name="links">
<text name="create_account_text">
- CREATE YǾUR ACCǾUNT
+ CRIE SUA CONTA
</text>
- <button name="create_new_account_btn" label="Cadastre-se"/>
+ <button label="Comece agora" name="create_new_account_btn"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/pt/panel_navmesh_rebake.xml
deleted file mode 100644
index aa885ae031..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_navmesh_rebake">
- <button label="Recarregar região" name="navmesh_btn" tool_tip="Clique para recarregar o navmesh da região."/>
- <button label="Solicitando recarregamento" name="navmesh_btn_sending" tool_tip="Enviando solicitação de recarregamento para o servidor."/>
- <button label="A região está recarregando" name="navmesh_btn_baking" tool_tip="A região está sendo recarregada. Este botão desaparecerá após a conclusão."/>
-</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
index 9b993488be..5628a87109 100644
--- a/indra/newview/skins/default/xui/pt/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/pt/panel_nearby_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="chat_bar">
+<panel name="nearby_chat">
<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_region_debug.xml b/indra/newview/skins/default/xui/pt/panel_region_debug.xml
index 72e348e48c..be15d40d74 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_debug.xml
@@ -36,5 +36,5 @@
<button label="?" left="297" name="top_scripts_help"/>
<button label="Reiniciar a região" name="restart_btn" tool_tip="Após 2 minutos de contagem regressiva, reiniciar a região"/>
<button label="?" name="restart_help"/>
- <button label="Cancelar reinício" name="cancel_restart_btn" tool_tip="Adiar o reinício da região por uma hora"/>
+ <button label="Cancelar reinício" name="cancel_restart_btn" tool_tip="Cancelar reinício da região"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/pt/panel_volume_pulldown.xml
new file mode 100644
index 0000000000..1dfd2a69ca
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_volume_pulldown.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="volumepulldown_floater">
+ <slider label="Master" name="System Volume"/>
+ <slider label="Botões" name="UI Volume"/>
+ <slider label="Ambiente" name="Wind Volume"/>
+ <slider label="Sons" name="SFX Volume"/>
+ <check_box name="gesture_audio_play_btn" tool_tip="Ativar sons dos gestos"/>
+ <slider label="Música" name="Music Volume"/>
+ <check_box name="enable_music" tool_tip="Ativar streaming de música"/>
+ <slider label="Mídia" name="Media Volume"/>
+ <check_box name="enable_media" tool_tip="Ativar mídia em stream"/>
+ <slider label="Voz" name="Voice Volume"/>
+ <check_box name="enable_voice_check" tool_tip="Ativar bate-papo de voz"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index a7234bdc14..bc72b86020 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -128,7 +128,7 @@
Sair
</string>
<string name="create_account_url">
- http://join.secondlife.com/index.php?lang=pt-BR
+ http://join.secondlife.com/index.php?lang=pt-BR&amp;sourceid=[sourceid]
</string>
<string name="LoginFailedViewerNotPermitted">
O visualizador utilizado já não é compatível com o Second Life. Visite a página abaixo para baixar uma versão atual: http://secondlife.com/download
@@ -1354,6 +1354,12 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
<string name="InvFolder favorite">
Meus favoritos
</string>
+ <string name="InvFolder Favorites">
+ Meus favoritos
+ </string>
+ <string name="InvFolder favorites">
+ Meus favoritos
+ </string>
<string name="InvFolder Current Outfit">
Look atual
</string>
@@ -1369,6 +1375,12 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
<string name="InvFolder Meshes">
Meshes:
</string>
+ <string name="InvFolder Received Items">
+ Itens recebidos
+ </string>
+ <string name="InvFolder Merchant Outbox">
+ Caixa de saída do lojista
+ </string>
<string name="InvFolder Friends">
Amigos
</string>
diff --git a/indra/newview/skins/default/xui/ru/floater_chat_bar.xml b/indra/newview/skins/default/xui/ru/floater_chat_bar.xml
index 79b7b033fb..f6b2fc81e1 100644
--- a/indra/newview/skins/default/xui/ru/floater_chat_bar.xml
+++ b/indra/newview/skins/default/xui/ru/floater_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="chat_bar" title="ЛОКАЛЬНЫЙ ЧАТ">
+<floater name="nearby_chat" title="ЛОКАЛЬНЫЙ ЧАТ">
<panel name="bottom_panel">
<line_editor label="Щелкните здесь для общения." name="chat_box" tool_tip="Нажмите Enter, чтобы сказать, Ctrl+Enter, чтобы прокричать"/>
<button name="show_nearby_chat" tool_tip="Показать/скрыть лог локального чата"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/ru/floater_pathfinding_linksets.xml
index f1b8e23a2c..db100fa415 100644
--- a/indra/newview/skins/default/xui/ru/floater_pathfinding_linksets.xml
+++ b/indra/newview/skins/default/xui/ru/floater_pathfinding_linksets.xml
@@ -30,6 +30,9 @@
<floater.string name="linkset_terrain_owner">
--
</floater.string>
+ <floater.string name="linkset_terrain_scripted">
+ --
+ </floater.string>
<floater.string name="linkset_terrain_land_impact">
--
</floater.string>
@@ -45,6 +48,15 @@
<floater.string name="linkset_owner_group">
[группа]
</floater.string>
+ <floater.string name="linkset_is_scripted">
+ Да
+ </floater.string>
+ <floater.string name="linkset_is_not_scripted">
+ Нет
+ </floater.string>
+ <floater.string name="linkset_is_unknown_scripted">
+ Неизвестно
+ </floater.string>
<floater.string name="linkset_use_walkable">
Проходимое место
</floater.string>
@@ -94,6 +106,7 @@
<scroll_list.columns label="Имя (корневой примитив)" name="name"/>
<scroll_list.columns label="Описание (корневой примитив)" name="description"/>
<scroll_list.columns label="Владелец" name="owner"/>
+ <scroll_list.columns label="Скриптовые" name="scripted"/>
<scroll_list.columns label="Воздействие" name="land_impact"/>
<scroll_list.columns label="Расстояние" name="dist_from_you"/>
<scroll_list.columns label="Использование набора связей" name="linkset_use"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/ru/floater_texture_fetch_debugger.xml
index 034106f24c..628e6c5c87 100644
--- a/indra/newview/skins/default/xui/ru/floater_texture_fetch_debugger.xml
+++ b/indra/newview/skins/default/xui/ru/floater_texture_fetch_debugger.xml
@@ -45,10 +45,23 @@
<text name="total_time_refetch_vis_cache_label">
15, Повторное извлечение из кэша, время: [TIME] с, извлечено: [SIZE] КБ, [PIXEL] Мпикселов
</text>
+ <text name="total_time_refetch_all_cache_label">
+ 16, Повторное извлечение всех текстур из кэша, время: [TIME] с, извлечено: [SIZE] КБ, [PIXEL] Мпикселов
+ </text>
<text name="total_time_refetch_vis_http_label">
- 16, Повторное извлечение из HTTP, время: [TIME] с, извлечено: [SIZE] КБ, [PIXEL] Мпикселов
+ 17, Повторное извлечение из HTTP, время: [TIME] с, извлечено: [SIZE] КБ, [PIXEL] Мпикселов
+ </text>
+ <text name="total_time_refetch_all_http_label">
+ 18, Повторное извлечение всех текстур из HTTP, время: [TIME] с, извлечено: [SIZE] КБ, [PIXEL] Мпикселов
+ </text>
+ <spinner label="19, Отношение текселы/пикселы:" name="texel_pixel_ratio"/>
+ <text name="texture_source_label">
+ 20, Истояник текстур:
</text>
- <spinner label="17, Отношение текселы/пикселы" name="texel_pixel_ratio"/>
+ <radio_group name="texture_source">
+ <radio_item label="Кэш + HTTP" name="0"/>
+ <radio_item label="Только HTTP" name="1"/>
+ </radio_group>
<button label="Пуск" name="start_btn"/>
<button label="Сброс" name="clear_btn"/>
<button label="Закрыть" name="close_btn"/>
@@ -58,5 +71,7 @@
<button label="Декодировать" name="decode_btn"/>
<button label="Текстура GL" name="gl_btn"/>
<button label="Повторно извлечь из кэша" name="refetchviscache_btn"/>
+ <button label="Повторно извлечь все из кэша" name="refetchallcache_btn"/>
<button label="Повторно извлечь из HTTP" name="refetchvishttp_btn"/>
+ <button label="Повторно извлечь все из HTTP" name="refetchallhttp_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ru/menu_im_well_button.xml b/indra/newview/skins/default/xui/ru/menu_im_well_button.xml
deleted file mode 100644
index 5a5bde61b9..0000000000
--- a/indra/newview/skins/default/xui/ru/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?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/ru/menu_inventory.xml b/indra/newview/skins/default/xui/ru/menu_inventory.xml
index 49f7281b4e..37ee19fc1d 100644
--- a/indra/newview/skins/default/xui/ru/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/ru/menu_inventory.xml
@@ -68,6 +68,7 @@
<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="Копировать URL SL" name="url_copy"/>
<menu_item_call label="О закладке" name="About Landmark"/>
<menu_item_call label="Проиграть для всех" name="Animation Play"/>
<menu_item_call label="Проиграть для себя" name="Animation Audition"/>
diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml
index 9dad569ddd..85b7074253 100644
--- a/indra/newview/skins/default/xui/ru/notifications.xml
+++ b/indra/newview/skins/default/xui/ru/notifications.xml
@@ -1207,7 +1207,7 @@
Вы перемещены в соседний регион.
</notification>
<notification name="AvatarMovedLast">
- Ваше последнее местоположение сейчас недоступно.
+ Требуемое вами местоположение сейчас недоступно.
Вы перемещены в соседний регион.
</notification>
<notification name="AvatarMovedHome">
@@ -3233,19 +3233,58 @@ http://secondlife.com/download.
Это действие приведет к скрытию всех меню и кнопок. Чтобы вернуть их, щелкните [SHORTCUT] снова.
<usetemplate ignoretext="Подтверждать перед скрытием интерфейса" name="okcancelignore" notext="Отмена" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnRestricted">
+ <notification name="PathfindingLinksets_WarnOnPhantom">
+ Признак фантомности некоторых выбранных наборов связей будет изменен.
+
+Продолжить?
+ <usetemplate ignoretext="Признак фантомности некоторых выбранных наборов связей будет изменен." name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted">
Для некоторых выбранных наборов связей нельзя задать тип «[REQUESTED_TYPE]» из-за ограничений этих наборов. Эти наборы связей будут иметь тип «[RESTRICTED_TYPE]».
+
+Продолжить?
<usetemplate ignoretext="Нельзя задать некоторые выбранные наборы связей из-за ограничений этих наборов." name="okcancelignore" notext="Отмена" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnVolume">
+ <notification name="PathfindingLinksets_MismatchOnVolume">
Для некоторых выбранных наборов связей невозможно задать тип «[REQUESTED_TYPE]», так как фигура не выпуклая.
+
+Продолжить?
<usetemplate ignoretext="Нельзя задать некоторые выбранные наборы связей, так как фигура не выпуклая." name="okcancelignore" notext="Отмена" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnRestrictedAndVolume">
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted">
+ Признак фантомности некоторых выбранных наборов связей будет изменен.
+
+Для некоторых выбранных наборов связей нельзя задать тип «[REQUESTED_TYPE]» из-за ограничений этих наборов. Эти наборы связей будут иметь тип «[RESTRICTED_TYPE]».
+
+Продолжить?
+ <usetemplate ignoretext="Для некоторых выбранных наборов связей будет изменен признак фантомности, а другие наборы нельзя задать из-за ограничений этих наборов." name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnVolume">
+ Признак фантомности некоторых выбранных наборов связей будет изменен.
+
+Для некоторых выбранных наборов связей невозможно задать тип «[REQUESTED_TYPE]», так как фигура не выпуклая.
+
+Продолжить?
+ <usetemplate ignoretext="Для некоторых выбранных наборов связей будет изменен признак фантомности, а другие наборы нельзя задать, так как фигура не выпуклая." name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted_MismatchOnVolume">
Для некоторых выбранных наборов связей нельзя задать тип «[REQUESTED_TYPE]» из-за ограничений этих наборов. Эти наборы связей будут иметь тип «[RESTRICTED_TYPE]».
- Для некоторых выбранных наборов связей невозможно задать тип «[REQUESTED_TYPE]», так как фигура не выпуклая. Тип использования этих наборов связей не изменится.
+
+Для некоторых выбранных наборов связей невозможно задать тип «[REQUESTED_TYPE]», так как фигура не выпуклая. Тип использования этих наборов связей не изменится.
+
+Продолжить?
<usetemplate ignoretext="Нельзя задать некоторые выбранные наборы связей из-за ограничений этих наборов и потому, что фигура не выпуклая." name="okcancelignore" notext="Отмена" yestext="OK"/>
</notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted_MismatchOnVolume">
+ Признак фантомности некоторых выбранных наборов связей будет изменен.
+
+Для некоторых выбранных наборов связей нельзя задать тип «[REQUESTED_TYPE]» из-за ограничений этих наборов. Эти наборы связей будут иметь тип «[RESTRICTED_TYPE]».
+
+Для некоторых выбранных наборов связей невозможно задать тип «[REQUESTED_TYPE]», так как фигура не выпуклая. Тип использования этих наборов связей не изменится.
+
+Продолжить?
+ <usetemplate ignoretext="Для некоторых выбранных наборов связей будет изменен признак фантомности, а другие наборы нельзя задать из-за ограничений этих наборов и потому, что фигура не выпуклая." name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
<notification name="PathfindingLinksets_ChangeToFlexiblePath">
Выбранный объект влияет на навигационную сетку. Если заменить его на гибкий путь, он будет удален из навигационной сетки.
<usetemplate ignoretext="Выбранный объект влияет на навигационную сетку. Если заменить его на гибкий путь, он будет удален из навигационной сетки." name="okcancelignore" notext="Отмена" yestext="OK"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_login.xml b/indra/newview/skins/default/xui/ru/panel_login.xml
index 7ead924c1f..f0877731c6 100644
--- a/indra/newview/skins/default/xui/ru/panel_login.xml
+++ b/indra/newview/skins/default/xui/ru/panel_login.xml
@@ -38,9 +38,9 @@
</layout_panel>
<layout_panel name="links">
<text name="create_account_text">
- CREATE YǾUR ACCǾUNT
+ СОЗДАЙТЕ СВОЙ АККАУНТ
</text>
- <button name="create_new_account_btn" label="Регистрация"/>
+ <button label="Начать" name="create_new_account_btn"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/ru/panel_navmesh_rebake.xml
deleted file mode 100644
index fdc374a024..0000000000
--- a/indra/newview/skins/default/xui/ru/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_navmesh_rebake">
- <button label="Восстановить регион" name="navmesh_btn" tool_tip="Восстановить навигационную сетку региона."/>
- <button label="Запрос на восстановление" name="navmesh_btn_sending" tool_tip="Отправка запроса на восстановление на сервер."/>
- <button label="Идет восстановление региона" name="navmesh_btn_baking" tool_tip="Идет восстановление региона. Когда оно завершится, эта кнопка исчезнет."/>
-</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/ru/panel_nearby_chat_bar.xml
index 804ba7def7..395c643b0b 100644
--- a/indra/newview/skins/default/xui/ru/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/ru/panel_nearby_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="chat_bar">
+<panel name="nearby_chat">
<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/ru/panel_region_debug.xml b/indra/newview/skins/default/xui/ru/panel_region_debug.xml
index 7bef927507..4be1e781fa 100644
--- a/indra/newview/skins/default/xui/ru/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/ru/panel_region_debug.xml
@@ -30,5 +30,5 @@
<button label="Самые активные участники столкновений..." name="top_colliders_btn" tool_tip="Список объектов, для которых столкновения наиболее вероятны"/>
<button label="Список лучших скриптов..." name="top_scripts_btn" tool_tip="Объекты, в которых скрипты выполняются дольше всего"/>
<button label="Перезагрузить регион" name="restart_btn" tool_tip="Отсчитать 2 минуты и перезагрузить регион"/>
- <button label="Отменить перезапуск" name="cancel_restart_btn" tool_tip="Отложить перезагрузку региона на час"/>
+ <button label="Отменить перезапуск" name="cancel_restart_btn" tool_tip="Отменить перезапуск региона"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/ru/panel_volume_pulldown.xml
new file mode 100644
index 0000000000..fe044cd083
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_volume_pulldown.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="volumepulldown_floater">
+ <slider label="Общая" name="System Volume"/>
+ <slider label="Кнопки" name="UI Volume"/>
+ <slider label="Окружающая" name="Wind Volume"/>
+ <slider label="Звуки" name="SFX Volume"/>
+ <check_box name="gesture_audio_play_btn" tool_tip="Включить звуки от жестов"/>
+ <slider label="Музыка" name="Music Volume"/>
+ <check_box name="enable_music" tool_tip="Включить потоковую музыку"/>
+ <slider label="Медиа" name="Media Volume"/>
+ <check_box name="enable_media" tool_tip="Включить потоковое медиа"/>
+ <slider label="Голос" name="Voice Volume"/>
+ <check_box name="enable_voice_check" tool_tip="Включить голосовой чат"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
index 3745aff8fd..f9ded799bf 100644
--- a/indra/newview/skins/default/xui/ru/strings.xml
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -137,7 +137,7 @@
Выйти
</string>
<string name="create_account_url">
- http://join.secondlife.com/index.php?lang=ru-RU
+ http://join.secondlife.com/index.php?lang=ru-RU&amp;sourceid=[sourceid]
</string>
<string name="LoginFailedViewerNotPermitted">
У клиента, которым вы пользуетесь, больше нет доступа к игре Second Life. Загрузить новую версию клиента можно по адресу
@@ -1411,6 +1411,12 @@ support@secondlife.com.
<string name="InvFolder favorite">
Мое избранное
</string>
+ <string name="InvFolder Favorites">
+ Мое избранное
+ </string>
+ <string name="InvFolder favorites">
+ Мое избранное
+ </string>
<string name="InvFolder Current Outfit">
Текущий костюм
</string>
@@ -1426,6 +1432,12 @@ support@secondlife.com.
<string name="InvFolder Meshes">
Меши
</string>
+ <string name="InvFolder Received Items">
+ Полученные вещи
+ </string>
+ <string name="InvFolder Merchant Outbox">
+ Торговые исходящие
+ </string>
<string name="InvFolder Friends">
Друзья
</string>
diff --git a/indra/newview/skins/default/xui/tr/floater_chat_bar.xml b/indra/newview/skins/default/xui/tr/floater_chat_bar.xml
index 988c845982..cd999b4b7a 100644
--- a/indra/newview/skins/default/xui/tr/floater_chat_bar.xml
+++ b/indra/newview/skins/default/xui/tr/floater_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="chat_bar" title="YAKINDAKİ SOHBET">
+<floater name="nearby_chat" title="YAKINDAKİ SOHBET">
<panel name="bottom_panel">
<line_editor label="Sohbet etmek için buraya tıklayın." name="chat_box" tool_tip="Söylemek için Enter, bağırmak için Ctrl+Enter yapın"/>
<button name="show_nearby_chat" tool_tip="Yakın sohbet günlüğünü gösterir/gizler"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/tr/floater_pathfinding_linksets.xml
index 3aee66a860..2e416c9311 100644
--- a/indra/newview/skins/default/xui/tr/floater_pathfinding_linksets.xml
+++ b/indra/newview/skins/default/xui/tr/floater_pathfinding_linksets.xml
@@ -30,6 +30,9 @@
<floater.string name="linkset_terrain_owner">
--
</floater.string>
+ <floater.string name="linkset_terrain_scripted">
+ --
+ </floater.string>
<floater.string name="linkset_terrain_land_impact">
--
</floater.string>
@@ -45,6 +48,15 @@
<floater.string name="linkset_owner_group">
[grup]
</floater.string>
+ <floater.string name="linkset_is_scripted">
+ Evet
+ </floater.string>
+ <floater.string name="linkset_is_not_scripted">
+ Hayır
+ </floater.string>
+ <floater.string name="linkset_is_unknown_scripted">
+ Bilinmiyor
+ </floater.string>
<floater.string name="linkset_use_walkable">
Yürüyebilir
</floater.string>
@@ -94,6 +106,7 @@
<scroll_list.columns label="Ad (kök prim)" name="name"/>
<scroll_list.columns label="Açıklama (kök prim)" name="description"/>
<scroll_list.columns label="Sahip" name="owner"/>
+ <scroll_list.columns label="Komut Dosyalı" name="scripted"/>
<scroll_list.columns label="Etki" name="land_impact"/>
<scroll_list.columns label="Mesafe" name="dist_from_you"/>
<scroll_list.columns label="Bağlantı kümesi kullanımı" name="linkset_use"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/tr/floater_texture_fetch_debugger.xml
index a592479b6c..42426225c7 100644
--- a/indra/newview/skins/default/xui/tr/floater_texture_fetch_debugger.xml
+++ b/indra/newview/skins/default/xui/tr/floater_texture_fetch_debugger.xml
@@ -45,10 +45,23 @@
<text name="total_time_refetch_vis_cache_label">
15, Görünür dokuların önbellekten tekrar alınması, Süre: [TIME] saniye, Alınan: [SIZE]KB, [PIXEL]MPiksel
</text>
+ <text name="total_time_refetch_all_cache_label">
+ 16, Tüm dokuların önbellekten tekrar alınması, Süre: [TIME] saniye, Alınan: [SIZE]KB, [PIXEL]MPiksel
+ </text>
<text name="total_time_refetch_vis_http_label">
- 16, Görünür dokuların HTTP&apos;den tekrar alınması, Süre: [TIME] saniye, Alınan: [SIZE]KB, [PIXEL]MPiksel
+ 17, Görünür dokuların HTTP&apos;den tekrar alınması, Süre: [TIME] saniye, Alınan: [SIZE]KB, [PIXEL]MPiksel
+ </text>
+ <text name="total_time_refetch_all_http_label">
+ 18, Tüm dokuların HTTP&apos;den tekrar alınması, Süre: [TIME] saniye, Alınan: [SIZE]KB, [PIXEL]MPiksel
+ </text>
+ <spinner label="19, Teksel/Piksel Oranı:" name="texel_pixel_ratio"/>
+ <text name="texture_source_label">
+ 20, Doku Kaynağı:
</text>
- <spinner label="17, Teksel/Piksel Oranı:" name="texel_pixel_ratio"/>
+ <radio_group name="texture_source">
+ <radio_item label="Önbellek + HTTP" name="0"/>
+ <radio_item label="Sadece HTTP" name="1"/>
+ </radio_group>
<button label="Başla" name="start_btn"/>
<button label="Sıfırla" name="clear_btn"/>
<button label="Kapat" name="close_btn"/>
@@ -58,5 +71,7 @@
<button label="Şifre Çöz" name="decode_btn"/>
<button label="GL Dokusu" name="gl_btn"/>
<button label="Görünür Dokuları Önbellekten Tekrar Al" name="refetchviscache_btn"/>
+ <button label="Tüm Önbelleği Tekrar Al" name="refetchallcache_btn"/>
<button label="Görünür Dokuları HTTP&apos;den Tekrar Al" name="refetchvishttp_btn"/>
+ <button label="Tüm HTTP&apos;yi Tekrar Al" name="refetchallhttp_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/tr/menu_im_well_button.xml b/indra/newview/skins/default/xui/tr/menu_im_well_button.xml
deleted file mode 100644
index c3e559a723..0000000000
--- a/indra/newview/skins/default/xui/tr/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="IM Well Button Context Menu">
- <menu_item_call label="Tümünü Kapat" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_inventory.xml b/indra/newview/skins/default/xui/tr/menu_inventory.xml
index 170cdebd24..51049427af 100644
--- a/indra/newview/skins/default/xui/tr/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/tr/menu_inventory.xml
@@ -68,6 +68,7 @@
<menu_item_call label="Sistem Klasörünü Sil" name="Delete System Folder"/>
<menu_item_call label="Konferans Sohbeti Başlat" name="Conference Chat Folder"/>
<menu_item_call label="Oyna" name="Sound Play"/>
+ <menu_item_call label="SLurl&apos;i Kopyala" name="url_copy"/>
<menu_item_call label="Yer İmi Hakkında" name="About Landmark"/>
<menu_item_call label="SL Dünyasında Oynat" name="Animation Play"/>
<menu_item_call label="Yerel Olarak Oynat" name="Animation Audition"/>
diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml
index 708e05062f..488702f9ca 100644
--- a/indra/newview/skins/default/xui/tr/notifications.xml
+++ b/indra/newview/skins/default/xui/tr/notifications.xml
@@ -1207,7 +1207,7 @@ sonraki: &apos;[THIS_GPU]&apos;
Yakınındaki başka bir bölgeye taşındınız.
</notification>
<notification name="AvatarMovedLast">
- Son konumunuz şu anda kullanılamıyor.
+ Talep ettiğiniz konum şu anda kullanılamıyor.
Yakınındaki başka bir bölgeye taşındınız.
</notification>
<notification name="AvatarMovedHome">
@@ -1223,10 +1223,10 @@ Yeni bir ana konum ayarlamak isteyebilirsiniz.
</form>
</notification>
<notification name="FirstRun">
- [APP_NAME] kurulumu tamamlandı.
+ [APP_NAME] yüklemesi tamamlandı.
[SECOND_LIFE]&apos;ı ilk kez kullanıyorsanız, oturum açmadan önce bir hesap oluşturmalısınız.
- <usetemplate name="okcancelbuttons" notext="Devam" yestext="Yeni Hesap..."/>
+ <usetemplate name="okcancelbuttons" notext="Devam" yestext="Hesap Oluştur..."/>
</notification>
<notification name="LoginPacketNeverReceived">
Bağlantıda sorun yaşıyoruz. İnternet bağlantınızda ya da [SECOND_LIFE_GRID] uygulamasında bir problem olabilir.
@@ -3233,19 +3233,58 @@ Görünümünüzü döndürmek için dünya üzerindeki herhangi bir yeri tıkla
Bu eylem tüm menü öğelerini ve düğmelerini gizler. Bunları geri almak için [SHORTCUT] üzerine tekrar tıklayın.
<usetemplate ignoretext="KA&apos;ni gizlemeden önce onayla" name="okcancelignore" notext="İptal" yestext="Tamam"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnRestricted">
+ <notification name="PathfindingLinksets_WarnOnPhantom">
+ Bazı seçili bağlantı kümelerinin Fantom bayrağı dönüştürülecek.
+
+Devam etmek istiyor musunuz?
+ <usetemplate ignoretext="Bazı seçili bağlantı kümelerinin fantom bayrağı dönüştürülecek." name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted">
Seçilen bazı bağlantı kümeleri, bağlantı kümesi için izin kısıtlamaları nedeniyle &apos;[REQUESTED_TYPE]&apos; olarak ayarlanamıyor. Bunun yerine bu bağlantı kümeleri &apos;[RESTRICTED_TYPE]&apos; olarak ayarlanacak.
+
+Devam etmek istiyor musunuz?
<usetemplate ignoretext="Seçilen bazı bağlantı kümeleri, bağlantı kümesi için izin kısıtlamaları nedeniyle ayarlanamıyor." name="okcancelignore" notext="İptal" yestext="Tamam"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnVolume">
+ <notification name="PathfindingLinksets_MismatchOnVolume">
Seçilen bazı bağlantı kümeleri &apos;[REQUESTED_TYPE]&apos; olarak ayarlanamaz, çünkü şekil konveks değil.
+
+Devam etmek istiyor musunuz?
<usetemplate ignoretext="Seçilen bazı bağlantı kümeleri ayarlanamaz, çünkü şekil konveks değil." name="okcancelignore" notext="İptal" yestext="Tamam"/>
</notification>
- <notification name="PathfindingLinksets_SetLinksetUseMismatchOnRestrictedAndVolume">
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted">
+ Bazı seçili bağlantı kümelerinin Fantom bayrağı dönüştürülecek.
+
+Seçilen bazı bağlantı kümeleri, bağlantı kümesi için izin kısıtlamaları nedeniyle &apos;[REQUESTED_TYPE]&apos; olarak ayarlanamıyor. Bunun yerine bu bağlantı kümeleri &apos;[RESTRICTED_TYPE]&apos; olarak ayarlanacak.
+
+Devam etmek istiyor musunuz?
+ <usetemplate ignoretext="Bazı seçili bağlantı kümelerinin fantom bayrağı dönüştürülecek, diğerleri ise bağlantı kümesi için izin kısıtlamaları nedeniyle ayarlanamıyor." name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnVolume">
+ Bazı seçili bağlantı kümelerinin Fantom bayrağı dönüştürülecek.
+
+Seçilen bazı bağlantı kümeleri &apos;[REQUESTED_TYPE]&apos; olarak ayarlanamaz, çünkü şekil konveks değil.
+
+Devam etmek istiyor musunuz?
+ <usetemplate ignoretext="Bazı seçili bağlantı kümelerinin fantom bayrağı dönüştürülecek, diğerleri ise şekil konveks olmadığı için ayarlanamıyor" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted_MismatchOnVolume">
Seçilen bazı bağlantı kümeleri, bağlantı kümesi için izin kısıtlamaları nedeniyle &apos;[REQUESTED_TYPE]&apos; olarak ayarlanamıyor. Bunun yerine bu bağlantı kümeleri &apos;[RESTRICTED_TYPE]&apos; olarak ayarlanacak.
- Seçilen bazı bağlantı kümeleri &apos;[REQUESTED_TYPE]&apos; olarak ayarlanamaz, çünkü şekil konveks değil. Bu bağlantı kümelerinin kullanım tipleri değişmez.
+
+Seçilen bazı bağlantı kümeleri &apos;[REQUESTED_TYPE]&apos; olarak ayarlanamaz, çünkü şekil konveks değil. Bu bağlantı kümelerinin kullanım tipleri değişmez.
+
+Devam etmek istiyor musunuz?
<usetemplate ignoretext="Seçilen bazı bağlantı kümeleri, bağlantı kümesi için izin kısıtlamaları nedeniyle ve şekil konveks olmadığı için ayarlanamıyor." name="okcancelignore" notext="İptal" yestext="Tamam"/>
</notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted_MismatchOnVolume">
+ Bazı seçili bağlantı kümelerinin Fantom bayrağı dönüştürülecek.
+
+Seçilen bazı bağlantı kümeleri, bağlantı kümesi için izin kısıtlamaları nedeniyle &apos;[REQUESTED_TYPE]&apos; olarak ayarlanamıyor. Bunun yerine bu bağlantı kümeleri &apos;[RESTRICTED_TYPE]&apos; olarak ayarlanacak.
+
+Seçilen bazı bağlantı kümeleri &apos;[REQUESTED_TYPE]&apos; olarak ayarlanamaz, çünkü şekil konveks değil. Bu bağlantı kümelerinin kullanım tipleri değişmez.
+
+Devam etmek istiyor musunuz?
+ <usetemplate ignoretext="Bazı seçili bağlantı kümelerinin fantom bayrağı dönüştürülecek, diğerleri ise bağlantı kümesi için izin kısıtlamaları nedeniyle ve şekil konveks olmadığı için ayarlanamıyor." name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
<notification name="PathfindingLinksets_ChangeToFlexiblePath">
Seçilen nesne navigasyon örgüsünü etkiliyor. Bunu bir Esnek Yol olarak değiştirirseniz, navigasyon örgüsünden çıkartmış olursunuz.
<usetemplate ignoretext="Seçilen nesne navigasyon örgüsünü etkiliyor. Bunu bir Esnek Yol olarak değiştirirseniz, navigasyon örgüsünden çıkartmış olursunuz." name="okcancelignore" notext="İptal" yestext="Tamam"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_login.xml b/indra/newview/skins/default/xui/tr/panel_login.xml
index 15684ba402..28d316e46b 100644
--- a/indra/newview/skins/default/xui/tr/panel_login.xml
+++ b/indra/newview/skins/default/xui/tr/panel_login.xml
@@ -38,9 +38,9 @@
</layout_panel>
<layout_panel name="links">
<text name="create_account_text">
- CREATE YǾUR ACCǾUNT
+ HESABINIZI OLUŞTURUN
</text>
- <button name="create_new_account_btn" label="Kaydolun"/>
+ <button label="Şimdi başla" name="create_new_account_btn"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/tr/panel_navmesh_rebake.xml
deleted file mode 100644
index 78cb8bcc02..0000000000
--- a/indra/newview/skins/default/xui/tr/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_navmesh_rebake">
- <button label="Bölgeyi yeniden kaydet" name="navmesh_btn" tool_tip="Bölgenin navigasyon örgüsünü tekrar kaydetmek için tıkla."/>
- <button label="Yeniden kaydetme talep ediliyor" name="navmesh_btn_sending" tool_tip="Yeniden kaydetme talebi sunucuya gönderiliyor."/>
- <button label="Bölge yeniden kaydediliyor" name="navmesh_btn_baking" tool_tip="Bölge yeniden kaydediliyor. Tamamlandığında bu düğme kaybolacak."/>
-</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/tr/panel_nearby_chat_bar.xml
index fd954475ac..7d191191c4 100644
--- a/indra/newview/skins/default/xui/tr/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/tr/panel_nearby_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="chat_bar">
+<panel name="nearby_chat">
<line_editor label="Sohbet etmek için buraya tıklayın." name="chat_box" tool_tip="Söylemek için Enter, bağırmak için Ctrl+Enter yapın"/>
<button name="show_nearby_chat" tool_tip="yakın sohbet günlüğünü gösterir/gizler"/>
</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_region_debug.xml b/indra/newview/skins/default/xui/tr/panel_region_debug.xml
index 3f101a1824..834ece563f 100644
--- a/indra/newview/skins/default/xui/tr/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/tr/panel_region_debug.xml
@@ -30,5 +30,5 @@
<button label="En Çok Çarpışanlar..." name="top_colliders_btn" tool_tip="En çok potansiyel çarpışma yaşayan nesnelerin listesi"/>
<button label="En Çok Komut Dsy. Çalştr...." name="top_scripts_btn" tool_tip="Komut dosyalarını çalıştırırken en çok zaman harcayan nesnelerin listesi"/>
<button label="Bölgeyi Yeniden Başlat" name="restart_btn" tool_tip="2 dakikalık bir geri sayımdan sonra bölgeyi yeniden başlat"/>
- <button label="Yeniden Başlatmayı İptal Et" name="cancel_restart_btn" tool_tip="Bölgenin yeniden başlatılmasını 1 saat ertele"/>
+ <button label="Yeniden Başlatmayı İptal Et" name="cancel_restart_btn" tool_tip="Bölge yeniden başlatmasını iptal et"/>
</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/tr/panel_volume_pulldown.xml
new file mode 100644
index 0000000000..0c8c7b68b5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_volume_pulldown.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="volumepulldown_floater">
+ <slider label="Ana" name="System Volume"/>
+ <slider label="Düğmeler" name="UI Volume"/>
+ <slider label="Ortam" name="Wind Volume"/>
+ <slider label="Sesler" name="SFX Volume"/>
+ <check_box name="gesture_audio_play_btn" tool_tip="Mimiklerdeki sesleri etkinleştir"/>
+ <slider label="Müzik" name="Music Volume"/>
+ <check_box name="enable_music" tool_tip="Müzik Akışını Etkinleştir"/>
+ <slider label="Ortam" name="Media Volume"/>
+ <check_box name="enable_media" tool_tip="Akış Ortamını Etkinleştir"/>
+ <slider label="Ses" name="Voice Volume"/>
+ <check_box name="enable_voice_check" tool_tip="Sesli Sohbeti Etkinleştir"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
index eed65f8c75..1be8f5974c 100644
--- a/indra/newview/skins/default/xui/tr/strings.xml
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -137,7 +137,7 @@
Çık
</string>
<string name="create_account_url">
- http://join.secondlife.com/index.php?lang=tr-TR
+ http://join.secondlife.com/index.php?lang=tr-TR&amp;sourceid=[sourceid]
</string>
<string name="LoginFailedViewerNotPermitted">
Kullandığınız görüntüleyici ile artık Second Life&apos;a erişemezsiniz. Yeni bir görüntüleyiciyi karşıdan yüklemek için lütfen şu sayfayı ziyaret edin:
@@ -1411,6 +1411,12 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
<string name="InvFolder favorite">
Favorilerim
</string>
+ <string name="InvFolder Favorites">
+ Sık Kullanılanlarım
+ </string>
+ <string name="InvFolder favorites">
+ Sık Kullanılanlarım
+ </string>
<string name="InvFolder Current Outfit">
Mevcut Dış Görünüm
</string>
@@ -1426,6 +1432,12 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
<string name="InvFolder Meshes">
Örgüler
</string>
+ <string name="InvFolder Received Items">
+ Alınan Öğeler
+ </string>
+ <string name="InvFolder Merchant Outbox">
+ Satıcı Giden Kutusu
+ </string>
<string name="InvFolder Friends">
Arkadaşlar
</string>
diff --git a/indra/newview/skins/default/xui/zh/floater_about.xml b/indra/newview/skins/default/xui/zh/floater_about.xml
index 48a417ba46..643881e416 100644
--- a/indra/newview/skins/default/xui/zh/floater_about.xml
+++ b/indra/newview/skins/default/xui/zh/floater_about.xml
@@ -10,7 +10,7 @@
<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] [ReleaseNotes]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
CPU:[CPU]
@@ -37,51 +37,60 @@ Qt Webkit 版本: [QT_WEBKIT_VERSION]
<floater.string name="AboutTraffic">
封包損失:[PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</floater.string>
+ <floater.string name="ErrorFetchingServerReleaseNotesURL">
+ 擷取伺服器版本說明 URL 時出錯。
+ </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">
- 「第二人生」由……等多人協力開發。
-
-感謝下列居民相助,我們得以推出如此完美的版本:……。要感謝的人還很多,族繁不及備載。
-
-
-
-
-「任務永續,目標常在,希望長存,夢想萬古不朽。」——愛德華・甘迺迪
+ <text name="linden_intro">
+ 「第二人生」由以下的 Linden 家族帶給你:
+ </text>
+ <text name="contrib_intro">
+ 這些人士做了開放源碼的貢獻:
+ </text>
+ <text_editor name="contrib_names">
+ 執行時期被取代的假名稱
+ </text_editor>
+ <text name="trans_intro">
+ 以下人士提供翻譯:
+ </text>
+ <text_editor name="trans_names">
+ 執行時期被取代的假名稱
</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
-Collada DOM Copyright 2005 Sony Computer Entertainment Inc.
-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.
-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.
-GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia.
-google-perftools Copyright (c) 2005, Google Inc.
-Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
-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.
-PCRE Copyright (c) 1997-2008 University of Cambridge
-SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
-SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
-google-perftools Copyright (c) 2005, Google Inc.
+ 3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
+ APR Copyright (C) 2011 The Apache Software Foundation
+ Collada DOM Copyright 2006 Sony Computer Entertainment Inc.
+ cURL Copyright (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se)
+ DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
+ expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+ FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm, and Werner Lemberg.
+ GL Copyright (C) 1999-2004 Brian Paul.
+ GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia.
+ google-perftools Copyright (c) 2005, Google Inc.
+ Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
+ 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) 2002, Xiphophorus
+ OpenSSL Copyright (C) 1998-2008 The OpenSSL Project.
+ PCRE Copyright (c) 1997-2012 University of Cambridge
+ SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+ zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler.
+
+ 第二人生 Viewer 採用 Havok (TM) 物理引擎。 (c)Copyright 1999-2010 Havok.com Inc.(及其放照人)。 保留一切權利。 詳情見 www.havok.com。
-第二人生 Viewer 採用 Havok (TM) 物理引擎。 (c)Copyright 1999-2010 Havok.com Inc.(及其放照人)。 保留一切權利。 詳情見 www.havok.com。
+ 本軟體含有 NVIDIA Corporation 提供的源程式碼。
-保留一切權利。 詳情見 licenses.txt。
+ 保留一切權利。 詳情見 licenses.txt。
-語音聊天音頻技術:Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ 語音聊天音頻技術:Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
</text_editor>
</panel>
</tab_container>
diff --git a/indra/newview/skins/default/xui/zh/floater_about_land.xml b/indra/newview/skins/default/xui/zh/floater_about_land.xml
index 9dbc7dbdd7..76db621951 100644
--- a/indra/newview/skins/default/xui/zh/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/zh/floater_about_land.xml
@@ -129,15 +129,15 @@
流量:
</text>
<text name="DwellText">
- 0
+ 載入中...
</text>
<button label="購買土地" name="Buy Land..."/>
+ <button label="Linden 出售" name="Linden Sale..." tool_tip="土地必須有人擁有、已設有內容,並且不在拍賣中。"/>
<button label="腳本資訊" name="Scripts..."/>
<button label="為群組購買" name="Buy For Group..."/>
<button label="購買通行權" name="Buy Pass..." tool_tip="通行權允許你暫時可出入這塊土地。"/>
<button label="放棄土地" name="Abandon Land..."/>
<button label="收回土地" name="Reclaim Land..."/>
- <button label="Linden 出售" name="Linden Sale..." tool_tip="土地必須有人擁有、已設有內容,並且不在拍賣中。"/>
</panel>
<panel label="契約" name="land_covenant_panel">
<panel.string name="can_resell">
@@ -212,19 +212,19 @@
地區物件負荷倍數:[BONUS]
</text>
<text name="Simulator primitive usage:">
- 幾何元件使用:
+ 地區容納量:
</text>
<text name="objects_available">
使用 [MAX] 中的 [COUNT] (剩餘 [AVAILABLE] 可用)
</text>
<text name="Primitives parcel supports:">
- 地段所提供的幾何元件數:
+ 地段土地容納量:
</text>
<text name="object_contrib_text">
[COUNT]
</text>
<text name="Primitives on parcel:">
- 地段上的幾何元件數:
+ 地段土地衝擊量:
</text>
<text name="total_objects_text">
[COUNT]
@@ -309,8 +309,10 @@
<text name="allow_label">
允許其他居民去:
</text>
- <check_box label="編輯地形" name="edit land check" tool_tip="如果勾選,任何人皆可使你的土地變形。 最好不勾選,因為你隨時可以自行編輯你自己的土地。"/>
- <check_box label="飛行" name="check fly" tool_tip="如果勾選,居民可在你土地上飛行。 如果不勾選,居民僅可飛越你土地。"/>
+ <text name="allow_label0">
+ 飛行:
+ </text>
+ <check_box label="任何人" name="check fly" tool_tip="如果勾選,居民可在你土地上飛行。 如果不勾選,居民僅可飛越你土地。"/>
<text name="allow_label2">
建造:
</text>
@@ -326,9 +328,6 @@
</text>
<check_box label="任何人" name="check other scripts"/>
<check_box label="群組" name="check group scripts"/>
- <text name="land_options_label">
- 土地選項:
- </text>
<check_box label="安全(無傷害)" name="check safe" tool_tip="若勾選,將把土地設為安全,禁絕傷害性的戰鬥。 若未勾選,則允許傷害性的戰鬥。"/>
<check_box label="禁止推撞" name="PushRestrictCheck" tool_tip="禁止使用腳本推撞。 勾選這選項可有效防止你土地上出現滋事行為。"/>
<check_box label="將地點刊登顯示在搜尋中(L$30 / 每週)" name="ShowDirectoryCheck" tool_tip="讓其他人可以在搜尋結果中看到這塊地段"/>
@@ -368,6 +367,10 @@
快照:
</text>
<texture_picker name="snapshot_ctrl" tool_tip="點按以挑選圖片"/>
+ <text name="allow_label5">
+ 其他地段的化身可以看見本地段裡的化身,並與之交談
+ </text>
+ <check_box label="察看化身" name="SeeAvatarsCheck" tool_tip="允許其他地段的化身看到本地段包括你在內的化身,並可互相交談。"/>
<text name="landing_point">
登陸點:[LANDING]
</text>
@@ -424,6 +427,11 @@
聲音:
</text>
<check_box label="將姿勢和物件的聲音限制於此地段" name="check sound local"/>
+ <text name="Avatar Sounds:">
+ 化身聲音:
+ </text>
+ <check_box label="任何人" name="all av sound check"/>
+ <check_box label="群組" name="group av sound check"/>
<text name="Voice settings:">
語音:
</text>
@@ -435,20 +443,15 @@
<panel.string name="access_estate_defined">
(由領地定義)
</panel.string>
- <panel.string name="allow_public_access">
- 允許公開出入([MATURITY])(注意:若未勾選,將設立禁越線)
- </panel.string>
<panel.string name="estate_override">
至少一個選項在領地的層級設定
</panel.string>
- <text name="Limit access to this parcel to:">
- 此地段出入權
- </text>
+ <check_box label="允許公開出入(若未勾選,將設立禁越線)" name="public_access"/>
<text name="Only Allow">
- 僅允許經過如下驗證的居民出入:
+ 僅允許符合以下條件的居民進入:
</text>
- <check_box label="預留付款資料 [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="禁絕身份不明居民。"/>
- <check_box label="年齡驗證 [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="禁止尚未驗證年齡的居民。 參閱 [SUPPORT_SITE] 獲取進一步資訊。"/>
+ <check_box label="已預留付款資料 [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="居民必須提供付款資料才能進入這地段。 參閱 [SUPPORT_SITE] 獲取進一步資訊。"/>
+ <check_box label="年滿 18 歲 [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="居民必須年滿 18 歲才能進入這地段。 參閱 [SUPPORT_SITE] 獲取進一步資訊。"/>
<check_box label="允許出入的群組:[GROUP]" name="GroupCheck" tool_tip="設定群組於一般頁籤。"/>
<check_box label="出售通行權給:" name="PassCheck" tool_tip="允許暫時出入這個地段"/>
<combo_box name="pass_combo">
diff --git a/indra/newview/skins/default/xui/zh/floater_animation_anim_preview.xml b/indra/newview/skins/default/xui/zh/floater_animation_anim_preview.xml
new file mode 100644
index 0000000000..76cb9079c4
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_animation_anim_preview.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Anim Preview" title="ANIMATION.ANIM">
+ <text name="name_label">
+ 名稱:
+ </text>
+ <text name="description_label">
+ 描述:
+ </text>
+ <button label="上傳(L$[AMOUNT])" name="ok_btn"/>
+ <button label="取消" label_selected="取消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/zh/floater_animation_bvh_preview.xml
new file mode 100644
index 0000000000..ffb0de8a68
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_animation_bvh_preview.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Animation Preview">
+ <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">
+ 確定
+ </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">
+ 無法尋找位移。
+ </floater.string>
+ <floater.string name="E_ST_NO_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">
+ 找不到動作。
+ </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">
+ 無法取得 easeIn 值。
+ </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">
+ root joint 名稱不正確,使用 &quot;hip&quot;。
+ </floater.string>
+ <text name="name_label">
+ 名稱:
+ </text>
+ <text name="description_label">
+ 描述:
+ </text>
+ <spinner label="優先度" name="priority" tool_tip="其他動作的控制可被此動作強行取代"/>
+ <check_box label="連續" name="loop_check" tool_tip="讓此動作不斷重覆演繹"/>
+ <spinner label="入(%)" name="loop_in_point" tool_tip="設定動作中重覆演繹的起始點"/>
+ <spinner label="出(%)" name="loop_out_point" tool_tip="設定動作中重覆演繹的結束點"/>
+ <text name="hand_label">
+ 手部姿勢
+ </text>
+ <combo_box 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 name="emote_combo" tool_tip="控制動作演繹時臉部的姿態">
+ <item label="(無)" name="[None]" value=""/>
+ <item label="張口吶喊貌" name="Aaaaah" value="張口吶喊貌"/>
+ <item label="害怕" name="Afraid" value="害怕"/>
+ <item label="生氣" name="Angry" value="生氣"/>
+ <item label="燦爛笑容" name="BigSmile" value="燦爛笑容"/>
+ <item label="無聊" name="Bored" value="無聊"/>
+ <item label="哭泣" name="Cry" value="哭泣"/>
+ <item label="鄙視" name="Disdain" value="鄙視"/>
+ <item label="尷尬" name="Embarrassed" value="尷尬"/>
+ <item label="皺眉" name="Frown" value="皺眉"/>
+ <item label="親吻" name="Kiss" value="親吻"/>
+ <item label="笑" name="Laugh" value="笑"/>
+ <item label="嫌惡貌" name="Plllppt" value="嫌惡貌"/>
+ <item label="作噁" name="Repulsed" value="作噁"/>
+ <item label="傷心" name="Sad" value="傷心"/>
+ <item label="聳聳肩" name="Shrug" value="聳聳肩"/>
+ <item label="微笑" name="Smile" value="微笑"/>
+ <item label="驚喜" name="Surprise" value="驚喜"/>
+ <item label="眨眼" name="Wink" value="眨眼"/>
+ <item label="擔心" name="Worry" value="擔心"/>
+ </combo_box>
+ <text name="preview_label">
+ 預覽…
+ </text>
+ <combo_box name="preview_base_anim" tool_tip="用這個來測試你的化身從一般動作轉入動作演繹時的情況。">
+ <item label="站立" name="Standing" value="站立"/>
+ <item label="步行中" name="Walking" value="步行中"/>
+ <item label="坐著" name="Sitting" value="坐著"/>
+ <item label="飛行" name="Flying" value="飛行"/>
+ </combo_box>
+ <spinner label="淡入(秒)" name="ease_in_time" tool_tip="動作攙混植入的時間長度(秒)"/>
+ <spinner label="淡出(秒)" name="ease_out_time" tool_tip="動作攙混淡出的時間長度(秒)"/>
+ <button name="play_btn" tool_tip="播放你的動作"/>
+ <button name="pause_btn" tool_tip="暫停你的動做"/>
+ <button name="stop_btn" tool_tip="停止播放動作"/>
+ <text name="bad_animation_text">
+ 無法讀取動作檔。
+
+我們建議採用由 Poser 4 匯出的 BVH 檔案格式。
+ </text>
+ <button label="上傳(L$[AMOUNT])" name="ok_btn"/>
+ <button label="取消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_autoreplace.xml b/indra/newview/skins/default/xui/zh/floater_autoreplace.xml
new file mode 100644
index 0000000000..4ee07e6295
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_autoreplace.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="autoreplace_floater" title="自動取代設定">
+ <check_box label="啟用自動取代" name="autoreplace_enable" tool_tip="在輸入聊天內容的同時,將輸入的關鍵字代換為相應的取代文字。"/>
+ <button label="匯入清單…" name="autoreplace_import_list" tool_tip="從檔案載入先前匯出過的清單。"/>
+ <button label="匯出清單…" name="autoreplace_export_list" tool_tip="將所選清單儲存到檔案以便和他人分享。"/>
+ <button label="新的清單…" name="autoreplace_new_list" tool_tip="新建一個清單。"/>
+ <button label="刪除清單" name="autoreplace_delete_list" tool_tip="刪除所選清單。"/>
+ <button name="autoreplace_list_up" tool_tip="提高此清單的優先次序。"/>
+ <button name="autoreplace_list_down" tool_tip="降低此清單的優先次序。"/>
+ <scroll_list name="autoreplace_list_replacements">
+ <scroll_list.columns label="關鍵字" name="keyword"/>
+ <scroll_list.columns label="取代文字" name="replacement"/>
+ </scroll_list>
+ <button label="添加..." name="autoreplace_add_entry"/>
+ <button label="移除" name="autoreplace_delete_entry"/>
+ <button label="儲存項目" name="autoreplace_save_entry" tool_tip="儲存此項目。"/>
+ <button label="儲存變更" name="autoreplace_save_changes" tool_tip="儲存所有變更。"/>
+ <button label="取消" name="autoreplace_cancel" tool_tip="放棄所有變更。"/>
+</floater>
+<!--
+ <text
+ top_pad="10"
+ left="10"
+ height="16"
+ width="260"
+ follows="left|top"
+ halign="center"
+ mouse_opaque="true"
+ name="autoreplace_text2">
+ Entries
+ </text>
+-->
diff --git a/indra/newview/skins/default/xui/zh/floater_avatar.xml b/indra/newview/skins/default/xui/zh/floater_avatar.xml
new file mode 100644
index 0000000000..55b1a95a41
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_avatar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Avatar" title="選擇一個化身"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_build_options.xml b/indra/newview/skins/default/xui/zh/floater_build_options.xml
index b37cbdaa33..29f36b461c 100644
--- a/indra/newview/skins/default/xui/zh/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/zh/floater_build_options.xml
@@ -1,7 +1,30 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="build options floater" title="格線選項">
- <spinner label="格線單位(公尺)" name="GridResolution"/>
- <spinner label="格線延伸範圍(公尺)" name="GridDrawSize"/>
+ <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>
+ <text name="grid_mode_label" tool_tip="格線不透明度">
+ 模式
+ </text>
+ <combo_box name="combobox grid mode" tool_tip="選擇物件定位參考的格線尺度類型">
+ <combo_box.item label="世界格線" name="World"/>
+ <combo_box.item label="地方格線" name="Local"/>
+ <combo_box.item label="參考格線" name="Reference"/>
+ </combo_box>
+ <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="格線不透明度">
diff --git a/indra/newview/skins/default/xui/zh/floater_buy_currency.xml b/indra/newview/skins/default/xui/zh/floater_buy_currency.xml
index c2cfe5c880..fcf2800728 100644
--- a/indra/newview/skins/default/xui/zh/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/zh/floater_buy_currency.xml
@@ -46,7 +46,7 @@
L$ [AMT]
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php 付費方法] | [http://www.secondlife.com/my/account/currency.php 幣種] | [http://www.secondlife.com/my/account/exchange_rates.php 匯率]
+ [http://www.secondlife.com/my/account/payment_method_management.php 付費方式] | [http://www.secondlife.com/my/account/currency.php 幣種]
</text>
<text name="exchange_rate_note">
重新輸入金額即可察看最新的匯率。
diff --git a/indra/newview/skins/default/xui/zh/floater_camera.xml b/indra/newview/skins/default/xui/zh/floater_camera.xml
index 4319d96e89..becb7b9546 100644
--- a/indra/newview/skins/default/xui/zh/floater_camera.xml
+++ b/indra/newview/skins/default/xui/zh/floater_camera.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater">
+<floater name="camera_floater" title="攝影機控制">
<floater.string name="rotate_tooltip">
繞著焦點轉動攝影機
</floater.string>
diff --git a/indra/newview/skins/default/xui/zh/floater_chat_bar.xml b/indra/newview/skins/default/xui/zh/floater_chat_bar.xml
new file mode 100644
index 0000000000..f1a69a7688
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_chat_bar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="chat_bar" title="附近的聊天">
+ <panel name="bottom_panel">
+ <line_editor label="點按此處開始聊天。" name="chat_box" tool_tip="按下 Enter 鍵來說或按下 Ctrl+Enter 來喊叫"/>
+ <button name="show_nearby_chat" tool_tip="顯示 / 隱藏 附近的聊天紀錄"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/zh/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..4aafb31952
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_delete_env_preset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<floater name="Delete Env Preset" title="刪除環境自訂配置">
+ <string name="title_water">
+ 刪除水的自訂配置
+ </string>
+ <string name="title_sky">
+ 刪除天空自訂配置
+ </string>
+ <string name="title_day_cycle">
+ 刪除日循環
+ </string>
+ <string name="label_water">
+ 自訂配置:
+ </string>
+ <string name="label_sky">
+ 自訂配置:
+ </string>
+ <string name="label_day_cycle">
+ 日循環:
+ </string>
+ <string name="msg_confirm_deletion">
+ 確定要刪除所選自訂配置?
+ </string>
+ <string name="msg_sky_is_referenced">
+ 無法刪除日循環有所指涉的自訂配置。
+ </string>
+ <string name="combo_label">
+ -選擇一個自訂配置-
+ </string>
+ <text name="label">
+ 自訂配置:
+ </text>
+ <button label="刪除" name="delete"/>
+ <button label="取消" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_destinations.xml b/indra/newview/skins/default/xui/zh/floater_destinations.xml
new file mode 100644
index 0000000000..f50a6a631a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_destinations.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Destinations" title="目的地"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/zh/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..b84a4027ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_edit_day_cycle.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Day cycle" title="編輯日循環">
+ <string name="title_new">
+ 新建一個日循環
+ </string>
+ <string name="title_edit">
+ 編輯日循環
+ </string>
+ <string name="hint_new">
+ 為日循環定名,調整各項控制確定細節,再點按「儲存」。
+ </string>
+ <string name="hint_edit">
+ 若要編輯你的日循環,請調整下方各項控制,再點按「儲存」。
+ </string>
+ <string name="combo_label">
+ -選擇一個自訂配置-
+ </string>
+ <text name="label">
+ 自訂配置名稱:
+ </text>
+ <text name="note">
+ 注意:更改自訂配置的名稱將會新建一個自訂配置,不會改變原有的自訂配置。
+ </text>
+ <text name="hint_item1">
+ - 點按一個頁籤,編輯特定的天空設定和時間。
+ </text>
+ <text name="hint_item2">
+ - 點按並拖曳各個頁籤,即可設定過渡時間。
+ </text>
+ <text name="hint_item3">
+ - 使用 scrubber 預覽你的日循環。
+ </text>
+ <panel name="day_cycle_slider_panel">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <button label="新增鍵" label_selected="新增鍵" name="WLAddKey"/>
+ <button label="刪除鍵" label_selected="刪除鍵" name="WLDeleteKey"/>
+ <text name="WL12am">
+ 午夜 12 點
+ </text>
+ <text name="WL3am">
+ 凌晨 3 點
+ </text>
+ <text name="WL6am">
+ 上午 6 點
+ </text>
+ <text name="WL9amHash">
+ 上午 9 點
+ </text>
+ <text name="WL12pmHash">
+ 中午 12 點
+ </text>
+ <text name="WL3pm">
+ 下午 3 點
+ </text>
+ <text name="WL6pm">
+ 下午 6 點
+ </text>
+ <text name="WL9pm">
+ 下午 9 點
+ </text>
+ <text name="WL12am2">
+ 午夜 12 點
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ </panel>
+ <text name="WLCurKeyPresetText">
+ 天空設定:
+ </text>
+ <combo_box label="預設值" name="WLSkyPresets"/>
+ <text name="WLCurKeyTimeText">
+ 時間:
+ </text>
+ <time name="time" value="上午 6 點"/>
+ <check_box label="根據這設定變更我的日循環" name="make_default_cb"/>
+ <button label="儲存" name="save"/>
+ <button label="取消" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/zh/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..1ff832cdc4
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_edit_sky_preset.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Sky Preset" title="編輯天空自訂配置">
+ <string name="title_new">
+ 建立新的天空自訂配置
+ </string>
+ <string name="title_edit">
+ 編輯天空自訂配置
+ </string>
+ <string name="hint_new">
+ 為自訂配置定名,調整各項控制確定配置細節,完成後點按「儲存」。
+ </string>
+ <string name="hint_edit">
+ 若要編輯你的天空自訂配置,請調整各項控制,再點按「儲存」。
+ </string>
+ <string name="combo_label">
+ -選擇一個自訂配置-
+ </string>
+ <text name="hint">
+ 若要編輯你的自訂配置,請調整各項控制,再點按「儲存」。
+ </text>
+ <text name="label">
+ 自訂配置名稱:
+ </text>
+ <text name="note">
+ 注意:更改自訂配置的名稱將會新建一個自訂配置,不會改變原有的自訂配置。
+ </text>
+ <tab_container name="WindLight Tabs">
+ <panel label="大氣" name="Atmosphere">
+ <text name="BHText">
+ 藍天水平線
+ </text>
+ <text name="BDensText">
+ 陰霾水平線
+ </text>
+ <text name="BDensText2">
+ 藍天密度
+ </text>
+ <text name="HDText">
+ 陰霾密度
+ </text>
+ <text name="DensMultText">
+ 密度倍增
+ </text>
+ <text name="WLDistanceMultText">
+ 距離倍增
+ </text>
+ <text name="MaxAltText">
+ 最大高度
+ </text>
+ </panel>
+ <panel label="照明" name="Lighting">
+ <text name="SLCText">
+ 日/月 顏色
+ </text>
+ <text name="WLAmbientText">
+ 環境
+ </text>
+ <text name="SunGlowText">
+ 太陽光輝
+ </text>
+ <slider label="聚焦" name="WLGlowB"/>
+ <slider label="尺寸" name="WLGlowR"/>
+ <text name="WLStarText">
+ 星空亮度
+ </text>
+ <text name="SceneGammaText">
+ 場景 Gamma 值
+ </text>
+ <text name="TODText">
+ 日/月 位置
+ </text>
+ <multi_slider initial_value="0" name="WLSunPos"/>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <text name="WL12am">
+ 午夜 12 點
+ </text>
+ <text name="WL6am">
+ 上午 6 點
+ </text>
+ <text name="WL12pmHash">
+ 中午 12 點
+ </text>
+ <text name="WL6pm">
+ 下午 6 點
+ </text>
+ <text name="WL12am2">
+ 午夜 12 點
+ </text>
+ <time name="WLDayTime" value="上午 6 點"/>
+ <text name="WLEastAngleText">
+ 東升角度
+ </text>
+ </panel>
+ <panel label="雲彩" name="Clouds">
+ <text name="WLCloudColorText">
+ 雲彩顏色
+ </text>
+ <text name="WLCloudColorText2">
+ 雲彩 XY 軸 / 密度
+ </text>
+ <slider label="X" name="WLCloudX"/>
+ <slider label="Y" name="WLCloudY"/>
+ <slider label="D" name="WLCloudDensity"/>
+ <text name="WLCloudCoverageText">
+ 雲彩覆蓋
+ </text>
+ <text name="WLCloudScaleText">
+ 雲彩規模
+ </text>
+ <text name="WLCloudDetailText">
+ 雲彩細節(XY 軸 / 密度)
+ </text>
+ <slider label="X" name="WLCloudDetailX"/>
+ <slider label="Y" name="WLCloudDetailY"/>
+ <slider label="D" name="WLCloudDetailDensity"/>
+ <text name="WLCloudScrollXText">
+ 雲彩 X 滾軸
+ </text>
+ <check_box label="鎖定" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ 雲彩 Y 滾軸
+ </text>
+ <check_box label="鎖定" name="WLCloudLockY"/>
+ </panel>
+ </tab_container>
+ <check_box label="根據這自訂配置變更我的天空設定" name="make_default_cb"/>
+ <button label="儲存" name="save"/>
+ <button label="取消" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/zh/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..7943866e72
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_edit_water_preset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Water Preset" title="編輯水的自訂配置">
+ <string name="title_new">
+ 新建水的自訂配置
+ </string>
+ <string name="title_edit">
+ 編輯水的自訂配置
+ </string>
+ <string name="hint_new">
+ 為自訂配置定名,調整各項控制確定配置細節,完成後點按「儲存」。
+ </string>
+ <string name="hint_edit">
+ 若要編輯水的自訂配置,請調整各項控制,再點按「儲存」。
+ </string>
+ <string name="combo_label">
+ -選擇一個自訂配置-
+ </string>
+ <text name="hint">
+ 若要編輯你的自訂配置,請調整各項控制,再點按「儲存」。
+ </text>
+ <text name="label">
+ 自訂配置名稱:
+ </text>
+ <text name="note">
+ 注意:更改自訂配置的名稱將會新建一個自訂配置,不會改變原有的自訂配置。
+ </text>
+ <panel name="panel_water_preset">
+ <text name="water_color_label">
+ 水霧顏色
+ </text>
+ <text name="water_fog_density_label">
+ 霧密度指數
+ </text>
+ <text name="underwater_fog_modifier_label">
+ 水底霧修飾元
+ </text>
+ <text name="BHText">
+ 大波浪方向
+ </text>
+ <slider label="X" name="WaterWave1DirX"/>
+ <slider label="Y" name="WaterWave1DirY"/>
+ <text name="BDensText">
+ 反射子波比例
+ </text>
+ <text name="HDText">
+ 菲涅耳比例
+ </text>
+ <text name="FresnelOffsetText">
+ 菲涅耳偏距
+ </text>
+ <text name="BHText2">
+ 小波浪方向
+ </text>
+ <slider label="X" name="WaterWave2DirX"/>
+ <slider label="Y" name="WaterWave2DirY"/>
+ <text name="DensMultText">
+ 上折射比例
+ </text>
+ <text name="WaterScaleBelowText">
+ 下折射比例
+ </text>
+ <text name="MaxAltText">
+ 模糊倍數
+ </text>
+ <text name="BHText3">
+ 正常地圖
+ </text>
+ </panel>
+ <check_box label="根據這自訂配置變更我水的設定" name="make_default_cb"/>
+ <button label="儲存" name="save"/>
+ <button label="取消" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_environment_settings.xml b/indra/newview/skins/default/xui/zh/floater_environment_settings.xml
new file mode 100644
index 0000000000..1c6f2f936d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_environment_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="環境設定">
+ <text name="note">
+ 使用以下的選項自訂你 Viewer 的環境設定。
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="使用地區設定" name="use_region_settings"/>
+ <radio_item label="自訂我的環境" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="note">
+ 注意:你的自訂設定不會被其他使用者看見。
+ </text>
+ <text name="water_settings_title">
+ 水的設定
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-選擇一個自訂配置-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ 天空 / 日循環
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="固定天空" name="my_sky_settings"/>
+ <radio_item label="日循環" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-選擇一個自訂配置-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-選擇一個自訂配置-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="確定" name="ok_btn"/>
+ <button label="取消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_fast_timers.xml b/indra/newview/skins/default/xui/zh/floater_fast_timers.xml
new file mode 100644
index 0000000000..871849305c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_fast_timers.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="fast_timers">
+ <string name="pause">
+ 暫停
+ </string>
+ <string name="run">
+ 跑步
+ </string>
+ <button label="暫停" name="pause_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_hardware_settings.xml b/indra/newview/skins/default/xui/zh/floater_hardware_settings.xml
index 00d7590b9b..9e3bb88ac0 100644
--- a/indra/newview/skins/default/xui/zh/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/zh/floater_hardware_settings.xml
@@ -4,7 +4,7 @@
過濾:
</text>
<check_box label="各向異性過濾(若啟用會變慢)" name="ani"/>
- <text name="Antialiasing:">
+ <text name="antialiasing label">
消除鋸齒:
</text>
<combo_box label="消除鋸齒" name="fsaa">
@@ -25,6 +25,10 @@
啟用頂點緩衝物件(VBO):
</text>
<check_box initial_value="true" label="啟用 OpenGL 頂點緩衝物件(VBO)" name="vbo" tool_tip="在較新硬體上啟用,可提升效能。 但是,較舊硬體的 VBO 實作不佳,若啟用可能導致當機。"/>
+ <text name="tc label">
+ 啟用 S3TC:
+ </text>
+ <check_box initial_value="true" label="啟用材質壓縮(須重新啟動)" name="texture compression" tool_tip="在影片記憶體中壓縮材質,讓高解析度材質可以載入,但色彩品質稍差。"/>
<slider label="材質記憶體(MB):" name="GraphicsCardTextureMemory" tool_tip="配置給材質使用的記憶體量。 預設為顯像卡記憶體。 降低此值可以提升效能,但材質也會變模糊。"/>
<spinner label="霧距離比率:" name="fog"/>
<button label="確定" label_selected="確定" name="OK"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_how_to.xml b/indra/newview/skins/default/xui/zh/floater_how_to.xml
new file mode 100644
index 0000000000..e033327165
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_how_to.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_how_to" title="簡易教學"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_map.xml b/indra/newview/skins/default/xui/zh/floater_map.xml
index de39fc635d..8a030b3b3f 100644
--- a/indra/newview/skins/default/xui/zh/floater_map.xml
+++ b/indra/newview/skins/default/xui/zh/floater_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map" title="">
+<floater name="Map" title="迷你地圖">
<floater.string name="ToolTipMsg">
[REGION](雙擊以開啟地圖,按下 shift 鍵拖曳來平移)
</floater.string>
diff --git a/indra/newview/skins/default/xui/zh/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/zh/floater_merchant_outbox.xml
new file mode 100644
index 0000000000..6b6126c8e0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_merchant_outbox.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_merchant_outbox" title="商家發件匣">
+ <string name="OutboxFolderCount1">
+ 1 個資料夾
+ </string>
+ <string name="OutboxFolderCountN">
+ [NUM] 個資料夾
+ </string>
+ <string name="OutboxImporting">
+ 正在傳送資料夾…
+ </string>
+ <string name="OutboxInitializing">
+ 正在初始化…
+ </string>
+ <panel label="">
+ <panel>
+ <panel name="outbox_inventory_placeholder_panel">
+ <text name="outbox_inventory_placeholder_title">
+ 載入中...
+ </text>
+ </panel>
+ </panel>
+ <panel>
+ <button label="送往第二人生購物市集" name="outbox_import_btn" tool_tip="推到我第二人生購物市集的店面"/>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_model_preview.xml b/indra/newview/skins/default/xui/zh/floater_model_preview.xml
index 970e9e6f4f..22b3d3b065 100644
--- a/indra/newview/skins/default/xui/zh/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/zh/floater_model_preview.xml
@@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Model Preview" title="上傳模型">
- <string name="status_idle">
- 閒置中
+ <string name="status_idle"/>
+ <string name="status_parse_error">
+ 錯誤:剖析 dae 時出錯,詳見記錄檔。
+ </string>
+ <string name="status_material_mismatch">
+ 錯誤:模型材料並非參考模型的子集合。
</string>
<string name="status_reading_file">
載入中...
@@ -12,6 +16,9 @@
<string name="status_vertex_number_overflow">
錯誤:頂點數目超過 65534,程序已中止!
</string>
+ <string name="bad_element">
+ 錯誤:無效的元件
+ </string>
<string name="high">
</string>
@@ -45,6 +52,9 @@
<string name="mesh_status_missing_lod">
缺乏需要的細節層次。
</string>
+ <string name="mesh_status_invalid_material_list">
+ 細節層次材料並非參考模型的子集合。
+ </string>
<string name="layer_all">
全部
</string>
@@ -54,178 +64,249 @@
<string name="simplifying">
簡化中…
</string>
- <text name="name_label">
- 名稱:
- </text>
- <text name="lod_label">
- 預覽:
- </text>
- <combo_box name="preview_lod_combo" tool_tip="要在呈像預覽中察看的細節層次">
- <combo_item name="high">
- 細節層次:高度
- </combo_item>
- <combo_item name="medium">
- 細節層次:中度
- </combo_item>
- <combo_item name="low">
- 細節層次:低度
- </combo_item>
- <combo_item name="lowest">
- 細節層次:最低
- </combo_item>
- </combo_box>
- <panel>
- <text name="streaming cost">
- 資源花費:[COST]
- </text>
- <text name="physics cost">
- 物理花費:[COST]
- </text>
- <text name="upload fee">
- 上傳費:無
- </text>
- </panel>
- <text name="status">
- [STATUS]
- </text>
- <button label="預設值" name="reset_btn" tool_tip="重設為預設值"/>
- <button label="上傳" name="ok_btn" tool_tip="上傳至模擬器"/>
- <button label="取消" name="cancel_btn"/>
- <tab_container name="import_tab">
- <panel label="細節層次" name="lod_panel">
- <text name="lod_table_header">
- 選擇細節層次:
- </text>
- <text name="high_label" value="高"/>
- <text name="high_triangles" value="0"/>
- <text name="high_vertices" value="0"/>
- <text name="medium_label" value="中"/>
- <text name="medium_triangles" value="0"/>
- <text name="medium_vertices" value="0"/>
- <text name="low_label" value="低"/>
- <text name="low_triangles" value="0"/>
- <text name="low_vertices" value="0"/>
- <text name="lowest_label" value="最低"/>
- <text name="lowest_triangles" value="0"/>
- <text name="lowest_vertices" value="0"/>
- <text name="lod_table_footer">
- 細節層次:[DETAIL]
- </text>
- <radio_group name="lod_file_or_limit" value="lod_from_file">
- <radio_item label="從檔案載入" name="lod_from_file"/>
- <radio_item label="自動生成" name="lod_auto_generate"/>
- <radio_item label="無" name="lod_none"/>
- </radio_group>
- <button label="瀏覽…" name="lod_browse"/>
- <combo_box name="lod_mode">
- <combo_item name="triangle_limit">
- 三角形上限
- </combo_item>
- <combo_item name="error_threshold">
- 錯誤門檻
- </combo_item>
- </combo_box>
- <text name="build_operator_text">
- 建製操作元:
- </text>
- <text name="queue_mode_text">
- 佇列模式:
- </text>
- <combo_box name="build_operator">
- <combo_item name="edge_collapse">
- 側邊摺疊
- </combo_item>
- <combo_item name="half_edge_collapse">
- 半側邊摺疊
- </combo_item>
- </combo_box>
- <combo_box name="queue_mode">
- <combo_item name="greedy">
- 儘量最大
- </combo_item>
- <combo_item name="lazy">
- 儘量最小
- </combo_item>
- <combo_item name="independent">
- 獨立
- </combo_item>
- </combo_box>
- <text name="border_mode_text">
- 邊界模式:
+ <string name="tbd">
+ (未定)
+ </string>
+ <panel name="left_panel">
+ <panel name="model_name_representation_panel">
+ <text name="name_label">
+ 模型名稱:
</text>
- <text name="share_tolderance_text">
- 分享容忍:
+ <text name="model_category_label">
+ 這模型代表…
</text>
- <combo_box name="border_mode">
- <combo_item name="border_unlock">
- 解鎖
- </combo_item>
- <combo_item name="border_lock">
- 鎖定
- </combo_item>
+ <combo_box name="model_category_combo">
+ <combo_item label="選擇一項…" name="Choose one"/>
+ <combo_item label="化身形狀" name="Avatar shape"/>
+ <combo_item label="化身附件" name="Avatar attachment"/>
+ <combo_item label="會移動的物件(車輛、動物)" name="Moving object (vehicle, animal)"/>
+ <combo_item label="建製元件" name="Building Component"/>
+ <combo_item label="大型、不會移動等類型" name="Large, non moving etc"/>
+ <combo_item label="較小型、不會移動等類型" name="Smaller, non-moving etc"/>
+ <combo_item label="並非其中任何一個" name="Not really any of these"/>
</combo_box>
- <text name="crease_label">
- 皺褶角度:
- </text>
- <spinner name="crease_angle" value="75"/>
</panel>
- <panel label="物理" name="physics_panel">
- <panel name="physics geometry">
- <radio_group name="physics_load_radio" value="physics_load_from_file">
- <radio_item label="檔案:" name="physics_load_from_file"/>
- <radio_item label="使用細節層次:" name="physics_use_lod"/>
- </radio_group>
- <combo_box name="physics_lod_combo" tool_tip="物理形狀所採用的細節層次">
- <combo_item name="physics_lowest">
- 最低
- </combo_item>
- <combo_item name="physics_low">
- 低
- </combo_item>
- <combo_item name="physics_medium">
- 中
- </combo_item>
- <combo_item name="physics_high">
- 高
- </combo_item>
+ <tab_container name="import_tab">
+ <panel label="細節層次" name="lod_panel" title="細節層次">
+ <text initial_value="來源" name="source" value="來源"/>
+ <text initial_value="三角形" name="triangles" value="三角形"/>
+ <text initial_value="頂點" name="vertices" value="頂點"/>
+ <text initial_value="高" name="high_label" value="高"/>
+ <combo_box name="lod_source_high">
+ <item name="Load from file" value="從檔案載入"/>
+ <item name="Generate" value="產生"/>
</combo_box>
- <button label="瀏覽…" name="physics_browse"/>
- </panel>
- <panel name="physics analysis">
- <slider label="平滑:" name="Smooth"/>
- <check_box label="關閉洞口(慢)" name="Close Holes (Slow)"/>
- <button label="分析" name="Decompose"/>
- <button label="取消" name="decompose_cancel"/>
+ <button label="瀏覽…" name="lod_browse_high"/>
+ <combo_box name="lod_mode_high">
+ <item name="Triangle Limit" value="三角形上限"/>
+ <item name="Error Threshold" value="錯誤門檻"/>
+ </combo_box>
+ <text initial_value="0" name="high_triangles" value="0"/>
+ <text initial_value="0" name="high_vertices" value="0"/>
+ <text initial_value="中" name="medium_label" value="中"/>
+ <combo_box name="lod_source_medium">
+ <item name="Load from file" value="從檔案載入"/>
+ <item name="Generate" value="產生"/>
+ <item name="Use LoD above" value="以上使用低階細節"/>
+ </combo_box>
+ <button label="瀏覽…" name="lod_browse_medium"/>
+ <combo_box name="lod_mode_medium">
+ <item name="Triangle Limit" value="三角形上限"/>
+ <item name="Error Threshold" value="錯誤門檻"/>
+ </combo_box>
+ <text initial_value="0" name="medium_triangles" value="0"/>
+ <text initial_value="0" name="medium_vertices" value="0"/>
+ <text initial_value="低" name="low_label" value="低"/>
+ <combo_box name="lod_source_low">
+ <item name="Load from file" value="從檔案載入"/>
+ <item name="Generate" value="產生"/>
+ <item name="Use LoD above" value="以上使用低階細節"/>
+ </combo_box>
+ <button label="瀏覽…" name="lod_browse_low"/>
+ <combo_box name="lod_mode_low">
+ <item name="Triangle Limit" value="三角形上限"/>
+ <item name="Error Threshold" value="錯誤門檻"/>
+ </combo_box>
+ <text initial_value="0" name="low_triangles" value="0"/>
+ <text initial_value="0" name="low_vertices" value="0"/>
+ <text initial_value="最低" name="lowest_label" value="最低"/>
+ <combo_box name="lod_source_lowest">
+ <item name="Load from file" value="從檔案載入"/>
+ <item name="Generate" value="產生"/>
+ <item name="Use LoD above" value="以上使用低階細節"/>
+ </combo_box>
+ <button label="瀏覽…" name="lod_browse_lowest"/>
+ <combo_box name="lod_mode_lowest">
+ <item name="Triangle Limit" value="三角形上限"/>
+ <item name="Error Threshold" value="錯誤門檻"/>
+ </combo_box>
+ <text initial_value="0" name="lowest_triangles" value="0"/>
+ <text initial_value="0" name="lowest_vertices" value="0"/>
+ <check_box label="產生法線" name="gen_normals"/>
+ <text initial_value="皺褶角度:" name="crease_label" value="皺褶角度:"/>
+ <spinner name="crease_angle" value="75"/>
</panel>
- <panel name="physics simplification">
- <slider label="階段數:" name="Combine Quality"/>
- <slider label="細節比例:" name="Detail Scale"/>
- <slider label="保留:" name="Retain%"/>
- <button label="簡化" name="Simplify"/>
- <button label="取消" name="simplify_cancel"/>
+ <panel label="物理" name="physics_panel">
+ <panel name="physics geometry">
+ <text name="first_step_name">
+ 步驟 1:細節層次
+ </text>
+ <combo_box name="physics_lod_combo" tool_tip="物理形狀所採用的細節層次">
+ <combo_item name="choose_one">
+ 選擇一項…
+ </combo_item>
+ <combo_item name="physics_high">
+ 高
+ </combo_item>
+ <combo_item name="physics_medium">
+ 中
+ </combo_item>
+ <combo_item name="physics_low">
+ 低
+ </combo_item>
+ <combo_item name="physics_lowest">
+ 最低
+ </combo_item>
+ <combo_item name="load_from_file">
+ 來自檔案
+ </combo_item>
+ </combo_box>
+ <button label="瀏覽…" name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <text name="method_label">
+ 步驟 2:分析
+ </text>
+ <text name="analysis_method_label">
+ 方法:
+ </text>
+ <text name="quality_label">
+ 品質:
+ </text>
+ <text name="smooth_method_label">
+ 平滑:
+ </text>
+ <check_box label="關閉洞口" name="Close Holes (Slow)"/>
+ <button label="分析" name="Decompose"/>
+ <button label="取消" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <text name="second_step_label">
+ 步驟 3:簡化
+ </text>
+ <text name="simp_method_header">
+ 方法:
+ </text>
+ <text name="pass_method_header">
+ 階段數:
+ </text>
+ <text name="Detail Scale label">
+ 細節比例:
+ </text>
+ <text name="Retain%_label">
+ 保留:
+ </text>
+ <combo_box name="Combine Quality" value="1"/>
+ <button label="簡化" name="Simplify"/>
+ <button label="取消" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <text name="results_text">
+ 結果:
+ </text>
+ <text name="physics_triangles">
+ 三角形:[TRIANGLES],
+ </text>
+ <text name="physics_points">
+ 頂點:[POINTS],
+ </text>
+ <text name="physics_hulls">
+ 殼面:[HULLS]
+ </text>
+ </panel>
</panel>
- <panel name="physics info">
- <slider label="預覽伸展:" name="physics_explode"/>
- <text name="physics_triangles">
- 三角形:[TRIANGLES]
+ <panel label="上傳選項" name="modifiers_panel">
+ <text name="scale_label">
+ 比例(1 = 原比例):
</text>
- <text name="physics_points">
- 頂點:[POINTS]
+ <spinner name="import_scale" value="1.0"/>
+ <text name="dimensions_label">
+ 規格:
</text>
- <text name="physics_hulls">
- 殼面:[HULLS]
+ <text name="import_dimensions">
+ [X] X [Y] X [Z]
</text>
+ <check_box label="包含材質" name="upload_textures"/>
+ <text name="include_label">
+ 僅限化身模型:
+ </text>
+ <check_box label="包含表皮重量" name="upload_skin"/>
+ <check_box label="包含接點位置" name="upload_joints"/>
+ <text name="pelvis_offset_label">
+ Z 偏距(升高或降低化身):
+ </text>
+ <spinner name="pelvis_offset" value="0.0"/>
</panel>
- </panel>
- <panel label="修飾器" name="modifiers_panel">
- <spinner name="import_scale" value="1.0"/>
- <text name="import_dimensions">
- [X] x [Y] x [Z] 公尺
+ </tab_container>
+ <panel name="weights_and_warning_panel">
+ <button label="計算重量和費用" name="calculate_btn" tool_tip="計算重量和費用"/>
+ <button label="取消" name="cancel_btn"/>
+ <button label="上傳" name="ok_btn" tool_tip="上傳至模擬器"/>
+ <button label="清除設定並重設形式" name="reset_btn"/>
+ <text name="upload_fee">
+ 上傳費用:L$ [FEE]
+ </text>
+ <text name="prim_weight">
+ 土地衝擊量:[EQ]
+ </text>
+ <text name="download_weight">
+ 下載:[ST]
+ </text>
+ <text name="physics_weight">
+ 物理:[PH]
+ </text>
+ <text name="server_weight">
+ 伺服器:[SIM]
+ </text>
+ <text name="warning_title">
+ 附註:
+ </text>
+ <text name="warning_message">
+ 你無權上傳網面模型。 [[VURL] 瞭解如何]通過認證。
+ </text>
+ <text name="status">
+ [STATUS]
</text>
- <check_box label="材質" name="upload_textures"/>
- <check_box label="表皮重量" name="upload_skin"/>
- <check_box label="接點位置" name="upload_joints"/>
- <spinner name="pelvis_offset" value="0.0"/>
</panel>
- </tab_container>
+ </panel>
+ <text name="lod_label">
+ 預覽:
+ </text>
+ <panel name="right_panel">
+ <combo_box name="preview_lod_combo" tool_tip="要在呈像預覽中察看的細節層次">
+ <combo_item name="high">
+ 高
+ </combo_item>
+ <combo_item name="medium">
+ 中
+ </combo_item>
+ <combo_item name="low">
+ 低
+ </combo_item>
+ <combo_item name="lowest">
+ 最低
+ </combo_item>
+ </combo_box>
+ <text name="label_display">
+ 顯示…
+ </text>
+ <check_box label="邊" name="show_edges"/>
+ <check_box label="物理" name="show_physics"/>
+ <check_box label="材質" name="show_textures"/>
+ <check_box label="表皮重量" name="show_skin_weight"/>
+ <check_box label="接點" name="show_joint_positions"/>
+ <text name="physics_explode_label">
+ 預覽伸展:
+ </text>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_moveview.xml b/indra/newview/skins/default/xui/zh/floater_moveview.xml
index 18ef63d00e..0b267e8fae 100644
--- a/indra/newview/skins/default/xui/zh/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/zh/floater_moveview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater">
+<floater name="move_floater" title="行走 / 跑步 / 飛行">
<string name="walk_forward_tooltip">
向前走(按下向上箭頭或 W 鍵)
</string>
diff --git a/indra/newview/skins/default/xui/zh/floater_my_appearance.xml b/indra/newview/skins/default/xui/zh/floater_my_appearance.xml
new file mode 100644
index 0000000000..217ea5d1f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_my_appearance.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_appearance" title="外觀">
+ <panel label="編輯外觀" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_my_inventory.xml b/indra/newview/skins/default/xui/zh/floater_my_inventory.xml
new file mode 100644
index 0000000000..187597f4eb
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_my_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_inventory" title="收納區"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_object_weights.xml b/indra/newview/skins/default/xui/zh/floater_object_weights.xml
new file mode 100644
index 0000000000..d2875b24b4
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_object_weights.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="object_weights" title="進階">
+ <floater.string name="nothing_selected" value="--"/>
+ <text name="selected_text" value="已選"/>
+ <text name="objects" value="--"/>
+ <text name="objects_label" value="物件"/>
+ <text name="prims" value="--"/>
+ <text name="prims_label" value="幾何元件"/>
+ <text name="weights_of_selected_text" value="所選物重量"/>
+ <text name="download" value="--"/>
+ <text name="download_label" value="下載"/>
+ <text name="physics" value="--"/>
+ <text name="physics_label" value="物理"/>
+ <text name="server" value="--"/>
+ <text name="server_label" value="伺服器"/>
+ <text name="display" value="--"/>
+ <text name="display_label" value="顯示"/>
+ <text name="land_impacts_text" value="土地衝擊量"/>
+ <text name="selected" value="--"/>
+ <text name="selected_label" value="選擇"/>
+ <text name="rezzed_on_land" value="--"/>
+ <text name="rezzed_on_land_label" value="已產生到土地上"/>
+ <text name="remaining_capacity" value="--"/>
+ <text name="remaining_capacity_label" value="剩餘容納量"/>
+ <text name="total_capacity" value="--"/>
+ <text name="total_capacity_label" value="總容納量"/>
+ <text name="help_SLURL" value="[secondlife:///app/help/object_weights 這是什麼?]"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_pathfinding_characters.xml b/indra/newview/skins/default/xui/zh/floater_pathfinding_characters.xml
new file mode 100644
index 0000000000..e6971d111f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_pathfinding_characters.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_pathfinding_characters" title="尋徑角色">
+ <floater.string name="messaging_get_inprogress">
+ 尋徑角色查詢中…
+ </floater.string>
+ <floater.string name="messaging_get_error">
+ 查詢尋徑角色時出錯。
+ </floater.string>
+ <floater.string name="messaging_complete_none_found">
+ 沒有尋徑角色。
+ </floater.string>
+ <floater.string name="messaging_complete_available">
+ 從 [NUM_TOTAL] 個角色中選取了 [NUM_SELECTED] 個。
+ </floater.string>
+ <floater.string name="messaging_not_enabled">
+ 這地區並未啟用尋徑。
+ </floater.string>
+ <floater.string name="character_cpu_time">
+ [CPU_TIME] 微秒
+ </floater.string>
+ <floater.string name="character_owner_loading">
+ [Loading]
+ </floater.string>
+ <floater.string name="character_owner_unknown">
+ [Unknown]
+ </floater.string>
+ <floater.string name="character_owner_group">
+ [group]
+ </floater.string>
+ <panel>
+ <scroll_list name="objects_scroll_list">
+ <scroll_list.columns label="名稱" name="name"/>
+ <scroll_list.columns label="描述" name="description"/>
+ <scroll_list.columns label="所有人" name="owner"/>
+ <scroll_list.columns label="中央處理器" name="cpu_time"/>
+ <scroll_list.columns label="高度" name="altitude"/>
+ </scroll_list>
+ <text name="messaging_status">
+ 角色:
+ </text>
+ <button label="刷新清單" name="refresh_objects_list"/>
+ <button label="全選" name="select_all_objects"/>
+ <button label="全都不選" name="select_none_objects"/>
+ </panel>
+ <panel>
+ <text name="actions_label">
+ 所選角色所採動作:
+ </text>
+ <check_box label="顯示指標" name="show_beacon"/>
+ <check_box label="顯示物理囊" name="show_physics_capsule"/>
+ <button label="取得" name="take_objects"/>
+ <button label="拿取副本" name="take_copy_objects"/>
+ <button label="瞬間傳送我到那裡" name="teleport_me_to_object" tool_tip="只在選取了一個角色時啟用。"/>
+ <button label="退回" name="return_objects"/>
+ <button label="刪除" name="delete_objects"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/zh/floater_pathfinding_console.xml
new file mode 100644
index 0000000000..be009b54d8
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_pathfinding_console.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_pathfinding_console" title="尋徑察看 / 測試">
+ <floater.string name="navmesh_viewer_status_library_not_implemented">
+ 找不到尋徑函式庫實作。
+ </floater.string>
+ <floater.string name="navmesh_viewer_status_region_not_enabled">
+ 這地區並未啟用尋徑。
+ </floater.string>
+ <floater.string name="navmesh_viewer_status_region_loading">
+ 等待地區完成載入。
+ </floater.string>
+ <floater.string name="navmesh_viewer_status_checking_version">
+ 正在檢查導航網面狀態。
+ </floater.string>
+ <floater.string name="navmesh_viewer_status_downloading">
+ 正在下載導航網面。
+ </floater.string>
+ <floater.string name="navmesh_viewer_status_updating">
+ 伺服器上的導航網面已變更。 正在下載最新的導航網面。
+ </floater.string>
+ <floater.string name="navmesh_viewer_status_has_navmesh">
+ 最新的導航網面下載完成。
+ </floater.string>
+ <floater.string name="navmesh_viewer_status_error">
+ 無法完成導航網面下載。
+ </floater.string>
+ <floater.string name="navmesh_simulator_status_pending">
+ 導航網面有變更待存。
+ </floater.string>
+ <floater.string name="navmesh_simulator_status_building">
+ 正在建構導航網面。
+ </floater.string>
+ <floater.string name="navmesh_simulator_status_some_pending">
+ 某些導航網面地區有變更待存。
+ </floater.string>
+ <floater.string name="navmesh_simulator_status_some_building">
+ 正在建構某些導航網面地區。
+ </floater.string>
+ <floater.string name="navmesh_simulator_status_pending_and_building">
+ 某些導航網面地區有變更待存,其他的正在建構中。
+ </floater.string>
+ <floater.string name="navmesh_simulator_status_complete">
+ 導航網面已全面更新。
+ </floater.string>
+ <floater.string name="pathing_library_not_implemented">
+ 找不到尋徑函式庫實作。
+ </floater.string>
+ <floater.string name="pathing_region_not_enabled">
+ 這地區並未啟用尋徑。
+ </floater.string>
+ <floater.string name="pathing_choose_start_and_end_points">
+ 請選擇起點和終點。
+ </floater.string>
+ <floater.string name="pathing_choose_start_point">
+ 請選擇起點。
+ </floater.string>
+ <floater.string name="pathing_choose_end_point">
+ 請選擇終點。
+ </floater.string>
+ <floater.string name="pathing_path_valid">
+ 路徑以橘色顯示。
+ </floater.string>
+ <floater.string name="pathing_path_invalid">
+ 在所選的點之間找不到路徑。
+ </floater.string>
+ <floater.string name="pathing_error">
+ 產生路徑時出錯。
+ </floater.string>
+ <tab_container name="view_test_tab_container">
+ <panel label="視角" name="view_panel">
+ <text name="show_label">
+ 顯示:
+ </text>
+ <check_box label="世界" name="show_world"/>
+ <check_box label="僅限可移動的" name="show_world_movables_only"/>
+ <check_box label="導航網面" name="show_navmesh"/>
+ <text name="show_walkability_label">
+ 顯示可行走地圖:
+ </text>
+ <combo_box name="show_heatmap_mode">
+ <combo_box.item label="不顯示" name="show_heatmap_mode_none"/>
+ <combo_box.item label="類型 A 角色" name="show_heatmap_mode_a"/>
+ <combo_box.item label="類型 B 角色" name="show_heatmap_mode_b"/>
+ <combo_box.item label="類型 C 角色" name="show_heatmap_mode_c"/>
+ <combo_box.item label="類型 D 角色" name="show_heatmap_mode_d"/>
+ </combo_box>
+ <check_box label="可行走的" name="show_walkables"/>
+ <check_box label="實質體積" name="show_material_volumes"/>
+ <check_box label="靜態障礙" name="show_static_obstacles"/>
+ <check_box label="排除體積" name="show_exclusion_volumes"/>
+ <check_box label="水平面" name="show_water_plane"/>
+ <check_box label="具 X 光透視力" name="show_xray"/>
+ </panel>
+ <panel label="測試路徑" name="test_panel">
+ <text name="ctrl_click_label">
+ 按住 Ctrl 並點按即可選擇起點。
+ </text>
+ <text name="shift_click_label">
+ 按住 Shift 並點按即可選擇終點。
+ </text>
+ <text name="character_width_label">
+ 角色寬度
+ </text>
+ <slider name="character_width" value="1"/>
+ <text name="character_width_unit_label">
+ 公尺
+ </text>
+ <text name="character_type_label">
+ 角色類型
+ </text>
+ <combo_box name="path_character_type">
+ <combo_box.item label="無" name="path_character_type_none"/>
+ <combo_box.item label="A" name="path_character_type_a"/>
+ <combo_box.item label="B" name="path_character_type_b"/>
+ <combo_box.item label="C" name="path_character_type_c"/>
+ <combo_box.item label="D" name="path_character_type_d"/>
+ </combo_box>
+ <button label="清除路徑" name="clear_path"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/zh/floater_pathfinding_linksets.xml
new file mode 100644
index 0000000000..22e5d2e846
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_pathfinding_linksets.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_pathfinding_linksets" title="尋徑聯結集">
+ <floater.string name="messaging_get_inprogress">
+ 尋徑聯結集查詢中…
+ </floater.string>
+ <floater.string name="messaging_get_error">
+ 查詢尋徑聯結集時出錯。
+ </floater.string>
+ <floater.string name="messaging_set_inprogress">
+ 正在修改所選尋徑聯結集…
+ </floater.string>
+ <floater.string name="messaging_set_error">
+ 修改所選尋徑聯結集時出錯。
+ </floater.string>
+ <floater.string name="messaging_complete_none_found">
+ 沒有尋徑聯結集。
+ </floater.string>
+ <floater.string name="messaging_complete_available">
+ 從 [NUM_TOTAL] 個聯結集中選取了 [NUM_SELECTED] 個。
+ </floater.string>
+ <floater.string name="messaging_not_enabled">
+ 這地區並未啟用尋徑。
+ </floater.string>
+ <floater.string name="linkset_terrain_name">
+ [Terrain]
+ </floater.string>
+ <floater.string name="linkset_terrain_description">
+ --
+ </floater.string>
+ <floater.string name="linkset_terrain_owner">
+ --
+ </floater.string>
+ <floater.string name="linkset_terrain_scripted">
+ --
+ </floater.string>
+ <floater.string name="linkset_terrain_land_impact">
+ --
+ </floater.string>
+ <floater.string name="linkset_terrain_dist_from_you">
+ --
+ </floater.string>
+ <floater.string name="linkset_owner_loading">
+ [Loading]
+ </floater.string>
+ <floater.string name="linkset_owner_unknown">
+ [Unknown]
+ </floater.string>
+ <floater.string name="linkset_owner_group">
+ [group]
+ </floater.string>
+ <floater.string name="linkset_is_scripted">
+ 是
+ </floater.string>
+ <floater.string name="linkset_is_not_scripted">
+ 否
+ </floater.string>
+ <floater.string name="linkset_is_unknown_scripted">
+ 未知
+ </floater.string>
+ <floater.string name="linkset_use_walkable">
+ 可行走的
+ </floater.string>
+ <floater.string name="linkset_use_static_obstacle">
+ 靜態障礙
+ </floater.string>
+ <floater.string name="linkset_use_dynamic_obstacle">
+ 可移動障礙
+ </floater.string>
+ <floater.string name="linkset_use_material_volume">
+ 實質體積
+ </floater.string>
+ <floater.string name="linkset_use_exclusion_volume">
+ 排除體積
+ </floater.string>
+ <floater.string name="linkset_use_dynamic_phantom">
+ 可移動幻影
+ </floater.string>
+ <floater.string name="linkset_is_terrain">
+ [unmodifiable]
+ </floater.string>
+ <floater.string name="linkset_is_restricted_state">
+ [restricted]
+ </floater.string>
+ <floater.string name="linkset_is_non_volume_state">
+ [concave]
+ </floater.string>
+ <floater.string name="linkset_is_restricted_non_volume_state">
+ [restricted,concave]
+ </floater.string>
+ <floater.string name="linkset_choose_use">
+ 選擇聯結集的使用…
+ </floater.string>
+ <panel>
+ <combo_box name="filter_by_linkset_use">
+ <combo_box.item label="按聯結集的使用來過濾…" name="filter_by_linkset_use_none"/>
+ <combo_box.item label="可行走的" name="filter_by_linkset_use_walkable"/>
+ <combo_box.item label="靜態障礙" name="filter_by_linkset_use_static_obstacle"/>
+ <combo_box.item label="可移動障礙" name="filter_by_linkset_use_dynamic_obstacle"/>
+ <combo_box.item label="實質體積" name="filter_by_linkset_use_material_volume"/>
+ <combo_box.item label="排除體積" name="filter_by_linkset_use_exclusion_volume"/>
+ <combo_box.item label="可移動幻影" name="filter_by_linkset_use_dynamic_phantom"/>
+ </combo_box>
+ <button label="套用" name="apply_filters"/>
+ <button label="清除" name="clear_filters"/>
+ <scroll_list name="objects_scroll_list">
+ <scroll_list.columns label="名稱(根幾何元件)" name="name"/>
+ <scroll_list.columns label="描述(根幾何元件)" name="description"/>
+ <scroll_list.columns label="所有人" name="owner"/>
+ <scroll_list.columns label="有腳本" name="scripted"/>
+ <scroll_list.columns label="衝擊" name="land_impact"/>
+ <scroll_list.columns label="距離" name="dist_from_you"/>
+ <scroll_list.columns label="聯結集的使用" name="linkset_use"/>
+ <scroll_list.columns label="A %" name="a_percent"/>
+ <scroll_list.columns label="B %" name="b_percent"/>
+ <scroll_list.columns label="C %" name="c_percent"/>
+ <scroll_list.columns label="D %" name="d_percent"/>
+ </scroll_list>
+ <text name="messaging_status">
+ 聯結集:
+ </text>
+ <button label="刷新清單" name="refresh_objects_list"/>
+ <button label="全選" name="select_all_objects"/>
+ <button label="全都不選" name="select_none_objects"/>
+ </panel>
+ <panel>
+ <check_box label="顯示指標" name="show_beacon"/>
+ <button label="取得" name="take_objects"/>
+ <button label="拿取副本" name="take_copy_objects"/>
+ <button label="瞬間傳送我到那裡" name="teleport_me_to_object"/>
+ <button label="退回" name="return_objects"/>
+ <button label="刪除" name="delete_objects"/>
+ </panel>
+ <panel>
+ <text name="walkability_coefficients_label">
+ 可行走性:
+ </text>
+ <text name="edit_a_label">
+ A
+ </text>
+ <line_editor name="edit_a_value" tool_tip="A 類型角色的可行走性。以類人類為範例角色類型。"/>
+ <text name="edit_b_label">
+ B
+ </text>
+ <line_editor name="edit_b_value" tool_tip="B 類型角色的可行走性。以獸類為範例角色類型。"/>
+ <text name="edit_c_label">
+ C
+ </text>
+ <line_editor name="edit_c_value" tool_tip="C 類型角色的可行走性。以機械類為範例角色類型。"/>
+ <text name="edit_d_label">
+ D
+ </text>
+ <line_editor name="edit_d_value" tool_tip="D 類型角色的可行走性。以其他種類為範例角色類型。"/>
+ <button label="套用變更" name="apply_edit_values"/>
+ <text name="suggested_use_a_label">
+ (類人類)
+ </text>
+ <text name="suggested_use_b_label">
+ (獸類)
+ </text>
+ <text name="suggested_use_c_label">
+ (機械類)
+ </text>
+ <text name="suggested_use_d_label">
+ (其他)
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_people.xml b/indra/newview/skins/default/xui/zh/floater_people.xml
new file mode 100644
index 0000000000..f629f2f184
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_people.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_people" title="人群">
+ <panel_container name="main_panel">
+ <panel label="群組檔案" name="panel_group_info_sidetray"/>
+ <panel label="被封鎖的居民與物件" name="panel_block_list_sidetray"/>
+ </panel_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_picks.xml b/indra/newview/skins/default/xui/zh/floater_picks.xml
new file mode 100644
index 0000000000..a8bfcd99e3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_picks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_picks" title="精選地點"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_places.xml b/indra/newview/skins/default/xui/zh/floater_places.xml
new file mode 100644
index 0000000000..f6ef1e2141
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_places.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_places" title="地點">
+ <panel label="地點" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preferences_proxy.xml b/indra/newview/skins/default/xui/zh/floater_preferences_proxy.xml
new file mode 100644
index 0000000000..f91d5c5cdb
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_preferences_proxy.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Proxy Settings Floater" title="代理伺服器設定">
+ <check_box initial_value="false" label="使用 HTTP 代理伺服器瀏覽網頁" name="web_proxy_enabled"/>
+ <text name="http_proxy_label">
+ HTTP 代理伺服器:
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="你希望使用的 HTTP 代理伺服器的 DNS 名稱或 IP 位址。"/>
+ <spinner label="埠號:" name="web_proxy_port" tool_tip="你希望使用的 HTTP 代理伺服器的埠號。"/>
+ <check_box label="使用 SOCKS 5 代理伺服器處理 UDP 資料流" name="socks_proxy_enabled"/>
+ <text name="socks5_proxy_label">
+ SOCKS 5 代理伺服器:
+ </text>
+ <line_editor name="socks_proxy_editor" tool_tip="你希望使用的 SOCKS 5 代理伺服器的 DNS 名稱或 IP 位址。"/>
+ <spinner label="埠號:" name="socks_proxy_port" tool_tip="你希望使用的 SOCKS 5 代理伺服器的埠號。"/>
+ <text name="socks_auth_label">
+ SOCKS 鑒認:
+ </text>
+ <radio_group name="socks5_auth_type">
+ <radio_item label="無鑒認" name="Socks5NoAuth" tool_tip="Socks5 代理伺服器無需鑒認。" value="無"/>
+ <radio_item label="使用者名稱 / 密碼" name="Socks5UserPass" tool_tip="Socks5 代理伺服器需要透過使用者名稱 / 密碼鑒認。" value="UserPass"/>
+ </radio_group>
+ <text name="socks5_username_label">
+ 使用者名稱:
+ </text>
+ <text name="socks5_password_label">
+ 密碼:
+ </text>
+ <line_editor name="socks5_username" tool_tip="你的 SOCKS 5 伺服器鑒認所用的使用者名稱"/>
+ <line_editor name="socks5_password" tool_tip="你的 SOCKS 5 伺服器鑒認所用的密碼"/>
+ <text name="other_proxy_label">
+ 其他 HTTP 資料流代理伺服器:
+ </text>
+ <radio_group name="other_http_proxy_type">
+ <radio_item label="不使用代理伺服器" name="OtherNoProxy" tool_tip="非網頁的 HTTP 資料流不會被導向任何代理伺服器。" value="無"/>
+ <radio_item label="使用 HTTP 代理伺服器" name="OtherHTTPProxy" tool_tip="非網頁的 HTTP 資料流將導向所設的網頁代理伺服器。" value="網頁"/>
+ <radio_item label="使用 SOCKS 5 代理伺服器" name="OtherSocksProxy" tool_tip="非網頁的 HTTP 資料流將導向所設的 Socks 5 代理伺服器。" value="網路套接"/>
+ </radio_group>
+ <button label="確定" label_selected="確定" name="OK"/>
+ <button label="取消" label_selected="取消" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preview_animation.xml b/indra/newview/skins/default/xui/zh/floater_preview_animation.xml
index 3be6f7a35e..b94d67b7ef 100644
--- a/indra/newview/skins/default/xui/zh/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/zh/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
描述:
</text>
- <button label="在虛擬世界播放" label_selected="停止" name="Anim play btn" tool_tip="播放此動作讓他人看見"/>
- <button label="在本地播放" label_selected="停止" name="Anim audition btn" tool_tip="播放此動作,只給自己看"/>
+ <button label="在虛擬世界播放" label_selected="停止" name="Inworld" tool_tip="播放此動作讓他人看見"/>
+ <button label="在本地播放" label_selected="停止" name="Locally" tool_tip="播放此動作,只給自己看"/>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_search.xml b/indra/newview/skins/default/xui/zh/floater_search.xml
index d5abf37b86..3e85a529ae 100644
--- a/indra/newview/skins/default/xui/zh/floater_search.xml
+++ b/indra/newview/skins/default/xui/zh/floater_search.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="尋找">
+<floater name="floater_search" title="">
<floater.string name="loading_text">
載入中...
</floater.string>
diff --git a/indra/newview/skins/default/xui/zh/floater_snapshot.xml b/indra/newview/skins/default/xui/zh/floater_snapshot.xml
index cfdaeeedb0..e86e20829f 100644
--- a/indra/newview/skins/default/xui/zh/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/zh/floater_snapshot.xml
@@ -3,72 +3,63 @@
<floater.string name="unknown">
未知
</floater.string>
- <radio_group label="快照類型" name="snapshot_type_radio">
- <radio_item label="電郵" name="postcard"/>
- <radio_item label="我的收納區(L$[AMOUNT])" name="texture"/>
- <radio_item label="儲存到電腦上" name="local"/>
- </radio_group>
+ <string name="postcard_progress_str">
+ 正在發送電郵
+ </string>
+ <string name="profile_progress_str">
+ 發佈
+ </string>
+ <string name="inventory_progress_str">
+ 儲存到收納區
+ </string>
+ <string name="local_progress_str">
+ 正在存到電腦
+ </string>
+ <string name="profile_succeeded_str">
+ 圖像已上傳
+ </string>
+ <string name="postcard_succeeded_str">
+ 電郵發送成功!
+ </string>
+ <string name="inventory_succeeded_str">
+ 成功存入收納區!
+ </string>
+ <string name="local_succeeded_str">
+ 成功存入電腦!
+ </string>
+ <string name="profile_failed_str">
+ 上傳圖像到你的檔案訊息發佈時出錯。
+ </string>
+ <string name="postcard_failed_str">
+ 電郵傳送失敗。
+ </string>
+ <string name="inventory_failed_str">
+ 無法存入收納區。
+ </string>
+ <string name="local_failed_str">
+ 無法儲入電腦。
+ </string>
+ <button name="advanced_options_btn" tool_tip="進階選項"/>
+ <text name="image_res_text">
+ [WIDTH] x [HEIGHT] 像素
+ </text>
<text name="file_size_label">
[SIZE] KB
</text>
- <button label="送出" name="send_btn"/>
- <button label="儲存(L$[AMOUNT])" name="upload_btn"/>
- <flyout_button label="儲存" name="save_btn" tool_tip="儲存圖像到檔案">
- <flyout_button.item label="儲存" name="save_item"/>
- <flyout_button.item label="另存..." name="saveas_item"/>
- </flyout_button>
- <button label="更多" name="more_btn" tool_tip="進階選項"/>
- <button label="更少" name="less_btn" tool_tip="進階選項"/>
- <button label="取消" name="discard_btn"/>
- <text name="type_label2">
- 尺寸
- </text>
- <text name="format_label">
- 格式
- </text>
- <combo_box label="解析度" name="postcard_size_combo">
- <combo_box.item label="目前視窗" name="CurrentWindow"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="自訂" name="Custom"/>
- </combo_box>
- <combo_box label="解析度" name="texture_size_combo">
- <combo_box.item label="目前視窗" name="CurrentWindow"/>
- <combo_box.item label="小(128x128)" name="Small(128x128)"/>
- <combo_box.item label="中(256x256)" name="Medium(256x256)"/>
- <combo_box.item label="大(512x512)" name="Large(512x512)"/>
- <combo_box.item label="自訂" name="Custom"/>
- </combo_box>
- <combo_box label="解析度" name="local_size_combo">
- <combo_box.item label="目前視窗" name="CurrentWindow"/>
- <combo_box.item label="320x240" name="320x240"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="1280x1024" name="1280x1024"/>
- <combo_box.item label="1600x1200" name="1600x1200"/>
- <combo_box.item label="自訂" name="Custom"/>
- </combo_box>
- <combo_box label="格式" name="local_format_combo">
- <combo_box.item label="PNG" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP" name="BMP"/>
- </combo_box>
- <spinner label="寬" name="snapshot_width"/>
- <spinner label="高度" name="snapshot_height"/>
- <check_box label="鎖住比例" name="keep_aspect_check"/>
- <slider label="圖像品質" name="image_quality_slider"/>
- <text name="layer_type_label">
- 擷取快照:
- </text>
- <combo_box label="圖層" name="layer_types">
- <combo_box.item label="顏色" name="Colors"/>
- <combo_box.item label="深度" name="Depth"/>
- </combo_box>
- <check_box label="介面" name="ui_check"/>
- <check_box label="擡頭顯示" name="hud_check"/>
- <check_box label="儲存後保持打開狀態" name="keep_open_check"/>
- <check_box label="將幀凍結(全螢幕)" name="freeze_frame_check"/>
- <check_box label="自動刷新" name="auto_snapshot_check"/>
+ <panel name="advanced_options_panel">
+ <text name="advanced_options_label">
+ 進階選項
+ </text>
+ <text name="layer_type_label">
+ 擷取快照:
+ </text>
+ <combo_box label="圖層" name="layer_types">
+ <combo_box.item label="顏色" name="Colors"/>
+ <combo_box.item label="深度" name="Depth"/>
+ </combo_box>
+ <check_box label="介面" name="ui_check"/>
+ <check_box label="擡頭顯示" name="hud_check"/>
+ <check_box label="將幀凍結(全螢幕)" name="freeze_frame_check"/>
+ <check_box label="自動刷新" name="auto_snapshot_check"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_spellcheck.xml b/indra/newview/skins/default/xui/zh/floater_spellcheck.xml
new file mode 100644
index 0000000000..f5a6665844
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_spellcheck.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="spellcheck_floater" title="拼字檢查設定">
+ <check_box label="啟用拼字檢查" name="spellcheck_enable"/>
+ <text name="spellcheck_main">
+ 主要字典:
+ </text>
+ <text label="記錄:" name="spellcheck_additional">
+ 附加字典:
+ </text>
+ <text name="spellcheck_available">
+ 可用的
+ </text>
+ <text name="spellcheck_active">
+ 可用
+ </text>
+ <button label="移除" name="spellcheck_remove_btn"/>
+ <button label="匯入…" name="spellcheck_import_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_spellcheck_import.xml b/indra/newview/skins/default/xui/zh/floater_spellcheck_import.xml
new file mode 100644
index 0000000000..6094a3bbce
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_spellcheck_import.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="spellcheck_import" title="匯入字典">
+ <button label="瀏覽" label_selected="瀏覽" name="dictionary_path_browse"/>
+ <button label="匯入" name="ok_btn"/>
+ <button label="取消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_stats.xml b/indra/newview/skins/default/xui/zh/floater_stats.xml
index 74a6fd1d9f..4af5684ec1 100644
--- a/indra/newview/skins/default/xui/zh/floater_stats.xml
+++ b/indra/newview/skins/default/xui/zh/floater_stats.xml
@@ -10,12 +10,15 @@
</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="繪出的 KTris(每幀)" name="ktrisframe"/>
+ <stat_bar label="繪出的 KTris(每秒)" name="ktrissec"/>
<stat_bar label="物件總計" name="objs"/>
<stat_bar label="新物件" name="newobjs"/>
+ <stat_bar label="物件快取讀取率" name="object_cache_hits"/>
</stat_view>
<stat_view label="材質" name="texture">
+ <stat_bar label="快取讀取率" name="texture_cache_hits"/>
+ <stat_bar label="快取讀取延遲" name="texture_cache_read_latency"/>
<stat_bar label="計數" name="numimagesstat"/>
<stat_bar label="原始計數" name="numrawimagesstat"/>
<stat_bar label="GL 記憶" name="gltexmemstat"/>
@@ -50,7 +53,13 @@
<stat_bar label="物件" name="simobjects"/>
<stat_bar label="使用中物件" name="simactiveobjects"/>
<stat_bar label="使用中腳本" name="simactivescripts"/>
+ <stat_bar label="腳本執行" name="simpctscriptsrun"/>
<stat_bar label="腳本事件" name="simscripteps"/>
+ <stat_view label="尋徑" name="simpathfinding">
+ <stat_bar label="人工智慧步驟時間" name="simsimaistepmsec"/>
+ <stat_bar label="已略過輪廓步驟" name="simsimskippedsilhouettesteps"/>
+ <stat_bar label="角色已更新" name="simsimpctsteppedcharacters"/>
+ </stat_view>
<stat_bar label="進入封包" name="siminpps"/>
<stat_bar label="出去封包" name="simoutpps"/>
<stat_bar label="擱置下載" name="simpendingdownloads"/>
@@ -64,6 +73,14 @@
<stat_bar label="用戶時間" name="simagentmsec"/>
<stat_bar label="圖像時間" name="simimagesmsec"/>
<stat_bar label="腳本時間" name="simscriptmsec"/>
+ <stat_bar label="閒置時間" name="simsparemsec"/>
+ <stat_view label="時間細節(毫秒)" name="timedetails">
+ <stat_bar label="物理步驟" name="simsimphysicsstepmsec"/>
+ <stat_bar label="更新物理形狀" name="simsimphysicsshapeupdatemsec"/>
+ <stat_bar label="物理(其他)" name="simsimphysicsothermsec"/>
+ <stat_bar label="睡眠時間" name="simsleepmsec"/>
+ <stat_bar label="Pump IO" name="simpumpiomsec"/>
+ </stat_view>
</stat_view>
</stat_view>
</container_view>
diff --git a/indra/newview/skins/default/xui/zh/floater_test_layout_stacks.xml b/indra/newview/skins/default/xui/zh/floater_test_layout_stacks.xml
new file mode 100644
index 0000000000..68fcf3f7f7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_test_layout_stacks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="LAYOUTSTACK 測試"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_test_text_vertical_aligment.xml b/indra/newview/skins/default/xui/zh/floater_test_text_vertical_aligment.xml
new file mode 100644
index 0000000000..83b6df6fe5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_test_text_vertical_aligment.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="測試浮動視窗"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml
index 16b3409a82..e909a67e2c 100644
--- a/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml
@@ -9,15 +9,27 @@
<text name="Multiple">
多重材質
</text>
+ <radio_group name="mode_selection">
+ <radio_item label="收納區" name="inventory" value="0"/>
+ <radio_item label="本地" name="local" value="1"/>
+ </radio_group>
<text name="unknown">
尺寸:[DIMENSIONS]
</text>
<button label="預設" label_selected="預設" name="Default"/>
- <button label="無" label_selected="無" name="None"/>
<button label="空白" label_selected="空白" name="Blank"/>
- <check_box initial_value="true" label="立即套用" name="apply_immediate_check"/>
+ <button label="無" label_selected="無" name="None"/>
+ <check_box initial_value="true" label="實時預覽" name="apply_immediate_check"/>
+ <text name="preview_disabled" value="已停用預覽"/>
<filter_editor label="材質過濾器" name="inventory search editor"/>
<check_box initial_value="false" label="顯示資料夾" name="show_folders_check"/>
+ <button label="添加" label_selected="添加" name="l_add_btn"/>
+ <button label="移除" label_selected="移除" name="l_rem_btn"/>
+ <button label="上傳" label_selected="上傳" name="l_upl_btn"/>
+ <scroll_list name="l_name_list">
+ <column label="名稱" name="unit_name"/>
+ <column label="ID" name="unit_id_HIDDEN"/>
+ </scroll_list>
<button label="確定" label_selected="確定" name="Select"/>
<button label="取消" label_selected="取消" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/zh/floater_texture_fetch_debugger.xml
new file mode 100644
index 0000000000..0dcac17a75
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_texture_fetch_debugger.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="TexFetchDebugger" title="材質擷取除錯器">
+ <text name="total_num_fetched_label">
+ 1. 已擷取材質總數:[NUM]
+ </text>
+ <text name="total_num_fetching_requests_label">
+ 2. 總擷取請求數:[NUM]
+ </text>
+ <text name="total_num_cache_hits_label">
+ 3. 快取總讀取數:[NUM]
+ </text>
+ <text name="total_num_visible_tex_label">
+ 4. 可見材質總數:[NUM]
+ </text>
+ <text name="total_num_visible_tex_fetch_req_label">
+ 5. 可見材質擷取總請求數:[NUM]
+ </text>
+ <text name="total_fetched_data_label">
+ 6. 總擷取資料量:[SIZE1] KB,解碼資料量:[SIZE2] KB,[PIXEL] 百萬像素
+ </text>
+ <text name="total_fetched_vis_data_label">
+ 7. 可見資料總量:[SIZE1] KB,解碼資料量:[SIZE2] KB
+ </text>
+ <text name="total_fetched_rendered_data_label">
+ 8. 總呈像資料量:[SIZE1] KB,解碼資料量:[SIZE2] KB,[PIXEL] 百萬像素
+ </text>
+ <text name="total_time_cache_read_label">
+ 9. 快取讀取總時間:[TIME] 秒
+ </text>
+ <text name="total_time_cache_write_label">
+ 10. 快取寫入總時間:[TIME] 秒
+ </text>
+ <text name="total_time_decode_label">
+ 11. 解碼總時間:[TIME] 秒
+ </text>
+ <text name="total_time_gl_label">
+ 12. 建立 gl 材質總時間:[TIME] 秒
+ </text>
+ <text name="total_time_http_label">
+ 13. HTTP 擷取總時間:[TIME] 秒
+ </text>
+ <text name="total_time_fetch_label">
+ 14. 所有擷取動作總時間:[TIME] 秒
+ </text>
+ <text name="total_time_refetch_vis_cache_label">
+ 15. 自快取重新擷取可見材質,時間:[TIME] 秒,擷取量:[SIZE] KB,[PIXEL] 百萬像素
+ </text>
+ <text name="total_time_refetch_all_cache_label">
+ 16. 從快取重新擷取所有材質,時間:[TIME] 秒,擷取量:[SIZE] KB,[PIXEL] 百萬像素
+ </text>
+ <text name="total_time_refetch_vis_http_label">
+ 17. 自 HTTP 重新擷取可見材質,時間:[TIME] 秒,擷取量:[SIZE] KB,[PIXEL] 百萬像素
+ </text>
+ <text name="total_time_refetch_all_http_label">
+ 18. 自 HTTP 重新擷取所有材質,時間:[TIME] 秒,擷取量:[SIZE] KB,[PIXEL] 百萬像素
+ </text>
+ <spinner label="19. 材質/像素比率:" name="texel_pixel_ratio"/>
+ <text name="texture_source_label">
+ 20. 材質來源:
+ </text>
+ <radio_group name="texture_source">
+ <radio_item label="快取 + HTTP" name="0"/>
+ <radio_item label="僅限 HTTP" name="1"/>
+ </radio_group>
+ <button label="開始" name="start_btn"/>
+ <button label="重設" name="clear_btn"/>
+ <button label="關閉" name="close_btn"/>
+ <button label="快取讀取" name="cacheread_btn"/>
+ <button label="快取寫入" name="cachewrite_btn"/>
+ <button label="HTTP" name="http_btn"/>
+ <button label="解碼" name="decode_btn"/>
+ <button label="GL 材質" name="gl_btn"/>
+ <button label="快取重取可見材質" name="refetchviscache_btn"/>
+ <button label="重新擷取所有快取" name="refetchallcache_btn"/>
+ <button label="HTTP 重取可見材質" name="refetchvishttp_btn"/>
+ <button label="重新擷取所有 HTTP" name="refetchallhttp_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_tools.xml b/indra/newview/skins/default/xui/zh/floater_tools.xml
index 62d1b6a820..33c9ebeaf0 100644
--- a/indra/newview/skins/default/xui/zh/floater_tools.xml
+++ b/indra/newview/skins/default/xui/zh/floater_tools.xml
@@ -1,5 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="toolbox floater" short_title="建造工具">
+ <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.string name="status_rotate">
拖曳色條可以旋轉物件
</floater.string>
@@ -24,20 +39,11 @@
<floater.string name="status_selectland">
按住並拖曳,可以選取土地
</floater.string>
- <floater.string name="grid_screen_text">
- 螢幕
+ <floater.string name="status_selectcount">
+ 選取了 [OBJ_COUNT] 個物件,土地衝擊量 [LAND_IMPACT]
</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 name="status_remaining_capacity">
+ 剩餘容納量 [LAND_CAPACITY]。
</floater.string>
<button name="button focus" tool_tip="聚焦"/>
<button name="button move" tool_tip="移動"/>
@@ -67,20 +73,17 @@
<check_box label="編輯聯結部分" name="checkbox edit linked parts"/>
<button label="聯結" name="link_btn"/>
<button label="取消聯結" name="unlink_btn"/>
- <text name="RenderingCost" tool_tip="顯示這物件經計算所得的呈像成本">
- þ:[COUNT]
- </text>
<text label="同時伸展兩側" name="checkbox uniform label">
同時伸展兩側
</text>
<check_box initial_value="true" label="伸展材質" name="checkbox stretch textures"/>
- <check_box initial_value="true" label="貼齊格線" name="checkbox snap to grid"/>
+ <check_box initial_value="true" label="Snap" name="checkbox snap to grid"/>
<combo_box name="combobox grid mode" tool_tip="選擇物件定位參考的格線尺度類型">
- <combo_box.item label="世界格線" name="World"/>
- <combo_box.item label="地方格線" name="Local"/>
- <combo_box.item label="參考格線" name="Reference"/>
+ <combo_box.item label="世界" name="World"/>
+ <combo_box.item label="本地" name="Local"/>
+ <combo_box.item label="參考" name="Reference"/>
</combo_box>
- <button name="Options..." tool_tip="察看更多格線選項"/>
+ <button label="" name="Options..." tool_tip="察看更多格線選項"/>
<button name="ToolCube" tool_tip="立方體"/>
<button name="ToolPrism" tool_tip="稜鏡體"/>
<button name="ToolPyramid" tool_tip="金字塔"/>
@@ -121,23 +124,11 @@
</text>
<slider_bar initial_value="0.00" name="slider force"/>
<button label="套用" label_selected="套用" name="button apply to selection" tool_tip="修改所選擇的土地"/>
- <text name="obj_count">
- 物件: [COUNT]
- </text>
- <text name="prim_count">
- 幾何元件: [COUNT]
- </text>
- <text name="linked_set_count">
- 聯結集合:[COUNT]
- </text>
- <text name="linked_set_cost" tool_tip="目前所選聯結幾何 [prims],[physics complexity] 的費用">
- 費用:[COST] / [PHYSICS]
- </text>
- <text name="object_count">
- 物件: [COUNT]
+ <text name="selection_empty">
+ 未做任何選擇。
</text>
- <text name="object_cost" tool_tip="目前所選物件 [prims] / [physics complexity] 的費用">
- 費用:[COST] / [PHYSICS]
+ <text name="remaining_capacity">
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights 詳情]
</text>
<tab_container name="Object Info Tabs">
<panel label="一般" name="General">
@@ -159,6 +150,12 @@
<panel.string name="text modify info 4">
你不能修改這些物件
</panel.string>
+ <panel.string name="text modify info 5">
+ 無法跨地區修改這個物件
+ </panel.string>
+ <panel.string name="text modify info 6">
+ 無法跨地區修改這些物件
+ </panel.string>
<panel.string name="text modify warning">
你必須選取整個物件以設定權限
</panel.string>
@@ -208,12 +205,12 @@
<combo_box.item label="縮放" name="Zoom"/>
</combo_box>
<check_box label="出售中:" name="checkbox for sale"/>
+ <spinner label="L$" name="Edit Cost"/>
<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">
@@ -249,6 +246,11 @@
F:
</text>
</panel>
+ <panel name="pathfinding_attrs_panel">
+ <text name="pathfinding_attributes_label">
+ 尋徑屬性:
+ </text>
+ </panel>
</panel>
<panel label="物件" name="Object">
<check_box label="已鎖住" name="checkbox locked" tool_tip="避免物件被移動或刪除。 這在建製過程中非常有用,可避免意外的編輯更動。"/>
@@ -350,12 +352,10 @@
縫合類型
</text>
<combo_box name="sculpt type control">
- <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.item label="網面" name="Mesh"/>
</combo_box>
</panel>
<panel label="特性" name="Features">
@@ -407,7 +407,7 @@
</combo_box>
<spinner label="重力" name="Physics Gravity"/>
<spinner label="摩擦" name="Physics Friction"/>
- <spinner label="密度" name="Physics Density"/>
+ <spinner label="密度(100 公斤 / 立方公尺)" name="Physics Density"/>
<spinner label="恢復" name="Physics Restitution"/>
</panel>
<panel label="材質" name="Texture">
diff --git a/indra/newview/skins/default/xui/zh/floater_top_objects.xml b/indra/newview/skins/default/xui/zh/floater_top_objects.xml
index ad12ae6720..6f50be0855 100644
--- a/indra/newview/skins/default/xui/zh/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/zh/floater_top_objects.xml
@@ -9,9 +9,6 @@
<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>
@@ -32,9 +29,10 @@
<scroll_list.columns label="名稱" name="name"/>
<scroll_list.columns label="所有人" name="owner"/>
<scroll_list.columns label="位置" name="location"/>
+ <scroll_list.columns label="地段" name="parcel"/>
<scroll_list.columns label="時間" name="time"/>
- <scroll_list.columns label="Mono 時間" name="mono_time"/>
<scroll_list.columns label="URL" name="URLs"/>
+ <scroll_list.columns label="記憶體 (KB)" name="memory"/>
</scroll_list>
<text name="id_text">
物件 ID:
@@ -48,6 +46,10 @@
所有人:
</text>
<button label="過濾器" name="filter_owner_btn"/>
+ <text name="parcel_name_text">
+ 地段:
+ </text>
+ <button label="過濾器" name="filter_parcel_btn"/>
<button label="退回所選擇的" name="return_selected_btn"/>
<button label="全部退回" name="return_all_btn"/>
<button label="停用所選的" name="disable_selected_btn"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_toybox.xml b/indra/newview/skins/default/xui/zh/floater_toybox.xml
new file mode 100644
index 0000000000..fc6b6ea611
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_toybox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Toybox" title="工具列按鈕">
+ <text name="toybox label 1">
+ 將按鈕拖入或拖離工具列,即可新增或移除該按鈕。
+ </text>
+ <text name="toybox label 2">
+ 按鈕將根據每一個工具列的設定,僅顯示圖示或一併顯示文字標籤。
+ </text>
+ <button label="清除所有工具列" label_selected="清除所有工具列" name="btn_clear_all"/>
+ <button label="還原預設值" label_selected="還原預設值" name="btn_restore_defaults"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_translation_settings.xml b/indra/newview/skins/default/xui/zh/floater_translation_settings.xml
new file mode 100644
index 0000000000..fe84872557
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_translation_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_translation_settings" title="聊天內容翻譯設定">
+ <string name="bing_api_key_not_verified">
+ Bing AppID 未通過驗證。 請再試一次。
+ </string>
+ <string name="google_api_key_not_verified">
+ Google API 鍵值未通過驗證。 請再試一次。
+ </string>
+ <string name="bing_api_key_verified">
+ Bing AppID 驗證成功。
+ </string>
+ <string name="google_api_key_verified">
+ Google API 鍵值驗證成功。
+ </string>
+ <check_box label="聊天時啟用機器翻譯" name="translate_chat_checkbox"/>
+ <text name="translate_language_label">
+ 將聊天內容翻譯成:
+ </text>
+ <combo_box name="translate_language_combo">
+ <combo_box.item label="系統預設" name="System Default Language"/>
+ <combo_box.item label="英語" name="English"/>
+ <combo_box.item label="Dansk(丹麥語)" name="Danish"/>
+ <combo_box.item label="Deutsch(德語)" name="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="Magyar(匈牙利語)" name="Hungarian"/>
+ <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="Russian"/>
+ <combo_box.item label="Türkçe(土耳其語)" name="Turkish"/>
+ <combo_box.item label="Українська(烏克蘭語)" name="Ukrainian"/>
+ <combo_box.item label="中文(正體)" name="Chinese"/>
+ <combo_box.item label="日本語(日語)" name="Japanese"/>
+ <combo_box.item label="한국어(漢語)" name="Korean"/>
+ </combo_box>
+ <text name="tip">
+ 選擇翻譯服務:
+ </text>
+ <radio_group name="translation_service_rg">
+ <radio_item initial_value="bing" label="Bing 翻譯器" name="bing"/>
+ <radio_item initial_value="google" label="Google 翻譯" name="google"/>
+ </radio_group>
+ <text name="bing_api_key_label">
+ Bing [http://www.bing.com/developers/createapp.aspx AppID]:
+ </text>
+ <button label="驗證" name="verify_bing_api_key_btn"/>
+ <text name="google_api_key_label">
+ Google [http://code.google.com/apis/language/translate/v2/getting_started.html#auth API 鍵值]:
+ </text>
+ <button label="驗證" name="verify_google_api_key_btn"/>
+ <text name="google_links_text">
+ [http://code.google.com/apis/language/translate/v2/pricing.html 價格表] | [https://code.google.com/apis/console 統計]
+ </text>
+ <button label="確定" name="ok_btn"/>
+ <button label="取消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_voice_controls.xml b/indra/newview/skins/default/xui/zh/floater_voice_controls.xml
index fa724a4736..a3a7679957 100644
--- a/indra/newview/skins/default/xui/zh/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/zh/floater_voice_controls.xml
@@ -1,7 +1,7 @@
<?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] 進行群組通話
@@ -10,7 +10,7 @@
多方通話
</string>
<string name="title_peer_2_peer">
- 與 [NAME] 進行通話
+ 和 [NAME] 通話
</string>
<string name="no_one_near">
附近沒有一人開啟語音
diff --git a/indra/newview/skins/default/xui/zh/floater_voice_effect.xml b/indra/newview/skins/default/xui/zh/floater_voice_effect.xml
index 184ee6edd5..81e0204262 100644
--- a/indra/newview/skins/default/xui/zh/floater_voice_effect.xml
+++ b/indra/newview/skins/default/xui/zh/floater_voice_effect.xml
@@ -12,6 +12,135 @@
<string name="new_voice_effect">
(新的!)
</string>
+ <string name="effect_Arena">
+ 競技場
+ </string>
+ <string name="effect_Beast">
+ 野獸
+ </string>
+ <string name="effect_Buff">
+ Buff
+ </string>
+ <string name="effect_Buzz">
+ Buzz
+ </string>
+ <string name="effect_Camille">
+ 卡蜜兒
+ </string>
+ <string name="effect_Creepy">
+ 怪異
+ </string>
+ <string name="effect_CreepyBot">
+ 怪異機器人
+ </string>
+ <string name="effect_Cyber">
+ 科幻
+ </string>
+ <string name="effect_DeepBot">
+ 深沉機器人
+ </string>
+ <string name="effect_Demon">
+ 魔鬼
+ </string>
+ <string name="effect_Female Elf">
+ 女性 - 小精靈
+ </string>
+ <string name="effect_Flirty">
+ 調情
+ </string>
+ <string name="effect_Foxy">
+ 香豔
+ </string>
+ <string name="effect_Halloween 2010 Bonus">
+ 2010萬聖節加贈
+ </string>
+ <string name="effect_Helium">
+ 氦氣
+ </string>
+ <string name="effect_Husky">
+ 沙啞
+ </string>
+ <string name="effect_Husky Whisper">
+ 沙啞耳語
+ </string>
+ <string name="effect_Intercom">
+ 對講機
+ </string>
+ <string name="effect_Julia">
+ 茱莉亞
+ </string>
+ <string name="effect_Lo Lilt">
+ 輕微抑揚頓挫
+ </string>
+ <string name="effect_Macho">
+ 陽剛
+ </string>
+ <string name="effect_Micro">
+ Micro
+ </string>
+ <string name="effect_Mini">
+ 迷你
+ </string>
+ <string name="effect_Model">
+ 模型
+ </string>
+ <string name="effect_Nano">
+ Nano
+ </string>
+ <string name="effect_Nightmare">
+ 惡夢
+ </string>
+ <string name="effect_PopBot">
+ PopBot
+ </string>
+ <string name="effect_Rachel">
+ 瑞秋
+ </string>
+ <string name="effect_Radio">
+ 收音機
+ </string>
+ <string name="effect_Robot">
+ 機器人
+ </string>
+ <string name="effect_Roxanne">
+ 蘿姍
+ </string>
+ <string name="effect_Rumble">
+ 低沉隆隆聲
+ </string>
+ <string name="effect_Sabrina">
+ 薩賓娜
+ </string>
+ <string name="effect_Samantha">
+ 姍曼莎
+ </string>
+ <string name="effect_Sexy">
+ 性感
+ </string>
+ <string name="effect_Shorty">
+ 矮個兒
+ </string>
+ <string name="effect_Smaller">
+ 較小
+ </string>
+ <string name="effect_Sneaky">
+ 鬼祟
+ </string>
+ <string name="effect_Stallion">
+ 種馬
+ </string>
+ <string name="effect_Sultry">
+ 勾魂
+ </string>
+ <string name="effect_Thunder">
+ 雷聲
+ </string>
+ <string name="effect_Vixen">
+ 潑婦
+ </string>
+ <string name="effect_WhinyBot">
+ 哭鬧機器人
+ </string>
<text name="preview_text">
預覽
</text>
diff --git a/indra/newview/skins/default/xui/zh/floater_window_size.xml b/indra/newview/skins/default/xui/zh/floater_window_size.xml
index 54b72afccc..3942f72d76 100644
--- a/indra/newview/skins/default/xui/zh/floater_window_size.xml
+++ b/indra/newview/skins/default/xui/zh/floater_window_size.xml
@@ -7,10 +7,17 @@
設定視窗尺寸大小:
</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.item label="1000 x 700 (預設)" name="item1"/>
+ <combo_box.item label="1024 x 768 (4:3 XGA)" name="item2"/>
+ <combo_box.item label="1280 x 720 (16:9 HDTV)" name="item3"/>
+ <combo_box.item label="1280 x 800 (5:8 WXGA)" name="item4"/>
+ <combo_box.item label="1280 x 1024 (5:4 SXGA)" name="item5"/>
+ <combo_box.item label="1440 x 900 (8:5 WSXGA)" name="item7"/>
+ <combo_box.item label="1600 x 900 (16:9 HD+)" name="item8"/>
+ <combo_box.item label="1600 x 1200 (4:3 UXGA)" name="item9"/>
+ <combo_box.item label="1680 x 1050 (8:5 WSXGA+)" name="item10"/>
+ <combo_box.item label="1920 x 1080 (16:9 HDTV)" name="item11"/>
+ <combo_box.item label="1920 x 1200 (8:5 WUXGA)" name="item12"/>
</combo_box>
<button label="設定" name="set_btn"/>
<button label="取消" name="cancel_btn"/>
diff --git a/indra/newview/skins/default/xui/zh/menu_hide_navbar.xml b/indra/newview/skins/default/xui/zh/menu_hide_navbar.xml
index dbb8ececaa..3f6820cb32 100644
--- a/indra/newview/skins/default/xui/zh/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/zh/menu_hide_navbar.xml
@@ -1,6 +1,6 @@
<?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="ShowNavbarNavigationPanel"/>
<menu_item_check label="顯示最愛列" name="ShowNavbarFavoritesPanel"/>
<menu_item_check label="顯示迷你位置列" name="ShowMiniLocationPanel"/>
</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_im_well_button.xml b/indra/newview/skins/default/xui/zh/menu_im_well_button.xml
deleted file mode 100644
index 4b9b4b2758..0000000000
--- a/indra/newview/skins/default/xui/zh/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?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/zh/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/zh/menu_inspect_object_gear.xml
index cedc781fa2..abff0f64ac 100644
--- a/indra/newview/skins/default/xui/zh/menu_inspect_object_gear.xml
+++ b/indra/newview/skins/default/xui/zh/menu_inspect_object_gear.xml
@@ -12,6 +12,7 @@
<menu_item_call label="添加" name="add"/>
<menu_item_call label="回報" name="report"/>
<menu_item_call label="封鎖" name="block"/>
+ <menu_item_call label="解除封鎖" name="unblock"/>
<menu_item_call label="放大" name="zoom_in"/>
<menu_item_call label="移除" name="remove"/>
<menu_item_call label="更多資訊" name="more_info"/>
diff --git a/indra/newview/skins/default/xui/zh/menu_inventory.xml b/indra/newview/skins/default/xui/zh/menu_inventory.xml
index 63ec001e4a..7f745ffaa7 100644
--- a/indra/newview/skins/default/xui/zh/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/zh/menu_inventory.xml
@@ -59,6 +59,7 @@
<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="Cut"/>
<menu_item_call label="恚庨" name="Copy"/>
<menu_item_call label="貼上" name="Paste"/>
<menu_item_call label="以連結格式貼上" name="Paste As Link"/>
@@ -67,6 +68,7 @@
<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="覆製 SLurl" name="url_copy"/>
<menu_item_call label="添加地標" name="About Landmark"/>
<menu_item_call label="在虛擬世界播放" name="Animation Play"/>
<menu_item_call label="在本地播放" name="Animation Audition"/>
@@ -83,5 +85,7 @@
<menu_item_call label="編輯" name="Wearable Edit"/>
<menu_item_call label="添加" name="Wearable Add"/>
<menu_item_call label="脫下" name="Take Off"/>
+ <menu_item_call label="複製到商家發件匣" name="Merchant Copy"/>
+ <menu_item_call label="送往第二人生購物市集" name="Marketplace Send"/>
<menu_item_call label="-- 無選項 --" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_login.xml b/indra/newview/skins/default/xui/zh/menu_login.xml
index f7b2cd7b8b..c327b132a1 100644
--- a/indra/newview/skins/default/xui/zh/menu_login.xml
+++ b/indra/newview/skins/default/xui/zh/menu_login.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
<menu label="我自己" name="File">
- <menu_item_call label="偏好設定" name="Preferences..."/>
+ <menu_item_call label="偏好設定…" name="Preferences..."/>
<menu_item_call label="退出 [APP_NAME]" name="Quit"/>
</menu>
<menu label="幫助" name="Help">
@@ -17,8 +17,8 @@
<menu_item_call label="設定視窗大小..." name="Set Window Size..."/>
<menu_item_call label="顯示 TOS" name="TOS"/>
<menu_item_call label="顯示嚴重訊息" name="Critical"/>
- <menu_item_call label="媒體瀏覽器測試" name="Web Browser Test"/>
- <menu_item_call label="網頁內容浮動視窗測試" name="Web Content Floater Test"/>
+ <menu_item_call label="網頁內容浮動視窗除錯測試" name="Web Content Floater Debug Test"/>
+ <menu label="設定記錄細節" name="Set Logging Level"/>
<menu_item_check label="顯示網格挑選器" name="Show Grid Picker"/>
<menu_item_call label="顯示通知控制台" name="Show Notifications Console"/>
</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_media_ctrl.xml b/indra/newview/skins/default/xui/zh/menu_media_ctrl.xml
index bab1bbb8f9..d222d7f658 100644
--- a/indra/newview/skins/default/xui/zh/menu_media_ctrl.xml
+++ b/indra/newview/skins/default/xui/zh/menu_media_ctrl.xml
@@ -3,4 +3,5 @@
<menu_item_call label="剪下" name="Cut"/>
<menu_item_call label="恚庨" name="Copy"/>
<menu_item_call label="貼上" name="Paste"/>
+ <menu_item_call label="開啟網頁偵查器" name="open_webinspector"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_object.xml b/indra/newview/skins/default/xui/zh/menu_object.xml
index 94172eb531..4282c1e131 100644
--- a/indra/newview/skins/default/xui/zh/menu_object.xml
+++ b/indra/newview/skins/default/xui/zh/menu_object.xml
@@ -3,6 +3,8 @@
<menu_item_call label="觸碰" name="Object Touch"/>
<menu_item_call label="編輯" name="Edit..."/>
<menu_item_call label="建造" name="Build"/>
+ <menu_item_call label="在聯結集裡顯示" name="show_in_linksets"/>
+ <menu_item_call label="在角色中顯示" name="show_in_characters"/>
<menu_item_call label="打開" name="Open"/>
<menu_item_call label="坐在這裡" name="Object Sit"/>
<menu_item_call label="起立" name="Object Stand Up"/>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby_view_sort.xml
index 8716a4b894..6cb0ac3c89 100644
--- a/indra/newview/skins/default/xui/zh/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/zh/menu_people_nearby_view_sort.xml
@@ -4,5 +4,6 @@
<menu_item_check label="依名稱排序" name="sort_name"/>
<menu_item_check label="依距離排序" name="sort_distance"/>
<menu_item_check label="察看人群圖示" name="view_icons"/>
+ <menu_item_check label="察看地圖" name="view_map"/>
<menu_item_call label="顯示被封鎖的居民與物件" name="show_blocked_list"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_text_editor.xml b/indra/newview/skins/default/xui/zh/menu_text_editor.xml
index be48a2ce49..febc0b8b67 100644
--- a/indra/newview/skins/default/xui/zh/menu_text_editor.xml
+++ b/indra/newview/skins/default/xui/zh/menu_text_editor.xml
@@ -1,5 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Text editor context menu">
+ <menu_item_call label="(未知)" name="Suggestion 1"/>
+ <menu_item_call label="(未知)" name="Suggestion 2"/>
+ <menu_item_call label="(未知)" name="Suggestion 3"/>
+ <menu_item_call label="(未知)" name="Suggestion 4"/>
+ <menu_item_call label="(未知)" name="Suggestion 5"/>
+ <menu_item_call label="新增到字典" name="Add to Dictionary"/>
+ <menu_item_call label="新增到忽略清單" name="Add to Ignore"/>
<menu_item_call label="剪下" name="Cut"/>
<menu_item_call label="恚庨" name="Copy"/>
<menu_item_call label="貼上" name="Paste"/>
diff --git a/indra/newview/skins/default/xui/zh/menu_toolbars.xml b/indra/newview/skins/default/xui/zh/menu_toolbars.xml
new file mode 100644
index 0000000000..d318992dd5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_toolbars.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Toolbars Popup">
+ <menu_item_call label="移除此按鈕" name="Remove button"/>
+ <menu_item_call label="工具列按鈕…" name="Choose Buttons"/>
+ <menu_item_check label="圖示和標籤" name="icons_with_text"/>
+ <menu_item_check label="僅用圖示" name="icons_only"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_viewer.xml b/indra/newview/skins/default/xui/zh/menu_viewer.xml
index 262cc2440c..ac0e9e7e35 100644
--- a/indra/newview/skins/default/xui/zh/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml
@@ -1,51 +1,60 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
<menu label="我自己" name="Me">
- <menu_item_call label="偏好設定" name="Preferences"/>
- <menu_item_call label="我的塗鴉牆" name="Manage My Account"/>
- <menu_item_call label="購買 L$" name="Buy and Sell L$"/>
- <menu_item_call label="我的個人檔案" name="Profile"/>
- <menu_item_call label="我的外觀" name="ChangeOutfit"/>
- <menu_item_check label="我的收納區" name="Inventory"/>
- <menu_item_check label="我的收納區" name="ShowSidetrayInventory"/>
- <menu_item_check label="我的姿勢" name="Gestures"/>
- <menu_item_check label="我的聲音" name="ShowVoice"/>
+ <menu_item_call label="檔案..." name="Profile"/>
+ <menu_item_call label="外觀…" name="ChangeOutfit"/>
+ <menu_item_call label="選擇一個化身…" name="Avatar Picker"/>
+ <menu_item_check label="收納區…" name="Inventory"/>
+ <menu_item_call label="新收納區視窗" name="NewInventoryWindow"/>
+ <menu_item_call label="地點…" name="Places"/>
+ <menu_item_call label="精選地點…" name="Picks"/>
+ <menu_item_call label="攝影機控制…" name="Camera Controls"/>
<menu label="動作" name="Movement">
<menu_item_call label="坐下" name="Sit Down Here"/>
<menu_item_check label="飛行" name="Fly"/>
<menu_item_check label="以跑代步" name="Always Run"/>
<menu_item_call label="停止我身上的動作" name="Stop Animating My Avatar"/>
+ <menu_item_call label="行走 / 跑步 / 飛行…" name="Walk / run / fly"/>
</menu>
- <menu label="我的狀態" name="Status">
+ <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="購買 L$…" name="Buy and Sell L$"/>
+ <menu_item_call label="商家發件匣…" name="MerchantOutbox"/>
+ <menu_item_call label="帳戶主控臺…" name="Manage My Account"/>
+ <menu_item_call label="偏好設定…" name="Preferences"/>
+ <menu_item_call label="工具列按鈕…" name="Toolbars"/>
+ <menu_item_call label="隱藏所有控制" name="Hide UI"/>
+ <menu_item_check label="顯示 HUD 附件" name="Show HUD Attachments"/>
<menu_item_call label="退出 [APP_NAME]" name="Quit"/>
</menu>
<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_check label="聊天…" name="Nearby Chat"/>
+ <menu_item_check label="說話" name="Speak"/>
+ <menu_item_check label="語音設定…" name="Nearby Voice"/>
+ <menu_item_check label="語音變聲…" name="ShowVoice"/>
+ <menu_item_check label="姿勢…" name="Gestures"/>
+ <menu_item_call label="朋友" name="My Friends"/>
+ <menu_item_call label="群組" name="My Groups"/>
<menu_item_call label="附近的人群" name="Active Speakers"/>
+ <menu_item_call label="封鎖清單" name="Block List"/>
</menu>
<menu label="世界" name="World">
- <menu_item_check label="迷你地圖" name="Mini-Map"/>
+ <menu_item_call label="將此處記為地標" name="Create Landmark Here"/>
+ <menu_item_call label="目的地…" name="Destinations"/>
<menu_item_check label="世界地圖" name="World Map"/>
+ <menu_item_check label="迷你地圖" name="Mini-Map"/>
<menu_item_check label="搜尋" name="Search"/>
+ <menu_item_call label="瞬間傳送回家" name="Teleport Home"/>
+ <menu_item_call label="把這裡設為我的家" name="Set Home to Here"/>
<menu_item_call label="快照" name="Take Snapshot"/>
- <menu_item_call label="將此處記為地標" name="Create Landmark Here"/>
- <menu label="地點檔案" name="Land">
- <menu_item_call label="地點檔案" name="Place Profile"/>
- <menu_item_call label="土地資料" name="About Land"/>
- <menu_item_call label="地區/領地" name="Region/Estate"/>
- </menu>
+ <menu_item_call label="地點小檔案" name="Place Profile"/>
+ <menu_item_call label="土地資料" name="About Land"/>
+ <menu_item_call label="地區/領地" name="Region/Estate"/>
+ <menu_item_call label="我所擁有的土地…" name="My Land"/>
<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_item_check label="禁越線" name="Ban Lines"/>
<menu_item_check label="指標" name="beacons"/>
<menu_item_check label="地產邊界" name="Property Lines"/>
@@ -54,15 +63,30 @@
<menu_item_check label="地段屬性" name="Parcel Properties"/>
<menu_item_check label="進階選單" name="Show Advanced Menu"/>
</menu>
- <menu_item_call label="瞬間傳送回家" name="Teleport Home"/>
- <menu_item_call label="設定家在此處" name="Set Home to Here"/>
- <menu label="太陽" name="Environment Settings">
+ <menu label="太陽" name="Sun">
<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_call label="環境編輯器" name="Environment Editor"/>
+ <menu_item_call label="使用地區設定" name="Use Region Settings"/>
+ </menu>
+ <menu label="環境編輯器" name="Environment Editor">
+ <menu_item_call label="環境設定…" name="Environment Settings"/>
+ <menu label="水的自訂配置" name="Water Presets">
+ <menu_item_call label="新的自訂配置…" name="new_water_preset"/>
+ <menu_item_call label="編輯自訂配置…" name="edit_water_preset"/>
+ <menu_item_call label="刪除自訂配置…" name="delete_water_preset"/>
+ </menu>
+ <menu label="天空自訂配置" name="Sky Presets">
+ <menu_item_call label="新的自訂配置…" name="new_sky_preset"/>
+ <menu_item_call label="編輯自訂配置…" name="edit_sky_preset"/>
+ <menu_item_call label="刪除自訂配置…" name="delete_sky_preset"/>
+ </menu>
+ <menu label="日的自訂配置" name="Day Presets">
+ <menu_item_call label="新的自訂配置…" name="new_day_preset"/>
+ <menu_item_call label="編輯自訂配置…" name="edit_day_preset"/>
+ <menu_item_call label="刪除自訂配置…" name="delete_day_preset"/>
+ </menu>
</menu>
</menu>
<menu label="建造" name="BuildTools">
@@ -100,6 +124,11 @@
<menu_item_call label="設定腳本為執行中" name="Set Scripts to Running"/>
<menu_item_call label="設定腳本為非執行中" name="Set Scripts to Not Running"/>
</menu>
+ <menu label="尋徑" name="Pathfinding">
+ <menu_item_call label="聯結集…" name="pathfinding_linksets_menu_item"/>
+ <menu_item_call label="角色…" name="pathfinding_characters_menu_item"/>
+ <menu_item_call label="察看 / 測試…" name="pathfinding_console_menu_item"/>
+ </menu>
<menu label="選項" name="Options">
<menu_item_check label="顯示進階權限" name="DebugPermissions"/>
<menu_item_check label="只選取我的物件" name="Select Only My Objects"/>
@@ -119,7 +148,6 @@
<menu_item_call label="聲音(L$[COST])..." name="Upload Sound"/>
<menu_item_call label="動作(L$[COST])..." name="Upload Animation"/>
<menu_item_call label="模型…" name="Upload Model"/>
- <menu_item_call label="模型精靈…" name="Upload Model Wizard"/>
<menu_item_call label="批量(每檔案 L$[COST] )..." name="Bulk Upload"/>
<menu_item_call label="設定預設上傳權限" name="perm prefs"/>
</menu>
@@ -127,8 +155,8 @@
<menu_item_call label="重做" name="Redo"/>
</menu>
<menu label="幫助" name="Help">
+ <menu_item_call label="簡易教學…" name="How To"/>
<menu_item_call label="[SECOND_LIFE] 幫助" name="Second Life Help"/>
- <menu_item_check label="啟用提示" name="Enable Hints"/>
<menu_item_call label="違規舉報" name="Report Abuse"/>
<menu_item_call label="回報臭蟲" name="Report Bug"/>
<menu_item_call label="關於 [APP_NAME]" name="About Second Life"/>
@@ -141,37 +169,35 @@
<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="Lag 測量器" name="Lag Meter"/>
<menu_item_check label="統計列" name="Statistics Bar"/>
- <menu_item_check label="顯示化身呈像成本" name="Avatar Rendering Cost"/>
+ <menu_item_check label="顯示化身的繪製重量" name="Avatar Rendering Cost"/>
</menu>
<menu label="高亮顯示與可見度" name="Highlighting and Visibility">
<menu_item_check label="Cheesy 指標" 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>
<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="Surface Patch"/>
- <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_item_check label="簡單" name="Rendering Type Simple"/>
+ <menu_item_check label="半透明" name="Rendering Type Alpha"/>
+ <menu_item_check label="樹木" name="Rendering Type Tree"/>
+ <menu_item_check label="化身" name="Rendering Type Character"/>
+ <menu_item_check label="表面修補" name="Rendering Type Surface Patch"/>
+ <menu_item_check label="天空" name="Rendering Type Sky"/>
+ <menu_item_check label="水文" name="Rendering Type Water"/>
+ <menu_item_check label="地面" name="Rendering Type Ground"/>
+ <menu_item_check label="體積" name="Rendering Type Volume"/>
+ <menu_item_check label="草地" name="Rendering Type Grass"/>
+ <menu_item_check label="雲彩" name="Rendering Type Clouds"/>
+ <menu_item_check label="粒子效果" name="Rendering Type Particles"/>
+ <menu_item_check label="碰撞" name="Rendering Type Bump"/>
</menu>
<menu label="呈像功能" name="Rendering Features">
- <menu_item_check label="使用者界面" name="UI"/>
+ <menu_item_check label="使用者界面" name="ToggleUI"/>
<menu_item_check label="選擇" name="Selected"/>
<menu_item_check label="高亮顯示" name="Highlighted"/>
<menu_item_check label="動態材質" name="Dynamic Textures"/>
@@ -183,11 +209,8 @@
<menu_item_check label="使用外卦讀取緒" name="Use Plugin Read Thread"/>
<menu_item_call label="清除群組快取資料" name="ClearGroupCache"/>
<menu_item_check label="滑鼠平滑移動" name="Mouse Smoothing"/>
+ <menu_item_call label="釋出按鍵" name="Release Keys"/>
<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="以預設值設定使用者界面大小" name="Set UI Size to Default"/>
<menu_item_check label="顯示進階選單 - 舊版捷徑" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="關閉視窗" name="Close Window"/>
<menu_item_call label="關閉全部視窗" name="Close All Windows"/>
@@ -196,13 +219,6 @@
<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"/>
@@ -215,11 +231,10 @@
<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_check label="場景統計資料" name="Scene Statistics"/>
+ <menu_item_call label="材質擷取除錯控制台" name="Texture Fetch Debug Console"/>
<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"/>
@@ -236,6 +251,7 @@
<menu_item_check label="顯示矩陣" name="Show Matrices"/>
<menu_item_check label="游標下顯示顏色" name="Show Color Under Cursor"/>
<menu_item_check label="顯示記憶體" name="Show Memory"/>
+ <menu_item_check label="顯示私區記憶體資訊" name="Show Private Mem Info"/>
<menu_item_check label="顯示更新到物件" name="Show Updates"/>
</menu>
<menu label="強制錯誤" name="Force Errors">
@@ -272,7 +288,16 @@
<menu_item_check label="燈光" name="Lights"/>
<menu_item_check label="碰撞骨架" name="Collision Skeleton"/>
<menu_item_check label="光線投射" name="Raycast"/>
+ <menu_item_check label="風力向量" name="Wind Vectors"/>
+ <menu_item_check label="繪出複雜度" name="rendercomplexity"/>
+ <menu_item_check label="附件位元組" name="attachment bytes"/>
<menu_item_check label="雕刻" name="Sculpt"/>
+ <menu label="材質密度" name="Texture Density">
+ <menu_item_check label="無" name="None"/>
+ <menu_item_check label="目前" name="Current"/>
+ <menu_item_check label="理想" name="Desired"/>
+ <menu_item_check label="完全" name="Full"/>
+ </menu>
</menu>
<menu label="呈像" name="Rendering">
<menu_item_check label="軸" name="Axes"/>
@@ -283,7 +308,6 @@
<menu_item_check label="光線和陰影" name="Lighting and Shadows"/>
<menu_item_check label="來自日/月/投影物的陰影" name="Shadows from Sun/Moon/Projectors"/>
<menu_item_check label="屏幕空間環境光遮蔽和陰影平滑技術" name="SSAO and Shadow Smoothing"/>
- <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="Automatic Alpha Masks (deferred)"/>
@@ -291,7 +315,6 @@
<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"/>
@@ -314,9 +337,8 @@
<menu_item_call label="開始錄製" name="Start Record"/>
<menu_item_call label="停止錄製" name="Stop Record"/>
</menu>
- <menu label="世界" name="World">
+ <menu label="世界" name="DevelopWorld">
<menu_item_check label="模擬器太陽設定覆蓋" name="Sim Sun Override"/>
- <menu_item_check label="Cheesy 指標" name="Cheesy Beacon"/>
<menu_item_check label="固定天氣" name="Fixed Weather"/>
<menu_item_call label="傾印地區物件快取" name="Dump Region Object Cache"/>
</menu>
@@ -348,18 +370,17 @@
</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_item_call label="虹膜" name="Grab Iris"/>
+ <menu_item_call label="頭部" name="Grab Head"/>
+ <menu_item_call label="上半身" name="Grab Upper Body"/>
+ <menu_item_call label="下半身" name="Grab Lower Body"/>
+ <menu_item_call label="裙子" name="Grab 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="強制參數為預設值" name="Force Params to Default"/>
@@ -380,15 +401,23 @@
<menu_item_check label="HTTP 材質" name="HTTP Textures"/>
<menu_item_check label="HTTP 收納區" name="HTTP Inventory"/>
<menu_item_call label="壓縮圖像" name="Compress Images"/>
+ <menu_item_call label="啟用記憶體洩漏視覺偵測器" name="Enable Visual Leak Detector"/>
<menu_item_check label="輸出除錯小型傾印" name="Output Debug Minidump"/>
<menu_item_check label="下次執行時顯示控制台視窗" name="Console Window"/>
+ <menu label="設定記錄細節" name="Set Logging Level">
+ <menu_item_check label="除錯" name="Debug"/>
+ <menu_item_check label="資訊" name="Info"/>
+ <menu_item_check label="警告" name="Warning"/>
+ <menu_item_check label="錯誤" name="Error"/>
+ <menu_item_check label="無" name="None"/>
+ </menu>
<menu_item_call label="要求管理員狀態" name="Request Admin Options"/>
<menu_item_call label="離開管理員狀態" name="Leave Admin Options"/>
<menu_item_check label="顯示管理員選單" name="View Admin Options"/>
</menu>
<menu label="管理員" name="Admin">
- <menu label="Object">
- <menu_item_call label="取得副本" name="Take Copy"/>
+ <menu label="物件" name="AdminObject">
+ <menu_item_call label="取得副本" name="Admin 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"/>
@@ -424,7 +453,7 @@
<menu_item_call label="身體物理" name="Physics"/>
<menu_item_call label="全部衣服" name="All Clothes"/>
</menu>
- <menu label="幫助" name="Help">
+ <menu label="幫助" name="DeprecatedHelp">
<menu_item_call label="林登官方部落格" name="Official Linden Blog"/>
<menu_item_call label="腳本門戶" name="Scripting Portal"/>
<menu label="臭蟲回報" name="Bug Reporting">
diff --git a/indra/newview/skins/default/xui/zh/menu_wearing_gear.xml b/indra/newview/skins/default/xui/zh/menu_wearing_gear.xml
index d9f4acb27b..6184f956d1 100644
--- a/indra/newview/skins/default/xui/zh/menu_wearing_gear.xml
+++ b/indra/newview/skins/default/xui/zh/menu_wearing_gear.xml
@@ -2,4 +2,5 @@
<toggleable_menu name="Gear Wearing">
<menu_item_call label="編輯裝扮" name="edit"/>
<menu_item_call label="脫下" name="takeoff"/>
+ <menu_item_call label="複製裝扮清單到剪貼簿" name="copy"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml
index 97a1bd6c84..9fecf2c104 100644
--- a/indra/newview/skins/default/xui/zh/notifications.xml
+++ b/indra/newview/skins/default/xui/zh/notifications.xml
@@ -37,6 +37,12 @@
<button name="Help" text="$helptext"/>
</form>
</template>
+ <template name="okhelpignore">
+ <form>
+ <button name="OK_okhelpignore" text="$yestext"/>
+ <button name="Help_okhelpignore" text="$helptext"/>
+ </form>
+ </template>
<template name="yesnocancelbuttons">
<form>
<button name="Yes" text="$yestext"/>
@@ -85,6 +91,40 @@
除存變更到目前的衣服/身體部位?
<usetemplate canceltext="取消" name="yesnocancelbuttons" notext="不要儲存" yestext="儲存"/>
</notification>
+ <notification name="ConfirmNoCopyToOutbox">
+ 你無權將至少一件物項複製到第二人生購物市集的發件匣。 你可以移動這些物項,或保留不動。
+ <usetemplate name="okcancelbuttons" notext="保留不移動物項" yestext="移動物項"/>
+ </notification>
+ <notification name="OutboxFolderCreated">
+ 已經為你所轉移到商家發件匣頂層的每一個物項,各自建立了一個新資料夾。
+ <usetemplate ignoretext="商家發件匣裡成功建立了一個新資料夾" name="okignore" yestext="確定"/>
+ </notification>
+ <notification name="OutboxImportComplete">
+ 成功
+
+所有資料夾已成功送往第二人生購物市集。
+ <usetemplate ignoretext="所有資料夾已送往第二人生購物市集" name="okignore" yestext="確定"/>
+ </notification>
+ <notification name="OutboxImportHadErrors">
+ 一部分的資料夾無法轉移
+
+將一部分資料夾送往第二人生購物市集時出錯。 這些資料夾仍在你的商家發件匣。
+
+詳情請參閱[[MARKETPLACE_IMPORTS_URL]錯誤記錄]。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="OutboxImportFailed">
+ 轉移失敗
+
+未將任何資料夾送往第二人生購物市集,系統或網路出錯。 請稍候再試一次。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="OutboxInitFailed">
+ 第二人生購物市集初始化失敗
+
+第二人生購物市集初始化失敗,系統或網路出錯。 請稍候再試一次。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
<notification name="CompileQueueSaveText">
上傳腳本文字時出問題,原因:[REASON]。 請稍候再試一次。
</notification>
@@ -326,13 +366,19 @@
進入 [SECOND_LIFE] 需要一個帳號。 你現在要不要新建一個?
<url name="url">
- http://join.secondlife.com/
+ [create_account_url]
</url>
<usetemplate name="okcancelbuttons" notext="再試一次" yestext="創造新帳戶"/>
</notification>
<notification name="InvalidCredentialFormat">
你必須在「使用者名稱」欄位裡輸入使用者名稱,或輸入化身的名和姓,然後再登入。
</notification>
+ <notification name="InvalidGrid">
+ &apos;[GRID]&apos; 不是有效的網格辨識元。
+ </notification>
+ <notification name="InvalidLocationSLURL">
+ 你的開始位置所指定的網格無效。
+ </notification>
<notification name="DeleteClassified">
刪除個人廣告「[NAME]」?
已付費用恕不退回。
@@ -438,7 +484,7 @@
儲存編譯腳本時出問題,原因:[REASON]。 請稍後再嘗試儲存腳本。
</notification>
<notification name="StartRegionEmpty">
- 糟糕,你的起始區域尚未定義。
+ 你的起始地區尚未定義。
請在「開始位置」框裡輸入區域名,或選擇「我上一次位置」或「我的家」作為開始位置。
<usetemplate name="okbutton" yestext="確定"/>
</notification>
@@ -461,6 +507,15 @@
</url>
<usetemplate ignoretext="我的電腦硬體並不支援" name="okcancelignore" notext="否" yestext="是"/>
</notification>
+ <notification name="IntelOldDriver">
+ 你的顯示卡很可能有新版的驅動程式。 更新顯示驅動程式會大幅改善性能。
+
+ 前往 [_URL] 察看是否有新版驅動程式?
+ <url name="url">
+ http://www.intel.com/p/en_US/support/detect/graphics
+ </url>
+ <usetemplate ignoretext="我的顯示驅動程式太老舊" name="okcancelignore" notext="否" yestext="是"/>
+ </notification>
<notification name="UnknownGPU">
你的系統含有一個 [APP_NAME] 無法辨認的顯像卡。
原因很可能是 [APP_NAME] 尚未針對新硬體完成測試。 這大概不會出問題,但你可能需要調整顯像設定。
@@ -557,6 +612,9 @@
請確定沒有物件被鎖住,並確定你擁有所有物件。
</notification>
+ <notification name="CannotLinkPermanent">
+ 物件無法跨越地區界限進行聯結。
+ </notification>
<notification name="CannotLinkDifferentOwners">
無法聯結;有些物件的所有人不同。
@@ -636,7 +694,7 @@
無法建立輸出檔:[FILE]
</notification>
<notification name="DoNotSupportBulkAnimationUpload">
- [APP_NAME] 目前尚不支援動作檔批量上傳。
+ [APP_NAME] 目前尚不支援 BVH 格式的動作檔批量上傳。
</notification>
<notification name="CannotUploadReason">
無法上傳 [FILE],原因:[REASON]
@@ -935,6 +993,40 @@
<button name="Cancel" text="取消"/>
</form>
</notification>
+ <notification label="新增自動取代清單" name="AddAutoReplaceList">
+ 新清單名稱:
+ <form name="form">
+ <button name="SetName" text="確定"/>
+ </form>
+ </notification>
+ <notification label="更改自動取代清單的名稱" name="RenameAutoReplaceList">
+ 「[DUPNAME]」名稱已有人使用。
+ 輸入另一個獨特的名稱:
+ <form name="form">
+ <button name="ReplaceList" text="取代目前的清單"/>
+ <button name="SetName" text="使用新名稱"/>
+ </form>
+ </notification>
+ <notification name="InvalidAutoReplaceEntry">
+ 關鍵字必須是一個字,取代字不得空白。
+ </notification>
+ <notification name="InvalidAutoReplaceList">
+ 該取代清單無效。
+ </notification>
+ <notification name="SpellingDictImportRequired">
+ 你必須指定一個檔案、一個名稱和一種語言。
+ </notification>
+ <notification name="SpellingDictIsSecondary">
+ [DIC_NAME] 字典似乎沒有 &quot;aff&quot; 檔案,這表示該字典是「次級」字典。
+它可用做附加字典,但不得作為主要字典。
+
+參見 https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries
+ </notification>
+ <notification name="SpellingDictImportFailed">
+ 無法複製 [FROM_NAME]
+
+ 到 [TO_NAME]
+ </notification>
<notification label="儲存裝扮" name="SaveOutfitAs">
儲存我正在穿的為新裝扮:
<form name="form">
@@ -966,7 +1058,7 @@
</form>
</notification>
<notification name="RemoveFromFriends">
- 你確定要從朋友名單中移除 [NAME] 嗎?
+ 確定要從朋友名單中移除 &lt;nolink&gt;[NAME]&lt;/nolink&gt;?
<usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1091,8 +1183,13 @@
<notification name="DisplaySetToSafe">
因為你指定了 -safe 選項,已將顯示設為安全等級。
</notification>
- <notification name="DisplaySetToRecommended">
- 根據你的系統設置,已將顯示設定為推薦採用的等級。
+ <notification name="DisplaySetToRecommendedGPUChange">
+ 由於你的顯像卡有所變更,已將顯示狀態設為推薦採用的等級。
+原顯像卡:[LAST_GPU]
+新顯像卡:[THIS_GPU]
+ </notification>
+ <notification name="DisplaySetToRecommendedFeatureChange">
+ 由於呈像子系統有所變更,已將顯示狀態設為推薦的設定。
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
@@ -1103,7 +1200,7 @@
你已被移往一個鄰近地區。
</notification>
<notification name="AvatarMovedLast">
- 你的上一個地點目前無法前往。
+ 你所請求的地點目前無法前往。
你已被移往一個鄰近地區。
</notification>
<notification name="AvatarMovedHome">
@@ -1122,8 +1219,7 @@
[APP_NAME] 安裝完成。
如果你是第一次使用 [SECOND_LIFE],你將需要建立新帳號才可登入。
-返回 [http://join.secondlife.com secondlife.com] 建立新帳號?
- <usetemplate name="okcancelbuttons" notext="繼續" yestext="新帳戶..."/>
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="建立帳號…"/>
</notification>
<notification name="LoginPacketNeverReceived">
連線出現問題。 問題可能出在你的網路連線或 [SECOND_LIFE_GRID]。
@@ -1409,7 +1505,7 @@ SHA1 指紋:[MD5_DIGEST]
<usetemplate ignoretext="在我退回物件給它們的所有人前確認" name="okcancelignore" notext="取消" yestext="確定"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- 你目前是 [GROUP] 群組的成員。
+ 你目前是 &lt;nolink&gt;[GROUP]&lt;/nolink&gt; 群組的成員。
是否要離開群組?
<usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
</notification>
@@ -1544,6 +1640,11 @@ SHA1 指紋:[MD5_DIGEST]
<button name="Cancel" text="取消"/>
</form>
</notification>
+ <notification name="TooManyTeleportOffers">
+ 你試圖送出 [OFFERS] 個瞬間傳送邀請。
+超過了 [LIMIT] 個的上限。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
<notification name="OfferTeleportFromGod">
用神的權力把居民召到你的位置?
<form name="form">
@@ -1633,83 +1734,128 @@ SHA1 指紋:[MD5_DIGEST]
<usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
</notification>
<notification name="RegionEntryAccessBlocked">
- 由於你的內容分級,你不能到該地區。 原因可能是我們沒有足夠資訊驗證你的年齡。
-
-請確定你已安裝最新版的 Viewer,並前往知識庫瞭解如何出入這種內容分級的區域。
+ 你所欲前往的地區含有超過你目前偏好的分級的內容。 你可以到「我自己 &gt; 偏好設定 &gt; 一般設定」變更你的偏好設定。
<usetemplate name="okbutton" yestext="確定"/>
</notification>
- <notification name="RegionEntryAccessBlocked_KB">
- 由於你的內容分級,你不能到該地區。
-
-前往知識庫進一步瞭解內容分級?
+ <notification name="RegionEntryAccessBlocked_AdultsOnlyContent">
+ 你所欲前往的地區含有 [REGIONMATURITY] 的分級內容,僅限成人。
<url name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
</url>
- <usetemplate ignoretext="礙於內容分級的限制,我無法進入這個地區" name="okcancelignore" notext="關閉" yestext="前往知識庫"/>
+ <usetemplate ignoretext="跨越地區:你所欲前往的地區含有限制給成人的內容。" name="okcancelignore" notext="關閉" yestext="前往知識庫"/>
</notification>
<notification name="RegionEntryAccessBlocked_Notify">
- 由於你的內容分級,你不能到該地區。
+ 你所欲前往的地區包含 [REGIONMATURITY] 分級的內容,可是你目前的偏好設定排除了 [REGIONMATURITY] 分級的內容。
+ </notification>
+ <notification name="RegionEntryAccessBlocked_NotifyAdultsOnly">
+ 你所欲前往的地區含有 [REGIONMATURITY] 的分級內容,僅限成人。
</notification>
<notification name="RegionEntryAccessBlocked_Change">
- 根據你所設定的內容分級,你不能到該地區。
-
-要進入該地區,請更改你的內容分級偏好。 這將允許你搜尋並接觸 [REGIONMATURITY] 內容。 要還原任何變更,請到「我自己 &gt; 偏好設定 &gt; 一般設定」。
+ 你所欲前往的地區包含 [REGIONMATURITY] 分級的內容,可是你目前的偏好設定排除了 [REGIONMATURITY] 分級的內容。 你可以變更你的偏好設定,或取消前往。 你的偏好設定變更後,你可以試圖再進入該地區。
+ <form name="form">
+ <button name="OK" text="變更偏好設定"/>
+ <button name="Cancel" text="取消"/>
+ <ignore name="ignore" text="跨越地區:你所欲前往的地區含有被你目前的偏好設定排除的分級內容。"/>
+ </form>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_PreferencesOutOfSync">
+ 發生技術問題,你的偏好設定和伺服器上的不一致。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="TeleportEntryAccessBlocked">
+ 你所欲前往的地區含有超過你目前偏好的分級的內容。 你可以到「我自己 &gt; 偏好設定 &gt; 一般設定」變更你的偏好設定。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="TeleportEntryAccessBlocked_AdultsOnlyContent">
+ 你所欲前往的地區含有 [REGIONMATURITY] 的分級內容,僅限成人。
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="瞬間傳送:你所欲前往的地區含有限制給成人的內容。" name="okcancelignore" notext="關閉" yestext="前往知識庫"/>
+ </notification>
+ <notification name="TeleportEntryAccessBlocked_Notify">
+ 你所欲前往的地區包含 [REGIONMATURITY] 分級的內容,可是你目前的偏好設定排除了 [REGIONMATURITY] 分級的內容。
+ </notification>
+ <notification name="TeleportEntryAccessBlocked_NotifyAdultsOnly">
+ 你所欲前往的地區含有 [REGIONMATURITY] 的分級內容,僅限成人。
+ </notification>
+ <notification name="TeleportEntryAccessBlocked_ChangeAndReTeleport">
+ 你所欲前往的地區包含 [REGIONMATURITY] 分級的內容,可是你目前的偏好設定排除了 [REGIONMATURITY] 分級的內容。 我們可以變更你的偏好設定好讓你繼續瞬間傳送,你也可取消這動作。
+ <form name="form">
+ <button name="OK" text="變更後繼續"/>
+ <button name="Cancel" text="取消"/>
+ <ignore name="ignore" text="瞬間傳送(可重啟):你所欲前往的地區含有被你目前的偏好設定排除的分級內容。"/>
+ </form>
+ </notification>
+ <notification name="TeleportEntryAccessBlocked_Change">
+ 你所欲前往的地區包含 [REGIONMATURITY] 分級的內容,可是你目前的偏好設定排除了 [REGIONMATURITY] 分級的內容。 我們可以變更你的偏好設定,你也可取消瞬間傳送。 你的偏好設定變更後,你可以再嘗試瞬間傳送。
<form name="form">
<button name="OK" text="變更偏好設定"/>
- <button name="Cancel" text="關閉"/>
- <ignore name="ignore" text="我所選擇的內容分級不允許我進入一個地區"/>
+ <button name="Cancel" text="取消"/>
+ <ignore name="ignore" text="瞬間傳送(不可重啟):你所欲前往的地區含有被你目前的偏好設定排除的分級內容。"/>
</form>
</notification>
+ <notification name="TeleportEntryAccessBlocked_PreferencesOutOfSync">
+ 發生技術問題,你的偏好設定和伺服器上的不一致。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
<notification name="PreferredMaturityChanged">
- 你的內容分級偏好現在設為 [RATING]。
+ 你將不再收到通知,告知你即將進入一個 [RATING] 內容分級的地區。 你可以到選單列底下的「我自己 &gt; 偏好設定 &gt; 一般設定」變更你的內容偏好。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="MaturityChangeError">
+ 我們此時無法變更你的偏好設定,讓你觀看 [PREFERRED_MATURITY] 分級的內容。 你的偏好設定已經重設,可觀看 [ACTUAL_MATURITY] 的分級內容。 你可以到選單列的「我自己 &gt; 偏好設定 &gt; 一般設定」再次變更你的偏好。
+ <usetemplate name="okbutton" yestext="確定"/>
</notification>
<notification name="LandClaimAccessBlocked">
- 由於你的內容分級,你無法收取這塊土地。 原因可能是我們沒有足夠資訊驗證你的年齡。
-
-請確定你已安裝最新版的 Viewer,並前往知識庫瞭解如何出入這種內容分級的區域。
+ 你所欲收取的土地含有超過你目前偏好的分級內容。 你可以到「我自己 &gt; 偏好設定 &gt; 一般設定」變更你的偏好設定。
<usetemplate name="okbutton" yestext="確定"/>
</notification>
- <notification name="LandClaimAccessBlocked_KB">
- 由於你的內容分級,你無法收取這塊土地。
-
-前往知識庫進一步瞭解內容分級?
+ <notification name="LandClaimAccessBlocked_AdultsOnlyContent">
+ 只有成人才能收取這土地。
<url name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
</url>
- <usetemplate ignoretext="礙於內容分級的限制,我無法收取這塊土地" name="okcancelignore" notext="關閉" yestext="前往知識庫"/>
+ <usetemplate ignoretext="只有成人才能收取這土地。" name="okcancelignore" notext="關閉" yestext="前往知識庫"/>
</notification>
<notification name="LandClaimAccessBlocked_Notify">
- 由於你的內容分級,你無法收取這塊土地。
+ 你所欲收取的土地包含 [REGIONMATURITY] 分級的內容,可是你目前的偏好設定排除了 [REGIONMATURITY] 分級的內容。
+ </notification>
+ <notification name="LandClaimAccessBlocked_NotifyAdultsOnly">
+ 你所欲收取的土地包含 [REGIONMATURITY] 的分級內容,僅限成人。
</notification>
<notification name="LandClaimAccessBlocked_Change">
- 礙於你所設的內容分級偏好,你無法收取這塊土地。
-
-你可以現在點按「更改偏好設定」提升內容分級,即可進入。 從現在起,你可以搜尋並接觸 [REGIONMATURITY] 內容。 往後如果你要還原這項變更,請到「我自己 &gt; 偏好設定 &gt; 一般設定」。
- <usetemplate ignoretext="我所選擇的內容分級不允許我收取土地" name="okcancelignore" notext="關閉" yestext="變更偏好設定"/>
+ 你所欲收取的土地包含 [REGIONMATURITY] 分級的內容,可是你目前的偏好設定排除了 [REGIONMATURITY] 分級的內容。 我們可以變更你的偏好,讓你再試圖收取土地。
+ <form name="form">
+ <button name="OK" text="變更偏好設定"/>
+ <button name="Cancel" text="取消"/>
+ <ignore name="ignore" text="你所欲收取的土地含有被你目前的偏好所排除的分級內容。"/>
+ </form>
</notification>
<notification name="LandBuyAccessBlocked">
- 由於你的內容分級,你無法購買這塊土地。 原因可能是我們沒有足夠資訊驗證你的年齡。
-
-請確定你已安裝最新版的 Viewer,並前往知識庫瞭解如何出入這種內容分級的區域。
+ 你所欲購買的土地的內容分級超過你目前所設偏好。 你可以到「我自己 &gt; 偏好設定 &gt; 一般設定」變更你的偏好設定。
<usetemplate name="okbutton" yestext="確定"/>
</notification>
- <notification name="LandBuyAccessBlocked_KB">
- 由於你的內容分級,你無法購買這塊土地。
-
-前往知識庫進一步瞭解內容分級?
+ <notification name="LandBuyAccessBlocked_AdultsOnlyContent">
+ 只有成人才能購買這土地。
<url name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
</url>
- <usetemplate ignoretext="礙於內容分級的限制,我無法購買這塊土地" name="okcancelignore" notext="關閉" yestext="前往知識庫"/>
+ <usetemplate ignoretext="只有成人才能購買這土地。" name="okcancelignore" notext="關閉" yestext="前往知識庫"/>
</notification>
<notification name="LandBuyAccessBlocked_Notify">
- 由於你的內容分級,你無法購買這塊土地。
+ 你所欲購買的土地包含 [REGIONMATURITY] 分級的內容,可是你目前的偏好設定排除了 [REGIONMATURITY] 分級的內容。
+ </notification>
+ <notification name="LandBuyAccessBlocked_NotifyAdultsOnly">
+ 你所欲購買的土地含有 [REGIONMATURITY] 分級的內容,僅限成人。
</notification>
<notification name="LandBuyAccessBlocked_Change">
- 礙於你所設的內容分級,你無法購買這塊土地。
-
-你可以現在點按「更改偏好設定」提升內容分級,即可進入。 從現在起,你可以搜尋並接觸 [REGIONMATURITY] 內容。 往後如果你要還原這項變更,請到「我自己 &gt; 偏好設定 &gt; 一般設定」。
- <usetemplate ignoretext="我所選擇的內容分級不允許我購買土地" name="okcancelignore" notext="關閉" yestext="變更偏好設定"/>
+ 你所欲購買的土地包含 [REGIONMATURITY] 分級的內容,可是你目前的偏好設定排除了 [REGIONMATURITY] 分級的內容。 我們可以變更你的偏好,讓你再試圖購買土地。
+ <form name="form">
+ <button name="OK" text="變更偏好設定"/>
+ <button name="Cancel" text="取消"/>
+ <ignore name="ignore" text="你所欲購買的土地含有被你目前的偏好所排除的分級內容。"/>
+ </form>
</notification>
<notification name="TooManyPrimsSelected">
選擇了太多項的幾何元件。 請至多選擇 [MAX_PRIM_COUNT] 項幾何元件,再試一次。
@@ -1763,10 +1909,9 @@ SHA1 指紋:[MD5_DIGEST]
</form>
</notification>
<notification label="已變更地區的內容分級" name="RegionMaturityChange">
- 地區的內容分級已經更新。
+ 此地區的內容分級已經變更。
可能需要稍候一段時間,地圖才會反映這個變更。
-
-居民若要進入完全成人分級的地區,帳號必須先通過年齡驗證或付款驗證。
+ <usetemplate name="okbutton" yestext="確定"/>
</notification>
<notification label="聲音版本不相符" name="VoiceVersionMismatch">
這版本的 [APP_NAME] 和本地區的語音聊天功能不相容。 想要語音聊天正常運作,你必須更新 [APP_NAME]。
@@ -1883,6 +2028,18 @@ SHA1 指紋:[MD5_DIGEST]
你確定你要結束退出?
<usetemplate ignoretext="當我結束退出時進行確認" name="okcancelignore" notext="不要結束退出" yestext="結束退出"/>
</notification>
+ <notification name="ConfirmRestoreToybox">
+ 這動作將會恢復你預設的按鈕和工具列。
+
+你不能取消這動作。
+ <usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmClearAllToybox">
+ 這動作將把所有按鈕收入工具箱,你的工具列將會清空。
+
+你不能取消這動作。
+ <usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
+ </notification>
<notification name="DeleteItems">
[QUESTION]
<usetemplate ignoretext="刪除物品前確認" name="okcancelignore" notext="取消" yestext="確定"/>
@@ -1963,6 +2120,10 @@ SHA1 指紋:[MD5_DIGEST]
你確定要刪除你的旅行、網頁及搜尋歷史紀錄嗎?
<usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
</notification>
+ <notification name="ConfirmClearCache">
+ 確定要清除你 Viewer 的快取?
+ <usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
+ </notification>
<notification name="ConfirmClearCookies">
你確定要清除你的 cookies 嗎?
<usetemplate name="okcancelbuttons" notext="取消" yestext="是"/>
@@ -1988,48 +2149,30 @@ SHA1 指紋:[MD5_DIGEST]
你要覆寫已儲存的預設配置嗎?
<usetemplate name="okcancelbuttons" notext="否" yestext="是"/>
</notification>
- <notification name="WLDeletePresetAlert">
- 你要刪除 [SKY]?
- <usetemplate name="okcancelbuttons" notext="否" yestext="是"/>
- </notification>
<notification name="WLNoEditDefault">
你不能編輯或刪除預設的設定。
</notification>
<notification name="WLMissingSky">
這個「一日循環」檔案參考了一個不存在的天空檔案:[SKY]。
</notification>
- <notification name="PPSaveEffectAlert">
- PostProcess 效果已經存在。 你是否仍要把它覆寫掉?
- <usetemplate name="okcancelbuttons" notext="否" yestext="是"/>
+ <notification name="WLRegionApplyFail">
+ 抱歉,設定無法套用到地區。 離開地區再返回也許可以解決這個問題。 所得的原因為:[FAIL_REASON]
</notification>
- <notification name="NewSkyPreset">
- 請為新的天空定一個名稱
- <form name="form">
- <input name="message">
- 新預設配配置
- </input>
- <button name="OK" text="確定"/>
- <button name="Cancel" text="取消"/>
- </form>
- </notification>
- <notification name="ExistsSkyPresetAlert">
- 預設值已經存在!
+ <notification name="EnvCannotDeleteLastDayCycleKey">
+ 無法刪除此日循環的最後一組設定,日循環不得為空白。 你應該修改最後一組資料,不要試圖刪除,然後再建立新的。
+ <usetemplate name="okbutton" yestext="確定"/>
</notification>
- <notification name="NewWaterPreset">
- 請為水的新預設值定一個名稱
- <form name="form">
- <input name="message">
- 新預設配配置
- </input>
- <button name="OK" text="確定"/>
- <button name="Cancel" text="取消"/>
- </form>
+ <notification name="DayCycleTooManyKeyframes">
+ 你無法新增更多的 keyframe 到這個日循環。 [SCOPE] 範圍的日循環最多允許 [MAX] 個 keyframe。
+ <usetemplate name="okbutton" yestext="確定"/>
</notification>
- <notification name="ExistsWaterPresetAlert">
- 預設值已經存在!
+ <notification name="EnvUpdateRate">
+ 你至多只能每 [WAIT] 秒更新一次地區的環境設定。 請等到這段時間過去了再試一次。
+ <usetemplate name="okbutton" yestext="確定"/>
</notification>
- <notification name="WaterNoEditDefault">
- 你不能編輯或刪除預設的設定。
+ <notification name="PPSaveEffectAlert">
+ PostProcess 效果已經存在。 你是否仍要把它覆寫掉?
+ <usetemplate name="okcancelbuttons" notext="否" yestext="是"/>
</notification>
<notification name="ChatterBoxSessionStartError">
無法開始一個與 [RECIPIENT] 他的新聊天會話。
@@ -2058,13 +2201,11 @@ SHA1 指紋:[MD5_DIGEST]
<usetemplate ignoretext="編輯外觀時能穿上我所創造的服裝" name="okcancelignore" notext="否" yestext="是"/>
</notification>
<notification name="NotAgeVerified">
- 你必須通過年齡驗證才能進入這區域。 你是否要前往 [SECOND_LIFE] 網站進行年齡驗證?
-
-[_URL]
- <url name="url">
- https://secondlife.com/account/verification.php
- </url>
- <usetemplate ignoretext="我尚未驗證年齡" name="okcancelignore" notext="否" yestext="是"/>
+ 你所欲前往的地點設限給年滿 18 歲的居民進入。
+ <usetemplate ignoretext="我年齡不滿規定,無法進入有年齡限制的區域。" name="okignore" yestext="確定"/>
+ </notification>
+ <notification name="NotAgeVerified_Notify">
+ 此地點限制為年滿 18 歲。
</notification>
<notification name="Cannot enter parcel: no payment info on file">
你必須提供付款資料才能進入這區域。 你是否要前往 [SECOND_LIFE] 網站設定付款資料?
@@ -2100,10 +2241,10 @@ SHA1 指紋:[MD5_DIGEST]
主旨:[SUBJECT],訊息:[MESSAGE]
</notification>
<notification name="FriendOnline">
- [NAME] 上線
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; 目前在線上
</notification>
<notification name="FriendOffline">
- [NAME] 離線
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; 目前離線
</notification>
<notification name="AddSelfFriend">
雖然你人很好,你還是不能把自己加為朋友。
@@ -2125,7 +2266,7 @@ SHA1 指紋:[MD5_DIGEST]
地形 .raw 檔已下載
</notification>
<notification name="GestureMissing">
- 呃… 姿勢 [NAME] 在資料庫中遺失。
+ 姿勢 [NAME] 在資料庫中遺失。
</notification>
<notification name="UnableToLoadGesture">
無法載入姿勢 [NAME]。
@@ -2217,14 +2358,15 @@ SHA1 指紋:[MD5_DIGEST]
你的名片已被拒絕。
</notification>
<notification name="TeleportToLandmark">
- 若想瞬間傳送到「[NAME]」等等地點,你可以開啟螢幕右方的「地點」側邊欄,再選擇「地標」頁籤。
-用點按方式選擇任何地標,再按側邊欄底下的「瞬間傳送」。
-(你還可以直接按兩下那個地標,或按滑鼠右鍵,選擇「瞬間傳送」。)
+ 要瞬間傳送到「[NAME]」等地點,請點按「地點」按鈕,
+ 然後在開啟的視窗裡,選擇「地標」頁籤。 點按任何
+ 地標加以選擇,再點按視窗底下的「瞬間傳送」按鈕。
+ (你還可以直接按兩下那個地標,或按滑鼠右鍵,選擇「瞬間傳送」。)
</notification>
<notification name="TeleportToPerson">
- 若想聯絡「[NAME]」等等居民,你可以開啟螢幕右方的「人群」側邊欄。
-從清單選擇一位居民,再按側邊欄底下的「IM」。
-(你還可以從清單直接按兩下名字,或按滑鼠右鍵,選擇「IM」。)
+ 要聯絡如「[NAME]」的任何一位居民,請點按「人群」按鈕,從打開的視窗中選擇一位居民,再點按視窗底下的「IM」。
+
+ (你還可以從清單直接按兩下名字,或按滑鼠右鍵,選擇「IM」。)
</notification>
<notification name="CantSelectLandFromMultipleRegions">
無法選擇超出伺服器邊界的土地。
@@ -2245,6 +2387,9 @@ SHA1 指紋:[MD5_DIGEST]
<notification name="PaymentSent">
[MESSAGE]
</notification>
+ <notification name="PaymentFailure">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
活動通知:
@@ -2321,6 +2466,26 @@ SHA1 指紋:[MD5_DIGEST]
<notification name="NoBuild">
這區域禁止建造物件。 你不能在此建造或產生物件。
</notification>
+ <notification name="PathfindingDirty">
+ 這地區的尋徑功能有所變更,待儲存。 如果你有建製權,你可以點按「重新產出地區」按鈕重新產出地區。
+ </notification>
+ <notification name="DynamicPathfindingDisabled">
+ 這地區並未啟用動態尋徑。 使用尋徑 LSL 呼叫的帶腳本物件,在此地區可能無法正常運作。
+ </notification>
+ <notification name="PathfindingRebakeNavmesh">
+ 更改本地區的某些物件將導致其他移動物件的運作發生問題。 要使移動物件正常運作,請點按「重新產出地區」按鈕。 欲獲知詳情請選擇「幫助」。
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer
+ </url>
+ <usetemplate helptext="幫助" ignoretext="更改本地區的某些物件將導致其他移動物件的運作發生問題。" name="okhelpignore" yestext="確定"/>
+ </notification>
+ <notification name="PathfindingCannotRebakeNavmesh">
+ 發生錯誤。 問題可能出在網路或伺服器,也可能因為你無權建製物件。 有時,只要登出再登入即能解決這類問題。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="SeeAvatars">
+ 本地段隱藏其內的化身和聊天文字,其他地段看不到。 你看不見地段外的居民,他們也看不見你。 頻道 0 的聊天文字也被封鎖。
+ </notification>
<notification name="ScriptsStopped">
某管理員已暫時停止區域裡的腳本。
</notification>
@@ -2336,9 +2501,7 @@ SHA1 指紋:[MD5_DIGEST]
你只能在你所處的區域收取公共土地。
</notification>
<notification name="RegionTPAccessBlocked">
- 由於你的內容分級,你不能到該地區。 你可能需要通過年齡驗證,且/或安裝最新版的 Viewer。
-
-請前往知識庫瞭解如何出入這種內容分級的區域。
+ 你所欲前往的地區含有超過你目前偏好的分級的內容。 你可以到「我自己 &gt; 偏好設定 &gt; 一般設定」變更你的偏好設定。
</notification>
<notification name="URBannedFromRegion">
這個區域禁止你進入。
@@ -2349,11 +2512,11 @@ SHA1 指紋:[MD5_DIGEST]
<notification name="ImproperPaymentStatus">
你沒有適當的付款狀態,不能進入這區域。
</notification>
- <notification name="MustGetAgeRgion">
- 你必須通過年齡驗證才能進入這地區。
+ <notification name="MustGetAgeRegion">
+ 你必須年滿 18 歲才可進入這地區。
</notification>
<notification name="MustGetAgeParcel">
- 你必須通過年齡驗證以進入這地段。
+ 你必須年滿 18 歲才可進入這地段。
</notification>
<notification name="NoDestRegion">
找不到目的地地區。
@@ -2415,11 +2578,19 @@ SHA1 指紋:[MD5_DIGEST]
</notification>
<notification name="ObjectGiveItem">
名為 &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;、由 [NAME_SLURL] 擁有的物件給了你這個 [OBJECTTYPE]:
-[ITEM_SLURL]
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
+ <form name="form">
+ <button name="Keep" text="保留"/>
+ <button name="Discard" text="丟棄"/>
+ <button name="Mute" text="封鎖所有人"/>
+ </form>
+ </notification>
+ <notification name="OwnObjectGiveItem">
+ 你名為 &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; 的物件給了你這個 [OBJECTTYPE]:
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
<form name="form">
<button name="Keep" text="保留"/>
<button name="Discard" text="丟棄"/>
- <button name="Mute" text="封鎖"/>
</form>
</notification>
<notification name="UserGiveItem">
@@ -2447,12 +2618,33 @@ SHA1 指紋:[MD5_DIGEST]
<notification name="TeleportOffered">
[NAME_SLURL] 想要瞬間傳送你到他的地點:
-[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
+“[MESSAGE]”
+&lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt; - [MATURITY_STR]
<form name="form">
<button name="Teleport" text="瞬間傳送"/>
<button name="Cancel" text="取消"/>
</form>
</notification>
+ <notification name="TeleportOffered_MaturityExceeded">
+ [NAME_SLURL] 想要瞬間傳送你到他的地點:
+
+“[MESSAGE]”
+&lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt; - [MATURITY_STR]
+
+此地區包含 [REGION_CONTENT_MATURITY] 的分級內容,可是你目前的偏好設定排除了 [REGION_CONTENT_MATURITY] 的分級內容。 我們可以變更你的偏好設定好讓你繼續瞬間傳送,你也可取消這動作。
+ <form name="form">
+ <button name="Teleport" text="變更後繼續"/>
+ <button name="Cancel" text="取消"/>
+ </form>
+ </notification>
+ <notification name="TeleportOffered_MaturityBlocked">
+ [NAME_SLURL] 想要瞬間傳送你到他的地點:
+
+“[MESSAGE]”
+&lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt; - [MATURITY_STR]
+
+可是,此地區含有僅限成人的內容。
+ </notification>
<notification name="TeleportOfferSent">
已向 [TO_NAME] 發出瞬間傳送邀請
</notification>
@@ -2488,10 +2680,10 @@ SHA1 指紋:[MD5_DIGEST]
</form>
</notification>
<notification name="FriendshipAccepted">
- [NAME] 接受了你的交友邀請。
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; 接受了你的交友邀請。
</notification>
<notification name="FriendshipDeclined">
- [NAME] 謝絕你的交友邀請。
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; 婉拒了你的交友邀請。
</notification>
<notification name="FriendshipAcceptedByMe">
交友邀請被接受。
@@ -2547,30 +2739,28 @@ SHA1 指紋:[MD5_DIGEST]
</form>
</notification>
<notification name="ScriptQuestionCaution">
- 一個名為 &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;、由 &apos;[NAME]&apos; 擁有的物件想要:
-
-[QUESTIONS]
-如果你不信任這物件或它的創造人,你應該拒絕這個要求。
-
-同意這個請求?
+ 警告:物件 &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; 要求全權存取你的林登幣帳戶。 你如果允許存取帳戶,它將可在任何時候從你帳戶取走資金,或完全加以清空,或定期取走部分資金,且不會發出警告。
+
+這很可能是種不當的要求。 如果你不完全瞭解它為何要求存取你的帳戶,請勿允准。
<form name="form">
- <button name="Grant" text="同意"/>
+ <button name="Grant" text="允許全權存取"/>
<button name="Deny" text="拒絕"/>
- <button name="Details" text="細節..."/>
</form>
</notification>
<notification name="ScriptDialog">
[NAME] 的 &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
[MESSAGE]
<form name="form">
- <button name="Ignore" text="忽視"/>
+ <button name="Client_Side_Mute" text="封鎖"/>
+ <button name="Client_Side_Ignore" text="忽視"/>
</form>
</notification>
<notification name="ScriptDialogGroup">
[GROUPNAME] 的 &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
[MESSAGE]
<form name="form">
- <button name="Ignore" text="忽視"/>
+ <button name="Client_Side_Mute" text="封鎖"/>
+ <button name="Client_Side_Ignore" text="忽視"/>
</form>
</notification>
<notification name="BuyLindenDollarSuccess">
@@ -2748,7 +2938,15 @@ SHA1 指紋:[MD5_DIGEST]
選取要分享的居民。
</notification>
<notification name="MeshUploadError">
- [LABEL] 上傳失敗:[MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER]
+ [LABEL] 上傳失敗:[MESSAGE] [IDENTIFIER]
+
+詳見記錄檔。
+ </notification>
+ <notification name="MeshUploadPermError">
+ 請求網面上傳權限時出錯。
+ </notification>
+ <notification name="RegionCapabilityRequestError">
+ 無法取得地區能力 &apos;[CAPABILITY]&apos;。
</notification>
<notification name="ShareItemsConfirmation">
請確定你要和居民分享這些物項:
@@ -2760,6 +2958,18 @@ SHA1 指紋:[MD5_DIGEST]
[RESIDENTS]
<usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
</notification>
+ <notification name="ShareFolderConfirmation">
+ 一次只能分享一個資料夾。
+
+請確定你要和居民分享這些物項:
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+居民:
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
+ </notification>
<notification name="ItemsShared">
物品已成功分享。
</notification>
@@ -2838,6 +3048,10 @@ SHA1 指紋:[MD5_DIGEST]
(存續 [EXISTENCE] 秒鐘)
你在 [TIME] 秒鐘後在本地為 &apos;[BODYREGION]&apos; 更新了一個 [RESOLUTION] 的定貌材質。
</notification>
+ <notification name="LivePreviewUnavailable">
+ 我們無法顯示這個材質的預覽,因為它設為「禁止複製」且 / 或「禁止轉移」。
+ <usetemplate ignoretext="「禁止複製」和「禁止轉移」的材質若不能使用實時預覽模式,請給我警示。" name="okignore" yestext="確定"/>
+ </notification>
<notification name="ConfirmLeaveCall">
你確定要離開這段通話?
<usetemplate ignoretext="我結束通話前進行確認" name="okcancelignore" notext="否" yestext="是"/>
@@ -2891,6 +3105,12 @@ SHA1 指紋:[MD5_DIGEST]
<notification label="你得到林登幣!" name="HintLindenDollar">
這裡顯示你目前的 L$ 餘額。 點按「購買 L$」可添購林登幣。
</notification>
+ <notification name="LowMemory">
+ 你的可用記憶體很小。 第二人生部分功能將停用,以免當機。 請關閉其他應用程式。 這狀況若持續,請重啟第二人生。
+ </notification>
+ <notification name="ForceQuitDueToLowMemory">
+ 記憶體不足,第二人生將於 30 秒後關閉離開。
+ </notification>
<notification name="PopupAttempt">
一個突顯式視窗開啟時被阻擋。
<form name="form">
@@ -2898,6 +3118,54 @@ SHA1 指紋:[MD5_DIGEST]
<button name="open" text="開啟突顯式視窗"/>
</form>
</notification>
+ <notification name="SOCKS_NOT_PERMITTED">
+ SOCKS 5 代理伺服器 &quot;[HOST]:[PORT]&quot; 拒絕連通,規則集不允許。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="SOCKS_CONNECT_ERROR">
+ SOCKS 5 代理伺服器 &quot;[HOST]:[PORT]&quot; 拒絕連通,無法打開 TCP 頻道。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="SOCKS_NOT_ACCEPTABLE">
+ SOCKS 5 代理伺服器 &quot;[HOST]:[PORT]&quot; 拒絕所選的鑒認方法。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="SOCKS_AUTH_FAIL">
+ SOCKS 5 代理伺服器 &quot;[HOST]:[PORT]&quot; 回報:你的鑒認資料無效。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="SOCKS_UDP_FWD_NOT_GRANTED">
+ SOCKS 5 代理伺服器 &quot;[HOST]:[PORT]&quot; 拒絕 UDP 聯結請求。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="SOCKS_HOST_CONNECT_FAILED">
+ 無法連通 SOCKS 5 代理伺服器 &quot;[HOST]:[PORT]&quot;。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="SOCKS_UNKNOWN_STATUS">
+ 伺服器 &quot;[HOST]:[PORT]&quot; 發生不明的代理伺服器錯誤。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="SOCKS_INVALID_HOST">
+ 無效的 SOCKS 代理伺服器位址或埠號 &quot;[HOST]:[PORT]&quot;。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="SOCKS_BAD_CREDS">
+ 無效的 SOCKS 5 使用者名稱或密碼。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="PROXY_INVALID_HTTP_HOST">
+ 無效的 HTTP 代理伺服器位址或埠號 &quot;[HOST]:[PORT]&quot;。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="PROXY_INVALID_SOCKS_HOST">
+ 無效的 SOCKS 代理伺服器位址或埠號 &quot;[HOST]:[PORT]&quot;。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="ChangeProxySettings">
+ 重新啟動 [APP_NAME] 後將採用新的代理伺服器設定。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
<notification name="AuthRequest">
&apos;[REALM]&apos; 領域的 &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; 站點需要使用者名稱和密碼。
<form name="form">
@@ -2907,10 +3175,6 @@ SHA1 指紋:[MD5_DIGEST]
<button name="cancel" text="取消"/>
</form>
</notification>
- <notification label="" name="ModeChange">
- 改變劉覽器模式要求你必須結束退出並重新啟動。
- <usetemplate name="okcancelbuttons" notext="不要結束退出" yestext="結束退出"/>
- </notification>
<notification label="" name="NoClassifieds">
只有進階模式才能新建或編輯個人廣告。 你是否想要結束離開,以便變更模式? 你可在登入畫面選擇想要的模式。
<usetemplate name="okcancelbuttons" notext="不要結束退出" yestext="結束退出"/>
@@ -2955,6 +3219,66 @@ SHA1 指紋:[MD5_DIGEST]
只有進階模式才能搜尋。 你是否要登出並且變更模式?
<usetemplate name="okcancelbuttons" notext="不要結束退出" yestext="結束退出"/>
</notification>
+ <notification label="" name="ConfirmHideUI">
+ 這將會隱藏所有選單內容和按鈕。 要恢復原狀,再點按 [SHORTCUT] 一次。
+ <usetemplate ignoretext="隱藏使用者介面前先確認" name="okcancelignore" notext="取消" yestext="確定"/>
+ </notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom">
+ 所選的一些聯結集的幻影旗標將被切換。
+
+你確定要繼續嗎?
+ <usetemplate ignoretext="所選的一些聯結集的幻影旗標將被切換。" name="okcancelignore" notext="取消" yestext="確定"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted">
+ 所選某些聯結集因權限問題,無法設定為 &apos;[REQUESTED_TYPE]&apos;。 這些聯結集將被設為 &apos;[RESTRICTED_TYPE]&apos;。
+
+你確定要繼續嗎?
+ <usetemplate ignoretext="所選某些聯結集因權限問題,無法設定。" name="okcancelignore" notext="取消" yestext="確定"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnVolume">
+ 所選某些聯結集無法設為 &apos;[REQUESTED_TYPE]&apos;,因為形狀屬於非凸面。
+
+你確定要繼續嗎?
+ <usetemplate ignoretext="所選某些聯結集因為形狀屬於非凸面,無法設定" name="okcancelignore" notext="取消" yestext="確定"/>
+ </notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted">
+ 所選的一些聯結集的幻影旗標將被切換。
+
+所選某些聯結集因權限問題,無法設定為 &apos;[REQUESTED_TYPE]&apos;。 這些聯結集將被設為 &apos;[RESTRICTED_TYPE]&apos;。
+
+你確定要繼續嗎?
+ <usetemplate ignoretext="所選的一些聯結集的幻影旗標可成功切換,其他的則因權限問題而無法設定。" name="okcancelignore" notext="取消" yestext="確定"/>
+ </notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnVolume">
+ 所選的一些聯結集的幻影旗標將被切換。
+
+所選某些聯結集無法設為 &apos;[REQUESTED_TYPE]&apos;,因為形狀屬於非凸面。
+
+你確定要繼續嗎?
+ <usetemplate ignoretext="所選的一些聯結集的幻影旗標可成功切換,其他的則因形狀屬於非凸面而無法設定" name="okcancelignore" notext="取消" yestext="確定"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted_MismatchOnVolume">
+ 所選某些聯結集因權限問題,無法設定為 &apos;[REQUESTED_TYPE]&apos;。 這些聯結集將被設為 &apos;[RESTRICTED_TYPE]&apos;。
+
+所選某些聯結集無法設為 &apos;[REQUESTED_TYPE]&apos;,因為形狀屬於非凸面。 這些聯結集的使用類型將維持不變。
+
+你確定要繼續嗎?
+ <usetemplate ignoretext="所選某些聯結集因權限不足,且形狀屬於非凸面,因此無法設定。" name="okcancelignore" notext="取消" yestext="確定"/>
+ </notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted_MismatchOnVolume">
+ 所選的一些聯結集的幻影旗標將被切換。
+
+所選某些聯結集因權限問題,無法設定為 &apos;[REQUESTED_TYPE]&apos;。 這些聯結集將被設為 &apos;[RESTRICTED_TYPE]&apos;。
+
+所選某些聯結集無法設為 &apos;[REQUESTED_TYPE]&apos;,因為形狀屬於非凸面。 這些聯結集的使用類型將維持不變。
+
+你確定要繼續嗎?
+ <usetemplate ignoretext="所選的一些聯結集的幻影旗標將被切換,其他則因權限不足且形狀屬於非凸面,因此無法設定。" name="okcancelignore" notext="取消" yestext="確定"/>
+ </notification>
+ <notification name="PathfindingLinksets_ChangeToFlexiblePath">
+ 所選的物件會影響導航網面。 將它改為彈性路徑,將使它從導航網面中被移除。
+ <usetemplate ignoretext="所選的物件會影響導航網面。 將它改為彈性路徑,將使它從導航網面中被移除。" name="okcancelignore" notext="取消" yestext="確定"/>
+ </notification>
<global name="UnsupportedGLRequirements">
你的硬體設備似乎不符 [APP_NAME] 的要求。 [APP_NAME] 需要可以支援多材質的 OpenGL 顯像卡。 在這狀況下,請確定你的顯像卡安裝了最新的驅動程式,作業系統也安裝了最新的服務包和嵌補程式。
@@ -2979,4 +3303,24 @@ SHA1 指紋:[MD5_DIGEST]
<global name="You died and have been teleported to your home location">
你已經死亡並且被瞬間傳送回你的家的位置。
</global>
+ <notification name="LocalBitmapsUpdateFileNotFound">
+ [FNAME] 無法更新,找不到該檔案。
+未來將不再更新該檔案。
+ </notification>
+ <notification name="LocalBitmapsUpdateFailedFinal">
+ [FNAME] 無法開啟或解碼,已嘗試 [NRETRIES] 次,該檔案已被認定為毀壞。
+未來將不再更新該檔案。
+ </notification>
+ <notification name="LocalBitmapsVerifyFail">
+ 試圖新增一個無效或無法讀取的圖像檔 [FNAME],該檔無法開啟或解碼。
+已取消這一嘗試。
+ </notification>
+ <notification name="PathfindingReturnMultipleItems">
+ 你正退回 [NUM_ITEMS] 個物項。 你確定你要繼續?
+ <usetemplate ignoretext="確定退回多個物項?" name="okcancelignore" notext="否" yestext="是"/>
+ </notification>
+ <notification name="PathfindingDeleteMultipleItems">
+ 你正在刪除 [NUM_ITEMS] 個物項。 你確定你要繼續?
+ <usetemplate ignoretext="確定要刪除多個物項?" name="okcancelignore" notext="否" yestext="是"/>
+ </notification>
</notifications>
diff --git a/indra/newview/skins/default/xui/zh/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/zh/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..69340349bc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_chiclet_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chiclet_bar">
+ <layout_stack name="toolbar_stack">
+ <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/zh/panel_edit_pick.xml b/indra/newview/skins/default/xui/zh/panel_edit_pick.xml
index 006c050dc1..faee42fd0e 100644
--- a/indra/newview/skins/default/xui/zh/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/zh/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="儲存精選地點" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="取消" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_skin.xml b/indra/newview/skins/default/xui/zh/panel_edit_skin.xml
index 9f4c02427d..d8552f52f0 100644
--- a/indra/newview/skins/default/xui/zh/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/zh/panel_edit_skin.xml
@@ -1,9 +1,9 @@
<?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="點按以挑選圖片"/>
+ <texture_picker label="頭部" name="Head" tool_tip="點按以挑選圖片"/>
+ <texture_picker label="上半身" name="Upper Body" tool_tip="點按以挑選圖片"/>
+ <texture_picker label="下半身" name="Lower Body" tool_tip="點按以挑選圖片"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/zh/panel_group_invite.xml b/indra/newview/skins/default/xui/zh/panel_group_invite.xml
index 728311cf51..8921978b20 100644
--- a/indra/newview/skins/default/xui/zh/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/zh/panel_group_invite.xml
@@ -9,6 +9,9 @@
<panel.string name="already_in_group">
你所選的居民有些已經在群組裡,所以不會再對他們發送邀請。
</panel.string>
+ <panel.string name="invite_selection_too_large">
+ 未送出群組邀請:所選的居民人數太多。 群組邀請每次以 100 人為上限。
+ </panel.string>
<text name="help_text">
你可以選擇邀請多位居民到你的群組來。 點按「開啟居民選擇工具」開始選擇。
</text>
diff --git a/indra/newview/skins/default/xui/zh/panel_login.xml b/indra/newview/skins/default/xui/zh/panel_login.xml
index 49c57a4315..672d9bb1a2 100644
--- a/indra/newview/skins/default/xui/zh/panel_login.xml
+++ b/indra/newview/skins/default/xui/zh/panel_login.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
- <panel.string name="create_account_url">
- http://join.secondlife.com/
- </panel.string>
<panel.string name="forgot_password_url">
http://secondlife.com/account/request.php
</panel.string>
<layout_stack name="login_widgets">
<layout_panel name="login">
+ <text name="log_in_text">
+ 登入
+ </text>
<text name="username_text">
使用者名稱:
</text>
@@ -15,15 +15,8 @@
<text name="password_text">
密碼:
</text>
- <check_box label="記住密碼:" name="remember_check"/>
- <button label="登入" name="connect_btn"/>
- <text name="mode_selection_text">
- 模式:
- </text>
- <combo_box name="mode_combo" tool_tip="請選擇你的模式。 選用基本模式可以快速、簡單地探索與聊天; 選用進階模式則可以使用更多功能。">
- <combo_box.item label="基本" name="Basic"/>
- <combo_box.item label="進階" name="Advanced"/>
- </combo_box>
+ </layout_panel>
+ <layout_panel name="start_location_panel">
<text name="start_location_text">
開始地點:
</text>
@@ -33,16 +26,21 @@
<combo_box.item label="&lt;請輸入地區名稱&gt;" name="Typeregionname"/>
</combo_box>
</layout_panel>
- <layout_panel name="links">
- <text name="create_new_account_text">
- 註冊
+ <layout_panel name="links_login_panel">
+ <text name="login_help">
+ 登入時需要幫助?
</text>
<text name="forgot_password_text">
忘記你的使用者名稱或密碼?
</text>
- <text name="login_help">
- 登入時需要幫助?
+ <button label="登入" name="connect_btn"/>
+ <check_box label="記住密碼:" name="remember_check"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_account_text">
+ 建立你的帳號
</text>
+ <button label="現在就開始" name="create_new_account_btn"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_me.xml b/indra/newview/skins/default/xui/zh/panel_me.xml
index 3c452b8fa8..aad1348e46 100644
--- a/indra/newview/skins/default/xui/zh/panel_me.xml
+++ b/indra/newview/skins/default/xui/zh/panel_me.xml
@@ -1,7 +1,4 @@
<?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 label="我的精選地點" name="panel_picks"/>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_navigation_bar.xml b/indra/newview/skins/default/xui/zh/panel_navigation_bar.xml
index 2f98dd718e..7a11aa961b 100644
--- a/indra/newview/skins/default/xui/zh/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/zh/panel_navigation_bar.xml
@@ -1,18 +1,23 @@
<?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="拖曳傳送地標到此以便讓你在第二人生中能快速傳送到你最愛的地點!!">
- <label name="favorites_bar_label" tool_tip="拖曳傳送地標到此以便讓你在第二人生中能快速傳送到你最愛的地點!!">
- 最愛列
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="顯示更多我的最愛"/>
- </favorites_bar>
+ <layout_stack name="nvp_stack">
+ <layout_panel name="navigation_layout_panel">
+ <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"/>
+ </panel>
+ </layout_panel>
+ <layout_panel name="favorites_layout_panel">
+ <favorites_bar name="favorite" tool_tip="拖曳傳送地標到此以便讓你在第二人生中能快速傳送到你最愛的地點!!">
+ <label name="favorites_bar_label" tool_tip="拖曳傳送地標到此以便讓你在第二人生中能快速傳送到你最愛的地點!!">
+ 最愛列
+ </label>
+ <more_button name="&gt;&gt;" tool_tip="顯示更多我的最愛">
+ 詳情 ▼
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/zh/panel_navmesh_rebake.xml
new file mode 100644
index 0000000000..bb52c13a11
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_navmesh_rebake.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_navmesh_rebake">
+ <button label="重新產出地區" name="navmesh_btn" tool_tip="點按即可重新產出該地區的導航網面。"/>
+ <button label="正在請求重新產出" name="navmesh_btn_sending" tool_tip="正向伺服器發送重新產出請求。"/>
+ <button label="地區正在重新產出" name="navmesh_btn_baking" tool_tip="地區正在重新產出。 完成後,這個按鈕將會消失。"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_nearby_chat.xml b/indra/newview/skins/default/xui/zh/panel_nearby_chat.xml
new file mode 100644
index 0000000000..fc52168bb7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_nearby_chat.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_chat">
+ <layout_stack name="stack">
+ <layout_panel name="translate_chat_checkbox_lp">
+ <check_box label="翻譯聊天內容" name="translate_chat_checkbox"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml
index 4361b588d8..9489113d09 100644
--- a/indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="chat_bar">
+<panel name="nearby_chat">
<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/zh/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/zh/panel_outbox_inventory.xml
new file mode 100644
index 0000000000..8de0bb0e4d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_outbox_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<outbox_inventory_panel name="inventory_outbox" tool_tip="將物項拖曳並置放到這裡,準備在你的商店出售"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_outfits_list.xml b/indra/newview/skins/default/xui/zh/panel_outfits_list.xml
index a4b041469b..cfb0180f9c 100644
--- a/indra/newview/skins/default/xui/zh/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/zh/panel_outfits_list.xml
@@ -1,5 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <no_matched_tabs_text name="no_matched_outfits_msg" value="找不到你要找的嗎? 請試試 [secondlife:///app/search/places/ 搜尋]。"/>
+ <no_visible_tabs_text name="no_outfits_msg" value="你還沒有任何裝扮。 請試試[secondlife:///app/search/all/ 搜尋]"/>
+ </accordion>
<panel name="bottom_panel">
<menu_button name="options_gear_btn" tool_tip="顯示額外選項"/>
<button name="trash_btn" tool_tip="刪除所選擇的裝扮"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_people.xml b/indra/newview/skins/default/xui/zh/panel_people.xml
index dbb439afec..59ea7b70e2 100644
--- a/indra/newview/skins/default/xui/zh/panel_people.xml
+++ b/indra/newview/skins/default/xui/zh/panel_people.xml
@@ -66,16 +66,16 @@
<layout_panel name="view_profile_btn_lp">
<button label="檔案" name="view_profile_btn" tool_tip="顯示圖片、群組與其他居民資訊"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="im_btn_lp">
<button label="IM" name="im_btn" tool_tip="開啟即時訊息會話"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="call_btn_lp">
<button label="通話" name="call_btn" tool_tip="和這位居民通話"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="share_btn_lp">
<button label="分享" name="share_btn" tool_tip="分享一個收納區物品"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="teleport_btn_lp">
<button label="瞬間傳送" name="teleport_btn" tool_tip="發出瞬間傳送邀請"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/zh/panel_place_profile.xml b/indra/newview/skins/default/xui/zh/panel_place_profile.xml
index a32c1c17d3..a364f732d8 100644
--- a/indra/newview/skins/default/xui/zh/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/zh/panel_place_profile.xml
@@ -68,6 +68,8 @@
<text name="scripts_value" value="啟動"/>
<text name="damage_label" value="傷害:"/>
<text name="damage_value" value="關閉"/>
+ <text name="see_avatars_label" value="察看化身:"/>
+ <text name="see_avatars_value" value="關閉"/>
<button label="土地資料" name="about_land_btn"/>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/zh/panel_places.xml b/indra/newview/skins/default/xui/zh/panel_places.xml
index ac69b48a81..08cae610f6 100644
--- a/indra/newview/skins/default/xui/zh/panel_places.xml
+++ b/indra/newview/skins/default/xui/zh/panel_places.xml
@@ -24,7 +24,7 @@
<menu_button name="overflow_btn" tool_tip="顯示額外選項"/>
</layout_panel>
</layout_stack>
- <layout_stack name="bottom_bar_ls3">
+ <layout_stack name="bottom_bar_profile_ls">
<layout_panel name="profile_btn_lp">
<button label="檔案" name="profile_btn" tool_tip="顯示地點檔案"/>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_postcard_message.xml b/indra/newview/skins/default/xui/zh/panel_postcard_message.xml
new file mode 100644
index 0000000000..563c4fca3c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_postcard_message.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_message">
+ <text name="to_label">
+ 收件人:
+ </text>
+ <text name="name_label">
+ 發件人:
+ </text>
+ <text name="subject_label">
+ 主旨:
+ </text>
+ <line_editor label="在此輸入你的主旨。" name="subject_form"/>
+ <text name="msg_label">
+ 訊息:
+ </text>
+ <text_editor name="msg_form">
+ 在此輸入你的訊息。
+ </text_editor>
+ <button label="取消" name="cancel_btn"/>
+ <button label="送出" name="send_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_postcard_settings.xml b/indra/newview/skins/default/xui/zh/panel_postcard_settings.xml
new file mode 100644
index 0000000000..900ab3a54e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_postcard_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_settings">
+ <combo_box label="解析度" name="postcard_size_combo">
+ <combo_box.item label="目前視窗" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="自訂" name="Custom"/>
+ </combo_box>
+ <layout_stack name="postcard_image_params_ls">
+ <layout_panel name="postcard_image_size_lp">
+ <spinner label="寬" name="postcard_snapshot_width"/>
+ <spinner label="高度" name="postcard_snapshot_height"/>
+ <check_box label="鎖住比例" name="postcard_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="postcard_image_format_quality_lp">
+ <slider label="圖像品質" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml
index c5dce10d63..3a7d79e04b 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml
@@ -3,6 +3,19 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
+ <text name="Cache:">
+ 快取:
+ </text>
+ <spinner label="快取大小 (64 - 9984MB)" name="cachesizespinner"/>
+ <text name="text_box5">
+ MB
+ </text>
+ <button label="清除快取" label_selected="清除快取" name="clear_cache"/>
+ <text name="Cache location">
+ 快取位置:
+ </text>
+ <button label="瀏覽" label_selected="瀏覽" name="set_cache"/>
+ <button label="預設位置" label_selected="預設位置" name="default_cache_location"/>
<text name="UI Size:">
使用者界面尺寸:
</text>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml
index 82d2c64aaa..cf2f81d313 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml
@@ -29,29 +29,7 @@
<check_box label="IM 聊天" name="EnableIMChatPopups" tool_tip="當即時訊息抵達時查看突顯式視窗"/>
<spinner label="附近聊天內容提示框停駐時間:" name="nearby_toasts_lifetime"/>
<spinner label="附近聊天內容提示框消退時間:" name="nearby_toasts_fadingtime"/>
- <text name="translate_chb_label">
- 聊天時使用機器自動進行翻譯(由 Google 所提供)
- </text>
- <text name="translate_language_text">
- 將聊天內容翻譯成:
- </text>
- <combo_box name="translate_language_combobox">
- <combo_box.item label="系統預設" name="System Default Language"/>
- <combo_box.item label="英語" name="English"/>
- <combo_box.item label="Dansk(丹麥語)" name="Danish"/>
- <combo_box.item label="Deutsch(德語)" name="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="Magyar(匈牙利語)" name="Hungarian"/>
- <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="Russian"/>
- <combo_box.item label="Türkçe(土耳其語)" name="Turkish"/>
- <combo_box.item label="Українська(烏克蘭語)" name="Ukrainian"/>
- <combo_box.item label="中文(简体)(簡體中文)" name="Chinese"/>
- <combo_box.item label="日本語(日語)" name="Japanese"/>
- <combo_box.item label="한국어(漢語)" name="Korean"/>
- </combo_box>
+ <button label="翻譯…" name="ok_btn"/>
+ <button label="自動取代…" name="autoreplace_showgui"/>
+ <button label="拼字檢查…" name="spellcheck_showgui"/>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml
index 854b1cf828..7e67a0d02d 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml
@@ -11,10 +11,12 @@
<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="Russian"/>
+ <combo_box.item label="Türkçe(土耳其語)- 試用版" name="Turkish"/>
<combo_box.item label="日本語(日語)- 試用版" name="(Japanese)"/>
+ <combo_box.item label="正體中文 - 測試版" name="Traditional Chinese"/>
</combo_box>
<text name="language_textbox2">
(須重新啟動)
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_move.xml b/indra/newview/skins/default/xui/zh/panel_preferences_move.xml
index ce176b1e3c..3a27477885 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_move.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_move.xml
@@ -7,18 +7,33 @@
</text>
<check_box label="建造 / 編輯" name="edit_camera_movement" tool_tip="使用進入或離開編輯模式時自動調整攝影機位置功能"/>
<check_box label="編輯外觀" name="appearance_camera_movement" tool_tip="使用編輯模式時自動調整攝影機位置功能"/>
- <check_box initial_value="true" label="側邊欄" name="appearance_sidebar_positioning" tool_tip="使用開啟側邊欄時自動調整攝影機位置功能"/>
+ <text name="keyboard_lbl">
+ 鍵盤:
+ </text>
+ <check_box label="總是使用方向鍵移動" name="arrow_keys_move_avatar_check"/>
+ <check_box label="連點按住後跑步" name="tap_tap_hold_to_run"/>
+ <text name="mouse_lbl">
+ 滑鼠:
+ </text>
<check_box label="將我顯示於第一人稱視角中" name="first_person_avatar_visible"/>
<text name=" Mouse Sensitivity">
第一人稱視角滑鼠敏感度:
</text>
<check_box label="反轉" name="invert_mouse"/>
- <check_box label="總是使用方向鍵移動" name="arrow_keys_move_avatar_check"/>
- <check_box label="連點按住後跑步" name="tap_tap_hold_to_run"/>
- <check_box label="雙擊以:" name="double_click_chkbox"/>
- <radio_group name="double_click_action">
- <radio_item label="瞬間傳送" name="radio_teleport"/>
- <radio_item label="自動導航駕駛" name="radio_autopilot"/>
- </radio_group>
+ <text name="single_click_action_lbl">
+ 在土地上點按一下:
+ </text>
+ <combo_box name="single_click_action_combo">
+ <combo_box.item label="無動作" name="0"/>
+ <combo_box.item label="移動至點按的地點" name="1"/>
+ </combo_box>
+ <text name="double_click_action_lbl">
+ 在土地上點按兩下:
+ </text>
+ <combo_box name="double_click_action_combo">
+ <combo_box.item label="無動作" name="0"/>
+ <combo_box.item label="移動至點按的地點" name="1"/>
+ <combo_box.item label="瞬間傳送至點按的地點" name="2"/>
+ </combo_box>
<button label="其他設備" name="joystick_setup_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml b/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml
index 85f8154b99..a607a7c33b 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml
@@ -11,17 +11,6 @@
</text>
<check_box label="自訂埠" name="connection_port_enabled"/>
<spinner label="埠號:" name="connection_port"/>
- <text name="cache_size_label_l">
- 快取尺寸
- </text>
- <text name="text_box5">
- MB
- </text>
- <text name="Cache location">
- 快取位置:
- </text>
- <button label="瀏覽" label_selected="瀏覽" name="set_cache"/>
- <button label="重設" label_selected="重設" name="reset_cache"/>
<text name="Web:">
網頁:
</text>
@@ -33,12 +22,6 @@
<check_box initial_value="true" label="接受 cookies" name="cookies_enabled"/>
<check_box initial_value="true" label="啟用 Javascript" name="browser_javascript_enabled"/>
<check_box initial_value="false" label="啟用媒體瀏覽的突顯式視窗" name="media_popup_enabled"/>
- <check_box initial_value="false" label="啟用網頁代理伺服器" name="web_proxy_enabled"/>
- <text name="Proxy location">
- 代理伺服器位置:
- </text>
- <line_editor name="web_proxy_editor" tool_tip="你希望使用的代理伺服器的名稱或 IP 位址"/>
- <spinner label="埠號:" name="web_proxy_port"/>
<text name="Software updates:">
軟體更新:
</text>
@@ -46,4 +29,8 @@
<combo_box.item label="自動安裝" name="Install_automatically"/>
<combo_box.item label="手動下載及安裝" name="Install_manual"/>
</combo_box>
+ <text name="Proxy Settings:">
+ 代理伺服器設定:
+ </text>
+ <button label="調整代理伺服器設定" label_selected="瀏覽" name="set_proxy"/>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_sound.xml b/indra/newview/skins/default/xui/zh/panel_preferences_sound.xml
index 09dd4f6b0b..e57f08fd74 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_sound.xml
@@ -19,6 +19,7 @@
<check_box label="已啟用" name="enable_voice_check"/>
<check_box label="允許媒體自動播放" name="media_auto_play_btn" tool_tip="若你想要,可以勾選這個允許媒體自動播放" value="true"/>
<check_box label="播放附加到其他化身身上的媒體" name="media_show_on_others_btn" tool_tip="若未勾選,將隱藏附著於附近其他化身身上的媒體" value="true"/>
+ <check_box label="播放來自姿勢的聲音" name="gesture_audio_play_btn" tool_tip="勾選即可聽到來自姿勢的聲音" value="true"/>
<text name="voice_chat_settings">
語音聊天設定
</text>
@@ -35,28 +36,5 @@
<button label="設定按鍵" name="set_voice_hotkey_button"/>
<button name="set_voice_middlemouse_button" tool_tip="重設滑鼠中鍵按鈕"/>
<button label="輸入 / 輸出設備" name="device_settings_btn"/>
- <panel label="設備設定" name="device_settings_panel">
- <panel.string name="default_text">
- 預設
- </panel.string>
- <panel.string name="default system device">
- 預設系統設備
- </panel.string>
- <panel.string name="no device">
- 無設備
- </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 label="設備設定" name="device_settings_panel"/>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_debug.xml b/indra/newview/skins/default/xui/zh/panel_region_debug.xml
index 8639f36410..e5d5e6eaf7 100644
--- a/indra/newview/skins/default/xui/zh/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/zh/panel_region_debug.xml
@@ -30,5 +30,5 @@
<button label="取得最常碰撞的物件..." name="top_colliders_btn" tool_tip="條列出目前運作中最常碰撞的物件清單"/>
<button label="取得最耗能腳本..." name="top_scripts_btn" tool_tip="條列���目前運作中最耗能的腳本清單"/>
<button label="地區重新啟動" name="restart_btn" tool_tip="給予兩分鐘倒數計時並重新啟動"/>
- <button label="延遲重新啟動" name="cancel_restart_btn" tool_tip="延遲地區重新啟動一小時"/>
+ <button label="取消重新啟動" name="cancel_restart_btn" tool_tip="取消地區重新啟動"/>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_environment.xml b/indra/newview/skins/default/xui/zh/panel_region_environment.xml
new file mode 100644
index 0000000000..8f466af39e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_region_environment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="環境" name="panel_env_info">
+ <text name="water_settings_title">
+ 選擇你希望到你地區的訪客所能看到的水和天空 / 日循環設定。 詳情
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="使用第二人生預設值" name="use_sl_default_settings"/>
+ <radio_item label="使用以下設定" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="water_settings_title">
+ 水的設定
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-選擇一個自訂配置-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ 天空 / 日循環
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="固定天空" name="my_sky_settings"/>
+ <radio_item label="日循環" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-選擇一個自訂配置-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-選擇一個自訂配置-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="套用" name="apply_btn"/>
+ <button label="取消" name="cancel_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_estate.xml b/indra/newview/skins/default/xui/zh/panel_region_estate.xml
index 2d5dcfa9bb..f3c1c85379 100644
--- a/indra/newview/skins/default/xui/zh/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/zh/panel_region_estate.xml
@@ -20,10 +20,10 @@
<slider label="相位" name="sun_hour_slider"/>
<check_box label="允許公開出入" name="externally_visible_check"/>
<text name="Only Allow">
- 僅允許帳號通過如下驗證的人進出:
+ 僅允許符合以下條件的居民進入:
</text>
- <check_box label="預留付款資料" name="limit_payment" tool_tip="禁止身份不明居民"/>
- <check_box label="年齡驗證" name="limit_age_verified" tool_tip="禁止尚未驗證年齡的居民。 參閱 [SUPPORT_SITE] 獲取進一步資訊。"/>
+ <check_box label="已經預留付款資料" name="limit_payment" tool_tip="居民必須提供付款資料才能進入這領地。 參閱 [SUPPORT_SITE] 獲取進一步資訊。"/>
+ <check_box label="已年滿 18 歲" name="limit_age_verified" tool_tip="居民必須年滿 18 歲才能進入這領地。 參閱 [SUPPORT_SITE] 獲取進一步資訊。"/>
<check_box label="允許語音聊天" name="voice_chat_check"/>
<check_box label="允許直接瞬間傳送" name="allow_direct_teleport"/>
<button label="套用" name="apply_btn"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_terrain.xml b/indra/newview/skins/default/xui/zh/panel_region_terrain.xml
index 30d12dfeb5..85e759e445 100644
--- a/indra/newview/skins/default/xui/zh/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/zh/panel_region_terrain.xml
@@ -9,11 +9,52 @@
<spinner label="水文高度" name="water_height_spin"/>
<spinner label="地形提升限制" name="terrain_raise_spin"/>
<spinner label="地形降低限制" name="terrain_lower_spin"/>
- <check_box label="使用領地的太陽設定" name="use_estate_sun_check"/>
- <check_box label="固定太陽" name="fixed_sun_check"/>
- <slider label="相位" name="sun_hour_slider"/>
- <button label="套用" name="apply_btn"/>
+ <text name="detail_texture_text">
+ 地形材質(須 512x512,24 位元 .tga 檔格式)
+ </text>
+ <text name="height_text_lbl">
+ 1(低)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4(高)
+ </text>
+ <text name="height_text_lbl5">
+ 材質海拔範圍
+ </text>
+ <text name="height_text_lbl10">
+ 這些值代表以上材質的混合範圍。
+ </text>
+ <text name="height_text_lbl11">
+ 以公尺為單位,低值是材質 #1 的最大高度,高值是材質 #4 的最小高度。
+ </text>
+ <text name="height_text_lbl6">
+ 西北
+ </text>
+ <text name="height_text_lbl7">
+ 東北
+ </text>
+ <spinner label="低" name="height_start_spin_1"/>
+ <spinner label="低" name="height_start_spin_3"/>
+ <spinner label="高" name="height_range_spin_1"/>
+ <spinner label="高" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ 西南
+ </text>
+ <text name="height_text_lbl9">
+ 東南
+ </text>
+ <spinner label="低" name="height_start_spin_0"/>
+ <spinner label="低" name="height_start_spin_2"/>
+ <spinner label="高" name="height_range_spin_0"/>
+ <spinner label="高" name="height_range_spin_2"/>
<button label="下載 RAW 地形..." name="download_raw_btn" tool_tip="只允許領地所有人而非管理者進行操作"/>
<button label="上傳 RAW 地形檔..." name="upload_raw_btn" tool_tip="只允許領地所有人而非管理者進行操作"/>
<button label="確定地形" name="bake_terrain_btn" tool_tip="將目前地形設為「升高 / 降低」極限的中心值"/>
+ <button label="套用" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_script_ed.xml b/indra/newview/skins/default/xui/zh/panel_script_ed.xml
index e59307fcfc..29e9a35869 100644
--- a/indra/newview/skins/default/xui/zh/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/zh/panel_script_ed.xml
@@ -22,6 +22,8 @@
<menu label="檔案" name="File">
<menu_item_call label="儲存" name="Save"/>
<menu_item_call label="還原全部變更" name="Revert All Changes"/>
+ <menu_item_call label="從檔案載入…" name="LoadFromFile"/>
+ <menu_item_call label="存入檔案…" name="SaveToFile"/>
</menu>
<menu label="編輯" name="Edit">
<menu_item_call label="復原" name="Undo"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_script_question_toast.xml b/indra/newview/skins/default/xui/zh/panel_script_question_toast.xml
new file mode 100644
index 0000000000..a2d0237da0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_script_question_toast.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="script_question_panel" name="panel_script_question_toast">
+ <panel label="buttons_panel" name="buttons_panel"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..20fb9b494a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_inventory">
+ <text name="title">
+ 儲存到我的收納區
+ </text>
+ <text name="hint_lbl">
+ 將圖像儲存到收納區的費用為 L$[UPLOAD_COST]。 若要將圖像存為材質,請選擇一個正方格式。
+ </text>
+ <combo_box label="解析度" name="texture_size_combo">
+ <combo_box.item label="目前視窗" name="CurrentWindow"/>
+ <combo_box.item label="小(128x128)" name="Small(128x128)"/>
+ <combo_box.item label="中(256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="大(512x512)" name="Large(512x512)"/>
+ <combo_box.item label="自訂" name="Custom"/>
+ </combo_box>
+ <spinner label="寬" name="inventory_snapshot_width"/>
+ <spinner label="高度" name="inventory_snapshot_height"/>
+ <check_box label="鎖住比例" name="inventory_keep_aspect_check"/>
+ <button label="取消" name="cancel_btn"/>
+ <button label="儲存" name="save_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_snapshot_local.xml b/indra/newview/skins/default/xui/zh/panel_snapshot_local.xml
new file mode 100644
index 0000000000..a929c9a3fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_snapshot_local.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_local">
+ <text name="title">
+ 儲存到電腦上
+ </text>
+ <combo_box label="解析度" name="local_size_combo">
+ <combo_box.item label="目前視窗" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="自訂" name="Custom"/>
+ </combo_box>
+ <layout_stack name="local_image_params_ls">
+ <layout_panel name="local_image_size_lp">
+ <spinner label="寬" name="local_snapshot_width"/>
+ <spinner label="高度" name="local_snapshot_height"/>
+ <check_box label="鎖住比例" name="local_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="local_image_format_quality_lp">
+ <combo_box label="格式" name="local_format_combo">
+ <combo_box.item label="PNG(零失真)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP(零失真)" name="BMP"/>
+ </combo_box>
+ <slider label="圖像品質" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button label="取消" name="cancel_btn"/>
+ <flyout_button label="儲存" name="save_btn" tool_tip="儲存圖像到檔案">
+ <flyout_button.item label="儲存" name="save_item"/>
+ <flyout_button.item label="另存..." name="saveas_item"/>
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml b/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml
new file mode 100644
index 0000000000..82c2b10d8d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_options">
+ <button label="送至我的檔案訊息發佈" name="save_to_profile_btn"/>
+ <button label="電郵" name="save_to_email_btn"/>
+ <button label="儲存到我的收納區(L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="儲存到電腦上" name="save_to_computer_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/zh/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..853a856104
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_snapshot_postcard.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_postcard">
+ <string name="default_subject">
+ 來自 [SECOND_LIFE] 的明信片。
+ </string>
+ <string name="default_message">
+ 快來看看這個!
+ </string>
+ <string name="upload_message">
+ 傳送中...
+ </string>
+ <text name="title">
+ 電郵
+ </text>
+ <button label="訊息" name="message_btn"/>
+ <button label="設定" name="settings_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/zh/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..6f64a4e83c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_snapshot_profile.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_profile">
+ <text name="title">
+ 送至我的檔案訊息發佈
+ </text>
+ <combo_box label="解析度" name="profile_size_combo">
+ <combo_box.item label="目前視窗" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="自訂" name="Custom"/>
+ </combo_box>
+ <layout_stack name="profile_image_params_ls">
+ <layout_panel name="profile_image_size_lp">
+ <spinner label="寬" name="profile_snapshot_width"/>
+ <spinner label="高度" name="profile_snapshot_height"/>
+ <check_box label="鎖住比例" name="profile_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="profile_image_metadata_lp">
+ <text name="caption_label">
+ 內容敘述:
+ </text>
+ <check_box initial_value="true" label="加入所在位置" name="add_location_cb"/>
+ </layout_panel>
+ </layout_stack>
+ <button label="取消" name="cancel_btn"/>
+ <button label="發佈" name="post_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_sound_devices.xml b/indra/newview/skins/default/xui/zh/panel_sound_devices.xml
index 96b00c3235..fa4e24a605 100644
--- a/indra/newview/skins/default/xui/zh/panel_sound_devices.xml
+++ b/indra/newview/skins/default/xui/zh/panel_sound_devices.xml
@@ -3,9 +3,18 @@
<panel.string name="default_text">
預設
</panel.string>
+ <string name="name_no_device">
+ 無設備
+ </string>
+ <string name="name_default_system_device">
+ 預設系統設備
+ </string>
<text name="Input">
輸入
</text>
+ <text name="Output">
+ 輸出
+ </text>
<text name="My volume label">
我的音量:
</text>
@@ -13,7 +22,4 @@
<text name="wait_text">
請稍候
</text>
- <text name="Output">
- 輸出
- </text>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_status_bar.xml b/indra/newview/skins/default/xui/zh/panel_status_bar.xml
index ceebe943de..b4cdff9d6b 100644
--- a/indra/newview/skins/default/xui/zh/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/zh/panel_status_bar.xml
@@ -18,6 +18,7 @@
<panel name="balance_bg">
<text name="balance" tool_tip="點按以重新更新你的 L$ 帳戶餘額" value="L$20"/>
<button label="購買 L$" name="buyL" tool_tip="點按以購買更多 L$"/>
+ <button label="購物" name="goShop" tool_tip="打開第二人生購物市集"/>
</panel>
<text name="TimeText" tool_tip="目前時區(太平洋)">
24:00 AM PST
diff --git a/indra/newview/skins/default/xui/zh/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/zh/panel_volume_pulldown.xml
new file mode 100644
index 0000000000..70ec028176
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_volume_pulldown.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="volumepulldown_floater">
+ <slider label="主控音量" name="System Volume"/>
+ <slider label="按鍵音" name="UI Volume"/>
+ <slider label="環境" name="Wind Volume"/>
+ <slider label="聲音" name="SFX Volume"/>
+ <check_box name="gesture_audio_play_btn" tool_tip="啟用姿勢聲音"/>
+ <slider label="音樂" name="Music Volume"/>
+ <check_box name="enable_music" tool_tip="啟用串流音樂"/>
+ <slider label="媒體" name="Media Volume"/>
+ <check_box name="enable_media" tool_tip="啟用串流媒體"/>
+ <slider label="語音" name="Voice Volume"/>
+ <check_box name="enable_voice_check" tool_tip="啟用語音聊天"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/sidepanel_inventory.xml b/indra/newview/skins/default/xui/zh/sidepanel_inventory.xml
index 08d441a2f2..c8aae15011 100644
--- a/indra/newview/skins/default/xui/zh/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/zh/sidepanel_inventory.xml
@@ -1,6 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="事物" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
+ <layout_stack name="inventory_layout_stack">
+ <layout_panel name="inbox_layout_panel">
+ <panel label="" name="marketplace_inbox">
+ <string name="InboxLabelWithArg">
+ 收到的物項 ([NUM])
+ </string>
+ <string name="InboxLabelNoArg">
+ 收到的物項
+ </string>
+ <button label="收到的物項" name="inbox_btn"/>
+ <text name="inbox_fresh_new_count">
+ [NUM] 項新的
+ </text>
+ <panel name="inbox_inventory_placeholder_panel" tool_tip="將物項拖曳置放到收納區,即可開始使用">
+ <text name="inbox_inventory_placeholder">
+ 從第二人生購物市集購得物項將送到這裡。
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
<panel name="button_panel">
<layout_stack name="button_panel_ls">
<layout_panel name="info_btn_lp">
diff --git a/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml
index 949288a015..1b093e0ecd 100644
--- a/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml
@@ -3,6 +3,9 @@
<panel.string name="unknown">
(未知)
</panel.string>
+ <panel.string name="unknown_multiple">
+ (未知 / 多項)
+ </panel.string>
<panel.string name="public">
(公開)
</panel.string>
diff --git a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml
index 692dd81890..982dde4010 100644
--- a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml
@@ -18,6 +18,12 @@
<panel.string name="text modify info 4">
你不能修改這些物件
</panel.string>
+ <panel.string name="text modify info 5">
+ 無法跨地區修改這個物件
+ </panel.string>
+ <panel.string name="text modify info 6">
+ 無法跨地區修改這些物件
+ </panel.string>
<panel.string name="text modify warning">
這個物件含有聯結的部分
</panel.string>
@@ -95,6 +101,9 @@
</combo_box>
<spinner label="價格: L$" name="Edit Cost"/>
<check_box label="顯示在搜尋中" name="search_check" tool_tip="讓其他人可以在搜尋結果中察看到此物件"/>
+ <text name="pathfinding_attributes_label">
+ 尋徑屬性:
+ </text>
<text name="B:">
B:
</text>
diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml
index 9114cc079d..7e17ed6864 100644
--- a/indra/newview/skins/default/xui/zh/strings.xml
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -29,11 +29,14 @@
快取清除中...
</string>
<string name="StartupInitializingTextureCache">
- 材質快取初始化中...
+ 正在初始化材質快取...
</string>
<string name="StartupInitializingVFS">
VFS 初始化中...
</string>
+ <string name="StartupRequireDriverUpdate">
+ 顯像初始化失敗。 請更新你的顯像卡驅動程式!
+ </string>
<string name="ProgressRestoring">
回存中...
</string>
@@ -74,10 +77,10 @@
驗證快取檔案(約需 60-90 秒左右)...
</string>
<string name="LoginProcessingResponse">
- 回應處理中...
+ 正在處理回應...
</string>
<string name="LoginInitializingWorld">
- 世界初始化中...
+ 正在初始化虛擬世界…
</string>
<string name="LoginDecodingImages">
圖像解碼中...
@@ -91,6 +94,12 @@
<string name="LoginQuicktimeOK">
QuickTime 已成功初始化。
</string>
+ <string name="LoginRequestSeedCapGrant">
+ 詢問地區負荷力…
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ 詢問地區負荷力,第 [NUMBER] 次嘗試…
+ </string>
<string name="LoginWaitingForRegionHandshake">
地區交握等待中...
</string>
@@ -119,7 +128,7 @@
無法檢驗通過網格伺服器傳回的憑證簽名。 請聯絡網格管理員。
</string>
<string name="LoginFailedNoNetwork">
- 網路出錯:無法建立連線,請檢查網路連線是否正常。
+ 網路錯誤:無法建立連線,請檢查網路連線是否正常。
</string>
<string name="LoginFailed">
登入失敗。
@@ -128,7 +137,7 @@
結束退出
</string>
<string name="create_account_url">
- http://join.secondlife.com/
+ http://join.secondlife.com/?sourceid=[sourceid]
</string>
<string name="LoginFailedViewerNotPermitted">
你目前所用的 Viewer 已經無法再進入第二人生。 請到這個頁面下載最新 Viewer:
@@ -172,7 +181,7 @@ http://secondlife.com/viewer-access-faq
</string>
<string name="LoginFailedPremiumOnly">
第二人生此時暫時限制登入,以確保不影響效能,讓目前虛擬世界裡的用戶享受最佳的體驗。
-
+
免費帳戶的用戶此時暫時無法進入第二人生,因為我們必須優先容納付費用戶。
</string>
<string name="LoginFailedComputerProhibited">
@@ -325,6 +334,36 @@ http://secondlife.com/viewer-access-faq
只有一個物品可以被拖曳到此處
</string>
<string name="TooltipPrice" value="L$[AMOUNT]:"/>
+ <string name="TooltipOutboxDragToWorld">
+ 商家發件匣內的物項無法產生到虛擬世界
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ 至少一個物件無法出售或轉移。
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ 你的商家發件匣只能接受直接來自收納區的物項。
+ </string>
+ <string name="TooltipOutboxWorn">
+ 你穿著中的物項無法放入商家發件匣。
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ 名片不得放入商家發件匣
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ 巢狀資料夾深度超過 3
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ 頂層資料夾的子資料夾數目超過 20
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ 頂層資料夾物項數目超過 200
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ 資料夾不得移到其子資料夾底下
+ </string>
+ <string name="TooltipDragOntoSelf">
+ 資料夾移動的目標不得為它本身
+ </string>
<string name="TooltipHttpUrl">
點按以察看這個網頁
</string>
@@ -788,6 +827,9 @@ http://secondlife.com/viewer-access-faq
<string name="anim_yes_head">
</string>
+ <string name="multiple_textures">
+ 多個
+ </string>
<string name="texture_loading">
載入中...
</string>
@@ -836,6 +878,9 @@ http://secondlife.com/viewer-access-faq
<string name="ScriptQuestionCautionChatDenied">
物件「[OBJECTNAME]&apos;」(所有人「[OWNERNAME]」,位於「[REGIONNAME]」,方位「[REGIONPOS]」)已被撤除下列權限:[PERMISSIONS]。
</string>
+ <string name="AdditionalPermissionsRequestHeader">
+ 你如果打開帳戶權限,也將一併允許該物件:
+ </string>
<string name="ScriptTakeMoney">
由你身上拿走林登幣(L$)
</string>
@@ -869,6 +914,9 @@ http://secondlife.com/viewer-access-faq
<string name="ControlYourCamera">
控制你的攝影機
</string>
+ <string name="TeleportYourAgent">
+ 瞬間傳送你本人
+ </string>
<string name="NotConnected">
未聯接
</string>
@@ -947,6 +995,12 @@ http://secondlife.com/viewer-access-faq
<string name="choose_the_directory">
選擇目錄
</string>
+ <string name="script_files">
+ 腳本
+ </string>
+ <string name="dictionary_files">
+ 字典
+ </string>
<string name="AvatarSetNotAway">
非離開
</string>
@@ -1184,6 +1238,65 @@ http://secondlife.com/viewer-access-faq
<string name="InventoryNoTexture">
你的收納區裡沒有這個材質的副本
</string>
+ <string name="InventoryInboxNoItems">
+ 你從第二人生購物市集購買的物品將出現在這裡。 你可以把它們拖曳到你的收納區,開始使用。
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ 任何人都可在第二人生購物市集出售物品。
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip"/>
+ <string name="InventoryOutboxNotMerchant">
+ 如果你想成為商家,你需要在第二人生購物市集[[MARKETPLACE_CREATE_STORE_URL]開設一間商店]。
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ 你的發件匣目前是空的。
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip"/>
+ <string name="InventoryOutboxNoItems">
+ 將資料夾拖曳到這個區域,再點按「送往第二人生購物市集」,即可在[[MARKETPLACE_DASHBOARD_URL]第二人生購物市集]登列出售。
+ </string>
+ <string name="Marketplace Error None">
+ 零錯誤
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ 發生錯誤:將物項送往第二人生購物市集之前,你必須取得商家的身份(免費)。
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ 錯誤:此資料夾沒有內容。
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ 錯誤:此物項上傳失敗,因為你的商家帳戶有太多和產品無關聯的物項。 要解決這個問題,請登入第二人生購物市集網站,減低你的無關聯物項數目。
+ </string>
+ <string name="Marketplace Error Object Limit">
+ 錯誤:此物項包含太多物件。 要解決這錯誤,請將物件裝箱,使總物件數目不超過 200。
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ 錯誤:此物項含有太多層的巢狀資料夾。 請加以重新整理,至多允許 3 層的巢狀資料夾。
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ 錯誤:此物項無法在第二人生購物市集出售。
+ </string>
+ <string name="Marketplace Error Internal Import">
+ 錯誤:這個物項有問題。 請稍候再試一次。
+ </string>
+ <string name="Open landmarks">
+ 開啟地標
+ </string>
<string name="no_transfer" value="(禁止轉讓)"/>
<string name="no_modify" value="(禁止修改)"/>
<string name="no_copy" value="(禁止複製)"/>
@@ -1230,9 +1343,6 @@ http://secondlife.com/viewer-access-faq
<string name="InvFolder My Inventory">
我的收納區
</string>
- <string name="InvFolder My Favorites">
- 我的最愛
- </string>
<string name="InvFolder Library">
資源庫
</string>
@@ -1296,6 +1406,12 @@ http://secondlife.com/viewer-access-faq
<string name="InvFolder favorite">
我的最愛
</string>
+ <string name="InvFolder Favorites">
+ 我的最愛
+ </string>
+ <string name="InvFolder favorites">
+ 我的最愛
+ </string>
<string name="InvFolder Current Outfit">
目前裝扮
</string>
@@ -1311,12 +1427,24 @@ http://secondlife.com/viewer-access-faq
<string name="InvFolder Meshes">
網面
</string>
+ <string name="InvFolder Received Items">
+ 收到的物項
+ </string>
+ <string name="InvFolder Merchant Outbox">
+ 商家發件匣
+ </string>
<string name="InvFolder Friends">
朋友
</string>
<string name="InvFolder All">
全部
</string>
+ <string name="no_attachments">
+ 未穿著任何附件
+ </string>
+ <string name="Attachments remain">
+ 附件(尚可容納 [COUNT] 件)
+ </string>
<string name="Buy">
購買
</string>
@@ -1443,6 +1571,12 @@ http://secondlife.com/viewer-access-faq
<string name="Right Pec">
右胸肌
</string>
+ <string name="Neck">
+ 頸部
+ </string>
+ <string name="Avatar Center">
+ 化身中心
+ </string>
<string name="Invalid Attachment">
無效的附接點
</string>
@@ -1626,6 +1760,9 @@ http://secondlife.com/viewer-access-faq
</string>
<string name="SummaryForTheWeek" value="本週摘要,起始日:"/>
<string name="NextStipendDay" value="下一個發薪日為"/>
+ <string name="GroupPlanningDate">
+ [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
+ </string>
<string name="GroupIndividualShare" value="群組 個人份額"/>
<string name="GroupColumn" value="群組"/>
<string name="Balance">
@@ -1652,6 +1789,9 @@ http://secondlife.com/viewer-access-faq
<string name="IMTeen">
青少年
</string>
+ <string name="Anyone">
+ 任何人
+ </string>
<string name="RegionInfoError">
錯誤
</string>
@@ -1842,7 +1982,7 @@ http://secondlife.com/viewer-access-faq
新腳本
</string>
<string name="BusyModeResponseDefault">
- 你傳訊過去的居民目前處於忙碌狀態,這意味著他要求不被打擾。 你的訊息仍將留存並顯示於對���的 IM 面板上供稍後查閱。
+ 你傳訊過去的居民目前處於忙碌狀態,這意味著他要求不被打擾。 你的訊息仍將留存並顯示於對方的 IM 面板上供稍後查閱。
</string>
<string name="MuteByName">
(按名稱)
@@ -1874,6 +2014,12 @@ http://secondlife.com/viewer-access-faq
<string name="Public">
公開
</string>
+ <string name="LocalSettings">
+ 本地設定
+ </string>
+ <string name="RegionSettings">
+ 地區設定
+ </string>
<string name="ClassifiedClicksTxt">
點按:[TELEPORT] 瞬間傳送,[MAP] 地圖,[PROFILE] 檔案
</string>
@@ -1946,6 +2092,9 @@ http://secondlife.com/viewer-access-faq
<string name="GroupMoneyDebits">
借記
</string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
+ </string>
<string name="ViewerObjectContents">
內容
</string>
@@ -3719,6 +3868,15 @@ http://secondlife.com/viewer-access-faq
<string name="LocationCtrlGeneralIconTooltip">
一般普級地區
</string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ 可看到本地段外的化身,並與之交談
+ </string>
+ <string name="LocationCtrlPathfindingDirtyTooltip">
+ 地區重新產出之前,可移動物件可能無法正常運作。
+ </string>
+ <string name="LocationCtrlPathfindingDisabledTooltip">
+ 這地區並未啟用動態尋徑。
+ </string>
<string name="UpdaterWindowTitle">
[APP_NAME] 更新
</string>
@@ -3785,6 +3943,9 @@ http://secondlife.com/viewer-access-faq
<string name="Saved_message">
(於 [LONG_TIMESTAMP] 儲存)
</string>
+ <string name="IM_unblock_only_groups_friends">
+ 要察看這訊息,你必須到「偏好設定 / 隱私」,取消勾選「只有我的朋友和群組可以 IM 或與我通話」。
+ </string>
<string name="answered_call">
你的通話已經接通
</string>
@@ -3917,6 +4078,18 @@ http://secondlife.com/viewer-access-faq
<string name="you_paid_ldollars_no_name">
你支付了 L$[AMOUNT]([REASON])。
</string>
+ <string name="you_paid_failure_ldollars">
+ 你支付 L$[AMOUNT] 給 [NAME] 時出錯:[REASON]。
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ 你支付 L$[AMOUNT] 時出錯。
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ 你支付 L$[AMOUNT] 給 [NAME] 時出錯。
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ 你支付 L$[AMOUNT] 時出錯:[REASON]。
+ </string>
<string name="for item">
購買 [ITEM]
</string>
@@ -3970,7 +4143,7 @@ http://secondlife.com/viewer-access-faq
</string>
<string name="uploading_abuse_report">
上傳中...
-
+
違規舉報
</string>
<string name="New Shape">
@@ -4144,6 +4317,87 @@ http://secondlife.com/viewer-access-faq
<string name="Female - Wow">
女性 - 哇塞
</string>
+ <string name="/bow">
+ /彎腰點頭
+ </string>
+ <string name="/clap">
+ /拍手
+ </string>
+ <string name="/count">
+ /計數
+ </string>
+ <string name="/extinguish">
+ /熄菸
+ </string>
+ <string name="/kmb">
+ /給我一個吻
+ </string>
+ <string name="/muscle">
+ /肌肉
+ </string>
+ <string name="/no">
+ /不
+ </string>
+ <string name="/no!">
+ /不!
+ </string>
+ <string name="/paper">
+ /布
+ </string>
+ <string name="/pointme">
+ /指自己
+ </string>
+ <string name="/pointyou">
+ /指向你
+ </string>
+ <string name="/rock">
+ /石頭
+ </string>
+ <string name="/scissor">
+ /剪刀
+ </string>
+ <string name="/smoke">
+ /抽菸
+ </string>
+ <string name="/stretch">
+ /伸展
+ </string>
+ <string name="/whistle">
+ /吹口哨
+ </string>
+ <string name="/yes">
+ /是
+ </string>
+ <string name="/yes!">
+ /是!
+ </string>
+ <string name="afk">
+ 暫時離開
+ </string>
+ <string name="dance1">
+ 跳舞1
+ </string>
+ <string name="dance2">
+ 跳舞2
+ </string>
+ <string name="dance3">
+ 跳舞3
+ </string>
+ <string name="dance4">
+ 跳舞4
+ </string>
+ <string name="dance5">
+ 跳舞5
+ </string>
+ <string name="dance6">
+ 跳舞6
+ </string>
+ <string name="dance7">
+ 跳舞7
+ </string>
+ <string name="dance8">
+ 跳舞8
+ </string>
<string name="AvatarBirthDateFormat">
[mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
</string>
@@ -4157,7 +4411,7 @@ http://secondlife.com/viewer-access-faq
<string name="server_is_down">
儘管我們努力避免,還是發生意料外的錯誤。
- 請察訪 status.secondlifegrid.net 看是否發生了已知狀況。
+ 請察訪 status.secondlifegrid.net 看是否發生了已知狀況。
如果文體繼續發生,請檢查你的網路和防火牆設定。
</string>
<string name="dateTimeWeekdaysNames">
@@ -4246,6 +4500,12 @@ http://secondlife.com/viewer-access-faq
<string name="ExternalEditorFailedToRun">
執行外部編輯器失敗。
</string>
+ <string name="TranslationFailed">
+ 無法翻譯:[REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ 無法剖析平移回應。
+ </string>
<string name="Esc">
Esc 鍵
</string>
@@ -4588,4 +4848,223 @@ http://secondlife.com/viewer-access-faq
<string name="ParticleHiding">
隱藏粒子效果
</string>
+ <string name="Command_AboutLand_Label">
+ 土地資料
+ </string>
+ <string name="Command_Appearance_Label">
+ 編輯外觀
+ </string>
+ <string name="Command_Avatar_Label">
+ 化身
+ </string>
+ <string name="Command_Build_Label">
+ 建造
+ </string>
+ <string name="Command_Chat_Label">
+ 聊天
+ </string>
+ <string name="Command_Compass_Label">
+ 羅盤
+ </string>
+ <string name="Command_Destinations_Label">
+ 目的地
+ </string>
+ <string name="Command_Gestures_Label">
+ 姿勢
+ </string>
+ <string name="Command_HowTo_Label">
+ 簡易教學
+ </string>
+ <string name="Command_Inventory_Label">
+ 收納區
+ </string>
+ <string name="Command_Map_Label">
+ 地圖
+ </string>
+ <string name="Command_Marketplace_Label">
+ 第二人生購物市集
+ </string>
+ <string name="Command_MiniMap_Label">
+ 迷你地圖
+ </string>
+ <string name="Command_Move_Label">
+ 行走 / 跑步 / 飛行
+ </string>
+ <string name="Command_Outbox_Label">
+ 商家發件匣
+ </string>
+ <string name="Command_People_Label">
+ 人群
+ </string>
+ <string name="Command_Picks_Label">
+ 精選地點
+ </string>
+ <string name="Command_Places_Label">
+ 地點
+ </string>
+ <string name="Command_Preferences_Label">
+ 偏好設定
+ </string>
+ <string name="Command_Profile_Label">
+ 檔案
+ </string>
+ <string name="Command_Search_Label">
+ 搜尋
+ </string>
+ <string name="Command_Snapshot_Label">
+ 快照
+ </string>
+ <string name="Command_Speak_Label">
+ 說話
+ </string>
+ <string name="Command_View_Label">
+ 攝影機控制
+ </string>
+ <string name="Command_Voice_Label">
+ 語音設定
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ 有關你所處土地的資訊
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ 改變化身
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ 選擇一個完整的化身
+ </string>
+ <string name="Command_Build_Tooltip">
+ 建製物件和重塑地形
+ </string>
+ <string name="Command_Chat_Tooltip">
+ 透過文字和附近人們聊天
+ </string>
+ <string name="Command_Compass_Tooltip">
+ 指南針
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ 你可能感興趣的目的地
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ 你化身可用的姿勢
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ 如何完成常用的動作
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ 察看並使用你擁有的物件
+ </string>
+ <string name="Command_Map_Tooltip">
+ 世界地圖
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ 前往購物
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ 顯示附近的人
+ </string>
+ <string name="Command_Move_Tooltip">
+ 移動化身
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ 將物項轉移到第二人生購物市集待售
+ </string>
+ <string name="Command_People_Tooltip">
+ 朋友、群組和附近的人
+ </string>
+ <string name="Command_Picks_Tooltip">
+ 顯示在你的小檔案中的最愛地點
+ </string>
+ <string name="Command_Places_Tooltip">
+ 你儲存的地點
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ 偏好設定
+ </string>
+ <string name="Command_Profile_Tooltip">
+ 編輯或察看你的小檔案
+ </string>
+ <string name="Command_Search_Tooltip">
+ 尋找地點、活動、其他人
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ 拍一張照片
+ </string>
+ <string name="Command_Speak_Tooltip">
+ 用麥克風和附近人們交談
+ </string>
+ <string name="Command_View_Tooltip">
+ 調整攝影機角度
+ </string>
+ <string name="Command_Voice_Tooltip">
+ 在虛擬世界裡通話和附近人群的音量控制
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ 目前位在你的底部工具列
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ 目前位在你的左工具列
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ 目前位在你的右工具列
+ </string>
+ <string name="Retain%">
+ 保留%
+ </string>
+ <string name="Detail">
+ 細節
+ </string>
+ <string name="Better Detail">
+ 更多細節
+ </string>
+ <string name="Surface">
+ 表面
+ </string>
+ <string name="Solid">
+ 固體
+ </string>
+ <string name="Wrap">
+ Wrap
+ </string>
+ <string name="Preview">
+ 預覽
+ </string>
+ <string name="Normal">
+ 正常
+ </string>
+ <string name="Pathfinding_Wiki_URL">
+ http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer
+ </string>
+ <string name="Pathfinding_Object_Attr_None">
+ 無
+ </string>
+ <string name="Pathfinding_Object_Attr_Permanent">
+ 影響導航網面
+ </string>
+ <string name="Pathfinding_Object_Attr_Character">
+ 角色
+ </string>
+ <string name="Pathfinding_Object_Attr_MultiSelect">
+ (多項)
+ </string>
+ <string name="snapshot_quality_very_low">
+ 很低
+ </string>
+ <string name="snapshot_quality_low">
+ 低
+ </string>
+ <string name="snapshot_quality_medium">
+ 中
+ </string>
+ <string name="snapshot_quality_high">
+ 高
+ </string>
+ <string name="snapshot_quality_very_high">
+ 很高
+ </string>
+ <string name="TeleportMaturityExceeded">
+ 此居民不得進入此地區。
+ </string>
+ <string name="UserDictionary">
+ [User]
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/zh/teleport_strings.xml b/indra/newview/skins/default/xui/zh/teleport_strings.xml
index b43497bbe6..37080a8d0c 100644
--- a/indra/newview/skins/default/xui/zh/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/zh/teleport_strings.xml
@@ -21,8 +21,8 @@
請稍後再試。
</message>
<message name="NoHelpIslandTP">
- 您不能瞬间转移回“援助岛”。
-去“公共援助岛”重复您的教程。
+ 你無法瞬間傳送回「新手導引島」。
+請到「大眾新手導引島」重新參加導引教學。
</message>
<message name="noaccess_tport">
抱歉,你並沒有權限進入要瞬間傳送的目的地。
@@ -45,6 +45,9 @@
<message name="no_inventory_host">
收納區功能目前無法使用。
</message>
+ <message name="MustGetAgeRegion">
+ 你必須年滿 18 歲才可進入這地區。
+ </message>
</message_set>
<message_set name="progress">
<message name="sending_dest">
@@ -80,5 +83,8 @@
<message name="requesting">
瞬間傳送要求中...
</message>
+ <message name="pending">
+ 等待瞬間傳送…
+ </message>
</message_set>
</teleport_messages>
diff --git a/indra/newview/skins/paths.xml b/indra/newview/skins/paths.xml
deleted file mode 100644
index 3c0da041c7..0000000000
--- a/indra/newview/skins/paths.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<paths>
- <directory>
- <subdir>xui</subdir>
- <subdir>en</subdir>
- </directory>
- <directory>
- <subdir>xui</subdir>
- <subdir>[LANGUAGE]</subdir>
- </directory>
-</paths> \ No newline at end of file
diff --git a/indra/newview/skins/steam/xui/da/strings.xml b/indra/newview/skins/steam/xui/da/strings.xml
deleted file mode 100644
index 11d100eeff..0000000000
--- a/indra/newview/skins/steam/xui/da/strings.xml
+++ /dev/null
@@ -1,4483 +0,0 @@
-<?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
- that are returned from one component and may appear in many places-->
-<strings>
- <string name="CAPITALIZED_APP_NAME">
- SECOND LIFE
- </string>
- <string name="SUPPORT_SITE">
- Second Life Support Portal
- </string>
- <string name="StartupDetectingHardware">
- Detekterer hardware...
- </string>
- <string name="StartupLoading">
- Henter [APP_NAME]...
- </string>
- <string name="StartupClearingCache">
- Tømmer cache...
- </string>
- <string name="StartupInitializingTextureCache">
- Initialiserer tekstur cache...
- </string>
- <string name="StartupInitializingVFS">
- Initialiserer VFS...
- </string>
- <string name="ProgressRestoring">
- Gendanner...
- </string>
- <string name="ProgressChangingResolution">
- Ændrer opløsning...
- </string>
- <string name="LoginInProgress">
- Logger p. [APP_NAME] kan virke laast. Vent venligst.
- </string>
- <string name="LoginInProgressNoFrozen">
- Logger på...
- </string>
- <string name="LoginAuthenticating">
- Validerer adgang
- </string>
- <string name="LoginMaintenance">
- Udfører konto vedligeholdelse...
- </string>
- <string name="LoginAttempt">
- Tidligere forsø på login fejlede. Logger på, forsøg [NUMBER]
- </string>
- <string name="LoginPrecaching">
- verden...
- </string>
- <string name="LoginInitializingBrowser">
- Klargør indbyggede web browser...
- </string>
- <string name="LoginInitializingMultimedia">
- Klargør multimedia...
- </string>
- <string name="LoginInitializingFonts">
- Indlæser skriftstyper...
- </string>
- <string name="LoginVerifyingCache">
- Checker cache filer (kan tage 60-90 sekunder)...
- </string>
- <string name="LoginProcessingResponse">
- Behandler svar ...
- </string>
- <string name="LoginInitializingWorld">
- Initialiserer verden...
- </string>
- <string name="LoginDecodingImages">
- Behandler billeder...
- </string>
- <string name="LoginInitializingQuicktime">
- Initialiserer QuickTime...
- </string>
- <string name="LoginQuicktimeNotFound">
- QuickTime ikke fundet- kunne derfor ikke initialisere.
- </string>
- <string name="LoginQuicktimeOK">
- QuickTime initialiseret.
- </string>
- <string name="LoginWaitingForRegionHandshake">
- Venter på svar fra region...
- </string>
- <string name="LoginConnectingToRegion">
- Tilslutter til region...
- </string>
- <string name="LoginDownloadingClothing">
- Henter tøj...
- </string>
- <string name="InvalidCertificate">
- Serveren returnerede et ugyldigt eller ødelagt certifikat. Kontakt venligst administrator af dette net.
- </string>
- <string name="CertInvalidHostname">
- Et ugyldig hostnavn blev brugt for at få adgang til serveren. Check venligst din SLURL eller navnet på hosten.
- </string>
- <string name="CertExpired">
- Det certifikat der blev returneret ser ud til at være udløbet. Check venligst din systemtid på computeren.
- </string>
- <string name="CertKeyUsage">
- Det certifikat der blev returneret af serveren kan ikke benyttes til SSL. Kontakt venligst administrator af dette net.
- </string>
- <string name="CertBasicConstraints">
- For mange certifikater i serverens certifikat streng. Kontakt venligst administrator af dette net.
- </string>
- <string name="CertInvalidSignature">
- Signaturen på certifkat der blev returneret af Second Life serveren kunne ikke bekræftes.
- </string>
- <string name="LoginFailedNoNetwork">
- Netværksfejl: Kunne ikke etablere forbindelse, check venligst din netværksforbindelse.
- </string>
- <string name="LoginFailed">
- Login fejlede.
- </string>
- <string name="Quit">
- Afslut
- </string>
- <string name="LoginFailedViewerNotPermitted">
- Den klient du benytter kan ikke længere få adgang til Second Life. Besøg venligst denne side for at hente en ny klient:
-http://secondlife.com/download
-
-For mere information, se denne FAQ:
-http://secondlife.com/viewer-access-faq
- </string>
- <string name="LoginIntermediateOptionalUpdateAvailable">
- Valgfri klient opdatering tilgængelig: [VERSION]
- </string>
- <string name="LoginFailedRequiredUpdate">
- Påkrævet opdatering a klient: [VERSION]
- </string>
- <string name="LoginFailedAlreadyLoggedIn">
- Din avatar er allerede logget på.
- </string>
- <string name="LoginFailedAuthenticationFailed">
- Beklager! vi kunne ikke logge dig på.
-Undersøg venligst at du har indtastet det rette
-Please check to make sure you entered the right
- * Brugernavn (like bobsmith12 or steller.sunshine)
- * Password
-Check også at Caps Lock ikke er aktiveret.
- </string>
- <string name="LoginFailedPasswordChanged">
- Som en sikkerhedsforanstaltning er dit password blevet ændret.
-Går venligst til din konto-side på http://secondlife.com/password
-og besvar sikkerhedsspørgsmål for at nulstille dit password.
-Vi undskylder besværet.
- </string>
- <string name="LoginFailedPasswordReset">
- vi har lavet nogle ændringer i vores system og det er nødvendigt at nulstille dit password.
-Går venligst til din konto-side på http://secondlife.com/password
-og besvar sikkerhedsspørgsmål for at nulstille dit password.
-Vi undskylder besværet.
- </string>
- <string name="LoginFailedEmployeesOnly">
- Second Life er midlertidig lukket ned for vedligeholdelse.
-Kun medarbejdere kan logge på for øjeblikket.
-Check www.secondlife.com/status for opdateringer.
- </string>
- <string name="LoginFailedPremiumOnly">
- Second Life har midlertidig begrænset muligheden for log-in for at sikre, at brugere på systemet ikke får dårlige svartider.
-
- Brugere med gratis-konti vil ikke kunne logge på Second Life på dette tidspunkt.
- </string>
- <string name="LoginFailedComputerProhibited">
- Second Life kan ikke tilgås fra dennecomputer.
-Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
- </string>
- <string name="LoginFailedAcountSuspended">
- Din konto vil ikke være tilgængelig før
-[TIME] Pacific Time.
- </string>
- <string name="LoginFailedAccountDisabled">
- Vi kan desværre ikke behandle forespøgsel lige nu.
-Kontakt venligst Second Life supper for assitance via http://secondlife.com/support.
-Hvis du ikke kan ændre dit password ring venligst +1 (866) 476-9763.
- </string>
- <string name="LoginFailedTransformError">
- Data inkonsistens registret ved login.
-Kontakt venligst support@secondlife.com.
- </string>
- <string name="LoginFailedAccountMaintenance">
- Der foretages vedligehold på din konto lige nu.
-Din konto vil ikke være tilgængelig før
-[TIME] Pacific Time.
-Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
- </string>
- <string name="LoginFailedPendingLogoutFault">
- Forespøgsel på logout blev besvaret med en fejl fra simulatoren.
- </string>
- <string name="LoginFailedPendingLogout">
- Systemet er i gang med at logge dig ud netop nu.
-Din konto vil ikke være tilgængelig før
-[TIME] Pacific Time.
- </string>
- <string name="LoginFailedUnableToCreateSession">
- Ikke muligt at oprette gyldig session.
- </string>
- <string name="LoginFailedUnableToConnectToSimulator">
- Ikke muligt at koble til en simulator.
- </string>
- <string name="LoginFailedRestrictedHours">
- Din konto kan kun tilgå Second Life
-mellem [START] [END] Pacific Time.
-Kom venligst tilbage i dette tidsrum.
-
-Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
- </string>
- <string name="LoginFailedIncorrectParameters">
- Ugyldig parametre.
-Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
- </string>
- <string name="LoginFailedFirstNameNotAlphanumeric">
- Fornavn parameter skal være alfanumerisk
-Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
- </string>
- <string name="LoginFailedLastNameNotAlphanumeric">
- Efternavn parameter skal være alfanumerisk
-Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
- </string>
- <string name="LogoutFailedRegionGoingOffline">
- Regionen er lukket ned.
-Prøv at logge på om lidt igen.
- </string>
- <string name="LogoutFailedAgentNotInRegion">
- Avatar ikke i en region.
-Prøv venligst om lidt igen.
- </string>
- <string name="LogoutFailedPendingLogin">
- The region was logging in another session.
-Please try logging in again in a minute.
- </string>
- <string name="LogoutFailedLoggingOut">
- Region har lukket sidste session ned.
-Prøv venligst om lidt igen.
- </string>
- <string name="LogoutFailedStillLoggingOut">
- Regionen er stadig ved at lukke forrige session ud.
-Prøv venligst om lidt igen.
- </string>
- <string name="LogoutSucceeded">
- Region har lukket sidste session ned.
-Prøv venligst om lidt igen.
- </string>
- <string name="LogoutFailedLogoutBegun">
- Region er i gang med at logge ud.
-Prøv venligst om lidt igen.
- </string>
- <string name="LoginFailedLoggingOutSession">
- Region er i gang med at lukket sidste session ned.
-Prøv venligst om lidt igen.
- </string>
- <string name="AgentLostConnection">
- Denne region kan have problemer. Tjek venligst din forbindelse til internettet.
- </string>
- <string name="SavingSettings">
- Gemmer indstillinger...
- </string>
- <string name="LoggingOut">
- Logger ud...
- </string>
- <string name="ShuttingDown">
- Lukker ned...
- </string>
- <string name="YouHaveBeenDisconnected">
- Du er blevet frakoblet den region du var i.
- </string>
- <string name="SentToInvalidRegion">
- Du blev sendt til en ugyldig region.
- </string>
- <string name="TestingDisconnect">
- Tester frakobling af klient
- </string>
- <string name="TooltipPerson">
- Person
- </string>
- <string name="TooltipNoName">
- (intet navn)
- </string>
- <string name="TooltipOwner">
- Ejer:
- </string>
- <string name="TooltipPublic">
- Offentlig
- </string>
- <string name="TooltipIsGroup">
- (Gruppe)
- </string>
- <string name="TooltipForSaleL$">
- Til salg: L$[AMOUNT]
- </string>
- <string name="TooltipFlagGroupBuild">
- Gruppe byg
- </string>
- <string name="TooltipFlagNoBuild">
- Må ikke bygge
- </string>
- <string name="TooltipFlagNoEdit">
- Gruppe byg
- </string>
- <string name="TooltipFlagNotSafe">
- Ikke sikker område
- </string>
- <string name="TooltipFlagNoFly">
- Ingen flyvning
- </string>
- <string name="TooltipFlagGroupScripts">
- Gruppe scripts
- </string>
- <string name="TooltipFlagNoScripts">
- Ingen Scripts
- </string>
- <string name="TooltipLand">
- Land:
- </string>
- <string name="TooltipMustSingleDrop">
- Kun et enkelt element kan trækkes ind her
- </string>
- <string name="TooltipPrice" value="L$[BELØB]:"/>
- <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 se beboers profil
- </string>
- <string name="TooltipAgentInspect">
- Lær mere om denne beboer
- </string>
- <string name="TooltipAgentMute">
- Klik for at slukke for denne beboer
- </string>
- <string name="TooltipAgentUnmute">
- Klik for at fjern slukning for denne beboer
- </string>
- <string name="TooltipAgentIM">
- Klik for at sende IM til denne beboer
- </string>
- <string name="TooltipAgentPay">
- Klik for at betale denne beboer
- </string>
- <string name="TooltipAgentOfferTeleport">
- Klik for at tilbyde teleport til denne beboer
- </string>
- <string name="TooltipAgentRequestFriend">
- Klik for at sende venneforespørgsel
- </string>
- <string name="TooltipGroupUrl">
- Klik for at se denne gruppes beskrivelse
- </string>
- <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="SLappAgentMute">
- Sluk
- </string>
- <string name="SLappAgentUnmute">
- Fjern sluk
- </string>
- <string name="SLappAgentIM">
- IM
- </string>
- <string name="SLappAgentPay">
- Betal
- </string>
- <string name="SLappAgentOfferTeleport">
- Tilbyd teleport til
- </string>
- <string name="SLappAgentRequestFriend">
- Venneforespørgsel
- </string>
- <string name="BUTTON_CLOSE_DARWIN">
- Luk (⌘W)
- </string>
- <string name="BUTTON_CLOSE_WIN">
- Luk (Ctrl+W)
- </string>
- <string name="BUTTON_CLOSE_CHROME">
- Luk
- </string>
- <string name="BUTTON_RESTORE">
- Gendan
- </string>
- <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_HELP">
- Vis hjælp
- </string>
- <string name="Searching">
- Søger...
- </string>
- <string name="NoneFound">
- Intet fundet.
- </string>
- <string name="RetrievingData">
- Henter...
- </string>
- <string name="ReleaseNotes">
- Noter om version
- </string>
- <string name="RELEASE_NOTES_BASE_URL">
- http://wiki.secondlife.com/wiki/Release_Notes/
- </string>
- <string name="LoadingData">
- Henter...
- </string>
- <string name="AvatarNameNobody">
- (ingen)
- </string>
- <string name="AvatarNameWaiting">
- (venter)
- </string>
- <string name="GroupNameNone">
- (ingen)
- </string>
- <string name="AvalineCaller">
- Avaline opkalder [ORDER]
- </string>
- <string name="AssetErrorNone">
- Ingen fejl
- </string>
- <string name="AssetErrorRequestFailed">
- Element forespørgsel: fejlede
- </string>
- <string name="AssetErrorNonexistentFile">
- Element forespørgsel: fil findes ikke
- </string>
- <string name="AssetErrorNotInDatabase">
- Element forespørgsel: element ikke fundet i database
- </string>
- <string name="AssetErrorEOF">
- Slutning af fil
- </string>
- <string name="AssetErrorCannotOpenFile">
- Kan ikke åbne fil
- </string>
- <string name="AssetErrorFileNotFound">
- Fil ikke fundet
- </string>
- <string name="AssetErrorTCPTimeout">
- Tidsgrænse overskredet ved filhentning
- </string>
- <string name="AssetErrorCircuitGone">
- Forbindelsen mistet
- </string>
- <string name="AssetErrorPriceMismatch">
- [APP_NAME] klient og server er uenige om prisen
- </string>
- <string name="AssetErrorUnknownStatus">
- Ukendt status
- </string>
- <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="symbolic folder link">
- link til mappe
- </string>
- <string name="mesh">
- mesh
- </string>
- <string name="AvatarEditingAppearance">
- (Redigering Udseende)
- </string>
- <string name="AvatarAway">
- Væk
- </string>
- <string name="AvatarBusy">
- Optaget
- </string>
- <string name="AvatarMuted">
- Blokeret
- </string>
- <string name="anim_express_afraid">
- Bange
- </string>
- <string name="anim_express_anger">
- Vred
- </string>
- <string name="anim_away">
- Væk
- </string>
- <string name="anim_backflip">
- Baglæns salto
- </string>
- <string name="anim_express_laugh">
- Hjertelig latter
- </string>
- <string name="anim_express_toothsmile">
- Stort smil
- </string>
- <string name="anim_blowkiss">
- Sende kys
- </string>
- <string name="anim_express_bored">
- Keder sig
- </string>
- <string name="anim_bow">
- Buk
- </string>
- <string name="anim_clap">
- Klap
- </string>
- <string name="anim_courtbow">
- Højtideligt buk
- </string>
- <string name="anim_express_cry">
- Græd
- </string>
- <string name="anim_dance1">
- Dans 1
- </string>
- <string name="anim_dance2">
- Dans 2
- </string>
- <string name="anim_dance3">
- Dans 3
- </string>
- <string name="anim_dance4">
- Dans 4
- </string>
- <string name="anim_dance5">
- Dans 5
- </string>
- <string name="anim_dance6">
- Dans 6
- </string>
- <string name="anim_dance7">
- Dans 7
- </string>
- <string name="anim_dance8">
- Dans 8
- </string>
- <string name="anim_express_disdain">
- Foragt
- </string>
- <string name="anim_drink">
- Drik
- </string>
- <string name="anim_express_embarrased">
- Flov
- </string>
- <string name="anim_angry_fingerwag">
- Løftet finger
- </string>
- <string name="anim_fist_pump">
- Knytnæve
- </string>
- <string name="anim_yoga_float">
- Svævende yoga
- </string>
- <string name="anim_express_frown">
- Mistroisk
- </string>
- <string name="anim_impatient">
- Utålmodig
- </string>
- <string name="anim_jumpforjoy">
- Glædeshop
- </string>
- <string name="anim_kissmybutt">
- Kys min r..
- </string>
- <string name="anim_express_kiss">
- Kys
- </string>
- <string name="anim_laugh_short">
- Grin
- </string>
- <string name="anim_musclebeach">
- Bodybuilder
- </string>
- <string name="anim_no_unhappy">
- Nej (sur)
- </string>
- <string name="anim_no_head">
- Nej
- </string>
- <string name="anim_nyanya">
- Æv-bæv
- </string>
- <string name="anim_punch_onetwo">
- Et-to slag
- </string>
- <string name="anim_express_open_mouth">
- Åben mund
- </string>
- <string name="anim_peace">
- Peace
- </string>
- <string name="anim_point_you">
- Peg på andre
- </string>
- <string name="anim_point_me">
- Peg på dig selv
- </string>
- <string name="anim_punch_l">
- Slå venstre
- </string>
- <string name="anim_punch_r">
- Slå højre
- </string>
- <string name="anim_rps_countdown">
- SSP - Tæl
- </string>
- <string name="anim_rps_paper">
- SSP - Papir
- </string>
- <string name="anim_rps_rock">
- SSP - Sten
- </string>
- <string name="anim_rps_scissors">
- SSP - Saks
- </string>
- <string name="anim_express_repulsed">
- Misfornøjet
- </string>
- <string name="anim_kick_roundhouse_r">
- Karatepark
- </string>
- <string name="anim_express_sad">
- Ked af det
- </string>
- <string name="anim_salute">
- Honnør
- </string>
- <string name="anim_shout">
- Råb
- </string>
- <string name="anim_express_shrug">
- Skuldertræk
- </string>
- <string name="anim_express_smile">
- Smil
- </string>
- <string name="anim_smoke_idle">
- Ryg
- </string>
- <string name="anim_smoke_inhale">
- Indhalér
- </string>
- <string name="anim_smoke_throw_down">
- Smid cigaret
- </string>
- <string name="anim_express_surprise">
- Overrasket
- </string>
- <string name="anim_sword_strike_r">
- Sværdslag
- </string>
- <string name="anim_angry_tantrum">
- Ekstatisk
- </string>
- <string name="anim_express_tongue_out">
- Tunge ud
- </string>
- <string name="anim_hello">
- Vink
- </string>
- <string name="anim_whisper">
- Knib øje i
- </string>
- <string name="anim_whistle">
- Pift
- </string>
- <string name="anim_express_wink">
- Blink
- </string>
- <string name="anim_wink_hollywood">
- Blink (Hollywood)
- </string>
- <string name="anim_express_worry">
- Bekymret
- </string>
- <string name="anim_yes_happy">
- Ja (glad)
- </string>
- <string name="anim_yes_head">
- Ja
- </string>
- <string name="texture_loading">
- Indlæser...
- </string>
- <string name="worldmap_offline">
- Offline
- </string>
- <string name="worldmap_item_tooltip_format">
- [AREA] m² L$[PRICE]
- </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="reconnect_nearby">
- Du vil nu blive dirigeret til lokal stemme chat
- </string>
- <string name="ScriptQuestionCautionChatGranted">
- &apos;[OBJECTNAME]&apos;, en genstand, ejet af &apos;[OWNERNAME]&apos;, lokaliseret i [REGIONNAME] på [REGIONPOS], har fået tilladelse til: [PERMISSIONS].
- </string>
- <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>
- <string name="SIM_ACCESS_MATURE">
- Mature
- </string>
- <string name="SIM_ACCESS_ADULT">
- Adult
- </string>
- <string name="SIM_ACCESS_DOWN">
- logget af
- </string>
- <string name="SIM_ACCESS_MIN">
- Ukendt
- </string>
- <string name="land_type_unknown">
- (ukendt)
- </string>
- <string name="Estate / Full Region">
- Estate / Hel region
- </string>
- <string name="Estate / Homestead">
- Estate / Homestead
- </string>
- <string name="Mainland / Homestead">
- Mainland / Homestead
- </string>
- <string name="Mainland / Full Region">
- Mainland / Hel region
- </string>
- <string name="all_files">
- Alle filer
- </string>
- <string name="sound_files">
- Lyde
- </string>
- <string name="animation_files">
- Animationer
- </string>
- <string name="image_files">
- Billeder
- </string>
- <string name="save_file_verb">
- Gem
- </string>
- <string name="load_file_verb">
- Hent
- </string>
- <string name="targa_image_files">
- Targa billeder
- </string>
- <string name="bitmap_image_files">
- Bitmap billeder
- </string>
- <string name="avi_movie_file">
- AVI film fil
- </string>
- <string name="xaf_animation_file">
- XAF Anim Fil
- </string>
- <string name="xml_file">
- XML Fil
- </string>
- <string name="raw_file">
- RAW fil
- </string>
- <string name="compressed_image_files">
- Komprimerede billeder
- </string>
- <string name="load_files">
- Hent filer
- </string>
- <string name="choose_the_directory">
- Vælg bibliotek
- </string>
- <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="physics">
- Fysik
- </string>
- <string name="invalid">
- ugyldig
- </string>
- <string name="none">
- ingen
- </string>
- <string name="shirt_not_worn">
- Trøje - ikke på
- </string>
- <string name="pants_not_worn">
- Bukser - ikke på
- </string>
- <string name="shoes_not_worn">
- Sko - ikke på
- </string>
- <string name="socks_not_worn">
- Strømper - ikke på
- </string>
- <string name="jacket_not_worn">
- Jakke - ikke på
- </string>
- <string name="gloves_not_worn">
- Handsker - ikke på
- </string>
- <string name="undershirt_not_worn">
- Undertrøje - ikke på
- </string>
- <string name="underpants_not_worn">
- Underbukser - ikke på
- </string>
- <string name="skirt_not_worn">
- Nederdel - ikke på
- </string>
- <string name="alpha_not_worn">
- Alpha ikke benyttet
- </string>
- <string name="tattoo_not_worn">
- Tatovering ikke benyttet
- </string>
- <string name="physics_not_worn">
- Ikke noget fysisk båret
- </string>
- <string name="invalid_not_worn">
- ugyldig
- </string>
- <string name="create_new_shape">
- Opret ny figur
- </string>
- <string name="create_new_skin">
- Opret nyt hud
- </string>
- <string name="create_new_hair">
- Opret nyt hår
- </string>
- <string name="create_new_eyes">
- Opret nye øjne
- </string>
- <string name="create_new_shirt">
- Opret ny trøje
- </string>
- <string name="create_new_pants">
- Opret nye bukser
- </string>
- <string name="create_new_shoes">
- Opret nye sko
- </string>
- <string name="create_new_socks">
- Opret nye strømper
- </string>
- <string name="create_new_jacket">
- Opret ny jakke
- </string>
- <string name="create_new_gloves">
- Opret nye handsker
- </string>
- <string name="create_new_undershirt">
- Opret ny undertrøje
- </string>
- <string name="create_new_underpants">
- Opret nye underbukser
- </string>
- <string name="create_new_skirt">
- Opret ny nederdel
- </string>
- <string name="create_new_alpha">
- Opret ny alpha
- </string>
- <string name="create_new_tattoo">
- Opret ny tatovering
- </string>
- <string name="create_new_physics">
- Opret ny fysik
- </string>
- <string name="create_new_invalid">
- ugyldig
- </string>
- <string name="NewWearable">
- Ny [WEARABLE_ITEM]
- </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="StartUpNotifications">
- 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">
- Fandt du ikke hvad du søgte? Prøv [secondlife:///app/search/all/[SEARCH_TERM] Search].
- </string>
- <string name="PlacesNoMatchingItems">
- Fandt du ikke hvad du søgte? Prøv [secondlife:///app/search/places/[SEARCH_TERM] Search].
- </string>
- <string name="FavoritesNoMatchingItems">
- Træk et landemærke hertil for at tilføje den som favorit.
- </string>
- <string name="InventoryNoTexture">
- Du har ikke en kopi af denne tekstur i din beholdning
- </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=" (link)"/>
- <string name="broken_link" value=" (brudt link)"/>
- <string name="LoadingContents">
- Henter indhold...
- </string>
- <string name="NoContents">
- Intet indhold
- </string>
- <string name="WornOnAttachmentPoint" value=" (båret på [ATTACHMENT_POINT])"/>
- <string name="ActiveGesture" value="[GESLABEL] (aktiv)"/>
- <string name="Chat Message" 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="GestureActionNone" value="Ingen"/>
- <string name="HelloAvatar" value=" Hej, avatar! "/>
- <string name="ViewAllGestures" value=" Se alle &gt;&gt;"/>
- <string name="GetMoreGestures" value="Få mere &gt;&gt;"/>
- <string name="Animations" value=" Animationer,"/>
- <string name="Calling Cards" value=" Visitkort,"/>
- <string name="Clothing" value=" Tøj,"/>
- <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 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">
- Mine favoritter
- </string>
- <string name="InvFolder favorite">
- Mine favoritter
- </string>
- <string name="InvFolder Current Outfit">
- Nuværende sæt
- </string>
- <string name="InvFolder Initial Outfits">
- Start sæt
- </string>
- <string name="InvFolder My Outfits">
- Mine sæt
- </string>
- <string name="InvFolder Accessories">
- Tilbehør
- </string>
- <string name="InvFolder Meshes">
- Meshes
- </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="Invalid Attachment">
- Ugyldig vedhæftningspunktt
- </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="AcctTypeCharterMember">
- Æresmedlemmer
- </string>
- <string name="AcctTypeEmployee">
- Linden Lab medarbejder
- </string>
- <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="GroupColumn" value="Gruppe"/>
- <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], maks. [MAXACCESS])
- </string>
- <string name="RegionInfoAllowedGroups">
- Godkendte grupper: ([ALLOWEDGROUPS], max. [MAXACCESS])
- </string>
- <string name="ScriptLimitsParcelScriptMemory">
- Parcel script memory
- </string>
- <string name="ScriptLimitsParcelsOwned">
- Parceller listet: [PARCELS]
- </string>
- <string name="ScriptLimitsMemoryUsed">
- Memory brugt: [COUNT] kb ud af [MAX] kb; [AVAILABLE] kb tilgængeligt
- </string>
- <string name="ScriptLimitsMemoryUsedSimple">
- Memory brugt: [COUNT] kb
- </string>
- <string name="ScriptLimitsParcelScriptURLs">
- Parcel Script URL&apos;er
- </string>
- <string name="ScriptLimitsURLsUsed">
- URL&apos;er brugt: [COUNT] ud af [MAX]; [AVAILABLE] tilgængelige
- </string>
- <string name="ScriptLimitsURLsUsedSimple">
- URL&apos;er brugt: [COUNT]
- </string>
- <string name="ScriptLimitsRequestError">
- Fejl ved anmodning om information
- </string>
- <string name="ScriptLimitsRequestNoParcelSelected">
- Ingen parcel valgt
- </string>
- <string name="ScriptLimitsRequestWrongRegion">
- Fejl: script information er kun tilgængelig i den nuværende region
- </string>
- <string name="ScriptLimitsRequestWaiting">
- Henter information...
- </string>
- <string name="ScriptLimitsRequestDontOwnParcel">
- Du har ikke rettigheder til at undersøge denne parcel
- </string>
- <string name="SITTING_ON">
- Sidder på
- </string>
- <string name="ATTACH_CHEST">
- Bryst
- </string>
- <string name="ATTACH_HEAD">
- Hoved
- </string>
- <string name="ATTACH_LSHOULDER">
- Venstre skulder
- </string>
- <string name="ATTACH_RSHOULDER">
- Højre skulder
- </string>
- <string name="ATTACH_LHAND">
- Venstre hånd
- </string>
- <string name="ATTACH_RHAND">
- Højre hånd
- </string>
- <string name="ATTACH_LFOOT">
- Venstre fod
- </string>
- <string name="ATTACH_RFOOT">
- Højre fod
- </string>
- <string name="ATTACH_BACK">
- Ryg
- </string>
- <string name="ATTACH_PELVIS">
- Bækken
- </string>
- <string name="ATTACH_MOUTH">
- Mund
- </string>
- <string name="ATTACH_CHIN">
- Hage
- </string>
- <string name="ATTACH_LEAR">
- Venstre øre
- </string>
- <string name="ATTACH_REAR">
- Højre øre
- </string>
- <string name="ATTACH_LEYE">
- Venstre øje
- </string>
- <string name="ATTACH_REYE">
- Højre øje
- </string>
- <string name="ATTACH_NOSE">
- Næse
- </string>
- <string name="ATTACH_RUARM">
- Højre overarm
- </string>
- <string name="ATTACH_RLARM">
- Højre underarm
- </string>
- <string name="ATTACH_LUARM">
- Venstre overarm
- </string>
- <string name="ATTACH_LLARM">
- Venstre underarm
- </string>
- <string name="ATTACH_RHIP">
- Højre hofte
- </string>
- <string name="ATTACH_RULEG">
- Højre lår
- </string>
- <string name="ATTACH_RLLEG">
- Højre underben
- </string>
- <string name="ATTACH_LHIP">
- Venstre hofte
- </string>
- <string name="ATTACH_LULEG">
- Venste lår
- </string>
- <string name="ATTACH_LLLEG">
- Venstre underben
- </string>
- <string name="ATTACH_BELLY">
- Mave
- </string>
- <string name="ATTACH_RPEC">
- Højre bryst
- </string>
- <string name="ATTACH_LPEC">
- Venstre bryst
- </string>
- <string name="ATTACH_HUD_CENTER_2">
- HUD Center 2
- </string>
- <string name="ATTACH_HUD_TOP_RIGHT">
- HUD Øverst til højre
- </string>
- <string name="ATTACH_HUD_TOP_CENTER">
- HUD Foroven midtpå
- </string>
- <string name="ATTACH_HUD_TOP_LEFT">
- HUD Øverst til venstre
- </string>
- <string name="ATTACH_HUD_CENTER_1">
- HUD Center 1
- </string>
- <string name="ATTACH_HUD_BOTTOM_LEFT">
- HUD Nederst til venstre
- </string>
- <string name="ATTACH_HUD_BOTTOM">
- HUD For neden
- </string>
- <string name="ATTACH_HUD_BOTTOM_RIGHT">
- HUD Nederst til højre
- </string>
- <string name="CursorPos">
- Linie [LINE], Kolonne [COLUMN]
- </string>
- <string name="PanelDirCountFound">
- [COUNT] fundet
- </string>
- <string name="PanelContentsTooltip">
- Indhold i objekt
- </string>
- <string name="PanelContentsNewScript">
- Nyt script
- </string>
- <string name="BusyModeResponseDefault">
- Beboeren du sendte en besked er &apos;optaget&apos;, hvilket betyder at han/hun ikke vil forstyrres. Din besked vil blive vis i hans/hendes IM panel til senere visning.
- </string>
- <string name="MuteByName">
- (Efter navn)
- </string>
- <string name="MuteAgent">
- (beboer)
- </string>
- <string name="MuteObject">
- (Objekt)
- </string>
- <string name="MuteGroup">
- (Gruppe)
- </string>
- <string name="MuteExternal">
- (Ekstern)
- </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" value="Sidst rettet: "/>
- <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="NoPicksClassifiedsText">
- Du har ikke oprettet nogen favoritter eller annoncer. Klik på plus knappen nedenfor for at oprette en favorit eller en annonce.
- </string>
- <string name="NoAvatarPicksClassifiedsText">
- Bruger har ingen favoritter eller annoncer
- </string>
- <string name="PicksClassifiedsLoadingText">
- Henter...
- </string>
- <string name="MultiPreviewTitle">
- Vis først
- </string>
- <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="InvOfferDecline">
- Du afslår [DESC] fra &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
- </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 [NAME] pris L$ [AMOUNT]
- </string>
- <string name="BuyingCosts">
- At købe dette koster L$ [AMOUNT]
- </string>
- <string name="UnknownFileExtension">
- Ukendt fil efternavn [.%s]
-Forventet .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
- </string>
- <string name="MuteObject2">
- Blokér
- </string>
- <string name="AddLandmarkNavBarMenu">
- Tilføj landemærke...
- </string>
- <string name="EditLandmarkNavBarMenu">
- Redigér landemærke...
- </string>
- <string name="accel-mac-control">
- ⌃
- </string>
- <string name="accel-mac-command">
- ⌘
- </string>
- <string name="accel-mac-option">
- ⌥
- </string>
- <string name="accel-mac-shift">
- ⇧
- </string>
- <string name="accel-win-control">
- Ctrl+
- </string>
- <string name="accel-win-alt">
- Alt+
- </string>
- <string name="accel-win-shift">
- Shift+
- </string>
- <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="Direction_Forward">
- Fremad
- </string>
- <string name="Direction_Left">
- Venstre
- </string>
- <string name="Direction_Right">
- Højre
- </string>
- <string name="Direction_Back">
- Bagud
- </string>
- <string name="Direction_North">
- Nord
- </string>
- <string name="Direction_South">
- Syd
- </string>
- <string name="Direction_West">
- Vest
- </string>
- <string name="Direction_East">
- Øst
- </string>
- <string name="Direction_Up">
- Op
- </string>
- <string name="Direction_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="Rental">
- Leje
- </string>
- <string name="Any">
- Enhver
- </string>
- <string name="You">
- Du
- </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 Fringe">
- Nakkehår
- </string>
- <string name="Baggy">
- Posede
- </string>
- <string name="Bangs">
- Pandehår
- </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 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="Breast Physics Mass">
- Bryst fylde
- </string>
- <string name="Breast Physics Smoothing">
- Brystudjævning
- </string>
- <string name="Breast Physics Gravity">
- Bryst tyngde
- </string>
- <string name="Breast Physics Drag">
- Bryst inerti
- </string>
- <string name="Breast Physics InOut Max Effect">
- Maks. effekt
- </string>
- <string name="Breast Physics InOut Spring">
- Fjeder
- </string>
- <string name="Breast Physics InOut Gain">
- Øg
- </string>
- <string name="Breast Physics InOut Damping">
- Dæmpning
- </string>
- <string name="Breast Physics UpDown Max Effect">
- Maks. effekt
- </string>
- <string name="Breast Physics UpDown Spring">
- Fjeder
- </string>
- <string name="Breast Physics UpDown Gain">
- Øg
- </string>
- <string name="Breast Physics UpDown Damping">
- Dæmpning
- </string>
- <string name="Breast Physics LeftRight Max Effect">
- Maks. effekt
- </string>
- <string name="Breast Physics LeftRight Spring">
- Fjeder
- </string>
- <string name="Breast Physics LeftRight Gain">
- Øg
- </string>
- <string name="Breast Physics LeftRight Damping">
- Dæmpning
- </string>
- <string name="Belly Physics Mass">
- Mave omfang
- </string>
- <string name="Belly Physics Smoothing">
- maveudjævning
- </string>
- <string name="Belly Physics Gravity">
- Mave tyngde
- </string>
- <string name="Belly Physics Drag">
- Mave inerti
- </string>
- <string name="Belly Physics UpDown Max Effect">
- Maks. effekt
- </string>
- <string name="Belly Physics UpDown Spring">
- Fjeder
- </string>
- <string name="Belly Physics UpDown Gain">
- Øg
- </string>
- <string name="Belly Physics UpDown Damping">
- Dæmpning
- </string>
- <string name="Butt Physics Mass">
- Bagdel omfang
- </string>
- <string name="Butt Physics Smoothing">
- Bagdelsudjævning
- </string>
- <string name="Butt Physics Gravity">
- Bagdel tyngde
- </string>
- <string name="Butt Physics Drag">
- Bagdel modstand
- </string>
- <string name="Butt Physics UpDown Max Effect">
- Maks. effekt
- </string>
- <string name="Butt Physics UpDown Spring">
- Fjeder
- </string>
- <string name="Butt Physics UpDown Gain">
- Øg
- </string>
- <string name="Butt Physics UpDown Damping">
- Dæmpning
- </string>
- <string name="Butt Physics LeftRight Max Effect">
- Maks. effekt
- </string>
- <string name="Butt Physics LeftRight Spring">
- Fjeder
- </string>
- <string name="Butt Physics LeftRight Gain">
- Øg
- </string>
- <string name="Butt Physics LeftRight Damping">
- Dæmpning
- </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="Butt Gravity">
- Bagdel tyngde
- </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 Up">
- Opadvendt
- </string>
- <string name="Creased">
- Rynket
- </string>
- <string name="Crooked Nose">
- Skæv næse
- </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="Dense">
- Tæt
- </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="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 Bugged">
- Udstående øjne
- </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 Lips">
- Tykke læber
- </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 Fringe">
- Frynser foran
- </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="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="Low Heels">
- Flade hæle
- </string>
- <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">
- Mere
- </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 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="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="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="Regular">
- Almindelig
- </string>
- <string name="Right Part">
- Højre skildning
- </string>
- <string name="Rosy Complexion">
- Rosa teint
- </string>
- <string name="Round">
- Rund
- </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="Scrawny Leg">
- Magert ben
- </string>
- <string name="Separate">
- Separat
- </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 Up">
- Venstre op
- </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 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 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="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="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="Tall">
- Høj
- </string>
- <string name="Taper Back">
- Indsnævring bag
- </string>
- <string name="Taper Front">
- Indsnævring foran
- </string>
- <string name="Thick Heels">
- Brede hæle
- </string>
- <string name="Thick Neck">
- Bred nakke
- </string>
- <string name="Thick Toe">
- Bred snude
- </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="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="LocationCtrlAdultIconTooltip">
- Adult region
- </string>
- <string name="LocationCtrlModerateIconTooltip">
- Moderate region
- </string>
- <string name="LocationCtrlGeneralIconTooltip">
- Generel region
- </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="ItemsComingInTooFastFrom">
- [APP_NAME]: Genstande modtages for hurtigt fra [FROM_NAME], automatisk visning er slået fra i [TIME] sekunder
- </string>
- <string name="ItemsComingInTooFast">
- [APP_NAME]: Genstande modtages for hurtigt, automatisk visning er slået fra i [TIME] sekunder
- </string>
- <string name="IM_logging_string">
- -- Logning af IM aktiveret --
- </string>
- <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="Saved_message">
- (Gemt [LONG_TIMESTAMP])
- </string>
- <string name="answered_call">
- Dit opkald er blevet besvaret
- </string>
- <string name="you_started_call">
- Du startede dette stemme kald
- </string>
- <string name="you_joined_call">
- Du er nu med i stemme opkald
- </string>
- <string name="name_started_call">
- [NAME] startede et stemmekald
- </string>
- <string name="ringing-im">
- Tilslutter stemme opkald...
- </string>
- <string name="connected-im">
- Forbundet, klik på Forlad for at lægge på
- </string>
- <string name="hang_up-im">
- Forladt stemme opkald
- </string>
- <string name="conference-title-incoming">
- Konference med [AGENT_NAME]
- </string>
- <string name="no_session_message">
- (IM session eksisterer ikke)
- </string>
- <string name="only_user_message">
- Du er den eneste deltager i denne samtale
- </string>
- <string name="offline_message">
- [NAME] er logget af.
- </string>
- <string name="invite_message">
- Tryk på [BUTTON NAME] knappen for at acceptére/tilslutte til denne stemme chat.
- </string>
- <string name="muted_message">
- Du har blokeret denne beboer. Sendes en besked, vil beboeren fjernes fra blokeringslisten.
- </string>
- <string name="generic">
- Fejl ved anmodning, prøv venligst igen senere
- </string>
- <string name="generic_request_error">
- Kunne ikke etablere forbindelse, prøv igen senere
- </string>
- <string name="insufficient_perms_error">
- Du har ikke de fornødne rettigheder.
- </string>
- <string name="session_does_not_exist_error">
- Denne samtale er lukket ned
- </string>
- <string name="no_ability_error">
- Du har ikke den mulighed.
- </string>
- <string name="no_ability">
- Du har ikke den mulighed.
- </string>
- <string name="not_a_mod_error">
- Du er ikke moderator for denne samtale.
- </string>
- <string name="muted">
- En gruppe moderator har deaktiveret din tekst chat.
- </string>
- <string name="muted_error">
- Du er blevet &quot;blokeret&quot;.
- </string>
- <string name="add_session_event">
- Ikke muligt at tilføge brugere til samtale med [RECIPIENT].
- </string>
- <string name="message">
- Kunne ikke sende din besked til session med [RECIPIENT].
- </string>
- <string name="message_session_event">
- Ikke muligt at sende din besked til samtalen med [RECIPIENT].
- </string>
- <string name="mute">
- Fejl under moderation.
- </string>
- <string name="removed">
- Du er blevet fjernet fra denne gruppe.
- </string>
- <string name="removed_from_group">
- Du er blevet fjernet fra gruppen.
- </string>
- <string name="close_on_no_ability">
- Du har ikke længere mulighed for at deltage i samtalen
- </string>
- <string name="unread_chat_single">
- [SOURCES] har sagt noget nyt
- </string>
- <string name="unread_chat_multiple">
- [SOURCES] har sagt noget nyt
- </string>
- <string name="session_initialization_timed_out_error">
- Initialisering af session er &quot;timed out&quot;
- </string>
- <string name="Home position set.">
- Hjemmeposition sat.
- </string>
- <string name="voice_morphing_url">
- http://secondlife.com/landing/voicemorphing
- </string>
- <string name="paid_you_ldollars">
- [NAME] betalte dig L$[AMOUNT] [REASON].
- </string>
- <string name="paid_you_ldollars_no_reason">
- [NAME] betalte dig L$[AMOUNT].
- </string>
- <string name="you_paid_ldollars">
- Du betalte [NAME] L$[AMOUNT] [REASON].
- </string>
- <string name="you_paid_ldollars_no_info">
- Du betalte L$[AMOUNT].
- </string>
- <string name="you_paid_ldollars_no_reason">
- Du betalte [NAME] L$[AMOUNT].
- </string>
- <string name="you_paid_ldollars_no_name">
- Du betalte L$[AMOUNT] [REASON].
- </string>
- <string name="for item">
- til [ITEM]
- </string>
- <string name="for a parcel of land">
- for en parcel land
- </string>
- <string name="for a land access pass">
- for en billet til land
- </string>
- <string name="for deeding land">
- for dedikering af land
- </string>
- <string name="to create a group">
- for at oprette gruppe
- </string>
- <string name="to join a group">
- for at blive medlem i gruppe
- </string>
- <string name="to upload">
- for at uploade
- </string>
- <string name="to publish a classified ad">
- til offentliggørelse af annonce
- </string>
- <string name="giving">
- Giver L$ [AMOUNT]
- </string>
- <string name="uploading_costs">
- Pris for upload er L$ [AMOUNT]
- </string>
- <string name="this_costs">
- Prisen er L$ [AMOUNT]
- </string>
- <string name="buying_selected_land">
- Køber valgte land L$ [AMOUNT]
- </string>
- <string name="this_object_costs">
- Dette objekt koster L$ [AMOUNT]
- </string>
- <string name="group_role_everyone">
- Enhver
- </string>
- <string name="group_role_officers">
- Administratorer
- </string>
- <string name="group_role_owners">
- Ejere
- </string>
- <string name="group_member_status_online">
- Online
- </string>
- <string name="uploading_abuse_report">
- Uploader...
-
-Krænkelsesanmeldelse
- </string>
- <string name="New Shape">
- Ny kropsbygning
- </string>
- <string name="New Skin">
- Ny hud
- </string>
- <string name="New Hair">
- Nyt hår
- </string>
- <string name="New Eyes">
- Nye øjne
- </string>
- <string name="New Shirt">
- Ny trøje
- </string>
- <string name="New Pants">
- Nye bukser
- </string>
- <string name="New Shoes">
- Nye sko
- </string>
- <string name="New Socks">
- Nye strømper
- </string>
- <string name="New Jacket">
- Ny jakke
- </string>
- <string name="New Gloves">
- Nye handsker
- </string>
- <string name="New Undershirt">
- Ny undertrøje
- </string>
- <string name="New Underpants">
- Nye underbukser
- </string>
- <string name="New Skirt">
- Ny nederdel
- </string>
- <string name="New Alpha">
- Ny alpha
- </string>
- <string name="New Tattoo">
- Ny tatovering
- </string>
- <string name="New Physics">
- Ny fysik
- </string>
- <string name="Invalid Wearable">
- Kan ikke tages på
- </string>
- <string name="New Gesture">
- Ny bevægelse
- </string>
- <string name="New Script">
- Nyt script
- </string>
- <string name="New Note">
- Ny note
- </string>
- <string name="New Folder">
- Ny folder
- </string>
- <string name="Contents">
- Indhold
- </string>
- <string name="Gesture">
- Bevægelse
- </string>
- <string name="Male Gestures">
- Mandlige bevægelser
- </string>
- <string name="Female Gestures">
- Kvindelige bevægelser
- </string>
- <string name="Other Gestures">
- Andre bevægelser
- </string>
- <string name="Speech Gestures">
- Tale bevægelser
- </string>
- <string name="Common Gestures">
- Almindelige bevægelser
- </string>
- <string name="Male - Excuse me">
- Mand - Undskyld mig
- </string>
- <string name="Male - Get lost">
- Mand - Skrid!
- </string>
- <string name="Male - Blow kiss">
- Mand - Pust et kys
- </string>
- <string name="Male - Boo">
- Mand - Boo
- </string>
- <string name="Male - Bored">
- Mand - Keder sig
- </string>
- <string name="Male - Hey">
- Mand - Hey
- </string>
- <string name="Male - Laugh">
- Mand - Latter
- </string>
- <string name="Male - Repulsed">
- Mand - Frastødt
- </string>
- <string name="Male - Shrug">
- Mand - Skuldertræk
- </string>
- <string name="Male - Stick tougue out">
- Mand - Stik tunge ud
- </string>
- <string name="Male - Wow">
- Mand - Wow
- </string>
- <string name="Female - Chuckle">
- Kvinde - Kluklatter
- </string>
- <string name="Female - Cry">
- Kvinde - gråd
- </string>
- <string name="Female - Embarrassed">
- Kvinde - Flov
- </string>
- <string name="Female - Excuse me">
- Kvinde - Undskyld mig
- </string>
- <string name="Female - Get lost">
- Kvinde - Skrid!
- </string>
- <string name="Female - Blow kiss">
- Kvinde - Pust et kys
- </string>
- <string name="Female - Boo">
- Kvinde - Boo
- </string>
- <string name="Female - Bored">
- Kvinde - Keder sig
- </string>
- <string name="Female - Hey">
- Kvinde - Hey
- </string>
- <string name="Female - Hey baby">
- Kvinde - Hey baby
- </string>
- <string name="Female - Laugh">
- Kvinde - Latter
- </string>
- <string name="Female - Looking good">
- Kvinde - &quot;Ser godt ud&quot;
- </string>
- <string name="Female - Over here">
- Kvinde - Herovre
- </string>
- <string name="Female - Please">
- Kvinde - Be´ om
- </string>
- <string name="Female - Repulsed">
- Kvinde - Frastødt
- </string>
- <string name="Female - Shrug">
- Kvinde - Skuldertræk
- </string>
- <string name="Female - Stick tougue out">
- Kvinde - Stik tungen ud
- </string>
- <string name="Female - Wow">
- Kvinde - Wow
- </string>
- <string name="AvatarBirthDateFormat">
- [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
- </string>
- <string name="DefaultMimeType">
- ingen/ingen
- </string>
- <string name="texture_load_dimensions_error">
- Kan ikke hente billeder større end [WIDTH]*[HEIGHT]
- </string>
- <string name="words_separator" value=","/>
- <string name="server_is_down">
- Desværre er noget gået galt.
-
- Check venligst status.secondlifegrid.net for at se om der skulle være driftsproblemer.
- Hvis du bliver ved med at have problemer, check venligst din firewall- og netværksopsætning.
- </string>
- <string name="dateTimeWeekdaysNames">
- Søndag:Mandag:Tirsdag:Onsdag:Torsdag:Fredag:Lørdag
- </string>
- <string name="dateTimeWeekdaysShortNames">
- Søn:Man:Tir:Ons:Tor:Fre:Lør
- </string>
- <string name="dateTimeMonthNames">
- Januar:Februar:Marts:April:Maj:Juni:Juli:August:September:Oktober:November:December
- </string>
- <string name="dateTimeMonthShortNames">
- Jan:Feb:Mar:Apr:Maj:Jun:Jul:Aug:Sep:Okt:Nov:Dec
- </string>
- <string name="dateTimeDayFormat">
- [MDAY]
- </string>
- <string name="dateTimeAM">
- AM
- </string>
- <string name="dateTimePM">
- PM
- </string>
- <string name="LocalEstimateUSD">
- US$ [AMOUNT]
- </string>
- <string name="Membership">
- Medlemsskab
- </string>
- <string name="Roles">
- Roller
- </string>
- <string name="Group Identity">
- Gruppe identitet
- </string>
- <string name="Parcel Management">
- Parcel håndtering
- </string>
- <string name="Parcel Identity">
- Parcel identitet
- </string>
- <string name="Parcel Settings">
- Parcel opsætning
- </string>
- <string name="Parcel Powers">
- Parcel beføjelser
- </string>
- <string name="Parcel Access">
- Parcel adgang
- </string>
- <string name="Parcel Content">
- Parcel indhold
- </string>
- <string name="Object Management">
- Objekt håndtering
- </string>
- <string name="Accounting">
- Regnskab
- </string>
- <string name="Notices">
- Beskeder
- </string>
- <string name="Chat" value=" Chat : ">
- Chat
- </string>
- <string name="DeleteItems">
- Slet valgte genstande?
- </string>
- <string name="DeleteItem">
- Slet valgte genstand?
- </string>
- <string name="EmptyOutfitText">
- Der er ingen genstande i dette sæt
- </string>
- <string name="ExternalEditorNotSet">
- Vælg en editor via opsætningen for Ekstern editor.
- </string>
- <string name="ExternalEditorNotFound">
- Kan ikke benytte deb eksterne editor der er angivet.
-Prøv at omkrandse stien til editor med anførselstegn.
-(f.eks. &quot;/stil til min editor&quot; &quot;%s&quot;)
- </string>
- <string name="ExternalEditorCommandParseError">
- Fejl ved håndtering af kommando til ekstern editor.
- </string>
- <string name="ExternalEditorFailedToRun">
- Den eksterne editor kunne ikke startes.
- </string>
- <string name="Esc">
- Esc
- </string>
- <string name="Space">
- Space
- </string>
- <string name="Enter">
- Enter
- </string>
- <string name="Tab">
- Tab
- </string>
- <string name="Ins">
- Ins
- </string>
- <string name="Del">
- Del
- </string>
- <string name="Backsp">
- Backsp
- </string>
- <string name="Shift">
- Shift
- </string>
- <string name="Ctrl">
- Ctrl
- </string>
- <string name="Alt">
- Alt
- </string>
- <string name="CapsLock">
- CapsLock
- </string>
- <string name="Home">
- Hjem
- </string>
- <string name="End">
- End
- </string>
- <string name="PgUp">
- PgUp
- </string>
- <string name="PgDn">
- PgDn
- </string>
- <string name="F1">
- F1
- </string>
- <string name="F2">
- F2
- </string>
- <string name="F3">
- F3
- </string>
- <string name="F4">
- F4
- </string>
- <string name="F5">
- F5
- </string>
- <string name="F6">
- F6
- </string>
- <string name="F7">
- F7
- </string>
- <string name="F8">
- F8
- </string>
- <string name="F9">
- F9
- </string>
- <string name="F10">
- F10
- </string>
- <string name="F11">
- F11
- </string>
- <string name="F12">
- F12
- </string>
- <string name="Add">
- Tilføj
- </string>
- <string name="Subtract">
- Træk fra
- </string>
- <string name="Multiply">
- Multiplicer
- </string>
- <string name="Divide">
- Divider
- </string>
- <string name="PAD_DIVIDE">
- PAD_DIVIDE
- </string>
- <string name="PAD_LEFT">
- PAD_LEFT
- </string>
- <string name="PAD_RIGHT">
- PAD_RIGHT
- </string>
- <string name="PAD_DOWN">
- PAD_DOWN
- </string>
- <string name="PAD_UP">
- PAD_UP
- </string>
- <string name="PAD_HOME">
- PAD_HOME
- </string>
- <string name="PAD_END">
- PAD_END
- </string>
- <string name="PAD_PGUP">
- PAD_PGUP
- </string>
- <string name="PAD_PGDN">
- PAD_PGDN
- </string>
- <string name="PAD_CENTER">
- PAD_CENTER
- </string>
- <string name="PAD_INS">
- PAD_INS
- </string>
- <string name="PAD_DEL">
- PAD_DEL
- </string>
- <string name="PAD_Enter">
- PAD_Enter
- </string>
- <string name="PAD_BUTTON0">
- PAD_BUTTON0
- </string>
- <string name="PAD_BUTTON1">
- PAD_BUTTON1
- </string>
- <string name="PAD_BUTTON2">
- PAD_BUTTON2
- </string>
- <string name="PAD_BUTTON3">
- PAD_BUTTON3
- </string>
- <string name="PAD_BUTTON4">
- PAD_BUTTON4
- </string>
- <string name="PAD_BUTTON5">
- PAD_BUTTON5
- </string>
- <string name="PAD_BUTTON6">
- PAD_BUTTON6
- </string>
- <string name="PAD_BUTTON7">
- PAD_BUTTON7
- </string>
- <string name="PAD_BUTTON8">
- PAD_BUTTON8
- </string>
- <string name="PAD_BUTTON9">
- PAD_BUTTON9
- </string>
- <string name="PAD_BUTTON10">
- PAD_BUTTON10
- </string>
- <string name="PAD_BUTTON11">
- PAD_BUTTON11
- </string>
- <string name="PAD_BUTTON12">
- PAD_BUTTON12
- </string>
- <string name="PAD_BUTTON13">
- PAD_BUTTON13
- </string>
- <string name="PAD_BUTTON14">
- PAD_BUTTON14
- </string>
- <string name="PAD_BUTTON15">
- PAD_BUTTON15
- </string>
- <string name="-">
- -
- </string>
- <string name="=">
- =
- </string>
- <string name="`">
- `
- </string>
- <string name=";">
- ;
- </string>
- <string name="[">
- [
- </string>
- <string name="]">
- ]
- </string>
- <string name="\">
- \
- </string>
- <string name="0">
- 0
- </string>
- <string name="1">
- 1
- </string>
- <string name="2">
- 2
- </string>
- <string name="3">
- 3
- </string>
- <string name="4">
- 4
- </string>
- <string name="5">
- 5
- </string>
- <string name="6">
- 6
- </string>
- <string name="7">
- 7
- </string>
- <string name="8">
- 8
- </string>
- <string name="9">
- 9
- </string>
- <string name="A">
- A
- </string>
- <string name="B">
- B
- </string>
- <string name="C">
- C
- </string>
- <string name="D">
- D
- </string>
- <string name="E">
- E
- </string>
- <string name="F">
- F
- </string>
- <string name="G">
- G
- </string>
- <string name="H">
- H
- </string>
- <string name="I">
- I
- </string>
- <string name="J">
- J
- </string>
- <string name="K">
- K
- </string>
- <string name="L">
- L
- </string>
- <string name="M">
- M
- </string>
- <string name="N">
- N
- </string>
- <string name="O">
- O
- </string>
- <string name="P">
- P
- </string>
- <string name="Q">
- Q
- </string>
- <string name="R">
- R
- </string>
- <string name="S">
- S
- </string>
- <string name="T">
- T
- </string>
- <string name="U">
- U
- </string>
- <string name="V">
- V
- </string>
- <string name="W">
- W
- </string>
- <string name="X">
- X
- </string>
- <string name="Y">
- Y
- </string>
- <string name="Z">
- Z
- </string>
- <string name="BeaconParticle">
- Viser pejlelys for for partikler (blå)
- </string>
- <string name="BeaconPhysical">
- Viser pejlelys for fysiske objekter (grøn)
- </string>
- <string name="BeaconScripted">
- Viser pejlelys for &quot;scriptede&quot; objekter (rød)
- </string>
- <string name="BeaconScriptedTouch">
- Viser pejlelys for &quot;scriptede&quot; objekter med berøringsfunktion (rød)
- </string>
- <string name="BeaconSound">
- Viser pejlelys for lyd (gul)
- </string>
- <string name="BeaconMedia">
- Viser pejlelys for media (hvid)
- </string>
- <string name="ParticleHiding">
- Skjuler partikler
- </string>
-</strings>
diff --git a/indra/newview/skins/steam/xui/de/strings.xml b/indra/newview/skins/steam/xui/de/strings.xml
deleted file mode 100644
index b15cecb146..0000000000
--- a/indra/newview/skins/steam/xui/de/strings.xml
+++ /dev/null
@@ -1,5018 +0,0 @@
-<?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
- 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">
- [APP_NAME] wird geladen...
- </string>
- <string name="StartupClearingCache">
- Cache wird gelöscht...
- </string>
- <string name="StartupInitializingTextureCache">
- Textur-Cache wird initialisiert...
- </string>
- <string name="StartupInitializingVFS">
- VFS wird initialisiert...
- </string>
- <string name="StartupRequireDriverUpdate">
- Grafikinitialisierung fehlgeschlagen. Bitte aktualisieren Sie Ihren Grafiktreiber.
- </string>
- <string name="ProgressRestoring">
- Wird wiederhergestellt...
- </string>
- <string name="ProgressChangingResolution">
- Auflösung wird geändert...
- </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>
- <string name="LoginMaintenance">
- Account wird aktualisiert...
- </string>
- <string name="LoginAttempt">
- Ein früherer Anmeldeversuch ist fehlgeschlagen. Anmeldung, Versuch [NUMBER]
- </string>
- <string name="LoginPrecaching">
- Welt wird geladen...
- </string>
- <string name="LoginInitializingBrowser">
- Integrierter Webbrowser wird initialisiert...
- </string>
- <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>
- <string name="LoginProcessingResponse">
- Antwort wird verarbeitet...
- </string>
- <string name="LoginInitializingWorld">
- Welt wird initialisiert...
- </string>
- <string name="LoginDecodingImages">
- Bilder werden entpackt...
- </string>
- <string name="LoginInitializingQuicktime">
- QuickTime wird initialisiert...
- </string>
- <string name="LoginQuicktimeNotFound">
- QuickTime nicht gefunden - Initialisierung nicht möglich.
- </string>
- <string name="LoginQuicktimeOK">
- QuickTime wurde initialisiert.
- </string>
- <string name="LoginRequestSeedCapGrant">
- Regionsfähigkeiten anfordern...
- </string>
- <string name="LoginRetrySeedCapGrant">
- Regionsfähigkeiten anfordern. Versuch [NUMBER]...
- </string>
- <string name="LoginWaitingForRegionHandshake">
- Region-Handshake...
- </string>
- <string name="LoginConnectingToRegion">
- Region-Verbindung...
- </string>
- <string name="LoginDownloadingClothing">
- Kleidung wird geladen...
- </string>
- <string name="InvalidCertificate">
- Der Server hat ein ungültiges oder korruptes Zertifikate zurückgegeben. Bitte kontaktieren Sie den Grid-Administrator.
- </string>
- <string name="CertInvalidHostname">
- Ein ungültiger Hostname wurde verwendet, um auf den Server zuzugreifen. Bitte überprüfen Sie Ihre SLURL oder den Grid-Hostnamen.
- </string>
- <string name="CertExpired">
- Das vom Grid ausgegebene Zertifikate ist abgelaufen. Bitte überprüfen Sie Ihre Systemuhr oder kontaktieren Sie Ihren Grid-Administrator.
- </string>
- <string name="CertKeyUsage">
- Das vom Server ausgegebene Zertifikat konnte nicht für SSL verwendet werden. Bitte kontaktieren Sie Ihren Grid-Administrator.
- </string>
- <string name="CertBasicConstraints">
- In der Zertifikatskette des Servers befanden sich zu viele Zertifikate. Bitte kontaktieren Sie Ihren Grid-Administrator.
- </string>
- <string name="CertInvalidSignature">
- Die Zertifikatsunterschrift des Gridservers konnte nicht bestätigt werden. Bitte kontaktieren Sie Ihren Grid-Administrator.
- </string>
- <string name="LoginFailedNoNetwork">
- Netzwerkfehler: Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Netzwerkverbindung.
- </string>
- <string name="LoginFailed">
- Anmeldung fehlgeschlagen
- </string>
- <string name="Quit">
- Beenden
- </string>
- <string name="create_account_url">
- http://join.secondlife.com/index.php?sourceid=1206_steam&amp;lang=de-DE
- </string>
- <string name="LoginFailedViewerNotPermitted">
- Mit dem von Ihnen verwendeten Viewer ist der Zugriff auf Second Life nicht mehr möglich. Laden Sie von den folgenden Seite einen neuen Viewer herunter:
-http://secondlife.com/download
-
-Weitere Informationen finden Sie auf der folgenden FAQ-Seite:
-http://secondlife.com/viewer-access-faq
- </string>
- <string name="LoginIntermediateOptionalUpdateAvailable">
- Optionales Viewer-Update verfügbar: [VERSION]
- </string>
- <string name="LoginFailedRequiredUpdate">
- Erforderliches Viewer-Update: [VERSION]
- </string>
- <string name="LoginFailedAlreadyLoggedIn">
- Dieser Agent ist bereits angemeldet.
- </string>
- <string name="LoginFailedAuthenticationFailed">
- Wir bitten um Entschuldigung! Wir konnten Sie nicht anmelden.
-Stellen Sie sicher, dass Sie die richtigen Informationen eingegeben haben:
- * Benutzername (wie robertschmidt12 oder warme.sonne)
- * Kennwort
-Stellen Sie außerdem sicher, dass die Umschaltsperre deaktiviert ist.
- </string>
- <string name="LoginFailedPasswordChanged">
- Ihr Kennwort wurde aus Sicherheitsgründen geändert.
-Gehen Sie zur Seite „Mein Account“ unter http://secondlife.com/password
-und beantworten Sie die Sicherheitsfrage, um Ihr Kennwort zurückzusetzen.
-Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten.
- </string>
- <string name="LoginFailedPasswordReset">
- Aufgrund von Systemänderungen müssen Sie Ihr Kennwort zurücksetzen.
-Gehen Sie zur Seite „Mein Account“ unter http://secondlife.com/password
-und beantworten Sie die Sicherheitsfrage, um Ihr Kennwort zurückzusetzen.
-Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten.
- </string>
- <string name="LoginFailedEmployeesOnly">
- Second Life ist vorübergehend wegen Wartung geschlossen.
-Nur Mitarbeiter können sich anmelden.
-Aktuelle Informationen finden Sie unter www.secondlife.com/status.
- </string>
- <string name="LoginFailedPremiumOnly">
- Die Anmeldung bei Second Life ist vorübergehend eingeschränkt, um sicherzustellen, dass Einwohner, die sich bereits inworld aufhalten, das bestmögliche Erlebnis haben.
-
-Benutzer mit kostenlosen Konten können sich während dieses Zeitraums nicht bei Second Life anmelden, damit die Kapazität Benutzern zur Verfügung steht, die ein gebührenpflichtiges Premium-Konto besitzen.
- </string>
- <string name="LoginFailedComputerProhibited">
- Der Zugriff auf Second Life ist von diesem Computer aus nicht möglich.
-Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an
-support@secondlife.com.
- </string>
- <string name="LoginFailedAcountSuspended">
- Ihr Konto ist erst ab
-[TIME] Pacific Time wieder verfügbar.
- </string>
- <string name="LoginFailedAccountDisabled">
- Ihre Anfrage kann derzeit nicht bearbeitet werden.
-Wenden Sie sich unter http://secondlife.com/support an den Second Life-Support.
-Wenn Sie Ihr Kennwort nicht ändern können, rufen Sie die US-Nummer (866) 476-9763 an.
- </string>
- <string name="LoginFailedTransformError">
- Nicht übereinstimmende Daten bei der Anmeldung festgestellt.
-Wenden Sie sich an support@secondlife.com.
- </string>
- <string name="LoginFailedAccountMaintenance">
- An Ihrem Konto werden gerade kleinere Wartungsarbeiten durchgeführt.
-Ihr Konto ist erst ab
-[TIME] Pacific Time wieder verfügbar.
-Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
- </string>
- <string name="LoginFailedPendingLogoutFault">
- Abmeldeanforderung führte zu einem Simulatorfehler.
- </string>
- <string name="LoginFailedPendingLogout">
- Das System meldet Sie gerade ab.
-Ihr Konto ist erst ab
-[TIME] Pacific Time wieder verfügbar.
- </string>
- <string name="LoginFailedUnableToCreateSession">
- Es kann keine gültige Sitzung erstellt werden.
- </string>
- <string name="LoginFailedUnableToConnectToSimulator">
- Es kann keine Simulatorverbindung hergestellt werden.
- </string>
- <string name="LoginFailedRestrictedHours">
- Mit Ihrem Konto ist der Zugriff auf Second Life
-nur zwischen [START] und [END] Pacific Time möglich.
-Schauen Sie während dieses Zeitraums vorbei.
-Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
- </string>
- <string name="LoginFailedIncorrectParameters">
- Falsche Parameter.
-Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
- </string>
- <string name="LoginFailedFirstNameNotAlphanumeric">
- Vorname muss alphanumerisch sein.
-Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
- </string>
- <string name="LoginFailedLastNameNotAlphanumeric">
- Nachname muss alphanumerisch sein.
-Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
- </string>
- <string name="LogoutFailedRegionGoingOffline">
- Die Region wird gerade offline geschaltet.
-Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
- </string>
- <string name="LogoutFailedAgentNotInRegion">
- Agent nicht in Region.
-Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
- </string>
- <string name="LogoutFailedPendingLogin">
- Die Region war gerade dabei, eine andere Sitzung anzumelden.
-Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
- </string>
- <string name="LogoutFailedLoggingOut">
- Die Region war gerade dabei, die vorherige Sitzung abzumelden.
-Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
- </string>
- <string name="LogoutFailedStillLoggingOut">
- Die Region ist noch immer dabei, die vorherige Sitzung abzumelden.
-Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
- </string>
- <string name="LogoutSucceeded">
- Die Region hat soeben die letzte Sitzung abgemeldet.
-Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
- </string>
- <string name="LogoutFailedLogoutBegun">
- Die Region hat den Abmeldevorgang gestartet.
-Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
- </string>
- <string name="LoginFailedLoggingOutSession">
- Das System hat begonnen, Ihre letzte Sitzung abzumelden.
-Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
- </string>
- <string name="AgentLostConnection">
- In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung.
- </string>
- <string name="SavingSettings">
- Ihr Einstellungen werden gespeichert...
- </string>
- <string name="LoggingOut">
- Abmeldung erfolgt...
- </string>
- <string name="ShuttingDown">
- Programm wird beendet...
- </string>
- <string name="YouHaveBeenDisconnected">
- Die Verbindung zu der Region ist abgebrochen.
- </string>
- <string name="SentToInvalidRegion">
- Sie wurden in eine ungültige Region geschickt.
- </string>
- <string name="TestingDisconnect">
- Verbindungsabbruch wird getestet
- </string>
- <string name="TooltipPerson">
- Person
- </string>
- <string name="TooltipNoName">
- (namenlos)
- </string>
- <string name="TooltipOwner">
- Eigentümer:
- </string>
- <string name="TooltipPublic">
- Öffentlich
- </string>
- <string name="TooltipIsGroup">
- (Gruppe)
- </string>
- <string name="TooltipForSaleL$">
- Zum Verkauf: [AMOUNT] L$
- </string>
- <string name="TooltipFlagGroupBuild">
- Gruppenbau
- </string>
- <string name="TooltipFlagNoBuild">
- Bauen aus
- </string>
- <string name="TooltipFlagNoEdit">
- Gruppenbau
- </string>
- <string name="TooltipFlagNotSafe">
- Unsicher
- </string>
- <string name="TooltipFlagNoFly">
- Fliegen aus
- </string>
- <string name="TooltipFlagGroupScripts">
- Gruppenskripte
- </string>
- <string name="TooltipFlagNoScripts">
- Skripte aus
- </string>
- <string name="TooltipLand">
- Land:
- </string>
- <string name="TooltipMustSingleDrop">
- Sie können nur ein einzelnes Objekt hierher ziehen
- </string>
- <string name="TooltipPrice" value="[AMOUNT] L$"/>
- <string name="TooltipOutboxDragToWorld">
- Sie können Artikel nicht in Ihrer Händler-Outbox rezzen
- </string>
- <string name="TooltipOutboxNoTransfer">
- Einer oder mehrere dieser Artikel können nicht verkauft oder übertragen werden.
- </string>
- <string name="TooltipOutboxNotInInventory">
- Nur Artikel direkt aus Ihrem Inventar können in Ihre Händler-Outbox gelegt werden
- </string>
- <string name="TooltipOutboxWorn">
- Artikel, die Sie tragen, können nicht in Ihre Händler-Outbox gelegt werden.
- </string>
- <string name="TooltipOutboxCallingCard">
- Sie können keine Visitenkarten in Ihre Händler-Outbox legen
- </string>
- <string name="TooltipOutboxFolderLevels">
- Tiefe der verschachtelten Ordner überschreitet 3
- </string>
- <string name="TooltipOutboxTooManyFolders">
- Anzahl von Unterordnern im obersten Ordner überschreitet 20
- </string>
- <string name="TooltipOutboxTooManyObjects">
- Anzahl von Artikeln im obersten Ordner überschreitet 200
- </string>
- <string name="TooltipDragOntoOwnChild">
- Sie können einen Ordner nicht in einen seiner untergeordneten Ordner verschieben
- </string>
- <string name="TooltipDragOntoSelf">
- Sie können einen Ordner nicht in sich selbst verschieben
- </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="TooltipAgentInspect">
- Mehr über diesen Einwohner
- </string>
- <string name="TooltipAgentMute">
- Klicken, um diesen Einwohner stummzuschalten
- </string>
- <string name="TooltipAgentUnmute">
- Klicken, um diesen Einwohner freizuschalten
- </string>
- <string name="TooltipAgentIM">
- Klicken, um diesem Einwohner eine IM zu schicken.
- </string>
- <string name="TooltipAgentPay">
- Klicken, um diesen Einwohner zu bezahlen
- </string>
- <string name="TooltipAgentOfferTeleport">
- Klicken, um diesem Einwohner einen Teleport anzubieten.
- </string>
- <string name="TooltipAgentRequestFriend">
- Klicken, um diesem Einwohner ein Freundschaftsangebot zu schicken.
- </string>
- <string name="TooltipGroupUrl">
- Anklicken, um Beschreibung der Gruppe anzuzeigen
- </string>
- <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="SLappAgentMute">
- Stummschalten
- </string>
- <string name="SLappAgentUnmute">
- Stummschaltung aufheben
- </string>
- <string name="SLappAgentIM">
- IM
- </string>
- <string name="SLappAgentPay">
- Bezahlen
- </string>
- <string name="SLappAgentOfferTeleport">
- Teleportangebot an
- </string>
- <string name="SLappAgentRequestFriend">
- Freundschaftsangebot
- </string>
- <string name="BUTTON_CLOSE_DARWIN">
- Schließen (⌘W)
- </string>
- <string name="BUTTON_CLOSE_WIN">
- Schließen (Strg+W)
- </string>
- <string name="BUTTON_CLOSE_CHROME">
- Schließen
- </string>
- <string name="BUTTON_RESTORE">
- Wiederherstellen
- </string>
- <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>
- <string name="ReleaseNotes">
- Versionshinweise
- </string>
- <string name="RELEASE_NOTES_BASE_URL">
- http://wiki.secondlife.com/wiki/Release_Notes/
- </string>
- <string name="LoadingData">
- Wird geladen...
- </string>
- <string name="AvatarNameNobody">
- (niemand)
- </string>
- <string name="AvatarNameWaiting">
- (wartet)
- </string>
- <string name="AvatarNameMultiple">
- (mehrere)
- </string>
- <string name="GroupNameNone">
- (keiner)
- </string>
- <string name="AvalineCaller">
- Avaline-Anfrufer [ORDER]
- </string>
- <string name="AssetErrorNone">
- Kein Fehler
- </string>
- <string name="AssetErrorRequestFailed">
- Asset-Anforderung: fehlgeschlagen
- </string>
- <string name="AssetErrorNonexistentFile">
- Asset-Anforderung: Datei existiert nicht
- </string>
- <string name="AssetErrorNotInDatabase">
- Asset-Anforderung: Asset in Datenbank nicht gefunden
- </string>
- <string name="AssetErrorEOF">
- Ende der Datei
- </string>
- <string name="AssetErrorCannotOpenFile">
- Datei kann nicht geöffnet werden
- </string>
- <string name="AssetErrorFileNotFound">
- Datei nicht gefunden
- </string>
- <string name="AssetErrorTCPTimeout">
- Zeitüberschreitung bei Dateiübertragung
- </string>
- <string name="AssetErrorCircuitGone">
- Verbindung verloren
- </string>
- <string name="AssetErrorPriceMismatch">
- Viewer und Server sind sich nicht über Preis einig
- </string>
- <string name="AssetErrorUnknownStatus">
- Status unbekannt
- </string>
- <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="symbolic folder link">
- Link zu Ordner
- </string>
- <string name="mesh">
- mesh
- </string>
- <string name="AvatarEditingAppearance">
- (Aussehen wird bearbeitet)
- </string>
- <string name="AvatarAway">
- Abwesend
- </string>
- <string name="AvatarBusy">
- Beschäftigt
- </string>
- <string name="AvatarMuted">
- Ignoriert
- </string>
- <string name="anim_express_afraid">
- Ängstlich
- </string>
- <string name="anim_express_anger">
- Verärgert
- </string>
- <string name="anim_away">
- Abwesend
- </string>
- <string name="anim_backflip">
- Rückwärtssalto
- </string>
- <string name="anim_express_laugh">
- Lachkrampf
- </string>
- <string name="anim_express_toothsmile">
- Grinsen
- </string>
- <string name="anim_blowkiss">
- Kusshand
- </string>
- <string name="anim_express_bored">
- Gelangweilt
- </string>
- <string name="anim_bow">
- Verbeugen
- </string>
- <string name="anim_clap">
- Klatschen
- </string>
- <string name="anim_courtbow">
- Diener
- </string>
- <string name="anim_express_cry">
- Weinen
- </string>
- <string name="anim_dance1">
- Tanz 1
- </string>
- <string name="anim_dance2">
- Tanz 2
- </string>
- <string name="anim_dance3">
- Tanz 3
- </string>
- <string name="anim_dance4">
- Tanz 4
- </string>
- <string name="anim_dance5">
- Tanz 5
- </string>
- <string name="anim_dance6">
- Tanz 6
- </string>
- <string name="anim_dance7">
- Tanz 7
- </string>
- <string name="anim_dance8">
- Tanz 8
- </string>
- <string name="anim_express_disdain">
- Verachten
- </string>
- <string name="anim_drink">
- Trinken
- </string>
- <string name="anim_express_embarrased">
- Verlegen
- </string>
- <string name="anim_angry_fingerwag">
- Drohen
- </string>
- <string name="anim_fist_pump">
- Faust pumpen
- </string>
- <string name="anim_yoga_float">
- Yogaflieger
- </string>
- <string name="anim_express_frown">
- Stirnrunzeln
- </string>
- <string name="anim_impatient">
- Ungeduldig
- </string>
- <string name="anim_jumpforjoy">
- Freudensprung
- </string>
- <string name="anim_kissmybutt">
- LMA
- </string>
- <string name="anim_express_kiss">
- Küssen
- </string>
- <string name="anim_laugh_short">
- Lachen
- </string>
- <string name="anim_musclebeach">
- Posen
- </string>
- <string name="anim_no_unhappy">
- Nein (Bedauernd)
- </string>
- <string name="anim_no_head">
- Nein
- </string>
- <string name="anim_nyanya">
- Ällabätsch
- </string>
- <string name="anim_punch_onetwo">
- Eins-Zwei-Punch
- </string>
- <string name="anim_express_open_mouth">
- Mund offen
- </string>
- <string name="anim_peace">
- Friede
- </string>
- <string name="anim_point_you">
- Auf anderen zeigen
- </string>
- <string name="anim_point_me">
- Auf mich zeigen
- </string>
- <string name="anim_punch_l">
- Linker Haken
- </string>
- <string name="anim_punch_r">
- Rechter Haken
- </string>
- <string name="anim_rps_countdown">
- SSP zählen
- </string>
- <string name="anim_rps_paper">
- SSP Papier
- </string>
- <string name="anim_rps_rock">
- SSP Stein
- </string>
- <string name="anim_rps_scissors">
- SSP Schere
- </string>
- <string name="anim_express_repulsed">
- Angewidert
- </string>
- <string name="anim_kick_roundhouse_r">
- Rundkick
- </string>
- <string name="anim_express_sad">
- Traurig
- </string>
- <string name="anim_salute">
- Salutieren
- </string>
- <string name="anim_shout">
- Rufen
- </string>
- <string name="anim_express_shrug">
- Schulterzucken
- </string>
- <string name="anim_express_smile">
- Lächeln
- </string>
- <string name="anim_smoke_idle">
- Zigarette halten
- </string>
- <string name="anim_smoke_inhale">
- Rauchen
- </string>
- <string name="anim_smoke_throw_down">
- Zigarette wegwerfen
- </string>
- <string name="anim_express_surprise">
- Überraschung
- </string>
- <string name="anim_sword_strike_r">
- Schwerthieb
- </string>
- <string name="anim_angry_tantrum">
- Wutanfall
- </string>
- <string name="anim_express_tongue_out">
- Zunge rausstrecken
- </string>
- <string name="anim_hello">
- Winken
- </string>
- <string name="anim_whisper">
- Flüstern
- </string>
- <string name="anim_whistle">
- Pfeifen
- </string>
- <string name="anim_express_wink">
- Zwinkern
- </string>
- <string name="anim_wink_hollywood">
- Zwinkern (Hollywood)
- </string>
- <string name="anim_express_worry">
- Sorgenvoll
- </string>
- <string name="anim_yes_happy">
- Ja (Erfreut)
- </string>
- <string name="anim_yes_head">
- Ja
- </string>
- <string name="multiple_textures">
- Mehrfach
- </string>
- <string name="texture_loading">
- Wird geladen...
- </string>
- <string name="worldmap_offline">
- Offline
- </string>
- <string name="worldmap_item_tooltip_format">
- [PRICE] L$ für [AREA] m²
- </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">
- Generell
- </string>
- <string name="SIM_ACCESS_MATURE">
- Moderat
- </string>
- <string name="SIM_ACCESS_ADULT">
- Adult
- </string>
- <string name="SIM_ACCESS_DOWN">
- Offline
- </string>
- <string name="SIM_ACCESS_MIN">
- Unbekannt
- </string>
- <string name="land_type_unknown">
- (unbekannt)
- </string>
- <string name="Estate / Full Region">
- Grundstück / Vollständige Region
- </string>
- <string name="Estate / Homestead">
- Grundbesitz/Homestead
- </string>
- <string name="Mainland / Homestead">
- Mainland/Homestead
- </string>
- <string name="Mainland / Full Region">
- Mainland / Vollständige Region
- </string>
- <string name="all_files">
- Alle Dateien
- </string>
- <string name="sound_files">
- Sounds
- </string>
- <string name="animation_files">
- Animationen
- </string>
- <string name="image_files">
- Bilder
- </string>
- <string name="save_file_verb">
- Speichern
- </string>
- <string name="load_file_verb">
- Laden
- </string>
- <string name="targa_image_files">
- Targa-Bilder
- </string>
- <string name="bitmap_image_files">
- Bitmap-Bilder
- </string>
- <string name="avi_movie_file">
- AVI-Filmdatei
- </string>
- <string name="xaf_animation_file">
- XAF Anim-Datei
- </string>
- <string name="xml_file">
- XML-Datei
- </string>
- <string name="raw_file">
- RAW-Datei
- </string>
- <string name="compressed_image_files">
- Komprimierte Bilder
- </string>
- <string name="load_files">
- Dateien laden
- </string>
- <string name="choose_the_directory">
- Verzeichnis auswählen
- </string>
- <string name="script_files">
- Skripts
- </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="physics">
- Physik
- </string>
- <string name="invalid">
- ungültig
- </string>
- <string name="none">
- keine
- </string>
- <string name="shirt_not_worn">
- Hemd nicht getragen
- </string>
- <string name="pants_not_worn">
- Hosen nicht getragen
- </string>
- <string name="shoes_not_worn">
- Schuhe nicht getragen
- </string>
- <string name="socks_not_worn">
- Socken nicht getragen
- </string>
- <string name="jacket_not_worn">
- Jacke nicht getragen
- </string>
- <string name="gloves_not_worn">
- Handschuhe nicht getragen
- </string>
- <string name="undershirt_not_worn">
- Unterhemd nicht getragen
- </string>
- <string name="underpants_not_worn">
- Unterhose nicht getragen
- </string>
- <string name="skirt_not_worn">
- Rock nicht getragen
- </string>
- <string name="alpha_not_worn">
- Alpha nicht getragen
- </string>
- <string name="tattoo_not_worn">
- Tätowierung nicht getragen
- </string>
- <string name="physics_not_worn">
- Physik nicht getragen
- </string>
- <string name="invalid_not_worn">
- ungültig
- </string>
- <string name="create_new_shape">
- Neue Form/Gestalt erstellen
- </string>
- <string name="create_new_skin">
- Neue Haut erstellen
- </string>
- <string name="create_new_hair">
- Neue Haare erstellen
- </string>
- <string name="create_new_eyes">
- Neue Augen erstellen
- </string>
- <string name="create_new_shirt">
- Neues Hemd erstellen
- </string>
- <string name="create_new_pants">
- Neue Hose erstellen
- </string>
- <string name="create_new_shoes">
- Neue Schuhe erstellen
- </string>
- <string name="create_new_socks">
- Neue Socken erstellen
- </string>
- <string name="create_new_jacket">
- Neue Jacke erstellen
- </string>
- <string name="create_new_gloves">
- Neue Handschuhe erstellen
- </string>
- <string name="create_new_undershirt">
- Neues Unterhemd erstellen
- </string>
- <string name="create_new_underpants">
- Neue Unterhose erstellen
- </string>
- <string name="create_new_skirt">
- Neuer Rock erstellen
- </string>
- <string name="create_new_alpha">
- Neue Alpha erstellen
- </string>
- <string name="create_new_tattoo">
- Neue Tätowierung erstellen
- </string>
- <string name="create_new_physics">
- Neue Physik erstellen
- </string>
- <string name="create_new_invalid">
- ungültig
- </string>
- <string name="NewWearable">
- Neue/r/s [WEARABLE_ITEM]
- </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">
- Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/all/[SEARCH_TERM] Suche].
- </string>
- <string name="PlacesNoMatchingItems">
- Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/places/[SEARCH_TERM] Suche].
- </string>
- <string name="FavoritesNoMatchingItems">
- Landmarke hier hin ziehen, um diese hinzuzufügen.
- </string>
- <string name="InventoryNoTexture">
- Sie haben keine Kopie dieser Textur in Ihrem Inventar.
- </string>
- <string name="InventoryInboxNoItems">
- Einkäufe aus dem Marktplatz erscheinen hier. Sie können diese dann zur Verwendung in Ihr Inventar ziehen.
- </string>
- <string name="MarketplaceURL">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
- </string>
- <string name="MarketplaceURL_CreateStore">
- http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
- </string>
- <string name="MarketplaceURL_Dashboard">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
- </string>
- <string name="MarketplaceURL_Imports">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
- </string>
- <string name="MarketplaceURL_LearnMore">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
- </string>
- <string name="InventoryOutboxNotMerchantTitle">
- Jeder kann Artikel im Marktplatz verkaufen.
- </string>
- <string name="InventoryOutboxNotMerchantTooltip"/>
- <string name="InventoryOutboxNotMerchant">
- Wenn Sie als Händler aktiv werden möchten, müssen Sie einen [[MARKETPLACE_CREATE_STORE_URL] Laden im Marktplatz erstellen].
- </string>
- <string name="InventoryOutboxNoItemsTitle">
- Ihre Outbox ist leer.
- </string>
- <string name="InventoryOutboxNoItemsTooltip"/>
- <string name="InventoryOutboxNoItems">
- Ziehen Sie Ordner in dien Bereich und klicken Sie auf „In Marktplatz übertragen“, um sie im [[MARKETPLACE_DASHBOARD_URL] Marktplatz] zum Verkauf anzubieten.
- </string>
- <string name="Marketplace Error None">
- Keine Fehler
- </string>
- <string name="Marketplace Error Not Merchant">
- Fehler: Bevor Sie Artikel in den Marktplatz übertragen können, müssen Sie sich als Händler registrieren (kostenlos).
- </string>
- <string name="Marketplace Error Empty Folder">
- Fehler: Dieser Ordner ist leer.
- </string>
- <string name="Marketplace Error Unassociated Products">
- Fehler: Dieser Artikel konnte nicht hochgeladen werden, da in Ihrem Händlerkonto zu viele Artikel nicht mit Produkten verknüpft sind. Um diesen Fehler zu beheben, melden Sie sich auf der Marktplatz-Website an und reduzieren Sie die Anzahl von Artikeln, die nicht mit Produkten verknüpft sind.
- </string>
- <string name="Marketplace Error Object Limit">
- Fehler: Dieser Artikel enthält zu viele Objekte. Beheben Sie diesen Fehler, indem Sie Objekte zusammen in Behältern verpacken, um die Objektanzahl auf unter 200 zu verringern.
- </string>
- <string name="Marketplace Error Folder Depth">
- Fehler: Dieser Artikel enthält zu viele verschachtelte Ordnerebenen. Organisieren Sie ihn neu, sodass maximal drei verschachtelte Ordnerebenen vorhanden sind.
- </string>
- <string name="Marketplace Error Unsellable Item">
- Fehler: Dieser Artikel kann nicht im Marktplatz verkauft werden.
- </string>
- <string name="Marketplace Error Internal Import">
- Fehler: Bei diesem Artikel ist ein Problem aufgetreten. Versuchen Sie es später erneut.
- </string>
- <string name="Open landmarks">
- Landmarken öffnen
- </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="ActiveGesture" value="[GESLABEL] (aktiviert)"/>
- <string name="PermYes">
- Ja
- </string>
- <string name="PermNo">
- Nein
- </string>
- <string name="Chat Message" 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="GestureActionNone" value="Keine"/>
- <string name="HelloAvatar" value=" Hallo Avatar!"/>
- <string name="ViewAllGestures" value=" Alle anzeigen &gt;&gt;"/>
- <string name="GetMoreGestures" value="Mehr &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 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">
- Meine Favoriten
- </string>
- <string name="InvFolder favorite">
- Meine Favoriten
- </string>
- <string name="InvFolder Current Outfit">
- Aktuelles Outfit
- </string>
- <string name="InvFolder Initial Outfits">
- Ursprüngliche Outfits
- </string>
- <string name="InvFolder My Outfits">
- Meine Outfits
- </string>
- <string name="InvFolder Accessories">
- Zubehör
- </string>
- <string name="InvFolder Meshes">
- Netze
- </string>
- <string name="InvFolder Friends">
- Freunde
- </string>
- <string name="InvFolder All">
- Alle
- </string>
- <string name="no_attachments">
- Keine Anhänge getragen
- </string>
- <string name="Attachments remain">
- Anhänge (noch [COUNT] Positionen frei)
- </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">
- Hell
- </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="Neck">
- Hals
- </string>
- <string name="Avatar Center">
- Avatar-Mitte
- </string>
- <string name="Invalid Attachment">
- Ungültige Stelle für Anhang
- </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">
- Mitte
- </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="GroupPlanningDate">
- [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
- </string>
- <string name="GroupIndividualShare" value=" Gruppenanteil Einzelanteil"/>
- <string name="GroupColumn" value="Gruppe"/>
- <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="Anyone">
- jeder
- </string>
- <string name="RegionInfoError">
- Fehler
- </string>
- <string name="RegionInfoAllEstatesOwnedBy">
- alle Grundbesitze gehören [OWNER]
- </string>
- <string name="RegionInfoAllEstatesYouOwn">
- alle Grundbesitze, die Sie besitzen
- </string>
- <string name="RegionInfoAllEstatesYouManage">
- alle Grundbesitze, 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="PanelContentsTooltip">
- Objektinhalt
- </string>
- <string name="PanelContentsNewScript">
- Neues Skript
- </string>
- <string name="BusyModeResponseDefault">
- Der Einwohner/Die Einwohnerin ist „beschäftigt”, d.h. er/sie möchte im Moment nicht gestört werden. Ihre Nachricht wird dem Einwohner/der Einwohnerin als IM angezeigt, und kann später beantwortet werden.
- </string>
- <string name="MuteByName">
- (Nach Namen)
- </string>
- <string name="MuteAgent">
- (Einwohner)
- </string>
- <string name="MuteObject">
- (Objekt)
- </string>
- <string name="MuteGroup">
- (Gruppe)
- </string>
- <string name="MuteExternal">
- (Extern)
- </string>
- <string name="RegionNoCovenant">
- Für diesen Grundbesitz liegt kein Vertrag vor.
- </string>
- <string name="RegionNoCovenantOtherOwner">
- Für diesen Grundbesitz liegt kein Vertrag vor. Das Land auf diesem Grundbesitz wird vom Grundbesitzer und nicht von Linden Lab verkauft. Für Informationen zum Verkauf setzen Sie sich bitte mit dem Grundbesitzer in Verbindung.
- </string>
- <string name="covenant_last_modified" value="Zuletzt geändert: "/>
- <string name="none_text" value=" (keiner) "/>
- <string name="never_text" value=" (nie) "/>
- <string name="GroupOwned">
- In Gruppenbesitz
- </string>
- <string name="Public">
- Öffentlich
- </string>
- <string name="LocalSettings">
- Lokale Einstellungen
- </string>
- <string name="RegionSettings">
- Regionseinstellungen
- </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="NoAvatarPicksClassifiedsText">
- Der Einwohner hat keine Auswahl oder Anzeigen
- </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="InvOfferDecline">
- Sie lehnen [DESC] von &lt;nolink&gt;[NAME]&lt;/nolink&gt; ab.
- </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="GroupMoneyDate">
- [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
- </string>
- <string name="ViewerObjectContents">
- Inhalte
- </string>
- <string name="AcquiredItems">
- Erworbene Artikel
- </string>
- <string name="Cancel">
- Abbrechen
- </string>
- <string name="UploadingCosts">
- Das Hochladen von [NAME] kostet [AMOUNT] L$
- </string>
- <string name="BuyingCosts">
- Die Kosten betragen: [AMOUNT] L$
- </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">
- ⌃
- </string>
- <string name="accel-mac-command">
- ⌘
- </string>
- <string name="accel-mac-option">
- ⌥
- </string>
- <string name="accel-mac-shift">
- ⇧
- </string>
- <string name="accel-win-control">
- Strg+
- </string>
- <string name="accel-win-alt">
- Alt+
- </string>
- <string name="accel-win-shift">
- Umschalt+
- </string>
- <string name="FileSaved">
- Datei wurde gespeichert
- </string>
- <string name="Receiving">
- Daten werden empfangen
- </string>
- <string name="AM">
- Uhr
- </string>
- <string name="PM">
- Uhr
- </string>
- <string name="PST">
- PST
- </string>
- <string name="PDT">
- PDT
- </string>
- <string name="Direction_Forward">
- Vorwärts
- </string>
- <string name="Direction_Left">
- Links
- </string>
- <string name="Direction_Right">
- Rechts
- </string>
- <string name="Direction_Back">
- Zurück
- </string>
- <string name="Direction_North">
- Norden
- </string>
- <string name="Direction_South">
- Süden
- </string>
- <string name="Direction_West">
- Westen
- </string>
- <string name="Direction_East">
- Osten
- </string>
- <string name="Direction_Up">
- Nach oben
- </string>
- <string name="Direction_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="Rental">
- Vermietung
- </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="Breast Physics Mass">
- Brust – Masse
- </string>
- <string name="Breast Physics Smoothing">
- Brust – Glättung
- </string>
- <string name="Breast Physics Gravity">
- Brust – Schwerkraft
- </string>
- <string name="Breast Physics Drag">
- Brust – Luftwiderstand
- </string>
- <string name="Breast Physics InOut Max Effect">
- Max. Effekt
- </string>
- <string name="Breast Physics InOut Spring">
- Federn
- </string>
- <string name="Breast Physics InOut Gain">
- Verstärkung
- </string>
- <string name="Breast Physics InOut Damping">
- Dämpfung
- </string>
- <string name="Breast Physics UpDown Max Effect">
- Max. Effekt
- </string>
- <string name="Breast Physics UpDown Spring">
- Federn
- </string>
- <string name="Breast Physics UpDown Gain">
- Verstärkung
- </string>
- <string name="Breast Physics UpDown Damping">
- Dämpfung
- </string>
- <string name="Breast Physics LeftRight Max Effect">
- Max. Effekt
- </string>
- <string name="Breast Physics LeftRight Spring">
- Federn
- </string>
- <string name="Breast Physics LeftRight Gain">
- Verstärkung
- </string>
- <string name="Breast Physics LeftRight Damping">
- Dämpfung
- </string>
- <string name="Belly Physics Mass">
- Bauch – Masse
- </string>
- <string name="Belly Physics Smoothing">
- Bauch – Glättung
- </string>
- <string name="Belly Physics Gravity">
- Bauch – Schwerkraft
- </string>
- <string name="Belly Physics Drag">
- Bauch – Luftwiderstand
- </string>
- <string name="Belly Physics UpDown Max Effect">
- Max. Effekt
- </string>
- <string name="Belly Physics UpDown Spring">
- Federn
- </string>
- <string name="Belly Physics UpDown Gain">
- Verstärkung
- </string>
- <string name="Belly Physics UpDown Damping">
- Dämpfung
- </string>
- <string name="Butt Physics Mass">
- Po – Masse
- </string>
- <string name="Butt Physics Smoothing">
- Po – Glättung
- </string>
- <string name="Butt Physics Gravity">
- Po – Schwerkraft
- </string>
- <string name="Butt Physics Drag">
- Po – Luftwiderstand
- </string>
- <string name="Butt Physics UpDown Max Effect">
- Max. Effekt
- </string>
- <string name="Butt Physics UpDown Spring">
- Federn
- </string>
- <string name="Butt Physics UpDown Gain">
- Verstärkung
- </string>
- <string name="Butt Physics UpDown Damping">
- Dämpfung
- </string>
- <string name="Butt Physics LeftRight Max Effect">
- Max. Effekt
- </string>
- <string name="Butt Physics LeftRight Spring">
- Federn
- </string>
- <string name="Butt Physics LeftRight Gain">
- Verstärkung
- </string>
- <string name="Butt Physics LeftRight Damping">
- Dämpfung
- </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="Butt Gravity">
- Po – Schwerkraft
- </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">
- Transparent
- </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>
- <string name="High Heels">
- Hohe Absätze
- </string>
- <string name="High Jaw">
- Hoch
- </string>
- <string name="High Platforms">
- Hohe Plattformsohlen
- </string>
- <string name="High and Tight">
- Hoch und eng
- </string>
- <string name="Higher">
- Höhere
- </string>
- <string name="Hip Length">
- Länge der Hüfte
- </string>
- <string name="Hip Width">
- Breite der Hüfte
- </string>
- <string name="In">
- In
- </string>
- <string name="In Shdw Color">
- Farbe Innenseite
- </string>
- <string name="In Shdw Opacity">
- Deckkraft: innen
- </string>
- <string name="Inner Eye Corner">
- Ecke: Nasenseite
- </string>
- <string name="Inner Eye Shadow">
- Innenlid
- </string>
- <string name="Inner Shadow">
- Innenlid
- </string>
- <string name="Jacket Length">
- Jackenlänge
- </string>
- <string name="Jacket Wrinkles">
- Jackenfalten
- </string>
- <string name="Jaw Angle">
- Kinnansatz
- </string>
- <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: Oben
- </string>
- <string name="Out Shdw Opacity">
- Deckkraft: Oben
- </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">
- Klein
- </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">
- Groß
- </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="LocationCtrlAdultIconTooltip">
- Adult-Region
- </string>
- <string name="LocationCtrlModerateIconTooltip">
- Moderate Region
- </string>
- <string name="LocationCtrlGeneralIconTooltip">
- Generelle Region
- </string>
- <string name="LocationCtrlSeeAVsTooltip">
- Avatare sichtbar; Chat außerhalb dieser Parzelle gestattet
- </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="ItemsComingInTooFastFrom">
- [APP_NAME]: Zuviele Objekte auf einmal von [FROM_NAME]. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar.
- </string>
- <string name="ItemsComingInTooFast">
- [APP_NAME]: Zuviele Objekte auf einmal. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar.
- </string>
- <string name="IM_logging_string">
- -- Instant-Message-Protokoll aktiviert --
- </string>
- <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">
- An
- </string>
- <string name="IM_moderator_label">
- (Moderator)
- </string>
- <string name="Saved_message">
- (Gespeichert am [LONG_TIMESTAMP])
- </string>
- <string name="IM_unblock_only_groups_friends">
- Wenn Sie diese Meldung sehen, müssen Sie unter „Einstellungen“ &gt; „Privatsphäre“ die Option „Nur IMs und Anrufe von Freunden oder Gruppen durchstellen“ deaktivieren.
- </string>
- <string name="answered_call">
- Ihr Anruf wurde entgegengenommen
- </string>
- <string name="you_started_call">
- Sie haben einen Voice-Anruf begonnen
- </string>
- <string name="you_joined_call">
- Sie sind dem Gespräch beigetreten
- </string>
- <string name="name_started_call">
- [NAME] hat einen Voice-Anruf begonnen
- </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="conference-title-incoming">
- Konferenz mit [AGENT_NAME]
- </string>
- <string name="inventory_item_offered-im">
- Inventarobjekt angeboten
- </string>
- <string name="share_alert">
- Objekte aus dem Inventar hier her ziehen
- </string>
- <string name="no_session_message">
- (IM-Session nicht vorhanden)
- </string>
- <string name="only_user_message">
- Sie sind der einzige Benutzer in dieser Sitzung.
- </string>
- <string name="offline_message">
- [NAME] ist offline.
- </string>
- <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>
- <string name="insufficient_perms_error">
- Sie sind dazu nicht berechtigt.
- </string>
- <string name="session_does_not_exist_error">
- Die Sitzung ist abgelaufen
- </string>
- <string name="no_ability_error">
- Sie besitzen diese Fähigkeit nicht.
- </string>
- <string name="no_ability">
- Sie besitzen diese Fähigkeit nicht.
- </string>
- <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="unread_chat_single">
- [SOURCES] hat etwas Neues gesagt
- </string>
- <string name="unread_chat_multiple">
- [SOURCES] haben etwas Neues gesagt
- </string>
- <string name="session_initialization_timed_out_error">
- Die Initialisierung der Sitzung ist fehlgeschlagen
- </string>
- <string name="Home position set.">
- Position für Zuhause festgelegt.
- </string>
- <string name="voice_morphing_url">
- http://secondlife.com/landing/voicemorphing
- </string>
- <string name="paid_you_ldollars">
- [NAME] hat Ihnen [REASON] [AMOUNT] L$ bezahlt.
- </string>
- <string name="paid_you_ldollars_no_reason">
- [NAME] hat Ihnen [AMOUNT] L$ bezahlt.
- </string>
- <string name="you_paid_ldollars">
- Sie haben [REASON] [AMOUNT] L$ an [NAME] bezahlt.
- </string>
- <string name="you_paid_ldollars_no_info">
- Sie haben [AMOUNT] L$ bezahlt.
- </string>
- <string name="you_paid_ldollars_no_reason">
- Sie haben [AMOUNT] L$ an [NAME] bezahlt.
- </string>
- <string name="you_paid_ldollars_no_name">
- Sie haben [REASON] [AMOUNT] L$ bezahlt.
- </string>
- <string name="you_paid_failure_ldollars">
- Sie haben [NAME] [AMOUNT] L$ [REASON] nicht bezahlt.
- </string>
- <string name="you_paid_failure_ldollars_no_info">
- Sie haben [AMOUNT] L$ nicht bezahlt.
- </string>
- <string name="you_paid_failure_ldollars_no_reason">
- Sie haben [NAME] [AMOUNT] L$ nicht bezahlt.
- </string>
- <string name="you_paid_failure_ldollars_no_name">
- Sie haben [AMOUNT] L$ [REASON] nicht bezahlt.
- </string>
- <string name="for item">
- für [ITEM]
- </string>
- <string name="for a parcel of land">
- für eine Landparzelle
- </string>
- <string name="for a land access pass">
- für einen Pass
- </string>
- <string name="for deeding land">
- für die Landübertragung
- </string>
- <string name="to create a group">
- für die Gründung einer Gruppe
- </string>
- <string name="to join a group">
- für den Beitritt zur Gruppe
- </string>
- <string name="to upload">
- fürs Hochladen
- </string>
- <string name="to publish a classified ad">
- um eine Anzeige aufzugeben
- </string>
- <string name="giving">
- [AMOUNT] L$ werden bezahlt
- </string>
- <string name="uploading_costs">
- Kosten für Hochladen [AMOUNT] L$
- </string>
- <string name="this_costs">
- Kosten: [AMOUNT] L$
- </string>
- <string name="buying_selected_land">
- Ausgewähltes Land wird für [AMOUNT] L$ gekauft.
- </string>
- <string name="this_object_costs">
- Dieses Objekt kostet [AMOUNT] L$
- </string>
- <string name="group_role_everyone">
- Jeder
- </string>
- <string name="group_role_officers">
- Offiziere
- </string>
- <string name="group_role_owners">
- Eigentümer
- </string>
- <string name="group_member_status_online">
- Online
- </string>
- <string name="uploading_abuse_report">
- Hochladen...
-
-Missbrauchsbericht
- </string>
- <string name="New Shape">
- Neue Form/Gestalt
- </string>
- <string name="New Skin">
- Neue Haut
- </string>
- <string name="New Hair">
- Neues Haar
- </string>
- <string name="New Eyes">
- Neue Augen
- </string>
- <string name="New Shirt">
- Neues Hemd
- </string>
- <string name="New Pants">
- Neue Hose
- </string>
- <string name="New Shoes">
- Neue Schuhe
- </string>
- <string name="New Socks">
- Neue Socken
- </string>
- <string name="New Jacket">
- Neue Jacke
- </string>
- <string name="New Gloves">
- Neue Handschuhe
- </string>
- <string name="New Undershirt">
- Neues Unterhemd
- </string>
- <string name="New Underpants">
- Neue Unterhose
- </string>
- <string name="New Skirt">
- Neuer Rock
- </string>
- <string name="New Alpha">
- Neues Alpha
- </string>
- <string name="New Tattoo">
- Neue Tätowierung
- </string>
- <string name="New Physics">
- Neue Physik
- </string>
- <string name="Invalid Wearable">
- Ungültiges Objekt
- </string>
- <string name="New Gesture">
- Neue Geste
- </string>
- <string name="New Script">
- Neues Skript
- </string>
- <string name="New Note">
- Neue Notiz
- </string>
- <string name="New Folder">
- Neuer Ordner
- </string>
- <string name="Contents">
- Inhalt
- </string>
- <string name="Gesture">
- Gesten
- </string>
- <string name="Male Gestures">
- Männliche Gesten
- </string>
- <string name="Female Gestures">
- Weibliche Gesten
- </string>
- <string name="Other Gestures">
- Andere Gesten
- </string>
- <string name="Speech Gestures">
- Sprachgesten
- </string>
- <string name="Common Gestures">
- Häufig verwendete Gesten
- </string>
- <string name="Male - Excuse me">
- Männlich - Excuse me
- </string>
- <string name="Male - Get lost">
- Männlich - Get lost
- </string>
- <string name="Male - Blow kiss">
- Männlich - Kusshand
- </string>
- <string name="Male - Boo">
- Männlich - Buh
- </string>
- <string name="Male - Bored">
- Männlich - Gelangweilt
- </string>
- <string name="Male - Hey">
- Männlich - Hey
- </string>
- <string name="Male - Laugh">
- Männlich - Lachen
- </string>
- <string name="Male - Repulsed">
- Männlich - Angewidert
- </string>
- <string name="Male - Shrug">
- Männlich - Achselzucken
- </string>
- <string name="Male - Stick tougue out">
- Männlich - Zunge herausstrecken
- </string>
- <string name="Male - Wow">
- Männlich - Wow
- </string>
- <string name="Female - Chuckle">
- Weiblich - Kichern
- </string>
- <string name="Female - Cry">
- Weiblich - Weinen
- </string>
- <string name="Female - Embarrassed">
- Weiblich - Verlegen
- </string>
- <string name="Female - Excuse me">
- Weiblich - Räuspern
- </string>
- <string name="Female - Get lost">
- Weiblich - Get lost
- </string>
- <string name="Female - Blow kiss">
- Weiblich - Kusshand
- </string>
- <string name="Female - Boo">
- Weiblich - Buh
- </string>
- <string name="Female - Bored">
- Weiblich - Gelangweilt
- </string>
- <string name="Female - Hey">
- Weiblich - Hey
- </string>
- <string name="Female - Hey baby">
- Weiblich - Hey Süße(r)
- </string>
- <string name="Female - Laugh">
- Weiblich - Lachen
- </string>
- <string name="Female - Looking good">
- Weiblich - Looking good
- </string>
- <string name="Female - Over here">
- Weiblich - Over here
- </string>
- <string name="Female - Please">
- Weiblich - Please
- </string>
- <string name="Female - Repulsed">
- Weiblich - Angewidert
- </string>
- <string name="Female - Shrug">
- Weiblich - Achselzucken
- </string>
- <string name="Female - Stick tougue out">
- Weiblich - Zunge herausstrecken
- </string>
- <string name="Female - Wow">
- Weiblich - Wow
- </string>
- <string name="/bow">
- /verbeugen
- </string>
- <string name="/clap">
- /klatschen
- </string>
- <string name="/count">
- /zählen
- </string>
- <string name="/extinguish">
- /löschen
- </string>
- <string name="/kmb">
- /lmaa
- </string>
- <string name="/muscle">
- /Muskel
- </string>
- <string name="/no">
- /nein
- </string>
- <string name="/no!">
- /nein!
- </string>
- <string name="/paper">
- /Papier
- </string>
- <string name="/pointme">
- /auf mich zeigen
- </string>
- <string name="/pointyou">
- /auf dich zeigen
- </string>
- <string name="/rock">
- /Stein
- </string>
- <string name="/scissor">
- /Schere
- </string>
- <string name="/smoke">
- /rauchen
- </string>
- <string name="/stretch">
- /dehnen
- </string>
- <string name="/whistle">
- /pfeifen
- </string>
- <string name="/yes">
- /ja
- </string>
- <string name="/yes!">
- /ja!
- </string>
- <string name="afk">
- afk
- </string>
- <string name="dance1">
- Tanzen1
- </string>
- <string name="dance2">
- Tanzen2
- </string>
- <string name="dance3">
- Tanzen3
- </string>
- <string name="dance4">
- Tanzen4
- </string>
- <string name="dance5">
- Tanzen5
- </string>
- <string name="dance6">
- Tanzen6
- </string>
- <string name="dance7">
- Tanzen7
- </string>
- <string name="dance8">
- Tanzen8
- </string>
- <string name="AvatarBirthDateFormat">
- [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
- </string>
- <string name="DefaultMimeType">
- Keine/Keiner
- </string>
- <string name="texture_load_dimensions_error">
- Bilder, die größer sind als [WIDTH]*[HEIGHT] können nicht geladen werden
- </string>
- <string name="words_separator" value=","/>
- <string name="server_is_down">
- Trotz all unserer Bemühungen ist ein unerwarteter Fehler aufgetreten.
-
- Bitte überprüfen Sie status.secondlifegrid.net, um herauszufinden, ob ein Problem besteht.
- Falls Sie weiterhin Problem haben, überprüfen Sie bitte Ihre Netzwerk- und Firewalleinstellungen.
- </string>
- <string name="dateTimeWeekdaysNames">
- Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag
- </string>
- <string name="dateTimeWeekdaysShortNames">
- So:Mo:Di:Mi:Do:Fr:Sa
- </string>
- <string name="dateTimeMonthNames">
- Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember
- </string>
- <string name="dateTimeMonthShortNames">
- Jan:Feb:Mär:Apr:Mai:Jun:Jul:Aug:Sep:Okt:Nov:Dez
- </string>
- <string name="dateTimeDayFormat">
- [MDAY]
- </string>
- <string name="dateTimeAM">
- Uhr
- </string>
- <string name="dateTimePM">
- Uhr
- </string>
- <string name="LocalEstimateUSD">
- [AMOUNT] US$
- </string>
- <string name="Membership">
- Mitgliedschaft
- </string>
- <string name="Roles">
- Rollen
- </string>
- <string name="Group Identity">
- Gruppenidentität
- </string>
- <string name="Parcel Management">
- Parzellenverwaltung
- </string>
- <string name="Parcel Identity">
- Parzellenidentität
- </string>
- <string name="Parcel Settings">
- Parzelleneinstellungen
- </string>
- <string name="Parcel Powers">
- Parzellenfähigkeiten
- </string>
- <string name="Parcel Access">
- Parzellenzugang
- </string>
- <string name="Parcel Content">
- Parzelleninhalt
- </string>
- <string name="Object Management">
- Objektmanagement
- </string>
- <string name="Accounting">
- Kontoführung
- </string>
- <string name="Notices">
- Mitteilungen
- </string>
- <string name="Chat" value=" Chat:">
- Chat
- </string>
- <string name="DeleteItems">
- Ausgewählte Objekte löschen?
- </string>
- <string name="DeleteItem">
- Ausgewähltes Objekt löschen?
- </string>
- <string name="EmptyOutfitText">
- Keine Objekte in diesem Outfit
- </string>
- <string name="ExternalEditorNotSet">
- Wählen Sie über die Einstellung „ExternalEditor“ einen Editor aus
- </string>
- <string name="ExternalEditorNotFound">
- Angegebener externer Editor nicht gefunden.
-Setzen Sie den Editorpfad in Anführungszeichen
-(z. B. &quot;/pfad/editor&quot; &quot;%s&quot;).
- </string>
- <string name="ExternalEditorCommandParseError">
- Fehler beim Parsen des externen Editorbefehls.
- </string>
- <string name="ExternalEditorFailedToRun">
- Externer Editor konnte nicht ausgeführt werden.
- </string>
- <string name="TranslationFailed">
- Übersetzung fehlgeschlagen: [REASON]
- </string>
- <string name="TranslationResponseParseError">
- Fehler beim Parsen der Übersetzungsantwort.
- </string>
- <string name="Esc">
- Esc
- </string>
- <string name="Space">
- Space
- </string>
- <string name="Enter">
- Enter
- </string>
- <string name="Tab">
- Tab
- </string>
- <string name="Ins">
- Ins
- </string>
- <string name="Del">
- Del
- </string>
- <string name="Backsp">
- Backsp
- </string>
- <string name="Shift">
- Shift
- </string>
- <string name="Ctrl">
- Ctrl
- </string>
- <string name="Alt">
- Alt
- </string>
- <string name="CapsLock">
- CapsLock
- </string>
- <string name="Home">
- Zuhause
- </string>
- <string name="End">
- End
- </string>
- <string name="PgUp">
- PgUp
- </string>
- <string name="PgDn">
- PgDn
- </string>
- <string name="F1">
- F1
- </string>
- <string name="F2">
- F2
- </string>
- <string name="F3">
- F3
- </string>
- <string name="F4">
- F4
- </string>
- <string name="F5">
- F5
- </string>
- <string name="F6">
- F6
- </string>
- <string name="F7">
- F7
- </string>
- <string name="F8">
- F8
- </string>
- <string name="F9">
- F9
- </string>
- <string name="F10">
- F10
- </string>
- <string name="F11">
- F11
- </string>
- <string name="F12">
- F12
- </string>
- <string name="Add">
- Addieren
- </string>
- <string name="Subtract">
- Subtrahieren
- </string>
- <string name="Multiply">
- Multiplizieren
- </string>
- <string name="Divide">
- Dividieren
- </string>
- <string name="PAD_DIVIDE">
- PAD_DIVIDE
- </string>
- <string name="PAD_LEFT">
- PAD_LEFT
- </string>
- <string name="PAD_RIGHT">
- PAD_RIGHT
- </string>
- <string name="PAD_DOWN">
- PAD_DOWN
- </string>
- <string name="PAD_UP">
- PAD_UP
- </string>
- <string name="PAD_HOME">
- PAD_HOME
- </string>
- <string name="PAD_END">
- PAD_END
- </string>
- <string name="PAD_PGUP">
- PAD_PGUP
- </string>
- <string name="PAD_PGDN">
- PAD_PGDN
- </string>
- <string name="PAD_CENTER">
- PAD_CENTER
- </string>
- <string name="PAD_INS">
- PAD_INS
- </string>
- <string name="PAD_DEL">
- PAD_DEL
- </string>
- <string name="PAD_Enter">
- PAD_Enter
- </string>
- <string name="PAD_BUTTON0">
- PAD_BUTTON0
- </string>
- <string name="PAD_BUTTON1">
- PAD_BUTTON1
- </string>
- <string name="PAD_BUTTON2">
- PAD_BUTTON2
- </string>
- <string name="PAD_BUTTON3">
- PAD_BUTTON3
- </string>
- <string name="PAD_BUTTON4">
- PAD_BUTTON4
- </string>
- <string name="PAD_BUTTON5">
- PAD_BUTTON5
- </string>
- <string name="PAD_BUTTON6">
- PAD_BUTTON6
- </string>
- <string name="PAD_BUTTON7">
- PAD_BUTTON7
- </string>
- <string name="PAD_BUTTON8">
- PAD_BUTTON8
- </string>
- <string name="PAD_BUTTON9">
- PAD_BUTTON9
- </string>
- <string name="PAD_BUTTON10">
- PAD_BUTTON10
- </string>
- <string name="PAD_BUTTON11">
- PAD_BUTTON11
- </string>
- <string name="PAD_BUTTON12">
- PAD_BUTTON12
- </string>
- <string name="PAD_BUTTON13">
- PAD_BUTTON13
- </string>
- <string name="PAD_BUTTON14">
- PAD_BUTTON14
- </string>
- <string name="PAD_BUTTON15">
- PAD_BUTTON15
- </string>
- <string name="-">
- -
- </string>
- <string name="=">
- =
- </string>
- <string name="`">
- `
- </string>
- <string name=";">
- ;
- </string>
- <string name="[">
- [
- </string>
- <string name="]">
- ]
- </string>
- <string name="\">
- \
- </string>
- <string name="0">
- 0
- </string>
- <string name="1">
- 1
- </string>
- <string name="2">
- 2
- </string>
- <string name="3">
- 3
- </string>
- <string name="4">
- 4
- </string>
- <string name="5">
- 5
- </string>
- <string name="6">
- 6
- </string>
- <string name="7">
- 7
- </string>
- <string name="8">
- 8
- </string>
- <string name="9">
- 9
- </string>
- <string name="A">
- A
- </string>
- <string name="B">
- B
- </string>
- <string name="C">
- C
- </string>
- <string name="D">
- D
- </string>
- <string name="E">
- E
- </string>
- <string name="F">
- F
- </string>
- <string name="G">
- G
- </string>
- <string name="H">
- H
- </string>
- <string name="I">
- I
- </string>
- <string name="J">
- J
- </string>
- <string name="K">
- K
- </string>
- <string name="L">
- L
- </string>
- <string name="M">
- M
- </string>
- <string name="N">
- N
- </string>
- <string name="O">
- O
- </string>
- <string name="P">
- P
- </string>
- <string name="Q">
- Q
- </string>
- <string name="R">
- R
- </string>
- <string name="S">
- S
- </string>
- <string name="T">
- T
- </string>
- <string name="U">
- U
- </string>
- <string name="V">
- V
- </string>
- <string name="W">
- W
- </string>
- <string name="X">
- X
- </string>
- <string name="Y">
- Y
- </string>
- <string name="Z">
- Z
- </string>
- <string name="BeaconParticle">
- Partikel-Beacons werden angezeigt (blau)
- </string>
- <string name="BeaconPhysical">
- Beacons für physische Objekte werden angezeigt (grün)
- </string>
- <string name="BeaconScripted">
- Beacons für Skriptobjekte werden angezeigt (rot)
- </string>
- <string name="BeaconScriptedTouch">
- Beacons für Skriptobjekte mit Berührungsfunktion werden angezeigt (rot)
- </string>
- <string name="BeaconSound">
- Sound-Beacons werden angezeigt (gelb)
- </string>
- <string name="BeaconMedia">
- Medien-Beacons werden angezeigt (weiß)
- </string>
- <string name="ParticleHiding">
- Partikel werden ausgeblendet
- </string>
- <string name="Command_AboutLand_Label">
- Landinformationen
- </string>
- <string name="Command_Appearance_Label">
- Aussehen
- </string>
- <string name="Command_Avatar_Label">
- Avatar
- </string>
- <string name="Command_Build_Label">
- Bauen
- </string>
- <string name="Command_Chat_Label">
- Chat
- </string>
- <string name="Command_Compass_Label">
- Kompass
- </string>
- <string name="Command_Destinations_Label">
- Ziele
- </string>
- <string name="Command_Gestures_Label">
- Gesten
- </string>
- <string name="Command_HowTo_Label">
- Infos
- </string>
- <string name="Command_Inventory_Label">
- Inventar
- </string>
- <string name="Command_Map_Label">
- Karte
- </string>
- <string name="Command_Marketplace_Label">
- Marktplatz
- </string>
- <string name="Command_MiniMap_Label">
- Minikarte
- </string>
- <string name="Command_Move_Label">
- Gehen / Rennen / Fliegen
- </string>
- <string name="Command_Outbox_Label">
- Händler-Outbox
- </string>
- <string name="Command_People_Label">
- Leute
- </string>
- <string name="Command_Picks_Label">
- Auswahlen
- </string>
- <string name="Command_Places_Label">
- Orte
- </string>
- <string name="Command_Preferences_Label">
- Einstellungen
- </string>
- <string name="Command_Profile_Label">
- Profil
- </string>
- <string name="Command_Search_Label">
- Suchen
- </string>
- <string name="Command_Snapshot_Label">
- Foto
- </string>
- <string name="Command_Speak_Label">
- Sprechen
- </string>
- <string name="Command_View_Label">
- Kamerasteuerungen
- </string>
- <string name="Command_Voice_Label">
- Voice-Einstellungen
- </string>
- <string name="Command_AboutLand_Tooltip">
- Informationen zu dem von Ihnen besuchten Land
- </string>
- <string name="Command_Appearance_Tooltip">
- Avatar ändern
- </string>
- <string name="Command_Avatar_Tooltip">
- Kompletten Avatar auswählen
- </string>
- <string name="Command_Build_Tooltip">
- Objekte bauen und Terrain umformen
- </string>
- <string name="Command_Chat_Tooltip">
- Mit Leuten in der Nähe chatten
- </string>
- <string name="Command_Compass_Tooltip">
- Kompass
- </string>
- <string name="Command_Destinations_Tooltip">
- Ziele von Interesse
- </string>
- <string name="Command_Gestures_Tooltip">
- Gesten für Ihren Avatar
- </string>
- <string name="Command_HowTo_Tooltip">
- Wie führe ich gängige Aufgaben aus?
- </string>
- <string name="Command_Inventory_Tooltip">
- Ihr Eigentum anzeigen und benutzen
- </string>
- <string name="Command_Map_Tooltip">
- Weltkarte
- </string>
- <string name="Command_Marketplace_Tooltip">
- Einkaufen gehen
- </string>
- <string name="Command_MiniMap_Tooltip">
- Leute in der Nähe anzeigen
- </string>
- <string name="Command_Move_Tooltip">
- Ihren Avatar bewegen
- </string>
- <string name="Command_Outbox_Tooltip">
- Artikel zum Verkauf in den Marktplatz übertragen
- </string>
- <string name="Command_People_Tooltip">
- Freunde, Gruppen und Leute in der Nähe
- </string>
- <string name="Command_Picks_Tooltip">
- Orte, die in Ihrem Profil als Favoriten angezeigt werden sollen
- </string>
- <string name="Command_Places_Tooltip">
- Von Ihnen gespeicherte Orte
- </string>
- <string name="Command_Preferences_Tooltip">
- Einstellungen
- </string>
- <string name="Command_Profile_Tooltip">
- Ihr Profil bearbeiten oder anzeigen
- </string>
- <string name="Command_Search_Tooltip">
- Orte, Veranstaltungen, Leute finden
- </string>
- <string name="Command_Snapshot_Tooltip">
- Foto aufnehmen
- </string>
- <string name="Command_Speak_Tooltip">
- Über Ihr Mikrofon mit Leuten in der Nähe sprechen
- </string>
- <string name="Command_View_Tooltip">
- Kamerawinkel ändern
- </string>
- <string name="Command_Voice_Tooltip">
- Lautstärkeregler für Anrufe und Leute in Ihrer Nähe in SL
- </string>
- <string name="Toolbar_Bottom_Tooltip">
- gegenwärtig in der unteren Symbolleiste
- </string>
- <string name="Toolbar_Left_Tooltip">
- gegenwärtig in der linken Symbolleiste
- </string>
- <string name="Toolbar_Right_Tooltip">
- gegenwärtig in der rechten Symbolleiste
- </string>
- <string name="Retain%">
- % zurückbehalten
- </string>
- <string name="Detail">
- Details
- </string>
- <string name="Better Detail">
- Bessere Details
- </string>
- <string name="Surface">
- Oberfläche
- </string>
- <string name="Solid">
- Fest
- </string>
- <string name="Wrap">
- Wickeln
- </string>
- <string name="Preview">
- Vorschau
- </string>
- <string name="Normal">
- Normal
- </string>
- <string name="snapshot_quality_very_low">
- Sehr niedrig
- </string>
- <string name="snapshot_quality_low">
- Niedrig
- </string>
- <string name="snapshot_quality_medium">
- Mittel
- </string>
- <string name="snapshot_quality_high">
- Hoch
- </string>
- <string name="snapshot_quality_very_high">
- Sehr hoch
- </string>
-</strings>
diff --git a/indra/newview/skins/steam/xui/en/strings.xml b/indra/newview/skins/steam/xui/en/strings.xml
deleted file mode 100644
index c29b80e21c..0000000000
--- a/indra/newview/skins/steam/xui/en/strings.xml
+++ /dev/null
@@ -1,3761 +0,0 @@
-<?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
- 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>
-
- <!-- starting up -->
- <string name="StartupDetectingHardware">Detecting hardware...</string>
- <string name="StartupLoading">Loading [APP_NAME]...</string>
- <string name="StartupClearingCache">Clearing cache...</string>
- <string name="StartupInitializingTextureCache">Initializing texture cache...</string>
- <string name="StartupInitializingVFS">Initializing VFS...</string>
- <string name="StartupRequireDriverUpdate">Graphics initialization failed. Please update your graphics driver!</string>
-
- <!-- progress -->
- <string name="ProgressRestoring">Restoring...</string>
- <string name="ProgressChangingResolution">Changing resolution...</string>
-
- <!-- Legacy strings, almost never used -->
- <string name="Fullbright">Fullbright (legacy)</string> <!-- used in the Build > materials dropdown-->
-
- <!-- Login -->
- <string name="LoginInProgress">Logging in. [APP_NAME] may appear frozen. Please wait.</string>
- <string name="LoginInProgressNoFrozen">Logging in...</string>
- <string name="LoginAuthenticating">Authenticating</string>
- <string name="LoginMaintenance">Performing account maintenance...</string>
- <string name="LoginAttempt">Previous login attempt failed. Logging in, attempt [NUMBER]</string>
- <string name="LoginPrecaching">Loading world...</string>
- <string name="LoginInitializingBrowser">Initializing embedded web browser...</string>
- <string name="LoginInitializingMultimedia">Initializing multimedia...</string>
- <string name="LoginInitializingFonts">Loading fonts...</string>
- <string name="LoginVerifyingCache">Verifying cache files (can take 60-90 seconds)...</string>
- <string name="LoginProcessingResponse">Processing response...</string>
- <string name="LoginInitializingWorld">Initializing world...</string>
- <string name="LoginDecodingImages">Decoding images...</string>
- <string name="LoginInitializingQuicktime">Initializing QuickTime...</string>
- <string name="LoginQuicktimeNotFound">QuickTime not found - unable to initialize.</string>
- <string name="LoginQuicktimeOK">QuickTime initialized successfully.</string>
- <string name="LoginRequestSeedCapGrant">Requesting region capabilities...</string>
- <string name="LoginRetrySeedCapGrant">Requesting region capabilities, attempt [NUMBER]...</string>
- <string name="LoginWaitingForRegionHandshake">Waiting for region handshake...</string>
- <string name="LoginConnectingToRegion">Connecting to region...</string>
- <string name="LoginDownloadingClothing">Downloading clothing...</string>
- <string name="InvalidCertificate">The server returned an invalid or corrupt certificate. Please contact the Grid administrator.</string>
- <string name="CertInvalidHostname">An invalid hostname was used to access the server, please check your SLURL or Grid hostname.</string>
- <string name="CertExpired">The certificate returned by the Grid appears to be expired. Please check your system clock, or contact your Grid administrator.</string>
- <string name="CertKeyUsage">The certificate returned by the server could not be used for SSL. Please contact your Grid administrator.</string>
- <string name="CertBasicConstraints">Too many certificates were in the servers Certificate chain. Please contact your Grid administrator.</string>
- <string name="CertInvalidSignature">The certificate signature returned by the Grid server could not be verified. Please contact your Grid administrator.</string>
-
- <string name="LoginFailedNoNetwork">Network error: Could not establish connection, please check your network connection.</string>
- <string name="LoginFailed">Login failed.</string>
- <string name="Quit">Quit</string>
- <string name="create_account_url">http://join.secondlife.com/?sourceid=1206_steam</string>
-
- <string name="LoginFailedViewerNotPermitted">
-The viewer you are using can no longer access Second Life. Please visit the following page to download a new viewer:
-http://secondlife.com/download
-
-For more information, see our FAQ below:
-http://secondlife.com/viewer-access-faq</string>
- <string name="LoginIntermediateOptionalUpdateAvailable">Optional viewer update available: [VERSION]</string>
- <string name="LoginFailedRequiredUpdate">Required viewer update: [VERSION]</string>
- <string name="LoginFailedAlreadyLoggedIn">This agent is already logged in.
-</string>
- <string name="LoginFailedAuthenticationFailed">Sorry! We couldn't log you in.
-Please check to make sure you entered the right
- * Username (like bobsmith12 or steller.sunshine)
- * Password
-Also, please make sure your Caps Lock key is off.</string>
- <string name="LoginFailedPasswordChanged">As a security precaution your password has been changed.
-Please go to your account page at http://secondlife.com/password
-and answer the security question to reset your password.
-We are very sorry for the inconvenience.</string>
- <string name="LoginFailedPasswordReset">We made some changes to our system and you will need to reset your password.
-Please go to your account page at http://secondlife.com/password
-and answer the security question to reset your password.
-We are very sorry for the inconvenience.</string>
- <string name="LoginFailedEmployeesOnly">Second Life is temporarily closed for maintenance.
-Logins are currently restricted to employees only.
-Check www.secondlife.com/status for updates.</string>
- <string name="LoginFailedPremiumOnly">Second Life logins are temporarily restricted in order to make sure that those in-world have the best possible experience.
-
-People with free accounts will not be able to access Second Life during this time, to make room for those who have paid for Second Life.</string>
- <string name="LoginFailedComputerProhibited">Second Life cannot be accessed from this computer.
-If you feel this is an error, please contact
-support@secondlife.com.</string>
- <string name="LoginFailedAcountSuspended">Your account is not accessible until
-[TIME] Pacific Time.</string>
- <string name="LoginFailedAccountDisabled">We are unable to complete your request at this time.
-Please contact Second Life support for assistance at http://secondlife.com/support.
-If you are unable to change your password, please call (866) 476-9763.</string>
- <string name="LoginFailedTransformError">Data inconsistency found during login.
-Please contact support@secondlife.com.</string>
- <string name="LoginFailedAccountMaintenance">Your account is undergoing minor maintenance.
-Your account is not accessible until
-[TIME] Pacific Time.
-If you feel this is an error, please contact support@secondlife.com.</string>
- <string name="LoginFailedPendingLogoutFault">Request for logout responded with a fault from simulator.</string>
- <string name="LoginFailedPendingLogout">The system is logging you out right now.
-Your Account will not be available until
-[TIME] Pacific Time.</string>
- <string name="LoginFailedUnableToCreateSession">Unable to create valid session.</string>
- <string name="LoginFailedUnableToConnectToSimulator">Unable to connect to a simulator.</string>
- <string name="LoginFailedRestrictedHours">Your account can only access Second Life
-between [START] and [END] Pacific Time.
-Please come back during those hours.
-If you feel this is an error, please contact support@secondlife.com.</string>
- <string name="LoginFailedIncorrectParameters">Incorrect parameters.
-If you feel this is an error, please contact support@secondlife.com.</string>
- <string name="LoginFailedFirstNameNotAlphanumeric">First name parameter must be alphanumeric.
-If you feel this is an error, please contact support@secondlife.com.</string>
- <string name="LoginFailedLastNameNotAlphanumeric">Last name parameter must be alphanumeric.
-If you feel this is an error, please contact support@secondlife.com.</string>
- <string name="LogoutFailedRegionGoingOffline">Region is going offline.
-Please try logging in again in a minute.</string>
- <string name="LogoutFailedAgentNotInRegion">Agent not in region.
-Please try logging in again in a minute.</string>
- <string name="LogoutFailedPendingLogin">The region was logging in another session.
-Please try logging in again in a minute.</string>
- <string name="LogoutFailedLoggingOut">The region was logging out the previous session.
-Please try logging in again in a minute.</string>
- <string name="LogoutFailedStillLoggingOut">The region is still logging out the previous session.
-Please try logging in again in a minute.</string>
- <string name="LogoutSucceeded">Region has logged out last session.
-Please try logging in again in a minute.</string>
- <string name="LogoutFailedLogoutBegun">Region has begun the logout process.
-Please try logging in again in a minute.</string>
- <string name="LoginFailedLoggingOutSession">The system has begun logging out your last session.
-Please try logging in again in a minute.</string>
-
-
- <!-- Disconnection -->
- <string name="AgentLostConnection">This region may be experiencing trouble. Please check your connection to the Internet.</string>
- <string name="SavingSettings">Saving your settings...</string>
- <string name="LoggingOut">Logging out...</string>
- <string name="ShuttingDown">Shutting down...</string>
- <string name="YouHaveBeenDisconnected">You have been disconnected from the region you were in.</string>
- <string name="SentToInvalidRegion">You were sent to an invalid region.</string>
- <string name="TestingDisconnect">Testing viewer disconnect</string>
-
- <!-- Tooltip -->
- <string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar -->
- <string name="TooltipNoName">(no name)</string> <!-- No name on an object -->
- <string name="TooltipOwner">Owner:</string> <!-- Owner name follows -->
- <string name="TooltipPublic">Public</string> <!-- Public permissions on an object -->
- <string name="TooltipIsGroup">(Group)</string> <!-- The name before this text is that of a group -->
- <string name="TooltipForSaleL$">For Sale: L$[AMOUNT]</string> <!-- L$ version -->
- <string name="TooltipFlagGroupBuild">Group Build</string>
- <string name="TooltipFlagNoBuild">No Build</string>
- <string name="TooltipFlagNoEdit">Group Build</string>
- <string name="TooltipFlagNotSafe">Not Safe</string><!-- damage area -->
- <string name="TooltipFlagNoFly">No Fly</string>
- <string name="TooltipFlagGroupScripts">Group Scripts</string>
- <string name="TooltipFlagNoScripts">No Scripts</string>
- <string name="TooltipLand">Land:</string>
- <string name="TooltipMustSingleDrop">Only a single item can be dragged here</string>
- <string name="TooltipPrice" value="L$[AMOUNT]: "/>
-
- <string name="TooltipOutboxDragToWorld">You can not rez items in your merchant outbox</string>
- <string name="TooltipOutboxNoTransfer">One or more of these objects cannot be sold or transferred.</string>
- <string name="TooltipOutboxNotInInventory">Your merchant outbox can only accept items directly from your inventory</string>
- <string name="TooltipOutboxWorn">You can not put items you are wearing into your merchant outbox</string>
- <string name="TooltipOutboxCallingCard">You can not put calling cards into your merchant outbox</string>
- <string name="TooltipOutboxFolderLevels">Depth of nested folders exceeds 3</string>
- <string name="TooltipOutboxTooManyFolders">Subfolder count in top-level folder exceeds 20</string>
- <string name="TooltipOutboxTooManyObjects">Item count in top-level folder exceeds 200</string>
-
- <string name="TooltipDragOntoOwnChild">You can't move a folder into its child</string>
- <string name="TooltipDragOntoSelf">You can't move a folder into itself</string>
-
- <!-- 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="TooltipAgentInspect">Learn more about this Resident</string>
- <string name="TooltipAgentMute">Click to mute this Resident</string>
- <string name="TooltipAgentUnmute">Click to unmute this Resident</string>
- <string name="TooltipAgentIM">Click to IM this Resident</string>
- <string name="TooltipAgentPay">Click to Pay this Resident</string>
- <string name="TooltipAgentOfferTeleport">Click to offer a teleport request to this Resident</string>
- <string name="TooltipAgentRequestFriend">Click to send a friend request to this Resident</string>
- <string name="TooltipGroupUrl">Click to view this group's description</string>
- <string name="TooltipEventUrl">Click to view this event's description</string>
- <string name="TooltipClassifiedUrl">Click to view this classified</string>
- <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>
-
- <!-- label strings for secondlife:///app/agent SLapps -->
- <string name="SLappAgentMute">Mute</string>
- <string name="SLappAgentUnmute">Unmute</string>
- <string name="SLappAgentIM">IM</string>
- <string name="SLappAgentPay">Pay</string>
- <string name="SLappAgentOfferTeleport">Offer Teleport to </string>
- <string name="SLappAgentRequestFriend">Friend Request </string>
-
- <!-- ButtonToolTips, llfloater.cpp -->
- <string name="BUTTON_CLOSE_DARWIN">Close (&#8984;W)</string>
- <string name="BUTTON_CLOSE_WIN">Close (Ctrl+W)</string>
- <string name="BUTTON_CLOSE_CHROME">Close</string>
- <string name="BUTTON_RESTORE">Restore</string>
- <string name="BUTTON_MINIMIZE">Minimize</string>
- <string name="BUTTON_TEAR_OFF">Tear Off</string>
- <string name="BUTTON_DOCK">Dock</string>
- <string name="BUTTON_HELP">Show Help</string>
-
- <!-- searching - generic -->
- <string name="Searching">Searching...</string>
- <string name="NoneFound">None found.</string>
-
- <!-- Indicates that an avatar name or other similar datum is being retrieved. General usage. -->
- <string name="RetrievingData">Retrieving...</string>
-
- <string name="ReleaseNotes">Release Notes</string>
- <!-- Always mark translate="false" for strings that are nothing but URLs, as they don't need translation. -->
- <string name="RELEASE_NOTES_BASE_URL" translate="false">http://wiki.secondlife.com/wiki/Release_Notes/</string>
-
- <!-- 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>
-
- <!-- Group name: text shown for LLUUID::null -->
- <string name="GroupNameNone">(none)</string>
-
- <string name="AvalineCaller">Avaline Caller [ORDER]</string>
-
- <!-- Asset errors. Used in llassetstorage.cpp, translation from error code to error message. -->
- <string name="AssetErrorNone">No error</string>
- <string name="AssetErrorRequestFailed">Asset request: failed</string>
- <string name="AssetErrorNonexistentFile">Asset request: non-existent file</string>
- <string name="AssetErrorNotInDatabase">Asset request: asset not found in database</string>
- <string name="AssetErrorEOF">End of file</string>
- <string name="AssetErrorCannotOpenFile">Cannot open file</string>
- <string name="AssetErrorFileNotFound">File not found</string>
- <string name="AssetErrorTCPTimeout">File transfer timeout</string>
- <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* -->
- <!-- Will also replace [OBJECTTYPE] in notifications: UserGiveItem, ObjectGiveItem -->
- <string name="texture">texture</string>
- <string name="sound">sound</string>
- <string name="calling card">calling card</string>
- <string name="landmark">landmark</string>
- <string name="legacy script">legacy script</string>
- <string name="clothing">clothing</string>
- <string name="object">object</string>
- <string name="note card">notecard</string>
- <string name="folder">folder</string>
- <string name="root">root</string>
- <string name="lsl2 script">LSL2 script</string>
- <string name="lsl bytecode">LSL bytecode</string>
- <string name="tga texture">tga texture</string>
- <string name="body part">body part</string>
- <string name="snapshot">snapshot</string>
- <string name="lost and found">Lost and Found</string>
- <string name="targa image">targa image</string>
- <string name="trash">Trash</string>
- <string name="jpeg image">jpeg image</string>
- <string name="animation">animation</string>
- <string name="gesture">gesture</string>
- <string name="simstate">simstate</string>
- <string name="favorite">favorite</string>
- <string name="symbolic link">link</string>
- <string name="symbolic folder link">folder link</string>
- <string name="mesh">mesh</string>
-
- <!-- llvoavatar. Displayed in the avatar chat bubble -->
- <string name="AvatarEditingAppearance">(Editing Appearance)</string>
- <string name="AvatarAway">Away</string>
- <string name="AvatarBusy">Busy</string>
- <string name="AvatarMuted">Blocked</string>
-
- <!-- animations -->
- <string name="anim_express_afraid">Afraid</string>
- <string name="anim_express_anger">Angry</string>
- <string name="anim_away">Away</string>
- <string name="anim_backflip">Backflip</string>
- <string name="anim_express_laugh">Belly Laugh</string>
- <string name="anim_express_toothsmile">BigSmile</string>
- <string name="anim_blowkiss">Blow Kiss</string>
- <string name="anim_express_bored">Bored</string>
- <string name="anim_bow">Bow</string>
- <string name="anim_clap">Clap</string>
- <string name="anim_courtbow">Court Bow</string>
- <string name="anim_express_cry">Cry</string>
- <string name="anim_dance1">Dance 1</string>
- <string name="anim_dance2">Dance 2</string>
- <string name="anim_dance3">Dance 3</string>
- <string name="anim_dance4">Dance 4</string>
- <string name="anim_dance5">Dance 5</string>
- <string name="anim_dance6">Dance 6</string>
- <string name="anim_dance7">Dance 7</string>
- <string name="anim_dance8">Dance 8</string>
- <string name="anim_express_disdain">Disdain</string>
- <string name="anim_drink">Drink</string>
- <string name="anim_express_embarrased">Embarrassed</string>
- <string name="anim_angry_fingerwag">Finger Wag</string>
- <string name="anim_fist_pump">Fist Pump</string>
- <string name="anim_yoga_float">Floating Yoga</string>
- <string name="anim_express_frown">Frown</string>
- <string name="anim_impatient">Impatient</string>
- <string name="anim_jumpforjoy">Jump For Joy</string>
- <string name="anim_kissmybutt">Kiss My Butt</string>
- <string name="anim_express_kiss">Kiss</string>
- <string name="anim_laugh_short">Laugh</string>
- <string name="anim_musclebeach">Muscle Beach</string>
- <string name="anim_no_unhappy">No (Unhappy)</string>
- <string name="anim_no_head">No</string>
- <string name="anim_nyanya">Nya-nya-nya</string>
- <string name="anim_punch_onetwo">One-Two Punch</string>
- <string name="anim_express_open_mouth">Open Mouth</string>
- <string name="anim_peace">Peace</string>
- <string name="anim_point_you">Point at Other</string>
- <string name="anim_point_me">Point at Self</string>
- <string name="anim_punch_l">Punch Left</string>
- <string name="anim_punch_r">Punch Right</string>
- <string name="anim_rps_countdown">RPS count</string>
- <string name="anim_rps_paper">RPS paper</string>
- <string name="anim_rps_rock">RPS rock</string>
- <string name="anim_rps_scissors">RPS scissors</string>
- <string name="anim_express_repulsed">Repulsed</string>
- <string name="anim_kick_roundhouse_r">Roundhouse Kick</string>
- <string name="anim_express_sad">Sad</string>
- <string name="anim_salute">Salute</string>
- <string name="anim_shout">Shout</string>
- <string name="anim_express_shrug">Shrug</string>
- <string name="anim_express_smile">Smile</string>
- <string name="anim_smoke_idle">Smoke Idle</string>
- <string name="anim_smoke_inhale">Smoke Inhale</string>
- <string name="anim_smoke_throw_down">Smoke Throw Down</string>
- <string name="anim_express_surprise">Surprise</string>
- <string name="anim_sword_strike_r">Sword Strike</string>
- <string name="anim_angry_tantrum">Tantrum</string>
- <string name="anim_express_tongue_out">TongueOut</string>
- <string name="anim_hello">Wave</string>
- <string name="anim_whisper">Whisper</string>
- <string name="anim_whistle">Whistle</string>
- <string name="anim_express_wink">Wink</string>
- <string name="anim_wink_hollywood">Wink (Hollywood)</string>
- <string name="anim_express_worry">Worry</string>
- <string name="anim_yes_happy">Yes (Happy)</string>
- <string name="anim_yes_head">Yes</string>
-
- <!-- build floater -->
- <string name="multiple_textures">Multiple</string>
-
- <!-- world map -->
- <string name="texture_loading">Loading...</string>
- <string name="worldmap_offline">Offline</string>
- <string name="worldmap_item_tooltip_format">[AREA] m² L$[PRICE]</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>
- <string name="ringing">Connecting to in-world Voice Chat...</string>
- <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="AdditionalPermissionsRequestHeader">If you allow access to your account, you will also be allowing the object to:</string>
- <string name="ScriptTakeMoney">Take Linden dollars (L$) from you</string>
- <string name="ActOnControlInputs">Act on your control inputs</string>
- <string name="RemapControlInputs">Remap your control inputs</string>
- <string name="AnimateYourAvatar">Animate your avatar</string>
- <string name="AttachToYourAvatar">Attach to your avatar</string>
- <string name="ReleaseOwnership">Release ownership and become public</string>
- <string name="LinkAndDelink">Link and delink from other objects</string>
- <string name="AddAndRemoveJoints">Add and remove joints with other objects</string>
- <string name="ChangePermissions">Change its permissions</string>
- <string name="TrackYourCamera">Track your camera</string>
- <string name="ControlYourCamera">Control your camera</string>
- <string name="TeleportYourAgent">Teleport you</string>
- <string name="NotConnected">Not Connected</string>
-
- <!-- Sim Access labels -->
- <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>
-
- <!-- For land type back from the simulator -->
- <string name="Estate / Full Region">Estate / Full Region</string>
- <string name="Estate / Homestead">Estate / Homestead</string>
- <string name="Mainland / Homestead">Mainland / Homestead</string>
- <string name="Mainland / Full Region">Mainland / Full Region</string>
-
- <!-- File load/save dialogs -->
- <string name="all_files">All Files</string>
- <string name="sound_files">Sounds</string>
- <string name="animation_files">Animations</string>
- <string name="image_files">Images</string>
- <string name="save_file_verb">Save</string>
- <string name="load_file_verb">Load</string>
- <string name="targa_image_files">Targa Images</string>
- <string name="bitmap_image_files">Bitmap Images</string>
- <string name="avi_movie_file">AVI Movie File</string>
- <string name="xaf_animation_file">XAF Anim File</string>
- <string name="xml_file">XML File</string>
- <string name="raw_file">RAW File</string>
- <string name="compressed_image_files">Compressed Images</string>
- <string name="load_files">Load Files</string>
- <string name="choose_the_directory">Choose Directory</string>
- <string name="script_files">Scripts</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)
- </string>
- <string name="LSLTipText_llCos" translate="false">
-float llCos(float theta)
-Returns the cosine of theta (theta in radians)
- </string>
- <string name="LSLTipText_llTan" translate="false">
-float llTan(float theta)
-Returns the tangent of theta (theta in radians)
- </string>
- <string name="LSLTipText_llAtan2" translate="false">
-float llAtan2(float y, float x)
-Returns the arctangent2 of y, x
- </string>
- <string name="LSLTipText_llSqrt" translate="false">
-float llSqrt(float val)
-Returns the square root of val, or returns 0 and triggers a Math Error for imaginary results
- </string>
- <string name="LSLTipText_llPow" translate="false">
-float llPow(float base, float exponent)
-Returns the base raised to the power exponent, or returns 0 and triggers Math Error for imaginary results
- </string>
- <string name="LSLTipText_llAbs" translate="false">
-integer llAbs(integer val)
-Returns the positive version of val
- </string>
- <string name="LSLTipText_llFabs" translate="false">
-float llFabs(float val)
-Returns the positive version of val
- </string>
- <string name="LSLTipText_llFrand" translate="false">
-float llFrand(float mag)
-Returns a pseudo random number in the range [0,mag) or (mag,0]
- </string>
- <string name="LSLTipText_llFloor" translate="false">
-integer llFloor(float val)
-Returns largest integer value &lt;= val
- </string>
- <string name="LSLTipText_llCeil" translate="false">
-integer llCeil(float val)
-Returns smallest integer value &gt;= val
- </string>
- <string name="LSLTipText_llRound" translate="false">
-integer llRound(float val)
-Returns val rounded to the nearest integer
- </string>
- <string name="LSLTipText_llVecMag" translate="false">
-float llVecMag(vector v)
-Returns the magnitude of v
- </string>
- <string name="LSLTipText_llVecNorm" translate="false">
-vector llVecNorm(vector v)
-Returns the v normalized
- </string>
- <string name="LSLTipText_llVecDist" translate="false">
-float llVecDist(vector v1, vector v2)
-Returns the 3D distance between v1 and v2
- </string>
- <string name="LSLTipText_llRot2Euler" translate="false">
-vector llRot2Euler(rotation q)
-Returns the Euler representation (roll, pitch, yaw) of q
- </string>
- <string name="LSLTipText_llEuler2Rot" translate="false">
-rotation llEuler2Rot(vector v)
-Returns the rotation representation of Euler Angles v
- </string>
- <string name="LSLTipText_llAxes2Rot" translate="false">
-rotation llAxes2Rot(vector fwd, vector left, vector up)
-Returns the rotation defined by the coordinate axes
- </string>
- <string name="LSLTipText_llRot2Fwd" translate="false">
-vector llRot2Fwd(rotation q)
-Returns the forward vector defined by q
- </string>
- <string name="LSLTipText_llRot2Left" translate="false">
-vector llRot2Left(rotation q)
-Returns the left vector defined by q
- </string>
- <string name="LSLTipText_llRot2Up" translate="false">
-vector llRot2Up(rotation q)
-Returns the up vector defined by q
- </string>
- <string name="LSLTipText_llRotBetween" translate="false">
-rotation llRotBetween(vector v1, vector v2)
-Returns the rotation to rotate v1 to v2
- </string>
- <string name="LSLTipText_llWhisper" translate="false">
-llWhisper(integer channel, string msg)
-Whispers the text of msg on channel
- </string>
- <string name="LSLTipText_llSay" translate="false">
-llSay(integer channel, string msg)
-Says the text of msg on channel
- </string>
- <string name="LSLTipText_llShout" translate="false">
-llShout(integer channel, string msg)
-Shouts the text of msg on channel
- </string>
- <string name="LSLTipText_llListen" translate="false">
-integer llListen(integer channel, string name, key id, string msg)
-Sets a callback for msg on channel from name and id (name, id, and/or msg can be empty) and returns an identifier that can be used to deactivate or remove the listen
- </string>
- <string name="LSLTipText_llListenControl" translate="false">
-llListenControl(integer number, integer active)
-Makes a listen event callback active or inactive
- </string>
- <string name="LSLTipText_llListenRemove" translate="false">
-llListenRemove(integer number)
-Removes listen event callback number
- </string>
- <string name="LSLTipText_llSensor" translate="false">
-llSensor(string name, key id, integer type, float range, float arc)
-Performs a single scan for name and id with type (AGENT, ACTIVE, PASSIVE, and/or SCRIPTED) within range meters and arc radians of forward vector (name, id, and/or keytype can be empty or 0)
- </string>
- <string name="LSLTipText_llSensorRepeat" translate="false">
-llSensorRepeat(string name, key id, integer type, float range, float arc, float rate)
-Sets a callback for name and id with type (AGENT, ACTIVE, PASSIVE, and/or SCRIPTED) within range meters and arc radians of forward vector (name, id, and/or keytype can be empty or 0) and repeats every rate seconds
- </string>
- <string name="LSLTipText_llSensorRemove" translate="false">
-llSensorRemove()
-Removes the sensor setup by llSensorRepeat
- </string>
- <string name="LSLTipText_llDetectedName" translate="false">
-string llDetectedName(integer number)
-Returns the name of detected object number (returns empty string if number is not a valid sensed object)
- </string>
- <string name="LSLTipText_llDetectedKey" translate="false">
-key llDetectedKey(integer number)
-Returns the key of detected object number (returns empty key if number is not a valid sensed object)
- </string>
- <string name="LSLTipText_llDetectedOwner" translate="false">
-key llDetectedOwner(integer number)
-Returns the key of detected object&apos;s owner (returns empty key if number is not a valid sensed object)
- </string>
- <string name="LSLTipText_llDetectedType" translate="false">
-integer llDetectedType(integer number)
-Returns the type (AGENT, ACTIVE, PASSIVE, SCRIPTED) of detected object (returns 0 if number is not a valid sensed object)
- </string>
- <string name="LSLTipText_llDetectedPos" translate="false">
-vector llDetectedPos(integer number)
-Returns the position of detected object number (returns &lt;0,0,0&gt; if number is not a valid sensed object)
- </string>
- <string name="LSLTipText_llDetectedVel" translate="false">
-vector llDetectedVel(integer number)
-Returns the velocity of detected object number (returns &lt;0,0,0&gt; if number is not a valid sensed object)
- </string>
- <string name="LSLTipText_llDetectedGrab" translate="false">
-vector llDetectedGrab(integer number)
-Returns the grab offset of the user touching object (returns &lt;0,0,0&gt; if number is not a valid sensed object)
- </string>
- <string name="LSLTipText_llDetectedRot" translate="false">
-rotation llDetectedRot(integer number)
-Returns the rotation of detected object number (returns &lt;0,0,0,1&gt; if number is not a valid sensed object)
- </string>
- <string name="LSLTipText_llDetectedGroup" translate="false">
-integer llDetectedGroup(integer number)
-Returns TRUE if detected object is part of same group as owner
- </string>
- <string name="LSLTipText_llDetectedLinkNumber" translate="false">
-integer llDetectedLinkNumber(integer number)
-Returns the link position of the triggered event for touches and collisions only
- </string>
- <string name="LSLTipText_llDie" translate="false">
-llDie()
-Deletes the object
- </string>
- <string name="LSLTipText_llGround" translate="false">
-float llGround(vector offset)
-Returns the ground height below the object position + offset
- </string>
- <string name="LSLTipText_llCloud" translate="false">
-float llCloud(vector offset)
-Returns the cloud density at the object position + offset
- </string>
- <string name="LSLTipText_llWind" translate="false">
-vector llWind(vector offset)
-Returns the wind velocity at the object position + offset
- </string>
- <string name="LSLTipText_llSetStatus" translate="false">
-llSetStatus(integer status, integer value)
-Sets status (STATUS_PHYSICS, STATUS_PHANTOM, STATUS_BLOCK_GRAB, STATUS_ROTATE_X, STATUS_ROTATE_Y, and/or STATUS_ROTATE_Z) to value
- </string>
- <string name="LSLTipText_llGetStatus" translate="false">
-integer llGetStatus(integer status)
-Returns value of status (STATUS_PHYSICS, STATUS_PHANTOM, STATUS_BLOCK_GRAB, STATUS_ROTATE_X, STATUS_ROTATE_Y, and/or STATUS_ROTATE_Z)
- </string>
- <string name="LSLTipText_llSetScale" translate="false">
-llSetScale(vector scale)
-Sets the scale of the prim
- </string>
- <string name="LSLTipText_llGetScale" translate="false">
-vector llGetScale()
-Returns the scale of the prim
- </string>
- <string name="LSLTipText_llSetColor" translate="false">
-llSetColor(vector color, integer face)
-Sets the color on face of the prim
- </string>
- <string name="LSLTipText_llGetAlpha" translate="false">
-float llGetAlpha(integer face)
-Returns the alpha of face
- </string>
- <string name="LSLTipText_llSetAlpha" translate="false">
-llSetAlpha(float alpha, integer face)
-Sets the alpha on face
- </string>
- <string name="LSLTipText_llGetColor" translate="false">
-vector llGetColor(integer face)
-Returns the color on face
- </string>
- <string name="LSLTipText_llSetTexture" translate="false">
-llSetTexture(string texture, integer face)
-Sets the texture of face or ALL_SIDES
- </string>
- <string name="LSLTipText_llScaleTexture" translate="false">
-llScaleTexture(float u, float v, integer face)
-Sets the texture u &amp; v scales for the chosen face or ALL_SIDES
- </string>
- <string name="LSLTipText_llOffsetTexture" translate="false">
-llOffsetTexture(float u, float v, integer face)
-Sets the texture u &amp; v offsets for the chosen face or ALL_SIDES
- </string>
- <string name="LSLTipText_llRotateTexture" translate="false">
-llRotateTexture(float rotation, integer face)
-Sets the texture rotation for the chosen face
- </string>
- <string name="LSLTipText_llGetTexture" translate="false">
-string llGetTexture(integer face)
-Returns a string that is the texture on face (the inventory name if it is a texture in the prim&apos;s inventory, otherwise the key)
- </string>
- <string name="LSLTipText_llSetPos" translate="false">
-llSetPos(vector pos)
-Moves the object or prim towards pos without using physics (if the script isn&apos;t physical)
- </string>
- <string name="LSLTipText_llGetPos" translate="false">
-vector llGetPos()
-Returns the position of the task in region coordinates
- </string>
- <string name="LSLTipText_llGetLocalPos" translate="false">
-vector llGetLocalPos()
-Returns the position relative to the root
- </string>
- <string name="LSLTipText_llSetRot" translate="false">
-llSetRot(rotation rot)
-Sets the rotation
- </string>
- <string name="LSLTipText_llGetRot" translate="false">
-rotation llGetRot()
-Returns the rotation relative to the region&apos;s axes
- </string>
- <string name="LSLTipText_llGetLocalRot" translate="false">
-rotation llGetLocalRot()
-Returns the rotation local to the root
- </string>
- <string name="LSLTipText_llSetForce" translate="false">
-llSetForce(vector force, integer local)
-Applies force to the object (if the script is physical), in local coords if local == TRUE
- </string>
- <string name="LSLTipText_llGetForce" translate="false">
-vector llGetForce()
-Returns the force (if the script is physical)
- </string>
- <string name="LSLTipText_llTarget" translate="false">
-integer llTarget(vector position, float range)
-Sets positions within range of position as a target and return an ID for the target
- </string>
- <string name="LSLTipText_llTargetRemove" translate="false">
-llTargetRemove(integer number)
-Removes positional target number registered with llTarget
- </string>
- <string name="LSLTipText_llRotTarget" translate="false">
-integer llRotTarget(rotation rot, float error)
-Set rotations with error of rot as a rotational target and return an ID for the rotational target
- </string>
- <string name="LSLTipText_llRotTargetRemove" translate="false">
-llRotTargetRemove(integer number)
-Removes rotational target number registered with llRotTarget
- </string>
- <string name="LSLTipText_llMoveToTarget" translate="false">
-llMoveToTarget(vector target, float tau)
-Critically damps to target in tau seconds (if the script is physical)
- </string>
- <string name="LSLTipText_llStopMoveToTarget" translate="false">
-llStopMoveToTarget()
-Stops critically damped motion
- </string>
- <string name="LSLTipText_llApplyImpulse" translate="false">
-llApplyImpulse(vector force, integer local)
-Applies impulse to object (if the script is physical), in local coords if local == TRUE
- </string>
- <string name="LSLTipText_llApplyRotationalImpulse" translate="false">
-llApplyRotationalImpulse(vector force, integer local)
-Applies rotational impulse to object (if the script is physical), in local coords if local == TRUE
- </string>
- <string name="LSLTipText_llSetTorque" translate="false">
-llSetTorque(vector torque, integer local)
-Sets the torque of object (if the script is physical), in local coords if local == TRUE
- </string>
- <string name="LSLTipText_llGetTorque" translate="false">
-vector llGetTorque()
-Returns the torque (if the script is physical)
- </string>
- <string name="LSLTipText_llSetForceAndTorque" translate="false">
-llSetForceAndTorque(vector force, vector torque, integer local)
-Sets the force and torque of object (if the script is physical), in local coords if local == TRUE
- </string>
- <string name="LSLTipText_llGetVel" translate="false">
-vector llGetVel()
-Returns the velocity of the object
- </string>
- <string name="LSLTipText_llGetAccel" translate="false">
-vector llGetAccel()
-Returns the acceleration of the object relative to the region&apos;s axes
- </string>
- <string name="LSLTipText_llGetOmega" translate="false">
-vector llGetOmega()
-Returns the rotation velocity in radians per second
- </string>
- <string name="LSLTipText_llGetTimeOfDay" translate="false">
-float llGetTimeOfDay()
-Returns the time in seconds since [SECOND_LIFE] server midnight or since region up-time, whichever is smaller
- </string>
- <string name="LSLTipText_llGetWallclock" translate="false">
-float llGetWallclock()
-Returns the time in seconds since midnight California Pacific time (PST/PDT)
- </string>
- <string name="LSLTipText_llGetTime" translate="false">
-float llGetTime()
-Returns the time in seconds since the last region reset, script reset, or call to either llResetTime or llGetAndResetTime
- </string>
- <string name="LSLTipText_llResetTime" translate="false">
-llResetTime()
-Sets the script timer to zero
- </string>
- <string name="LSLTipText_llGetAndResetTime" translate="false">
-float llGetAndResetTime()
-Returns the script time in seconds and then resets the script timer to zero
- </string>
- <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>
- <string name="LSLTipText_llPlaySound" translate="false">
-llPlaySound(string sound, float volume)
-Plays attached sound once at volume (0.0 - 1.0)
- </string>
- <string name="LSLTipText_llLoopSound" translate="false">
-llLoopSound(string sound, float volume)
-Plays attached sound looping indefinitely at volume (0.0 - 1.0)
- </string>
- <string name="LSLTipText_llLoopSoundMaster" translate="false">
-llLoopSoundMaster(string sound, float volume)
-Plays attached sound looping at volume (0.0 - 1.0), declares it a sync master
- </string>
- <string name="LSLTipText_llLoopSoundSlave" translate="false">
-llLoopSoundSlave(string sound, float volume)
-Plays attached sound looping at volume (0.0 - 1.0), synced to most audible sync master
- </string>
- <string name="LSLTipText_llPlaySoundSlave" translate="false">
-llPlaySoundSlave(string sound, float volume)
-Plays attached sound once at volume (0.0 - 1.0), synced to next loop of most audible sync master
- </string>
- <string name="LSLTipText_llTriggerSound" translate="false">
-llTriggerSound(string sound, float volume)
-Plays sound at volume (0.0 - 1.0), centered at but not attached to object
- </string>
- <string name="LSLTipText_llStopSound" translate="false">
-llStopSound()
-Stops currently attached sound
- </string>
- <string name="LSLTipText_llPreloadSound" translate="false">
-llPreloadSound(string sound)
-Preloads a sound on viewers within range
- </string>
- <string name="LSLTipText_llGetSubString" translate="false">
-string llGetSubString(string src, integer start, integer end)
-Returns the indicated substring
- </string>
- <string name="LSLTipText_llDeleteSubString" translate="false">
-string llDeleteSubString(string src, integer start, integer end)
-Removes the indicated substring and returns the result
- </string>
- <string name="LSLTipText_llInsertString" translate="false">
-string llInsertString(string dst, integer position, string src)
-Returns a destination string dst with the string src inserted starting at position pos
- </string>
- <string name="LSLTipText_llToUpper" translate="false">
-string llToUpper(string src)
-Returns a string that is src with all upper-case characters
- </string>
- <string name="LSLTipText_llToLower" translate="false">
-string llToLower(string src)
-Returns a string that is src with all lower-case characters
- </string>
- <string name="LSLTipText_llGiveMoney" translate="false">
-llGiveMoney(key destination, integer amount)
-Transfers amount of L$ from script owner to destination
- </string>
- <string name="LSLTipText_llMakeExplosion" translate="false">
-llMakeExplosion(integer particles, float scale, float vel, float lifetime, float arc, string texture, vector offset)
-Makes a round explosion of particles
- </string>
- <string name="LSLTipText_llMakeFountain" translate="false">
-llMakeFountain(integer particles, float scale, float vel, float lifetime, float arc, integer bounce, string texture, vector offset, float bounce_offset)
-Makes a fountain of particles
- </string>
- <string name="LSLTipText_llMakeSmoke" translate="false">
-llMakeSmoke(integer particles, float scale, float vel, float lifetime, float arc, string texture, vector offset)
-Makes smoke like particles
- </string>
- <string name="LSLTipText_llMakeFire" translate="false">
-llMakeFire(integer particles, float scale, float vel, float lifetime, float arc, string texture, vector offset)
-Makes fire like particles
- </string>
- <string name="LSLTipText_llRezObject" translate="false">
-llRezObject(string inventory, vector pos, vector vel, rotation rot, integer param)
-Instantiates owner&apos;s inventory object at pos with velocity vel and rotation rot with start parameter param
- </string>
- <string name="LSLTipText_llLookAt" translate="false">
-llLookAt(vector target, float strength, float damping)
-Causes object to point its up axis (positive z) towards target, while keeping its forward axis (positive x) below the horizon
- </string>
- <string name="LSLTipText_llStopLookAt" translate="false">
-llStopLookAt()
-Stops causing object to point at a target
- </string>
- <string name="LSLTipText_llSetTimerEvent" translate="false">
-llSetTimerEvent(float sec)
-Causes the timer event to be triggered a maximum of once every sec seconds
- </string>
- <string name="LSLTipText_llSleep" translate="false">
-llSleep(float sec)
-Puts the script to sleep for sec seconds
- </string>
- <string name="LSLTipText_llGetMass" translate="false">
-float llGetMass()
-Returns the mass of object that the script is attached to
- </string>
- <string name="LSLTipText_llCollisionFilter" translate="false">
-llCollisionFilter(string name, key id, integer accept)
-Sets the collision filter, exclusively or inclusively. If accept == TRUE, only accept collisions with objects name and id (either is optional), otherwise with objects not name or id
- </string>
- <string name="LSLTipText_llTakeControls" translate="false">
-llTakeControls(integer controls, integer accept, integer pass_on)
-Allows for intercepting keyboard and mouse clicks from the agent the script has permissions for
- </string>
- <string name="LSLTipText_llReleaseControls" translate="false">
-llReleaseControls()
-Stops taking inputs that were taken with llTakeControls
- </string>
- <string name="LSLTipText_llAttachToAvatar" translate="false">
-llAttachToAvatar(integer attach_point)
-Attaches the object to the avatar who has granted permission to the script
- </string>
- <string name="LSLTipText_llDetachFromAvatar" translate="false">
-llDetachFromAvatar()
-Detaches object from avatar
- </string>
- <string name="LSLTipText_llTakeCamera" translate="false">
-llTakeCamera(key avatar)
-Moves avatar&apos;s viewpoint to task
- </string>
- <string name="LSLTipText_llReleaseCamera" translate="false">
-llReleaseCamera(key avatar)
-Returns camera to agent avatar
- </string>
- <string name="LSLTipText_llGetOwner" translate="false">
-key llGetOwner()
-Returns the object owner&apos;s UUID
- </string>
- <string name="LSLTipText_llInstantMessage" translate="false">
-llInstantMessage(key user, string message)
-Sends the specified string as an Instant Message to the user
- </string>
- <string name="LSLTipText_llEmail" translate="false">
-llEmail(string address, string subject, string message)
-Sends an email to address with the subject and message
- </string>
- <string name="LSLTipText_llGetNextEmail" translate="false">
-llGetNextEmail(string address, string subject)
-Gets the next waiting email that comes from address, with specified subject
- </string>
- <string name="LSLTipText_llGetKey" translate="false">
-key llGetKey()
-Returns the key of the prim the script is attached to
- </string>
- <string name="LSLTipText_llSetBuoyancy" translate="false">
-llSetBuoyancy(float buoyancy)
-Sets the buoyancy of the task or object (0 is disabled, &lt; 1.0 sinks, 1.0 floats, &gt; 1.0 rises)
- </string>
- <string name="LSLTipText_llSetHoverHeight" translate="false">
-llSetHoverHeight(float height, integer water, float tau)
-Critically damps to a height above the ground (or water) in tau seconds
- </string>
- <string name="LSLTipText_llStopHover" translate="false">
-llStopHover()
-Stops hovering to a height
- </string>
- <string name="LSLTipText_llMinEventDelay" translate="false">
-llMinEventDelay(float delay)
-Sets the minimum time between events being handled
- </string>
- <string name="LSLTipText_llSoundPreload" translate="false">
-llSoundPreload(string sound)
-Preloads a sound on viewers within range
- </string>
- <string name="LSLTipText_llRotLookAt" translate="false">
-llRotLookAt(rotation target, float strength, float damping)
-Causes object to point its forward axis towards target
- </string>
- <string name="LSLTipText_llStringLength" translate="false">
-integer llStringLength(string str)
-Returns the length of string
- </string>
- <string name="LSLTipText_llStartAnimation" translate="false">
-llStartAnimation(string anim)
-Starts animation anim for agent that granted PERMISSION_TRIGGER_ANIMATION if the permission has not been revoked
- </string>
- <string name="LSLTipText_llStopAnimation" translate="false">
-llStopAnimation(string anim)
-Stops animation anim for agent that granted permission
- </string>
- <string name="LSLTipText_llPointAt" translate="false">
-llPointAt(vector pos)
-Makes agent that owns object point at pos
- </string>
- <string name="LSLTipText_llStopPointAt" translate="false">
-llStopPointAt()
-Stops pointing agent that owns object
- </string>
- <string name="LSLTipText_llTargetOmega" translate="false">
-llTargetOmega(vector axis, float spinrate, float gain)
-Rotates the object around axis at spinrate with strength gain
- </string>
- <string name="LSLTipText_llGetStartParameter" translate="false">
-integer llGetStartParameter()
-Returns an integer that is the script start/rez parameter
- </string>
- <string name="LSLTipText_llGodLikeRezObject" translate="false">
-llGodLikeRezObject(key inventory, vector pos)
-Rezzes directly off of UUID if owner is in God Mode
- </string>
- <string name="LSLTipText_llRequestPermissions" translate="false">
-llRequestPermissions(key agent, integer perm)
-Asks the agent for permission to run certain classes of functions
- </string>
- <string name="LSLTipText_llGetPermissionsKey" translate="false">
-key llGetPermissionsKey()
-Returns the key of the avatar that last granted permissions to the script
- </string>
- <string name="LSLTipText_llGetPermissions" translate="false">
-integer llGetPermissions()
-Returns an integer bitfield with the permissions that have been granted
- </string>
- <string name="LSLTipText_llGetLinkNumber" translate="false">
-integer llGetLinkNumber()
-Returns the link number of the prim containing the script (0 means not linked, 1 the prim is the root, 2 the prim is the first child, etc)
- </string>
- <string name="LSLTipText_llSetLinkColor" translate="false">
-llSetLinkColor(integer linknumber, vector color, integer face)
-Sets face to color if a task exists in the link chain at linknumber
- </string>
- <string name="LSLTipText_llCreateLink" translate="false">
-llCreateLink(key target, integer parent)
-Attempts to link the script&apos;s object with the target (requires that PERMISSION_CHANGE_LINKS be granted). If parent == TRUE, then the script&apos;s object becomes the root
- </string>
- <string name="LSLTipText_llBreakLink" translate="false">
-llBreakLink(integer linknum)
-Delinks the prim with the given link number in a linked object set (requires that PERMISSION_CHANGE_LINKS be granted)
- </string>
- <string name="LSLTipText_llBreakAllLinks" translate="false">
-llBreakAllLinks()
-Delinks all prims in the link set (requires that PERMISSION_CHANGE_LINKS be granted)
- </string>
- <string name="LSLTipText_llGetLinkKey" translate="false">
-key llGetLinkKey(integer linknumber)
-Returns the key of the linked prim linknumber
- </string>
- <string name="LSLTipText_llGetLinkName" translate="false">
-string llGetLinkName(integer linknumber)
-Returns the name of linknumber in a link set
- </string>
- <string name="LSLTipText_llGetInventoryNumber" translate="false">
-integer llGetInventoryNumber(integer type)
-Returns the number of items of a given type (INVENTORY_* flag) in the prim&apos;s inventory
- </string>
- <string name="LSLTipText_llGetInventoryName" translate="false">
-string llGetInventoryName(integer type, integer number)
-Returns the name of the inventory item number of a given type
- </string>
- <string name="LSLTipText_llSetScriptState" translate="false">
-llSetScriptState(string name, integer run)
-Sets the running state of the specified script
- </string>
- <string name="LSLTipText_llGetEnergy" translate="false">
-float llGetEnergy()
-Returns how much energy is in the object as a percentage of maximum
- </string>
- <string name="LSLTipText_llGiveInventory" translate="false">
-llGiveInventory(key destination, string inventory)
-Gives inventory to destination
- </string>
- <string name="LSLTipText_llRemoveInventory" translate="false">
-llRemoveInventory(string item)
-Removes the named inventory item
- </string>
- <string name="LSLTipText_llSetText" translate="false">
-llSetText(string text, vector color, float alpha)
-Displays text that hovers over the prim with specific color and translucency specified with alpha
- </string>
- <string name="LSLTipText_llWater" translate="false">
-float llWater(vector offset)
-Returns the water height below the object position + offset
- </string>
- <string name="LSLTipText_llPassTouches" translate="false">
-llPassTouches(integer pass)
-If pass == TRUE, touches are passed from children on to parents
- </string>
- <string name="LSLTipText_llRequestAgentData" translate="false">
-key llRequestAgentData(key id, integer data)
-Requests data about agent id. When data is available the dataserver event will be raised.
- </string>
- <string name="LSLTipText_llRequestInventoryData" translate="false">
-key llRequestInventoryData(string name)
-Requests data from object&apos;s inventory object. When data is available the dataserver event will be raised.
- </string>
- <string name="LSLTipText_llSetDamage" translate="false">
-llSetDamage(float damage)
-Sets the amount of damage that will be done when this object hits an avatar.
- </string>
- <string name="LSLTipText_llTeleportAgentHome" translate="false">
-llTeleportAgentHome(key id)
-Teleports avatar on the owner&apos;s land to their home location without any warning
- </string>
- <string name="LSLTipText_llModifyLand" translate="false">
-llModifyLand(integer action, integer brush)
-Modifies land using the specified action on the specified brush size of land
- </string>
- <string name="LSLTipText_llCollisionSound" translate="false">
-llCollisionSound(string impact_sound, float impact_volume)
-Suppresses default collision sounds, replaces default impact sounds with impact_sound at the volume impact_volume
- </string>
- <string name="LSLTipText_llCollisionSprite" translate="false">
-llCollisionSprite(string impact_sprite)
-Suppresses default collision sprites, replaces default impact sprite with impact_sprite (use an empty string to just suppress)
- </string>
- <string name="LSLTipText_llGetAnimation" translate="false">
-string llGetAnimation(key id)
-Returns the name of the currently playing locomotion animation for avatar id
- </string>
- <string name="LSLTipText_llResetScript" translate="false">
-llResetScript()
-Resets the script
- </string>
- <string name="LSLTipText_llMessageLinked" translate="false">
-llMessageLinked(integer linknum, integer num, string str, key id)
-Allows scripts in the same object to communicate. Triggers a link_message event with the same parameters num, str, and id in all scripts in the prim(s) described by linknum.
- </string>
- <string name="LSLTipText_llPushObject" translate="false">
-llPushObject(key id, vector impulse, vector ang_impulse, integer local)
-Applies impulse and ang_impulse to object id
- </string>
- <string name="LSLTipText_llPassCollisions" translate="false">
-llPassCollisions(integer pass)
-If pass == TRUE, collisions are passed from children on to parents (default is FALSE)
- </string>
- <string name="LSLTipText_llGetScriptName" translate="false">
-string llGetScriptName()
-Returns the name of the script that this function is used in
- </string>
- <string name="LSLTipText_llGetNumberOfSides" translate="false">
-integer llGetNumberOfSides()
-Returns the number of faces (or sides) of the prim
- </string>
- <string name="LSLTipText_llAxisAngle2Rot" translate="false">
-rotation llAxisAngle2Rot(vector axis, float angle)
-Returns the rotation that is a generated angle about axis
- </string>
- <string name="LSLTipText_llRot2Axis" translate="false">
-vector llRot2Axis(rotation rot)
-Returns the rotation axis represented by rot
- </string>
- <string name="LSLTipText_llRot2Angle" translate="false">
-float llRot2Angle(rotation rot)
-Returns the rotation angle represented by rot
- </string>
- <string name="LSLTipText_llAcos" translate="false">
-float llAcos(float val)
-Returns the arccosine in radians of val
- </string>
- <string name="LSLTipText_llAsin" translate="false">
-float llAsin(float val)
-Returns the arcsine in radians of val
- </string>
- <string name="LSLTipText_llAngleBetween" translate="false">
-float llAngleBetween(rotation a, rotation b)
-Returns angle between rotation a and b
- </string>
- <string name="LSLTipText_llGetInventoryKey" translate="false">
-key llGetInventoryKey(string name)
-Returns the key that is the UUID of the inventory name
- </string>
- <string name="LSLTipText_llAllowInventoryDrop" translate="false">
-llAllowInventoryDrop(integer add)
-If add == TRUE, users without modify permissions can still drop inventory items onto a prim
- </string>
- <string name="LSLTipText_llGetSunDirection" translate="false">
-vector llGetSunDirection()
-Returns a normalized vector of the direction of the sun in the region
- </string>
- <string name="LSLTipText_llGetTextureOffset" translate="false">
-vector llGetTextureOffset(integer face)
-Returns the texture offset of face in the x and y components of a vector
- </string>
- <string name="LSLTipText_llGetTextureScale" translate="false">
-vector llGetTextureScale(integer side)
-Returns the texture scale of side in the x and y components of a vector
- </string>
- <string name="LSLTipText_llGetTextureRot" translate="false">
-float llGetTextureRot(integer side)
-Returns the texture rotation of side
- </string>
- <string name="LSLTipText_llSubStringIndex" translate="false">
-integer llSubStringIndex(string source, string pattern)
-Returns an integer that is the index in source where pattern first appears.
-(Returns -1 if not found)
- </string>
- <string name="LSLTipText_llGetOwnerKey" translate="false">
-key llGetOwnerKey(key id)
-Returns the owner of object id
- </string>
- <string name="LSLTipText_llGetCenterOfMass" translate="false">
-vector llGetCenterOfMass()
-Returns the prim&apos;s center of mass (unless called from the root prim, where it returns the object&apos;s center of mass)
- </string>
- <string name="LSLTipText_llListSort" translate="false">
-list llListSort(list src, integer stride, integer ascending)
-Sorts the list into blocks of stride, in ascending order if ascending == TRUE.
-The sort order is affected by type.
- </string>
- <string name="LSLTipText_llGetListLength" translate="false">
-integer llGetListLength(list src)
-Returns the number of elements in the list
- </string>
- <string name="LSLTipText_llList2Integer" translate="false">
-integer llList2Integer(list src, integer index)
-Copies the integer at index in the list
- </string>
- <string name="LSLTipText_llList2Float" translate="false">
-float llList2Float(list src, integer index)
-Copies the float at index in the list
- </string>
- <string name="LSLTipText_llList2String" translate="false">
-string llList2String(list src, integer index)
-Copies the string at index in the list
- </string>
- <string name="LSLTipText_llList2Key" translate="false">
-key llList2Key(list src, integer index)
-Copies the key at index in the list
- </string>
- <string name="LSLTipText_llList2Vector" translate="false">
-vector llList2Vector(list src, integer index)
-Copies the vector at index in the list
- </string>
- <string name="LSLTipText_llList2Rot" translate="false">
-rotation llList2Rot(list src, integer index)
-Copies the rotation at index in the list
- </string>
- <string name="LSLTipText_llList2List" translate="false">
-list llList2List(list src, integer start, integer end)
-Copies the slice of the list from start to end
- </string>
- <string name="LSLTipText_llDeleteSubList" translate="false">
-list llDeleteSubList(list src, integer start, integer end)
-Removes the slice from start to end and returns the remainder of the list
- </string>
- <string name="LSLTipText_llGetListEntryType" translate="false">
-integer llGetListEntryType(list src, integer index)
-Returns the type of the index entry in the list
-(TYPE_INTEGER, TYPE_FLOAT, TYPE_STRING, TYPE_KEY, TYPE_VECTOR, TYPE_ROTATION, or TYPE_INVALID if index is off list)
- </string>
- <string name="LSLTipText_llList2CSV" translate="false">
-string llList2CSV(list src)
-Creates a string of comma separated values from list
- </string>
- <string name="LSLTipText_llCSV2List" translate="false">
-list llCSV2List(string src)
-Creates a list from a string of comma separated values
- </string>
- <string name="LSLTipText_llListRandomize" translate="false">
-list llListRandomize(list src, integer stride)
-Returns a randomized list of blocks of size stride
- </string>
- <string name="LSLTipText_llList2ListStrided" translate="false">
-list llList2ListStrided(list src, integer start, integer end, integer stride)
-Copies the strided slice of the list from start to end
- </string>
- <string name="LSLTipText_llGetRegionCorner" translate="false">
-vector llGetRegionCorner()
-Returns a vector in meters that is the global location of the south-west corner of the region which the object is in
- </string>
- <string name="LSLTipText_llListInsertList" translate="false">
-list llListInsertList(list dest, list src, integer start)
-Returns a list that contains all the elements from dest but with the elements from src inserted at position start
- </string>
- <string name="LSLTipText_llListFindList" translate="false">
-integer llListFindList(list src, list test)
-Returns the index of the first instance of test in src.
-(Returns -1 if not found)
- </string>
- <string name="LSLTipText_llGetObjectName" translate="false">
-string llGetObjectName()
-Returns the name of the prim which the script is attached to
- </string>
- <string name="LSLTipText_llSetObjectName" translate="false">
-llSetObjectName(string name)
-Sets the prim&apos;s name to the name parameter
- </string>
- <string name="LSLTipText_llGetDate" translate="false">
-string llGetDate()
-Returns the current date in the UTC time zone in the format YYYY-MM-DD
- </string>
- <string name="LSLTipText_llEdgeOfWorld" translate="false">
-integer llEdgeOfWorld(vector pos, vector dir)
-Checks to see whether the border hit by dir from pos is the edge of the world (has no neighboring region)
- </string>
- <string name="LSLTipText_llGetAgentInfo" translate="false">
-integer llGetAgentInfo(key id)
-Returns an integer bitfield containing the agent information about id.
-Returns AGENT_FLYING, AGENT_ATTACHMENTS, AGENT_SCRIPTED, AGENT_SITTING, AGENT_ON_OBJECT, AGENT_MOUSELOOK, AGENT_AWAY, AGENT_BUSY, AGENT_TYPING, AGENT_CROUCHING, AGENT_ALWAYS_RUN, AGENT_WALKING and/or AGENT_IN_AIR.
- </string>
- <string name="LSLTipText_llAdjustSoundVolume" translate="false">
-llAdjustSoundVolume(float volume)
-Adjusts volume of attached sound (0.0 - 1.0)
- </string>
- <string name="LSLTipText_llSetSoundQueueing" translate="false">
-llSetSoundQueueing(integer queue)
-Sets whether attached sounds wait for the current sound to finish (If queue == TRUE then queuing is enabled, if FALSE queuing is disabled [default])
- </string>
- <string name="LSLTipText_llSetSoundRadius" translate="false">
-llSetSoundRadius(float radius)
-Establishes a hard cut-off radius for audibility of scripted sounds (both attached and triggered)
- </string>
- <string name="LSLTipText_llKey2Name" translate="false">
-string llKey2Name(key id)
-Returns the name of the prim or avatar specified by id.
-(The id must be a valid rezzed prim or avatar key in the current simulator, otherwise an empty string is returned.)
- </string>
- <string name="LSLTipText_llSetTextureAnim" translate="false">
-llSetTextureAnim(integer mode, integer face, integer sizex, integer sizey, float start, float length, float rate)
-Animates the texture on the specified face/faces
- </string>
- <string name="LSLTipText_llTriggerSoundLimited" translate="false">
-llTriggerSoundLimited(string sound, float volume, vector top_north_east, vector bottom_south_west)
-Plays sound at volume (0.0 - 1.0), centered at but not attached to object, limited to the box defined by vectors top_north_east and bottom_south_west
- </string>
- <string name="LSLTipText_llEjectFromLand" translate="false">
-llEjectFromLand(key avatar)
-Ejects avatar from the parcel
- </string>
- <string name="LSLTipText_llParseString2List" translate="false">
-list llParseString2List(string src, list separators, list spacers)
-Breaks src into a list, discarding separators, keeping spacers
-(separators and spacers must be lists of strings, maximum of 8 each)
- </string>
- <string name="LSLTipText_llOverMyLand" translate="false">
-integer llOverMyLand(key id)
-Returns TRUE if id is over land owned by the script owner, otherwise FALSE
- </string>
- <string name="LSLTipText_llGetLandOwnerAt" translate="false">
-key llGetLandOwnerAt(vector pos)
-Returns the key of the land owner, returns NULL_KEY if public
- </string>
- <string name="LSLTipText_llGetNotecardLine" translate="false">
-key llGetNotecardLine(string name, integer line)
-Returns line line of notecard name via the dataserver event
- </string>
- <string name="LSLTipText_llGetAgentSize" translate="false">
-vector llGetAgentSize(key id)
-If the avatar is in the same region, returns the size of the bounding box of the requested avatar by id, otherwise returns ZERO_VECTOR
- </string>
- <string name="LSLTipText_llSameGroup" translate="false">
-integer llSameGroup(key id)
-Returns TRUE if avatar id is in the same region and has the same active group, otherwise FALSE
- </string>
- <string name="LSLTipText_llUnSit" translate="false">
-key llUnSit(key id)
-If avatar identified by id is sitting on the object the script is attached to or is over land owned by the object&apos;s owner, the avatar is forced to stand up
- </string>
- <string name="LSLTipText_llGroundSlope" translate="false">
-vector llGroundSlope(vector offset)
-Returns the ground slope below the object position + offset
- </string>
- <string name="LSLTipText_llGroundNormal" translate="false">
-vector llGroundNormal(vector offset)
-Returns the ground normal below the object position + offset
- </string>
- <string name="LSLTipText_llGroundContour" translate="false">
-vector llGroundCountour(vector offset)
-Returns the ground contour direction below the object position + offset
- </string>
- <string name="LSLTipText_llGetAttached" translate="false">
-integer llGetAttached()
-Returns the object&apos;s attachment point, or 0 if not attached
- </string>
- <string name="LSLTipText_llGetFreeMemory" translate="false">
-integer llGetFreeMemory()
-Returns the number of free bytes of memory the script can use
- </string>
- <string name="LSLTipText_llGetRegionName" translate="false">
-string llGetRegionName()
-Returns the current region name
- </string>
- <string name="LSLTipText_llGetRegionTimeDilation" translate="false">
-float llGetRegionTimeDilation()
-Returns the current time dilation as a float between 0.0 (full dilation) and 1.0 (no dilation)
- </string>
- <string name="LSLTipText_llGetRegionFPS" translate="false">
-float llGetRegionFPS()
-Returns the mean region frames per second
- </string>
- <string name="LSLTipText_llParticleSystem" translate="false">
-llParticleSystem(list rules)
-Creates a particle system based on rules. An empty list removes the particle system.
-List format is [ rule1, data1, rule2, data2 . . . rulen, datan ]
- </string>
- <string name="LSLTipText_llGroundRepel" translate="false">
-llGroundRepel(float height, integer water, float tau)
-Critically damps to height if within height*0.5 of level (either above ground level, or above the higher of land and water if water == TRUE)
- </string>
- <string name="LSLTipText_llGiveInventoryList" translate="false">
-llGiveInventoryList(key target, string folder, list inventory)
-Gives inventory items to target, creating a new folder to put them in
- </string>
- <string name="LSLTipText_llSetVehicleType" translate="false">
-llSetVehicleType(integer type)
-Sets the vehicle to one of the default types
- </string>
- <string name="LSLTipText_llSetVehicleFloatParam" translate="false">
-llSetVehicleFloatParam(integer param, float value)
-Sets the specified vehicle float parameter
- </string>
- <string name="LSLTipText_llSetVehicleVectorParam" translate="false">
-llSetVehicleVectorParam(integer param, vector vec)
-Sets the specified vehicle vector parameter
- </string>
- <string name="LSLTipText_llSetVehicleRotationParam" translate="false">
-llSetVehicleVectorParam(integer param, rotation rot)
-Sets the specified vehicle rotation parameter
- </string>
- <string name="LSLTipText_llSetVehicleFlags" translate="false">
-llSetVehicleFlags(integer flags)
-Sets the enabled bits in &apos;flags&apos;
- </string>
- <string name="LSLTipText_llRemoveVehicleFlags" translate="false">
-llRemoveVehicleFlags(integer flags)
-Removes the enabled bits in &apos;flags&apos;
- </string>
- <string name="LSLTipText_llSitTarget" translate="false">
-llSitTarget(vector offset, rotation rot)
-Sets the sit location for the prim. If offset == &lt;0,0,0&gt; then the sit target is removed.
- </string>
- <string name="LSLTipText_llAvatarOnSitTarget" translate="false">
-key llAvatarOnSitTarget()
-If an avatar is seated on the sit target, returns the avatar&apos;s key, otherwise NULL_KEY
- </string>
- <string name="LSLTipText_llAddToLandPassList" translate="false">
-llAddToLandPassList(key avatar, float hours)
-Adds avatar to the land pass list for hours, or indefinitely if hours is 0
- </string>
- <string name="LSLTipText_llSetTouchText" translate="false">
-llSetTouchText(string text)
-Displays text rather than the default &apos;Touch&apos; in the pie menu
- </string>
- <string name="LSLTipText_llSetSitText" translate="false">
-llSetSitText(string text)
-Displays text rather than the default &apos;Sit Here&apos; in the pie menu
- </string>
- <string name="LSLTipText_llSetCameraEyeOffset" translate="false">
-llSetCameraEyeOffset(vector offset)
-Sets the camera eye offset for avatars that sit on the object
- </string>
- <string name="LSLTipText_llSetCameraAtOffset" translate="false">
-llSetCameraAtOffset(vector offset)
-Sets the point the camera is looking at to offset for avatars that sit on the object
- </string>
- <string name="LSLTipText_llDumpList2String" translate="false">
-string llDumpList2String(list src, string separator)
-Returns the list in a single string, using separator between the entries
- </string>
- <string name="LSLTipText_llScriptDanger" translate="false">
-integer llScriptDanger(vector pos)
-Returns TRUE if pos is over public land, sandbox land, land that doesn&apos;t allow everyone to edit and build, or land that doesn&apos;t allow outside scripts
- </string>
- <string name="LSLTipText_llDialog" translate="false">
-llDialog(key avatar, string message, list buttons, integer chat_channel
-Shows a dialog box on the avatar&apos;s screen with a message and up to 12 buttons.
-If a button is pressed, the avatar says the text of the button label on chat_channel.
- </string>
- <string name="LSLTipText_llVolumeDetect" translate="false">
-llVolumeDetect(integer detect)
-If detect = TRUE, object works much like Phantom, but triggers collision_start and collision_end events when other objects start and stop interpenetrating.
-Must be applied to the root prim.
- </string>
- <string name="LSLTipText_llResetOtherScript" translate="false">
-llResetOtherScript(string name)
-Resets script name
- </string>
- <string name="LSLTipText_llGetScriptState" translate="false">
-integer llGetScriptState(string name)
-Returns TRUE if the script name is running
- </string>
- <string name="LSLTipText_llRemoteLoadScript" translate="false">
-DEPRECATED! Please use llRemoteLoadScriptPin instead.
- </string>
- <string name="LSLTipText_llSetRemoteScriptAccessPin" translate="false">
-llSetRemoteScriptAccessPin(integer pin)
-If pin is set to a non-zero number, allows a prim to have scripts remotely loaded via llRemoteLoadScriptPin when it passes in the correct pin. Otherwise, llRemoteLoadScriptPin is ignored.
- </string>
- <string name="LSLTipText_llRemoteLoadScriptPin" translate="false">
-llRemoteLoadScriptPin(key target, string name, integer pin, integer running, integer start_param)
-Copies script name onto target, if the owner of this scripted object can modify target and is in the same region, and the matching pin is used.
-If running == TRUE, starts the script with start_param
- </string>
- <string name="LSLTipText_llOpenRemoteDataChannel" translate="false">
-llOpenRemoteDataChannel()
-Creates a channel to listen for XML-RPC calls, and will trigger a remote_data event with channel id once it is available
- </string>
- <string name="LSLTipText_llSendRemoteData" translate="false">
-key llSendRemoteData(key channel, string dest, integer idata, string sdata)
-Sends an XML-RPC request to dest through channel with payload of channel (in a string), integer idata and string sdata.
-Returns a key that is the message_id for the resulting remote_data events.
- </string>
- <string name="LSLTipText_llRemoteDataReply" translate="false">
-llRemoteDataReply(key channel, key message_id, string sdata, integer idata)
-Sends an XML-RPC reply to message_id on channel with payload of string sdata and integer idata
- </string>
- <string name="LSLTipText_llCloseRemoteDataChannel" translate="false">
-llCloseRemoteDataChannel(key channel)
-Closes XML-RPC channel
- </string>
- <string name="LSLTipText_llMD5String" translate="false">
-string llMD5String(string src, integer nonce)
-Returns a string of 32 hex characters that is a RSA Data Security, Inc. MD5 Message-Digest Algorithm of src with nonce
- </string>
- <string name="LSLTipText_llSetPrimitiveParams" translate="false">
-llSetPrimitiveParams(list rules)
-Sets the prim&apos;s parameters according to rules
- </string>
- <string name="LSLTipText_llStringToBase64" translate="false">
-string llStringToBase64(string str)
-Converts a string to the Base64 representation of the string
- </string>
- <string name="LSLTipText_llBase64ToString" translate="false">
-string llBase64ToString(string str)
-Converts a Base64 string to a conventional string.
-If the conversion creates any unprintable characters, they are converted to spaces.
- </string>
- <string name="LSLTipText_llXorBase64Strings" translate="false">
-string llXorBase64Strings(string s1, string s2)
-DEPRECATED! Please use llXorBase64StringsCorrect instead.
-Incorrectly performs an exclusive or on two Base64 strings and returns a Base64 string. s2 repeats if it is shorter than s1. Retained for backwards compatability.
- </string>
- <string name="LSLTipText_llRemoteDataSetRegion" translate="false">
-llRemoteDataSetRegion()
-DEPRECATED! Please use llOpenRemoteDataChannel instead.
-If an object using remote data channels changes regions, you must call this function to reregister the remote data channels. This call is not needed if the prim does not change regions.
- </string>
- <string name="LSLTipText_llLog10" translate="false">
-float llLog10(float val)
-Returns the base 10 logarithm of val. Returns zero if val &lt;= 0.
- </string>
- <string name="LSLTipText_llLog" translate="false">
-float llLog(float val)
-Returns the natural logarithm of val. Returns zero if val &lt;= 0.
- </string>
- <string name="LSLTipText_llGetAnimationList" translate="false">
-list llGetAnimationList(key id)
-Returns a list of keys of playing animations for avatar described by id
- </string>
- <string name="LSLTipText_llSetParcelMusicURL" translate="false">
-llSetParcelMusicURL(string url)
-Sets the streaming audio URL for the parcel which the object is on
- </string>
- <string name="LSLTipText_llGetRootPosition" translate="false">
-vector llGetRootPosition()
-Returns the position (in region coordinates) of the root prim of the object which the script is attached to
- </string>
- <string name="LSLTipText_llGetRootRotation" translate="false">
-rotation llGetRootRotation()
-Returns the rotation (relative to the region) of the root prim of the object which the script is attached to
- </string>
- <string name="LSLTipText_llGetObjectDesc" translate="false">
-string llGetObjectDesc()
-Returns the description of the prim the script is attached to
- </string>
- <string name="LSLTipText_llSetObjectDesc" translate="false">
-llSetObjectDesc(string name)
-Sets the prim&apos;s description
- </string>
- <string name="LSLTipText_llGetCreator" translate="false">
-key llGetCreator()
-Returns a key for the creator of the prim
- </string>
- <string name="LSLTipText_llGetTimestamp" translate="false">
-string llGetTimestamp()
-Returns the timestamp in the UTC time zone in the format: YYYY-MM-DDThh:mm:ss.ff..fZ
- </string>
- <string name="LSLTipText_llSetLinkAlpha" translate="false">
-llSetLinkAlpha(integer linknumber, float alpha, integer face)
-If a prim exists in the link chain at linknumber, sets face to alpha
- </string>
- <string name="LSLTipText_llGetNumberOfPrims" translate="false">
-integer llGetNumberOfPrims()
-Returns the number of prims in a link set the script is attached to
- </string>
- <string name="LSLTipText_llGetNumberOfNotecardLines" translate="false">
-key llGetNumberOfNotecardLines(string name)
-Returns number of lines in notecard name via the dataserver event (cast return value to integer)
- </string>
- <string name="LSLTipText_llGetBoundingBox" translate="false">
-list llGetBoundingBox(key object)
-Returns the bounding box around the object (including any linked prims) relative to its root prim, in a list in the format [ (vector) min_corner, (vector) max_corner ]
- </string>
- <string name="LSLTipText_llGetGeometricCenter" translate="false">
-vector llGetGeometricCenter()
-Returns the geometric center of the linked set the script is attached to.
- </string>
- <string name="LSLTipText_llGetPrimitiveParams" translate="false">
-list llGetPrimitiveParams(list params)
-Returns the primitive parameters specified in the params list.
- </string>
- <string name="LSLTipText_llIntegerToBase64" translate="false">
-string llIntegerToBase64(integer number)
-Returns a string that is a Base64 big endian encode of number
- </string>
- <string name="LSLTipText_llBase64ToInteger" translate="false">
-integer llBase64ToInteger(string str)
-Returns an integer that is the str Base64 decoded as a big endian integer
- </string>
- <string name="LSLTipText_llGetGMTclock" translate="false">
-float llGetGMTclock()
-Returns the time in seconds since midnight GMT
- </string>
- <string name="LSLTipText_llGetSimulatorHostname" translate="false">
-string llGetSimulatorHostname()
-Returns the hostname of the machine which the script is running on (same as string in viewer Help dialog)
- </string>
- <string name="LSLTipText_llSetLocalRot" translate="false">
-llSetLocalRot(rotation rot)
-Sets the rotation of a child prim relative to the root prim
- </string>
- <string name="LSLTipText_llParseStringKeepNulls" translate="false">
-list llParseStringKeepNulls(string src, list separators, list spacers)
-Breaks src into a list, discarding separators, keeping spacers, keeping any null values generated.
-(separators and spacers must be lists of strings, maximum of 8 each)
- </string>
- <string name="LSLTipText_llRezAtRoot" translate="false">
-llRezAtRoot(string inventory, vector pos, vector vel, rotation rot, integer param)
-Instantiates owner&apos;s inventory object rotated to rot with its root at pos, moving at vel, using param as the start parameter
- </string>
- <string name="LSLTipText_llGetObjectPermMask" translate="false">
-integer llGetObjectPermMask(integer mask)
-Returns the requested permission mask for the root object the task is attached to
- </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 (requires God Mode)
- </string>
- <string name="LSLTipText_llGetInventoryPermMask" translate="false">
-integer llGetInventoryPermMask(string item, integer mask)
-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 (requires God Mode)
- </string>
- <string name="LSLTipText_llGetInventoryCreator" translate="false">
-key llGetInventoryCreator(string item)
-Returns a key for the creator of the inventory item
- </string>
- <string name="LSLTipText_llOwnerSay" translate="false">
-llOwnerSay(string msg)
-Says msg to owner only. (Owner must be in the same region.)
- </string>
- <string name="LSLTipText_llRequestSimulatorData" translate="false">
-key llRequestSimulatorData(string simulator, integer data)
-Requests data about simulator. When data is available the dataserver event will be raised.
- </string>
- <string name="LSLTipText_llForceMouselook" translate="false">
-llForceMouselook(integer mouselook)
-If mouselook is TRUE, any avatar that sits upon the prim will be forced into mouselook mode
- </string>
- <string name="LSLTipText_llGetObjectMass" translate="false">
-float llGetObjectMass(key id)
-Returns the mass of the avatar or object in the region
- </string>
- <string name="LSLTipText_llListReplaceList" translate="false">
-list llListReplaceList(list dest, list src, integer start, integer end)
-Returns a list that is dest with start through end removed and src inserted at start
- </string>
- <string name="LSLTipText_llLoadURL" translate="false">
-llLoadURL(key avatar, string message, string url)
-Shows a dialog to avatar offering to load the web page at url with a message.
-If user clicks yes, launches the page in their web browser.
- </string>
- <string name="LSLTipText_llParcelMediaCommandList" translate="false">
-llParcelMediaCommandList(list command)
-Sends a list of commands, some with arguments, to a parcel to control the playback of movies and other media
- </string>
- <string name="LSLTipText_llParcelMediaQuery" translate="false">
-list llParcelMediaQuery(list query)
-Returns a list containing results of the sent query
- </string>
- <string name="LSLTipText_llModPow" translate="false">
-integer llModPow(integer a, integer b, integer c)
-Returns a raised to the b power, mod c. ( (a**b)%c )
-b is capped at 0xFFFF (16 bits).
- </string>
- <string name="LSLTipText_llGetInventoryType" translate="false">
-integer llGetInventoryType(string name)
-Returns the type of the inventory item name
- </string>
- <string name="LSLTipText_llSetPayPrice" translate="false">
-llSetPayPrice(integer price, list quick_pay_buttons)
-Sets the default amount on the dialog that appears when someone chooses to pay this prim
- </string>
- <string name="LSLTipText_llGetCameraPos" translate="false">
-vector llGetCameraPos()
-Returns the current camera position for the agent the task has permissions for
- </string>
- <string name="LSLTipText_llGetCameraRot" translate="false">
-rotation llGetCameraRot()
-Returns the current camera orientation for the agent the task has permissions for
- </string>
- <string name="LSLTipText_llSetPrimURL" translate="false">
-llSetPrimURL(string url)
-Updates the URL for the web page shown on the sides of the object
- </string>
- <string name="LSLTipText_llRefreshPrimURL" translate="false">
-llRefreshPrimURL()
-Reloads the web page shown on the sides of the object
- </string>
- <string name="LSLTipText_llEscapeURL" translate="false">
-string llEscapeURL(string url)
-Returns an escaped/encoded version of url, replacing spaces with %20 etc.
- </string>
- <string name="LSLTipText_llUnescapeURL" translate="false">
-string llUnescapeURL(string url)
-Returns an unescaped/ unencoded version of url, replacing %20 with spaces etc.
- </string>
- <string name="LSLTipText_llMapDestination" translate="false">
-llMapDestination(string simname, vector pos, vector look_at)
-Opens the World Map centered on the region simname with pos highlighted. (NOTE: look_at currently does nothing.)
-Only works for scripts attached to avatar, or during touch events.
- </string>
- <string name="LSLTipText_llAddToLandBanList" translate="false">
-llAddToLandBanList(key avatar, float hours)
-Adds avatar to the land ban list for hours, or indefinitely if hours is 0
- </string>
- <string name="LSLTipText_llRemoveFromLandPassList" translate="false">
-llRemoveFromLandPassList(key avatar)
-Removes avatar from the land pass list
- </string>
- <string name="LSLTipText_llRemoveFromLandBanList" translate="false">
-llRemoveFromLandBanList(key avatar)
-Removes avatar from the land ban list
- </string>
- <string name="LSLTipText_llSetCameraParams" translate="false">
-llSetCameraParams(list rules)
-Sets multiple camera parameters at once.
-List format is [ rule1, data1, rule2, data2 . . . rulen, datan ]
- </string>
- <string name="LSLTipText_llClearCameraParams" translate="false">
-llClearCameraParams()
-Resets all camera parameters to default values and turns off scripted camera control
- </string>
- <string name="LSLTipText_llListStatistics" translate="false">
-float llListStatistics(integer operation, list src)
-Performs statistical aggregate functions on list src using LIST_STAT_* operations
- </string>
- <string name="LSLTipText_llGetUnixTime" translate="false">
-integer llGetUnixTime()
-Returns the number of seconds elapsed since 00:00 hours, Jan 1, 1970 UTC from the system clock
- </string>
- <string name="LSLTipText_llGetParcelFlags" translate="false">
-integer llGetParcelFlags(vector pos)
-Returns a mask of the parcel flags (PARCEL_FLAG_*) for the parcel that includes the point pos
- </string>
- <string name="LSLTipText_llGetRegionFlags" translate="false">
-integer llGetRegionFlags()
-Returns the region flags (REGION_FLAG_*) for the region the object is in
- </string>
- <string name="LSLTipText_llXorBase64StringsCorrect" translate="false">
-string llXorBase64StringsCorrect(string s1, string s2)
-Correctly performs an exclusive or on two Base64 strings and returns a Base64 string.
-s2 repeats if it is shorter than s1.
- </string>
- <string name="LSLTipText_llHTTPRequest" translate="false">
-llHTTPRequest(string url, list parameters, string body)
-Sends an HTTP request to the specified url with the body of the request and parameters
- </string>
- <string name="LSLTipText_llResetLandBanList" translate="false">
-llResetLandBanList()
-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
- </string>
- <string name="LSLTipText_llGetObjectPrimCount" translate="false">
-integer llGetObjectPrimCount(key object_id)
-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.
-Requires owner-like permissions for the parcel.
- </string>
- <string name="LSLTipText_llGetParcelPrimCount" translate="false">
-integer llGetParcelPrimCount(vector pos, integer category, integer sim_wide)
-Returns the number of prims on the parcel at pos of the given category.
-Categories: PARCEL_COUNT_TOTAL, _OWNER, _GROUP, _OTHER, _SELECTED, _TEMP
- </string>
- <string name="LSLTipText_llGetParcelMaxPrims" translate="false">
-integer llGetParcelMaxPrims(vector pos, integer sim_wide)
-Returns the maximum number of prims allowed on the parcel at pos
- </string>
- <string name="LSLTipText_llGetParcelDetails" translate="false">
- list llGetParcelDetails(vector pos, list params)
- Returns the parcel details specified in params for the parcel at pos.
- Params is one or more of: PARCEL_DETAILS_NAME, _DESC, _OWNER, _GROUP, _AREA, _ID, _SEE_AVATARS
- </string>
- <string name="LSLTipText_llSetLinkPrimitiveParams" translate="false">
-llSetLinkPrimitiveParams(integer linknumber, list rules)
-Sets primitive parameters for linknumber based on rules
- </string>
- <string name="LSLTipText_llSetLinkTexture" translate="false">
-llSetLinkTexture(integer linknumber, string texture, integer face)
-Sets the texture of face for a task that exists in the link chain at linknumber
- </string>
- <string name="LSLTipText_llStringTrim" translate="false">
-string llStringTrim(string src, integer trim_type)
-Trims the leading and/or trailing white spaces from a string.
-trim_type can be STRING_TRIM, STRING_TRIM_HEAD or STRING_TRIM_TAIL.
- </string>
- <string name="LSLTipText_llRegionSay" translate="false">
-llRegionSay(integer channel, string msg)
-Broadcasts msg on channel (not 0) that can be heard anywhere in the region by a script listening on channel
- </string>
- <string name="LSLTipText_llGetObjectDetails" translate="false">
-list llGetObjectDetails(key id, list params)
-Returns the object details specified in params for the object with key id.
-Params are OBJECT_NAME, _DESC, _POS, _ROT, _VELOCITY, _OWNER, _GROUP, _CREATOR
- </string>
- <string name="LSLTipText_llSetClickAction" translate="false">
-llSetClickAction(integer action)
-Sets the action performed when a prim is clicked upon
- </string>
- <string name="LSLTipText_llGetRegionAgentCount" translate="false">
-integer llGetRegionAgentCount()
-Returns the number of avatars in the region
- </string>
- <string name="LSLTipText_llTextBox" translate="false">
-llTextBox(key avatar, string message, integer chat_channel)
-Shows a window on the avatar&apos;s screen with the message.
-It contains a text box for input, and if entered that text is chatted on chat_channel.
- </string>
- <string name="LSLTipText_llGetAgentLanguage" translate="false">
-string llGetAgentLanguage(key avatar)
-Returns the language code of the preferred interface language of the avatar
- </string>
- <string name="LSLTipText_llDetectedTouchUV" translate="false">
-vector llDetectedTouchUV(integer index)
-Returns the u and v coordinates in the first two components of a vector, for the texture coordinates where the prim was touched in a triggered touch event
- </string>
- <string name="LSLTipText_llDetectedTouchFace" translate="false">
-integer llDetectedTouchFace(integer index)
-Returns the index of the face where the avatar clicked in a triggered touch event
- </string>
- <string name="LSLTipText_llDetectedTouchPos" translate="false">
-vector llDetectedTouchPos(integer index)
-Returns the position where the object was touched in a triggered touch event
- </string>
- <string name="LSLTipText_llDetectedTouchNormal" translate="false">
-vector llDetectedTouchNormal(integer index)
-Returns the surface normal for a triggered touch event
- </string>
- <string name="LSLTipText_llDetectedTouchBinormal" translate="false">
-vector llDetectedTouchBinormal(integer index)
-Returns the surface binormal for a triggered touch event
- </string>
- <string name="LSLTipText_llDetectedTouchST" translate="false">
-vector llDetectedTouchST(integer index)
-Returns the s and t coordinates in the first two components of a vector, for the surface coordinates where the prim was touched in a triggered touch event
- </string>
- <string name="LSLTipText_llSHA1String" translate="false">
-string llSHA1String(string src)
-Returns a string of 40 hex characters that is the SHA1 security Hash of src
- </string>
- <string name="LSLTipText_llGetFreeURLs" translate="false">
-integer llGetFreeURLs()
-Returns the number of available URLs for the current script
- </string>
- <string name="LSLTipText_llRequestURL" translate="false">
-key llRequestURL()
-Requests one HTTP:// url for use by this object.
-An http_request event is triggered with the results.
- </string>
- <string name="LSLTipText_llRequestSecureURL" translate="false">
-key llRequestSecureURL()
-Requests one HTTPS:// (SSL) url for use by this object.
-An http_request event is triggered with the results.
- </string>
- <string name="LSLTipText_llReleaseURL" translate="false">
-llReleaseURL(string url)
-Releases the specified URL, it will no longer be usable
- </string>
- <string name="LSLTipText_llHTTPResponse" translate="false">
-llHTTPResponse(key request_id, integer status, string body)
-Responds to request_id with status and body
- </string>
- <string name="LSLTipText_llGetHTTPHeader" translate="false">
-string llGetHTTPHeader(key request_id, string header)
-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.
-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>
- <string name="LSLTipText_llGetPrimMediaParams" translate="false">
-list llGetPrimMediaParams(integer face, list params)
-Returns the media params for a particular face on an object, given the desired list of names, in the order requested.
-(Returns an empty list if no media exists on the face.)
- </string>
- <string name="LSLTipText_llClearPrimMedia" translate="false">
-llClearPrimMedia(integer face)
-Clears (deletes) the media and all params from the given face.
- </string>
-<string name="LSLTipText_llSetLinkPrimitiveParamsFast" translate="false">
-llSetLinkPrimitiveParamsFast(integer linknumber,list rules)
-Set primitive parameters for linknumber based on rules.
-</string>
-<string name="LSLTipText_llGetLinkPrimitiveParams" translate="false">
-llGetLinkPrimitiveParams(integer linknumber,list rules)
-Get primitive parameters for linknumber based on rules.
-</string>
-<string name="LSLTipText_llLinkParticleSystem" translate="false">
-llLinkParticleSystem(integer linknumber,list rules)
-Creates a particle system based on rules. Empty list removes particle system from object.
-List format is [ rule1, data1, rule2, data2 . . . rulen, datan ].
-</string>
-<string name="LSLTipText_llSetLinkTextureAnim" translate="false">
-llSetLinkTextureAnim(integer link, integer mode, integer face, integer sizex, integer sizey, float start, float length, float rate)
-Animate the texture on the specified prim's face/faces.
-</string>
-<string name="LSLTipText_llGetLinkNumberOfSides" translate="false">
-integer llGetLinkNumberOfSides(integer link)
-Returns the number of sides of the specified linked prim.
-</string>
-<string name="LSLTipText_llGetUsername" translate="false">
-string llGetUsername(key id)
-Returns the single-word username of an avatar, iff the avatar is in the current region, otherwise the empty string.
-</string>
-<string name="LSLTipText_llRequestUsername" translate="false">
-key llRequestUsername(key id)
-Requests single-word username of an avatar. When data is available the dataserver event will be raised.
-</string>
-<string name="LSLTipText_llGetDisplayName" translate="false">
- string llGetDisplayName(key id)
- Returns the name of an avatar, iff the avatar is in the current simulator, and the name has been cached, otherwise the same as llGetUsername. Use llRequestDisplayName if you absolutely must have the display name.
-</string>
-<string name="LSLTipText_llRequestDisplayName" translate="false">
-key llRequestDisplayName(key id)
-Requests name of an avatar. When data is available the dataserver event will be raised.
-</string>
-<string name="LSLTipText_llRegionSayTo" translate="false">
-llRegionSayTo(key target, integer channel, string msg)
-Sends msg on channel (not DEBUG_CHANNEL) directly to prim or avatar target anywhere within the region
-</string>
-<string name="LSLTipText_llGetEnv" translate="false">
-llGetEnv(string name)
-Returns a string with the requested data about the region
-</string>
-
-
- <!-- Avatar busy/away mode -->
- <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>
- <string name="hair">Hair</string>
- <string name="eyes">Eyes</string>
- <string name="shirt">Shirt</string>
- <string name="pants">Pants</string>
- <string name="shoes">Shoes</string>
- <string name="socks">Socks</string>
- <string name="jacket">Jacket</string>
- <string name="gloves">Gloves</string>
- <string name="undershirt">Undershirt</string>
- <string name="underpants">Underpants</string>
- <string name="skirt">Skirt</string>
- <string name="alpha">Alpha</string>
- <string name="tattoo">Tattoo</string>
- <string name="physics">Physics</string>
- <string name="invalid">invalid</string>
- <string name="none">none</string>
-
- <!-- Not Worn Wearable Types -->
- <string name="shirt_not_worn">Shirt not worn</string>
- <string name="pants_not_worn">Pants not worn</string>
- <string name="shoes_not_worn">Shoes not worn</string>
- <string name="socks_not_worn">Socks not worn</string>
- <string name="jacket_not_worn">Jacket not worn</string>
- <string name="gloves_not_worn">Gloves not worn</string>
- <string name="undershirt_not_worn">Undershirt not worn</string>
- <string name="underpants_not_worn">Underpants not worn</string>
- <string name="skirt_not_worn">Skirt not worn</string>
- <string name="alpha_not_worn">Alpha not worn</string>
- <string name="tattoo_not_worn">Tattoo not worn</string>
- <string name="physics_not_worn">Physics not worn</string>
- <string name="invalid_not_worn">invalid</string>
-
- <!-- Create new wearable of the specified type -->
- <string name="create_new_shape">Create new shape</string>
- <string name="create_new_skin">Create new skin</string>
- <string name="create_new_hair">Create new hair</string>
- <string name="create_new_eyes">Create new eyes</string>
- <string name="create_new_shirt">Create new shirt</string>
- <string name="create_new_pants">Create new pants</string>
- <string name="create_new_shoes">Create new shoes</string>
- <string name="create_new_socks">Create new socks</string>
- <string name="create_new_jacket">Create new jacket</string>
- <string name="create_new_gloves">Create new gloves</string>
- <string name="create_new_undershirt">Create new undershirt</string>
- <string name="create_new_underpants">Create new underpants</string>
- <string name="create_new_skirt">Create new skirt</string>
- <string name="create_new_alpha">Create new alpha</string>
- <string name="create_new_tattoo">Create new tattoo</string>
- <string name="create_new_physics">Create new physics</string>
- <string name="create_new_invalid">invalid</string>
-
- <!-- Wearable List-->
- <string name="NewWearable">New [WEARABLE_ITEM]</string>
-
- <!-- LLGroupNotify -->
- <!-- used in the construction of a Group Notice blue dialog box, buttons, tooltip etc. Seems to be no longer utilized by code in Viewer 2.0 -->
- <string name="next">Next</string>
- <string name="ok">OK</string>
- <string name="GroupNotifyGroupNotice">Group Notice</string>
- <string name="GroupNotifyGroupNotices">Group Notices</string>
- <string name="GroupNotifySentBy">Sent by</string>
- <string name="GroupNotifyAttached">Attached:</string>
- <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="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>
- <string name="BodyPartsLeftArm">Left Arm</string>
- <string name="BodyPartsLeftLeg">Left Leg</string>
- <string name="BodyPartsTorso">Torso</string>
- <string name="BodyPartsRightLeg">Right Leg</string>
-
- <!-- slider -->
- <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">Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].</string>
- <string name="PlacesNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search].</string>
- <string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string>
- <string name="InventoryNoTexture">You do not have a copy of this texture in your inventory</string>
- <string name="InventoryInboxNoItems">Your Marketplace purchases will appear here. You may then drag them into your inventory to use them.</string>
- <string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string>
- <string name="MarketplaceURL_CreateStore">http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4</string>
- <string name="MarketplaceURL_Dashboard">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard</string>
- <string name="MarketplaceURL_Imports">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports</string>
- <string name="MarketplaceURL_LearnMore">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more</string>
- <string name="InventoryOutboxNotMerchantTitle">Anyone can sell items on the Marketplace.</string>
- <string name="InventoryOutboxNotMerchantTooltip"></string>
- <string name="InventoryOutboxNotMerchant">
-If you'd like to become a merchant, you'll need to [[MARKETPLACE_CREATE_STORE_URL] create a Marketplace store].
- </string>
- <string name="InventoryOutboxNoItemsTitle">Your outbox is empty.</string>
- <string name="InventoryOutboxNoItemsTooltip"></string>
- <string name="InventoryOutboxNoItems">
-Drag folders to this area and click "Send to Marketplace" to list them for sale on the [[MARKETPLACE_DASHBOARD_URL] Marketplace].
- </string>
-
- <string name="Marketplace Error None">No errors</string>
- <string name="Marketplace Error Not Merchant">Error: Before sending items to the Marketplace you will need to set yourself up as a merchant (free of charge).</string>
- <string name="Marketplace Error Empty Folder">Error: This folder has no contents.</string>
- <string name="Marketplace Error Unassociated Products">Error: This item failed to upload because your merchant account has too many items unassociated with products. To fix this error, log in to the marketplace website and reduce your unassociated item count.</string>
-
- <string name="Marketplace Error Object Limit">Error: This item contains too many objects. Fix this error by placing objects together in boxes to reduce the total count to less than 200.</string>
- <string name="Marketplace Error Folder Depth">Error: This item contains too many levels of nested folders. Reorganize it to a maximum of 3 levels of nested folders.</string>
- <string name="Marketplace Error Unsellable Item">Error: This item can not be sold on the marketplace.</string>
- <string name="Marketplace Error Internal Import">Error: There was a problem with this item. Try again later.</string>
-
- <string name="Open landmarks">Open landmarks</string>
-
- <!-- use value="" because they have preceding spaces -->
- <string name="no_transfer" value=" (no transfer)" />
- <string name="no_modify" value=" (no modify)" />
- <string name="no_copy" value=" (no copy)" />
- <string name="worn" value=" (worn)" />
- <string name="link" value=" (link)" />
- <string name="broken_link" value=" (broken_link)" />
- <string name="LoadingContents">Loading contents...</string>
- <string name="NoContents">No contents</string>
- <string name="WornOnAttachmentPoint" value=" (worn on [ATTACHMENT_POINT])" />
- <string name="ActiveGesture" value="[GESLABEL] (active)"/>
- <!-- Inventory permissions -->
- <string name="PermYes">Yes</string>
- <string name="PermNo">No</string>
-
- <!-- Gestures labels -->
- <!-- use value="" because they have preceding spaces -->
- <string name="Chat Message" value=" Chat : " />
- <string name="Sound" value=" Sound : " />
- <string name="Wait" value=" --- Wait : " />
- <string name="AnimFlagStop" value=" Stop Animation : " />
- <string name="AnimFlagStart" value=" Start Animation : " />
- <string name="Wave" value=" Wave " />
- <string name="GestureActionNone" value="None" />
- <string name="HelloAvatar" value=" Hello, avatar! " />
- <string name="ViewAllGestures" value=" View All &gt;&gt;" />
- <string name="GetMoreGestures" value=" Get More &gt;&gt;" />
-
- <!-- inventory filter -->
- <!-- use value="" because they have preceding spaces -->
- <string name="Animations" value=" Animations," />
- <string name="Calling Cards" value=" Calling Cards," />
- <string name="Clothing" value=" Clothing," />
- <string name="Gestures" value=" Gestures," />
- <string name="Landmarks" value=" Landmarks," />
- <string name="Notecards" value=" Notecards," />
- <string name="Objects" value=" Objects," />
- <string name="Scripts" value=" Scripts," />
- <string name="Sounds" value=" Sounds," />
- <string name="Textures" value=" Textures," />
- <string name="Snapshots" value=" Snapshots," />
- <string name="No Filters" value="No " />
- <string name="Since Logoff" value=" - Since Logoff" />
-
- <!-- inventory folder -->
- <string name="InvFolder My Inventory">My Inventory</string>
- <string name="InvFolder Library">Library</string>
- <string name="InvFolder Textures">Textures</string>
- <string name="InvFolder Sounds">Sounds</string>
- <string name="InvFolder Calling Cards">Calling Cards</string>
- <string name="InvFolder Landmarks">Landmarks</string>
- <string name="InvFolder Scripts">Scripts</string>
- <string name="InvFolder Clothing">Clothing</string>
- <string name="InvFolder Objects">Objects</string>
- <string name="InvFolder Notecards">Notecards</string>
- <string name="InvFolder New Folder">New Folder</string>
- <string name="InvFolder Inventory">Inventory</string>
- <string name="InvFolder Uncompressed Images">Uncompressed Images</string>
- <string name="InvFolder Body Parts">Body Parts</string>
- <string name="InvFolder Trash">Trash</string>
- <string name="InvFolder Photo Album">Photo Album</string>
- <string name="InvFolder Lost And Found">Lost And Found</string>
- <string name="InvFolder Uncompressed Sounds">Uncompressed Sounds</string>
- <string name="InvFolder Animations">Animations</string>
- <string name="InvFolder Gestures">Gestures</string>
- <string name="InvFolder Favorite">My Favorites</string>
- <!-- historically default name of the Favorites folder can start from either "f" or "F" letter.
- We should localize both of them with the same value -->
- <string name="InvFolder favorite">My Favorites</string>
- <string name="InvFolder Current Outfit">Current Outfit</string>
- <string name="InvFolder Initial Outfits">Initial Outfits</string>
- <string name="InvFolder My Outfits">My Outfits</string>
- <string name="InvFolder Accessories">Accessories</string>
- <string name="InvFolder Meshes">Meshes</string>
-
- <!-- are used for Friends and Friends/All folders in Inventory "Calling cards" folder. See EXT-694-->
- <string name="InvFolder Friends">Friends</string>
- <string name="InvFolder All">All</string>
-
- <string name="no_attachments">No attachments worn</string>
- <string name="Attachments remain">Attachments ([COUNT] slots remain)</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="Light">Light</string>
-
- <!-- keyboard -->
- <string name="KBShift">Shift</string>
- <string name="KBCtrl">Ctrl</string>
-
- <!-- Avatar Skeleton -->
- <string name="Chest">Chest</string>
- <string name="Skull">Skull</string>
- <string name="Left Shoulder">Left Shoulder</string>
- <string name="Right Shoulder">Right Shoulder</string>
- <string name="Left Hand">Left Hand</string>
- <string name="Right Hand">Right Hand</string>
- <string name="Left Foot">Left Foot</string>
- <string name="Right Foot">Right Foot</string>
- <string name="Spine">Spine</string>
- <string name="Pelvis">Pelvis</string>
- <string name="Mouth">Mouth</string>
- <string name="Chin">Chin</string>
- <string name="Left Ear">Left Ear</string>
- <string name="Right Ear">Right Ear</string>
- <string name="Left Eyeball">Left Eyeball</string>
- <string name="Right Eyeball">Right Eyeball</string>
- <string name="Nose">Nose</string>
- <string name="R Upper Arm">R Upper Arm</string>
- <string name="R Forearm">R Forearm</string>
- <string name="L Upper Arm">L Upper Arm</string>
- <string name="L Forearm">L Forearm</string>
- <string name="Right Hip">Right Hip</string>
- <string name="R Upper Leg">R Upper Leg</string>
- <string name="R Lower Leg">R Lower Leg</string>
- <string name="Left Hip">Left Hip</string>
- <string name="L Upper Leg">L Upper Leg</string>
- <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="Neck">Neck</string>
- <string name="Avatar Center">Avatar Center</string>
- <string name="Invalid Attachment">Invalid Attachment Point</string>
-
- <!-- Avatar age computation, see LLDateUtil::ageFromDate -->
- <string name="YearsMonthsOld">[AGEYEARS] [AGEMONTHS] old</string>
- <string name="YearsOld">[AGEYEARS] old</string>
- <string name="MonthsOld">[AGEMONTHS] old</string>
- <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
- For example, LLTrans::getCountString("AgeYears", 3) is plural form B
- in English and form C in Russian -->
- <string name="AgeYearsA">[COUNT] year</string>
- <string name="AgeYearsB">[COUNT] years</string>
- <string name="AgeYearsC">[COUNT] years</string>
- <string name="AgeMonthsA">[COUNT] month</string>
- <string name="AgeMonthsB">[COUNT] months</string>
- <string name="AgeMonthsC">[COUNT] months</string>
- <string name="AgeWeeksA">[COUNT] week</string>
- <string name="AgeWeeksB">[COUNT] weeks</string>
- <string name="AgeWeeksC">[COUNT] weeks</string>
- <string name="AgeDaysA">[COUNT] day</string>
- <string name="AgeDaysB">[COUNT] days</string>
- <string name="AgeDaysC">[COUNT] days</string>
- <!-- Group member counts -->
- <string name="GroupMembersA">[COUNT] member</string>
- <string name="GroupMembersB">[COUNT] members</string>
- <string name="GroupMembersC">[COUNT] members</string>
-
- <!-- Account types, see LLAvatarPropertiesProcessor -->
- <string name="AcctTypeResident">Resident</string>
- <string name="AcctTypeTrial">Trial</string>
- <string name="AcctTypeCharterMember">Charter Member</string>
- <string name="AcctTypeEmployee">Linden Lab Employee</string>
- <string name="PaymentInfoUsed">Payment Info Used</string>
- <string name="PaymentInfoOnFile">Payment Info On File</string>
- <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>
-
- <!-- compile queue-->
- <string name="CompileQueueDownloadedCompiling">Downloaded, now compiling</string>
- <string name="CompileQueueScriptNotFound">Script not found on server.</string>
- <string name="CompileQueueProblemDownloading">Problem downloading</string>
- <string name="CompileQueueInsufficientPermDownload">Insufficient permissions to download a script.</string>
- <string name="CompileQueueInsufficientPermFor">Insufficient permissions for</string>
- <string name="CompileQueueUnknownFailure">Unknown failure to download</string>
- <string name="CompileQueueTitle">Recompilation Progress</string>
- <string name="CompileQueueStart">recompile</string>
- <string name="ResetQueueTitle">Reset Progress</string>
- <string name="ResetQueueStart">reset</string>
- <string name="RunQueueTitle">Set Running Progress</string>
- <string name="RunQueueStart">set running</string>
- <string name="NotRunQueueTitle">Set Not Running Progress</string>
- <string name="NotRunQueueStart">set not running</string>
-
- <!-- compile comment text-->
- <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>
-
- <!-- 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="SummaryForTheWeek" value="Summary for this week, beginning on " />
- <string name="NextStipendDay" value="The next stipend day is " />
- <string name="GroupPlanningDate">[mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]</string>
- <string name="GroupIndividualShare" value=" Group Individual Share" />
- <string name="GroupColumn" value=" Group" />
- <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 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 about land -->
- <string name="Anyone">anyone</string>
-
- <!-- floater region info -->
- <!-- The following will replace variable [ALL_ESTATES] in notifications EstateAllowed*, EstateBanned*, EstateManager* -->
- <string name="RegionInfoError">error</string>
- <string name="RegionInfoAllEstatesOwnedBy">
- all estates owned by [OWNER]
- </string>
- <string name="RegionInfoAllEstatesYouOwn">all estates that you own</string>
- <string name="RegionInfoAllEstatesYouManage">
- all estates that you manage for [OWNER]
- </string>
- <string name="RegionInfoAllowedResidents">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="PanelContentsTooltip">Content of object</string>
- <string name="PanelContentsNewScript">New Script</string>
-
- <!-- panel preferences general -->
- <string name="BusyModeResponseDefault">The Resident you messaged is in &apos;busy mode&apos; which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing.</string>
-
- <!-- Mute -->
- <string name="MuteByName">(By name)</string>
- <string name="MuteAgent">(Resident)</string>
- <string name="MuteObject">(Object)</string>
- <string name="MuteGroup">(Group)</string>
- <string name="MuteExternal">(External)</string>
-
- <!-- Region/Estate Covenant -->
- <string name="RegionNoCovenant">There is no Covenant provided for this Estate.</string>
- <string name="RegionNoCovenantOtherOwner">There is no Covenant provided for this Estate. The land on this estate is being sold by the Estate owner, not Linden Lab. Please contact the Estate Owner for sales details.</string>
- <string name="covenant_last_modified" value="Last Modified: " /> <!-- use value="" to keep the trailing space -->
- <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>
-
- <!-- Environment settings -->
- <string name="LocalSettings">Local Settings</string>
- <string name="RegionSettings">Region Settings</string>
-
- <!-- panel classified -->
- <string name="ClassifiedClicksTxt">Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile</string>
- <string name="ClassifiedUpdateAfterPublish">(will update after publish)</string>
-
- <!-- panel picks -->
- <string name="NoPicksClassifiedsText">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 classifieds</string>
- <string name="PicksClassifiedsLoadingText">Loading...</string>
-
- <!-- Multi Preview Floater -->
- <string name="MultiPreviewTitle">Preview</string>
- <string name="MultiPropertiesTitle">Properties</string>
-
- <!-- inventory offer -->
- <string name="InvOfferAnObjectNamed">An object named</string>
- <string name="InvOfferOwnedByGroup">owned by the group</string>
- <string name="InvOfferOwnedByUnknownGroup">owned by an unknown group</string>
- <string name="InvOfferOwnedBy">owned by</string>
- <string name="InvOfferOwnedByUnknownUser">owned by an unknown user</string>
- <string name="InvOfferGaveYou">gave you</string>
- <string name="InvOfferDecline">You decline [DESC] from &lt;nolink&gt;[NAME]&lt;/nolink&gt;.</string>
-
- <!-- group money -->
- <string name="GroupMoneyTotal">Total</string>
- <string name="GroupMoneyBought">bought</string>
- <string name="GroupMoneyPaidYou">paid you</string>
- <string name="GroupMoneyPaidInto">paid into</string>
- <string name="GroupMoneyBoughtPassTo">bought pass to</string>
- <string name="GroupMoneyPaidFeeForEvent">paid fee for event</string>
- <string name="GroupMoneyPaidPrizeForEvent">paid prize for event</string>
- <string name="GroupMoneyBalance">Balance</string>
- <string name="GroupMoneyCredits">Credits</string>
- <string name="GroupMoneyDebits">Debits</string>
- <string name="GroupMoneyDate">[weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]</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 [NAME] costs L$ [AMOUNT]</string>
- <string name="BuyingCosts">Buying this costs L$ [AMOUNT]</string>
- <string name="UnknownFileExtension">
- Unknown file extension .%s
-Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
- </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>
- <string name="accel-mac-option">&#8997;</string>
- <string name="accel-mac-shift">&#8679;</string>
- <string name="accel-win-control">Ctrl+</string>
- <string name="accel-win-alt">Alt+</string>
- <string name="accel-win-shift">Shift+</string>
-
- <!-- Previews -->
- <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>
-
- <!-- Directions, HUD -->
- <string name="Direction_Forward">Forward</string>
- <string name="Direction_Left">Left</string>
- <string name="Direction_Right">Right</string>
- <string name="Direction_Back">Back</string>
- <string name="Direction_North">North</string>
- <string name="Direction_South">South</string>
- <string name="Direction_West">West</string>
- <string name="Direction_East">East</string>
- <string name="Direction_Up">Up</string>
- <string name="Direction_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>
-
- <!-- 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="Parks&amp;Nature">Parks &amp; Nature</string>
- <string name="Residential">Residential</string>
- <!--<string name="Shopping">Shopping</string> -->
- <string name="Stage">Stage</string>
- <string name="Other">Other</string>
- <string name="Rental">Rental</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>
-
- <!-- 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.
-Please see: http://wiki.secondlife.com/wiki/Client_parameters
-Error:
- </string>
- <string name="MBCmdLineUsg">[APP_NAME] Command line usage:</string>
- <string name="MBUnableToAccessFile">
- [APP_NAME] is unable to access a file that it needs.
-
-This can be because you somehow have multiple copies running, or your system incorrectly thinks a file is open.
-If this message persists, restart your computer and try again.
-If it continues to persist, you may need to completely uninstall [APP_NAME] and reinstall it.
- </string>
- <string name="MBFatalError">Fatal Error</string>
- <string name="MBRequiresAltiVec"> [APP_NAME] requires a processor with AltiVec (G4 or later).</string>
- <string name="MBAlreadyRunning">
- [APP_NAME] is already running.
-Check your task bar for a minimized copy of the program.
-If this message persists, restart your computer.
- </string>
- <string name="MBFrozenCrashed">
- [APP_NAME] appears to have frozen or crashed on the previous run.
-Would you like to send a crash report?
- </string>
- <string name="MBAlert">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.
-
-Do you wish to continue?
- </string>
- <string name="MBWarning">Warning</string>
- <string name="MBNoAutoUpdate">
- Automatic updating is not yet implemented for Linux.
-Please download the latest version from www.secondlife.com.
- </string>
- <string name="MBRegClassFailed">RegisterClass failed</string>
- <string name="MBError">Error</string>
- <string name="MBFullScreenErr">
- Unable to run fullscreen at [WIDTH] x [HEIGHT].
-Running in window.
- </string>
- <string name="MBDestroyWinFailed">Shutdown Error while destroying window (DestroyWindow() failed)</string>
- <string name="MBShutdownErr">Shutdown Error</string>
- <string name="MBDevContextErr">Can't make GL device context</string>
- <string name="MBPixelFmtErr">Can't find suitable pixel format</string>
- <string name="MBPixelFmtDescErr">Can't get pixel format description</string>
- <string name="MBTrueColorWindow">
- [APP_NAME] requires True Color (32-bit) to run.
-Please go to your computer's display settings and set the color mode to 32-bit.
- </string>
- <string name="MBAlpha">
- [APP_NAME] is unable to run because it can't get an 8 bit alpha channel. Usually this is due to video card driver issues.
-Please make sure you have the latest video card drivers installed.
-Also be sure your monitor is set to True Color (32-bit) in Control Panels &gt; Display &gt; Settings.
-If you continue to receive this message, contact the [SUPPORT_SITE].
- </string>
- <string name="MBPixelFmtSetErr">Can't set pixel format</string>
- <string name="MBGLContextErr">Can't create GL rendering context</string>
- <string name="MBGLContextActErr">Can't activate GL rendering context</string>
- <string name="MBVideoDrvErr">
- [APP_NAME] is unable to run because your video card drivers did not install properly, are out of date, or are for unsupported hardware. Please make sure you have the latest video card drivers and even if you do have the latest, try reinstalling them.
-
-If you continue to receive this message, contact the [SUPPORT_SITE].
- </string>
-
- <!-- Avatar Shape Information -->
-<string name="5 O'Clock Shadow">5 O'Clock Shadow</string>
-
-<string name="All White">All White</string>
-<string name="Anime Eyes">Anime Eyes</string>
-<string name="Arced">Arced</string>
-<string name="Arm Length">Arm Length</string>
-<string name="Attached">Attached</string>
-<string name="Attached Earlobes">Attached Earlobes</string>
-
-
-<string name="Back Fringe">Back Fringe</string>
-
-<string name="Baggy">Baggy</string>
-<string name="Bangs">Bangs</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 Hair Back">Big Hair: Back</string>
-<string name="Big Hair Front">Big Hair: Front</string>
-<string name="Big Hair Top">Big Hair: Top</string>
-<string name="Big Head">Big Head</string>
-<string name="Big Pectorals">Big Pectorals</string>
-<string name="Big Spikes">Big Spikes</string>
-<string name="Black">Black</string>
-<string name="Blonde">Blonde</string>
-<string name="Blonde Hair">Blonde Hair</string>
-<string name="Blush">Blush</string>
-<string name="Blush Color">Blush Color</string>
-<string name="Blush Opacity">Blush Opacity</string>
-<string name="Body Definition">Body Definition</string>
-<string name="Body Fat">Body Fat</string>
-<string name="Body Freckles">Body Freckles</string>
-<string name="Body Thick">Body Thick</string>
-<string name="Body Thickness">Body Thickness</string>
-<string name="Body Thin">Body Thin</string>
-
-<string name="Bow Legged">Bow Legged</string>
-<string name="Breast Buoyancy">Breast Buoyancy</string>
-<string name="Breast Cleavage">Breast Cleavage</string>
-<string name="Breast Size">Breast Size</string>
-<string name="Bridge Width">Bridge Width</string>
-<string name="Broad">Broad</string>
-<string name="Brow Size">Brow Size</string>
-<string name="Bug Eyes">Bug Eyes</string>
-<string name="Bugged Eyes">Bugged Eyes</string>
-<string name="Bulbous">Bulbous</string>
-<string name="Bulbous Nose">Bulbous Nose</string>
-
-<string name="Breast Physics Mass">Breast Mass</string>
-<string name="Breast Physics Smoothing">Breast Smoothing</string>
-<string name="Breast Physics Gravity">Breast Gravity</string>
-<string name="Breast Physics Drag">Breast Drag</string>
-
-<string name="Breast Physics InOut Max Effect">Max Effect</string>
-<string name="Breast Physics InOut Spring">Spring</string>
-<string name="Breast Physics InOut Gain">Gain</string>
-<string name="Breast Physics InOut Damping">Damping</string>
-
-<string name="Breast Physics UpDown Max Effect">Max Effect</string>
-<string name="Breast Physics UpDown Spring">Spring</string>
-<string name="Breast Physics UpDown Gain">Gain</string>
-<string name="Breast Physics UpDown Damping">Damping</string>
-
-<string name="Breast Physics LeftRight Max Effect">Max Effect</string>
-<string name="Breast Physics LeftRight Spring">Spring</string>
-<string name="Breast Physics LeftRight Gain">Gain</string>
-<string name="Breast Physics LeftRight Damping">Damping</string>
-
-<string name="Belly Physics Mass">Belly Mass</string>
-<string name="Belly Physics Smoothing">Belly Smoothing</string>
-<string name="Belly Physics Gravity">Belly Gravity</string>
-<string name="Belly Physics Drag">Belly Drag</string>
-
-<string name="Belly Physics UpDown Max Effect">Max Effect</string>
-<string name="Belly Physics UpDown Spring">Spring</string>
-<string name="Belly Physics UpDown Gain">Gain</string>
-<string name="Belly Physics UpDown Damping">Damping</string>
-
-<string name="Butt Physics Mass">Butt Mass</string>
-<string name="Butt Physics Smoothing">Butt Smoothing</string>
-<string name="Butt Physics Gravity">Butt Gravity</string>
-<string name="Butt Physics Drag">Butt Drag</string>
-
-<string name="Butt Physics UpDown Max Effect">Max Effect</string>
-<string name="Butt Physics UpDown Spring">Spring</string>
-<string name="Butt Physics UpDown Gain">Gain</string>
-<string name="Butt Physics UpDown Damping">Damping</string>
-
-<string name="Butt Physics LeftRight Max Effect">Max Effect</string>
-<string name="Butt Physics LeftRight Spring">Spring</string>
-<string name="Butt Physics LeftRight Gain">Gain</string>
-<string name="Butt Physics LeftRight Damping">Damping</string>
-
-<string name="Bushy Eyebrows">Bushy Eyebrows</string>
-<string name="Bushy Hair">Bushy Hair</string>
-<string name="Butt Size">Butt Size</string>
-<string name="Butt Gravity">Butt Gravity</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">Cheek Bones</string>
-<string name="Chest Size">Chest Size</string>
-<string name="Chin Angle">Chin Angle</string>
-<string name="Chin Cleft">Chin Cleft</string>
-<string name="Chin Curtains">Chin Curtains</string>
-
-<string name="Chin Depth">Chin Depth</string>
-<string name="Chin Heavy">Chin Heavy</string>
-<string name="Chin In">Chin In</string>
-<string name="Chin Out">Chin Out</string>
-<string name="Chin-Neck">Chin-Neck</string>
-<string name="Clear">Clear</string>
-<string name="Cleft">Cleft</string>
-<string name="Close Set Eyes">Close Set Eyes</string>
-<string name="Closed">Closed</string>
-<string name="Closed Back">Closed Back</string>
-<string name="Closed Front">Closed Front</string>
-<string name="Closed Left">Closed Left</string>
-<string name="Closed Right">Closed Right</string>
-<string name="Coin Purse">Coin Purse</string>
-<string name="Collar Back">Collar Back</string>
-
-
-
-<string name="Collar Front">Collar Front</string>
-
-
-
-<string name="Corner Down">Corner Down</string>
-
-<string name="Corner Up">Corner Up</string>
-<string name="Creased">Creased</string>
-<string name="Crooked Nose">Crooked Nose</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="Dense">Dense</string>
-
-<string name="Double Chin">Double Chin</string>
-<string name="Downturned">Downturned</string>
-<string name="Duffle Bag">Duffle Bag</string>
-<string name="Ear Angle">Ear Angle</string>
-<string name="Ear Size">Ear Size</string>
-<string name="Ear Tips">Ear Tips</string>
-<string name="Egg Head">Egg Head</string>
-<string name="Eye Bags">Eye Bags</string>
-<string name="Eye Color">Eye Color</string>
-<string name="Eye Depth">Eye Depth</string>
-<string name="Eye Lightness">Eye Lightness</string>
-<string name="Eye Opening">Eye Opening</string>
-<string name="Eye Pop">Eye Pop</string>
-<string name="Eye Size">Eye Size</string>
-<string name="Eye Spacing">Eye Spacing</string>
-
-<string name="Eyebrow Arc">Eyebrow Arc</string>
-<string name="Eyebrow Density">Eyebrow Density</string>
-
-<string name="Eyebrow Height">Eyebrow Height</string>
-<string name="Eyebrow Points">Eyebrow Points</string>
-<string name="Eyebrow Size">Eyebrow Size</string>
-
-<string name="Eyelash Length">Eyelash Length</string>
-<string name="Eyeliner">Eyeliner</string>
-<string name="Eyeliner Color">Eyeliner Color</string>
-
-<string name="Eyes Bugged">Eyes Bugged</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 Lips">Fat Lips</string>
-
-<string name="Female">Female</string>
-<string name="Fingerless">Fingerless</string>
-<string name="Fingers">Fingers</string>
-<string name="Flared Cuffs">Flared Cuffs</string>
-<string name="Flat">Flat</string>
-<string name="Flat Butt">Flat Butt</string>
-<string name="Flat Head">Flat Head</string>
-<string name="Flat Toe">Flat Toe</string>
-<string name="Foot Size">Foot Size</string>
-<string name="Forehead Angle">Forehead Angle</string>
-<string name="Forehead Heavy">Forehead Heavy</string>
-<string name="Freckles">Freckles</string>
-
-<string name="Front Fringe">Front Fringe</string>
-
-<string name="Full Back">Full Back</string>
-<string name="Full Eyeliner">Full Eyeliner</string>
-<string name="Full Front">Full Front</string>
-<string name="Full Hair Sides">Full Hair Sides</string>
-<string name="Full Sides">Full Sides</string>
-<string name="Glossy">Glossy</string>
-<string name="Glove Fingers">Glove Fingers</string>
-
-<string name="Glove Length">Glove Length</string>
-
-
-<string name="Hair">Hair</string>
-<string name="Hair Back">Hair: Back</string>
-<string name="Hair Front">Hair: Front</string>
-<string name="Hair Sides">Hair: Sides</string>
-<string name="Hair Sweep">Hair Sweep</string>
-<string name="Hair Thickess">Hair Thickness</string>
-<string name="Hair Thickness">Hair Thickness</string>
-<string name="Hair Tilt">Hair Tilt</string>
-<string name="Hair Tilted Left">Hair Tilted Left</string>
-<string name="Hair Tilted Right">Hair Tilted Right</string>
-<string name="Hair Volume">Hair: Volume</string>
-<string name="Hand Size">Hand Size</string>
-<string name="Handlebars">Handlebars</string>
-<string name="Head Length">Head Length</string>
-<string name="Head Shape">Head Shape</string>
-<string name="Head Size">Head Size</string>
-<string name="Head Stretch">Head Stretch</string>
-<string name="Heel Height">Heel Height</string>
-<string name="Heel Shape">Heel Shape</string>
-<string name="Height">Height</string>
-<string name="High">High</string>
-<string name="High Heels">High Heels</string>
-<string name="High Jaw">High Jaw</string>
-<string name="High Platforms">High Platforms</string>
-<string name="High and Tight">High and Tight</string>
-<string name="Higher">Higher</string>
-<string name="Hip Length">Hip Length</string>
-<string name="Hip Width">Hip Width</string>
-<string name="In">In</string>
-<string name="In Shdw Color">Inner Shadow Color</string>
-<string name="In Shdw Opacity">Inner Shadow Opacity</string>
-<string name="Inner Eye Corner">Inner Eye Corner</string>
-<string name="Inner Eye Shadow">Inner Eye Shadow</string>
-<string name="Inner Shadow">Inner Shadow</string>
-
-
-<string name="Jacket Length">Jacket Length</string>
-
-<string name="Jacket Wrinkles">Jacket Wrinkles</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">Join</string>
-<string name="Jowls">Jowls</string>
-<string name="Knee Angle">Knee Angle</string>
-<string name="Knock Kneed">Knock Kneed</string>
-
-<string name="Large">Large</string>
-<string name="Large Hands">Large Hands</string>
-<string name="Left Part">Left Part</string>
-<string name="Leg Length">Leg Length</string>
-<string name="Leg Muscles">Leg Muscles</string>
-<string name="Less">Less</string>
-<string name="Less Body Fat">Less Body Fat</string>
-<string name="Less Curtains">Less Curtains</string>
-<string name="Less Freckles">Less Freckles</string>
-<string name="Less Full">Less Full</string>
-<string name="Less Gravity">Less Gravity</string>
-<string name="Less Love">Less Love</string>
-<string name="Less Muscles">Less Muscles</string>
-<string name="Less Muscular">Less Muscular</string>
-<string name="Less Rosy">Less Rosy</string>
-<string name="Less Round">Less Round</string>
-<string name="Less Saddle">Less Saddle</string>
-<string name="Less Square">Less Square</string>
-<string name="Less Volume">Less Volume</string>
-<string name="Less soul">Less soul</string>
-<string name="Lighter">Lighter</string>
-<string name="Lip Cleft">Lip Cleft</string>
-<string name="Lip Cleft Depth">Lip Cleft Depth</string>
-<string name="Lip Fullness">Lip Fullness</string>
-<string name="Lip Pinkness">Lip Pinkness</string>
-<string name="Lip Ratio">Lip Ratio</string>
-<string name="Lip Thickness">Lip Thickness</string>
-<string name="Lip Width">Lip Width</string>
-<string name="Lipgloss">Lipgloss</string>
-<string name="Lipstick">Lipstick</string>
-<string name="Lipstick Color">Lipstick Color</string>
-<string name="Long">Long</string>
-<string name="Long Head">Long Head</string>
-<string name="Long Hips">Long Hips</string>
-<string name="Long Legs">Long Legs</string>
-<string name="Long Neck">Long Neck</string>
-<string name="Long Pigtails">Long Pigtails</string>
-<string name="Long Ponytail">Long Ponytail</string>
-<string name="Long Torso">Long Torso</string>
-<string name="Long arms">Long arms</string>
-
-
-<string name="Loose Pants">Loose Pants</string>
-<string name="Loose Shirt">Loose Shirt</string>
-<string name="Loose Sleeves">Loose Sleeves</string>
-
-<string name="Love Handles">Love Handles</string>
-<string name="Low">Low</string>
-<string name="Low Heels">Low Heels</string>
-<string name="Low Jaw">Low Jaw</string>
-<string name="Low Platforms">Low Platforms</string>
-<string name="Low and Loose">Low and Loose</string>
-<string name="Lower">Lower</string>
-<string name="Lower Bridge">Lower Bridge</string>
-<string name="Lower Cheeks">Lower Cheeks</string>
-
-<string name="Male">Male</string>
-<string name="Middle Part">Middle Part</string>
-<string name="More">More</string>
-<string name="More Blush">More Blush</string>
-<string name="More Body Fat">More Body Fat</string>
-<string name="More Curtains">More Curtains</string>
-<string name="More Eyeshadow">More Eyeshadow</string>
-<string name="More Freckles">More Freckles</string>
-<string name="More Full">More Full</string>
-<string name="More Gravity">More Gravity</string>
-<string name="More Lipstick">More Lipstick</string>
-<string name="More Love">More Love</string>
-<string name="More Lower Lip">More Lower Lip</string>
-<string name="More Muscles">More Muscles</string>
-<string name="More Muscular">More Muscular</string>
-<string name="More Rosy">More Rosy</string>
-<string name="More Round">More Round</string>
-<string name="More Saddle">More Saddle</string>
-<string name="More Sloped">More Sloped</string>
-<string name="More Square">More Square</string>
-<string name="More Upper Lip">More Upper Lip</string>
-<string name="More Vertical">More Vertical</string>
-<string name="More Volume">More Volume</string>
-<string name="More soul">More soul</string>
-<string name="Moustache">Moustache</string>
-
-<string name="Mouth Corner">Mouth Corner</string>
-<string name="Mouth Position">Mouth Position</string>
-<string name="Mowhawk">Mowhawk</string>
-<string name="Muscular">Muscular</string>
-<string name="Mutton Chops">Mutton Chops</string>
-
-<string name="Nail Polish">Nail Polish</string>
-<string name="Nail Polish Color">Nail Polish Color</string>
-<string name="Narrow">Narrow</string>
-<string name="Narrow Back">Narrow Back</string>
-<string name="Narrow Front">Narrow Front</string>
-<string name="Narrow Lips">Narrow Lips</string>
-<string name="Natural">Natural</string>
-<string name="Neck Length">Neck Length</string>
-<string name="Neck Thickness">Neck Thickness</string>
-<string name="No Blush">No Blush</string>
-<string name="No Eyeliner">No Eyeliner</string>
-<string name="No Eyeshadow">No Eyeshadow</string>
-
-<string name="No Lipgloss">No Lipgloss</string>
-<string name="No Lipstick">No Lipstick</string>
-<string name="No Part">No Part</string>
-<string name="No Polish">No Polish</string>
-<string name="No Red">No Red</string>
-<string name="No Spikes">No Spikes</string>
-<string name="No White">No White</string>
-<string name="No Wrinkles">No Wrinkles</string>
-<string name="Normal Lower">Normal Lower</string>
-<string name="Normal Upper">Normal Upper</string>
-<string name="Nose Left">Nose Left</string>
-<string name="Nose Right">Nose Right</string>
-<string name="Nose Size">Nose Size</string>
-<string name="Nose Thickness">Nose Thickness</string>
-<string name="Nose Tip Angle">Nose Tip Angle</string>
-<string name="Nose Tip Shape">Nose Tip Shape</string>
-<string name="Nose Width">Nose Width</string>
-<string name="Nostril Division">Nostril Division</string>
-<string name="Nostril Width">Nostril Width</string>
-
-
-<string name="Opaque">Opaque</string>
-<string name="Open">Open</string>
-<string name="Open Back">Open Back</string>
-<string name="Open Front">Open Front</string>
-<string name="Open Left">Open Left</string>
-<string name="Open Right">Open Right</string>
-<string name="Orange">Orange</string>
-<string name="Out">Out</string>
-<string name="Out Shdw Color">Outer Shadow Color</string>
-<string name="Out Shdw Opacity">Outer Shadow Opacity</string>
-<string name="Outer Eye Corner">Outer Eye Corner</string>
-<string name="Outer Eye Shadow">Outer Eye Shadow</string>
-<string name="Outer Shadow">Outer Shadow</string>
-<string name="Overbite">Overbite</string>
-
-<string name="Package">Package</string>
-<string name="Painted Nails">Painted Nails</string>
-<string name="Pale">Pale</string>
-<string name="Pants Crotch">Pants Crotch</string>
-<string name="Pants Fit">Pants Fit</string>
-<string name="Pants Length">Pants Length</string>
-
-
-<string name="Pants Waist">Pants Waist</string>
-<string name="Pants Wrinkles">Pants Wrinkles</string>
-<string name="Part">Part</string>
-<string name="Part Bangs">Part Bangs</string>
-<string name="Pectorals">Pectorals</string>
-<string name="Pigment">Pigment</string>
-<string name="Pigtails">Pigtails</string>
-<string name="Pink">Pink</string>
-<string name="Pinker">Pinker</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="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="Rainbow Color">Rainbow Color</string>
-<string name="Red Hair">Red Hair</string>
-
-<string name="Regular">Regular</string>
-
-<string name="Right Part">Right Part</string>
-<string name="Rosy Complexion">Rosy Complexion</string>
-<string name="Round">Round</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="Scrawny Leg">Scrawny Leg</string>
-<string name="Separate">Separate</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 Up">Shear Left Up</string>
-
-<string name="Shear Right Up">Shear Right Up</string>
-<string name="Sheared Back">Sheared Back</string>
-<string name="Sheared Front">Sheared Front</string>
-<string name="Shift Left">Shift Left</string>
-<string name="Shift Mouth">Shift Mouth</string>
-<string name="Shift Right">Shift Right</string>
-<string name="Shirt Bottom">Shirt Bottom</string>
-
-<string name="Shirt Fit">Shirt Fit</string>
-
-<string name="Shirt Wrinkles">Shirt Wrinkles</string>
-<string name="Shoe Height">Shoe Height</string>
-
-<string name="Short">Short</string>
-<string name="Short Arms">Short Arms</string>
-<string name="Short Legs">Short Legs</string>
-<string name="Short Neck">Short Neck</string>
-<string name="Short Pigtails">Short Pigtails</string>
-<string name="Short Ponytail">Short Ponytail</string>
-<string name="Short Sideburns">Short Sideburns</string>
-<string name="Short Torso">Short Torso</string>
-<string name="Short hips">Short hips</string>
-<string name="Shoulders">Shoulders</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 Neck">Skinny Neck</string>
-<string name="Skirt Fit">Skirt Fit</string>
-<string name="Skirt Length">Skirt Length</string>
-<string name="Slanted Forehead">Slanted Forehead</string>
-<string name="Sleeve Length">Sleeve Length</string>
-
-
-
-<string name="Sleeve Looseness">Sleeve Looseness</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">Small</string>
-<string name="Small Hands">Small Hands</string>
-<string name="Small Head">Small Head</string>
-<string name="Smooth">Smooth</string>
-<string name="Smooth Hair">Smooth Hair</string>
-<string name="Socks Length">Socks Length</string>
-
-
-<string name="Soulpatch">Soulpatch</string>
-
-<string name="Sparse">Sparse</string>
-<string name="Spiked Hair">Spiked Hair</string>
-<string name="Square">Square</string>
-<string name="Square Toe">Square Toe</string>
-<string name="Squash Head">Squash Head</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="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="Thin">Thin</string>
-<string name="Thin Eyebrows">Thin Eyebrows</string>
-<string name="Thin Lips">Thin Lips</string>
-<string name="Thin Nose">Thin Nose</string>
-<string name="Tight Chin">Tight Chin</string>
-<string name="Tight Cuffs">Tight Cuffs</string>
-<string name="Tight Pants">Tight Pants</string>
-<string name="Tight Shirt">Tight Shirt</string>
-<string name="Tight Skirt">Tight Skirt</string>
-<string name="Tight Sleeves">Tight Sleeves</string>
-
-<string name="Toe Shape">Toe Shape</string>
-<string name="Toe Thickness">Toe Thickness</string>
-<string name="Torso Length">Torso Length</string>
-<string name="Torso Muscles">Torso Muscles</string>
-<string name="Torso Scrawny">Torso Scrawny</string>
-<string name="Unattached">Unattached</string>
-<string name="Uncreased">Uncreased</string>
-<string name="Underbite">Underbite</string>
-<string name="Unnatural">Unnatural</string>
-<string name="Upper Bridge">Upper Bridge</string>
-<string name="Upper Cheeks">Upper Cheeks</string>
-<string name="Upper Chin Cleft">Upper Chin Cleft</string>
-
-<string name="Upper Eyelid Fold">Upper Eyelid Fold</string>
-<string name="Upturned">Upturned</string>
-<string name="Very Red">Very Red</string>
-<string name="Waist Height">Waist Height</string>
-
-
-<string name="Well-Fed">Well-Fed</string>
-<string name="White Hair">White Hair</string>
-<string name="Wide">Wide</string>
-<string name="Wide Back">Wide Back</string>
-<string name="Wide Front">Wide Front</string>
-<string name="Wide Lips">Wide Lips</string>
-<string name="Wild">Wild</string>
-<string name="Wrinkles">Wrinkles</string>
-
- <!-- 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="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>
- <string name="LocationCtrlAdultIconTooltip">Adult Region</string>
- <string name="LocationCtrlModerateIconTooltip">Moderate Region</string>
- <string name="LocationCtrlGeneralIconTooltip">General Region</string>
- <string name="LocationCtrlSeeAVsTooltip">Avatars visible and chat allowed outside of this parcel</string>
-
- <!-- Strings used by the (currently Linux) auto-updater app -->
- <string name="UpdaterWindowTitle">
- [APP_NAME] Update
- </string>
- <string name="UpdaterNowUpdating">
- Now updating [APP_NAME]...
- </string>
- <string name="UpdaterNowInstalling">
- Installing [APP_NAME]...
- </string>
- <string name="UpdaterUpdatingDescriptive">
- Your [APP_NAME] Viewer is being updated to the latest release. This may take some time, so please be patient.
- </string>
- <string name="UpdaterProgressBarTextWithEllipses">
- Downloading update...
- </string>
- <string name="UpdaterProgressBarText">
- Downloading update
- </string>
- <string name="UpdaterFailDownloadTitle">
- Failed to download update
- </string>
- <string name="UpdaterFailUpdateDescriptive">
- An error occurred while updating [APP_NAME]. Please download the latest version from www.secondlife.com.
- </string>
- <string name="UpdaterFailInstallTitle">
- Failed to install update
- </string>
- <string name="UpdaterFailStartTitle">
- Failed to start viewer
- </string>
-
- <!-- System Messages -->
- <string name="ItemsComingInTooFastFrom">[APP_NAME]: Items coming in too fast from [FROM_NAME], automatic preview disabled for [TIME] seconds</string>
- <string name="ItemsComingInTooFast">[APP_NAME]: Items coming in too fast, automatic preview disabled for [TIME] seconds</string>
-
- <!-- IM system messages -->
- <string name="IM_logging_string">-- Instant message logging enabled --</string>
- <string name="IM_typing_start_string">[NAME] is typing...</string>
- <string name="Unnamed">(Unnamed)</string>
- <string name="IM_moderated_chat_label">(Moderated: Voices off by default)</string>
- <string name="IM_unavailable_text_label">Text chat is not available for this call.</string>
- <string name="IM_muted_text_label">Your text chat has been disabled by a Group Moderator.</string>
- <string name="IM_default_text_label">Click here to instant message.</string>
- <string name="IM_to_label">To</string>
- <string name="IM_moderator_label">(Moderator)</string>
- <string name="Saved_message">(Saved [LONG_TIMESTAMP])</string>
- <string name="IM_unblock_only_groups_friends">To see this message, you must uncheck &apos;Only friends and groups can call or IM me&apos; in Preferences/Privacy.</string>
-
- <!-- voice calls -->
- <string name="answered_call">Your call has been answered</string>
- <string name="you_started_call">You started a voice call</string>
- <string name="you_joined_call">You joined the voice call</string>
- <string name="name_started_call">[NAME] started a voice call</string>
-
- <string name="ringing-im">
- Joining voice call...
- </string>
- <string name="connected-im">
- Connected, click Leave Call to hang up
- </string>
- <string name="hang_up-im">
- Left voice call
- </string>
- <string name="answering-im">
- Connecting...
- </string>
- <string name="conference-title">
- Ad-hoc Conference
- </string>
- <string name="conference-title-incoming">
- Conference with [AGENT_NAME]
- </string>
- <string name="inventory_item_offered-im">
- Inventory item offered
- </string>
- <string name="share_alert">
- Drag items from inventory here
- </string>
-
-
- <string name="no_session_message">
- (IM Session Doesn't Exist)
- </string>
- <string name="only_user_message">
- You are the only user in this session.
- </string>
- <string name="offline_message">
- [NAME] is offline.
- </string>
- <string name="invite_message">
- 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.
- </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.
- </string>
- <string name="insufficient_perms_error">
- You do not have sufficient permissions.
- </string>
- <string name="session_does_not_exist_error">
- The session no longer exists
- </string>
- <string name="no_ability_error">
- You do not have that ability.
- </string>
- <string name="no_ability">
- You do not have that ability.
- </string>
- <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>
- <string name="session_initialization_timed_out_error">
- The session initialization is timed out
- </string>
-
- <string name="Home position set.">Home position set.</string>
-
- <string name="voice_morphing_url">http://secondlife.com/landing/voicemorphing</string>
-
- <!-- Financial operations strings -->
- <string name="paid_you_ldollars">[NAME] paid you L$[AMOUNT] [REASON].</string>
- <string name="paid_you_ldollars_no_reason">[NAME] paid you L$[AMOUNT].</string>
- <string name="you_paid_ldollars">You paid [NAME] L$[AMOUNT] [REASON].</string>
- <string name="you_paid_ldollars_no_info">You paid L$[AMOUNT].</string>
- <string name="you_paid_ldollars_no_reason">You paid [NAME] L$[AMOUNT].</string>
- <string name="you_paid_ldollars_no_name">You paid L$[AMOUNT] [REASON].</string>
- <string name="you_paid_failure_ldollars">You failed to pay [NAME] L$[AMOUNT] [REASON].</string>
- <string name="you_paid_failure_ldollars_no_info">You failed to pay L$[AMOUNT].</string>
- <string name="you_paid_failure_ldollars_no_reason">You failed to pay [NAME] L$[AMOUNT].</string>
- <string name="you_paid_failure_ldollars_no_name">You failed to pay L$[AMOUNT] [REASON].</string>
- <string name="for item">for [ITEM]</string>
- <string name="for a parcel of land">for a parcel of land</string>
- <string name="for a land access pass">for a land access pass</string>
- <string name="for deeding land">for deeding land</string>
- <string name="to create a group">to create a group</string>
- <string name="to join a group">to join a group</string>
- <string name="to upload">to upload</string>
- <string name="to publish a classified ad">to publish a classified ad</string>
-
- <string name="giving">Giving L$ [AMOUNT]</string>
- <string name="uploading_costs">Uploading costs L$ [AMOUNT]</string>
- <string name="this_costs">This costs L$ [AMOUNT]</string>
- <string name="buying_selected_land">Buying selected land for L$ [AMOUNT]</string>
- <string name="this_object_costs">This object costs L$ [AMOUNT]</string>
-
- <string name="group_role_everyone">Everyone</string>
- <string name="group_role_officers">Officers</string>
- <string name="group_role_owners">Owners</string>
- <string name="group_member_status_online">Online</string>
-
- <string name="uploading_abuse_report">Uploading...
-
-Abuse Report</string>
-
- <!-- names for new inventory items-->
- <string name="New Shape">New Shape</string>
- <string name="New Skin">New Skin</string>
- <string name="New Hair">New Hair</string>
- <string name="New Eyes">New Eyes</string>
- <string name="New Shirt">New Shirt</string>
- <string name="New Pants">New Pants</string>
- <string name="New Shoes">New Shoes</string>
- <string name="New Socks">New Socks</string>
- <string name="New Jacket">New Jacket</string>
- <string name="New Gloves">New Gloves</string>
- <string name="New Undershirt">New Undershirt</string>
- <string name="New Underpants">New Underpants</string>
- <string name="New Skirt">New Skirt</string>
- <string name="New Alpha">New Alpha</string>
- <string name="New Tattoo">New Tattoo</string>
- <string name="New Physics">New Physics</string>
- <string name="Invalid Wearable">Invalid Wearable</string>
- <string name="New Gesture">New Gesture</string>
- <string name="New Script">New Script</string>
- <string name="New Note">New Note</string>
- <string name="New Folder">New Folder</string>
- <string name="Contents">Contents</string>
- <string name="Gesture">Gesture</string>
- <string name="Male Gestures">Male Gestures</string>
- <string name="Female Gestures">Female Gestures</string>
- <string name="Other Gestures">Other Gestures</string>
- <string name="Speech Gestures">Speech Gestures</string>
- <string name="Common Gestures">Common Gestures</string>
- <!-- gestures -->
- <string name="Male - Excuse me">Male - Excuse me</string>
- <string name="Male - Get lost">Male - Get lost</string>
- <string name="Male - Blow kiss">Male - Blow kiss</string>
- <string name="Male - Boo">Male - Boo</string>
- <string name="Male - Bored">Male - Bored</string>
- <string name="Male - Hey">Male - Hey</string>
- <string name="Male - Laugh">Male - Laugh</string>
- <string name="Male - Repulsed">Male - Repulsed</string>
- <string name="Male - Shrug">Male - Shrug</string>
- <string name="Male - Stick tougue out">Male - Stick tougue out</string>
- <string name="Male - Wow">Male - Wow</string>
-
- <string name="Female - Chuckle">Female - Chuckle</string>
- <string name="Female - Cry">Female - Cry</string>
- <string name="Female - Embarrassed">Female - Embarrassed</string>
- <string name="Female - Excuse me">Female - Excuse me</string>
- <string name="Female - Get lost">Female - Get lost</string>
- <string name="Female - Blow kiss">Female - Blow kiss</string>
- <string name="Female - Boo">Female - Boo</string>
- <string name="Female - Bored">Female - Bored</string>
- <string name="Female - Hey">Female - Hey</string>
- <string name="Female - Hey baby">Female - Hey baby</string>
- <string name="Female - Laugh">Female - Laugh</string>
- <string name="Female - Looking good">Female - Looking good</string>
- <string name="Female - Over here">Female - Over here</string>
- <string name="Female - Please">Female - Please</string>
- <string name="Female - Repulsed">Female - Repulsed</string>
- <string name="Female - Shrug">Female - Shrug</string>
- <string name="Female - Stick tougue out">Female - Stick tougue out</string>
- <string name="Female - Wow">Female - Wow</string>
-
- <string name="/bow">/bow</string>
- <string name="/clap">/clap</string>
- <string name="/count">/count</string>
- <string name="/extinguish">/extinguish</string>
- <string name="/kmb">/kmb</string>
- <string name="/muscle">/muscle</string>
- <string name="/no">/no</string>
- <string name="/no!">/no!</string>
- <string name="/paper">/paper</string>
- <string name="/pointme">/pointme</string>
- <string name="/pointyou">/pointyou</string>
- <string name="/rock">/rock</string>
- <string name="/scissor">/scissor</string>
- <string name="/smoke">/smoke</string>
- <string name="/stretch">/stretch</string>
- <string name="/whistle">/whistle</string>
- <string name="/yes">/yes</string>
- <string name="/yes!">/yes!</string>
- <string name="afk">afk</string>
- <string name="dance1">dance1</string>
- <string name="dance2">dance2</string>
- <string name="dance3">dance3</string>
- <string name="dance4">dance4</string>
- <string name="dance5">dance5</string>
- <string name="dance6">dance6</string>
- <string name="dance7">dance7</string>
- <string name="dance8">dance8</string>
-
- <!-- birth date format shared by avatar inspector and profile panels -->
- <string name="AvatarBirthDateFormat">[mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]</string>
-
- <string name="DefaultMimeType">none/none</string>
- <string name="texture_load_dimensions_error">Can't load images larger than [WIDTH]*[HEIGHT]</string>
-
- <!-- language specific white-space characters, delimiters, spacers, item separation symbols -->
- <string name="sentences_separator" value=" "></string>
- <string name="words_separator" value=", "/>
-
- <string name="server_is_down">
- Despite our best efforts, something unexpected has gone wrong.
-
- Please check status.secondlifegrid.net to see if there is a known problem with the service.
- If you continue to experience problems, please check your network and firewall setup.
- </string>
-
- <!-- overriding datetime formating.
- didn't translate if this is not needed for current localization
- -->
- <string name="dateTimeWeekdaysNames">Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday</string>
- <string name="dateTimeWeekdaysShortNames">Sun:Mon:Tue:Wed:Thu:Fri:Sat</string>
- <string name="dateTimeMonthNames">January:February:March:April:May:June:July:August:September:October:November:December</string>
- <string name="dateTimeMonthShortNames">Jan:Feb:Mar:Apr:May:Jun:Jul:Aug:Sep:Oct:Nov:Dec</string>
- <string name="dateTimeDayFormat">[MDAY]</string>
- <string name="dateTimeAM">AM</string>
- <string name="dateTimePM">PM</string>
-
- <!-- currency formatting -->
- <string name="LocalEstimateUSD">US$ [AMOUNT]</string>
-
- <!-- Group Profile roles and powers -->
- <string name="Membership">Membership</string>
- <string name="Roles">Roles</string>
- <string name="Group Identity">Group Identity</string>
- <string name="Parcel Management">Parcel Management</string>
- <string name="Parcel Identity">Parcel Identity</string>
- <string name="Parcel Settings">Parcel Settings</string>
- <string name="Parcel Powers">Parcel Powers</string>
- <string name="Parcel Access">Parcel Access</string>
- <string name="Parcel Content">Parcel Content</string>
- <string name="Object Management">Object Management</string>
- <string name="Accounting">Accounting</string>
- <string name="Notices">Notices</string>
- <string name="Chat">Chat</string>
-
- <!-- Question strings for delete items notifications -->
- <string name="DeleteItems">Delete selected items?</string>
- <string name="DeleteItem">Delete selected item?</string>
-
- <string name="EmptyOutfitText">There are no items in this outfit</string>
-
- <!-- External editor status codes -->
- <string name="ExternalEditorNotSet">Select an editor using the ExternalEditor setting.</string>
- <string name="ExternalEditorNotFound">Cannot find the external editor you specified.
-Try enclosing path to the editor with double quotes.
-(e.g. "/path to my/editor" "%s")</string>
- <string name="ExternalEditorCommandParseError">Error parsing the external editor command.</string>
- <string name="ExternalEditorFailedToRun">External editor failed to run.</string>
-
- <!-- Machine translation of chat messahes -->
- <string name="TranslationFailed">Translation failed: [REASON]</string>
- <string name="TranslationResponseParseError">Error parsing translation response.</string>
-
- <!-- Key names begin -->
- <string name="Esc">Esc</string>
- <string name="Space">Space</string>
- <string name="Enter">Enter</string>
- <string name="Tab">Tab</string>
- <string name="Ins">Ins</string>
- <string name="Del">Del</string>
- <string name="Backsp">Backsp</string>
- <string name="Shift">Shift</string>
- <string name="Ctrl">Ctrl</string>
- <string name="Alt">Alt</string>
- <string name="CapsLock">CapsLock</string>
- <string name="Left">Left</string>
- <string name="Right">Right</string>
- <string name="Up">Up</string>
- <string name="Down">Down</string>
- <string name="Home">Home</string>
- <string name="End">End</string>
- <string name="PgUp">PgUp</string>
- <string name="PgDn">PgDn</string>
-
- <string name="F1">F1</string>
- <string name="F2">F2</string>
- <string name="F3">F3</string>
- <string name="F4">F4</string>
- <string name="F5">F5</string>
- <string name="F6">F6</string>
- <string name="F7">F7</string>
- <string name="F8">F8</string>
- <string name="F9">F9</string>
- <string name="F10">F10</string>
- <string name="F11">F11</string>
- <string name="F12">F12</string>
-
- <string name="Add">Add</string>
- <string name="Subtract">Subtract</string>
- <string name="Multiply">Multiply</string>
- <string name="Divide">Divide</string>
- <string name="PAD_DIVIDE">PAD_DIVIDE</string>
- <string name="PAD_LEFT">PAD_LEFT</string>
- <string name="PAD_RIGHT">PAD_RIGHT</string>
- <string name="PAD_DOWN">PAD_DOWN</string>
- <string name="PAD_UP">PAD_UP</string>
- <string name="PAD_HOME">PAD_HOME</string>
- <string name="PAD_END">PAD_END</string>
- <string name="PAD_PGUP">PAD_PGUP</string>
- <string name="PAD_PGDN">PAD_PGDN</string>
- <string name="PAD_CENTER">PAD_CENTER</string>
- <string name="PAD_INS">PAD_INS</string>
- <string name="PAD_DEL">PAD_DEL</string>
- <string name="PAD_Enter">PAD_Enter</string>
- <string name="PAD_BUTTON0">PAD_BUTTON0</string>
- <string name="PAD_BUTTON1">PAD_BUTTON1</string>
- <string name="PAD_BUTTON2">PAD_BUTTON2</string>
- <string name="PAD_BUTTON3">PAD_BUTTON3</string>
- <string name="PAD_BUTTON4">PAD_BUTTON4</string>
- <string name="PAD_BUTTON5">PAD_BUTTON5</string>
- <string name="PAD_BUTTON6">PAD_BUTTON6</string>
- <string name="PAD_BUTTON7">PAD_BUTTON7</string>
- <string name="PAD_BUTTON8">PAD_BUTTON8</string>
- <string name="PAD_BUTTON9">PAD_BUTTON9</string>
- <string name="PAD_BUTTON10">PAD_BUTTON10</string>
- <string name="PAD_BUTTON11">PAD_BUTTON11</string>
- <string name="PAD_BUTTON12">PAD_BUTTON12</string>
- <string name="PAD_BUTTON13">PAD_BUTTON13</string>
- <string name="PAD_BUTTON14">PAD_BUTTON14</string>
- <string name="PAD_BUTTON15">PAD_BUTTON15</string>
-
- <string name="-">-</string>
- <string name="=">=</string>
- <string name="`">`</string>
- <string name=";">;</string>
- <string name="[">[</string>
- <string name="]">]</string>
- <string name="\">\</string>
-
- <string name="0">0</string>
- <string name="1">1</string>
- <string name="2">2</string>
- <string name="3">3</string>
- <string name="4">4</string>
- <string name="5">5</string>
- <string name="6">6</string>
- <string name="7">7</string>
- <string name="8">8</string>
- <string name="9">9</string>
-
- <string name="A">A</string>
- <string name="B">B</string>
- <string name="C">C</string>
- <string name="D">D</string>
- <string name="E">E</string>
- <string name="F">F</string>
- <string name="G">G</string>
- <string name="H">H</string>
- <string name="I">I</string>
- <string name="J">J</string>
- <string name="K">K</string>
- <string name="L">L</string>
- <string name="M">M</string>
- <string name="N">N</string>
- <string name="O">O</string>
- <string name="P">P</string>
- <string name="Q">Q</string>
- <string name="R">R</string>
- <string name="S">S</string>
- <string name="T">T</string>
- <string name="U">U</string>
- <string name="V">V</string>
- <string name="W">W</string>
- <string name="X">X</string>
- <string name="Y">Y</string>
- <string name="Z">Z</string>
- <!-- Key names end -->
-
- <!-- llviewerwindow -->
- <string name="BeaconParticle">Viewing particle beacons (blue)</string>
- <string name="BeaconPhysical">Viewing physical object beacons (green)</string>
- <string name="BeaconScripted">Viewing scripted object beacons (red)</string>
- <string name="BeaconScriptedTouch">Viewing scripted object with touch function beacons (red)</string>
- <string name="BeaconSound">Viewing sound beacons (yellow)</string>
- <string name="BeaconMedia">Viewing media beacons (white)</string>
- <string name="ParticleHiding">Hiding Particles</string>
-
- <!-- commands -->
-
- <string name="Command_AboutLand_Label">About land</string>
- <string name="Command_Appearance_Label">Appearance</string>
- <string name="Command_Avatar_Label">Avatar</string>
- <string name="Command_Build_Label">Build</string>
- <string name="Command_Chat_Label">Chat</string>
- <string name="Command_Compass_Label">Compass</string>
- <string name="Command_Destinations_Label">Destinations</string>
- <string name="Command_Gestures_Label">Gestures</string>
- <string name="Command_HowTo_Label">How to</string>
- <string name="Command_Inventory_Label">Inventory</string>
- <string name="Command_Map_Label">Map</string>
- <string name="Command_Marketplace_Label">Marketplace</string>
- <string name="Command_MiniMap_Label">Mini-map</string>
- <string name="Command_Move_Label">Walk / run / fly</string>
- <string name="Command_Outbox_Label">Merchant outbox</string>
- <string name="Command_People_Label">People</string>
- <string name="Command_Picks_Label">Picks</string>
- <string name="Command_Places_Label">Places</string>
- <string name="Command_Preferences_Label">Preferences</string>
- <string name="Command_Profile_Label">Profile</string>
- <string name="Command_Search_Label">Search</string>
- <string name="Command_Snapshot_Label">Snapshot</string>
- <string name="Command_Speak_Label">Speak</string>
- <string name="Command_View_Label">Camera controls</string>
- <string name="Command_Voice_Label">Voice settings</string>
-
- <string name="Command_AboutLand_Tooltip">Information about the land you're visiting</string>
- <string name="Command_Appearance_Tooltip">Change your avatar</string>
- <string name="Command_Avatar_Tooltip">Choose a complete avatar</string>
- <string name="Command_Build_Tooltip">Building objects and reshaping terrain</string>
- <string name="Command_Chat_Tooltip">Chat with people nearby using text</string>
- <string name="Command_Compass_Tooltip">Compass</string>
- <string name="Command_Destinations_Tooltip">Destinations of interest</string>
- <string name="Command_Gestures_Tooltip">Gestures for your avatar</string>
- <string name="Command_HowTo_Tooltip">How to do common tasks</string>
- <string name="Command_Inventory_Tooltip">View and use your belongings</string>
- <string name="Command_Map_Tooltip">Map of the world</string>
- <string name="Command_Marketplace_Tooltip">Go shopping</string>
- <string name="Command_MiniMap_Tooltip">Show nearby people</string>
- <string name="Command_Move_Tooltip">Moving your avatar</string>
- <string name="Command_Outbox_Tooltip">Transfer items to your marketplace for sale</string>
- <string name="Command_People_Tooltip">Friends, groups, and nearby people</string>
- <string name="Command_Picks_Tooltip">Places to show as favorites in your profile</string>
- <string name="Command_Places_Tooltip">Places you've saved</string>
- <string name="Command_Preferences_Tooltip">Preferences</string>
- <string name="Command_Profile_Tooltip">Edit or view your profile</string>
- <string name="Command_Search_Tooltip">Find places, events, people</string>
- <string name="Command_Snapshot_Tooltip">Take a picture</string>
- <string name="Command_Speak_Tooltip">Speak with people nearby using your microphone</string>
- <string name="Command_View_Tooltip">Changing camera angle</string>
- <string name="Command_Voice_Tooltip">Volume controls for calls and people near you in world</string>
-
- <string name="Toolbar_Bottom_Tooltip">currently in your bottom toolbar</string>
- <string name="Toolbar_Left_Tooltip" >currently in your left toolbar</string>
- <string name="Toolbar_Right_Tooltip" >currently in your right toolbar</string>
-
- <!-- Mesh UI terms -->
- <string name="Retain%">Retain%</string>
- <string name="Detail">Detail</string>
- <string name="Better Detail">Better Detail</string>
- <string name="Surface">Surface</string>
- <string name="Solid">Solid</string>
- <string name="Wrap">Wrap</string>
- <string name="Preview">Preview</string>
- <string name="Normal">Normal</string>
-
- <!-- Snapshot image quality levels -->
- <string name="snapshot_quality_very_low">Very Low</string>
- <string name="snapshot_quality_low">Low</string>
- <string name="snapshot_quality_medium">Medium</string>
- <string name="snapshot_quality_high">High</string>
- <string name="snapshot_quality_very_high">Very High</string>
-
- </strings>
diff --git a/indra/newview/skins/steam/xui/es/strings.xml b/indra/newview/skins/steam/xui/es/strings.xml
deleted file mode 100644
index 2b36c39e7e..0000000000
--- a/indra/newview/skins/steam/xui/es/strings.xml
+++ /dev/null
@@ -1,4925 +0,0 @@
-<?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
- that are returned from one component and may appear in many places-->
-<strings>
- <string name="CAPITALIZED_APP_NAME">
- SECOND LIFE
- </string>
- <string name="SUPPORT_SITE">
- Portal de Soporte de Second Life
- </string>
- <string name="StartupDetectingHardware">
- Identificando el hardware...
- </string>
- <string name="StartupLoading">
- Instalando [APP_NAME]...
- </string>
- <string name="StartupClearingCache">
- Limpiando la caché...
- </string>
- <string name="StartupInitializingTextureCache">
- Iniciando la caché de las texturas...
- </string>
- <string name="StartupInitializingVFS">
- Iniciando VFS...
- </string>
- <string name="StartupRequireDriverUpdate">
- Error de inicialización de gráficos. Actualiza tu controlador de gráficos.
- </string>
- <string name="ProgressRestoring">
- Restaurando...
- </string>
- <string name="ProgressChangingResolution">
- Cambiando la resolución...
- </string>
- <string name="Fullbright">
- Brillo al máximo (antiguo)
- </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>
- <string name="LoginMaintenance">
- Realizando el mantenimiento de la cuenta...
- </string>
- <string name="LoginAttempt">
- Ha fallado el intento previo de iniciar sesión. Iniciando sesión, intento [NUMBER]
- </string>
- <string name="LoginPrecaching">
- Cargando el mundo...
- </string>
- <string name="LoginInitializingBrowser">
- Iniciando el navegador web incorporado...
- </string>
- <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>
- <string name="LoginProcessingResponse">
- Procesando la respuesta...
- </string>
- <string name="LoginInitializingWorld">
- Iniciando el mundo...
- </string>
- <string name="LoginDecodingImages">
- Decodificando las imágenes...
- </string>
- <string name="LoginInitializingQuicktime">
- Iniciando QuickTime...
- </string>
- <string name="LoginQuicktimeNotFound">
- No se ha encontrado QuickTime. Imposible iniciarlo.
- </string>
- <string name="LoginQuicktimeOK">
- QuickTime se ha iniciado adecuadamente.
- </string>
- <string name="LoginRequestSeedCapGrant">
- Solicitando capacidades de la región...
- </string>
- <string name="LoginRetrySeedCapGrant">
- Solicitando capacidades de la región, intento [NUMBER]...
- </string>
- <string name="LoginWaitingForRegionHandshake">
- Esperando la conexión con la región...
- </string>
- <string name="LoginConnectingToRegion">
- Conectando con la región...
- </string>
- <string name="LoginDownloadingClothing">
- Descargando la ropa...
- </string>
- <string name="InvalidCertificate">
- El servidor devolvió un certificado no válido o dañado. Ponte en contacto con el administrador de la cuadrícula.
- </string>
- <string name="CertInvalidHostname">
- El nombre de host utilizado para acceder al servidor no es válido. Comprueba tu SLURL o el nombre de host de la cuadrícula.
- </string>
- <string name="CertExpired">
- Parece que el certificado que devolvió la cuadrícula está caducado. Comprueba el reloj del sistema o consulta al administrador de la cuadrícula.
- </string>
- <string name="CertKeyUsage">
- El certificado que devolvió el servidor no puede utilizarse para SSL. Ponte en contacto con el administrador de la cuadrícula.
- </string>
- <string name="CertBasicConstraints">
- La cadena de certificado del servidor contenía demasiados certificados. Ponte en contacto con el administrador de la cuadrícula.
- </string>
- <string name="CertInvalidSignature">
- No se pudo verificar la firma del certificado devuelta por el servidor de la cuadrícula. Ponte en contacto con el administrador de la cuadrícula.
- </string>
- <string name="LoginFailedNoNetwork">
- Error de red: no se ha podido conectar; por favor, revisa tu conexión a internet.
- </string>
- <string name="LoginFailed">
- Error en el inicio de sesión.
- </string>
- <string name="Quit">
- Salir
- </string>
- <string name="create_account_url">
- http://join.secondlife.com/index.php?sourceid=1206_steam&amp;lang=es-ES
- </string>
- <string name="LoginFailedViewerNotPermitted">
- Ya no puedes acceder a Second Life con el visor que estás utilizando. Visita la siguiente página para descargar un nuevo visor:
-http://secondlife.com/download.
-
-Si deseas obtener más información, consulta las preguntas frecuentes que aparecen a continuación:
-http://secondlife.com/viewer-access-faq
- </string>
- <string name="LoginIntermediateOptionalUpdateAvailable">
- Actualización opcional del visor disponible: [VERSIÓN]
- </string>
- <string name="LoginFailedRequiredUpdate">
- Actualización necesaria del visor: [VERSIÓN]
- </string>
- <string name="LoginFailedAlreadyLoggedIn">
- El agente ya ha iniciado sesión.
- </string>
- <string name="LoginFailedAuthenticationFailed">
- Lo sentimos. No ha sido posible iniciar sesión.
-Comprueba si has introducido correctamente
- * El nombre de usuario (como juangarcia12 o estrella.polar)
- * Contraseña
-Asimismo, asegúrate de que la tecla Mayús esté desactivada.
- </string>
- <string name="LoginFailedPasswordChanged">
- Como precaución de seguridad, se ha modificado tu contraseña.
-Dirígete a la página de tu cuenta en http://secondlife.com/password
-y responde a la pregunta de seguridad para restablecer la contraseña.
-Lamentamos las molestias.
- </string>
- <string name="LoginFailedPasswordReset">
- Hemos realizado unos cambios en nuestro sistema, por lo que deberás restablecer la contraseña.
-Dirígete a la página de tu cuenta en http://secondlife.com/password
-y responde a la pregunta de seguridad para restablecer la contraseña.
-Lamentamos las molestias.
- </string>
- <string name="LoginFailedEmployeesOnly">
- Second Life no está disponible temporalmente debido a tareas de mantenimiento.
-Actualmente, solo se permite iniciar sesión a los empleados.
-Consulta www.secondlife.com/status si deseas obtener actualizaciones.
- </string>
- <string name="LoginFailedPremiumOnly">
- Las conexiones a Second Life se han restringido provisionalmente para garantizar que los usuarios que ya están conectados tengan la mejor experiencia posible.
-
-Durante este tiempo, las personas con cuentas gratuitas no podrán acceder a Second Life, ya que tienen prioridad los usuarios con una cuenta de pago.
- </string>
- <string name="LoginFailedComputerProhibited">
- No se puede acceder a Second Life desde este ordenador.
-Si crees que se trata de un error, ponte en contacto con
-support@secondlife.com.
- </string>
- <string name="LoginFailedAcountSuspended">
- No se podrá acceder a tu cuenta hasta las
-[HORA] (horario de la costa del Pacífico).
- </string>
- <string name="LoginFailedAccountDisabled">
- En este momento no podemos completar la solicitud.
-Si deseas obtener asistencia, ponte en contacto con el departamento de soporte de Second Life a través de la página http://secondlife.com/support.
-Si no puedes cambiar la contraseña, llama al número (866) 476-9763.
- </string>
- <string name="LoginFailedTransformError">
- Se han detectado datos incorrectos en el inicio de sesión.
-Ponte en contacto con support@secondlife.com.
- </string>
- <string name="LoginFailedAccountMaintenance">
- Se están realizando tareas rutinarias de mantenimiento en tu cuenta.
-No se podrá acceder a tu cuenta hasta las
-[HORA] (horario de la costa del Pacífico).
-Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
- </string>
- <string name="LoginFailedPendingLogoutFault">
- La solicitud de cierre de sesión ha obtenido como resultado un error del simulador.
- </string>
- <string name="LoginFailedPendingLogout">
- El sistema está cerrando tu sesión en estos momentos.
-Tu cuenta no estará disponible hasta las
-[HORA] (horario de la costa del Pacífico).
- </string>
- <string name="LoginFailedUnableToCreateSession">
- No se ha podido crear una sesión válida.
- </string>
- <string name="LoginFailedUnableToConnectToSimulator">
- No se ha podido establecer la conexión con un simulador.
- </string>
- <string name="LoginFailedRestrictedHours">
- Tu cuenta solo puede acceder a Second Life
-entre las [INICIO] y las [FIN] (horario de la costa del Pacífico).
-Inténtalo de nuevo durante ese horario.
-Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
- </string>
- <string name="LoginFailedIncorrectParameters">
- Parámetros incorrectos.
-Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
- </string>
- <string name="LoginFailedFirstNameNotAlphanumeric">
- El parámetro correspondiente al nombre debe contener caracteres alfanuméricos.
-Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
- </string>
- <string name="LoginFailedLastNameNotAlphanumeric">
- El parámetro correspondiente al apellido debe contener caracteres alfanuméricos.
-Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
- </string>
- <string name="LogoutFailedRegionGoingOffline">
- La región se está desconectando.
-Intenta iniciar sesión de nuevo en unos instantes.
- </string>
- <string name="LogoutFailedAgentNotInRegion">
- El agente no se encuentra en la región.
-Intenta iniciar sesión de nuevo en unos instantes.
- </string>
- <string name="LogoutFailedPendingLogin">
- A esta región ya se ha accedido en otra sesión.
-Intenta iniciar sesión de nuevo en unos instantes.
- </string>
- <string name="LogoutFailedLoggingOut">
- Se ha salido de la región en la sesión anterior.
-Intenta iniciar sesión de nuevo en unos instantes.
- </string>
- <string name="LogoutFailedStillLoggingOut">
- La región aún está cerrando la sesión anterior.
-Intenta iniciar sesión de nuevo en unos instantes.
- </string>
- <string name="LogoutSucceeded">
- Se ha salido de la región en la última sesión.
-Intenta iniciar sesión de nuevo en unos instantes.
- </string>
- <string name="LogoutFailedLogoutBegun">
- La región ha comenzado el proceso de cierre de sesión.
-Intenta iniciar sesión de nuevo en unos instantes.
- </string>
- <string name="LoginFailedLoggingOutSession">
- El sistema ha comenzado a cerrar la última sesión.
-Intenta iniciar sesión de nuevo en unos instantes.
- </string>
- <string name="AgentLostConnection">
- Esta región puede estar teniendo problemas. Por favor, comprueba tu conexión a Internet.
- </string>
- <string name="SavingSettings">
- Guardando tus configuraciones...
- </string>
- <string name="LoggingOut">
- Cerrando sesión...
- </string>
- <string name="ShuttingDown">
- Cerrando...
- </string>
- <string name="YouHaveBeenDisconnected">
- Has sido desconectado de la región en la que estabas.
- </string>
- <string name="SentToInvalidRegion">
- Has sido enviado a una región no válida.
- </string>
- <string name="TestingDisconnect">
- Probando la desconexión del visor
- </string>
- <string name="TooltipPerson">
- Persona
- </string>
- <string name="TooltipNoName">
- (sin nombre)
- </string>
- <string name="TooltipOwner">
- Propietario:
- </string>
- <string name="TooltipPublic">
- Público
- </string>
- <string name="TooltipIsGroup">
- (Grupo)
- </string>
- <string name="TooltipForSaleL$">
- En venta: [AMOUNT] L$
- </string>
- <string name="TooltipFlagGroupBuild">
- Construir el grupo
- </string>
- <string name="TooltipFlagNoBuild">
- No construir
- </string>
- <string name="TooltipFlagNoEdit">
- Construir el grupo
- </string>
- <string name="TooltipFlagNotSafe">
- No seguro
- </string>
- <string name="TooltipFlagNoFly">
- No volar
- </string>
- <string name="TooltipFlagGroupScripts">
- Scripts el grupo
- </string>
- <string name="TooltipFlagNoScripts">
- No scripts
- </string>
- <string name="TooltipLand">
- Terreno:
- </string>
- <string name="TooltipMustSingleDrop">
- Aquí se puede arrastrar sólo un ítem
- </string>
- <string name="TooltipPrice" value="[AMOUNT] L$:"/>
- <string name="TooltipOutboxDragToWorld">
- No puedes colocar objetos en tu buzón de salida de comerciante
- </string>
- <string name="TooltipOutboxNoTransfer">
- Uno o varios de estos objetos no se pueden vender o transferir.
- </string>
- <string name="TooltipOutboxNotInInventory">
- Tu buzón de salida de comerciante sólo puede aceptar objetos procedentes directamente de tu inventario
- </string>
- <string name="TooltipOutboxWorn">
- No puedes poner artículos que llevas puestos en el buzón de salida de comerciante
- </string>
- <string name="TooltipOutboxCallingCard">
- No puedes poner tarjetas de visita en tu buzón de salida de comerciante
- </string>
- <string name="TooltipOutboxFolderLevels">
- La profundidad de carpetas anidadas excede de 3
- </string>
- <string name="TooltipOutboxTooManyFolders">
- El número de subcarpetas de la carpeta de nivel superior excede de 20
- </string>
- <string name="TooltipOutboxTooManyObjects">
- El número de elementos de la carpeta de nivel superior excede de 200
- </string>
- <string name="TooltipDragOntoOwnChild">
- No puedes mover una carpeta a su carpeta secundaria
- </string>
- <string name="TooltipDragOntoSelf">
- No puedes mover una carpeta dentro de sí misma
- </string>
- <string name="TooltipHttpUrl">
- Pulsa para ver esta página web
- </string>
- <string name="TooltipSLURL">
- Pulsa para ver la información de este lugar
- </string>
- <string name="TooltipAgentUrl">
- Pulsa para ver el perfil del Residente
- </string>
- <string name="TooltipAgentInspect">
- Obtén más información acerca de este residente.
- </string>
- <string name="TooltipAgentMute">
- Pulsa para silenciar a este Residente
- </string>
- <string name="TooltipAgentUnmute">
- Pulsa para quitar el silencio a este Residente
- </string>
- <string name="TooltipAgentIM">
- Pulsa para enviar un MI a este Residente
- </string>
- <string name="TooltipAgentPay">
- Pulsa para pagar a este Residente
- </string>
- <string name="TooltipAgentOfferTeleport">
- Pulsa para enviar una petición de teleporte a este Residente
- </string>
- <string name="TooltipAgentRequestFriend">
- Pulsa para enviar una petición de amistad a este Residente
- </string>
- <string name="TooltipGroupUrl">
- Pulsa para ver la descripción de este grupo
- </string>
- <string name="TooltipEventUrl">
- Pulsa para ver la descripción de este evento
- </string>
- <string name="TooltipClassifiedUrl">
- Pulsa para ver este clasificado
- </string>
- <string name="TooltipParcelUrl">
- Pulsa para ver la descripción de esta parcela
- </string>
- <string name="TooltipTeleportUrl">
- Pulsa para teleportarte a esta posición
- </string>
- <string name="TooltipObjectIMUrl">
- Pulsa para ver la descripción de este objeto
- </string>
- <string name="TooltipMapUrl">
- Pulsa para ver en el mapa esta localización
- </string>
- <string name="TooltipSLAPP">
- Pulsa para ejecutar el comando secondlife://
- </string>
- <string name="CurrentURL" value="URL actual: [CurrentURL]"/>
- <string name="SLurlLabelTeleport">
- Teleportarse a
- </string>
- <string name="SLurlLabelShowOnMap">
- Mostrarla en el mapa
- </string>
- <string name="SLappAgentMute">
- Silenciar
- </string>
- <string name="SLappAgentUnmute">
- Quitar el silencio
- </string>
- <string name="SLappAgentIM">
- MI
- </string>
- <string name="SLappAgentPay">
- Pagar
- </string>
- <string name="SLappAgentOfferTeleport">
- Ofrecer teleporte a
- </string>
- <string name="SLappAgentRequestFriend">
- Petición de amistad
- </string>
- <string name="BUTTON_CLOSE_DARWIN">
- Cerrar (⌘W)
- </string>
- <string name="BUTTON_CLOSE_WIN">
- Cerrar (Ctrl+W)
- </string>
- <string name="BUTTON_CLOSE_CHROME">
- Cerrar
- </string>
- <string name="BUTTON_RESTORE">
- Maximizar
- </string>
- <string name="BUTTON_MINIMIZE">
- Minimizar
- </string>
- <string name="BUTTON_TEAR_OFF">
- Separar la ventana
- </string>
- <string name="BUTTON_DOCK">
- Fijar
- </string>
- <string name="BUTTON_HELP">
- Ver la Ayuda
- </string>
- <string name="Searching">
- Buscando...
- </string>
- <string name="NoneFound">
- No se ha encontrado.
- </string>
- <string name="RetrievingData">
- Reintentando...
- </string>
- <string name="ReleaseNotes">
- Notas de la versión
- </string>
- <string name="RELEASE_NOTES_BASE_URL">
- http://wiki.secondlife.com/wiki/Release_Notes/
- </string>
- <string name="LoadingData">
- Cargando...
- </string>
- <string name="AvatarNameNobody">
- (nadie)
- </string>
- <string name="AvatarNameWaiting">
- (esperando)
- </string>
- <string name="GroupNameNone">
- (ninguno)
- </string>
- <string name="AvalineCaller">
- Avaline: [ORDER]
- </string>
- <string name="AssetErrorNone">
- No hay ningún error
- </string>
- <string name="AssetErrorRequestFailed">
- Petición de asset: fallida
- </string>
- <string name="AssetErrorNonexistentFile">
- Petición de asset: el archivo no existe
- </string>
- <string name="AssetErrorNotInDatabase">
- Petición de asset: no se encontró el asset en la base de datos
- </string>
- <string name="AssetErrorEOF">
- Fin del archivo
- </string>
- <string name="AssetErrorCannotOpenFile">
- No puede abrirse el archivo
- </string>
- <string name="AssetErrorFileNotFound">
- No se ha encontrado el archivo
- </string>
- <string name="AssetErrorTCPTimeout">
- Tiempo de transferencia del archivo
- </string>
- <string name="AssetErrorCircuitGone">
- Circuito desconectado
- </string>
- <string name="AssetErrorPriceMismatch">
- No concuerda el precio en el visor y en el servidor
- </string>
- <string name="AssetErrorUnknownStatus">
- Estado desconocido
- </string>
- <string name="texture">
- la textura
- </string>
- <string name="sound">
- el sonido
- </string>
- <string name="calling card">
- la tarjeta de visita
- </string>
- <string name="landmark">
- el hito
- </string>
- <string name="legacy script">
- el script antiguo
- </string>
- <string name="clothing">
- esa ropa
- </string>
- <string name="object">
- el objeto
- </string>
- <string name="note card">
- la nota
- </string>
- <string name="folder">
- la carpeta
- </string>
- <string name="root">
- la ruta
- </string>
- <string name="lsl2 script">
- ese script de LSL2
- </string>
- <string name="lsl bytecode">
- el código intermedio de LSL
- </string>
- <string name="tga texture">
- esa textura tga
- </string>
- <string name="body part">
- esa parte del cuerpo
- </string>
- <string name="snapshot">
- la foto
- </string>
- <string name="lost and found">
- Objetos Perdidos
- </string>
- <string name="targa image">
- esa imagen targa
- </string>
- <string name="trash">
- la Papelera
- </string>
- <string name="jpeg image">
- esa imagen jpeg
- </string>
- <string name="animation">
- la animación
- </string>
- <string name="gesture">
- el gesto
- </string>
- <string name="simstate">
- simstate
- </string>
- <string name="favorite">
- ese favorito
- </string>
- <string name="symbolic link">
- el enlace
- </string>
- <string name="symbolic folder link">
- enlace de la carpeta
- </string>
- <string name="mesh">
- red
- </string>
- <string name="AvatarEditingAppearance">
- (Edición de Apariencia)
- </string>
- <string name="AvatarAway">
- Ausente
- </string>
- <string name="AvatarBusy">
- Ocupado
- </string>
- <string name="AvatarMuted">
- Ignorado
- </string>
- <string name="anim_express_afraid">
- Susto
- </string>
- <string name="anim_express_anger">
- Enfado
- </string>
- <string name="anim_away">
- Ausente
- </string>
- <string name="anim_backflip">
- Salto mortal atrás
- </string>
- <string name="anim_express_laugh">
- Carcajada
- </string>
- <string name="anim_express_toothsmile">
- Gran sonrisa
- </string>
- <string name="anim_blowkiss">
- Mandar un beso
- </string>
- <string name="anim_express_bored">
- Aburrimiento
- </string>
- <string name="anim_bow">
- Reverencia
- </string>
- <string name="anim_clap">
- Aplauso
- </string>
- <string name="anim_courtbow">
- Reverencia floreada
- </string>
- <string name="anim_express_cry">
- Llanto
- </string>
- <string name="anim_dance1">
- Baile 1
- </string>
- <string name="anim_dance2">
- Baile 2
- </string>
- <string name="anim_dance3">
- Baile 3
- </string>
- <string name="anim_dance4">
- Baile 4
- </string>
- <string name="anim_dance5">
- Baile 5
- </string>
- <string name="anim_dance6">
- Baile 6
- </string>
- <string name="anim_dance7">
- Baile 7
- </string>
- <string name="anim_dance8">
- Baile 8
- </string>
- <string name="anim_express_disdain">
- Desdén
- </string>
- <string name="anim_drink">
- Beber
- </string>
- <string name="anim_express_embarrased">
- Azorarse
- </string>
- <string name="anim_angry_fingerwag">
- Negar con el dedo
- </string>
- <string name="anim_fist_pump">
- Éxito con el puño
- </string>
- <string name="anim_yoga_float">
- Yoga flotando
- </string>
- <string name="anim_express_frown">
- Fruncir el ceño
- </string>
- <string name="anim_impatient">
- Impaciente
- </string>
- <string name="anim_jumpforjoy">
- Salto de alegría
- </string>
- <string name="anim_kissmybutt">
- Bésame el culo
- </string>
- <string name="anim_express_kiss">
- Besar
- </string>
- <string name="anim_laugh_short">
- Reír
- </string>
- <string name="anim_musclebeach">
- Sacar músculo
- </string>
- <string name="anim_no_unhappy">
- No (con enfado)
- </string>
- <string name="anim_no_head">
- No
- </string>
- <string name="anim_nyanya">
- Ña-Ña-Ña
- </string>
- <string name="anim_punch_onetwo">
- Puñetazo uno-dos
- </string>
- <string name="anim_express_open_mouth">
- Abrir la boca
- </string>
- <string name="anim_peace">
- &apos;V&apos; con los dedos
- </string>
- <string name="anim_point_you">
- Señalar a otro/a
- </string>
- <string name="anim_point_me">
- Señalarse
- </string>
- <string name="anim_punch_l">
- Puñetazo izquierdo
- </string>
- <string name="anim_punch_r">
- Puñetazo derecho
- </string>
- <string name="anim_rps_countdown">
- PPT cuenta
- </string>
- <string name="anim_rps_paper">
- PPT papel
- </string>
- <string name="anim_rps_rock">
- PPT piedra
- </string>
- <string name="anim_rps_scissors">
- PPT tijera
- </string>
- <string name="anim_express_repulsed">
- Repulsa
- </string>
- <string name="anim_kick_roundhouse_r">
- Patada circular
- </string>
- <string name="anim_express_sad">
- Triste
- </string>
- <string name="anim_salute">
- Saludo militar
- </string>
- <string name="anim_shout">
- Gritar
- </string>
- <string name="anim_express_shrug">
- Encogerse de hombros
- </string>
- <string name="anim_express_smile">
- Sonreír
- </string>
- <string name="anim_smoke_idle">
- Fumar: en la mano
- </string>
- <string name="anim_smoke_inhale">
- Fumar
- </string>
- <string name="anim_smoke_throw_down">
- Fumar: tirar el cigarro
- </string>
- <string name="anim_express_surprise">
- Sorpresa
- </string>
- <string name="anim_sword_strike_r">
- Estocadas
- </string>
- <string name="anim_angry_tantrum">
- Berrinche
- </string>
- <string name="anim_express_tongue_out">
- Sacar la lengua
- </string>
- <string name="anim_hello">
- Agitar la mano
- </string>
- <string name="anim_whisper">
- Cuchichear
- </string>
- <string name="anim_whistle">
- Pitar
- </string>
- <string name="anim_express_wink">
- Guiño
- </string>
- <string name="anim_wink_hollywood">
- Guiño (Hollywood)
- </string>
- <string name="anim_express_worry">
- Preocuparse
- </string>
- <string name="anim_yes_happy">
- Sí (contento)
- </string>
- <string name="anim_yes_head">
- Sí
- </string>
- <string name="texture_loading">
- Cargando...
- </string>
- <string name="worldmap_offline">
- Sin conexión
- </string>
- <string name="worldmap_item_tooltip_format">
- [PRICE] L$ por [AREA] m²
- </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:
- </string>
- <string name="shout">
- grita:
- </string>
- <string name="ringing">
- Conectando al chat de voz...
- </string>
- <string name="connected">
- Conectado
- </string>
- <string name="unavailable">
- La voz no está disponible en su localización actual
- </string>
- <string name="hang_up">
- Desconectado del chat de voz
- </string>
- <string name="reconnect_nearby">
- Vas a ser reconectado al chat de voz con los cercanos
- </string>
- <string name="ScriptQuestionCautionChatGranted">
- &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], ha recibido permiso para: [PERMISSIONS].
- </string>
- <string name="ScriptQuestionCautionChatDenied">
- A &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS].
- </string>
- <string name="ScriptTakeMoney">
- Cogerle a usted dólares Linden (L$)
- </string>
- <string name="ActOnControlInputs">
- Actuar en sus controles de entrada
- </string>
- <string name="RemapControlInputs">
- Reconfigurar sus controles de entrada
- </string>
- <string name="AnimateYourAvatar">
- Ejecutar animaciones en su avatar
- </string>
- <string name="AttachToYourAvatar">
- Anexarse a su avatar
- </string>
- <string name="ReleaseOwnership">
- Anular la propiedad y que pase a ser público
- </string>
- <string name="LinkAndDelink">
- Enlazar y desenlazar de otros objetos
- </string>
- <string name="AddAndRemoveJoints">
- Añadir y quitar uniones con otros objetos
- </string>
- <string name="ChangePermissions">
- Cambiar sus permisos
- </string>
- <string name="TrackYourCamera">
- Seguir su cámara
- </string>
- <string name="ControlYourCamera">
- Controlar su cámara
- </string>
- <string name="SIM_ACCESS_PG">
- General
- </string>
- <string name="SIM_ACCESS_MATURE">
- Moderado
- </string>
- <string name="SIM_ACCESS_ADULT">
- Adulto
- </string>
- <string name="SIM_ACCESS_DOWN">
- Desconectado
- </string>
- <string name="SIM_ACCESS_MIN">
- Desconocido
- </string>
- <string name="land_type_unknown">
- (desconocido)
- </string>
- <string name="Estate / Full Region">
- Estado /Región completa
- </string>
- <string name="Estate / Homestead">
- Estado / Homestead
- </string>
- <string name="Mainland / Homestead">
- Continente / Homestead
- </string>
- <string name="Mainland / Full Region">
- Continente / Región completa
- </string>
- <string name="all_files">
- Todos los archivos
- </string>
- <string name="sound_files">
- Sonidos
- </string>
- <string name="animation_files">
- Animaciones
- </string>
- <string name="image_files">
- Imágenes
- </string>
- <string name="save_file_verb">
- Guardar
- </string>
- <string name="load_file_verb">
- Cargar
- </string>
- <string name="targa_image_files">
- Imágenes Targa
- </string>
- <string name="bitmap_image_files">
- Imágenes de mapa de bits
- </string>
- <string name="avi_movie_file">
- Archivo de película AVI
- </string>
- <string name="xaf_animation_file">
- Archivo de anim. XAF
- </string>
- <string name="xml_file">
- Archivo XML
- </string>
- <string name="raw_file">
- Archivo RAW
- </string>
- <string name="compressed_image_files">
- Imágenes comprimidas
- </string>
- <string name="load_files">
- Cargar archivos
- </string>
- <string name="choose_the_directory">
- Elegir directorio
- </string>
- <string name="script_files">
- Scripts
- </string>
- <string name="AvatarSetNotAway">
- Salir del estado ausente
- </string>
- <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="physics">
- Física
- </string>
- <string name="invalid">
- inválido/a
- </string>
- <string name="none">
- ninguno
- </string>
- <string name="shirt_not_worn">
- Camisa no puesta
- </string>
- <string name="pants_not_worn">
- Pantalones no puestos
- </string>
- <string name="shoes_not_worn">
- Zapatos no puestos
- </string>
- <string name="socks_not_worn">
- Calcetines no puestos
- </string>
- <string name="jacket_not_worn">
- Chaqueta no puesta
- </string>
- <string name="gloves_not_worn">
- Guantes no puestos
- </string>
- <string name="undershirt_not_worn">
- Camiseta no puesta
- </string>
- <string name="underpants_not_worn">
- Ropa interior no puesta
- </string>
- <string name="skirt_not_worn">
- Falda no puesta
- </string>
- <string name="alpha_not_worn">
- Alfa no puesta
- </string>
- <string name="tattoo_not_worn">
- Tatuaje no puesto
- </string>
- <string name="physics_not_worn">
- Física no puesta
- </string>
- <string name="invalid_not_worn">
- no válido/a
- </string>
- <string name="create_new_shape">
- Crear una anatomía nueva
- </string>
- <string name="create_new_skin">
- Crear una piel nueva
- </string>
- <string name="create_new_hair">
- Crear pelo nuevo
- </string>
- <string name="create_new_eyes">
- Crear ojos nuevos
- </string>
- <string name="create_new_shirt">
- Crear una camisa nueva
- </string>
- <string name="create_new_pants">
- Crear unos pantalones nuevos
- </string>
- <string name="create_new_shoes">
- Crear unos zapatos nuevos
- </string>
- <string name="create_new_socks">
- Crear unos calcetines nuevos
- </string>
- <string name="create_new_jacket">
- Crear una chaqueta nueva
- </string>
- <string name="create_new_gloves">
- Crear unos guantes nuevos
- </string>
- <string name="create_new_undershirt">
- Crear una camiseta nueva
- </string>
- <string name="create_new_underpants">
- Crear ropa interior nueva
- </string>
- <string name="create_new_skirt">
- Crear una falda nueva
- </string>
- <string name="create_new_alpha">
- Crear una capa alfa nueva
- </string>
- <string name="create_new_tattoo">
- Crear un tatuaje nuevo
- </string>
- <string name="create_new_physics">
- Crear nueva física
- </string>
- <string name="create_new_invalid">
- no válido/a
- </string>
- <string name="NewWearable">
- Nuevo [WEARABLE_ITEM]
- </string>
- <string name="next">
- Siguiente
- </string>
- <string name="ok">
- OK
- </string>
- <string name="GroupNotifyGroupNotice">
- Aviso de grupo
- </string>
- <string name="GroupNotifyGroupNotices">
- Avisos del grupo
- </string>
- <string name="GroupNotifySentBy">
- Enviado por
- </string>
- <string name="GroupNotifyAttached">
- Adjunto:
- </string>
- <string name="GroupNotifyViewPastNotices">
- Ver los avisos pasados u optar por dejar de recibir aquí estos mensajes.
- </string>
- <string name="GroupNotifyOpenAttachment">
- Abrir el adjunto
- </string>
- <string name="GroupNotifySaveAttachment">
- Guardar el adjunto
- </string>
- <string name="TeleportOffer">
- Ofrecimiento de teleporte
- </string>
- <string name="StartUpNotifications">
- Llegaron avisos nuevos mientras estabas ausente...
- </string>
- <string name="OverflowInfoChannelString">
- Tienes [%d] aviso/s más
- </string>
- <string name="BodyPartsRightArm">
- Brazo der.
- </string>
- <string name="BodyPartsHead">
- Cabeza
- </string>
- <string name="BodyPartsLeftArm">
- Brazo izq.
- </string>
- <string name="BodyPartsLeftLeg">
- Pierna izq.
- </string>
- <string name="BodyPartsTorso">
- Torso
- </string>
- <string name="BodyPartsRightLeg">
- Pierna der.
- </string>
- <string name="GraphicsQualityLow">
- Bajo
- </string>
- <string name="GraphicsQualityMid">
- Medio
- </string>
- <string name="GraphicsQualityHigh">
- Alto
- </string>
- <string name="LeaveMouselook">
- Pulsa ESC para salir de la vista subjetiva
- </string>
- <string name="InventoryNoMatchingItems">
- ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/all/[SEARCH_TERM] Buscar].
- </string>
- <string name="PlacesNoMatchingItems">
- ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/places/[SEARCH_TERM] Buscar].
- </string>
- <string name="FavoritesNoMatchingItems">
- Arrastra aquí un hito para tenerlo en tus favoritos.
- </string>
- <string name="InventoryNoTexture">
- No tienes en tu inventario una copia de esta textura
- </string>
- <string name="InventoryInboxNoItems">
- Aquí aparecerán algunos de los objetos que recibas, como los regalos Premium. Después puedes arrastrarlos a tu inventario.
- </string>
- <string name="MarketplaceURL">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
- </string>
- <string name="MarketplaceURL_CreateStore">
- http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
- </string>
- <string name="MarketplaceURL_Dashboard">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
- </string>
- <string name="MarketplaceURL_Imports">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
- </string>
- <string name="MarketplaceURL_LearnMore">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
- </string>
- <string name="InventoryOutboxNotMerchantTitle">
- Cualquier usuario puede vender objetos en el mercado.
- </string>
- <string name="InventoryOutboxNotMerchantTooltip"/>
- <string name="InventoryOutboxNotMerchant">
- Para hacerte comerciante debes [[MARKETPLACE_CREATE_STORE_URL] crear una tienda del Mercado].
- </string>
- <string name="InventoryOutboxNoItemsTitle">
- El buzón de salida está vacío.
- </string>
- <string name="InventoryOutboxNoItemsTooltip"/>
- <string name="InventoryOutboxNoItems">
- Arrastra carpetas a esta sección y pulsa en &quot;Enviar al Mercado&quot; para incluirlas en la lista de venta del [[MARKETPLACE_DASHBOARD_URL] Mercado].
- </string>
- <string name="Marketplace Error None">
- Sin errores
- </string>
- <string name="Marketplace Error Not Merchant">
- Error: Para poder enviar objetos al mercado, debes registrarte como comerciante (es gratis).
- </string>
- <string name="Marketplace Error Empty Folder">
- Error: Esta carpeta está vacía.
- </string>
- <string name="Marketplace Error Unassociated Products">
- Error: Este objeto no se pudo subir porque tu cuenta de comerciante tiene demasiados objetos que no están asociados a productos. Para corregirlo, inicia sesión en la página web del mercado y asocia más objetos.
- </string>
- <string name="Marketplace Error Object Limit">
- Error: Este elemento contiene demasiados objetos. Para corregir el error, guarda objetos en cajas de forma que el total de objetos sea menor que 200.
- </string>
- <string name="Marketplace Error Folder Depth">
- Error: Este objeto contiene demasiados niveles de carpetas anidadas. Reorganízalo de forma que tenga como máximo 3 niveles de carpetas anidadas.
- </string>
- <string name="Marketplace Error Unsellable Item">
- Error: Este objeto no se puede vender en el mercado.
- </string>
- <string name="Marketplace Error Internal Import">
- Error: Este objeto tiene un problema. Vuelve a intentarlo más tarde.
- </string>
- <string name="Open landmarks">
- Abrir hitos
- </string>
- <string name="no_transfer" value="(no transferible)"/>
- <string name="no_modify" value="(no modificable)"/>
- <string name="no_copy" value="(no copiable)"/>
- <string name="worn" value="(puesto)"/>
- <string name="link" value="(enlace)"/>
- <string name="broken_link" value="(enlace roto)&quot;"/>
- <string name="LoadingContents">
- Cargando el contenido...
- </string>
- <string name="NoContents">
- No hay contenido
- </string>
- <string name="WornOnAttachmentPoint" value="(lo llevas en: [ATTACHMENT_POINT])"/>
- <string name="ActiveGesture" value="[GESLABEL] (activo)"/>
- <string name="Chat Message" 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="GestureActionNone" value="Ninguno"/>
- <string name="HelloAvatar" value="¡Hola, avatar!"/>
- <string name="ViewAllGestures" value="Ver todos &gt;&gt;"/>
- <string name="GetMoreGestures" value="Obtener más &gt;&gt;"/>
- <string name="Animations" value="Animaciones,"/>
- <string name="Calling Cards" value="Tarjetas de visita,"/>
- <string name="Clothing" value="Ropa,"/>
- <string name="Gestures" value="Gestos,"/>
- <string name="Landmarks" value="Hitos,"/>
- <string name="Notecards" value="Notas,"/>
- <string name="Objects" value="Objetos,"/>
- <string name="Scripts" value="Scripts,"/>
- <string name="Sounds" value="Sonidos,"/>
- <string name="Textures" value="Texturas,"/>
- <string name="Snapshots" value="Fotos,"/>
- <string name="No Filters" value="No"/>
- <string name="Since Logoff" value="- Desde la desconexión"/>
- <string name="InvFolder My Inventory">
- Mi Inventario
- </string>
- <string name="InvFolder Library">
- Biblioteca
- </string>
- <string name="InvFolder Textures">
- Texturas
- </string>
- <string name="InvFolder Sounds">
- Sonidos
- </string>
- <string name="InvFolder Calling Cards">
- Tarjetas de visita
- </string>
- <string name="InvFolder Landmarks">
- Hitos
- </string>
- <string name="InvFolder Scripts">
- Scripts
- </string>
- <string name="InvFolder Clothing">
- Ropa
- </string>
- <string name="InvFolder Objects">
- Objetos
- </string>
- <string name="InvFolder Notecards">
- Notas
- </string>
- <string name="InvFolder New Folder">
- Carpeta nueva
- </string>
- <string name="InvFolder Inventory">
- Inventario
- </string>
- <string name="InvFolder Uncompressed Images">
- Imágenes sin comprimir
- </string>
- <string name="InvFolder Body Parts">
- Partes del cuerpo
- </string>
- <string name="InvFolder Trash">
- Papelera
- </string>
- <string name="InvFolder Photo Album">
- Álbum de fotos
- </string>
- <string name="InvFolder Lost And Found">
- Objetos Perdidos
- </string>
- <string name="InvFolder Uncompressed Sounds">
- Sonidos sin comprimir
- </string>
- <string name="InvFolder Animations">
- Animaciones
- </string>
- <string name="InvFolder Gestures">
- Gestos
- </string>
- <string name="InvFolder Favorite">
- Mis Favoritos
- </string>
- <string name="InvFolder favorite">
- Mis Favoritos
- </string>
- <string name="InvFolder Current Outfit">
- Vestuario actual
- </string>
- <string name="InvFolder Initial Outfits">
- Vestuario inicial
- </string>
- <string name="InvFolder My Outfits">
- Mis vestuarios
- </string>
- <string name="InvFolder Accessories">
- Accesorios
- </string>
- <string name="InvFolder Meshes">
- Redes
- </string>
- <string name="InvFolder Friends">
- Amigos
- </string>
- <string name="InvFolder All">
- Todas
- </string>
- <string name="no_attachments">
- No tienes puestos anexos
- </string>
- <string name="Attachments remain">
- Anexos (quedan [COUNT] ranuras)
- </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="Neck">
- Cuello
- </string>
- <string name="Avatar Center">
- Centro del avatar
- </string>
- <string name="Invalid Attachment">
- Punto de colocación no válido
- </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="GroupPlanningDate">
- [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
- </string>
- <string name="GroupIndividualShare" value="Grupo Aportaciones individuales"/>
- <string name="GroupColumn" value="Grupo"/>
- <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="Anyone">
- cualquiera
- </string>
- <string name="RegionInfoError">
- error
- </string>
- <string name="RegionInfoAllEstatesOwnedBy">
- todos los estados propiedad de [OWNER]
- </string>
- <string name="RegionInfoAllEstatesYouOwn">
- todos los estados que posees
- </string>
- <string name="RegionInfoAllEstatesYouManage">
- todos los estados que administras para [OWNER]
- </string>
- <string name="RegionInfoAllowedResidents">
- Resientes autorizados: ([ALLOWEDAGENTS], de un máx. de [MAXACCESS])
- </string>
- <string name="RegionInfoAllowedGroups">
- Grupos autorizados: ([ALLOWEDGROUPS], de un máx. de [MAXACCESS])
- </string>
- <string name="ScriptLimitsParcelScriptMemory">
- Memoria de los scripts de la parcela
- </string>
- <string name="ScriptLimitsParcelsOwned">
- Parcelas listadas: [PARCELS]
- </string>
- <string name="ScriptLimitsMemoryUsed">
- Memoria usada: [COUNT] kb de un máx de [MAX] kb; [AVAILABLE] kb disponibles
- </string>
- <string name="ScriptLimitsMemoryUsedSimple">
- Memoria usada: [COUNT] kb
- </string>
- <string name="ScriptLimitsParcelScriptURLs">
- URLs de los scripts de la parcela
- </string>
- <string name="ScriptLimitsURLsUsed">
- URLs usadas: [COUNT] de un máx. de [MAX]; [AVAILABLE] disponibles
- </string>
- <string name="ScriptLimitsURLsUsedSimple">
- URLs usadas: [COUNT]
- </string>
- <string name="ScriptLimitsRequestError">
- Error al obtener la información
- </string>
- <string name="ScriptLimitsRequestNoParcelSelected">
- No hay una parcela seleccionada
- </string>
- <string name="ScriptLimitsRequestWrongRegion">
- Error: la información del script sólo está disponible en tu región actual
- </string>
- <string name="ScriptLimitsRequestWaiting">
- Obteniendo la información...
- </string>
- <string name="ScriptLimitsRequestDontOwnParcel">
- No tienes permiso para examinar esta parcela
- </string>
- <string name="SITTING_ON">
- Sentado en
- </string>
- <string name="ATTACH_CHEST">
- Tórax
- </string>
- <string name="ATTACH_HEAD">
- Cabeza
- </string>
- <string name="ATTACH_LSHOULDER">
- Hombro izquierdo
- </string>
- <string name="ATTACH_RSHOULDER">
- Hombro derecho
- </string>
- <string name="ATTACH_LHAND">
- Mano izq.
- </string>
- <string name="ATTACH_RHAND">
- Mano der.
- </string>
- <string name="ATTACH_LFOOT">
- Pie izq.
- </string>
- <string name="ATTACH_RFOOT">
- Pie der.
- </string>
- <string name="ATTACH_BACK">
- Anterior
- </string>
- <string name="ATTACH_PELVIS">
- Pelvis
- </string>
- <string name="ATTACH_MOUTH">
- Boca
- </string>
- <string name="ATTACH_CHIN">
- Barbilla
- </string>
- <string name="ATTACH_LEAR">
- Oreja izq.
- </string>
- <string name="ATTACH_REAR">
- Oreja der.
- </string>
- <string name="ATTACH_LEYE">
- Ojo izq.
- </string>
- <string name="ATTACH_REYE">
- Ojo der.
- </string>
- <string name="ATTACH_NOSE">
- Nariz
- </string>
- <string name="ATTACH_RUARM">
- Brazo der.
- </string>
- <string name="ATTACH_RLARM">
- Antebrazo der.
- </string>
- <string name="ATTACH_LUARM">
- Brazo izq.
- </string>
- <string name="ATTACH_LLARM">
- Antebrazo izq.
- </string>
- <string name="ATTACH_RHIP">
- Cadera der.
- </string>
- <string name="ATTACH_RULEG">
- Muslo der.
- </string>
- <string name="ATTACH_RLLEG">
- Pantorrilla der.
- </string>
- <string name="ATTACH_LHIP">
- Cadera izq.
- </string>
- <string name="ATTACH_LULEG">
- Muslo izq.
- </string>
- <string name="ATTACH_LLLEG">
- Pantorrilla izq.
- </string>
- <string name="ATTACH_BELLY">
- Vientre
- </string>
- <string name="ATTACH_RPEC">
- Pecho derecho
- </string>
- <string name="ATTACH_LPEC">
- Pecho izquierdo
- </string>
- <string name="ATTACH_HUD_CENTER_2">
- HUD: Centro 2
- </string>
- <string name="ATTACH_HUD_TOP_RIGHT">
- HUD: arriba der.
- </string>
- <string name="ATTACH_HUD_TOP_CENTER">
- HUD: arriba centro
- </string>
- <string name="ATTACH_HUD_TOP_LEFT">
- HUD: arriba izq.
- </string>
- <string name="ATTACH_HUD_CENTER_1">
- HUD: Centro 1
- </string>
- <string name="ATTACH_HUD_BOTTOM_LEFT">
- HUD: abajo izq.
- </string>
- <string name="ATTACH_HUD_BOTTOM">
- HUD: abajo
- </string>
- <string name="ATTACH_HUD_BOTTOM_RIGHT">
- HUD: abajo der.
- </string>
- <string name="CursorPos">
- Línea [LINE], Columna [COLUMN]
- </string>
- <string name="PanelDirCountFound">
- [COUNT] resultados
- </string>
- <string name="PanelContentsTooltip">
- Contenido del objeto
- </string>
- <string name="PanelContentsNewScript">
- Script nuevo
- </string>
- <string name="BusyModeResponseDefault">
- El Residente al que has enviado un mensaje ha solicitado que no se le moleste porque está en modo ocupado. Podrá ver tu mensaje más adelante, ya que éste aparecerá en su panel de MI.
- </string>
- <string name="MuteByName">
- (Por el nombre)
- </string>
- <string name="MuteAgent">
- (Residente)
- </string>
- <string name="MuteObject">
- (Objeto)
- </string>
- <string name="MuteGroup">
- (Grupo)
- </string>
- <string name="MuteExternal">
- (Externo)
- </string>
- <string name="RegionNoCovenant">
- No se ha aportado un contrato para este estado.
- </string>
- <string name="RegionNoCovenantOtherOwner">
- No se ha aportado un contrato para este estado. El terreno de este estado lo vende el propietario del estado, no Linden Lab. Por favor, contacta con ese propietario para informarte sobre la venta.
- </string>
- <string name="covenant_last_modified" value="Última modificación: "/>
- <string name="none_text" value="(no hay)"/>
- <string name="never_text" value=" (nunca)"/>
- <string name="GroupOwned">
- Propiedad del grupo
- </string>
- <string name="Public">
- Público
- </string>
- <string name="LocalSettings">
- Configuración local
- </string>
- <string name="RegionSettings">
- Configuración de la región
- </string>
- <string name="ClassifiedClicksTxt">
- Clics: [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil
- </string>
- <string name="ClassifiedUpdateAfterPublish">
- (se actualizará tras la publicación)
- </string>
- <string name="NoPicksClassifiedsText">
- No has creado destacados ni clasificados. Pulsa el botón Más para crear uno.
- </string>
- <string name="NoAvatarPicksClassifiedsText">
- El usuario no tiene clasificados ni destacados
- </string>
- <string name="PicksClassifiedsLoadingText">
- Cargando...
- </string>
- <string name="MultiPreviewTitle">
- Vista previa
- </string>
- <string name="MultiPropertiesTitle">
- Propiedades
- </string>
- <string name="InvOfferAnObjectNamed">
- Un objeto de nombre
- </string>
- <string name="InvOfferOwnedByGroup">
- propiedad del grupo
- </string>
- <string name="InvOfferOwnedByUnknownGroup">
- propiedad de un grupo desconocido
- </string>
- <string name="InvOfferOwnedBy">
- propiedad de
- </string>
- <string name="InvOfferOwnedByUnknownUser">
- propiedad de un usuario desconocido
- </string>
- <string name="InvOfferGaveYou">
- te ha dado
- </string>
- <string name="InvOfferDecline">
- Rechazas [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
- </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="GroupMoneyDate">
- [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
- </string>
- <string name="ViewerObjectContents">
- Contenidos
- </string>
- <string name="AcquiredItems">
- Artículos adquiridos
- </string>
- <string name="Cancel">
- Cancelar
- </string>
- <string name="UploadingCosts">
- Subir [NAME] cuesta [AMOUNT] L$
- </string>
- <string name="BuyingCosts">
- Comprar esto cuesta [AMOUNT] L$
- </string>
- <string name="UnknownFileExtension">
- Extensión de archivo desconocida [.%s]
-Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh
- </string>
- <string name="MuteObject2">
- Ignorar
- </string>
- <string name="AddLandmarkNavBarMenu">
- Guardarme este hito...
- </string>
- <string name="EditLandmarkNavBarMenu">
- Editar este hito...
- </string>
- <string name="accel-mac-control">
- ⌃
- </string>
- <string name="accel-mac-command">
- ⌘
- </string>
- <string name="accel-mac-option">
- ⌥
- </string>
- <string name="accel-mac-shift">
- ⇧
- </string>
- <string name="accel-win-control">
- Ctrl+
- </string>
- <string name="accel-win-alt">
- Alt+
- </string>
- <string name="accel-win-shift">
- Mayús+
- </string>
- <string name="FileSaved">
- Archivo guardado
- </string>
- <string name="Receiving">
- Recibiendo
- </string>
- <string name="AM">
- AM
- </string>
- <string name="PM">
- PM
- </string>
- <string name="PST">
- PST
- </string>
- <string name="PDT">
- PDT
- </string>
- <string name="Direction_Forward">
- Adelante
- </string>
- <string name="Direction_Left">
- Izquierda
- </string>
- <string name="Direction_Right">
- Derecha
- </string>
- <string name="Direction_Back">
- Atrás
- </string>
- <string name="Direction_North">
- Norte
- </string>
- <string name="Direction_South">
- Sur
- </string>
- <string name="Direction_West">
- Oeste
- </string>
- <string name="Direction_East">
- Este
- </string>
- <string name="Direction_Up">
- Arriba
- </string>
- <string name="Direction_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">
- Adulto
- </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="Rental">
- Terreno en alquiler
- </string>
- <string name="Any">
- Cualquiera
- </string>
- <string name="You">
- Tú
- </string>
- <string name="Multiple Media">
- Múltiples medias
- </string>
- <string name="Play Media">
- Play/Pausa los media
- </string>
- <string name="MBCmdLineError">
- Ha habido un error analizando la línea de comando.
-Por favor, consulta: http://wiki.secondlife.com/wiki/Client_parameters
-Error:
- </string>
- <string name="MBCmdLineUsg">
- [APP_NAME] Uso de línea de comando:
- </string>
- <string name="MBUnableToAccessFile">
- [APP_NAME] no puede acceder a un archivo que necesita.
-
-Puede ser porque estés ejecutando varias copias, o porque tu sistema crea -equivocadamente- que el archivo está abierto.
-Si este mensaje persiste, reinicia tu ordenador y vuelve a intentarlo.
-Si aun así sigue apareciendo el mensaje, debes desinstalar completamente [APP_NAME] y reinstalarlo.
- </string>
- <string name="MBFatalError">
- Error fatal
- </string>
- <string name="MBRequiresAltiVec">
- [APP_NAME] requiere un procesador con AltiVec (G4 o posterior).
- </string>
- <string name="MBAlreadyRunning">
- [APP_NAME] ya se está ejecutando.
-Revisa tu barra de tareas para encontrar una copia minimizada del programa.
-Si este mensaje persiste, reinicia tu ordenador.
- </string>
- <string name="MBFrozenCrashed">
- En su anterior ejecución, [APP_NAME] se congeló o se cayó.
-¿Quieres enviar un informe de caída?
- </string>
- <string name="MBAlert">
- Alerta
- </string>
- <string name="MBNoDirectX">
- [APP_NAME] no encuentra DirectX 9.0b o superior.
-[APP_NAME] usa DirectX para detectar el hardware o los drivers no actualizados que pueden provocar problemas de estabilidad, ejecución pobre y caídas. Aunque puedes ejecutar [APP_NAME] sin él, recomendamos encarecidamente hacerlo con DirectX 9.0b.
-
-¿Quieres continuar?
- </string>
- <string name="MBWarning">
- ¡Atención!
- </string>
- <string name="MBNoAutoUpdate">
- Las actualizaciones automáticas no están todavía implementadas para Linux.
-Por favor, descarga la última versión desde www.secondlife.com.
- </string>
- <string name="MBRegClassFailed">
- Fallo en RegisterClass
- </string>
- <string name="MBError">
- Error
- </string>
- <string name="MBFullScreenErr">
- No puede ejecutarse a pantalla completa de [WIDTH] x [HEIGHT].
-Ejecutándose en una ventana.
- </string>
- <string name="MBDestroyWinFailed">
- Error Shutdown destruyendo la ventana (DestroyWindow() failed)
- </string>
- <string name="MBShutdownErr">
- Error Shutdown
- </string>
- <string name="MBDevContextErr">
- No se puede construir el &apos;GL device context&apos;
- </string>
- <string name="MBPixelFmtErr">
- No se puede encontrar un formato adecuado de píxel
- </string>
- <string name="MBPixelFmtDescErr">
- No se puede conseguir la descripción del formato de píxel
- </string>
- <string name="MBTrueColorWindow">
- Para ejecutarse, [APP_NAME] necesita True Color (32-bit).
-Por favor, en las configuraciones de tu ordenador ajusta el modo de color a 32-bit.
- </string>
- <string name="MBAlpha">
- [APP_NAME] no puede ejecutarse porque no puede obtener un canal alpha de 8 bit. Generalmente, se debe a alguna cuestión de los drivers de la tarjeta de vídeo.
-Por favor, comprueba que tienes instalados los últimos drivers para tu tarjeta de vídeo.
-Comprueba también que tu monitor esta configurado para True Color (32-bit) en Panel de Control &gt; Apariencia y temas &gt; Pantalla.
-Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
- </string>
- <string name="MBPixelFmtSetErr">
- No se puede configurar el formato de píxel
- </string>
- <string name="MBGLContextErr">
- No se puede crear el &apos;GL rendering context&apos;
- </string>
- <string name="MBGLContextActErr">
- No se puede activar el &apos;GL rendering context&apos;
- </string>
- <string name="MBVideoDrvErr">
- [APP_NAME] no puede ejecutarse porque los drivers de tu tarjeta de vídeo o no están bien instalados, o no están actualizados, o son para hardware no admitido. Por favor, comprueba que tienes los drivers más actuales para tu tarjeta de vídeo, y, aunque los tengas, intenta reinstalarlos.
-
-Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
- </string>
- <string name="5 O&apos;Clock Shadow">
- Barba del día
- </string>
- <string name="All White">
- Blanco del todo
- </string>
- <string name="Anime Eyes">
- Ojos de cómic
- </string>
- <string name="Arced">
- Arqueadas
- </string>
- <string name="Arm Length">
- Brazos: longitud
- </string>
- <string name="Attached">
- Cortos
- </string>
- <string name="Attached Earlobes">
- Lóbulos
- </string>
- <string name="Back Fringe">
- Nuca: largo
- </string>
- <string name="Baggy">
- Marcadas
- </string>
- <string name="Bangs">
- Bangs
- </string>
- <string name="Beady Eyes">
- Ojos pequeños
- </string>
- <string name="Belly Size">
- Barriga: tamaño
- </string>
- <string name="Big">
- Grande
- </string>
- <string name="Big Butt">
- Culo grande
- </string>
- <string name="Big Hair Back">
- Pelo: moño
- </string>
- <string name="Big Hair Front">
- Pelo: tupé
- </string>
- <string name="Big Hair Top">
- Pelo: melena alta
- </string>
- <string name="Big Head">
- Cabeza grande
- </string>
- <string name="Big Pectorals">
- Grandes pectorales
- </string>
- <string name="Big Spikes">
- Crestas grandes
- </string>
- <string name="Black">
- Negro
- </string>
- <string name="Blonde">
- Rubio
- </string>
- <string name="Blonde Hair">
- Pelo rubio
- </string>
- <string name="Blush">
- Colorete
- </string>
- <string name="Blush Color">
- Color del colorete
- </string>
- <string name="Blush Opacity">
- Opacidad del colorete
- </string>
- <string name="Body Definition">
- Definición del cuerpo
- </string>
- <string name="Body Fat">
- Cuerpo: gordura
- </string>
- <string name="Body Freckles">
- Pecas del cuerpo
- </string>
- <string name="Body Thick">
- Cuerpo grueso
- </string>
- <string name="Body Thickness">
- Cuerpo: grosor
- </string>
- <string name="Body Thin">
- Cuerpo delgado
- </string>
- <string name="Bow Legged">
- Abiertas
- </string>
- <string name="Breast Buoyancy">
- Busto: firmeza
- </string>
- <string name="Breast Cleavage">
- Busto: canalillo
- </string>
- <string name="Breast Size">
- Busto: tamaño
- </string>
- <string name="Bridge Width">
- Puente: ancho
- </string>
- <string name="Broad">
- Aumentar
- </string>
- <string name="Brow Size">
- Arco ciliar
- </string>
- <string name="Bug Eyes">
- Bug Eyes
- </string>
- <string name="Bugged Eyes">
- Ojos saltones
- </string>
- <string name="Bulbous">
- Bulbosa
- </string>
- <string name="Bulbous Nose">
- Nariz de porra
- </string>
- <string name="Breast Physics Mass">
- Masa del busto
- </string>
- <string name="Breast Physics Smoothing">
- Suavizado del busto
- </string>
- <string name="Breast Physics Gravity">
- Gravedad del busto
- </string>
- <string name="Breast Physics Drag">
- Aerodinámica del busto
- </string>
- <string name="Breast Physics InOut Max Effect">
- Efecto máx.
- </string>
- <string name="Breast Physics InOut Spring">
- Elasticidad
- </string>
- <string name="Breast Physics InOut Gain">
- Ganancia
- </string>
- <string name="Breast Physics InOut Damping">
- Amortiguación
- </string>
- <string name="Breast Physics UpDown Max Effect">
- Efecto máx.
- </string>
- <string name="Breast Physics UpDown Spring">
- Elasticidad
- </string>
- <string name="Breast Physics UpDown Gain">
- Ganancia
- </string>
- <string name="Breast Physics UpDown Damping">
- Amortiguación
- </string>
- <string name="Breast Physics LeftRight Max Effect">
- Efecto máx.
- </string>
- <string name="Breast Physics LeftRight Spring">
- Elasticidad
- </string>
- <string name="Breast Physics LeftRight Gain">
- Ganancia
- </string>
- <string name="Breast Physics LeftRight Damping">
- Amortiguación
- </string>
- <string name="Belly Physics Mass">
- Masa de la barriga
- </string>
- <string name="Belly Physics Smoothing">
- Suavizado de la barriga
- </string>
- <string name="Belly Physics Gravity">
- Gravedad de la barriga
- </string>
- <string name="Belly Physics Drag">
- Aerodinámica de la barriga
- </string>
- <string name="Belly Physics UpDown Max Effect">
- Efecto máx.
- </string>
- <string name="Belly Physics UpDown Spring">
- Elasticidad
- </string>
- <string name="Belly Physics UpDown Gain">
- Ganancia
- </string>
- <string name="Belly Physics UpDown Damping">
- Amortiguación
- </string>
- <string name="Butt Physics Mass">
- Masa del culo
- </string>
- <string name="Butt Physics Smoothing">
- Suavizado del culo
- </string>
- <string name="Butt Physics Gravity">
- Gravedad del culo
- </string>
- <string name="Butt Physics Drag">
- Aerodinámica del culo
- </string>
- <string name="Butt Physics UpDown Max Effect">
- Efecto máx.
- </string>
- <string name="Butt Physics UpDown Spring">
- Elasticidad
- </string>
- <string name="Butt Physics UpDown Gain">
- Ganancia
- </string>
- <string name="Butt Physics UpDown Damping">
- Amortiguación
- </string>
- <string name="Butt Physics LeftRight Max Effect">
- Efecto máx.
- </string>
- <string name="Butt Physics LeftRight Spring">
- Elasticidad
- </string>
- <string name="Butt Physics LeftRight Gain">
- Ganancia
- </string>
- <string name="Butt Physics LeftRight Damping">
- Amortiguación
- </string>
- <string name="Bushy Eyebrows">
- Cejijuntas
- </string>
- <string name="Bushy Hair">
- Pelo tupido
- </string>
- <string name="Butt Size">
- Culo: tamaño
- </string>
- <string name="Butt Gravity">
- Gravedad del culo
- </string>
- <string name="bustle skirt">
- Polisón
- </string>
- <string name="no bustle">
- Sin polisón
- </string>
- <string name="more bustle">
- Con polisón
- </string>
- <string name="Chaplin">
- Cortito
- </string>
- <string name="Cheek Bones">
- Pómulos
- </string>
- <string name="Chest Size">
- Tórax: tamaño
- </string>
- <string name="Chin Angle">
- Barbilla: ángulo
- </string>
- <string name="Chin Cleft">
- Barbilla: contorno
- </string>
- <string name="Chin Curtains">
- Barba en collar
- </string>
- <string name="Chin Depth">
- Barbilla: largo
- </string>
- <string name="Chin Heavy">
- Hacia la barbilla
- </string>
- <string name="Chin In">
- Barbilla retraída
- </string>
- <string name="Chin Out">
- Barbilla prominente
- </string>
- <string name="Chin-Neck">
- Papada
- </string>
- <string name="Clear">
- Transparente
- </string>
- <string name="Cleft">
- Remarcar
- </string>
- <string name="Close Set Eyes">
- Ojos juntos
- </string>
- <string name="Closed">
- Cerrar
- </string>
- <string name="Closed Back">
- Trasera cerrada
- </string>
- <string name="Closed Front">
- Frontal cerrado
- </string>
- <string name="Closed Left">
- Cerrada
- </string>
- <string name="Closed Right">
- Cerrada
- </string>
- <string name="Coin Purse">
- Poco abultada
- </string>
- <string name="Collar Back">
- Espalda
- </string>
- <string name="Collar Front">
- Escote
- </string>
- <string name="Corner Down">
- Hacia abajo
- </string>
- <string name="Corner Up">
- Hacia arriba
- </string>
- <string name="Creased">
- Caídos
- </string>
- <string name="Crooked Nose">
- Nariz torcida
- </string>
- <string name="Cuff Flare">
- Acampanado
- </string>
- <string name="Dark">
- Oscuridad
- </string>
- <string name="Dark Green">
- Verde oscuro
- </string>
- <string name="Darker">
- Más oscuros
- </string>
- <string name="Deep">
- Remarcar
- </string>
- <string name="Default Heels">
- Tacones por defecto
- </string>
- <string name="Dense">
- Densas
- </string>
- <string name="Double Chin">
- Mucha papada
- </string>
- <string name="Downturned">
- Poco
- </string>
- <string name="Duffle Bag">
- Muy abultada
- </string>
- <string name="Ear Angle">
- Orejas: ángulo
- </string>
- <string name="Ear Size">
- Orejas: tamaño
- </string>
- <string name="Ear Tips">
- Orejas: forma
- </string>
- <string name="Egg Head">
- Cabeza: ahuevada
- </string>
- <string name="Eye Bags">
- Ojos: bolsas
- </string>
- <string name="Eye Color">
- Ojos: color
- </string>
- <string name="Eye Depth">
- Ojos: profundidad
- </string>
- <string name="Eye Lightness">
- Ojos: brillo
- </string>
- <string name="Eye Opening">
- Ojos: apertura
- </string>
- <string name="Eye Pop">
- Ojos: simetría
- </string>
- <string name="Eye Size">
- Ojos: tamaño
- </string>
- <string name="Eye Spacing">
- Ojos: separación
- </string>
- <string name="Eyebrow Arc">
- Cejas: arco
- </string>
- <string name="Eyebrow Density">
- Cejas: densidad
- </string>
- <string name="Eyebrow Height">
- Cejas: altura
- </string>
- <string name="Eyebrow Points">
- Cejas: en V
- </string>
- <string name="Eyebrow Size">
- Cejas: tamaño
- </string>
- <string name="Eyelash Length">
- Pestañas: longitud
- </string>
- <string name="Eyeliner">
- Contorno de ojos
- </string>
- <string name="Eyeliner Color">
- Contorno de ojos: color
- </string>
- <string name="Eyes Bugged">
- Eyes Bugged
- </string>
- <string name="Face Shear">
- Cara: simetría
- </string>
- <string name="Facial Definition">
- Rasgos marcados
- </string>
- <string name="Far Set Eyes">
- Ojos separados
- </string>
- <string name="Fat Lips">
- Prominentes
- </string>
- <string name="Female">
- Mujer
- </string>
- <string name="Fingerless">
- Sin dedos
- </string>
- <string name="Fingers">
- Con dedos
- </string>
- <string name="Flared Cuffs">
- Campana
- </string>
- <string name="Flat">
- Redondeadas
- </string>
- <string name="Flat Butt">
- Culo plano
- </string>
- <string name="Flat Head">
- Cabeza plana
- </string>
- <string name="Flat Toe">
- Empeine bajo
- </string>
- <string name="Foot Size">
- Pie: tamaño
- </string>
- <string name="Forehead Angle">
- Frente: ángulo
- </string>
- <string name="Forehead Heavy">
- Hacia la frente
- </string>
- <string name="Freckles">
- Pecas
- </string>
- <string name="Front Fringe">
- Flequillo
- </string>
- <string name="Full Back">
- Sin cortar
- </string>
- <string name="Full Eyeliner">
- Contorno completo
- </string>
- <string name="Full Front">
- Sin cortar
- </string>
- <string name="Full Hair Sides">
- Pelo: volumen a los lados
- </string>
- <string name="Full Sides">
- Volumen total
- </string>
- <string name="Glossy">
- Con brillo
- </string>
- <string name="Glove Fingers">
- Guantes: dedos
- </string>
- <string name="Glove Length">
- Guantes: largo
- </string>
- <string name="Hair">
- Pelo
- </string>
- <string name="Hair Back">
- Pelo: nuca
- </string>
- <string name="Hair Front">
- Pelo: delante
- </string>
- <string name="Hair Sides">
- Pelo: lados
- </string>
- <string name="Hair Sweep">
- Peinado: dirección
- </string>
- <string name="Hair Thickess">
- Pelo: espesor
- </string>
- <string name="Hair Thickness">
- Pelo: espesor
- </string>
- <string name="Hair Tilt">
- Pelo: inclinación
- </string>
- <string name="Hair Tilted Left">
- A la izq.
- </string>
- <string name="Hair Tilted Right">
- A la der.
- </string>
- <string name="Hair Volume">
- Pelo: volumen
- </string>
- <string name="Hand Size">
- Manos: tamaño
- </string>
- <string name="Handlebars">
- Muy largo
- </string>
- <string name="Head Length">
- Cabeza: longitud
- </string>
- <string name="Head Shape">
- Cabeza: forma
- </string>
- <string name="Head Size">
- Cabeza: tamaño
- </string>
- <string name="Head Stretch">
- Cabeza: estiramiento
- </string>
- <string name="Heel Height">
- Tacón: altura
- </string>
- <string name="Heel Shape">
- Tacón: forma
- </string>
- <string name="Height">
- Altura
- </string>
- <string name="High">
- Subir
- </string>
- <string name="High Heels">
- Tacones altos
- </string>
- <string name="High Jaw">
- Mandíbula alta
- </string>
- <string name="High Platforms">
- Suela gorda
- </string>
- <string name="High and Tight">
- Pegada
- </string>
- <string name="Higher">
- Arrriba
- </string>
- <string name="Hip Length">
- Cadera: altura
- </string>
- <string name="Hip Width">
- Cadera: ancho
- </string>
- <string name="In">
- Pegadas
- </string>
- <string name="In Shdw Color">
- Línea de ojos: color
- </string>
- <string name="In Shdw Opacity">
- Línea de ojos: opacidad
- </string>
- <string name="Inner Eye Corner">
- Ojos: lagrimal
- </string>
- <string name="Inner Eye Shadow">
- Inner Eye Shadow
- </string>
- <string name="Inner Shadow">
- Línea de ojos
- </string>
- <string name="Jacket Length">
- Chaqueta: largo
- </string>
- <string name="Jacket Wrinkles">
- Chaqueta: arrugas
- </string>
- <string name="Jaw Angle">
- Mandíbula: ángulo
- </string>
- <string name="Jaw Jut">
- Maxilar inferior
- </string>
- <string name="Jaw Shape">
- Mandíbula: forma
- </string>
- <string name="Join">
- Más junto
- </string>
- <string name="Jowls">
- Mofletes
- </string>
- <string name="Knee Angle">
- Rodillas: ángulo
- </string>
- <string name="Knock Kneed">
- Zambas
- </string>
- <string name="Large">
- Aumentar
- </string>
- <string name="Large Hands">
- Manos grandes
- </string>
- <string name="Left Part">
- Raya: izq.
- </string>
- <string name="Leg Length">
- Piernas: longitud
- </string>
- <string name="Leg Muscles">
- Piernas: musculatura
- </string>
- <string name="Less">
- Menos
- </string>
- <string name="Less Body Fat">
- Menos gordura
- </string>
- <string name="Less Curtains">
- Menos tupida
- </string>
- <string name="Less Freckles">
- Menos pecas
- </string>
- <string name="Less Full">
- Menos grosor
- </string>
- <string name="Less Gravity">
- Más levantado
- </string>
- <string name="Less Love">
- Menos michelines
- </string>
- <string name="Less Muscles">
- Pocos músculos
- </string>
- <string name="Less Muscular">
- Poca musculatura
- </string>
- <string name="Less Rosy">
- Menos sonrosada
- </string>
- <string name="Less Round">
- Menos redondeada
- </string>
- <string name="Less Saddle">
- Menos cartucheras
- </string>
- <string name="Less Square">
- Menos cuadrada
- </string>
- <string name="Less Volume">
- Menos volumen
- </string>
- <string name="Less soul">
- Pequeña
- </string>
- <string name="Lighter">
- Más luminosos
- </string>
- <string name="Lip Cleft">
- Labio: hoyuelo
- </string>
- <string name="Lip Cleft Depth">
- Hoyuelo marcado
- </string>
- <string name="Lip Fullness">
- Labios: grosor
- </string>
- <string name="Lip Pinkness">
- Labios sonrosados
- </string>
- <string name="Lip Ratio">
- Labios: ratio
- </string>
- <string name="Lip Thickness">
- Labios: prominencia
- </string>
- <string name="Lip Width">
- Labios: ancho
- </string>
- <string name="Lipgloss">
- Brillo de labios
- </string>
- <string name="Lipstick">
- Barra de labios
- </string>
- <string name="Lipstick Color">
- Barra de labios: color
- </string>
- <string name="Long">
- Más
- </string>
- <string name="Long Head">
- Cabeza alargada
- </string>
- <string name="Long Hips">
- Cadera larga
- </string>
- <string name="Long Legs">
- Piernas largas
- </string>
- <string name="Long Neck">
- Cuello largo
- </string>
- <string name="Long Pigtails">
- Coletas largas
- </string>
- <string name="Long Ponytail">
- Cola de caballo larga
- </string>
- <string name="Long Torso">
- Torso largo
- </string>
- <string name="Long arms">
- Brazos largos
- </string>
- <string name="Loose Pants">
- Pantalón suelto
- </string>
- <string name="Loose Shirt">
- Camiseta suelta
- </string>
- <string name="Loose Sleeves">
- Puños anchos
- </string>
- <string name="Love Handles">
- Michelines
- </string>
- <string name="Low">
- Bajar
- </string>
- <string name="Low Heels">
- Tacones bajos
- </string>
- <string name="Low Jaw">
- Mandíbula baja
- </string>
- <string name="Low Platforms">
- Suela fina
- </string>
- <string name="Low and Loose">
- Suelta
- </string>
- <string name="Lower">
- Abajo
- </string>
- <string name="Lower Bridge">
- Puente: abajo
- </string>
- <string name="Lower Cheeks">
- Mejillas: abajo
- </string>
- <string name="Male">
- Varón
- </string>
- <string name="Middle Part">
- Raya: en medio
- </string>
- <string name="More">
- Más
- </string>
- <string name="More Blush">
- Más colorete
- </string>
- <string name="More Body Fat">
- Más gordura
- </string>
- <string name="More Curtains">
- Más tupida
- </string>
- <string name="More Eyeshadow">
- Más
- </string>
- <string name="More Freckles">
- Más pecas
- </string>
- <string name="More Full">
- Más grosor
- </string>
- <string name="More Gravity">
- Menos levantado
- </string>
- <string name="More Lipstick">
- Más barra de labios
- </string>
- <string name="More Love">
- Más michelines
- </string>
- <string name="More Lower Lip">
- Más el inferior
- </string>
- <string name="More Muscles">
- Más músculos
- </string>
- <string name="More Muscular">
- Más musculatura
- </string>
- <string name="More Rosy">
- Más sonrosada
- </string>
- <string name="More Round">
- Más redondeada
- </string>
- <string name="More Saddle">
- Más cartucheras
- </string>
- <string name="More Sloped">
- Más inclinada
- </string>
- <string name="More Square">
- Más cuadrada
- </string>
- <string name="More Upper Lip">
- Más el superior
- </string>
- <string name="More Vertical">
- Más recta
- </string>
- <string name="More Volume">
- Más volumen
- </string>
- <string name="More soul">
- Grande
- </string>
- <string name="Moustache">
- Bigote
- </string>
- <string name="Mouth Corner">
- Comisuras
- </string>
- <string name="Mouth Position">
- Boca: posición
- </string>
- <string name="Mowhawk">
- Rapado
- </string>
- <string name="Muscular">
- Muscular
- </string>
- <string name="Mutton Chops">
- Patillas largas
- </string>
- <string name="Nail Polish">
- Uñas pintadas
- </string>
- <string name="Nail Polish Color">
- Uñas pintadas: color
- </string>
- <string name="Narrow">
- Disminuir
- </string>
- <string name="Narrow Back">
- Rapada
- </string>
- <string name="Narrow Front">
- Entradas
- </string>
- <string name="Narrow Lips">
- Labios estrechos
- </string>
- <string name="Natural">
- Natural
- </string>
- <string name="Neck Length">
- Cuello: longitud
- </string>
- <string name="Neck Thickness">
- Cuello: grosor
- </string>
- <string name="No Blush">
- Sin colorete
- </string>
- <string name="No Eyeliner">
- Sin contorno
- </string>
- <string name="No Eyeshadow">
- Menos
- </string>
- <string name="No Lipgloss">
- Sin brillo
- </string>
- <string name="No Lipstick">
- Sin barra de labios
- </string>
- <string name="No Part">
- Sin raya
- </string>
- <string name="No Polish">
- Sin pintar
- </string>
- <string name="No Red">
- Nada
- </string>
- <string name="No Spikes">
- Sin crestas
- </string>
- <string name="No White">
- Sin blanco
- </string>
- <string name="No Wrinkles">
- Sin arrugas
- </string>
- <string name="Normal Lower">
- Normal Lower
- </string>
- <string name="Normal Upper">
- Normal Upper
- </string>
- <string name="Nose Left">
- Nariz a la izq.
- </string>
- <string name="Nose Right">
- Nariz a la der.
- </string>
- <string name="Nose Size">
- Nariz: tamaño
- </string>
- <string name="Nose Thickness">
- Nariz: grosor
- </string>
- <string name="Nose Tip Angle">
- Nariz: respingona
- </string>
- <string name="Nose Tip Shape">
- Nariz: punta
- </string>
- <string name="Nose Width">
- Nariz: ancho
- </string>
- <string name="Nostril Division">
- Ventana: altura
- </string>
- <string name="Nostril Width">
- Ventana: ancho
- </string>
- <string name="Opaque">
- Opaco
- </string>
- <string name="Open">
- Abrir
- </string>
- <string name="Open Back">
- Apertura trasera
- </string>
- <string name="Open Front">
- Apertura frontal
- </string>
- <string name="Open Left">
- Abierta
- </string>
- <string name="Open Right">
- Abierta
- </string>
- <string name="Orange">
- Anaranjado
- </string>
- <string name="Out">
- De soplillo
- </string>
- <string name="Out Shdw Color">
- Sombra de ojos: color
- </string>
- <string name="Out Shdw Opacity">
- Sombra de ojos: opacidad
- </string>
- <string name="Outer Eye Corner">
- Ojos: comisura
- </string>
- <string name="Outer Eye Shadow">
- Outer Eye Shadow
- </string>
- <string name="Outer Shadow">
- Sombra de ojos
- </string>
- <string name="Overbite">
- Retraído
- </string>
- <string name="Package">
- Pubis
- </string>
- <string name="Painted Nails">
- Pintadas
- </string>
- <string name="Pale">
- Pálida
- </string>
- <string name="Pants Crotch">
- Pantalón: cruz
- </string>
- <string name="Pants Fit">
- Ceñido
- </string>
- <string name="Pants Length">
- Pernera: largo
- </string>
- <string name="Pants Waist">
- Caja
- </string>
- <string name="Pants Wrinkles">
- Pantalón: arrugas
- </string>
- <string name="Part">
- Raya
- </string>
- <string name="Part Bangs">
- Flequillo partido
- </string>
- <string name="Pectorals">
- Pectorales
- </string>
- <string name="Pigment">
- Tono
- </string>
- <string name="Pigtails">
- Coletas
- </string>
- <string name="Pink">
- Rosa
- </string>
- <string name="Pinker">
- Más sonrosados
- </string>
- <string name="Platform Height">
- Suela: altura
- </string>
- <string name="Platform Width">
- Suela: ancho
- </string>
- <string name="Pointy">
- En punta
- </string>
- <string name="Pointy Heels">
- De aguja
- </string>
- <string name="Ponytail">
- Cola de caballo
- </string>
- <string name="Poofy Skirt">
- Con vuelo
- </string>
- <string name="Pop Left Eye">
- Izquierdo más grande
- </string>
- <string name="Pop Right Eye">
- Derecho más grande
- </string>
- <string name="Puffy">
- Hinchadas
- </string>
- <string name="Puffy Eyelids">
- Ojeras
- </string>
- <string name="Rainbow Color">
- Irisación
- </string>
- <string name="Red Hair">
- Pelirrojo
- </string>
- <string name="Regular">
- Regular
- </string>
- <string name="Right Part">
- Raya: der.
- </string>
- <string name="Rosy Complexion">
- Tez sonrosada
- </string>
- <string name="Round">
- Redondear
- </string>
- <string name="Ruddiness">
- Rubicundez
- </string>
- <string name="Ruddy">
- Rojiza
- </string>
- <string name="Rumpled Hair">
- Pelo encrespado
- </string>
- <string name="Saddle Bags">
- Cartucheras
- </string>
- <string name="Scrawny Leg">
- Piernas flacas
- </string>
- <string name="Separate">
- Más ancho
- </string>
- <string name="Shallow">
- Sin marcar
- </string>
- <string name="Shear Back">
- Nuca: corte
- </string>
- <string name="Shear Face">
- Shear Face
- </string>
- <string name="Shear Front">
- Shear Front
- </string>
- <string name="Shear Left Up">
- Arriba - izq.
- </string>
- <string name="Shear Right Up">
- Arriba - der.
- </string>
- <string name="Sheared Back">
- Rapada
- </string>
- <string name="Sheared Front">
- Rapada
- </string>
- <string name="Shift Left">
- A la izq.
- </string>
- <string name="Shift Mouth">
- Boca: ladeada
- </string>
- <string name="Shift Right">
- A la der.
- </string>
- <string name="Shirt Bottom">
- Alto de cintura
- </string>
- <string name="Shirt Fit">
- Ceñido
- </string>
- <string name="Shirt Wrinkles">
- Camisa: arrugas
- </string>
- <string name="Shoe Height">
- Caña: altura
- </string>
- <string name="Short">
- Menos
- </string>
- <string name="Short Arms">
- Brazos cortos
- </string>
- <string name="Short Legs">
- Piernas cortas
- </string>
- <string name="Short Neck">
- Cuello corto
- </string>
- <string name="Short Pigtails">
- Coletas cortas
- </string>
- <string name="Short Ponytail">
- Cola de caballo corta
- </string>
- <string name="Short Sideburns">
- Patillas cortas
- </string>
- <string name="Short Torso">
- Torso corto
- </string>
- <string name="Short hips">
- Cadera corta
- </string>
- <string name="Shoulders">
- Hombros
- </string>
- <string name="Side Fringe">
- Lados: franja
- </string>
- <string name="Sideburns">
- Patillas
- </string>
- <string name="Sides Hair">
- Pelo: lados
- </string>
- <string name="Sides Hair Down">
- Bajar lados del pelo
- </string>
- <string name="Sides Hair Up">
- Subir lados del pelo
- </string>
- <string name="Skinny Neck">
- Cuello estrecho
- </string>
- <string name="Skirt Fit">
- Falda: vuelo
- </string>
- <string name="Skirt Length">
- Falda: largo
- </string>
- <string name="Slanted Forehead">
- Slanted Forehead
- </string>
- <string name="Sleeve Length">
- Largo de manga
- </string>
- <string name="Sleeve Looseness">
- Ancho de puños
- </string>
- <string name="Slit Back">
- Raja trasera
- </string>
- <string name="Slit Front">
- Raja frontal
- </string>
- <string name="Slit Left">
- Raja a la izq.
- </string>
- <string name="Slit Right">
- Raja a la der.
- </string>
- <string name="Small">
- Disminuir
- </string>
- <string name="Small Hands">
- Manos pequeñas
- </string>
- <string name="Small Head">
- Cabeza pequeña
- </string>
- <string name="Smooth">
- Leves
- </string>
- <string name="Smooth Hair">
- Pelo liso
- </string>
- <string name="Socks Length">
- Calcetines: largo
- </string>
- <string name="Soulpatch">
- Perilla
- </string>
- <string name="Sparse">
- Depiladas
- </string>
- <string name="Spiked Hair">
- Crestas
- </string>
- <string name="Square">
- Cuadrada
- </string>
- <string name="Square Toe">
- Punta cuadrada
- </string>
- <string name="Squash Head">
- Cabeza aplastada
- </string>
- <string name="Stretch Head">
- Cabeza estirada
- </string>
- <string name="Sunken">
- Chupadas
- </string>
- <string name="Sunken Chest">
- Estrecho de pecho
- </string>
- <string name="Sunken Eyes">
- Ojos hundidos
- </string>
- <string name="Sweep Back">
- Sweep Back
- </string>
- <string name="Sweep Forward">
- Sweep Forward
- </string>
- <string name="Tall">
- Más
- </string>
- <string name="Taper Back">
- Cubierta trasera
- </string>
- <string name="Taper Front">
- Cubierta frontal
- </string>
- <string name="Thick Heels">
- Tacones grandes
- </string>
- <string name="Thick Neck">
- Cuello ancho
- </string>
- <string name="Thick Toe">
- Empeine alto
- </string>
- <string name="Thin">
- Delgadas
- </string>
- <string name="Thin Eyebrows">
- Cejas finas
- </string>
- <string name="Thin Lips">
- Hacia dentro
- </string>
- <string name="Thin Nose">
- Nariz fina
- </string>
- <string name="Tight Chin">
- Poca papada
- </string>
- <string name="Tight Cuffs">
- Sin campana
- </string>
- <string name="Tight Pants">
- Pantalón ceñido
- </string>
- <string name="Tight Shirt">
- Camisa ceñida
- </string>
- <string name="Tight Skirt">
- Falda ceñida
- </string>
- <string name="Tight Sleeves">
- Puños ceñidos
- </string>
- <string name="Toe Shape">
- Punta: forma
- </string>
- <string name="Toe Thickness">
- Empeine
- </string>
- <string name="Torso Length">
- Torso: longitud
- </string>
- <string name="Torso Muscles">
- Torso: musculatura
- </string>
- <string name="Torso Scrawny">
- Torso flacucho
- </string>
- <string name="Unattached">
- Largos
- </string>
- <string name="Uncreased">
- Abiertos
- </string>
- <string name="Underbite">
- Prognatismo
- </string>
- <string name="Unnatural">
- No natural
- </string>
- <string name="Upper Bridge">
- Puente: arriba
- </string>
- <string name="Upper Cheeks">
- Mejillas: arriba
- </string>
- <string name="Upper Chin Cleft">
- Barbilla: prominencia
- </string>
- <string name="Upper Eyelid Fold">
- Párpados
- </string>
- <string name="Upturned">
- Mucho
- </string>
- <string name="Very Red">
- Del todo
- </string>
- <string name="Waist Height">
- Cintura
- </string>
- <string name="Well-Fed">
- Mofletes
- </string>
- <string name="White Hair">
- Pelo blanco
- </string>
- <string name="Wide">
- Aumentar
- </string>
- <string name="Wide Back">
- Completa
- </string>
- <string name="Wide Front">
- Completa
- </string>
- <string name="Wide Lips">
- Labios anchos
- </string>
- <string name="Wild">
- Total
- </string>
- <string name="Wrinkles">
- Arrugas
- </string>
- <string name="LocationCtrlAddLandmarkTooltip">
- Añadir a mis hitos
- </string>
- <string name="LocationCtrlEditLandmarkTooltip">
- Editar mis hitos
- </string>
- <string name="LocationCtrlInfoBtnTooltip">
- Ver más información de esta localización
- </string>
- <string name="LocationCtrlComboBtnTooltip">
- Historial de mis localizaciones
- </string>
- <string name="LocationCtrlForSaleTooltip">
- Comprar este terreno
- </string>
- <string name="LocationCtrlAdultIconTooltip">
- Región Adulta
- </string>
- <string name="LocationCtrlModerateIconTooltip">
- Región Moderada
- </string>
- <string name="LocationCtrlGeneralIconTooltip">
- Región General
- </string>
- <string name="LocationCtrlSeeAVsTooltip">
- Los avatares están visibles y está permitido el chat fuera de esta parcela
- </string>
- <string name="UpdaterWindowTitle">
- Actualizar [APP_NAME]
- </string>
- <string name="UpdaterNowUpdating">
- Actualizando [APP_NAME]...
- </string>
- <string name="UpdaterNowInstalling">
- Instalando [APP_NAME]...
- </string>
- <string name="UpdaterUpdatingDescriptive">
- Tu visor [APP_NAME] se está actualizando a la última versión. Llevará algún tiempo, paciencia.
- </string>
- <string name="UpdaterProgressBarTextWithEllipses">
- Descargando la actualización...
- </string>
- <string name="UpdaterProgressBarText">
- Descargando la actualización
- </string>
- <string name="UpdaterFailDownloadTitle">
- Fallo en la descarga de la actualización
- </string>
- <string name="UpdaterFailUpdateDescriptive">
- Ha habido un error actualizando [APP_NAME]. Por favor, descarga la última versión desde www.secondlife.com.
- </string>
- <string name="UpdaterFailInstallTitle">
- Fallo al instalar la actualización
- </string>
- <string name="UpdaterFailStartTitle">
- Fallo al iniciar el visor
- </string>
- <string name="ItemsComingInTooFastFrom">
- [APP_NAME]: Los ítems se reciben muy rápido de [FROM_NAME]; desactivada la vista previa automática durante [TIME] sgs.
- </string>
- <string name="ItemsComingInTooFast">
- [APP_NAME]: Los ítems se reciben muy rápido; desactivada la vista previa automática durante [TIME] sgs.
- </string>
- <string name="IM_logging_string">
- -- Activado el registro de los mensajes instantáneos --
- </string>
- <string name="IM_typing_start_string">
- [NAME] está escribiendo...
- </string>
- <string name="Unnamed">
- (sin nombre)
- </string>
- <string name="IM_moderated_chat_label">
- (Moderado: por defecto, desactivada la voz)
- </string>
- <string name="IM_unavailable_text_label">
- Para esta llamada no está disponible el chat de texto.
- </string>
- <string name="IM_muted_text_label">
- Un moderador del grupo ha desactivado tu chat de texto.
- </string>
- <string name="IM_default_text_label">
- Pulsa aquí para enviar un mensaje instantáneo.
- </string>
- <string name="IM_to_label">
- A
- </string>
- <string name="IM_moderator_label">
- (Moderador)
- </string>
- <string name="Saved_message">
- (Guardado [LONG_TIMESTAMP])
- </string>
- <string name="answered_call">
- Han respondido a tu llamada
- </string>
- <string name="you_started_call">
- Has iniciado una llamada de voz
- </string>
- <string name="you_joined_call">
- Has entrado en la llamada de voz
- </string>
- <string name="name_started_call">
- [NAME] inició una llamada de voz
- </string>
- <string name="ringing-im">
- Haciendo la llamada de voz...
- </string>
- <string name="connected-im">
- Conectado, pulsa Colgar para salir
- </string>
- <string name="hang_up-im">
- Se colgó la llamada de voz
- </string>
- <string name="conference-title-incoming">
- Conferencia con [AGENT_NAME]
- </string>
- <string name="inventory_item_offered-im">
- Ofrecido el item del inventario
- </string>
- <string name="share_alert">
- Arrastra los ítems desde el invenbtario hasta aquí
- </string>
- <string name="no_session_message">
- (La sesión de MI no existe)
- </string>
- <string name="only_user_message">
- Usted es el único usuario en esta sesión.
- </string>
- <string name="offline_message">
- [NAME] está desconectado.
- </string>
- <string name="invite_message">
- Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz.
- </string>
- <string name="muted_message">
- Has ignorado a este residente. Enviándole un mensaje, automáticamente dejarás de ignorarle.
- </string>
- <string name="generic">
- Error en lo solicitado, por favor, inténtalo más tarde.
- </string>
- <string name="generic_request_error">
- Error al hacer lo solicitado; por favor, inténtelo más tarde.
- </string>
- <string name="insufficient_perms_error">
- Usted no tiene permisos suficientes.
- </string>
- <string name="session_does_not_exist_error">
- La sesión ya acabó
- </string>
- <string name="no_ability_error">
- Usted no tiene esa capacidad.
- </string>
- <string name="no_ability">
- Usted no tiene esa capacidad.
- </string>
- <string name="not_a_mod_error">
- Usted no es un moderador de la sesión.
- </string>
- <string name="muted">
- Un moderador del grupo ha desactivado tu chat de texto.
- </string>
- <string name="muted_error">
- Un moderador del grupo le ha desactivado el chat de texto.
- </string>
- <string name="add_session_event">
- No se ha podido añadir usuarios a la sesión de chat con [RECIPIENT].
- </string>
- <string name="message">
- No se ha podido enviar tu mensaje a la sesión de chat con [RECIPIENT].
- </string>
- <string name="message_session_event">
- No se ha podido enviar su mensaje a la sesión de chat con [RECIPIENT].
- </string>
- <string name="mute">
- Error moderando.
- </string>
- <string name="removed">
- Se te ha sacado del grupo.
- </string>
- <string name="removed_from_group">
- Ha sido eliminado del grupo.
- </string>
- <string name="close_on_no_ability">
- Usted ya no tendrá más la capacidad de estar en la sesión de chat.
- </string>
- <string name="unread_chat_single">
- [SOURCES] ha dicho algo nuevo
- </string>
- <string name="unread_chat_multiple">
- [SOURCES] ha dicho algo nuevo
- </string>
- <string name="session_initialization_timed_out_error">
- Se ha agotado el tiempo del inicio de sesión
- </string>
- <string name="Home position set.">
- Posición inicial establecida.
- </string>
- <string name="voice_morphing_url">
- http://secondlife.com/landing/voicemorphing
- </string>
- <string name="paid_you_ldollars">
- [NAME] te ha pagado [AMOUNT] L$ [REASON].
- </string>
- <string name="paid_you_ldollars_no_reason">
- [NAME] te ha pagado [AMOUNT] L$.
- </string>
- <string name="you_paid_ldollars">
- Has pagado [AMOUNT] L$ a [NAME] por [REASON].
- </string>
- <string name="you_paid_ldollars_no_info">
- Has pagado[AMOUNT] L$
- </string>
- <string name="you_paid_ldollars_no_reason">
- Has pagado [AMOUNT] L$ a [NAME].
- </string>
- <string name="you_paid_ldollars_no_name">
- Has pagado [AMOUNT] L$ por [REASON].
- </string>
- <string name="you_paid_failure_ldollars">
- No has pagado a [NAME] [AMOUNT] L$ [REASON].
- </string>
- <string name="you_paid_failure_ldollars_no_info">
- No has pagado [AMOUNT] L$.
- </string>
- <string name="you_paid_failure_ldollars_no_reason">
- No has pagado a [NAME] [AMOUNT] L$.
- </string>
- <string name="you_paid_failure_ldollars_no_name">
- No has pagado [AMOUNT] L$ [REASON].
- </string>
- <string name="for item">
- para [ITEM]
- </string>
- <string name="for a parcel of land">
- para una parcela de terreno
- </string>
- <string name="for a land access pass">
- para un pase de acceso a terrenos
- </string>
- <string name="for deeding land">
- for deeding land
- </string>
- <string name="to create a group">
- para crear un grupo
- </string>
- <string name="to join a group">
- para entrar a un grupo
- </string>
- <string name="to upload">
- to upload
- </string>
- <string name="to publish a classified ad">
- para publicar un anuncio clasificado
- </string>
- <string name="giving">
- Dando [AMOUNT] L$
- </string>
- <string name="uploading_costs">
- Subir esto cuesta [AMOUNT] L$
- </string>
- <string name="this_costs">
- Esto cuesta [AMOUNT] L$
- </string>
- <string name="buying_selected_land">
- Compra del terreno seleccionado por [AMOUNT] L$
- </string>
- <string name="this_object_costs">
- Este objeto cuesta [AMOUNT] L$
- </string>
- <string name="group_role_everyone">
- Todos
- </string>
- <string name="group_role_officers">
- Oficiales
- </string>
- <string name="group_role_owners">
- Propietarios
- </string>
- <string name="group_member_status_online">
- Conectado/a
- </string>
- <string name="uploading_abuse_report">
- Subiendo...
-
-Denuncia de infracción
- </string>
- <string name="New Shape">
- Anatomía nueva
- </string>
- <string name="New Skin">
- Piel nueva
- </string>
- <string name="New Hair">
- Pelo nuevo
- </string>
- <string name="New Eyes">
- Ojos nuevos
- </string>
- <string name="New Shirt">
- Camisa nueva
- </string>
- <string name="New Pants">
- Pantalón nuevo
- </string>
- <string name="New Shoes">
- Zapatos nuevos
- </string>
- <string name="New Socks">
- Calcetines nuevos
- </string>
- <string name="New Jacket">
- Chaqueta nueva
- </string>
- <string name="New Gloves">
- Guantes nuevos
- </string>
- <string name="New Undershirt">
- Camiseta nueva
- </string>
- <string name="New Underpants">
- Ropa interior nueva
- </string>
- <string name="New Skirt">
- Falda nueva
- </string>
- <string name="New Alpha">
- Nueva Alfa
- </string>
- <string name="New Tattoo">
- Tatuaje nuevo
- </string>
- <string name="New Physics">
- Nueva física
- </string>
- <string name="Invalid Wearable">
- No se puede poner
- </string>
- <string name="New Gesture">
- Gesto nuevo
- </string>
- <string name="New Script">
- Script nuevo
- </string>
- <string name="New Note">
- Nota nueva
- </string>
- <string name="New Folder">
- Carpeta nueva
- </string>
- <string name="Contents">
- Contenidos
- </string>
- <string name="Gesture">
- Gestos
- </string>
- <string name="Male Gestures">
- Gestos de hombre
- </string>
- <string name="Female Gestures">
- Gestos de mujer
- </string>
- <string name="Other Gestures">
- Otros gestos
- </string>
- <string name="Speech Gestures">
- Gestos al hablar
- </string>
- <string name="Common Gestures">
- Gestos corrientes
- </string>
- <string name="Male - Excuse me">
- Varón - Disculpa
- </string>
- <string name="Male - Get lost">
- Varón – Déjame en paz
- </string>
- <string name="Male - Blow kiss">
- Varón - Lanzar un beso
- </string>
- <string name="Male - Boo">
- Varón - Abucheo
- </string>
- <string name="Male - Bored">
- Varón - Aburrido
- </string>
- <string name="Male - Hey">
- Varón – ¡Eh!
- </string>
- <string name="Male - Laugh">
- Varón - Risa
- </string>
- <string name="Male - Repulsed">
- Varón - Rechazo
- </string>
- <string name="Male - Shrug">
- Varón - Encogimiento de hombros
- </string>
- <string name="Male - Stick tougue out">
- Varón - Sacando la lengua
- </string>
- <string name="Male - Wow">
- Varón - Admiración
- </string>
- <string name="Female - Chuckle">
- Mujer - Risa suave
- </string>
- <string name="Female - Cry">
- Mujer - Llorar
- </string>
- <string name="Female - Embarrassed">
- Mujer - Ruborizada
- </string>
- <string name="Female - Excuse me">
- Mujer - Disculpa
- </string>
- <string name="Female - Get lost">
- Mujer – Déjame en paz
- </string>
- <string name="Female - Blow kiss">
- Mujer - Lanzar un beso
- </string>
- <string name="Female - Boo">
- Mujer - Abucheo
- </string>
- <string name="Female - Bored">
- Mujer - Aburrida
- </string>
- <string name="Female - Hey">
- Mujer - ¡Eh!
- </string>
- <string name="Female - Hey baby">
- Mujer - ¡Eh, encanto!
- </string>
- <string name="Female - Laugh">
- Mujer - Risa
- </string>
- <string name="Female - Looking good">
- Mujer - Buen aspecto
- </string>
- <string name="Female - Over here">
- Mujer - Por aquí
- </string>
- <string name="Female - Please">
- Mujer - Por favor
- </string>
- <string name="Female - Repulsed">
- Mujer - Rechazo
- </string>
- <string name="Female - Shrug">
- Mujer - Encogimiento de hombros
- </string>
- <string name="Female - Stick tougue out">
- Mujer - Sacando la lengua
- </string>
- <string name="Female - Wow">
- Mujer - Admiración
- </string>
- <string name="/bow">
- /reverencia
- </string>
- <string name="/clap">
- /aplaudir
- </string>
- <string name="/count">
- /contar
- </string>
- <string name="/extinguish">
- /apagar
- </string>
- <string name="/kmb">
- /bmc
- </string>
- <string name="/muscle">
- /músculo
- </string>
- <string name="/no">
- /no
- </string>
- <string name="/no!">
- /¡no!
- </string>
- <string name="/paper">
- /papel
- </string>
- <string name="/pointme">
- /señalarme
- </string>
- <string name="/pointyou">
- /señalarte
- </string>
- <string name="/rock">
- /piedra
- </string>
- <string name="/scissor">
- /tijera
- </string>
- <string name="/smoke">
- /fumar
- </string>
- <string name="/stretch">
- /estirar
- </string>
- <string name="/whistle">
- /silbar
- </string>
- <string name="/yes">
- /sí
- </string>
- <string name="/yes!">
- /¡sí!
- </string>
- <string name="afk">
- ausente
- </string>
- <string name="dance1">
- baile1
- </string>
- <string name="dance2">
- baile2
- </string>
- <string name="dance3">
- baile3
- </string>
- <string name="dance4">
- baile4
- </string>
- <string name="dance5">
- baile5
- </string>
- <string name="dance6">
- baile6
- </string>
- <string name="dance7">
- baile7
- </string>
- <string name="dance8">
- baile8
- </string>
- <string name="AvatarBirthDateFormat">
- [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
- </string>
- <string name="DefaultMimeType">
- ninguno/ninguno
- </string>
- <string name="texture_load_dimensions_error">
- No se puede subir imágenes mayores de [WIDTH]*[HEIGHT]
- </string>
- <string name="words_separator" value=","/>
- <string name="server_is_down">
- Parece que hay algún problema que ha escapado a nuestros controles.
-
- Visita status.secondlifegrid.net para ver si hay alguna incidencia conocida que esté afectando al servicio.
- Si sigues teniendo problemas, comprueba la configuración de la red y del servidor de seguridad.
- </string>
- <string name="dateTimeWeekdaysNames">
- Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado
- </string>
- <string name="dateTimeWeekdaysShortNames">
- Dom:Lun:Mar:Mié:Jue:Vie:Sáb
- </string>
- <string name="dateTimeMonthNames">
- Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre
- </string>
- <string name="dateTimeMonthShortNames">
- Ene:Feb:Mar:Abr:May:Jun:Jul:Ago:Sep:Oct:Nov:Dic
- </string>
- <string name="dateTimeDayFormat">
- [MDAY]
- </string>
- <string name="dateTimeAM">
- AM
- </string>
- <string name="dateTimePM">
- PM
- </string>
- <string name="LocalEstimateUSD">
- [AMOUNT] US$
- </string>
- <string name="Membership">
- Membresía
- </string>
- <string name="Roles">
- Roles
- </string>
- <string name="Group Identity">
- Indentidad de grupo
- </string>
- <string name="Parcel Management">
- Gestión de la parcela
- </string>
- <string name="Parcel Identity">
- Identidad de la parcela
- </string>
- <string name="Parcel Settings">
- Configuración de la parcela
- </string>
- <string name="Parcel Powers">
- Poder de la parcela
- </string>
- <string name="Parcel Access">
- Acceso a la parcela
- </string>
- <string name="Parcel Content">
- Contenido de la parcela
- </string>
- <string name="Object Management">
- Manejo de objetos
- </string>
- <string name="Accounting">
- Contabilidad
- </string>
- <string name="Notices">
- Avisos
- </string>
- <string name="Chat" value="Chat :">
- Chat
- </string>
- <string name="DeleteItems">
- ¿Deseas eliminar los elementos seleccionados?
- </string>
- <string name="DeleteItem">
- ¿Deseas eliminar el elemento seleccionado?
- </string>
- <string name="EmptyOutfitText">
- No hay elementos en este vestuario
- </string>
- <string name="ExternalEditorNotSet">
- Selecciona un editor mediante la configuración de ExternalEditor.
- </string>
- <string name="ExternalEditorNotFound">
- No se encuentra el editor externo especificado.
-Inténtalo incluyendo la ruta de acceso al editor entre comillas
-(por ejemplo, &quot;/ruta a mi/editor&quot; &quot;%s&quot;).
- </string>
- <string name="ExternalEditorCommandParseError">
- Error al analizar el comando de editor externo.
- </string>
- <string name="ExternalEditorFailedToRun">
- Error al ejecutar el editor externo.
- </string>
- <string name="TranslationFailed">
- Error al traducir: [REASON]
- </string>
- <string name="TranslationResponseParseError">
- Error al analizar la respuesta de la traducción.
- </string>
- <string name="Esc">
- Esc
- </string>
- <string name="Space">
- Space
- </string>
- <string name="Enter">
- Enter
- </string>
- <string name="Tab">
- Tab
- </string>
- <string name="Ins">
- Ins
- </string>
- <string name="Del">
- Del
- </string>
- <string name="Backsp">
- Backsp
- </string>
- <string name="Shift">
- Shift
- </string>
- <string name="Ctrl">
- Ctrl
- </string>
- <string name="Alt">
- Alt
- </string>
- <string name="CapsLock">
- CapsLock
- </string>
- <string name="Home">
- Base
- </string>
- <string name="End">
- End
- </string>
- <string name="PgUp">
- PgUp
- </string>
- <string name="PgDn">
- PgDn
- </string>
- <string name="F1">
- F1
- </string>
- <string name="F2">
- F2
- </string>
- <string name="F3">
- F3
- </string>
- <string name="F4">
- F4
- </string>
- <string name="F5">
- F5
- </string>
- <string name="F6">
- F6
- </string>
- <string name="F7">
- F7
- </string>
- <string name="F8">
- F8
- </string>
- <string name="F9">
- F9
- </string>
- <string name="F10">
- F10
- </string>
- <string name="F11">
- F11
- </string>
- <string name="F12">
- F12
- </string>
- <string name="Add">
- Añadir
- </string>
- <string name="Subtract">
- Restar
- </string>
- <string name="Multiply">
- Multiplicar
- </string>
- <string name="Divide">
- Dividir
- </string>
- <string name="PAD_DIVIDE">
- PAD_DIVIDE
- </string>
- <string name="PAD_LEFT">
- PAD_LEFT
- </string>
- <string name="PAD_RIGHT">
- PAD_RIGHT
- </string>
- <string name="PAD_DOWN">
- PAD_DOWN
- </string>
- <string name="PAD_UP">
- PAD_UP
- </string>
- <string name="PAD_HOME">
- PAD_HOME
- </string>
- <string name="PAD_END">
- PAD_END
- </string>
- <string name="PAD_PGUP">
- PAD_PGUP
- </string>
- <string name="PAD_PGDN">
- PAD_PGDN
- </string>
- <string name="PAD_CENTER">
- PAD_CENTER
- </string>
- <string name="PAD_INS">
- PAD_INS
- </string>
- <string name="PAD_DEL">
- PAD_DEL
- </string>
- <string name="PAD_Enter">
- PAD_Enter
- </string>
- <string name="PAD_BUTTON0">
- PAD_BUTTON0
- </string>
- <string name="PAD_BUTTON1">
- PAD_BUTTON1
- </string>
- <string name="PAD_BUTTON2">
- PAD_BUTTON2
- </string>
- <string name="PAD_BUTTON3">
- PAD_BUTTON3
- </string>
- <string name="PAD_BUTTON4">
- PAD_BUTTON4
- </string>
- <string name="PAD_BUTTON5">
- PAD_BUTTON5
- </string>
- <string name="PAD_BUTTON6">
- PAD_BUTTON6
- </string>
- <string name="PAD_BUTTON7">
- PAD_BUTTON7
- </string>
- <string name="PAD_BUTTON8">
- PAD_BUTTON8
- </string>
- <string name="PAD_BUTTON9">
- PAD_BUTTON9
- </string>
- <string name="PAD_BUTTON10">
- PAD_BUTTON10
- </string>
- <string name="PAD_BUTTON11">
- PAD_BUTTON11
- </string>
- <string name="PAD_BUTTON12">
- PAD_BUTTON12
- </string>
- <string name="PAD_BUTTON13">
- PAD_BUTTON13
- </string>
- <string name="PAD_BUTTON14">
- PAD_BUTTON14
- </string>
- <string name="PAD_BUTTON15">
- PAD_BUTTON15
- </string>
- <string name="-">
- -
- </string>
- <string name="=">
- =
- </string>
- <string name="`">
- `
- </string>
- <string name=";">
- ;
- </string>
- <string name="[">
- [
- </string>
- <string name="]">
- ]
- </string>
- <string name="\">
- \
- </string>
- <string name="0">
- 0
- </string>
- <string name="1">
- 1
- </string>
- <string name="2">
- 2
- </string>
- <string name="3">
- 3
- </string>
- <string name="4">
- 4
- </string>
- <string name="5">
- 5
- </string>
- <string name="6">
- 6
- </string>
- <string name="7">
- 7
- </string>
- <string name="8">
- 8
- </string>
- <string name="9">
- 9
- </string>
- <string name="A">
- A
- </string>
- <string name="B">
- B
- </string>
- <string name="C">
- C
- </string>
- <string name="D">
- D
- </string>
- <string name="E">
- E
- </string>
- <string name="F">
- F
- </string>
- <string name="G">
- G
- </string>
- <string name="H">
- H
- </string>
- <string name="I">
- I
- </string>
- <string name="J">
- J
- </string>
- <string name="K">
- K
- </string>
- <string name="L">
- L
- </string>
- <string name="M">
- M
- </string>
- <string name="N">
- N
- </string>
- <string name="O">
- O
- </string>
- <string name="P">
- P
- </string>
- <string name="Q">
- Q
- </string>
- <string name="R">
- R
- </string>
- <string name="S">
- S
- </string>
- <string name="T">
- T
- </string>
- <string name="U">
- U
- </string>
- <string name="V">
- V
- </string>
- <string name="W">
- W
- </string>
- <string name="X">
- X
- </string>
- <string name="Y">
- Y
- </string>
- <string name="Z">
- Z
- </string>
- <string name="BeaconParticle">
- Viendo balizas de partículas (azules)
- </string>
- <string name="BeaconPhysical">
- Viendo balizas de objetos materiales (verdes)
- </string>
- <string name="BeaconScripted">
- Viendo balizas de objetos con script (rojas)
- </string>
- <string name="BeaconScriptedTouch">
- Viendo el objeto con script con balizas de función táctil (rojas)
- </string>
- <string name="BeaconSound">
- Viendo balizas de sonido (amarillas)
- </string>
- <string name="BeaconMedia">
- Viendo balizas de medios (blancas)
- </string>
- <string name="ParticleHiding">
- Ocultando las partículas
- </string>
- <string name="Command_AboutLand_Label">
- Acerca del terreno
- </string>
- <string name="Command_Appearance_Label">
- Apariencia
- </string>
- <string name="Command_Avatar_Label">
- Avatar
- </string>
- <string name="Command_Build_Label">
- Construir
- </string>
- <string name="Command_Chat_Label">
- Chat
- </string>
- <string name="Command_Compass_Label">
- Brújula
- </string>
- <string name="Command_Destinations_Label">
- Destinos
- </string>
- <string name="Command_Gestures_Label">
- Gestos
- </string>
- <string name="Command_HowTo_Label">
- Cómo
- </string>
- <string name="Command_Inventory_Label">
- Inventario
- </string>
- <string name="Command_Map_Label">
- Mapa
- </string>
- <string name="Command_Marketplace_Label">
- Mercado
- </string>
- <string name="Command_MiniMap_Label">
- Minimapa
- </string>
- <string name="Command_Move_Label">
- Caminar / Correr / Volar
- </string>
- <string name="Command_Outbox_Label">
- Buzón de salida de comerciante
- </string>
- <string name="Command_People_Label">
- Gente
- </string>
- <string name="Command_Picks_Label">
- Destacados
- </string>
- <string name="Command_Places_Label">
- Lugares
- </string>
- <string name="Command_Preferences_Label">
- Preferencias
- </string>
- <string name="Command_Profile_Label">
- Perfil
- </string>
- <string name="Command_Search_Label">
- Buscar
- </string>
- <string name="Command_Snapshot_Label">
- Foto
- </string>
- <string name="Command_Speak_Label">
- Hablar
- </string>
- <string name="Command_View_Label">
- Controles de la cámara
- </string>
- <string name="Command_Voice_Label">
- Configuración de voz
- </string>
- <string name="Command_AboutLand_Tooltip">
- Información sobre el terreno que vas a visitar
- </string>
- <string name="Command_Appearance_Tooltip">
- Cambiar tu avatar
- </string>
- <string name="Command_Avatar_Tooltip">
- Elegir un avatar completo
- </string>
- <string name="Command_Build_Tooltip">
- Construir objetos y modificar la forma del terreno
- </string>
- <string name="Command_Chat_Tooltip">
- Habla por chat de texto con las personas próximas
- </string>
- <string name="Command_Compass_Tooltip">
- Brújula
- </string>
- <string name="Command_Destinations_Tooltip">
- Destinos de interés
- </string>
- <string name="Command_Gestures_Tooltip">
- Gestos para tu avatar
- </string>
- <string name="Command_HowTo_Tooltip">
- Cómo hacer las tareas habituales
- </string>
- <string name="Command_Inventory_Tooltip">
- Ver y usar tus pertenencias
- </string>
- <string name="Command_Map_Tooltip">
- Mapa del mundo
- </string>
- <string name="Command_Marketplace_Tooltip">
- Ir de compras
- </string>
- <string name="Command_MiniMap_Tooltip">
- Mostrar la gente que está cerca
- </string>
- <string name="Command_Move_Tooltip">
- Desplazando el avatar
- </string>
- <string name="Command_Outbox_Tooltip">
- Transfiere objetos a tu mercado para venderlos
- </string>
- <string name="Command_People_Tooltip">
- Amigos, grupos y personas próximas
- </string>
- <string name="Command_Picks_Tooltip">
- Lugares que se mostrarán como favoritos en tu perfil
- </string>
- <string name="Command_Places_Tooltip">
- Lugares que has guardado
- </string>
- <string name="Command_Preferences_Tooltip">
- Preferencias
- </string>
- <string name="Command_Profile_Tooltip">
- Consulta o edita tu perfil
- </string>
- <string name="Command_Search_Tooltip">
- Buscar lugares, eventos y personas
- </string>
- <string name="Command_Snapshot_Tooltip">
- Tomar una fotografía
- </string>
- <string name="Command_Speak_Tooltip">
- Utiliza el micrófono para hablar con las personas próximas
- </string>
- <string name="Command_View_Tooltip">
- Cambiando el ángulo de la cámara
- </string>
- <string name="Command_Voice_Tooltip">
- Controles de volumen para las llamadas y la gente que se encuentre cerca de ti en el mundo virtual
- </string>
- <string name="Toolbar_Bottom_Tooltip">
- actualmente en tu barra de herramientas inferior
- </string>
- <string name="Toolbar_Left_Tooltip">
- actualmente en tu barra de herramientas izquierda
- </string>
- <string name="Toolbar_Right_Tooltip">
- actualmente en tu barra de herramientas derecha
- </string>
- <string name="Retain%">
- % retención
- </string>
- <string name="Detail">
- Detalle
- </string>
- <string name="Better Detail">
- Mejor detalle
- </string>
- <string name="Surface">
- Superficie
- </string>
- <string name="Solid">
- Sólido
- </string>
- <string name="Wrap">
- Envoltura
- </string>
- <string name="Preview">
- Vista previa
- </string>
- <string name="Normal">
- Normal
- </string>
- <string name="snapshot_quality_very_low">
- Muy bajo
- </string>
- <string name="snapshot_quality_low">
- Bajo
- </string>
- <string name="snapshot_quality_medium">
- Medio
- </string>
- <string name="snapshot_quality_high">
- Alto
- </string>
- <string name="snapshot_quality_very_high">
- Muy alto
- </string>
-</strings>
diff --git a/indra/newview/skins/steam/xui/fr/strings.xml b/indra/newview/skins/steam/xui/fr/strings.xml
deleted file mode 100644
index ac34dd67c8..0000000000
--- a/indra/newview/skins/steam/xui/fr/strings.xml
+++ /dev/null
@@ -1,5018 +0,0 @@
-<?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
- 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 de [APP_NAME]...
- </string>
- <string name="StartupClearingCache">
- Vidage du cache...
- </string>
- <string name="StartupInitializingTextureCache">
- Initialisation du cache des textures...
- </string>
- <string name="StartupInitializingVFS">
- Initialisation VFS...
- </string>
- <string name="StartupRequireDriverUpdate">
- Échec d&apos;initialisation des graphiques. Veuillez mettre votre pilote graphique à jour.
- </string>
- <string name="ProgressRestoring">
- Restauration...
- </string>
- <string name="ProgressChangingResolution">
- Changement de la résolution...
- </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>
- <string name="LoginMaintenance">
- Maintenance du compte en cours…
- </string>
- <string name="LoginAttempt">
- La tentative de connexion précédente a échoué. Connexion, esssai [NUMBER]
- </string>
- <string name="LoginPrecaching">
- Monde en cours de chargement…
- </string>
- <string name="LoginInitializingBrowser">
- Navigateur Web incorporé en cours d&apos;initialisation…
- </string>
- <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>
- <string name="LoginProcessingResponse">
- Réponse en cours de traitement…
- </string>
- <string name="LoginInitializingWorld">
- Monde en cours d&apos;initialisation…
- </string>
- <string name="LoginDecodingImages">
- Décodage des images en cours...
- </string>
- <string name="LoginInitializingQuicktime">
- Quicktime en cours d&apos;initialisation
- </string>
- <string name="LoginQuicktimeNotFound">
- Quicktime introuvable, impossible de procéder à l&apos;initialisation.
- </string>
- <string name="LoginQuicktimeOK">
- Initialisation de Quicktime réussie.
- </string>
- <string name="LoginRequestSeedCapGrant">
- Capacités de la région demandées...
- </string>
- <string name="LoginRetrySeedCapGrant">
- Capacités de la région demandées... Tentative n° [NUMBER].
- </string>
- <string name="LoginWaitingForRegionHandshake">
- Liaison avec la région en cours de création...
- </string>
- <string name="LoginConnectingToRegion">
- Connexion avec la région en cours...
- </string>
- <string name="LoginDownloadingClothing">
- Habits en cours de téléchargement...
- </string>
- <string name="InvalidCertificate">
- Certificat non valide ou corrompu renvoyé par le serveur. Contactez l&apos;administrateur de la grille.
- </string>
- <string name="CertInvalidHostname">
- Nom d&apos;hôte non valide utilisé pour accéder au serveur. Vérifiez votre nom d&apos;hôte de grille ou SLURL.
- </string>
- <string name="CertExpired">
- Il semble que le certificat renvoyé par la grille ait expiré. Vérifiez votre horloge système ou contactez l&apos;administrateur de la grille.
- </string>
- <string name="CertKeyUsage">
- Impossible d&apos;utiliser le certificat renvoyé par le serveur pour SSL. Contactez l&apos;administrateur de la grille.
- </string>
- <string name="CertBasicConstraints">
- Certificats trop nombreux dans la chaîne des certificats du serveur. Contactez l&apos;administrateur de la grille.
- </string>
- <string name="CertInvalidSignature">
- Impossible de vérifier la signature de certificat renvoyée par le serveur de la grille. Contactez l&apos;administrateur de la grille.
- </string>
- <string name="LoginFailedNoNetwork">
- Erreur réseau : impossible d&apos;établir la connexion. Veuillez vérifier votre connexion réseau.
- </string>
- <string name="LoginFailed">
- Échec de la connexion.
- </string>
- <string name="Quit">
- Quitter
- </string>
- <string name="create_account_url">
- http://join.secondlife.com/index.php?sourceid=1206_steam&amp;lang=fr-FR
- </string>
- <string name="LoginFailedViewerNotPermitted">
- Le client que vous utilisez ne permet plus d&apos;accéder à Second Life. Téléchargez un nouveau client à la page suivante :
-http://secondlife.com/download
-
-Pour plus d&apos;informations, consultez la page FAQ ci-dessous :
-http://secondlife.com/viewer-access-faq
- </string>
- <string name="LoginIntermediateOptionalUpdateAvailable">
- Mise à jour facultative du client disponible : [VERSION]
- </string>
- <string name="LoginFailedRequiredUpdate">
- Mise à jour du client requise : [VERSION]
- </string>
- <string name="LoginFailedAlreadyLoggedIn">
- L&apos;agent est déjà connecté.
- </string>
- <string name="LoginFailedAuthenticationFailed">
- Désolé ! La connexion a échoué.
-Veuillez vérifier que les éléments ci-dessous ont été correctement saisis :
- * Nom d&apos;utilisateur (par exemple, bobsmith12 ou steller.sunshine)
- * Mot de passe
-Assurez-vous également que la touche Verr. maj n&apos;est pas activée.
- </string>
- <string name="LoginFailedPasswordChanged">
- Votre mot de passe a été modifié pour des raisons de sécurité.
-Veuillez accéder à votre compte à la page http://secondlife.com/password
-et répondre à la question de sécurité afin de réinitialiser votre mot de passe.
-Nous vous prions de nous excuser pour la gêne occasionnée.
- </string>
- <string name="LoginFailedPasswordReset">
- Vous allez devoir réinitialiser votre mot de passe suite à quelques changements effectués sur notre système.
-Pour cela, accédez à votre compte à la page http://secondlife.com/password
-et répondez à la question de sécurité. Votre mot de passe sera réinitialisé.
-Nous vous prions de nous excuser pour la gêne occasionnée.
- </string>
- <string name="LoginFailedEmployeesOnly">
- Second Life est temporairement fermé pour des raisons de maintenance.
-Seuls les employés peuvent actuellement y accéder.
-Consultez la page www.secondlife.com/status pour plus d&apos;informations.
- </string>
- <string name="LoginFailedPremiumOnly">
- Les connexions à Second Life sont temporairement limitées afin de s&apos;assurer que l&apos;expérience des utilisateurs présents dans le monde virtuel soit optimale.
-
-Les personnes disposant de comptes gratuits ne pourront pas accéder à Second Life pendant ce temps afin de permettre à celles qui ont payé pour pouvoir utiliser Second Life de le faire.
- </string>
- <string name="LoginFailedComputerProhibited">
- Impossible d&apos;accéder à Second Life depuis cet ordinateur.
-Si vous pensez qu&apos;il s&apos;agit d&apos;une erreur, contactez
-l&apos;Assistance à l&apos;adresse suivante : support@secondlife.com.
- </string>
- <string name="LoginFailedAcountSuspended">
- Votre compte est inaccessible jusqu&apos;à
-[TIME], heure du Pacifique.
- </string>
- <string name="LoginFailedAccountDisabled">
- Nous n&apos;avons pas réussi à traiter votre demande.
-Pour obtenir de l&apos;aide, veuillez contacter l&apos;Assistance Second Life à la page suivante : http://secondlife.com/support.
-Si vous ne parvenez pas à changer de mot de passe, veuillez appeler le (866) 476-9763.
- </string>
- <string name="LoginFailedTransformError">
- Incohérence des données lors de la connexion.
-Veuillez contacter support@secondlife.com.
- </string>
- <string name="LoginFailedAccountMaintenance">
- Des opérations de maintenance mineures sont actuellement effectuées sur votre compte.
-Votre compte est inaccessible jusqu&apos;à
-[TIME], heure du Pacifique.
-Si vous pensez qu&apos;il s&apos;agit d&apos;une erreur, contactez l&apos;Assistance à l&apos;adresse suivante : support@secondlife.com
- </string>
- <string name="LoginFailedPendingLogoutFault">
- Le simulateur a renvoyé une erreur en réponse à la demande de déconnexion.
- </string>
- <string name="LoginFailedPendingLogout">
- Le système est en train de vous déconnecter.
-Votre compte sera indisponible jusqu&apos;à
-[TIME], heure du Pacifique.
- </string>
- <string name="LoginFailedUnableToCreateSession">
- Impossible de créer de session valide.
- </string>
- <string name="LoginFailedUnableToConnectToSimulator">
- Impossible de se connecter à un simulateur.
- </string>
- <string name="LoginFailedRestrictedHours">
- Votre compte permet uniquement d&apos;accéder à Second Life
-entre [START] et [END], heure du Pacifique.
-Veuillez réessayer au cours de la période indiquée.
-Si vous pensez qu&apos;il s&apos;agit d&apos;une erreur, contactez l&apos;Assistance à l&apos;adresse suivante : support@secondlife.com
- </string>
- <string name="LoginFailedIncorrectParameters">
- Paramètres incorrects.
-Si vous pensez qu&apos;il s&apos;agit d&apos;une erreur, contactez l&apos;Assistance à l&apos;adresse suivante : support@secondlife.com
- </string>
- <string name="LoginFailedFirstNameNotAlphanumeric">
- Le paramètre Prénom doit être alphanumérique.
-Si vous pensez qu&apos;il s&apos;agit d&apos;une erreur, contactez l&apos;Assistance à l&apos;adresse suivante : support@secondlife.com
- </string>
- <string name="LoginFailedLastNameNotAlphanumeric">
- Le paramètre Nom doit être alphanumérique.
-Si vous pensez qu&apos;il s&apos;agit d&apos;une erreur, contactez l&apos;Assistance à l&apos;adresse suivante : support@secondlife.com
- </string>
- <string name="LogoutFailedRegionGoingOffline">
- La région est en train d&apos;être mise hors ligne.
-Veuillez réessayer de vous connecter dans une minute.
- </string>
- <string name="LogoutFailedAgentNotInRegion">
- Agent absent de la région.
-Veuillez réessayer de vous connecter dans une minute.
- </string>
- <string name="LogoutFailedPendingLogin">
- Une autre session était en cours d&apos;ouverture au sein de la région.
-Veuillez réessayer de vous connecter dans une minute.
- </string>
- <string name="LogoutFailedLoggingOut">
- La session précédente était en cours de fermeture au sein de la région.
-Veuillez réessayer de vous connecter dans une minute.
- </string>
- <string name="LogoutFailedStillLoggingOut">
- Fermeture de la session précédente toujours en cours pour la région.
-Veuillez réessayer de vous connecter dans une minute.
- </string>
- <string name="LogoutSucceeded">
- Dernière session fermée au sein de la région.
-Veuillez réessayer de vous connecter dans une minute.
- </string>
- <string name="LogoutFailedLogoutBegun">
- Processus de déconnexion commencé pour la région.
-Veuillez réessayer de vous connecter dans une minute.
- </string>
- <string name="LoginFailedLoggingOutSession">
- Le système a commencé à fermer votre dernière session.
-Veuillez réessayer de vous connecter dans une minute.
- </string>
- <string name="AgentLostConnection">
- Il y a peut-être des problèmes techniques dans cette région. Veuillez vérifier votre connexion Internet.
- </string>
- <string name="SavingSettings">
- Enregistrement des paramètres...
- </string>
- <string name="LoggingOut">
- Déconnexion...
- </string>
- <string name="ShuttingDown">
- Arrêt en cours...
- </string>
- <string name="YouHaveBeenDisconnected">
- Vous avez été déconnecté de la région où vous étiez.
- </string>
- <string name="SentToInvalidRegion">
- Vous avez été transféré vers une région non valide.
- </string>
- <string name="TestingDisconnect">
- Test de déconnexion du client
- </string>
- <string name="TooltipPerson">
- Personne
- </string>
- <string name="TooltipNoName">
- (pas de nom)
- </string>
- <string name="TooltipOwner">
- Propriétaire :
- </string>
- <string name="TooltipPublic">
- Public
- </string>
- <string name="TooltipIsGroup">
- (Groupe)
- </string>
- <string name="TooltipForSaleL$">
- À vendre : [AMOUNT] L$
- </string>
- <string name="TooltipFlagGroupBuild">
- Contruction de groupe
- </string>
- <string name="TooltipFlagNoBuild">
- Pas de construction
- </string>
- <string name="TooltipFlagNoEdit">
- Contruction de groupe
- </string>
- <string name="TooltipFlagNotSafe">
- Non sécurisé
- </string>
- <string name="TooltipFlagNoFly">
- Interdiction de voler
- </string>
- <string name="TooltipFlagGroupScripts">
- Scripts de groupe
- </string>
- <string name="TooltipFlagNoScripts">
- Pas de scripts
- </string>
- <string name="TooltipLand">
- Terrain :
- </string>
- <string name="TooltipMustSingleDrop">
- Impossible de faire glisser plus d&apos;un objet ici
- </string>
- <string name="TooltipPrice" value="[AMOUNT] L$ :"/>
- <string name="TooltipOutboxDragToWorld">
- Impossible de rezzer des articles dans la boîte d&apos;envoi vendeur
- </string>
- <string name="TooltipOutboxNoTransfer">
- Impossible de vendre ou de transférer un ou plusieurs de ces objets.
- </string>
- <string name="TooltipOutboxNotInInventory">
- La boîte d&apos;envoi vendeur n&apos;accepte que les articles directement issus de votre inventaire.
- </string>
- <string name="TooltipOutboxWorn">
- Impossible de placer des articles que vous portez dans votre boîte d&apos;envoi vendeur
- </string>
- <string name="TooltipOutboxCallingCard">
- Impossible de placer des cartes de visite dans votre boîte d&apos;envoi vendeur
- </string>
- <string name="TooltipOutboxFolderLevels">
- Il existe plus de 3 niveaux de dossiers imbriqués.
- </string>
- <string name="TooltipOutboxTooManyFolders">
- Le dossier de niveau supérieur contient plus de 20 sous-dossiers.
- </string>
- <string name="TooltipOutboxTooManyObjects">
- Le dossier de niveau supérieur contient plus de 200 articles.
- </string>
- <string name="TooltipDragOntoOwnChild">
- Impossible de déplacer un dossier vers son enfant
- </string>
- <string name="TooltipDragOntoSelf">
- Impossible de déplacer un dossier vers lui-même
- </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="TooltipAgentInspect">
- En savoir plus sur ce résident
- </string>
- <string name="TooltipAgentMute">
- Cliquer pour ignorer ce résident
- </string>
- <string name="TooltipAgentUnmute">
- Cliquer pour ne plus ignorer ce résident
- </string>
- <string name="TooltipAgentIM">
- Cliquer pour envoyer un IM à ce résident
- </string>
- <string name="TooltipAgentPay">
- Cliquer pour payer ce résident
- </string>
- <string name="TooltipAgentOfferTeleport">
- Cliquer pour proposer une téléportation à ce résident
- </string>
- <string name="TooltipAgentRequestFriend">
- Cliquer pour demander à ce résident d&apos;être votre ami
- </string>
- <string name="TooltipGroupUrl">
- Cliquez pour afficher la description de ce groupe
- </string>
- <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://
- </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="SLappAgentMute">
- Ignorer
- </string>
- <string name="SLappAgentUnmute">
- Ne plus ignorer
- </string>
- <string name="SLappAgentIM">
- IM
- </string>
- <string name="SLappAgentPay">
- Payer
- </string>
- <string name="SLappAgentOfferTeleport">
- Proposer une téléportation à
- </string>
- <string name="SLappAgentRequestFriend">
- Demande d&apos;amitié
- </string>
- <string name="BUTTON_CLOSE_DARWIN">
- Fermer (⌘W)
- </string>
- <string name="BUTTON_CLOSE_WIN">
- Fermer (Ctrl+W)
- </string>
- <string name="BUTTON_CLOSE_CHROME">
- Fermer
- </string>
- <string name="BUTTON_RESTORE">
- Restaurer
- </string>
- <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>
- <string name="ReleaseNotes">
- Notes de version
- </string>
- <string name="RELEASE_NOTES_BASE_URL">
- http://wiki.secondlife.com/wiki/Release_Notes/
- </string>
- <string name="LoadingData">
- Chargement...
- </string>
- <string name="AvatarNameNobody">
- (personne)
- </string>
- <string name="AvatarNameWaiting">
- (en attente)
- </string>
- <string name="AvatarNameMultiple">
- (multiple)
- </string>
- <string name="GroupNameNone">
- (aucun)
- </string>
- <string name="AvalineCaller">
- Appelant Avaline [ORDER]
- </string>
- <string name="AssetErrorNone">
- Aucune erreur
- </string>
- <string name="AssetErrorRequestFailed">
- Requête de l&apos;actif : échec
- </string>
- <string name="AssetErrorNonexistentFile">
- Requête de l&apos;actif : fichier inexistant
- </string>
- <string name="AssetErrorNotInDatabase">
- Requête de l&apos;actif : actif introuvable dans la base de données
- </string>
- <string name="AssetErrorEOF">
- Fin du ficher
- </string>
- <string name="AssetErrorCannotOpenFile">
- Impossible d&apos;ouvrir le fichier
- </string>
- <string name="AssetErrorFileNotFound">
- Fichier introuvable
- </string>
- <string name="AssetErrorTCPTimeout">
- Délai d&apos;attente du transfert du fichier dépassé
- </string>
- <string name="AssetErrorCircuitGone">
- Disparition du circuit
- </string>
- <string name="AssetErrorPriceMismatch">
- Il y a une différence de prix entre le client et le serveur
- </string>
- <string name="AssetErrorUnknownStatus">
- Statut inconnu
- </string>
- <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">
- Corbeille
- </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="symbolic folder link">
- lien du dossier
- </string>
- <string name="mesh">
- maillage
- </string>
- <string name="AvatarEditingAppearance">
- (Apparence en cours de modification)
- </string>
- <string name="AvatarAway">
- Absent
- </string>
- <string name="AvatarBusy">
- Occupé
- </string>
- <string name="AvatarMuted">
- Bloqué(e)
- </string>
- <string name="anim_express_afraid">
- Effrayé
- </string>
- <string name="anim_express_anger">
- En colère
- </string>
- <string name="anim_away">
- Absent
- </string>
- <string name="anim_backflip">
- Salto arrière
- </string>
- <string name="anim_express_laugh">
- Rire en se tenant le ventre
- </string>
- <string name="anim_express_toothsmile">
- Grand sourire
- </string>
- <string name="anim_blowkiss">
- Envoyer un baiser
- </string>
- <string name="anim_express_bored">
- Bailler d&apos;ennui
- </string>
- <string name="anim_bow">
- S&apos;incliner
- </string>
- <string name="anim_clap">
- Applaudir
- </string>
- <string name="anim_courtbow">
- Révérence de cour
- </string>
- <string name="anim_express_cry">
- Pleurer
- </string>
- <string name="anim_dance1">
- Danse 1
- </string>
- <string name="anim_dance2">
- Danse 2
- </string>
- <string name="anim_dance3">
- Danse 3
- </string>
- <string name="anim_dance4">
- Danse 4
- </string>
- <string name="anim_dance5">
- Danse 5
- </string>
- <string name="anim_dance6">
- Danse 6
- </string>
- <string name="anim_dance7">
- Danse 7
- </string>
- <string name="anim_dance8">
- Danse 8
- </string>
- <string name="anim_express_disdain">
- Mépris
- </string>
- <string name="anim_drink">
- Boire
- </string>
- <string name="anim_express_embarrased">
- Gêne
- </string>
- <string name="anim_angry_fingerwag">
- Désapprobation
- </string>
- <string name="anim_fist_pump">
- Victoire
- </string>
- <string name="anim_yoga_float">
- Yoga
- </string>
- <string name="anim_express_frown">
- Froncer les sourcils
- </string>
- <string name="anim_impatient">
- Impatient
- </string>
- <string name="anim_jumpforjoy">
- Sauter de joie
- </string>
- <string name="anim_kissmybutt">
- Va te faire voir !
- </string>
- <string name="anim_express_kiss">
- Envoyer un baiser
- </string>
- <string name="anim_laugh_short">
- Rire
- </string>
- <string name="anim_musclebeach">
- Montrer ses muscles
- </string>
- <string name="anim_no_unhappy">
- Non (mécontent)
- </string>
- <string name="anim_no_head">
- Non
- </string>
- <string name="anim_nyanya">
- Na na na na nère
- </string>
- <string name="anim_punch_onetwo">
- Gauche-droite
- </string>
- <string name="anim_express_open_mouth">
- Bouche ouverte
- </string>
- <string name="anim_peace">
- Paix
- </string>
- <string name="anim_point_you">
- Montrer quelqu&apos;un du doigt
- </string>
- <string name="anim_point_me">
- Se montrer du doigt
- </string>
- <string name="anim_punch_l">
- Gauche
- </string>
- <string name="anim_punch_r">
- Droite
- </string>
- <string name="anim_rps_countdown">
- Compter (pierre-papier-ciseaux)
- </string>
- <string name="anim_rps_paper">
- Papier (pierre-papier-ciseaux)
- </string>
- <string name="anim_rps_rock">
- Pierre (pierre-papier-ciseaux)
- </string>
- <string name="anim_rps_scissors">
- Ciseaux (pierre-papier-ciseaux)
- </string>
- <string name="anim_express_repulsed">
- Dégoût
- </string>
- <string name="anim_kick_roundhouse_r">
- Coup de pied circulaire
- </string>
- <string name="anim_express_sad">
- Triste
- </string>
- <string name="anim_salute">
- Salut
- </string>
- <string name="anim_shout">
- Crier
- </string>
- <string name="anim_express_shrug">
- Hausser les épaules
- </string>
- <string name="anim_express_smile">
- Sourire
- </string>
- <string name="anim_smoke_idle">
- Fumer, immobile
- </string>
- <string name="anim_smoke_inhale">
- Fumer, prendre une bouffée
- </string>
- <string name="anim_smoke_throw_down">
- Fumer, jeter son mégot
- </string>
- <string name="anim_express_surprise">
- Surprise
- </string>
- <string name="anim_sword_strike_r">
- Coup d&apos;épée
- </string>
- <string name="anim_angry_tantrum">
- Caprice
- </string>
- <string name="anim_express_tongue_out">
- Tirer la langue
- </string>
- <string name="anim_hello">
- Faire signe
- </string>
- <string name="anim_whisper">
- Chuchoter
- </string>
- <string name="anim_whistle">
- Siffler
- </string>
- <string name="anim_express_wink">
- Clin d&apos;œil
- </string>
- <string name="anim_wink_hollywood">
- Clin d&apos;œil (Hollywood)
- </string>
- <string name="anim_express_worry">
- Soucis
- </string>
- <string name="anim_yes_happy">
- Oui (Joie)
- </string>
- <string name="anim_yes_head">
- Oui
- </string>
- <string name="multiple_textures">
- Multiples
- </string>
- <string name="texture_loading">
- Chargement...
- </string>
- <string name="worldmap_offline">
- Hors ligne
- </string>
- <string name="worldmap_item_tooltip_format">
- [AREA] m² [PRICE] L$
- </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">
- Général
- </string>
- <string name="SIM_ACCESS_MATURE">
- Modéré
- </string>
- <string name="SIM_ACCESS_ADULT">
- Adulte
- </string>
- <string name="SIM_ACCESS_DOWN">
- Hors ligne
- </string>
- <string name="SIM_ACCESS_MIN">
- Inconnu
- </string>
- <string name="land_type_unknown">
- (inconnu)
- </string>
- <string name="Estate / Full Region">
- Domaine / Région entière
- </string>
- <string name="Estate / Homestead">
- Domaine / Homestead
- </string>
- <string name="Mainland / Homestead">
- Continent / Homestead
- </string>
- <string name="Mainland / Full Region">
- Continent / Région entière
- </string>
- <string name="all_files">
- Tous fichiers
- </string>
- <string name="sound_files">
- Sons
- </string>
- <string name="animation_files">
- Animations
- </string>
- <string name="image_files">
- Images
- </string>
- <string name="save_file_verb">
- Enregistrer
- </string>
- <string name="load_file_verb">
- Charger
- </string>
- <string name="targa_image_files">
- Images Targa
- </string>
- <string name="bitmap_image_files">
- Images Bitmap
- </string>
- <string name="avi_movie_file">
- Fichier de film AVI
- </string>
- <string name="xaf_animation_file">
- Fichier d&apos;animation XAF
- </string>
- <string name="xml_file">
- Fichier XML
- </string>
- <string name="raw_file">
- Fichier RAW
- </string>
- <string name="compressed_image_files">
- Images compressées
- </string>
- <string name="load_files">
- Charger des fichiers
- </string>
- <string name="choose_the_directory">
- Choisir le répertoire
- </string>
- <string name="script_files">
- Scripts
- </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="physics">
- Propriétés physiques
- </string>
- <string name="invalid">
- non valide
- </string>
- <string name="none">
- aucun
- </string>
- <string name="shirt_not_worn">
- Chemise non portée
- </string>
- <string name="pants_not_worn">
- Pantalon non porté
- </string>
- <string name="shoes_not_worn">
- Chaussures non portées
- </string>
- <string name="socks_not_worn">
- Chaussettes non portées
- </string>
- <string name="jacket_not_worn">
- Veste non portée
- </string>
- <string name="gloves_not_worn">
- Gants non portés
- </string>
- <string name="undershirt_not_worn">
- Débardeur non porté
- </string>
- <string name="underpants_not_worn">
- Caleçon non porté
- </string>
- <string name="skirt_not_worn">
- Jupe non portée
- </string>
- <string name="alpha_not_worn">
- Alpha non porté
- </string>
- <string name="tattoo_not_worn">
- Tatouage non porté
- </string>
- <string name="physics_not_worn">
- Propriétés physiques non portées
- </string>
- <string name="invalid_not_worn">
- non valide
- </string>
- <string name="create_new_shape">
- Créer une nouvelle silhouette
- </string>
- <string name="create_new_skin">
- Créer une nouvelle peau
- </string>
- <string name="create_new_hair">
- Créer de nouveaux cheveux
- </string>
- <string name="create_new_eyes">
- Créer de nouveaux yeux
- </string>
- <string name="create_new_shirt">
- Créer une nouvelle chemise
- </string>
- <string name="create_new_pants">
- Créer un nouveau pantalon
- </string>
- <string name="create_new_shoes">
- Créer de nouvelles chaussures
- </string>
- <string name="create_new_socks">
- Créer de nouvelles chaussettes
- </string>
- <string name="create_new_jacket">
- Créer une nouvelle veste
- </string>
- <string name="create_new_gloves">
- Créer de nouveaux gants
- </string>
- <string name="create_new_undershirt">
- Créer un nouveau débardeur
- </string>
- <string name="create_new_underpants">
- Créer un nouveau caleçon
- </string>
- <string name="create_new_skirt">
- Créer une nouvelle jupe
- </string>
- <string name="create_new_alpha">
- Créer un nouvel alpha
- </string>
- <string name="create_new_tattoo">
- Créer un nouveau tatouage
- </string>
- <string name="create_new_physics">
- Créer de nouvelles propriétés physiques
- </string>
- <string name="create_new_invalid">
- non valide
- </string>
- <string name="NewWearable">
- Nouv. [WEARABLE_ITEM]
- </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 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">
- Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/all/[SEARCH_TERM] Rechercher].
- </string>
- <string name="PlacesNoMatchingItems">
- Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/[SEARCH_TERM] Rechercher].
- </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="InventoryInboxNoItems">
- Les achats que vous avez effectués sur la Place du marché s&apos;affichent ici. Vous pouvez alors les faire glisser vers votre inventaire afin de les utiliser.
- </string>
- <string name="MarketplaceURL">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
- </string>
- <string name="MarketplaceURL_CreateStore">
- http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
- </string>
- <string name="MarketplaceURL_Dashboard">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
- </string>
- <string name="MarketplaceURL_Imports">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
- </string>
- <string name="MarketplaceURL_LearnMore">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
- </string>
- <string name="InventoryOutboxNotMerchantTitle">
- Tout le monde peut vendre des articles sur la Place du marché.
- </string>
- <string name="InventoryOutboxNotMerchantTooltip"/>
- <string name="InventoryOutboxNotMerchant">
- Pour devenir vendeur, vous devez [[MARKETPLACE_CREATE_STORE_URL] créer une boutique sur la Place du marché].
- </string>
- <string name="InventoryOutboxNoItemsTitle">
- Votre boîte d&apos;envoi est vide.
- </string>
- <string name="InventoryOutboxNoItemsTooltip"/>
- <string name="InventoryOutboxNoItems">
- Pour mettre des dossiers en vente sur la [[MARKETPLACE_DASHBOARD_URL] Place du marché], faites-les glisser vers cette zone et cliquez sur &quot;Envoyer vers la Place du marché&quot;.
- </string>
- <string name="Marketplace Error None">
- Aucune erreur
- </string>
- <string name="Marketplace Error Not Merchant">
- Erreur : avant d&apos;envoyer des articles vers la Place du marché, vous devez vous configurer comme vendeur (gratuit).
- </string>
- <string name="Marketplace Error Empty Folder">
- Erreur : ce dossier est vide.
- </string>
- <string name="Marketplace Error Unassociated Products">
- Erreur : le chargement de cet article a échoué en raison d&apos;un nombre trop important d&apos;articles non associés à des produits au niveau de votre compte de vendeur. Pour résoudre ce problème, connectez-vous au site Web de la Place du marché et réduisez le nombre d&apos;articles non associés.
- </string>
- <string name="Marketplace Error Object Limit">
- Erreur : cet article contient trop d&apos;objets. Pour résoudre le problème, regroupez des objets dans des paquets afin de réduire le nombre total à moins de 200.
- </string>
- <string name="Marketplace Error Folder Depth">
- Erreur : trop de niveaux de dossiers imbriqués concernant cet article. Réorganisez le tout afin qu&apos;un maximum de 3 niveaux soit utilisé.
- </string>
- <string name="Marketplace Error Unsellable Item">
- Erreur : cet article ne peut pas être vendu sur la Place du marché.
- </string>
- <string name="Marketplace Error Internal Import">
- Erreur : un problème est survenu concernant cet article. Veuillez réessayer ultérieurement.
- </string>
- <string name="Open landmarks">
- Ouvrir les repères
- </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="ActiveGesture" value="[GESLABEL] (actif)"/>
- <string name="PermYes">
- Oui
- </string>
- <string name="PermNo">
- Non
- </string>
- <string name="Chat Message" 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=" Lancer l&apos;animation :"/>
- <string name="Wave" value=" Faire signe"/>
- <string name="GestureActionNone" value="À choisir"/>
- <string name="HelloAvatar" value=" Bonjour, avatar !"/>
- <string name="ViewAllGestures" value=" Tout afficher &gt;&gt;"/>
- <string name="GetMoreGestures" value="Plus &gt;&gt;"/>
- <string name="Animations" value=" Animations,"/>
- <string name="Calling Cards" value=" Cartes de visite,"/>
- <string name="Clothing" value=" Habits,"/>
- <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 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">
- Corbeille
- </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">
- Mes Favoris
- </string>
- <string name="InvFolder favorite">
- Mes Favoris
- </string>
- <string name="InvFolder Current Outfit">
- Tenue actuelle
- </string>
- <string name="InvFolder Initial Outfits">
- Tenues initiales
- </string>
- <string name="InvFolder My Outfits">
- Mes tenues
- </string>
- <string name="InvFolder Accessories">
- Accessoires
- </string>
- <string name="InvFolder Meshes">
- Maillages
- </string>
- <string name="InvFolder Friends">
- Amis
- </string>
- <string name="InvFolder All">
- Tout
- </string>
- <string name="no_attachments">
- Aucun élément attaché porté
- </string>
- <string name="Attachments remain">
- Éléments attachés ([COUNT] emplacements restants)
- </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="Neck">
- Cou
- </string>
- <string name="Avatar Center">
- Centre de l&apos;avatar
- </string>
- <string name="Invalid Attachment">
- Point d&apos;attache non valide
- </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">
- Centre 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">
- Centre
- </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">
- Droits insuffisants pour télécharger un script.
- </string>
- <string name="CompileQueueInsufficientPermFor">
- Droits insuffisants 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="GroupPlanningDate">
- [day,datetime,utc]/[mthnum,datetime,utc]/[year,datetime,utc]
- </string>
- <string name="GroupIndividualShare" value=" Groupe Part individuelle"/>
- <string name="GroupColumn" value="Groupe"/>
- <string name="Balance">
- Solde
- </string>
- <string name="Credits">
- Crédits
- </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="Anyone">
- n&apos;importe qui
- </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="PanelContentsTooltip">
- Contenu de l&apos;objet
- </string>
- <string name="PanelContentsNewScript">
- Nouveau script
- </string>
- <string name="BusyModeResponseDefault">
- Le résident auquel vous avez envoyé un message est en mode Occupé, ce qui signifie qu&apos;il a demandé à ne pas être dérangé. Votre message restera affiché dans son panneau IM afin qu&apos;il puisse le lire ultérieurement.
- </string>
- <string name="MuteByName">
- (par nom)
- </string>
- <string name="MuteAgent">
- (résident)
- </string>
- <string name="MuteObject">
- (objet)
- </string>
- <string name="MuteGroup">
- (groupe)
- </string>
- <string name="MuteExternal">
- (externe)
- </string>
- <string name="RegionNoCovenant">
- Il n&apos;y a aucun règlement pour ce domaine.
- </string>
- <string name="RegionNoCovenantOtherOwner">
- Il n&apos;y a aucun règlement pour ce domaine. Le terrain sur ce domaine est vendu par le propriétaire, non par Linden Lab. Pour en savoir plus, veuillez contacter le propriétaire.
- </string>
- <string name="covenant_last_modified" value="Dernière modification :"/>
- <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="LocalSettings">
- Réglages locaux
- </string>
- <string name="RegionSettings">
- Réglages de la région
- </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="NoAvatarPicksClassifiedsText">
- L&apos;utilisateur n&apos;a ni favoris ni petites annonces.
- </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="InvOfferDecline">
- Vous refusez l&apos;offre [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
- </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">
- Crédits
- </string>
- <string name="GroupMoneyDebits">
- Débits
- </string>
- <string name="GroupMoneyDate">
- [weekday,datetime,utc] [day,datetime,utc] [mth,datetime,utc] [year,datetime,utc]
- </string>
- <string name="ViewerObjectContents">
- Contenus
- </string>
- <string name="AcquiredItems">
- Objets acquis
- </string>
- <string name="Cancel">
- Annuler
- </string>
- <string name="UploadingCosts">
- Le chargement de [NAME] coûte [AMOUNT] L$
- </string>
- <string name="BuyingCosts">
- Cet achat coûte [AMOUNT] L$
- </string>
- <string name="UnknownFileExtension">
- Extension de fichier inconnue .%s
-.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">
- ⌃
- </string>
- <string name="accel-mac-command">
- ⌘
- </string>
- <string name="accel-mac-option">
- ⌥
- </string>
- <string name="accel-mac-shift">
- ⇧
- </string>
- <string name="accel-win-control">
- Ctrl+
- </string>
- <string name="accel-win-alt">
- Alt+
- </string>
- <string name="accel-win-shift">
- Maj+
- </string>
- <string name="FileSaved">
- Fichier enregistré
- </string>
- <string name="Receiving">
- Réception
- </string>
- <string name="AM">
- Matin
- </string>
- <string name="PM">
- Après-midi
- </string>
- <string name="PST">
- PST
- </string>
- <string name="PDT">
- PDT
- </string>
- <string name="Direction_Forward">
- Avant
- </string>
- <string name="Direction_Left">
- Gauche
- </string>
- <string name="Direction_Right">
- Droite
- </string>
- <string name="Direction_Back">
- Arrière
- </string>
- <string name="Direction_North">
- Nord
- </string>
- <string name="Direction_South">
- Sud
- </string>
- <string name="Direction_West">
- Ouest
- </string>
- <string name="Direction_East">
- Est
- </string>
- <string name="Direction_Up">
- Haut
- </string>
- <string name="Direction_Down">
- Bas
- </string>
- <string name="Any Category">
- Toutes catégories
- </string>
- <string name="Shopping">
- Shopping
- </string>
- <string name="Land Rental">
- Terrains à louer
- </string>
- <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="Rental">
- Location
- </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>
- <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 du front
- </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="Breast Physics Mass">
- Masse des seins
- </string>
- <string name="Breast Physics Smoothing">
- Lissage des seins
- </string>
- <string name="Breast Physics Gravity">
- Gravité des seins
- </string>
- <string name="Breast Physics Drag">
- Résistance de l&apos;air sur les seins
- </string>
- <string name="Breast Physics InOut Max Effect">
- Effet max.
- </string>
- <string name="Breast Physics InOut Spring">
- Élasticité
- </string>
- <string name="Breast Physics InOut Gain">
- Amplification
- </string>
- <string name="Breast Physics InOut Damping">
- Amortissement
- </string>
- <string name="Breast Physics UpDown Max Effect">
- Effet max.
- </string>
- <string name="Breast Physics UpDown Spring">
- Élasticité
- </string>
- <string name="Breast Physics UpDown Gain">
- Amplification
- </string>
- <string name="Breast Physics UpDown Damping">
- Amortissement
- </string>
- <string name="Breast Physics LeftRight Max Effect">
- Effet max.
- </string>
- <string name="Breast Physics LeftRight Spring">
- Élasticité
- </string>
- <string name="Breast Physics LeftRight Gain">
- Amplification
- </string>
- <string name="Breast Physics LeftRight Damping">
- Amortissement
- </string>
- <string name="Belly Physics Mass">
- Masse du ventre
- </string>
- <string name="Belly Physics Smoothing">
- Lissage du ventre
- </string>
- <string name="Belly Physics Gravity">
- Gravité du ventre
- </string>
- <string name="Belly Physics Drag">
- Résistance de l&apos;air sur le ventre
- </string>
- <string name="Belly Physics UpDown Max Effect">
- Effet max.
- </string>
- <string name="Belly Physics UpDown Spring">
- Élasticité
- </string>
- <string name="Belly Physics UpDown Gain">
- Amplification
- </string>
- <string name="Belly Physics UpDown Damping">
- Amortissement
- </string>
- <string name="Butt Physics Mass">
- Masse des fesses
- </string>
- <string name="Butt Physics Smoothing">
- Lissage des fesses
- </string>
- <string name="Butt Physics Gravity">
- Gravité des fesses
- </string>
- <string name="Butt Physics Drag">
- Résistance de l&apos;air sur les fesses
- </string>
- <string name="Butt Physics UpDown Max Effect">
- Effet max.
- </string>
- <string name="Butt Physics UpDown Spring">
- Élasticité
- </string>
- <string name="Butt Physics UpDown Gain">
- Amplification
- </string>
- <string name="Butt Physics UpDown Damping">
- Amortissement
- </string>
- <string name="Butt Physics LeftRight Max Effect">
- Effet max.
- </string>
- <string name="Butt Physics LeftRight Spring">
- Élasticité
- </string>
- <string name="Butt Physics LeftRight Gain">
- Amplification
- </string>
- <string name="Butt Physics LeftRight Damping">
- Amortissement
- </string>
- <string name="Bushy Eyebrows">
- Sourcils touffus
- </string>
- <string name="Bushy Hair">
- Beaucoup
- </string>
- <string name="Butt Size">
- Taille des fesses
- </string>
- <string name="Butt Gravity">
- Gravité 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">
- Proéminence
- </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">
- Gants avec doigts
- </string>
- <string name="Glove Length">
- Longueur
- </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 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">
- Prof. 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 inférieure
- </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">
- Angle bout du nez
- </string>
- <string name="Nose Tip Shape">
- Forme bout du nez
- </string>
- <string name="Nose Width">
- Largeur du nez
- </string>
- <string name="Nostril Division">
- Division narines
- </string>
- <string name="Nostril Width">
- Largeur 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">
- Platef. (hauteur)
- </string>
- <string name="Platform Width">
- Platef. (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">
- Paup. gonflées
- </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éplacement
- </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
- </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 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">
- Joue supérieure
- </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="LocationCtrlAdultIconTooltip">
- Région de type Adulte
- </string>
- <string name="LocationCtrlModerateIconTooltip">
- Région de type Modéré
- </string>
- <string name="LocationCtrlGeneralIconTooltip">
- Région de type Général
- </string>
- <string name="LocationCtrlSeeAVsTooltip">
- Avatars visibles et chat autorisé en dehors de cette parcelle
- </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="ItemsComingInTooFastFrom">
- [APP_NAME] : transfert trop rapide des articles de [FROM_NAME] ; aperçu automatique désactivé pendant [TIME] secondes
- </string>
- <string name="ItemsComingInTooFast">
- [APP_NAME] : transfert trop rapide des articles ; aperçu automatique désactivé pendant [TIME] secondes
- </string>
- <string name="IM_logging_string">
- -- Archivage des IM activé --
- </string>
- <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="Saved_message">
- (Enregistrement : [LONG_TIMESTAMP])
- </string>
- <string name="IM_unblock_only_groups_friends">
- Pour afficher ce message, vous devez désactiver la case Seuls mes amis et groupes peuvent m&apos;appeler ou m&apos;envoyer un IM, sous Préférences/Confidentialité.
- </string>
- <string name="answered_call">
- Votre appel a fait l&apos;objet d&apos;une réponse
- </string>
- <string name="you_started_call">
- Vous appelez.
- </string>
- <string name="you_joined_call">
- Vous avez rejoint l&apos;appel
- </string>
- <string name="name_started_call">
- [NAME] appelle.
- </string>
- <string name="ringing-im">
- En train de rejoindre l&apos;appel...
- </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="conference-title-incoming">
- Conférence avec [AGENT_NAME]
- </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="no_session_message">
- (Session IM inexistante)
- </string>
- <string name="only_user_message">
- Vous êtes le seul participant à cette session.
- </string>
- <string name="offline_message">
- [NAME] est hors ligne.
- </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>
- <string name="insufficient_perms_error">
- Vous n&apos;avez pas les droits requis.
- </string>
- <string name="session_does_not_exist_error">
- La session a expiré
- </string>
- <string name="no_ability_error">
- Vous n&apos;avez pas ce pouvoir.
- </string>
- <string name="no_ability">
- Vous n&apos;avez pas ce pouvoir.
- </string>
- <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="unread_chat_single">
- [SOURCES] a dit quelque chose de nouveau
- </string>
- <string name="unread_chat_multiple">
- [SOURCES] ont dit quelque chose de nouveau
- </string>
- <string name="session_initialization_timed_out_error">
- Expiration du délai d&apos;initialisation de la session
- </string>
- <string name="Home position set.">
- Emplacement du domicile défini.
- </string>
- <string name="voice_morphing_url">
- http://secondlife.com/landing/voicemorphing
- </string>
- <string name="paid_you_ldollars">
- [NAME] vous a payé [AMOUNT] L$ [REASON].
- </string>
- <string name="paid_you_ldollars_no_reason">
- [NAME] vous a payé [AMOUNT] L$.
- </string>
- <string name="you_paid_ldollars">
- Vous avez payé à [AMOUNT] L$ [REASON].
- </string>
- <string name="you_paid_ldollars_no_info">
- Vous avez payé [AMOUNT] L$.
- </string>
- <string name="you_paid_ldollars_no_reason">
- Vous avez payé à [NAME] [AMOUNT] L$.
- </string>
- <string name="you_paid_ldollars_no_name">
- Vous avez payé à [AMOUNT] L$ [REASON].
- </string>
- <string name="you_paid_failure_ldollars">
- Votre paiement de [AMOUNT] L$ à [NAME] [REASON] a échoué.
- </string>
- <string name="you_paid_failure_ldollars_no_info">
- Votre paiement de [AMOUNT] L$ a échoué.
- </string>
- <string name="you_paid_failure_ldollars_no_reason">
- Votre paiement de [AMOUNT] L$ à [NAME] a échoué.
- </string>
- <string name="you_paid_failure_ldollars_no_name">
- Votre paiement de [AMOUNT] L$ [REASON] a échoué.
- </string>
- <string name="for item">
- pour l&apos;article suivant : [ITEM]
- </string>
- <string name="for a parcel of land">
- pour une parcelle de terrain
- </string>
- <string name="for a land access pass">
- pour un pass d&apos;accès au terrain
- </string>
- <string name="for deeding land">
- pour une cession de terrain
- </string>
- <string name="to create a group">
- pour créer un groupe
- </string>
- <string name="to join a group">
- pour rejoindre un groupe
- </string>
- <string name="to upload">
- pour charger
- </string>
- <string name="to publish a classified ad">
- pour publier une petite annonce
- </string>
- <string name="giving">
- Donner [AMOUNT] L$
- </string>
- <string name="uploading_costs">
- Le chargement coûte [AMOUNT] L$
- </string>
- <string name="this_costs">
- Cela coûte [AMOUNT] L$
- </string>
- <string name="buying_selected_land">
- Achat du terrain sélectionné pour [AMOUNT] L$
- </string>
- <string name="this_object_costs">
- Cet objet coûte [AMOUNT] L$
- </string>
- <string name="group_role_everyone">
- Tous
- </string>
- <string name="group_role_officers">
- Officiers
- </string>
- <string name="group_role_owners">
- Propriétaires
- </string>
- <string name="group_member_status_online">
- En ligne
- </string>
- <string name="uploading_abuse_report">
- Chargement...
-
-du rapport d&apos;infraction
- </string>
- <string name="New Shape">
- Nouvelle silhouette
- </string>
- <string name="New Skin">
- Nouvelle peau
- </string>
- <string name="New Hair">
- Nouveaux cheveux
- </string>
- <string name="New Eyes">
- Nouveaux yeux
- </string>
- <string name="New Shirt">
- Nouvelle chemise
- </string>
- <string name="New Pants">
- Nouveau pantalon
- </string>
- <string name="New Shoes">
- Nouvelles chaussures
- </string>
- <string name="New Socks">
- Nouvelles chaussettes
- </string>
- <string name="New Jacket">
- Nouvelle veste
- </string>
- <string name="New Gloves">
- Nouveaux gants
- </string>
- <string name="New Undershirt">
- Nouveau débardeur
- </string>
- <string name="New Underpants">
- Nouveau caleçon
- </string>
- <string name="New Skirt">
- Nouvelle jupe
- </string>
- <string name="New Alpha">
- Nouvel alpha
- </string>
- <string name="New Tattoo">
- Nouveau tatouage
- </string>
- <string name="New Physics">
- Nouvelles propriétés physiques
- </string>
- <string name="Invalid Wearable">
- Objet à porter non valide
- </string>
- <string name="New Gesture">
- Nouveau geste
- </string>
- <string name="New Script">
- Nouveau script
- </string>
- <string name="New Note">
- Nouvelle note
- </string>
- <string name="New Folder">
- Nouveau dossier
- </string>
- <string name="Contents">
- Contenus
- </string>
- <string name="Gesture">
- Geste
- </string>
- <string name="Male Gestures">
- Gestes masculins
- </string>
- <string name="Female Gestures">
- Gestes féminins
- </string>
- <string name="Other Gestures">
- Autres gestes
- </string>
- <string name="Speech Gestures">
- Gestes liés à la parole
- </string>
- <string name="Common Gestures">
- Gestes communs
- </string>
- <string name="Male - Excuse me">
- Homme - Demander pardon
- </string>
- <string name="Male - Get lost">
- Homme - Get lost
- </string>
- <string name="Male - Blow kiss">
- Homme - Envoyer un baiser
- </string>
- <string name="Male - Boo">
- Homme - Hou !
- </string>
- <string name="Male - Bored">
- Homme - Ennui
- </string>
- <string name="Male - Hey">
- Homme - Hé !
- </string>
- <string name="Male - Laugh">
- Homme - Rire
- </string>
- <string name="Male - Repulsed">
- Homme - Dégoût
- </string>
- <string name="Male - Shrug">
- Homme - Hausser les épaules
- </string>
- <string name="Male - Stick tougue out">
- Homme - Tirer la langue
- </string>
- <string name="Male - Wow">
- Homme - Ouah !
- </string>
- <string name="Female - Chuckle">
- Femme - Glousser
- </string>
- <string name="Female - Cry">
- Femme - Pleurer
- </string>
- <string name="Female - Embarrassed">
- Femme - Gêne
- </string>
- <string name="Female - Excuse me">
- Femme - Demander pardon
- </string>
- <string name="Female - Get lost">
- Femme - Get lost
- </string>
- <string name="Female - Blow kiss">
- Femme - Envoyer un baiser
- </string>
- <string name="Female - Boo">
- Femme - Hou !
- </string>
- <string name="Female - Bored">
- Femme - Ennui
- </string>
- <string name="Female - Hey">
- Femme - Hé !
- </string>
- <string name="Female - Hey baby">
- Femme - Hey baby
- </string>
- <string name="Female - Laugh">
- Femme - Rire
- </string>
- <string name="Female - Looking good">
- Femme - Looking good
- </string>
- <string name="Female - Over here">
- Femme - Over here
- </string>
- <string name="Female - Please">
- Femme - Please
- </string>
- <string name="Female - Repulsed">
- Femme - Dégoût
- </string>
- <string name="Female - Shrug">
- Femme - Hausser les épaules
- </string>
- <string name="Female - Stick tougue out">
- Femme - Tirer la langue
- </string>
- <string name="Female - Wow">
- Femme - Ouah !
- </string>
- <string name="/bow">
- /s&apos;incliner
- </string>
- <string name="/clap">
- /applaudir
- </string>
- <string name="/count">
- /compter
- </string>
- <string name="/extinguish">
- /éteindre
- </string>
- <string name="/kmb">
- /vatefairevoir
- </string>
- <string name="/muscle">
- /montrersesmuscles
- </string>
- <string name="/no">
- /non
- </string>
- <string name="/no!">
- /non !
- </string>
- <string name="/paper">
- /papier
- </string>
- <string name="/pointme">
- /memontrerdudoigt
- </string>
- <string name="/pointyou">
- /montrerl&apos;autredudoigt
- </string>
- <string name="/rock">
- /pierre
- </string>
- <string name="/scissor">
- /ciseaux
- </string>
- <string name="/smoke">
- /fumer
- </string>
- <string name="/stretch">
- /bailler
- </string>
- <string name="/whistle">
- /siffler
- </string>
- <string name="/yes">
- /oui
- </string>
- <string name="/yes!">
- /oui !
- </string>
- <string name="afk">
- absent
- </string>
- <string name="dance1">
- danse1
- </string>
- <string name="dance2">
- danse2
- </string>
- <string name="dance3">
- danse3
- </string>
- <string name="dance4">
- danse4
- </string>
- <string name="dance5">
- danse5
- </string>
- <string name="dance6">
- danse6
- </string>
- <string name="dance7">
- danse7
- </string>
- <string name="dance8">
- danse8
- </string>
- <string name="AvatarBirthDateFormat">
- [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
- </string>
- <string name="DefaultMimeType">
- aucun/aucun
- </string>
- <string name="texture_load_dimensions_error">
- Impossible de charger des images de taille supérieure à [WIDTH]*[HEIGHT]
- </string>
- <string name="words_separator" value=","/>
- <string name="server_is_down">
- Malgré nos efforts, une erreur inattendue s&apos;est produite.
-
- Veuillez vous reporter à status.secondlifegrid.net afin de déterminer si un problème connu existe avec ce service.
- Si le problème persiste, vérifiez la configuration de votre réseau et de votre pare-feu.
- </string>
- <string name="dateTimeWeekdaysNames">
- Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday
- </string>
- <string name="dateTimeWeekdaysShortNames">
- Sun:Mon:Tue:Wed:Thu:Fri:Sat
- </string>
- <string name="dateTimeMonthNames">
- January:February:March:April:May:June:July:August:September:October:November:December
- </string>
- <string name="dateTimeMonthShortNames">
- Jan:Feb:Mar:Apr:May:Jun:Jul:Aug:Sep:Oct:Nov:Dec
- </string>
- <string name="dateTimeDayFormat">
- [MDAY]
- </string>
- <string name="dateTimeAM">
- AM
- </string>
- <string name="dateTimePM">
- PM
- </string>
- <string name="LocalEstimateUSD">
- [AMOUNT] US$
- </string>
- <string name="Membership">
- Inscription
- </string>
- <string name="Roles">
- Rôles
- </string>
- <string name="Group Identity">
- Identité du groupe
- </string>
- <string name="Parcel Management">
- Gestion des parcelles
- </string>
- <string name="Parcel Identity">
- Identité des parcelles
- </string>
- <string name="Parcel Settings">
- Paramètres des parcelles
- </string>
- <string name="Parcel Powers">
- Pouvoirs sur les parcelles
- </string>
- <string name="Parcel Access">
- Accès aux parcelles
- </string>
- <string name="Parcel Content">
- Contenu des parcelles
- </string>
- <string name="Object Management">
- Gestion des objets
- </string>
- <string name="Accounting">
- Comptabilité
- </string>
- <string name="Notices">
- Notices
- </string>
- <string name="Chat" value=" Chat :">
- Chat
- </string>
- <string name="DeleteItems">
- Supprimer les articles sélectionnés ?
- </string>
- <string name="DeleteItem">
- Supprimer l&apos;article sélectionné ?
- </string>
- <string name="EmptyOutfitText">
- Cette tenue ne contient aucun article.
- </string>
- <string name="ExternalEditorNotSet">
- Sélectionnez un éditeur à l&apos;aide du paramètre ExternalEditor.
- </string>
- <string name="ExternalEditorNotFound">
- Éditeur externe spécifié introuvable.
-Essayez avec le chemin d&apos;accès à l&apos;éditeur entre guillemets doubles
-(par ex. : &quot;/chemin_accès/editor&quot; &quot;%s&quot;).
- </string>
- <string name="ExternalEditorCommandParseError">
- Erreur lors de l&apos;analyse de la commande d&apos;éditeur externe.
- </string>
- <string name="ExternalEditorFailedToRun">
- Échec d&apos;exécution de l&apos;éditeur externe.
- </string>
- <string name="TranslationFailed">
- Échec de traduction : [REASON]
- </string>
- <string name="TranslationResponseParseError">
- Erreur lors de l&apos;analyse de la réponse relative à la traduction.
- </string>
- <string name="Esc">
- Échap
- </string>
- <string name="Space">
- Space
- </string>
- <string name="Enter">
- Enter
- </string>
- <string name="Tab">
- Tab
- </string>
- <string name="Ins">
- Ins
- </string>
- <string name="Del">
- Del
- </string>
- <string name="Backsp">
- Backsp
- </string>
- <string name="Shift">
- Maj
- </string>
- <string name="Ctrl">
- Ctrl
- </string>
- <string name="Alt">
- Alt
- </string>
- <string name="CapsLock">
- CapsLock
- </string>
- <string name="Home">
- Début
- </string>
- <string name="End">
- End
- </string>
- <string name="PgUp">
- PgUp
- </string>
- <string name="PgDn">
- PgDn
- </string>
- <string name="F1">
- F1
- </string>
- <string name="F2">
- F2
- </string>
- <string name="F3">
- F3
- </string>
- <string name="F4">
- F4
- </string>
- <string name="F5">
- F5
- </string>
- <string name="F6">
- F6
- </string>
- <string name="F7">
- F7
- </string>
- <string name="F8">
- F8
- </string>
- <string name="F9">
- F9
- </string>
- <string name="F10">
- F10
- </string>
- <string name="F11">
- F11
- </string>
- <string name="F12">
- F12
- </string>
- <string name="Add">
- Ajouter
- </string>
- <string name="Subtract">
- Soustraire
- </string>
- <string name="Multiply">
- Multiplier
- </string>
- <string name="Divide">
- Diviser
- </string>
- <string name="PAD_DIVIDE">
- PAD_DIVIDE
- </string>
- <string name="PAD_LEFT">
- PAD_LEFT
- </string>
- <string name="PAD_RIGHT">
- PAD_RIGHT
- </string>
- <string name="PAD_DOWN">
- PAD_DOWN
- </string>
- <string name="PAD_UP">
- PAD_UP
- </string>
- <string name="PAD_HOME">
- PAD_HOME
- </string>
- <string name="PAD_END">
- PAD_END
- </string>
- <string name="PAD_PGUP">
- PAD_PGUP
- </string>
- <string name="PAD_PGDN">
- PAD_PGDN
- </string>
- <string name="PAD_CENTER">
- PAD_CENTER
- </string>
- <string name="PAD_INS">
- PAD_INS
- </string>
- <string name="PAD_DEL">
- PAD_DEL
- </string>
- <string name="PAD_Enter">
- PAD_Enter
- </string>
- <string name="PAD_BUTTON0">
- PAD_BUTTON0
- </string>
- <string name="PAD_BUTTON1">
- PAD_BUTTON1
- </string>
- <string name="PAD_BUTTON2">
- PAD_BUTTON2
- </string>
- <string name="PAD_BUTTON3">
- PAD_BUTTON3
- </string>
- <string name="PAD_BUTTON4">
- PAD_BUTTON4
- </string>
- <string name="PAD_BUTTON5">
- PAD_BUTTON5
- </string>
- <string name="PAD_BUTTON6">
- PAD_BUTTON6
- </string>
- <string name="PAD_BUTTON7">
- PAD_BUTTON7
- </string>
- <string name="PAD_BUTTON8">
- PAD_BUTTON8
- </string>
- <string name="PAD_BUTTON9">
- PAD_BUTTON9
- </string>
- <string name="PAD_BUTTON10">
- PAD_BUTTON10
- </string>
- <string name="PAD_BUTTON11">
- PAD_BUTTON11
- </string>
- <string name="PAD_BUTTON12">
- PAD_BUTTON12
- </string>
- <string name="PAD_BUTTON13">
- PAD_BUTTON13
- </string>
- <string name="PAD_BUTTON14">
- PAD_BUTTON14
- </string>
- <string name="PAD_BUTTON15">
- PAD_BUTTON15
- </string>
- <string name="-">
- -
- </string>
- <string name="=">
- =
- </string>
- <string name="`">
- `
- </string>
- <string name=";">
- ;
- </string>
- <string name="[">
- [
- </string>
- <string name="]">
- ]
- </string>
- <string name="\">
- \
- </string>
- <string name="0">
- 0
- </string>
- <string name="1">
- 1
- </string>
- <string name="2">
- 2
- </string>
- <string name="3">
- 3
- </string>
- <string name="4">
- 4
- </string>
- <string name="5">
- 5
- </string>
- <string name="6">
- 6
- </string>
- <string name="7">
- 7
- </string>
- <string name="8">
- 8
- </string>
- <string name="9">
- 9
- </string>
- <string name="A">
- A
- </string>
- <string name="B">
- B
- </string>
- <string name="C">
- C
- </string>
- <string name="D">
- D
- </string>
- <string name="E">
- E
- </string>
- <string name="F">
- F
- </string>
- <string name="G">
- G
- </string>
- <string name="H">
- H
- </string>
- <string name="I">
- I
- </string>
- <string name="J">
- J
- </string>
- <string name="K">
- K
- </string>
- <string name="L">
- L
- </string>
- <string name="M">
- M
- </string>
- <string name="N">
- N
- </string>
- <string name="O">
- O
- </string>
- <string name="P">
- P
- </string>
- <string name="Q">
- Q
- </string>
- <string name="R">
- R
- </string>
- <string name="S">
- S
- </string>
- <string name="T">
- T
- </string>
- <string name="U">
- U
- </string>
- <string name="V">
- V
- </string>
- <string name="W">
- W
- </string>
- <string name="X">
- X
- </string>
- <string name="Y">
- Y
- </string>
- <string name="Z">
- Z
- </string>
- <string name="BeaconParticle">
- Affichage des balises de particule (bleu)
- </string>
- <string name="BeaconPhysical">
- Affichage des balises d&apos;objet physique (vert)
- </string>
- <string name="BeaconScripted">
- Affichage des balises d&apos;objet scripté (rouge)
- </string>
- <string name="BeaconScriptedTouch">
- Affichage des balises d&apos;objet scripté avec fonction de toucher (rouge)
- </string>
- <string name="BeaconSound">
- Affichage des balises de son (jaune)
- </string>
- <string name="BeaconMedia">
- Affichage des balises de média (blanc)
- </string>
- <string name="ParticleHiding">
- Masquage des particules
- </string>
- <string name="Command_AboutLand_Label">
- À propos du terrain
- </string>
- <string name="Command_Appearance_Label">
- Apparence
- </string>
- <string name="Command_Avatar_Label">
- Avatar
- </string>
- <string name="Command_Build_Label">
- Construire
- </string>
- <string name="Command_Chat_Label">
- Chat
- </string>
- <string name="Command_Compass_Label">
- Boussole
- </string>
- <string name="Command_Destinations_Label">
- Destinations
- </string>
- <string name="Command_Gestures_Label">
- Gestes
- </string>
- <string name="Command_HowTo_Label">
- Aide rapide
- </string>
- <string name="Command_Inventory_Label">
- Inventaire
- </string>
- <string name="Command_Map_Label">
- Carte
- </string>
- <string name="Command_Marketplace_Label">
- Place du marché
- </string>
- <string name="Command_MiniMap_Label">
- Mini-carte
- </string>
- <string name="Command_Move_Label">
- Marcher / Courir / Voler
- </string>
- <string name="Command_Outbox_Label">
- Boîte d&apos;envoi vendeur
- </string>
- <string name="Command_People_Label">
- Personnes
- </string>
- <string name="Command_Picks_Label">
- Favoris
- </string>
- <string name="Command_Places_Label">
- Lieux
- </string>
- <string name="Command_Preferences_Label">
- Préférences
- </string>
- <string name="Command_Profile_Label">
- Profil
- </string>
- <string name="Command_Search_Label">
- Recherche
- </string>
- <string name="Command_Snapshot_Label">
- Photo
- </string>
- <string name="Command_Speak_Label">
- Parler
- </string>
- <string name="Command_View_Label">
- Paramètres de la caméra
- </string>
- <string name="Command_Voice_Label">
- Paramètres vocaux
- </string>
- <string name="Command_AboutLand_Tooltip">
- Information sur le terrain que vous visitez
- </string>
- <string name="Command_Appearance_Tooltip">
- Modifier votre avatar
- </string>
- <string name="Command_Avatar_Tooltip">
- Choisir un avatar complet
- </string>
- <string name="Command_Build_Tooltip">
- Construction d&apos;objets et remodelage du terrain
- </string>
- <string name="Command_Chat_Tooltip">
- Parler aux personnes près de vous par chat écrit
- </string>
- <string name="Command_Compass_Tooltip">
- Boussole
- </string>
- <string name="Command_Destinations_Tooltip">
- Destinations intéressantes
- </string>
- <string name="Command_Gestures_Tooltip">
- Gestes de votre avatar
- </string>
- <string name="Command_HowTo_Tooltip">
- Comment effectuer les opérations courantes
- </string>
- <string name="Command_Inventory_Tooltip">
- Afficher et utiliser vos possessions
- </string>
- <string name="Command_Map_Tooltip">
- Carte du monde
- </string>
- <string name="Command_Marketplace_Tooltip">
- Faire du shopping
- </string>
- <string name="Command_MiniMap_Tooltip">
- Afficher les personnes près de vous
- </string>
- <string name="Command_Move_Tooltip">
- Faire bouger votre avatar
- </string>
- <string name="Command_Outbox_Tooltip">
- Transférer des articles vers votre place de marché afin de les vendre.
- </string>
- <string name="Command_People_Tooltip">
- Amis, groupes et personnes près de vous
- </string>
- <string name="Command_Picks_Tooltip">
- Lieux à afficher comme favoris dans votre profil
- </string>
- <string name="Command_Places_Tooltip">
- Lieux enregistrés
- </string>
- <string name="Command_Preferences_Tooltip">
- Préférences
- </string>
- <string name="Command_Profile_Tooltip">
- Modifier ou afficher votre profil
- </string>
- <string name="Command_Search_Tooltip">
- Trouver des lieux, personnes, événements
- </string>
- <string name="Command_Snapshot_Tooltip">
- Prendre une photo
- </string>
- <string name="Command_Speak_Tooltip">
- Parler aux personnes près de vous en utilisant votre micro
- </string>
- <string name="Command_View_Tooltip">
- Changer l&apos;angle de la caméra
- </string>
- <string name="Command_Voice_Tooltip">
- Commandes de réglage du volume des appels et des personnes près de vous dans Second Life.
- </string>
- <string name="Toolbar_Bottom_Tooltip">
- actuellement dans la barre d&apos;outils du bas
- </string>
- <string name="Toolbar_Left_Tooltip">
- actuellement dans la barre d&apos;outils de gauche
- </string>
- <string name="Toolbar_Right_Tooltip">
- actuellement dans la barre d&apos;outils de droite
- </string>
- <string name="Retain%">
- Garder%
- </string>
- <string name="Detail">
- Détail
- </string>
- <string name="Better Detail">
- Meilleur détail
- </string>
- <string name="Surface">
- Surface
- </string>
- <string name="Solid">
- Solide
- </string>
- <string name="Wrap">
- Wrap
- </string>
- <string name="Preview">
- Aperçu
- </string>
- <string name="Normal">
- Normal
- </string>
- <string name="snapshot_quality_very_low">
- Très faible
- </string>
- <string name="snapshot_quality_low">
- Faible
- </string>
- <string name="snapshot_quality_medium">
- Moyenne
- </string>
- <string name="snapshot_quality_high">
- Élevée
- </string>
- <string name="snapshot_quality_very_high">
- Très élevée
- </string>
-</strings>
diff --git a/indra/newview/skins/steam/xui/it/strings.xml b/indra/newview/skins/steam/xui/it/strings.xml
deleted file mode 100644
index 0fcc4e0820..0000000000
--- a/indra/newview/skins/steam/xui/it/strings.xml
+++ /dev/null
@@ -1,4928 +0,0 @@
-<?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
- 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="SUPPORT_SITE">
- Portale di supporto di Second Life
- </string>
- <string name="StartupDetectingHardware">
- Ricerca hardware...
- </string>
- <string name="StartupLoading">
- Caricamento di [APP_NAME]...
- </string>
- <string name="StartupClearingCache">
- Pulizia della cache...
- </string>
- <string name="StartupInitializingTextureCache">
- Inizializzazione della cache texture...
- </string>
- <string name="StartupInitializingVFS">
- Inizializzazione VFS...
- </string>
- <string name="StartupRequireDriverUpdate">
- Inizializzazione grafica non riuscita. Aggiorna il driver della scheda grafica!
- </string>
- <string name="ProgressRestoring">
- Ripristino in corso...
- </string>
- <string name="ProgressChangingResolution">
- Modifica della risoluzione...
- </string>
- <string name="Fullbright">
- Luminosità massima (vers. precedente)
- </string>
- <string name="LoginInProgress">
- In connessione. [APP_NAME] può sembrare rallentata. Attendi.
- </string>
- <string name="LoginInProgressNoFrozen">
- Accesso in corso...
- </string>
- <string name="LoginAuthenticating">
- In autenticazione
- </string>
- <string name="LoginMaintenance">
- Aggiornamento account in corso...
- </string>
- <string name="LoginAttempt">
- Un precedente tentativo di login è fallito. Tentativo di connessione [NUMBER]
- </string>
- <string name="LoginPrecaching">
- Sto caricando [SECOND_LIFE]...
- </string>
- <string name="LoginInitializingBrowser">
- Inizializzazione del browser web incorporato...
- </string>
- <string name="LoginInitializingMultimedia">
- Inizializzazione dati multimediali...
- </string>
- <string name="LoginInitializingFonts">
- Caricamento caratteri...
- </string>
- <string name="LoginVerifyingCache">
- Verifica file della cache (tempo previsto 60-90 secondi)...
- </string>
- <string name="LoginProcessingResponse">
- Elaborazione risposta...
- </string>
- <string name="LoginInitializingWorld">
- Inizializzazione mondo...
- </string>
- <string name="LoginDecodingImages">
- Decodifica immagini...
- </string>
- <string name="LoginInitializingQuicktime">
- Inizializzazione QuickTime...
- </string>
- <string name="LoginQuicktimeNotFound">
- QuickTime non trovato - impossibile inizializzare.
- </string>
- <string name="LoginQuicktimeOK">
- QuickTime configurato con successo.
- </string>
- <string name="LoginRequestSeedCapGrant">
- Richiesta capacità regione...
- </string>
- <string name="LoginRetrySeedCapGrant">
- Richiesta capacità regione, tentativo [NUMBER]...
- </string>
- <string name="LoginWaitingForRegionHandshake">
- In attesa della risposta della regione...
- </string>
- <string name="LoginConnectingToRegion">
- Connessione alla regione...
- </string>
- <string name="LoginDownloadingClothing">
- Sto caricando i vestiti...
- </string>
- <string name="InvalidCertificate">
- Il server ha inviato un certificato non valido o errato. Rivolgiti all&apos;amministratore della griglia.
- </string>
- <string name="CertInvalidHostname">
- Per accedere al server è stato utilizzato un nome host non valido; controlla lo SLURL o il nome host della griglia.
- </string>
- <string name="CertExpired">
- Il certificato inviato dalla griglia sembra essere scaduto. Controlla l&apos;orologio del sistema o rivolgiti all&apos;amministratore della griglia.
- </string>
- <string name="CertKeyUsage">
- Impossibile utilizzare per SSl il certificato inviato dal server. Rivolgiti all&apos;amministratore della griglia.
- </string>
- <string name="CertBasicConstraints">
- Nella catena dei certificati del server erano presenti troppi certificati. Rivolgiti all&apos;amministratore della griglia.
- </string>
- <string name="CertInvalidSignature">
- Impossibile verificare la firma del certificato inviato dal server della griglia. Rivolgiti all&apos;amministratore della griglia.
- </string>
- <string name="LoginFailedNoNetwork">
- Errore di rete: Non è stato possibile stabilire un collegamento, controlla la tua connessione.
- </string>
- <string name="LoginFailed">
- Accesso non riuscito.
- </string>
- <string name="Quit">
- Esci
- </string>
- <string name="create_account_url">
- http://join.secondlife.com/index.php?sourceid=1206_steam&amp;lang=it-IT
- </string>
- <string name="LoginFailedViewerNotPermitted">
- Il viewer utilizzato non è più in grado di accedere a Second Life. Visita la parina seguente per scaricare un nuovo viewer:
-http://secondlife.com/download.
-
-Per maggiori informazioni, consulta le domande frequenti alla pagina seguente:
-http://secondlife.com/viewer-access-faq
- </string>
- <string name="LoginIntermediateOptionalUpdateAvailable">
- Disponibile aggiornamento facoltativo viewer: [VERSION]
- </string>
- <string name="LoginFailedRequiredUpdate">
- Aggernamento viewer richiesto: [VERSION]
- </string>
- <string name="LoginFailedAlreadyLoggedIn">
- Questo agente ha già eseguito il login.
- </string>
- <string name="LoginFailedAuthenticationFailed">
- Siamo spiacenti. Il tentativo di accesso non è riuscito.
-Verifica di avere inserito correttamente
- * Nome utente (come robby12 o Stella Soleggiato)
- * Password
-Verifica anche che il blocco delle maiuscole non sia attivato.
- </string>
- <string name="LoginFailedPasswordChanged">
- Come misura precauzionale, la tua password è stata cambiata.
-Visita la pagina del tuo account a http://secondlife.com/password
-e rispondi alla domanda di sicurezza per reimpostare la password.
-Ci scusiamo per l&apos;inconveniente.
- </string>
- <string name="LoginFailedPasswordReset">
- Abbiamo effettuato delle modifiche al sistema che richiedono di reimpostare la password.
-Visita la pagina del tuo account a http://secondlife.com/password
-e rispondi alla domanda di sicurezza per reimpostare la password.
-Ci scusiamo per l&apos;inconveniente.
- </string>
- <string name="LoginFailedEmployeesOnly">
- Second Life è chiuso temporaneamente per manutenzione.
-Al momento, solo i dipendenti possono eseguire l&apos;accesso.
-Visita www.secondlife.com/status per aggiornamenti.
- </string>
- <string name="LoginFailedPremiumOnly">
- L&apos;accesso a Second Life è temporaneamente limitato per garantire che chi è nel mondo virtuale abbia la migliore esperienza possibile.
-
-Le persone con account gratuiti non potranno accedere a Second Life durante questo periodo, per lasciare spazio alle persone che hanno pagato per Second Life.
- </string>
- <string name="LoginFailedComputerProhibited">
- Non si può accedere a Second Life da questo computer.
-Se ritieni che si tratta di un errore, contatta
-support@secondlife.com.
- </string>
- <string name="LoginFailedAcountSuspended">
- Il tuo account non è accessibile fino alle
-[TIME] fuso orario del Pacifico.
- </string>
- <string name="LoginFailedAccountDisabled">
- Non siamo attualmente in grado di completare la tua richiesta.
-Contatta l&apos;assistenza Second Life alla pagina http://secondlife.com/support.
-Se non sei in grado di cambiare la password, chiama (866) 476-9763.
- </string>
- <string name="LoginFailedTransformError">
- Dati incompatibili rilevati durante l&apos;accesso.
-Contattare support@secondlife.com.
- </string>
- <string name="LoginFailedAccountMaintenance">
- Il tuo account è in fase di leggera manutenzione.
-Il tuo account non è accessibile fino alle
-[TIME] fuso orario del Pacifico.
-Se ritieni che si tratta di un errore, contatta support@secondlife.com.
- </string>
- <string name="LoginFailedPendingLogoutFault">
- Errore del simulatore in seguito alla richiesta di logout.
- </string>
- <string name="LoginFailedPendingLogout">
- Il sistema sta eseguendo il logout in questo momento.
-Il tuo account non sarà disponibile fino alle
-[TIME] fuso orario del Pacifico.
- </string>
- <string name="LoginFailedUnableToCreateSession">
- Non è possibile creare una sessione valida.
- </string>
- <string name="LoginFailedUnableToConnectToSimulator">
- Non è possibile collegarsi a un simulatore.
- </string>
- <string name="LoginFailedRestrictedHours">
- Il tuo account può accedere a Second Life solo
-tra le [START] e le [END] fuso orario del Pacifico.
-Torna durante quell&apos;orario.
-Se ritieni che si tratta di un errore, contatta support@secondlife.com.
- </string>
- <string name="LoginFailedIncorrectParameters">
- Parametri errati.
-Se ritieni che si tratta di un errore, contatta support@secondlife.com.
- </string>
- <string name="LoginFailedFirstNameNotAlphanumeric">
- Il parametro Nome deve includere solo caratteri alfanumerici.
-Se ritieni che si tratta di un errore, contatta support@secondlife.com.
- </string>
- <string name="LoginFailedLastNameNotAlphanumeric">
- Il parametro Cognome deve includere solo caratteri alfanumerici.
-Se ritieni che si tratta di un errore, contatta support@secondlife.com.
- </string>
- <string name="LogoutFailedRegionGoingOffline">
- La regione sta passando allo stato non in linea.
-Prova ad accedere nuovamente tra un minuto.
- </string>
- <string name="LogoutFailedAgentNotInRegion">
- L&apos;agente non è nella regione.
-Prova ad accedere nuovamente tra un minuto.
- </string>
- <string name="LogoutFailedPendingLogin">
- La regione ha eseguito l&apos;accesso in un&apos;altre sessione.
-Prova ad accedere nuovamente tra un minuto.
- </string>
- <string name="LogoutFailedLoggingOut">
- La regione stava eseguendo il logout della sessione precedente.
-Prova ad accedere nuovamente tra un minuto.
- </string>
- <string name="LogoutFailedStillLoggingOut">
- La regione sta ancora eseguendo il logout della sessione precedente.
-Prova ad accedere nuovamente tra un minuto.
- </string>
- <string name="LogoutSucceeded">
- La regione ha eseguito il logout dell&apos;ultima sessione.
-Prova ad accedere nuovamente tra un minuto.
- </string>
- <string name="LogoutFailedLogoutBegun">
- La regione ha iniziato la procedura di logout.
-Prova ad accedere nuovamente tra un minuto.
- </string>
- <string name="LoginFailedLoggingOutSession">
- Il sistema ha iniziato il logout dell&apos;ultima sessione.
-Prova ad accedere nuovamente tra un minuto.
- </string>
- <string name="AgentLostConnection">
- Questa regione sta avendo problemi. Verifica la tua connessione a Internet.
- </string>
- <string name="SavingSettings">
- Salvataggio delle impostazioni...
- </string>
- <string name="LoggingOut">
- Uscita...
- </string>
- <string name="ShuttingDown">
- Chiusura...
- </string>
- <string name="YouHaveBeenDisconnected">
- Sei scollegato dalla regione in cui ti trovavi.
- </string>
- <string name="SentToInvalidRegion">
- Sei stato indirizzato in una regione non valida.
- </string>
- <string name="TestingDisconnect">
- Verifica scollegamento viewer
- </string>
- <string name="TooltipPerson">
- Persona
- </string>
- <string name="TooltipNoName">
- (nessun nome)
- </string>
- <string name="TooltipOwner">
- Proprietario:
- </string>
- <string name="TooltipPublic">
- Pubblico
- </string>
- <string name="TooltipIsGroup">
- (Gruppo)
- </string>
- <string name="TooltipForSaleL$">
- In Vendita: [AMOUNT]L$
- </string>
- <string name="TooltipFlagGroupBuild">
- Costruzione solo con gruppo
- </string>
- <string name="TooltipFlagNoBuild">
- Divieto di Costruire
- </string>
- <string name="TooltipFlagNoEdit">
- Costruzione solo con gruppo
- </string>
- <string name="TooltipFlagNotSafe">
- Non Sicuro
- </string>
- <string name="TooltipFlagNoFly">
- Divieto di Volare
- </string>
- <string name="TooltipFlagGroupScripts">
- Script solo con gruppo
- </string>
- <string name="TooltipFlagNoScripts">
- Script vietati
- </string>
- <string name="TooltipLand">
- Terreno:
- </string>
- <string name="TooltipMustSingleDrop">
- Solo un singolo oggetto può essere creato qui
- </string>
- <string name="TooltipPrice" value="L$ [AMOUNT]:"/>
- <string name="TooltipOutboxDragToWorld">
- Non puoi rezzare elementi nella tua casella in uscita del rivenditore
- </string>
- <string name="TooltipOutboxNoTransfer">
- Almeno uno di questi oggetti non può essere venduto o trasferito.
- </string>
- <string name="TooltipOutboxNotInInventory">
- La tua casella in uscita del rivenditore può accettare solo elementi provenienti dal tuo inventario
- </string>
- <string name="TooltipOutboxWorn">
- Non puoi mettere gli elementi che indossi nella casella in uscita del rivenditore
- </string>
- <string name="TooltipOutboxCallingCard">
- Non puoi inserire il tuo biglietto da visita nella tua casella in uscita del rivenditore
- </string>
- <string name="TooltipOutboxFolderLevels">
- La profondità delle caselle nidificate è maggiore di 3
- </string>
- <string name="TooltipOutboxTooManyFolders">
- Il numero di sottocartelle nella cartella al livello più alto è maggiore di 20
- </string>
- <string name="TooltipOutboxTooManyObjects">
- Il numero di elementi nella cartella al livello più alto è maggiore di 200
- </string>
- <string name="TooltipDragOntoOwnChild">
- Non puoi spostare una cartella nella relativa cartella secondaria
- </string>
- <string name="TooltipDragOntoSelf">
- Non puoi spostare una cartella in se stessa
- </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 di questo residente
- </string>
- <string name="TooltipAgentInspect">
- Ulteriori informazioni su questo Residente
- </string>
- <string name="TooltipAgentMute">
- Clicca per disattivare l&apos;audio di questo residente
- </string>
- <string name="TooltipAgentUnmute">
- Clicca per attivare l&apos;audio del residente
- </string>
- <string name="TooltipAgentIM">
- Clicca per inviare un IM a questo residente
- </string>
- <string name="TooltipAgentPay">
- Clicca per pagare il residente
- </string>
- <string name="TooltipAgentOfferTeleport">
- Fai clic per inviare un&apos;offerta di teleport al residente
- </string>
- <string name="TooltipAgentRequestFriend">
- Fai clic per inviare una richiesta di amicizia al residente
- </string>
- <string name="TooltipGroupUrl">
- Clicca per vedere la descrizione del gruppo
- </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 del lotto
- </string>
- <string name="TooltipTeleportUrl">
- Clicca per effettuare il teleport 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="SLappAgentMute">
- Disattiva audio
- </string>
- <string name="SLappAgentUnmute">
- Riattiva audio
- </string>
- <string name="SLappAgentIM">
- IM
- </string>
- <string name="SLappAgentPay">
- Paga
- </string>
- <string name="SLappAgentOfferTeleport">
- Offri teleport a
- </string>
- <string name="SLappAgentRequestFriend">
- Richiesta di amicizia
- </string>
- <string name="BUTTON_CLOSE_DARWIN">
- Chiudi (⌘W)
- </string>
- <string name="BUTTON_CLOSE_WIN">
- Chiudi (Ctrl+W)
- </string>
- <string name="BUTTON_CLOSE_CHROME">
- Chiudi
- </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_HELP">
- Mostra Aiuto
- </string>
- <string name="Searching">
- Ricerca in corso...
- </string>
- <string name="NoneFound">
- Nessun risultato.
- </string>
- <string name="RetrievingData">
- Recupero dati in corso...
- </string>
- <string name="ReleaseNotes">
- Note sulla versione
- </string>
- <string name="RELEASE_NOTES_BASE_URL">
- http://wiki.secondlife.com/wiki/Release_Notes/
- </string>
- <string name="LoadingData">
- In caricamento...
- </string>
- <string name="AvatarNameNobody">
- (nessuno)
- </string>
- <string name="AvatarNameWaiting">
- (in attesa)
- </string>
- <string name="GroupNameNone">
- (nessuno)
- </string>
- <string name="AvalineCaller">
- Chiamante Avaline [ORDER]
- </string>
- <string name="AssetErrorNone">
- Nessun errore
- </string>
- <string name="AssetErrorRequestFailed">
- Richiesta risorsa: fallita
- </string>
- <string name="AssetErrorNonexistentFile">
- Richiesta risorsa: file non esistente
- </string>
- <string name="AssetErrorNotInDatabase">
- Richiesta risorsa: risorsa non trovata nel database
- </string>
- <string name="AssetErrorEOF">
- Fine del file
- </string>
- <string name="AssetErrorCannotOpenFile">
- Apertura del file non possibile
- </string>
- <string name="AssetErrorFileNotFound">
- File non trovato
- </string>
- <string name="AssetErrorTCPTimeout">
- Tempo esaurito per il trasferimento file
- </string>
- <string name="AssetErrorCircuitGone">
- Circuito perso
- </string>
- <string name="AssetErrorPriceMismatch">
- Il programma e il server non combaciano nel prezzo
- </string>
- <string name="AssetErrorUnknownStatus">
- Stato sconosciuto
- </string>
- <string name="texture">
- texture
- </string>
- <string name="sound">
- suono
- </string>
- <string name="calling card">
- biglietto da visita
- </string>
- <string name="landmark">
- punto di riferimento
- </string>
- <string name="legacy script">
- script (vecchia versione)
- </string>
- <string name="clothing">
- vestiario
- </string>
- <string name="object">
- oggetto
- </string>
- <string name="note card">
- biglietto
- </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="symbolic folder link">
- link alla cartella
- </string>
- <string name="mesh">
- reticolo
- </string>
- <string name="AvatarEditingAppearance">
- (Modifica Aspetto)
- </string>
- <string name="AvatarAway">
- Assente
- </string>
- <string name="AvatarBusy">
- Occupato
- </string>
- <string name="AvatarMuted">
- Mutato
- </string>
- <string name="anim_express_afraid">
- Dispiaciuto
- </string>
- <string name="anim_express_anger">
- Arrabbiato
- </string>
- <string name="anim_away">
- Assente
- </string>
- <string name="anim_backflip">
- Salto all&apos;indietro
- </string>
- <string name="anim_express_laugh">
- Ridere a crepapelle
- </string>
- <string name="anim_express_toothsmile">
- Gran sorriso
- </string>
- <string name="anim_blowkiss">
- Lancia un bacio
- </string>
- <string name="anim_express_bored">
- Noia
- </string>
- <string name="anim_bow">
- Inchino
- </string>
- <string name="anim_clap">
- Applauso
- </string>
- <string name="anim_courtbow">
- Inchino a corte
- </string>
- <string name="anim_express_cry">
- Pianto
- </string>
- <string name="anim_dance1">
- Ballo 1
- </string>
- <string name="anim_dance2">
- Ballo 2
- </string>
- <string name="anim_dance3">
- Ballo 3
- </string>
- <string name="anim_dance4">
- Ballo 4
- </string>
- <string name="anim_dance5">
- Ballo 5
- </string>
- <string name="anim_dance6">
- Ballo 6
- </string>
- <string name="anim_dance7">
- Ballo 7
- </string>
- <string name="anim_dance8">
- Dance 8
- </string>
- <string name="anim_express_disdain">
- Sdegno
- </string>
- <string name="anim_drink">
- Bere
- </string>
- <string name="anim_express_embarrased">
- Imbarazzo
- </string>
- <string name="anim_angry_fingerwag">
- Negare col dito
- </string>
- <string name="anim_fist_pump">
- Esultare con pugno
- </string>
- <string name="anim_yoga_float">
- Yoga fluttuante
- </string>
- <string name="anim_express_frown">
- Acciglio
- </string>
- <string name="anim_impatient">
- Impazienza
- </string>
- <string name="anim_jumpforjoy">
- Salto di gioia
- </string>
- <string name="anim_kissmybutt">
- Baciami il sedere
- </string>
- <string name="anim_express_kiss">
- Bacio
- </string>
- <string name="anim_laugh_short">
- Risata
- </string>
- <string name="anim_musclebeach">
- Muscoli da spiaggia
- </string>
- <string name="anim_no_unhappy">
- No (Scontento)
- </string>
- <string name="anim_no_head">
- No
- </string>
- <string name="anim_nyanya">
- Na-na-na
- </string>
- <string name="anim_punch_onetwo">
- Uno-due pugno
- </string>
- <string name="anim_express_open_mouth">
- Bocca aperta
- </string>
- <string name="anim_peace">
- Pace
- </string>
- <string name="anim_point_you">
- Indicare altri
- </string>
- <string name="anim_point_me">
- Indicare te stesso
- </string>
- <string name="anim_punch_l">
- Pugno a sinistra
- </string>
- <string name="anim_punch_r">
- Pugno a destra
- </string>
- <string name="anim_rps_countdown">
- Contare nella morra cinese
- </string>
- <string name="anim_rps_paper">
- Carta nella morra cinese
- </string>
- <string name="anim_rps_rock">
- Sasso nella morra cinese
- </string>
- <string name="anim_rps_scissors">
- Forbici nella morra cinese
- </string>
- <string name="anim_express_repulsed">
- Repulsione
- </string>
- <string name="anim_kick_roundhouse_r">
- Calcio con rotazione
- </string>
- <string name="anim_express_sad">
- Triste
- </string>
- <string name="anim_salute">
- Saluto
- </string>
- <string name="anim_shout">
- Urlo
- </string>
- <string name="anim_express_shrug">
- Spallucce
- </string>
- <string name="anim_express_smile">
- Sorriso
- </string>
- <string name="anim_smoke_idle">
- Fumare
- </string>
- <string name="anim_smoke_inhale">
- Fumare inspirazione
- </string>
- <string name="anim_smoke_throw_down">
- Fumare mandando giù
- </string>
- <string name="anim_express_surprise">
- Sorpresa
- </string>
- <string name="anim_sword_strike_r">
- Colpo di spada
- </string>
- <string name="anim_angry_tantrum">
- Collera
- </string>
- <string name="anim_express_tongue_out">
- Linguaccia
- </string>
- <string name="anim_hello">
- Saluto con mano
- </string>
- <string name="anim_whisper">
- Sussurro
- </string>
- <string name="anim_whistle">
- Fischio
- </string>
- <string name="anim_express_wink">
- Ammicca
- </string>
- <string name="anim_wink_hollywood">
- Ammicca (Hollywood)
- </string>
- <string name="anim_express_worry">
- Preoccupato
- </string>
- <string name="anim_yes_happy">
- Si (Felice)
- </string>
- <string name="anim_yes_head">
- Si
- </string>
- <string name="multiple_textures">
- Multiple
- </string>
- <string name="texture_loading">
- Caricamento in corso...
- </string>
- <string name="worldmap_offline">
- Offline
- </string>
- <string name="worldmap_item_tooltip_format">
- L$ [PRICE] - [AREA] m²
- </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="reconnect_nearby">
- Sarai riconnesso alla chat vocale nei dintorni
- </string>
- <string name="ScriptQuestionCautionChatGranted">
- A &apos;[OBJECTNAME]&apos;, un oggetto di proprietà di &apos;[OWNERNAME]&apos;, situato in [REGIONNAME] [REGIONPOS], è stato concesso il permesso di: [PERMISSIONS].
- </string>
- <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">
- Generale
- </string>
- <string name="SIM_ACCESS_MATURE">
- Moderato
- </string>
- <string name="SIM_ACCESS_ADULT">
- Adulti
- </string>
- <string name="SIM_ACCESS_DOWN">
- Offline
- </string>
- <string name="SIM_ACCESS_MIN">
- Sconosciuto
- </string>
- <string name="land_type_unknown">
- (sconosciuto)
- </string>
- <string name="Estate / Full Region">
- Proprietà immobiliare / Regione completa
- </string>
- <string name="Estate / Homestead">
- Proprietà immobiliare / Homestead
- </string>
- <string name="Mainland / Homestead">
- Continente / Homestead
- </string>
- <string name="Mainland / Full Region">
- Continente / Regione completa
- </string>
- <string name="all_files">
- Tutti i file
- </string>
- <string name="sound_files">
- Suoni
- </string>
- <string name="animation_files">
- Animazioni
- </string>
- <string name="image_files">
- Immagini
- </string>
- <string name="save_file_verb">
- Salva
- </string>
- <string name="load_file_verb">
- Carica
- </string>
- <string name="targa_image_files">
- Immagini Targa
- </string>
- <string name="bitmap_image_files">
- Immagini Bitmap
- </string>
- <string name="avi_movie_file">
- File video AVI
- </string>
- <string name="xaf_animation_file">
- File animazione XAF
- </string>
- <string name="xml_file">
- File XML
- </string>
- <string name="raw_file">
- File RAW
- </string>
- <string name="compressed_image_files">
- Immagini compresse
- </string>
- <string name="load_files">
- Carica i file
- </string>
- <string name="choose_the_directory">
- Scegli la cartella
- </string>
- <string name="script_files">
- Script
- </string>
- <string name="AvatarSetNotAway">
- Imposta come non assente
- </string>
- <string name="AvatarSetAway">
- Imposta come assente
- </string>
- <string name="AvatarSetNotBusy">
- Imposta come non occupato
- </string>
- <string name="AvatarSetBusy">
- Imposta come occupato
- </string>
- <string name="shape">
- Figura corporea
- </string>
- <string name="skin">
- Pelle
- </string>
- <string name="hair">
- Capigliature
- </string>
- <string name="eyes">
- Occhi
- </string>
- <string name="shirt">
- Camicia
- </string>
- <string name="pants">
- Pantaloni
- </string>
- <string name="shoes">
- Scarpe
- </string>
- <string name="socks">
- Calzini
- </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="physics">
- Fisica
- </string>
- <string name="invalid">
- non valido
- </string>
- <string name="none">
- nessuno
- </string>
- <string name="shirt_not_worn">
- Camicia non indossata
- </string>
- <string name="pants_not_worn">
- Pantaloni non indossati
- </string>
- <string name="shoes_not_worn">
- Scarpe non indossate
- </string>
- <string name="socks_not_worn">
- Calzini non indossati
- </string>
- <string name="jacket_not_worn">
- Giacca non indossata
- </string>
- <string name="gloves_not_worn">
- Guanti non indossati
- </string>
- <string name="undershirt_not_worn">
- Maglietta intima non indossata
- </string>
- <string name="underpants_not_worn">
- Slip non indossati
- </string>
- <string name="skirt_not_worn">
- Gonna non indossata
- </string>
- <string name="alpha_not_worn">
- Alpha non portato
- </string>
- <string name="tattoo_not_worn">
- Tatuaggio non portato
- </string>
- <string name="physics_not_worn">
- Fisica non indossata
- </string>
- <string name="invalid_not_worn">
- non valido
- </string>
- <string name="create_new_shape">
- Crea nuova figura corporea
- </string>
- <string name="create_new_skin">
- Crea nuova pelle
- </string>
- <string name="create_new_hair">
- Crea nuovi capelli
- </string>
- <string name="create_new_eyes">
- Crea nuovi occhi
- </string>
- <string name="create_new_shirt">
- Crea nuova camicia
- </string>
- <string name="create_new_pants">
- Crea nuovi pantaloni
- </string>
- <string name="create_new_shoes">
- Crea nuove scarpe
- </string>
- <string name="create_new_socks">
- Crea nuove calze
- </string>
- <string name="create_new_jacket">
- Crea nuova giacca
- </string>
- <string name="create_new_gloves">
- Crea nuovi guanti
- </string>
- <string name="create_new_undershirt">
- Crea nuova maglietta intima
- </string>
- <string name="create_new_underpants">
- Crea nuovi slip
- </string>
- <string name="create_new_skirt">
- Crea nuova gonna
- </string>
- <string name="create_new_alpha">
- Crea nuovo Alpha
- </string>
- <string name="create_new_tattoo">
- Crea un nuovo tatuaggio
- </string>
- <string name="create_new_physics">
- Crea nuova fisica
- </string>
- <string name="create_new_invalid">
- non valido
- </string>
- <string name="NewWearable">
- Nuovo [WEARABLE_ITEM]
- </string>
- <string name="next">
- Avanti
- </string>
- <string name="ok">
- OK
- </string>
- <string name="GroupNotifyGroupNotice">
- Avviso di gruppo
- </string>
- <string name="GroupNotifyGroupNotices">
- Avvisi di gruppo
- </string>
- <string name="GroupNotifySentBy">
- Inviato da
- </string>
- <string name="GroupNotifyAttached">
- Allegato:
- </string>
- <string name="GroupNotifyViewPastNotices">
- Visualizza gli avvisi precedenti 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 Teleport
- </string>
- <string name="StartUpNotifications">
- Mentre eri assente sono arrivate nuove notifiche...
- </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 visualizzazione normale
- </string>
- <string name="InventoryNoMatchingItems">
- Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/all/[SEARCH_TERM] Cerca].
- </string>
- <string name="PlacesNoMatchingItems">
- Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/places/[SEARCH_TERM] Cerca].
- </string>
- <string name="FavoritesNoMatchingItems">
- Trascina qui un punto di riferimento per aggiungerlo ai Preferiti.
- </string>
- <string name="InventoryNoTexture">
- Non hai una copia di questa texture nel tuo inventario
- </string>
- <string name="InventoryInboxNoItems">
- Gli acquissti dal mercato verranno mostrati qui. Potrai quindi trascinarli nel tuo inventario per usarli.
- </string>
- <string name="MarketplaceURL">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
- </string>
- <string name="MarketplaceURL_CreateStore">
- http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
- </string>
- <string name="MarketplaceURL_Dashboard">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
- </string>
- <string name="MarketplaceURL_Imports">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
- </string>
- <string name="MarketplaceURL_LearnMore">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
- </string>
- <string name="InventoryOutboxNotMerchantTitle">
- Chiunque può vendere oggetti nel Marketplace.
- </string>
- <string name="InventoryOutboxNotMerchantTooltip"/>
- <string name="InventoryOutboxNotMerchant">
- Per diventare un venditore, devi [[MARKETPLACE_CREATE_STORE_URL] creare un negozio nel Marketplace].
- </string>
- <string name="InventoryOutboxNoItemsTitle">
- La tua casella in uscita è vuota.
- </string>
- <string name="InventoryOutboxNoItemsTooltip"/>
- <string name="InventoryOutboxNoItems">
- Trascina le cartelle in questa area e clicca su &quot;Invia a Marketplace&quot; per metterle in vendita su [[MARKETPLACE_DASHBOARD_URL] Marketplace].
- </string>
- <string name="Marketplace Error None">
- Nessun errore
- </string>
- <string name="Marketplace Error Not Merchant">
- Errore: Prima di inviare elementi al Marketplace devi essere impostato come rivenditore (gratis).
- </string>
- <string name="Marketplace Error Empty Folder">
- Errore: questa cartella non include alcun contenuto.
- </string>
- <string name="Marketplace Error Unassociated Products">
- Errore: Oggetto non caricato perché il tuo account venditore ha troppi oggetti che non sono associati con dei prodotti. Per risolvere questo errore, esegui l&apos;accesso al sito di Marketplace e riduci il numero di oggetti non associati.
- </string>
- <string name="Marketplace Error Object Limit">
- Errore: questo elemento contiene troppi oggetti. Per risolvere questo problema, inserisci più oggetti insieme in una scatola per ridurre a meno di 200 il numero totale di oggetti.
- </string>
- <string name="Marketplace Error Folder Depth">
- Errore: questo elemento contiene troppi livelli di cartelle nidificate. Riorganizzalo per ottenere un massimo di 3 livelli di cartelle nidificate.
- </string>
- <string name="Marketplace Error Unsellable Item">
- Errore: Questo elemento non può essere venduto nel Marketplace.
- </string>
- <string name="Marketplace Error Internal Import">
- Errore: problema con questo elemento. Riprova più tardi.
- </string>
- <string name="Open landmarks">
- Apri luoghi di riferimento
- </string>
- <string name="no_transfer" value="(nessun trasferimento)"/>
- <string name="no_modify" value="(nessuna modifica)"/>
- <string name="no_copy" value="(nessuna copia)"/>
- <string name="worn" value="(indossato)"/>
- <string name="link" value="(link)"/>
- <string name="broken_link" value="(broken_link)&quot;"/>
- <string name="LoadingContents">
- Caricamento del contenuto...
- </string>
- <string name="NoContents">
- Nessun contenuto
- </string>
- <string name="WornOnAttachmentPoint" value="(indossato su [ATTACHMENT_POINT])"/>
- <string name="ActiveGesture" value="[GESLABEL] (attivo)"/>
- <string name="Chat Message" value="Chat:"/>
- <string name="Sound" value="Suono :"/>
- <string name="Wait" value="--- Attendi :"/>
- <string name="AnimFlagStop" value="Ferma l&apos;animazione :"/>
- <string name="AnimFlagStart" value="Inizia l&apos;animazione :"/>
- <string name="Wave" value="Saluta con la mano"/>
- <string name="GestureActionNone" value="Nessuna"/>
- <string name="HelloAvatar" value="Ciao, avatar!"/>
- <string name="ViewAllGestures" value="Visualizza tutto &gt;&gt;"/>
- <string name="GetMoreGestures" value="Altre &gt;&gt;"/>
- <string name="Animations" value="Animazioni,"/>
- <string name="Calling Cards" value="Biglietti da visita,"/>
- <string name="Clothing" value="Vestiti,"/>
- <string name="Gestures" value="Gesture,"/>
- <string name="Landmarks" value="Punti di riferimento,"/>
- <string name="Notecards" value="Biglietti,"/>
- <string name="Objects" value="Oggetti,"/>
- <string name="Scripts" value="Script,"/>
- <string name="Sounds" value="Suoni,"/>
- <string name="Textures" value="Texture,"/>
- <string name="Snapshots" value="Fotografie,"/>
- <string name="No Filters" value="No"/>
- <string name="Since Logoff" value="- Dall&apos;uscita"/>
- <string name="InvFolder My Inventory">
- Il mio inventario
- </string>
- <string name="InvFolder Library">
- Libreria
- </string>
- <string name="InvFolder Textures">
- Texture
- </string>
- <string name="InvFolder Sounds">
- Suoni
- </string>
- <string name="InvFolder Calling Cards">
- Biglietti da visita
- </string>
- <string name="InvFolder Landmarks">
- Punti di riferimento
- </string>
- <string name="InvFolder Scripts">
- Script
- </string>
- <string name="InvFolder Clothing">
- Vestiario
- </string>
- <string name="InvFolder Objects">
- Oggetti
- </string>
- <string name="InvFolder Notecards">
- Biglietti
- </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">
- I miei preferiti
- </string>
- <string name="InvFolder favorite">
- I miei preferiti
- </string>
- <string name="InvFolder Current Outfit">
- Abbigliamento attuale
- </string>
- <string name="InvFolder Initial Outfits">
- Vestiario iniziale
- </string>
- <string name="InvFolder My Outfits">
- Il mio vestiario
- </string>
- <string name="InvFolder Accessories">
- Accessori
- </string>
- <string name="InvFolder Meshes">
- Reticoli
- </string>
- <string name="InvFolder Friends">
- Amici
- </string>
- <string name="InvFolder All">
- Tutto
- </string>
- <string name="no_attachments">
- Nessun allegato indossato
- </string>
- <string name="Attachments remain">
- Allegati ([COUNT] spazi restanti)
- </string>
- <string name="Buy">
- Acquista
- </string>
- <string name="BuyforL$">
- Acquista 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">
- Maiusc
- </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="Neck">
- Collo
- </string>
- <string name="Avatar Center">
- Centro avatar
- </string>
- <string name="Invalid Attachment">
- Punto di collegamento non valido
- </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] iscritto
- </string>
- <string name="GroupMembersB">
- [COUNT] iscritti
- </string>
- <string name="GroupMembersC">
- [COUNT] iscritti
- </string>
- <string name="AcctTypeResident">
- Residente
- </string>
- <string name="AcctTypeTrial">
- In prova
- </string>
- <string name="AcctTypeCharterMember">
- Socio onorario
- </string>
- <string name="AcctTypeEmployee">
- Dipendente 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 disponibile
- </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">
- Azzera avanzamento
- </string>
- <string name="ResetQueueStart">
- azzera
- </string>
- <string name="RunQueueTitle">
- Attiva avanzamento
- </string>
- <string name="RunQueueStart">
- attiva
- </string>
- <string name="NotRunQueueTitle">
- Disattiva avanzamento
- </string>
- <string name="NotRunQueueStart">
- disattiva
- </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="GroupPlanningDate">
- [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
- </string>
- <string name="GroupIndividualShare" value="Gruppo Dividendi individuali"/>
- <string name="GroupColumn" value="Gruppo"/>
- <string name="Balance">
- Saldo
- </string>
- <string name="Credits">
- Ringraziamenti
- </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">
- continente
- </string>
- <string name="IMTeen">
- teen
- </string>
- <string name="Anyone">
- chiunque
- </string>
- <string name="RegionInfoError">
- errore
- </string>
- <string name="RegionInfoAllEstatesOwnedBy">
- tutte le proprietà immobiliari di [OWNER]
- </string>
- <string name="RegionInfoAllEstatesYouOwn">
- tutte le tue proprietà immobiliari
- </string>
- <string name="RegionInfoAllEstatesYouManage">
- tutte le proprietà immobiliari che gestisci per conto di [OWNER]
- </string>
- <string name="RegionInfoAllowedResidents">
- Residenti consentiti: ([ALLOWEDAGENTS], massimo [MAXACCESS])
- </string>
- <string name="RegionInfoAllowedGroups">
- Gruppi ammessi: ([ALLOWEDGROUPS], massimo [MAXACCESS])
- </string>
- <string name="ScriptLimitsParcelScriptMemory">
- Memoria dello script del lotto
- </string>
- <string name="ScriptLimitsParcelsOwned">
- Lotti in elenco: [PARCELS]
- </string>
- <string name="ScriptLimitsMemoryUsed">
- Memoria utilizzata: [COUNT] kb di [MAX] kb; [AVAILABLE] kb disponibili
- </string>
- <string name="ScriptLimitsMemoryUsedSimple">
- Memoria utilizzata: [COUNT] kb
- </string>
- <string name="ScriptLimitsParcelScriptURLs">
- URL degli script lotti
- </string>
- <string name="ScriptLimitsURLsUsed">
- URL utilizzati: [COUNT] di [MAX]; [AVAILABLE] disponibili
- </string>
- <string name="ScriptLimitsURLsUsedSimple">
- URL utilizzati: [COUNT]
- </string>
- <string name="ScriptLimitsRequestError">
- Errore nella richiesta di informazioni
- </string>
- <string name="ScriptLimitsRequestNoParcelSelected">
- Nessun lotto selezionato
- </string>
- <string name="ScriptLimitsRequestWrongRegion">
- Errore: le informazioni sullo script sono disponibili solo nella tua regione attuale
- </string>
- <string name="ScriptLimitsRequestWaiting">
- Recupero informazioni in corso...
- </string>
- <string name="ScriptLimitsRequestDontOwnParcel">
- Non hai il permesso di visionare questo lotto
- </string>
- <string name="SITTING_ON">
- Seduto su
- </string>
- <string name="ATTACH_CHEST">
- Petto
- </string>
- <string name="ATTACH_HEAD">
- Testa
- </string>
- <string name="ATTACH_LSHOULDER">
- Spalla sinistra
- </string>
- <string name="ATTACH_RSHOULDER">
- Spalla destra
- </string>
- <string name="ATTACH_LHAND">
- Mano sinistra
- </string>
- <string name="ATTACH_RHAND">
- Mano destra
- </string>
- <string name="ATTACH_LFOOT">
- Piede sinisto
- </string>
- <string name="ATTACH_RFOOT">
- Piede destro
- </string>
- <string name="ATTACH_BACK">
- Indietro
- </string>
- <string name="ATTACH_PELVIS">
- Pelvi
- </string>
- <string name="ATTACH_MOUTH">
- Bocca
- </string>
- <string name="ATTACH_CHIN">
- Mento
- </string>
- <string name="ATTACH_LEAR">
- Orecchio sinistro
- </string>
- <string name="ATTACH_REAR">
- Orecchio destro
- </string>
- <string name="ATTACH_LEYE">
- Occhio sinistro
- </string>
- <string name="ATTACH_REYE">
- Occhio destro
- </string>
- <string name="ATTACH_NOSE">
- Naso
- </string>
- <string name="ATTACH_RUARM">
- Braccio destro
- </string>
- <string name="ATTACH_RLARM">
- Avambraccio destro
- </string>
- <string name="ATTACH_LUARM">
- Braccio sinistro
- </string>
- <string name="ATTACH_LLARM">
- Avambraccio sinistro
- </string>
- <string name="ATTACH_RHIP">
- Anca destra
- </string>
- <string name="ATTACH_RULEG">
- Coscia destra
- </string>
- <string name="ATTACH_RLLEG">
- Coscia destra
- </string>
- <string name="ATTACH_LHIP">
- Anca sinista
- </string>
- <string name="ATTACH_LULEG">
- Coscia sinistra
- </string>
- <string name="ATTACH_LLLEG">
- Polpaccio sinistro
- </string>
- <string name="ATTACH_BELLY">
- Addome
- </string>
- <string name="ATTACH_RPEC">
- Petto destro
- </string>
- <string name="ATTACH_LPEC">
- Petto sinistro
- </string>
- <string name="ATTACH_HUD_CENTER_2">
- HUD in centro 2
- </string>
- <string name="ATTACH_HUD_TOP_RIGHT">
- HUD alto a destra
- </string>
- <string name="ATTACH_HUD_TOP_CENTER">
- HUD alto in centro
- </string>
- <string name="ATTACH_HUD_TOP_LEFT">
- HUD alto a sinistra
- </string>
- <string name="ATTACH_HUD_CENTER_1">
- HUD in centro 1
- </string>
- <string name="ATTACH_HUD_BOTTOM_LEFT">
- HUD basso a sinistra
- </string>
- <string name="ATTACH_HUD_BOTTOM">
- HUD basso
- </string>
- <string name="ATTACH_HUD_BOTTOM_RIGHT">
- HUD basso a destra
- </string>
- <string name="CursorPos">
- Riga [LINE], Colonna [COLUMN]
- </string>
- <string name="PanelDirCountFound">
- [COUNT] trovato/i
- </string>
- <string name="PanelContentsTooltip">
- Contenuto dell&apos;oggetto
- </string>
- <string name="PanelContentsNewScript">
- Nuovo script
- </string>
- <string name="BusyModeResponseDefault">
- Il residente al quale hai inviato un messaggio è in modalità &apos;occupato&apos;, ovvero ha chiesto di non essere disturbato. Il tuo messaggio comparirà nel suo pannello IM, dove potrà essere letto in un secondo momento.
- </string>
- <string name="MuteByName">
- (In base al nome)
- </string>
- <string name="MuteAgent">
- (Residente)
- </string>
- <string name="MuteObject">
- (Oggetto)
- </string>
- <string name="MuteGroup">
- (Gruppo)
- </string>
- <string name="MuteExternal">
- (esterno)
- </string>
- <string name="RegionNoCovenant">
- Non esiste alcun regolamento per questa proprietà.
- </string>
- <string name="RegionNoCovenantOtherOwner">
- Non esiste alcun regolamento per questa proprietà. Il terreno di questa proprietà è messo in vendita dal proprietario, non dalla Linden Lab. Contatta il proprietario del terreno per i dettagli della vendita.
- </string>
- <string name="covenant_last_modified" value="Ultima modifica: "/>
- <string name="none_text" value="(nessuno)"/>
- <string name="never_text" value="(mai)"/>
- <string name="GroupOwned">
- Di proprietà di un gruppo
- </string>
- <string name="Public">
- Pubblica
- </string>
- <string name="LocalSettings">
- Impostazioni locali
- </string>
- <string name="RegionSettings">
- Impostazioni regione
- </string>
- <string name="ClassifiedClicksTxt">
- Clicca: [TELEPORT] teleport, [MAP] mappa, [PROFILE] profilo
- </string>
- <string name="ClassifiedUpdateAfterPublish">
- (si aggiornerà dopo la pubblicazione)
- </string>
- <string name="NoPicksClassifiedsText">
- Non hai creato luoghi preferiti né inserzioni. Clicca il pulsante + qui sotto per creare un luogo preferito o un&apos;inserzione.
- </string>
- <string name="NoAvatarPicksClassifiedsText">
- L&apos;utente non ha luoghi preferiti né inserzioni
- </string>
- <string name="PicksClassifiedsLoadingText">
- Caricamento in corso...
- </string>
- <string name="MultiPreviewTitle">
- Anteprima
- </string>
- <string name="MultiPropertiesTitle">
- Beni immobiliari
- </string>
- <string name="InvOfferAnObjectNamed">
- Un oggetto denominato
- </string>
- <string name="InvOfferOwnedByGroup">
- di proprietà del gruppo
- </string>
- <string name="InvOfferOwnedByUnknownGroup">
- di proprietà di un gruppo sconosciuto
- </string>
- <string name="InvOfferOwnedBy">
- di proprietà di
- </string>
- <string name="InvOfferOwnedByUnknownUser">
- di proprietà di un utente sconosciuto
- </string>
- <string name="InvOfferGaveYou">
- Ti ha offerto
- </string>
- <string name="InvOfferDecline">
- Non hai accettato [DESC] da &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
- </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">
- Ringraziamenti
- </string>
- <string name="GroupMoneyDebits">
- Debiti
- </string>
- <string name="GroupMoneyDate">
- [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
- </string>
- <string name="ViewerObjectContents">
- Contenuto
- </string>
- <string name="AcquiredItems">
- Oggetti acquisiti
- </string>
- <string name="Cancel">
- Annulla
- </string>
- <string name="UploadingCosts">
- Il caricamento di [NAME] costa L$ [AMOUNT]
- </string>
- <string name="BuyingCosts">
- L&apos;acquisto di [NAME] costa L$ [AMOUNT]
- </string>
- <string name="UnknownFileExtension">
- Estensione del file sconosciuta [.%s]
-Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
- </string>
- <string name="MuteObject2">
- Blocca
- </string>
- <string name="AddLandmarkNavBarMenu">
- Aggiungi punto di riferimento...
- </string>
- <string name="EditLandmarkNavBarMenu">
- Modifica punto di riferimento...
- </string>
- <string name="accel-mac-control">
- ⌃
- </string>
- <string name="accel-mac-command">
- ⌘
- </string>
- <string name="accel-mac-option">
- ⌥
- </string>
- <string name="accel-mac-shift">
- ⇧
- </string>
- <string name="accel-win-control">
- Ctrl+
- </string>
- <string name="accel-win-alt">
- Alt+
- </string>
- <string name="accel-win-shift">
- Shift+
- </string>
- <string name="FileSaved">
- File salvato
- </string>
- <string name="Receiving">
- In ricezione
- </string>
- <string name="AM">
- antemeridiane
- </string>
- <string name="PM">
- pomeridiane
- </string>
- <string name="PST">
- Ora Pacifico
- </string>
- <string name="PDT">
- Ora legale Pacifico
- </string>
- <string name="Direction_Forward">
- Avanti
- </string>
- <string name="Direction_Left">
- Sinistra
- </string>
- <string name="Direction_Right">
- Destra
- </string>
- <string name="Direction_Back">
- Indietro
- </string>
- <string name="Direction_North">
- Nord
- </string>
- <string name="Direction_South">
- Sud
- </string>
- <string name="Direction_West">
- Ovest
- </string>
- <string name="Direction_East">
- Est
- </string>
- <string name="Direction_Up">
- Su
- </string>
- <string name="Direction_Down">
- Giù
- </string>
- <string name="Any Category">
- Qualsiasi categoria
- </string>
- <string name="Shopping">
- Acquisti
- </string>
- <string name="Land Rental">
- Affitto terreno
- </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">
- Lavoro
- </string>
- <string name="Wanted">
- Cercasi
- </string>
- <string name="Service">
- Servizio
- </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">
- Fase
- </string>
- <string name="Other">
- Altro
- </string>
- <string name="Rental">
- Affitto
- </string>
- <string name="Any">
- Tutti
- </string>
- <string name="You">
- Tu
- </string>
- <string name="Multiple Media">
- Più supporti
- </string>
- <string name="Play Media">
- Riproduci/Pausa supporto
- </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 che il tuo sistema reputi erroneamente che il file sia già aperto.
-Se il problema persiste, riavvia il computer e riprova.
-Se il problema continua ancora, dovresti completamente disinstallare l&apos;applicazione [APP_NAME] e reinstallarla.
- </string>
- <string name="MBFatalError">
- Errore critico
- </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 DirectX per rilevare hardware e/o i driver non aggiornati che possono causare problemi di stabilità, scarsa performance e interruzioni. Benché tu possa avviare il programma [APP_NAME] senza di esse, consigliamo caldamente l&apos;esecuzione con DirectX 9.0b.
-
-Vuoi continuare?
- </string>
- <string name="MBWarning">
- Attenzione
- </string>
- <string name="MBNoAutoUpdate">
- L&apos;aggiornamento automatico non è stato ancora realizzato per Linux.
-Consigliamo di scaricare l&apos;ultima versione direttamente da www.secondlife.com.
- </string>
- <string name="MBRegClassFailed">
- RegisterClass non riuscito
- </string>
- <string name="MBError">
- Errore
- </string>
- <string name="MBFullScreenErr">
- Impossibile visualizzare a schermo intero con risoluzione [WIDTH] x [HEIGHT].
-Visualizzazione corrente in modalità finestra.
- </string>
- <string name="MBDestroyWinFailed">
- Errore di arresto durante il tentativo di chiusura della finestra (DestroyWindow() non riuscito)
- </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 a 8 bit. Questo problema normalmente deriva dai driver della scheda video.
-Assicurati di avere installato i driver della scheda video più recenti.
-Assicurati anche che il monitor sia impostato a True Color (32 bit) nel Pannello di controllo &gt; Schermo &gt; Impostazioni.
-Se il messaggio persiste, 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 installarli 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 Fringe">
- Frangetta all&apos;indietro
- </string>
- <string name="Baggy">
- Larghi
- </string>
- <string name="Bangs">
- Frange
- </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 Hair Back">
- Capigliatura grande: Indietro
- </string>
- <string name="Big Hair Front">
- Capigliatura grande: anteriore
- </string>
- <string name="Big Hair Top">
- Capigliatura grande: in alto
- </string>
- <string name="Big Head">
- Grande testa
- </string>
- <string name="Big Pectorals">
- Grandi 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 più robusto
- </string>
- <string name="Body Thickness">
- Robustezza del corpo
- </string>
- <string name="Body Thin">
- Corpo più magro
- </string>
- <string name="Bow Legged">
- Gambe arcuate
- </string>
- <string name="Breast Buoyancy">
- Altezza del seno
- </string>
- <string name="Breast Cleavage">
- Décolleté
- </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">
- Occhi sporgenti
- </string>
- <string name="Bugged Eyes">
- Occhi sporgenti
- </string>
- <string name="Bulbous">
- Bulboso
- </string>
- <string name="Bulbous Nose">
- Naso bulboso
- </string>
- <string name="Breast Physics Mass">
- Massa seno
- </string>
- <string name="Breast Physics Smoothing">
- Lisciatura seno
- </string>
- <string name="Breast Physics Gravity">
- Gravità seno
- </string>
- <string name="Breast Physics Drag">
- Resistenza seno
- </string>
- <string name="Breast Physics InOut Max Effect">
- Massimo effetto
- </string>
- <string name="Breast Physics InOut Spring">
- Elasticità
- </string>
- <string name="Breast Physics InOut Gain">
- Guadagno
- </string>
- <string name="Breast Physics InOut Damping">
- Attenuazione
- </string>
- <string name="Breast Physics UpDown Max Effect">
- Massimo effetto
- </string>
- <string name="Breast Physics UpDown Spring">
- Elasticità
- </string>
- <string name="Breast Physics UpDown Gain">
- Guadagno
- </string>
- <string name="Breast Physics UpDown Damping">
- Attenuazione
- </string>
- <string name="Breast Physics LeftRight Max Effect">
- Massimo effetto
- </string>
- <string name="Breast Physics LeftRight Spring">
- Elasticità
- </string>
- <string name="Breast Physics LeftRight Gain">
- Guadagno
- </string>
- <string name="Breast Physics LeftRight Damping">
- Attenuazione
- </string>
- <string name="Belly Physics Mass">
- Massa pancia
- </string>
- <string name="Belly Physics Smoothing">
- Lisciatura pancia
- </string>
- <string name="Belly Physics Gravity">
- Gravità pancia
- </string>
- <string name="Belly Physics Drag">
- Resistenza pancia
- </string>
- <string name="Belly Physics UpDown Max Effect">
- Massimo effetto
- </string>
- <string name="Belly Physics UpDown Spring">
- Elasticità
- </string>
- <string name="Belly Physics UpDown Gain">
- Guadagno
- </string>
- <string name="Belly Physics UpDown Damping">
- Attenuazione
- </string>
- <string name="Butt Physics Mass">
- Massa natiche
- </string>
- <string name="Butt Physics Smoothing">
- Lisciatura natiche
- </string>
- <string name="Butt Physics Gravity">
- Gravità natiche
- </string>
- <string name="Butt Physics Drag">
- Resistenza natiche
- </string>
- <string name="Butt Physics UpDown Max Effect">
- Massimo effetto
- </string>
- <string name="Butt Physics UpDown Spring">
- Elasticità
- </string>
- <string name="Butt Physics UpDown Gain">
- Guadagno
- </string>
- <string name="Butt Physics UpDown Damping">
- Attenuazione
- </string>
- <string name="Butt Physics LeftRight Max Effect">
- Massimo effetto
- </string>
- <string name="Butt Physics LeftRight Spring">
- Elasticità
- </string>
- <string name="Butt Physics LeftRight Gain">
- Guadagno
- </string>
- <string name="Butt Physics LeftRight Damping">
- Attenuazione
- </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="Butt Gravity">
- Gravità natiche
- </string>
- <string name="bustle skirt">
- Crinolina
- </string>
- <string name="no bustle">
- Nessuna crinolina
- </string>
- <string name="more bustle">
- Più crinolina
- </string>
- <string name="Chaplin">
- Baffetti
- </string>
- <string name="Cheek Bones">
- Zigomi
- </string>
- <string name="Chest Size">
- Ampiezza del torace
- </string>
- <string name="Chin Angle">
- Angolo del mento
- </string>
- <string name="Chin Cleft">
- Fossetta sul mento
- </string>
- <string name="Chin Curtains">
- Barba sottomento
- </string>
- <string name="Chin Depth">
- Profondità mento
- </string>
- <string name="Chin Heavy">
- Mento forte
- </string>
- <string name="Chin In">
- Mento in dentro
- </string>
- <string name="Chin Out">
- Mento sporgente
- </string>
- <string name="Chin-Neck">
- 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">
- Chiuso dietro
- </string>
- <string name="Closed Front">
- Chiuso davanti
- </string>
- <string name="Closed Left">
- Chiuso sinistra
- </string>
- <string name="Closed Right">
- Chiuso destra
- </string>
- <string name="Coin Purse">
- Meno pronunciati
- </string>
- <string name="Collar Back">
- Colletto posteriore
- </string>
- <string name="Collar Front">
- Colletto anteriore
- </string>
- <string name="Corner Down">
- Angolo all&apos;ingiù
- </string>
- <string name="Corner Up">
- Angolo all&apos;insù
- </string>
- <string name="Creased">
- Piega
- </string>
- <string name="Crooked Nose">
- Naso storto
- </string>
- <string name="Cuff Flare">
- Svasato con risvolto
- </string>
- <string name="Dark">
- Scuro
- </string>
- <string name="Dark Green">
- Verde scuro
- </string>
- <string name="Darker">
- Più scuro
- </string>
- <string name="Deep">
- Profondo
- </string>
- <string name="Default Heels">
- Tacchi standard
- </string>
- <string name="Dense">
- Folti
- </string>
- <string name="Double Chin">
- Doppio mento
- </string>
- <string name="Downturned">
- All&apos;ingiù
- </string>
- <string name="Duffle Bag">
- Più pronunciati
- </string>
- <string name="Ear Angle">
- Angolo orecchie
- </string>
- <string name="Ear Size">
- Grandezza orecchie
- </string>
- <string name="Ear Tips">
- Estremità orecchie
- </string>
- <string name="Egg Head">
- Ovalizzazione testa
- </string>
- <string name="Eye Bags">
- Occhiaie
- </string>
- <string name="Eye Color">
- Colore degli occhi
- </string>
- <string name="Eye Depth">
- Profondità degli occhi
- </string>
- <string name="Eye Lightness">
- Luminosità degli occhi
- </string>
- <string name="Eye Opening">
- Apertura degli occhi
- </string>
- <string name="Eye Pop">
- Prominenza degli occhi
- </string>
- <string name="Eye Size">
- Grandezza occhi
- </string>
- <string name="Eye Spacing">
- Distanza occhi
- </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 Bugged">
- Occhi sporgenti
- </string>
- <string name="Face Shear">
- Taglio del viso
- </string>
- <string name="Facial Definition">
- Definizione del viso
- </string>
- <string name="Far Set Eyes">
- Occhi distanti
- </string>
- <string name="Fat Lips">
- Labbra carnose
- </string>
- <string name="Female">
- Femmina
- </string>
- <string name="Fingerless">
- Senza dita
- </string>
- <string name="Fingers">
- Dita
- </string>
- <string name="Flared Cuffs">
- Risvolti svasati
- </string>
- <string name="Flat">
- Piatto
- </string>
- <string name="Flat Butt">
- Sedere piatto
- </string>
- <string name="Flat Head">
- Testa piatta
- </string>
- <string name="Flat Toe">
- Punta piatta
- </string>
- <string name="Foot Size">
- Misura piede
- </string>
- <string name="Forehead Angle">
- Angolo della fronte
- </string>
- <string name="Forehead Heavy">
- Fronte sporgente
- </string>
- <string name="Freckles">
- Lentiggini
- </string>
- <string name="Front Fringe">
- Frangetta
- </string>
- <string name="Full Back">
- Dietro gonfi
- </string>
- <string name="Full Eyeliner">
- Eyeliner marcato
- </string>
- <string name="Full Front">
- Anteriore gonfio
- </string>
- <string name="Full Hair Sides">
- Lati capelli gonfi
- </string>
- <string name="Full Sides">
- Lati gonfi
- </string>
- <string name="Glossy">
- Lucido
- </string>
- <string name="Glove Fingers">
- Dita con guanti
- </string>
- <string name="Glove Length">
- Lunghezza guanti
- </string>
- <string name="Hair">
- Capigliature
- </string>
- <string name="Hair Back">
- Capelli: Indietro
- </string>
- <string name="Hair Front">
- Capelli: anteriore
- </string>
- <string name="Hair Sides">
- Capelli: lati
- </string>
- <string name="Hair Sweep">
- Direzione capigliatura
- </string>
- <string name="Hair Thickess">
- Foltezza
- </string>
- <string name="Hair Thickness">
- Foltezza
- </string>
- <string name="Hair Tilt">
- Inclinazione
- </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 a manubrio
- </string>
- <string name="Head Length">
- Lunghezza testa
- </string>
- <string name="Head Shape">
- Forma della testa
- </string>
- <string name="Head Size">
- Grandezza della testa
- </string>
- <string name="Head Stretch">
- Allungamento 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">
- Alto e stretto
- </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">
- Iscriviti
- </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 corporeo
- </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ù leggero
- </string>
- <string name="Lip Cleft">
- Distanza fossetta labbro
- </string>
- <string name="Lip Cleft Depth">
- Prof. fossetta labbro
- </string>
- <string name="Lip Fullness">
- Volume 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">
- Testa lunga
- </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">
- Codini 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="Loose Pants">
- Pantaloni ampi
- </string>
- <string name="Loose Shirt">
- Camicia ampia
- </string>
- <string name="Loose Sleeves">
- Maniche non attillate
- </string>
- <string name="Love Handles">
- Maniglie dell&apos;amore
- </string>
- <string name="Low">
- Basso
- </string>
- <string name="Low Heels">
- Tacchi bassi
- </string>
- <string name="Low Jaw">
- Mandibola bassa
- </string>
- <string name="Low Platforms">
- Bassa
- </string>
- <string name="Low and Loose">
- Basso e ampio
- </string>
- <string name="Lower">
- Più basso
- </string>
- <string name="Lower Bridge">
- Parte bassa del setto
- </string>
- <string name="Lower Cheeks">
- Guance inferiori
- </string>
- <string name="Male">
- Maschio
- </string>
- <string name="Middle Part">
- Riga nel mezzo
- </string>
- <string name="More">
- Altro
- </string>
- <string name="More Blush">
- Più fard
- </string>
- <string name="More Body Fat">
- Più grasso corporeo
- </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">
- Moicana
- </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 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">
- Naso a sinistra
- </string>
- <string name="Nose Right">
- Naso 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="Opaque">
- Opaco
- </string>
- <string name="Open">
- Apri
- </string>
- <string name="Open Back">
- Retro aperto
- </string>
- <string name="Open Front">
- Davanti aperto
- </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 smaltate
- </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">
- Taglia pantalone
- </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">
- Codini
- </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="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="Regular">
- Normale
- </string>
- <string name="Right Part">
- Riga a destra
- </string>
- <string name="Rosy Complexion">
- Incarnato
- </string>
- <string name="Round">
- Rotondo
- </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="Scrawny Leg">
- Gambe magre
- </string>
- <string name="Separate">
- Separati
- </string>
- <string name="Shallow">
- Meno pronunciato
- </string>
- <string name="Shear Back">
- Taglio posteriore
- </string>
- <string name="Shear Face">
- Taglio del viso
- </string>
- <string name="Shear Front">
- Taglio anteriore
- </string>
- <string name="Shear Left Up">
- Distorto a sinistra
- </string>
- <string name="Shear Right Up">
- Distorto a destra
- </string>
- <string name="Sheared Back">
- Taglio verso dietro
- </string>
- <string name="Sheared Front">
- Taglio verso davanti
- </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">
- Codini 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 Fringe">
- Ciuffi laterali
- </string>
- <string name="Sideburns">
- Basette
- </string>
- <string name="Sides Hair">
- Capigliatura di lato
- </string>
- <string name="Sides Hair Down">
- Capigliatura di lato sciolta
- </string>
- <string name="Sides Hair Up">
- Capigliatura di lato raccolta
- </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: Indietro
- </string>
- <string name="Slit Front">
- Spacco: anteriore
- </string>
- <string name="Slit Left">
- Spacco: Sinistra
- </string>
- <string name="Slit Right">
- Spacco: Destra
- </string>
- <string name="Small">
- Piccola
- </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="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="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="Tall">
- Alto
- </string>
- <string name="Taper Back">
- Ravv. lat. posteriore
- </string>
- <string name="Taper Front">
- Ravv. lat. frontale
- </string>
- <string name="Thick Heels">
- Tacchi spessi
- </string>
- <string name="Thick Neck">
- Collo grosso
- </string>
- <string name="Thick Toe">
- Punta spessa
- </string>
- <string name="Thin">
- Sottili
- </string>
- <string name="Thin Eyebrows">
- Sopracciglia sottili
- </string>
- <string name="Thin Lips">
- Labbra sottili
- </string>
- <string name="Thin Nose">
- Naso sottile
- </string>
- <string name="Tight Chin">
- Mento stretto
- </string>
- <string name="Tight Cuffs">
- Fondo stretto
- </string>
- <string name="Tight Pants">
- Pantaloni attillati
- </string>
- <string name="Tight Shirt">
- Camicia attillata
- </string>
- <string name="Tight Skirt">
- Gonna attillata
- </string>
- <string name="Tight Sleeves">
- Maniche strette
- </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">
- Senza piega
- </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">
- Fossetta sup. del mento
- </string>
- <string name="Upper Eyelid Fold">
- Piega palpebra sup.
- </string>
- <string name="Upturned">
- 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">
- Largo
- </string>
- <string name="Wide Back">
- Dietro largo
- </string>
- <string name="Wide Front">
- Davanti largo
- </string>
- <string name="Wide Lips">
- Labbra larghe
- </string>
- <string name="Wild">
- Colorati
- </string>
- <string name="Wrinkles">
- Grinze
- </string>
- <string name="LocationCtrlAddLandmarkTooltip">
- Aggiungi ai miei punti di riferimento
- </string>
- <string name="LocationCtrlEditLandmarkTooltip">
- Modifica i miei punti di riferimento
- </string>
- <string name="LocationCtrlInfoBtnTooltip">
- Maggiori informazioni sulla posizione attuale
- </string>
- <string name="LocationCtrlComboBtnTooltip">
- La cronologia delle mie posizioni
- </string>
- <string name="LocationCtrlAdultIconTooltip">
- Regione con categoria adulti
- </string>
- <string name="LocationCtrlModerateIconTooltip">
- Regione con categoria moderata
- </string>
- <string name="LocationCtrlGeneralIconTooltip">
- Regione generale
- </string>
- <string name="LocationCtrlSeeAVsTooltip">
- Avatar visibili e chat consentita fuori di questo lotto
- </string>
- <string name="UpdaterWindowTitle">
- Aggiornamento [APP_NAME]
- </string>
- <string name="UpdaterNowUpdating">
- Aggiornamento di [APP_NAME]...
- </string>
- <string name="UpdaterNowInstalling">
- Installazione di [APP_NAME]...
- </string>
- <string name="UpdaterUpdatingDescriptive">
- Il Viewer del programma [APP_NAME] si sta aggiornando all&apos;ultima versione. Potrebbe volerci del tempo, attendi.
- </string>
- <string name="UpdaterProgressBarTextWithEllipses">
- Download dell&apos;aggiornamento...
- </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 durante il tentativo di aggiornamento. Consigliamo di scaricare l&apos;ultima versione direttamente da www.secondlife.com.
- </string>
- <string name="UpdaterFailInstallTitle">
- Installazione dell&apos;aggiornamento non riuscita
- </string>
- <string name="UpdaterFailStartTitle">
- Errore nell&apos;avvio del viewer
- </string>
- <string name="ItemsComingInTooFastFrom">
- [APP_NAME]: Oggetti in arrivo troppo velocemente da [FROM_NAME], anteprima automatica disattivata per [TIME] secondi
- </string>
- <string name="ItemsComingInTooFast">
- [APP_NAME]: Oggetti in arrivo troppo velocemente, anteprima automatica disattivata per [TIME] secondi
- </string>
- <string name="IM_logging_string">
- -- Registrazione messaggi instantanei abilitata --
- </string>
- <string name="IM_typing_start_string">
- [NAME] sta scrivendo...
- </string>
- <string name="Unnamed">
- (anonimo)
- </string>
- <string name="IM_moderated_chat_label">
- (Moderato: Voci disattivate 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 qui per inviare un messaggio instantaneo.
- </string>
- <string name="IM_to_label">
- A
- </string>
- <string name="IM_moderator_label">
- (Moderatore)
- </string>
- <string name="Saved_message">
- (Salvato [LONG_TIMESTAMP])
- </string>
- <string name="IM_unblock_only_groups_friends">
- Per vedere questo messaggio, devi deselezionare &apos;Solo amici e gruppi possono chiamarmi o mandarmi IM&apos; in Preferenze/Privacy.
- </string>
- <string name="answered_call">
- Risposto alla chiamata
- </string>
- <string name="you_started_call">
- Hai iniziato una chiamata vocale
- </string>
- <string name="you_joined_call">
- Ti sei collegato alla chiamata in voce
- </string>
- <string name="name_started_call">
- [NAME] ha iniziato una chiamata vocale
- </string>
- <string name="ringing-im">
- Collegamento alla chiamata vocale...
- </string>
- <string name="connected-im">
- Collegato, clicca Chiudi chiamata per agganciare
- </string>
- <string name="hang_up-im">
- Chiusa la chiamata
- </string>
- <string name="conference-title-incoming">
- Chiamata in conferenza con [AGENT_NAME]
- </string>
- <string name="no_session_message">
- (La sessione IM non esiste)
- </string>
- <string name="only_user_message">
- Sei l&apos;unico utente di questa sessione.
- </string>
- <string name="offline_message">
- [NAME] è offline
- </string>
- <string name="invite_message">
- Clicca il tasto [BUTTON NAME] per accettare/connetterti a questa voice chat.
- </string>
- <string name="muted_message">
- Hai bloccato questo residente. Quando gli invii un messaggio, verrà automaticamente sbloccato.
- </string>
- <string name="generic">
- Errore nella richiesta, riprova più tardi.
- </string>
- <string name="generic_request_error">
- Errore durante la richiesta, riprova più tardi.
- </string>
- <string name="insufficient_perms_error">
- Non hai sufficienti permessi.
- </string>
- <string name="session_does_not_exist_error">
- Questa sessione non esiste più
- </string>
- <string name="no_ability_error">
- Non hai questa abilitazione.
- </string>
- <string name="no_ability">
- Non hai questa abilitazione.
- </string>
- <string name="not_a_mod_error">
- Non sei un moderatore.
- </string>
- <string name="muted">
- Il moderatore del gruppo ha disattivato la tua chat di testo.
- </string>
- <string name="muted_error">
- Un moderatore di gruppo ti ha disabilitato dalla chat di testo.
- </string>
- <string name="add_session_event">
- Impossibile aggiungere utenti alla chat con [RECIPIENT].
- </string>
- <string name="message">
- Impossibile spedire il tuo messaggio nella sessione chat con [RECIPIENT].
- </string>
- <string name="message_session_event">
- Impossibile inviare il messaggio nella chat con [RECIPIENT].
- </string>
- <string name="mute">
- Errore durante la moderazione.
- </string>
- <string name="removed">
- Sei stato rimosso dal gruppo.
- </string>
- <string name="removed_from_group">
- Sei stato espulso dal gruppo.
- </string>
- <string name="close_on_no_ability">
- Non hai più le abilitazioni per rimanere nella sessione chat.
- </string>
- <string name="unread_chat_single">
- [SOURCES] ha detto qualcosa di nuovo
- </string>
- <string name="unread_chat_multiple">
- [SOURCES] ha detto qualcosa di nuovo
- </string>
- <string name="session_initialization_timed_out_error">
- Sessione di inizializzazione scaduta
- </string>
- <string name="Home position set.">
- Posizione di base impostata.
- </string>
- <string name="voice_morphing_url">
- http://secondlife.com/landing/voicemorphing
- </string>
- <string name="paid_you_ldollars">
- [NAME] ti ha inviato un pagamento di L$[AMOUNT] [REASON].
- </string>
- <string name="paid_you_ldollars_no_reason">
- [NAME] ti ha inviato un pagamento di L$[AMOUNT].
- </string>
- <string name="you_paid_ldollars">
- Hai inviato un pagamento di L$[AMOUNT] a [NAME] [REASON].
- </string>
- <string name="you_paid_ldollars_no_info">
- Hai pagato L$ [AMOUNT].
- </string>
- <string name="you_paid_ldollars_no_reason">
- Hai inviato un pagamento di L$[AMOUNT] a [NAME].
- </string>
- <string name="you_paid_ldollars_no_name">
- Hai pagato L$ [AMOUNT] [REASON].
- </string>
- <string name="you_paid_failure_ldollars">
- Non hai pagato [NAME] L$[AMOUNT] [REASON].
- </string>
- <string name="you_paid_failure_ldollars_no_info">
- Non hai pagato L$ [AMOUNT].
- </string>
- <string name="you_paid_failure_ldollars_no_reason">
- Non hai pagato [NAME] L$[AMOUNT].
- </string>
- <string name="you_paid_failure_ldollars_no_name">
- Non hai pagato L$ [AMOUNT] [REASON].
- </string>
- <string name="for item">
- per [ITEM]
- </string>
- <string name="for a parcel of land">
- per un lotto di terreno
- </string>
- <string name="for a land access pass">
- per un permesso di accesso al terreno
- </string>
- <string name="for deeding land">
- per la cessione di terreno
- </string>
- <string name="to create a group">
- per creare un gruppo
- </string>
- <string name="to join a group">
- per aderire a un gruppo
- </string>
- <string name="to upload">
- per caricare
- </string>
- <string name="to publish a classified ad">
- per pubblicare un annuncio
- </string>
- <string name="giving">
- Contributo di L$ [AMOUNT]
- </string>
- <string name="uploading_costs">
- Il costo per il caricamento è di L$ [AMOUNT]
- </string>
- <string name="this_costs">
- Il costo è L$ [AMOUNT]
- </string>
- <string name="buying_selected_land">
- L&apos;acquisto del terreno prescelto costa L$ [AMOUNT]
- </string>
- <string name="this_object_costs">
- Il costo dell&apos;oggetto è L$ [AMOUNT]
- </string>
- <string name="group_role_everyone">
- Tutti
- </string>
- <string name="group_role_officers">
- Funzionari
- </string>
- <string name="group_role_owners">
- Proprietari
- </string>
- <string name="group_member_status_online">
- Online
- </string>
- <string name="uploading_abuse_report">
- Caricamento in corso...
-
-Segnala abuso
- </string>
- <string name="New Shape">
- Nuova figura corporea
- </string>
- <string name="New Skin">
- Nuova pelle
- </string>
- <string name="New Hair">
- Nuovi capelli
- </string>
- <string name="New Eyes">
- Nuovi occhi
- </string>
- <string name="New Shirt">
- Nuova camicia
- </string>
- <string name="New Pants">
- Nuovi pantaloni
- </string>
- <string name="New Shoes">
- Nuove scarpe
- </string>
- <string name="New Socks">
- Nuove calze
- </string>
- <string name="New Jacket">
- Nuova giacca
- </string>
- <string name="New Gloves">
- Nuovi guanti
- </string>
- <string name="New Undershirt">
- Nuova maglietta intima
- </string>
- <string name="New Underpants">
- Nuovi slip
- </string>
- <string name="New Skirt">
- Nuova gonna
- </string>
- <string name="New Alpha">
- Nuovo Alpha (trasparenza)
- </string>
- <string name="New Tattoo">
- Nuovo tatuaggio
- </string>
- <string name="New Physics">
- Nuova fisica
- </string>
- <string name="Invalid Wearable">
- Capo da indossare non valido
- </string>
- <string name="New Gesture">
- Nuova gesture
- </string>
- <string name="New Script">
- Nuovo script
- </string>
- <string name="New Note">
- Nuovo appunto
- </string>
- <string name="New Folder">
- Nuova cartella
- </string>
- <string name="Contents">
- Contenuto
- </string>
- <string name="Gesture">
- Gesture
- </string>
- <string name="Male Gestures">
- Gesture maschili
- </string>
- <string name="Female Gestures">
- Gesture femminili
- </string>
- <string name="Other Gestures">
- Altre gesture
- </string>
- <string name="Speech Gestures">
- Gesture del parlato
- </string>
- <string name="Common Gestures">
- Gesture comuni
- </string>
- <string name="Male - Excuse me">
- Maschio - Chiedere scusa
- </string>
- <string name="Male - Get lost">
- Maschio - Levati dai piedi!
- </string>
- <string name="Male - Blow kiss">
- Maschio - Butta un bacio
- </string>
- <string name="Male - Boo">
- Maschio - Bu
- </string>
- <string name="Male - Bored">
- Maschio - Annoiato
- </string>
- <string name="Male - Hey">
- Maschio - Ehi
- </string>
- <string name="Male - Laugh">
- Maschio - Ridere
- </string>
- <string name="Male - Repulsed">
- Maschio - Disgustato
- </string>
- <string name="Male - Shrug">
- Maschio - Spallucce
- </string>
- <string name="Male - Stick tougue out">
- Maschio - Tira fuori la lingua
- </string>
- <string name="Male - Wow">
- Maschio - Accipicchia
- </string>
- <string name="Female - Chuckle">
- Femmina - Risatina
- </string>
- <string name="Female - Cry">
- Femmina - Pianto
- </string>
- <string name="Female - Embarrassed">
- Femmina - Imbarazzata
- </string>
- <string name="Female - Excuse me">
- Femmina - Chiedere scusa
- </string>
- <string name="Female - Get lost">
- Femmina - Levati dai piedi!
- </string>
- <string name="Female - Blow kiss">
- Femmina - Butta un bacio
- </string>
- <string name="Female - Boo">
- Femmina - Bu
- </string>
- <string name="Female - Bored">
- Femmina - Annoiata
- </string>
- <string name="Female - Hey">
- Femmina - Ehi
- </string>
- <string name="Female - Hey baby">
- Femmina - Ehi tu
- </string>
- <string name="Female - Laugh">
- Femmina - Ridere
- </string>
- <string name="Female - Looking good">
- Femmina - Sei in forma
- </string>
- <string name="Female - Over here">
- Femmina - Per di qua
- </string>
- <string name="Female - Please">
- Femmina - Per cortesia
- </string>
- <string name="Female - Repulsed">
- Femmina - Disgustata
- </string>
- <string name="Female - Shrug">
- Femmina - Spallucce
- </string>
- <string name="Female - Stick tougue out">
- Femmina - Tira fuori la lingua
- </string>
- <string name="Female - Wow">
- Femmina - Accipicchia
- </string>
- <string name="/bow">
- /inchino
- </string>
- <string name="/clap">
- /applausi
- </string>
- <string name="/count">
- /numero
- </string>
- <string name="/extinguish">
- /estingui
- </string>
- <string name="/kmb">
- /chissene
- </string>
- <string name="/muscle">
- /muscolo
- </string>
- <string name="/no">
- /no
- </string>
- <string name="/no!">
- /no!
- </string>
- <string name="/paper">
- /carta
- </string>
- <string name="/pointme">
- /indicome
- </string>
- <string name="/pointyou">
- /indicotu
- </string>
- <string name="/rock">
- /sasso
- </string>
- <string name="/scissor">
- /forbici
- </string>
- <string name="/smoke">
- /fumo
- </string>
- <string name="/stretch">
- /stiracchiata
- </string>
- <string name="/whistle">
- /fischietto
- </string>
- <string name="/yes">
- /si
- </string>
- <string name="/yes!">
- /si!
- </string>
- <string name="afk">
- non alla tastiera
- </string>
- <string name="dance1">
- danza1
- </string>
- <string name="dance2">
- danza2
- </string>
- <string name="dance3">
- danza3
- </string>
- <string name="dance4">
- danza4
- </string>
- <string name="dance5">
- danza5
- </string>
- <string name="dance6">
- danza6
- </string>
- <string name="dance7">
- danza7
- </string>
- <string name="dance8">
- danza8
- </string>
- <string name="AvatarBirthDateFormat">
- [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
- </string>
- <string name="DefaultMimeType">
- nessuna/nessuna
- </string>
- <string name="texture_load_dimensions_error">
- Impossibile caricare immagini di dimensioni superiori a [WIDTH]*[HEIGHT]
- </string>
- <string name="words_separator" value=","/>
- <string name="server_is_down">
- Nonostante i nostri tentativi, si è verificato un errore imprevisto.
-
- Consulta la pagina status.secondlifegrid.net per determinare se si sia verificato un problema noto con il servizio.
- Se il problema continua, ti consigliamo di controllare le tue impostazioni di rete e della firewall.
- </string>
- <string name="dateTimeWeekdaysNames">
- lunedì:martedì:mercoledì:giovedì:venerdì:sabato:domenica
- </string>
- <string name="dateTimeWeekdaysShortNames">
- lun:mar:mer:gio:ven:sab:dom
- </string>
- <string name="dateTimeMonthNames">
- gennaio:febbraio:marzo:aprile:maggio:giugno:luglio:agosto:settembre:ottobre:novembre:dicembre
- </string>
- <string name="dateTimeMonthShortNames">
- gen:feb:mar:apr:mag:giu:lug:ago:sett:ott:nov:dic
- </string>
- <string name="dateTimeDayFormat">
- [MDAY]
- </string>
- <string name="dateTimeAM">
- antemeridiane
- </string>
- <string name="dateTimePM">
- pomeridiane
- </string>
- <string name="LocalEstimateUSD">
- US$ [AMOUNT]
- </string>
- <string name="Membership">
- Abbonamento
- </string>
- <string name="Roles">
- Ruoli
- </string>
- <string name="Group Identity">
- Identità gruppo
- </string>
- <string name="Parcel Management">
- Gestione lotto
- </string>
- <string name="Parcel Identity">
- Identità lotto
- </string>
- <string name="Parcel Settings">
- Impostazioni lotto
- </string>
- <string name="Parcel Powers">
- Poteri lotto
- </string>
- <string name="Parcel Access">
- Accesso al lotto
- </string>
- <string name="Parcel Content">
- Contenuto lotto
- </string>
- <string name="Object Management">
- Gestione oggetti
- </string>
- <string name="Accounting">
- Contabilità
- </string>
- <string name="Notices">
- Avvisi
- </string>
- <string name="Chat" value="Chat :">
- Chat
- </string>
- <string name="DeleteItems">
- Cancellare gli elementi selezionati?
- </string>
- <string name="DeleteItem">
- Cancellare l’elemento selezionato?
- </string>
- <string name="EmptyOutfitText">
- Questo vestiario non contiene alcun elemento
- </string>
- <string name="ExternalEditorNotSet">
- Seleziona un editor usando le impostazioni ExternalEditor.
- </string>
- <string name="ExternalEditorNotFound">
- L&apos;editor esterno specificato non è stato trovato.
-Prova a racchiudere il percorso dell&apos;editor in doppie virgolette.
-(per es. &quot;/percorso per il mio/editor&quot; &quot;%s&quot;)
- </string>
- <string name="ExternalEditorCommandParseError">
- Errore nell&apos;elaborazione del comando dell&apos;editor esterno.
- </string>
- <string name="ExternalEditorFailedToRun">
- L&apos;editor esterno non è stato avviato.
- </string>
- <string name="TranslationFailed">
- Traduzione non riuscita: [REASON]
- </string>
- <string name="TranslationResponseParseError">
- Errore di elaborazione della risposta della traduzione.
- </string>
- <string name="Esc">
- Esc
- </string>
- <string name="Space">
- Space
- </string>
- <string name="Enter">
- Enter
- </string>
- <string name="Tab">
- Tab
- </string>
- <string name="Ins">
- Ins
- </string>
- <string name="Del">
- Del
- </string>
- <string name="Backsp">
- Backsp
- </string>
- <string name="Shift">
- Shift
- </string>
- <string name="Ctrl">
- Ctrl
- </string>
- <string name="Alt">
- Alt
- </string>
- <string name="CapsLock">
- CapsLock
- </string>
- <string name="Home">
- Home
- </string>
- <string name="End">
- End
- </string>
- <string name="PgUp">
- PgUp
- </string>
- <string name="PgDn">
- PgDn
- </string>
- <string name="F1">
- F1
- </string>
- <string name="F2">
- F2
- </string>
- <string name="F3">
- F3
- </string>
- <string name="F4">
- F4
- </string>
- <string name="F5">
- F5
- </string>
- <string name="F6">
- F6
- </string>
- <string name="F7">
- F7
- </string>
- <string name="F8">
- F8
- </string>
- <string name="F9">
- F9
- </string>
- <string name="F10">
- F10
- </string>
- <string name="F11">
- F11
- </string>
- <string name="F12">
- F12
- </string>
- <string name="Add">
- Aggiungi
- </string>
- <string name="Subtract">
- Sottrai
- </string>
- <string name="Multiply">
- Moltiplica
- </string>
- <string name="Divide">
- Dividi
- </string>
- <string name="PAD_DIVIDE">
- PAD_DIVIDE
- </string>
- <string name="PAD_LEFT">
- PAD_LEFT
- </string>
- <string name="PAD_RIGHT">
- PAD_RIGHT
- </string>
- <string name="PAD_DOWN">
- PAD_DOWN
- </string>
- <string name="PAD_UP">
- PAD_UP
- </string>
- <string name="PAD_HOME">
- PAD_HOME
- </string>
- <string name="PAD_END">
- PAD_END
- </string>
- <string name="PAD_PGUP">
- PAD_PGUP
- </string>
- <string name="PAD_PGDN">
- PAD_PGDN
- </string>
- <string name="PAD_CENTER">
- PAD_CENTER
- </string>
- <string name="PAD_INS">
- PAD_INS
- </string>
- <string name="PAD_DEL">
- PAD_DEL
- </string>
- <string name="PAD_Enter">
- PAD_Enter
- </string>
- <string name="PAD_BUTTON0">
- PAD_BUTTON0
- </string>
- <string name="PAD_BUTTON1">
- PAD_BUTTON1
- </string>
- <string name="PAD_BUTTON2">
- PAD_BUTTON2
- </string>
- <string name="PAD_BUTTON3">
- PAD_BUTTON3
- </string>
- <string name="PAD_BUTTON4">
- PAD_BUTTON4
- </string>
- <string name="PAD_BUTTON5">
- PAD_BUTTON5
- </string>
- <string name="PAD_BUTTON6">
- PAD_BUTTON6
- </string>
- <string name="PAD_BUTTON7">
- PAD_BUTTON7
- </string>
- <string name="PAD_BUTTON8">
- PAD_BUTTON8
- </string>
- <string name="PAD_BUTTON9">
- PAD_BUTTON9
- </string>
- <string name="PAD_BUTTON10">
- PAD_BUTTON10
- </string>
- <string name="PAD_BUTTON11">
- PAD_BUTTON11
- </string>
- <string name="PAD_BUTTON12">
- PAD_BUTTON12
- </string>
- <string name="PAD_BUTTON13">
- PAD_BUTTON13
- </string>
- <string name="PAD_BUTTON14">
- PAD_BUTTON14
- </string>
- <string name="PAD_BUTTON15">
- PAD_BUTTON15
- </string>
- <string name="-">
- -
- </string>
- <string name="=">
- =
- </string>
- <string name="`">
- `
- </string>
- <string name=";">
- ;
- </string>
- <string name="[">
- [
- </string>
- <string name="]">
- ]
- </string>
- <string name="\">
- \
- </string>
- <string name="0">
- 0
- </string>
- <string name="1">
- 1
- </string>
- <string name="2">
- 2
- </string>
- <string name="3">
- 3
- </string>
- <string name="4">
- 4
- </string>
- <string name="5">
- 5
- </string>
- <string name="6">
- 6
- </string>
- <string name="7">
- 7
- </string>
- <string name="8">
- 8
- </string>
- <string name="9">
- 9
- </string>
- <string name="A">
- A
- </string>
- <string name="B">
- B
- </string>
- <string name="C">
- C
- </string>
- <string name="D">
- D
- </string>
- <string name="E">
- E
- </string>
- <string name="F">
- F
- </string>
- <string name="G">
- G
- </string>
- <string name="H">
- H
- </string>
- <string name="I">
- I
- </string>
- <string name="J">
- J
- </string>
- <string name="K">
- K
- </string>
- <string name="L">
- L
- </string>
- <string name="M">
- M
- </string>
- <string name="N">
- N
- </string>
- <string name="O">
- O
- </string>
- <string name="P">
- P
- </string>
- <string name="Q">
- Q
- </string>
- <string name="R">
- R
- </string>
- <string name="S">
- S
- </string>
- <string name="T">
- T
- </string>
- <string name="U">
- U
- </string>
- <string name="V">
- V
- </string>
- <string name="W">
- W
- </string>
- <string name="X">
- X
- </string>
- <string name="Y">
- Y
- </string>
- <string name="Z">
- Z
- </string>
- <string name="BeaconParticle">
- Visualizzazione marcatori particelle (blu)
- </string>
- <string name="BeaconPhysical">
- Visualizzazione marcatori oggetti fisici (verde)
- </string>
- <string name="BeaconScripted">
- Visualizzazione marcatori oggetti scriptati (rosso)
- </string>
- <string name="BeaconScriptedTouch">
- Visualizzazione marcatori oggetti scriptati con funzione tocco (rosso)
- </string>
- <string name="BeaconSound">
- Visualizzazione marcatori suoni (giallo)
- </string>
- <string name="BeaconMedia">
- Visualizzazione marcatori multimedia (bianco)
- </string>
- <string name="ParticleHiding">
- Particelle nascoste
- </string>
- <string name="Command_AboutLand_Label">
- Informazioni sul terreno
- </string>
- <string name="Command_Appearance_Label">
- Aspetto fisico
- </string>
- <string name="Command_Avatar_Label">
- Avatar
- </string>
- <string name="Command_Build_Label">
- Costruisci
- </string>
- <string name="Command_Chat_Label">
- Chat
- </string>
- <string name="Command_Compass_Label">
- Bussola
- </string>
- <string name="Command_Destinations_Label">
- Destinazioni
- </string>
- <string name="Command_Gestures_Label">
- Gesture
- </string>
- <string name="Command_HowTo_Label">
- Istruzioni
- </string>
- <string name="Command_Inventory_Label">
- Inventario
- </string>
- <string name="Command_Map_Label">
- Mappa
- </string>
- <string name="Command_Marketplace_Label">
- Mercato
- </string>
- <string name="Command_MiniMap_Label">
- Mini mappa
- </string>
- <string name="Command_Move_Label">
- Cammina / corri / vola
- </string>
- <string name="Command_Outbox_Label">
- Casella in uscita del rivenditore
- </string>
- <string name="Command_People_Label">
- Persone
- </string>
- <string name="Command_Picks_Label">
- Preferiti
- </string>
- <string name="Command_Places_Label">
- Luoghi
- </string>
- <string name="Command_Preferences_Label">
- Preferenze
- </string>
- <string name="Command_Profile_Label">
- Profilo
- </string>
- <string name="Command_Search_Label">
- Ricerca
- </string>
- <string name="Command_Snapshot_Label">
- Istantanea
- </string>
- <string name="Command_Speak_Label">
- Parla
- </string>
- <string name="Command_View_Label">
- Controlli fotocamera
- </string>
- <string name="Command_Voice_Label">
- Impostazioni voce
- </string>
- <string name="Command_AboutLand_Tooltip">
- Informazioni sul terreno che visiti
- </string>
- <string name="Command_Appearance_Tooltip">
- Cambia l&apos;avatar
- </string>
- <string name="Command_Avatar_Tooltip">
- Seleziona un avatar completo
- </string>
- <string name="Command_Build_Tooltip">
- Costruzione oggetti e modifica terreno
- </string>
- <string name="Command_Chat_Tooltip">
- Chatta con persone vicine usando il testo
- </string>
- <string name="Command_Compass_Tooltip">
- Bussola
- </string>
- <string name="Command_Destinations_Tooltip">
- Destinazioni interessanti
- </string>
- <string name="Command_Gestures_Tooltip">
- Gesti per il tuo avatar
- </string>
- <string name="Command_HowTo_Tooltip">
- Come eseguire le attività più comuni
- </string>
- <string name="Command_Inventory_Tooltip">
- Visualizza e usa le tue cose
- </string>
- <string name="Command_Map_Tooltip">
- Mappa del mondo
- </string>
- <string name="Command_Marketplace_Tooltip">
- Vai allo shopping
- </string>
- <string name="Command_MiniMap_Tooltip">
- Mostra le persone vicine
- </string>
- <string name="Command_Move_Tooltip">
- Movimento avatar
- </string>
- <string name="Command_Outbox_Tooltip">
- Trasferisci elementi al tuo mercato per la vendita
- </string>
- <string name="Command_People_Tooltip">
- Amici, gruppi e persone vicine
- </string>
- <string name="Command_Picks_Tooltip">
- Luoghi da mostrare come preferiti nel profilo
- </string>
- <string name="Command_Places_Tooltip">
- Luoghi salvati
- </string>
- <string name="Command_Preferences_Tooltip">
- Preferenze
- </string>
- <string name="Command_Profile_Tooltip">
- Modifica o visualizza il tuo profilo
- </string>
- <string name="Command_Search_Tooltip">
- Trova luoghi, eventi, persone
- </string>
- <string name="Command_Snapshot_Tooltip">
- Scatta una foto
- </string>
- <string name="Command_Speak_Tooltip">
- Parla con persone vicine usando il microfono
- </string>
- <string name="Command_View_Tooltip">
- Modifica angolo fotocamera
- </string>
- <string name="Command_Voice_Tooltip">
- I controlli per il volume per le chiamate e per le persone nelle vicinanze nel mondo virtuale
- </string>
- <string name="Toolbar_Bottom_Tooltip">
- attualmente nella barra degli strumenti in basso
- </string>
- <string name="Toolbar_Left_Tooltip">
- attualmente nella barra degli strumenti a sinistra
- </string>
- <string name="Toolbar_Right_Tooltip">
- attualmente nella barra degli strumenti a destra
- </string>
- <string name="Retain%">
- Mantieni%
- </string>
- <string name="Detail">
- Dettagli
- </string>
- <string name="Better Detail">
- Migliori dettagli
- </string>
- <string name="Surface">
- Superficie
- </string>
- <string name="Solid">
- Solido
- </string>
- <string name="Wrap">
- Involucro
- </string>
- <string name="Preview">
- Anteprima
- </string>
- <string name="Normal">
- Normale
- </string>
- <string name="snapshot_quality_very_low">
- Molto basso
- </string>
- <string name="snapshot_quality_low">
- Basso
- </string>
- <string name="snapshot_quality_medium">
- Medio
- </string>
- <string name="snapshot_quality_high">
- Alto
- </string>
- <string name="snapshot_quality_very_high">
- Molto alto
- </string>
-</strings>
diff --git a/indra/newview/skins/steam/xui/ja/strings.xml b/indra/newview/skins/steam/xui/ja/strings.xml
deleted file mode 100644
index 29ef13109c..0000000000
--- a/indra/newview/skins/steam/xui/ja/strings.xml
+++ /dev/null
@@ -1,5018 +0,0 @@
-<?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
- 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">
- [APP_NAME] をインストール中です...
- </string>
- <string name="StartupClearingCache">
- キャッシュをクリア中です...
- </string>
- <string name="StartupInitializingTextureCache">
- テクスチャキャッシュを初期化中です...
- </string>
- <string name="StartupInitializingVFS">
- VFS を初期化中です...
- </string>
- <string name="StartupRequireDriverUpdate">
- グラフィックを初期化できませんでした。グラフィックドライバを更新してください。
- </string>
- <string name="ProgressRestoring">
- 復元中です...
- </string>
- <string name="ProgressChangingResolution">
- 解像度を変更中です...
- </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] 回目)
- </string>
- <string name="LoginPrecaching">
- ワールドを読み込んでいます...
- </string>
- <string name="LoginInitializingBrowser">
- 内蔵 Web ブラウザを初期化しています...
- </string>
- <string name="LoginInitializingMultimedia">
- マルチメディアを初期化しています...
- </string>
- <string name="LoginInitializingFonts">
- フォントをローディング中...
- </string>
- <string name="LoginVerifyingCache">
- キャッシュファイルを検証しています(所要時間は 60 ~ 90 秒)...
- </string>
- <string name="LoginProcessingResponse">
- 対応を処理中です...
- </string>
- <string name="LoginInitializingWorld">
- ワールドを初期化中です...
- </string>
- <string name="LoginDecodingImages">
- 画像をデコードしています...
- </string>
- <string name="LoginInitializingQuicktime">
- QuickTime を初期化しています...
- </string>
- <string name="LoginQuicktimeNotFound">
- QuickTime が見つかりません。初期化に失敗しました。
- </string>
- <string name="LoginQuicktimeOK">
- QuickTime が正常に初期化されました。
- </string>
- <string name="LoginRequestSeedCapGrant">
- リージョンの機能をリクエストしています...
- </string>
- <string name="LoginRetrySeedCapGrant">
- リージョンの機能をリクエスト、試行 [NUMBER] 回....
- </string>
- <string name="LoginWaitingForRegionHandshake">
- リージョンのハンドシェイクを待っています...
- </string>
- <string name="LoginConnectingToRegion">
- リージョンに接続しています...
- </string>
- <string name="LoginDownloadingClothing">
- 衣類をダウンロードしています...
- </string>
- <string name="InvalidCertificate">
- 証明書が無効または壊れています。 グリッド管理者にご連絡ください。
- </string>
- <string name="CertInvalidHostname">
- 無効なホストネームがサーバーにアクセスしていました。SLURL かグリッドのホストネームをご確認ください。
- </string>
- <string name="CertExpired">
- グリッドが返した証明書は有効期限が終了していると考えられます。お使いのシステムクロックを確認するか、グリッドの管理者にお問い合わせください。
- </string>
- <string name="CertKeyUsage">
- SSL 証明書のエラーが発生しました。 グリッド管理者にご連絡ください。
- </string>
- <string name="CertBasicConstraints">
- サーバーの証明書チェーンに証明書が多すぎます。 グリッド管理者にご連絡ください。
- </string>
- <string name="CertInvalidSignature">
- グリッドサーバーが返した証明書の署名を認証できませんでした。グリッドの管理者にお問い合わせください。
- </string>
- <string name="LoginFailedNoNetwork">
- ネットワークエラー:接続を確立できませんでした。お使いのネットワーク接続をご確認ください。
- </string>
- <string name="LoginFailed">
- ログインに失敗しました。
- </string>
- <string name="Quit">
- 終了
- </string>
- <string name="create_account_url">
- http://join.secondlife.com/index.php?sourceid=1206_steam&amp;lang=ja-JP
- </string>
- <string name="LoginFailedViewerNotPermitted">
- お使いの古いビューワでは Second Life にアクセスできません。以下のページから新しいビューワをダウンロードしてください:
-http://secondlife.com/download
-
-詳細については、FAQ を参照してください:
-http://secondlife.com/viewer-access-faq
- </string>
- <string name="LoginIntermediateOptionalUpdateAvailable">
- ビューワアップデート(オプション)があります: [VERSION]
- </string>
- <string name="LoginFailedRequiredUpdate">
- ビューワアップデート(必須): [VERSION]
- </string>
- <string name="LoginFailedAlreadyLoggedIn">
- このエージェントは既にログインされています。
- </string>
- <string name="LoginFailedAuthenticationFailed">
- 申し訳ありませんが、ログインできませんでした。
-以下の情報が正しく入力されたことを確認してください:
-* ユーザー名(bobsmith12 または steller.sunshine など)
-* パスワード
-また、Caps Lock キーが有効になっていないこともお確かめください。
- </string>
- <string name="LoginFailedPasswordChanged">
- セキュリティ上の理由により、あなたのパスワードは変更されました。
-アカウントページ(http://secondlife.com/password)に移動し、
-秘密の質問に答えて、パスワードをリセットしてください。
-ご迷惑をおかけして申し訳ございません。
- </string>
- <string name="LoginFailedPasswordReset">
- 弊社はシステムを若干変更しました。お手数ですが、パスワードのリセットをお願いします。
-アカウントページ(http://secondlife.com/password)に移動し、
-秘密の質問に答えて、パスワードをリセットしてください。
-ご迷惑をおかけして申し訳ございません。
- </string>
- <string name="LoginFailedEmployeesOnly">
- Second Life はメンテナンスのため、一時的にご利用いただけません。
-従業員以外にはログインをご遠慮いただいています。
-最新の状況については www.secondlife.com/status でお確かめください。
- </string>
- <string name="LoginFailedPremiumOnly">
- 既にログインしているユーザーに最上のインワールド体験を提供するため、Second Life へのログインは一時的に制限されています。
-
-申し訳ございませんが、有料アカウントのユーザーを優先するため、現在のところ無料アカウントのユーザーには Second Life へのアクセスをご遠慮いただいています。
- </string>
- <string name="LoginFailedComputerProhibited">
- このパソコンからは Second Life にアクセスできません。
-システムのエラーだと思われる場合は、
-support@secondlife.com にお問い合わせください。
- </string>
- <string name="LoginFailedAcountSuspended">
- あなたのアカウントは
-太平洋時間の [TIME] までご利用いただけません。
- </string>
- <string name="LoginFailedAccountDisabled">
- 現在リクエストを完了することができません。
-Second Life のサポート(http://secondlife.com/support)にお問い合わせください。
-パスワードを変更できない場合には、(866) 476-9763 に電話でお問い合わせください。
- </string>
- <string name="LoginFailedTransformError">
- ログイン時にデータの不一致が見つかりました。
-support@secondlife.com にお問い合わせください。
- </string>
- <string name="LoginFailedAccountMaintenance">
- 現在アカウントのメインテナンスが行われています。
-あなたのアカウントは
-太平洋時間の [TIME] までご利用いただけません。
-システムのエラーだと思われる場合は、support@secondlife.com にお問い合わせください。
- </string>
- <string name="LoginFailedPendingLogoutFault">
- ログアウトをリスクエストしたら、シミュレーターから「fault」が返されました。
- </string>
- <string name="LoginFailedPendingLogout">
- システムによるログアウトが実行されました。
-あなたのアカウントは
-太平洋時間の [TIME] までご利用いただけません。
- </string>
- <string name="LoginFailedUnableToCreateSession">
- 有効なセッションを生成できません。
- </string>
- <string name="LoginFailedUnableToConnectToSimulator">
- シミュレーターに接続できませんでした。
- </string>
- <string name="LoginFailedRestrictedHours">
- あなたの Second Life アカウントにアクセスできるのは、
-太平洋時間の [START] ~ [END] の間に限られます。
-有効な時間帯に再度お試しください。
-システムのエラーだと思われる場合は、support@secondlife.com にお問い合わせください。
- </string>
- <string name="LoginFailedIncorrectParameters">
- パラメーターが正しくありません。
-システムのエラーだと思われる場合は、support@secondlife.com にお問い合わせください。
- </string>
- <string name="LoginFailedFirstNameNotAlphanumeric">
- ファーストネームのパラメーターは英数字です。
-システムのエラーだと思われる場合は、support@secondlife.com にお問い合わせください。
- </string>
- <string name="LoginFailedLastNameNotAlphanumeric">
- ラストネームのパラメーターは英数字です。
-システムのエラーだと思われる場合は、support@secondlife.com にお問い合わせください。
- </string>
- <string name="LogoutFailedRegionGoingOffline">
- リージョンはオフライン中です。
-しばらくしてから再度お試しください。
- </string>
- <string name="LogoutFailedAgentNotInRegion">
- エージェントがリージョンに不在です。
-しばらくしてから再度お試しください。
- </string>
- <string name="LogoutFailedPendingLogin">
- このリージョンでは別のセッションがログインされていました。
-しばらくしてから再度お試しください。
- </string>
- <string name="LogoutFailedLoggingOut">
- このリージョンでは前のセッションがログアウトされました。
-しばらくしてから再度お試しください。
- </string>
- <string name="LogoutFailedStillLoggingOut">
- このリージョンでは現在も前のセッションのログアウトが処理されています。
-しばらくしてから再度お試しください。
- </string>
- <string name="LogoutSucceeded">
- リージョンでは前のセッションがログアウトされました。
-しばらくしてから再度お試しください。
- </string>
- <string name="LogoutFailedLogoutBegun">
- リージョンではログアウトプロセスが開始されました。
-しばらくしてから再度お試しください。
- </string>
- <string name="LoginFailedLoggingOutSession">
- あなたの前のセッションはシステムによってログアウトされています。
-しばらくしてから再度お試しください。
- </string>
- <string name="AgentLostConnection">
- このリージョンに不都合が発生している可能性があります。 ご使用のインターネット接続をご確認ください。
- </string>
- <string name="SavingSettings">
- 設定を保存中です...
- </string>
- <string name="LoggingOut">
- ログアウト中です...
- </string>
- <string name="ShuttingDown">
- シャットダウン中です...
- </string>
- <string name="YouHaveBeenDisconnected">
- あなたがいたリージョンへの接続が切れました。
- </string>
- <string name="SentToInvalidRegion">
- 無効なリージョンにテレポートされました。
- </string>
- <string name="TestingDisconnect">
- ビューワの接続を切るテスト中
- </string>
- <string name="TooltipPerson">
- 人
- </string>
- <string name="TooltipNoName">
- (名前なし)
- </string>
- <string name="TooltipOwner">
- 所有者:
- </string>
- <string name="TooltipPublic">
- 公共
- </string>
- <string name="TooltipIsGroup">
- (グループ)
- </string>
- <string name="TooltipForSaleL$">
- 売り出し中:L$ [AMOUNT]
- </string>
- <string name="TooltipFlagGroupBuild">
- グループ作成
- </string>
- <string name="TooltipFlagNoBuild">
- 作成禁止
- </string>
- <string name="TooltipFlagNoEdit">
- グループ作成
- </string>
- <string name="TooltipFlagNotSafe">
- 危険
- </string>
- <string name="TooltipFlagNoFly">
- 飛行禁止
- </string>
- <string name="TooltipFlagGroupScripts">
- グループスクリプト
- </string>
- <string name="TooltipFlagNoScripts">
- スクリプトなし
- </string>
- <string name="TooltipLand">
- 土地:
- </string>
- <string name="TooltipMustSingleDrop">
- アイテムは 1 つだけここにドラッグできます
- </string>
- <string name="TooltipPrice" value="L$[AMOUNT]:"/>
- <string name="TooltipOutboxDragToWorld">
- マーチャントボックス内のアイテムを Rez することはできません
- </string>
- <string name="TooltipOutboxNoTransfer">
- これらオブジェクトの 1 つまたは複数は売り渡したり譲渡したりできないものです。
- </string>
- <string name="TooltipOutboxNotInInventory">
- マーチャントアウトボックスでは、ご自分のインベントリからのアイテムしか受け入れることができません
- </string>
- <string name="TooltipOutboxWorn">
- 着用しているアイテムをマーチャントアウトボックスに入れることはできません
- </string>
- <string name="TooltipOutboxCallingCard">
- コーリングカードをマーチャントアウトボックスに入れることはできません
- </string>
- <string name="TooltipOutboxFolderLevels">
- ネスト入りフォルダの深さが 3 を超えています
- </string>
- <string name="TooltipOutboxTooManyFolders">
- 最上位フォルダ内のサブフォルダ数が 20 を超えています
- </string>
- <string name="TooltipOutboxTooManyObjects">
- 最上位フォルダ内のアイテム数が 200 を超えています
- </string>
- <string name="TooltipDragOntoOwnChild">
- フォルダをその子フォルダに移動することはできません
- </string>
- <string name="TooltipDragOntoSelf">
- フォルダをそのフォルダ自身に移動することはできません
- </string>
- <string name="TooltipHttpUrl">
- クリックしてこの Web ページを見ます
- </string>
- <string name="TooltipSLURL">
- クリックしてこの場所の情報を見ます
- </string>
- <string name="TooltipAgentUrl">
- クリックしてこの住人のプロフィールを見ます
- </string>
- <string name="TooltipAgentInspect">
- この住人の詳細を参照
- </string>
- <string name="TooltipAgentMute">
- クリックしてこの住人に対して無視設定をします
- </string>
- <string name="TooltipAgentUnmute">
- クリックしてこの住人に対する無視設定を解除します
- </string>
- <string name="TooltipAgentIM">
- クリックしてこの住人に IM を送ります
- </string>
- <string name="TooltipAgentPay">
- クリックしてこの住人に支払います
- </string>
- <string name="TooltipAgentOfferTeleport">
- クリックしてこの住人にテレポートのリクエストを送ります
- </string>
- <string name="TooltipAgentRequestFriend">
- クリックしてこの住人にフレンド登録リクエストを送ります
- </string>
- <string name="TooltipGroupUrl">
- クリックしてこのグループの説明文を見ます
- </string>
- <string name="TooltipEventUrl">
- クリックしてこのグループの説明文を見ます
- </string>
- <string name="TooltipClassifiedUrl">
- クリックしてこのクラシファイド広告を見ます
- </string>
- <string name="TooltipParcelUrl">
- クリックしてこの区画の説明文を見ます
- </string>
- <string name="TooltipTeleportUrl">
- クリックしてこの場所にテレポートします
- </string>
- <string name="TooltipObjectIMUrl">
- クリックしてこのオブジェクトの説明文を見ます
- </string>
- <string name="TooltipMapUrl">
- クリックしてこの場所を地図に表示します
- </string>
- <string name="TooltipSLAPP">
- クリックして secondlife:// コマンドを出します
- </string>
- <string name="CurrentURL" value=" 現在の URL: [CurrentURL]"/>
- <string name="SLurlLabelTeleport">
- テレポート
- </string>
- <string name="SLurlLabelShowOnMap">
- 地図に表示
- </string>
- <string name="SLappAgentMute">
- 無視
- </string>
- <string name="SLappAgentUnmute">
- ミュート解除
- </string>
- <string name="SLappAgentIM">
- IM
- </string>
- <string name="SLappAgentPay">
- 支払う
- </string>
- <string name="SLappAgentOfferTeleport">
- 次の場所にテレポートを送ります:
- </string>
- <string name="SLappAgentRequestFriend">
- フレンド登録リクエスト
- </string>
- <string name="BUTTON_CLOSE_DARWIN">
- 閉じる (⌘W)
- </string>
- <string name="BUTTON_CLOSE_WIN">
- 閉じる (Ctrl+W)
- </string>
- <string name="BUTTON_CLOSE_CHROME">
- 閉じる
- </string>
- <string name="BUTTON_RESTORE">
- 復元
- </string>
- <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="RELEASE_NOTES_BASE_URL">
- http://wiki.secondlife.com/wiki/Release_Notes/
- </string>
- <string name="LoadingData">
- ローディング...
- </string>
- <string name="AvatarNameNobody">
- (なし)
- </string>
- <string name="AvatarNameWaiting">
- (待機中)
- </string>
- <string name="AvatarNameMultiple">
- (複数)
- </string>
- <string name="GroupNameNone">
- (なし)
- </string>
- <string name="AvalineCaller">
- Avaline コール [ORDER]
- </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="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="symbolic folder link">
- フォルダのリンク
- </string>
- <string name="mesh">
- メッシュ
- </string>
- <string name="AvatarEditingAppearance">
- (容姿の編集中)
- </string>
- <string name="AvatarAway">
- 一時退席中
- </string>
- <string name="AvatarBusy">
- 取り込み中
- </string>
- <string name="AvatarMuted">
- ブロック中
- </string>
- <string name="anim_express_afraid">
- 怖れ
- </string>
- <string name="anim_express_anger">
- 怒り
- </string>
- <string name="anim_away">
- 退席中
- </string>
- <string name="anim_backflip">
- 後ろ宙返り
- </string>
- <string name="anim_express_laugh">
- 大笑い
- </string>
- <string name="anim_express_toothsmile">
- 満面の笑顔
- </string>
- <string name="anim_blowkiss">
- 投げキッス
- </string>
- <string name="anim_express_bored">
- 退屈
- </string>
- <string name="anim_bow">
- おじぎ
- </string>
- <string name="anim_clap">
- 拍手
- </string>
- <string name="anim_courtbow">
- 深いおじぎ
- </string>
- <string name="anim_express_cry">
- 泣く
- </string>
- <string name="anim_dance1">
- ダンス 1
- </string>
- <string name="anim_dance2">
- ダンス 2
- </string>
- <string name="anim_dance3">
- ダンス 3
- </string>
- <string name="anim_dance4">
- ダンス 4
- </string>
- <string name="anim_dance5">
- ダンス 5
- </string>
- <string name="anim_dance6">
- ダンス 6
- </string>
- <string name="anim_dance7">
- ダンス 7
- </string>
- <string name="anim_dance8">
- ダンス 8
- </string>
- <string name="anim_express_disdain">
- 侮蔑
- </string>
- <string name="anim_drink">
- 酔っぱらう
- </string>
- <string name="anim_express_embarrased">
- 困惑
- </string>
- <string name="anim_angry_fingerwag">
- 指を振る
- </string>
- <string name="anim_fist_pump">
- ガッツポーズ
- </string>
- <string name="anim_yoga_float">
- ヨガ浮遊
- </string>
- <string name="anim_express_frown">
- しかめっ面
- </string>
- <string name="anim_impatient">
- いらいらする
- </string>
- <string name="anim_jumpforjoy">
- 飛び上がって喜ぶ
- </string>
- <string name="anim_kissmybutt">
- 挑発ポーズ
- </string>
- <string name="anim_express_kiss">
- キス
- </string>
- <string name="anim_laugh_short">
- 笑う
- </string>
- <string name="anim_musclebeach">
- 力こぶを見せる
- </string>
- <string name="anim_no_unhappy">
- 不満げに否定する
- </string>
- <string name="anim_no_head">
- 否定する
- </string>
- <string name="anim_nyanya">
- 冷やかす
- </string>
- <string name="anim_punch_onetwo">
- ワンツー・パンチ
- </string>
- <string name="anim_express_open_mouth">
- 口を開けて驚く
- </string>
- <string name="anim_peace">
- ピース・サイン
- </string>
- <string name="anim_point_you">
- 他人を指差す
- </string>
- <string name="anim_point_me">
- 自分を指差す
- </string>
- <string name="anim_punch_l">
- 左パンチ
- </string>
- <string name="anim_punch_r">
- 右パンチ
- </string>
- <string name="anim_rps_countdown">
- じゃんけんポーズ
- </string>
- <string name="anim_rps_paper">
- パー
- </string>
- <string name="anim_rps_rock">
- グー
- </string>
- <string name="anim_rps_scissors">
- チョキ
- </string>
- <string name="anim_express_repulsed">
- 嫌悪感
- </string>
- <string name="anim_kick_roundhouse_r">
- まわし蹴り
- </string>
- <string name="anim_express_sad">
- 悲しむ
- </string>
- <string name="anim_salute">
- 敬礼する
- </string>
- <string name="anim_shout">
- 叫ぶ
- </string>
- <string name="anim_express_shrug">
- 肩をすくめる
- </string>
- <string name="anim_express_smile">
- 微笑む
- </string>
- <string name="anim_smoke_idle">
- たばこをくゆらす
- </string>
- <string name="anim_smoke_inhale">
- たばこを吸う
- </string>
- <string name="anim_smoke_throw_down">
- たばこを捨てる
- </string>
- <string name="anim_express_surprise">
- 驚く
- </string>
- <string name="anim_sword_strike_r">
- 剣で斬りつける
- </string>
- <string name="anim_angry_tantrum">
- じだんだを踏む
- </string>
- <string name="anim_express_tongue_out">
- 舌を出す
- </string>
- <string name="anim_hello">
- 手を振る
- </string>
- <string name="anim_whisper">
- 小声で話す
- </string>
- <string name="anim_whistle">
- 口笛を吹く
- </string>
- <string name="anim_express_wink">
- ウィンク
- </string>
- <string name="anim_wink_hollywood">
- ウィンク(ハリウッド)
- </string>
- <string name="anim_express_worry">
- 心配する
- </string>
- <string name="anim_yes_happy">
- 笑顔で頷く
- </string>
- <string name="anim_yes_head">
- 頷く
- </string>
- <string name="multiple_textures">
- 複数
- </string>
- <string name="texture_loading">
- ローディング...
- </string>
- <string name="worldmap_offline">
- オフライン
- </string>
- <string name="worldmap_item_tooltip_format">
- [AREA] 平方メートル L$[PRICE]
- </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">
- General
- </string>
- <string name="SIM_ACCESS_MATURE">
- Moderate
- </string>
- <string name="SIM_ACCESS_ADULT">
- Adult
- </string>
- <string name="SIM_ACCESS_DOWN">
- オフライン
- </string>
- <string name="SIM_ACCESS_MIN">
- 不明
- </string>
- <string name="land_type_unknown">
- (不明)
- </string>
- <string name="Estate / Full Region">
- 不動産 / フルリージョン
- </string>
- <string name="Estate / Homestead">
- エステート/ホームステッド
- </string>
- <string name="Mainland / Homestead">
- メインランド/ホームステッド
- </string>
- <string name="Mainland / Full Region">
- メインランド / フルリージョン
- </string>
- <string name="all_files">
- 全てのファイル
- </string>
- <string name="sound_files">
- サウンド
- </string>
- <string name="animation_files">
- アニメーション
- </string>
- <string name="image_files">
- 画像
- </string>
- <string name="save_file_verb">
- 保存
- </string>
- <string name="load_file_verb">
- ロード
- </string>
- <string name="targa_image_files">
- Targa 画像
- </string>
- <string name="bitmap_image_files">
- ビットマップ画像
- </string>
- <string name="avi_movie_file">
- AVI ムービーファイル
- </string>
- <string name="xaf_animation_file">
- XAF アニメーションファイル
- </string>
- <string name="xml_file">
- XML ファイル
- </string>
- <string name="raw_file">
- RAW ファイル
- </string>
- <string name="compressed_image_files">
- 圧縮画像
- </string>
- <string name="load_files">
- ファイルのロード
- </string>
- <string name="choose_the_directory">
- 参照
- </string>
- <string name="script_files">
- スクリプト
- </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="physics">
- 物理作用
- </string>
- <string name="invalid">
- 無効
- </string>
- <string name="none">
- なし
- </string>
- <string name="shirt_not_worn">
- シャツ未着用
- </string>
- <string name="pants_not_worn">
- パンツ未着用
- </string>
- <string name="shoes_not_worn">
- 靴未着用
- </string>
- <string name="socks_not_worn">
- 靴下未着用
- </string>
- <string name="jacket_not_worn">
- ジャケット未着用
- </string>
- <string name="gloves_not_worn">
- 手袋未着用
- </string>
- <string name="undershirt_not_worn">
- 下着(上)未着用
- </string>
- <string name="underpants_not_worn">
- 下着(下)未着用
- </string>
- <string name="skirt_not_worn">
- スカート未着用
- </string>
- <string name="alpha_not_worn">
- アルファ未着用
- </string>
- <string name="tattoo_not_worn">
- タトゥー未着用
- </string>
- <string name="physics_not_worn">
- 物理作用なし
- </string>
- <string name="invalid_not_worn">
- 無効
- </string>
- <string name="create_new_shape">
- 新しいシェイプを作成
- </string>
- <string name="create_new_skin">
- 新しいスキンを作成
- </string>
- <string name="create_new_hair">
- 新しい髪を作成
- </string>
- <string name="create_new_eyes">
- 新しい目を作成
- </string>
- <string name="create_new_shirt">
- 新しいシャツを作成
- </string>
- <string name="create_new_pants">
- 新しいパンツを作成
- </string>
- <string name="create_new_shoes">
- 新しい靴を作成
- </string>
- <string name="create_new_socks">
- 新しい靴下を作成
- </string>
- <string name="create_new_jacket">
- 新しい上着を作成
- </string>
- <string name="create_new_gloves">
- 新しい手袋を作成
- </string>
- <string name="create_new_undershirt">
- 新しい下着シャツを作成
- </string>
- <string name="create_new_underpants">
- 新しい下着パンツを作成
- </string>
- <string name="create_new_skirt">
- 新しいスカートを作成
- </string>
- <string name="create_new_alpha">
- 新しいアルファを作成
- </string>
- <string name="create_new_tattoo">
- 新しいタトゥを作成
- </string>
- <string name="create_new_physics">
- 新しい物理作用を作成
- </string>
- <string name="create_new_invalid">
- 無効
- </string>
- <string name="NewWearable">
- 新しい [WEARABLE_ITEM]
- </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/all/[SEARCH_TERM] 検索] をお試しください。
- </string>
- <string name="PlacesNoMatchingItems">
- お探しのものは見つかりましたか? [secondlife:///app/search/places/[SEARCH_TERM] 検索] をお試しください。
- </string>
- <string name="FavoritesNoMatchingItems">
- ここにランドマークをドラッグしてお気に入りに追加します。
- </string>
- <string name="InventoryNoTexture">
- インベントリ内にこのテクスチャのコピーがありません
- </string>
- <string name="InventoryInboxNoItems">
- マーケットプレイスで購入した商品はここに表示されます。その後、アイテムをインベントリにドラッグすれば、それらのアイテムを使用できます。
- </string>
- <string name="MarketplaceURL">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
- </string>
- <string name="MarketplaceURL_CreateStore">
- http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
- </string>
- <string name="MarketplaceURL_Dashboard">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
- </string>
- <string name="MarketplaceURL_Imports">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
- </string>
- <string name="MarketplaceURL_LearnMore">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
- </string>
- <string name="InventoryOutboxNotMerchantTitle">
- マーケットプレイスでは誰でもアイテムを売ることができます。
- </string>
- <string name="InventoryOutboxNotMerchantTooltip"/>
- <string name="InventoryOutboxNotMerchant">
- マーチャントになりたい方は、[[MARKETPLACE_CREATE_STORE_URL] マーケットプレイスストアを作成]する必要があります。
- </string>
- <string name="InventoryOutboxNoItemsTitle">
- アウトボックスは空です。
- </string>
- <string name="InventoryOutboxNoItemsTooltip"/>
- <string name="InventoryOutboxNoItems">
- [[MARKETPLACE_DASHBOARD_URL] マーケットプレイス]に販売するアイテムを一覧するには、フォルダをこのエリアにドラッグし、「マーケットプレイスに送信」をクリックします。
- </string>
- <string name="Marketplace Error None">
- エラーなし
- </string>
- <string name="Marketplace Error Not Merchant">
- エラー:マーケットプレイスにアイテムを送る前に、あなた自身をマーチャント登録する必要があります(登録は無料です)。
- </string>
- <string name="Marketplace Error Empty Folder">
- エラー:このフォルダは空です。
- </string>
- <string name="Marketplace Error Unassociated Products">
- エラー:あなたのマーチャントアカウントには、商品に関連付けられていないアイテムが多すぎるため、このアイテムをアップロードできませんでした。このエラーを解消するには、マーケットプレイスの Web サイトにログインし、関連付けられていないアイテムの数を減らしてください。
- </string>
- <string name="Marketplace Error Object Limit">
- エラー:このアイテムに含まれるオブジェクトが多すぎます。オブジェクトをいくつかボックスにまとめ、オブジェクト数を200以下に減らしてください。
- </string>
- <string name="Marketplace Error Folder Depth">
- エラー:このアイテムはネスト入りフォルダの階層が多すぎます。ネスト入りフォルダを 3 階層以内にまとめ直してください。
- </string>
- <string name="Marketplace Error Unsellable Item">
- エラー:このアイテムをマーケットプレイスで販売することはできません。
- </string>
- <string name="Marketplace Error Internal Import">
- エラー:このアイテムに関して問題が発生しました。しばらくしてからお試しください。
- </string>
- <string name="Open landmarks">
- ランドマークを開く
- </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="ActiveGesture" value="[GESLABEL] (アクティブ)"/>
- <string name="PermYes">
- はい
- </string>
- <string name="PermNo">
- いいえ
- </string>
- <string name="Chat Message" value="チャット:"/>
- <string name="Sound" value=" サウンド:"/>
- <string name="Wait" value=" --- 待機::"/>
- <string name="AnimFlagStop" value=" アニメーションを停止:"/>
- <string name="AnimFlagStart" value=" アニメーションを開始:"/>
- <string name="Wave" value=" 手を振る"/>
- <string name="GestureActionNone" value="なし"/>
- <string name="HelloAvatar" value=" やあ、アバター!"/>
- <string name="ViewAllGestures" value=" すべて表示 &gt;&gt;"/>
- <string name="GetMoreGestures" value="ショッピング &gt;&gt;"/>
- <string name="Animations" value="アニメーション、"/>
- <string name="Calling Cards" value="コーリングカード、"/>
- <string name="Clothing" value="衣類、"/>
- <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 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 favorite">
- お気に入り
- </string>
- <string name="InvFolder Current Outfit">
- 着用中のアウトフィット
- </string>
- <string name="InvFolder Initial Outfits">
- 最初のアウトフィット
- </string>
- <string name="InvFolder My Outfits">
- マイ アウトフィット
- </string>
- <string name="InvFolder Accessories">
- アクセサリ
- </string>
- <string name="InvFolder Meshes">
- メッシュ
- </string>
- <string name="InvFolder Friends">
- フレンド
- </string>
- <string name="InvFolder All">
- 全員
- </string>
- <string name="no_attachments">
- 着用しているアタッチメントはありません
- </string>
- <string name="Attachments remain">
- アタッチメント(残りのスロット数:[COUNT])
- </string>
- <string name="Buy">
- 買う
- </string>
- <string name="BuyforL$">
- 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="Neck">
- 首
- </string>
- <string name="Avatar Center">
- アバターの中央
- </string>
- <string name="Invalid Attachment">
- 装着先が正しくありません
- </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="GroupPlanningDate">
- [year,datetime,utc]/[mthnum,datetime,utc]/[day,datetime,utc]
- </string>
- <string name="GroupIndividualShare" value=" グループ 個人の割り当て"/>
- <string name="GroupColumn" 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="Anyone">
- 全員
- </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="PanelContentsTooltip">
- オブジェクトの中身
- </string>
- <string name="PanelContentsNewScript">
- 新規スクリプト
- </string>
- <string name="BusyModeResponseDefault">
- メッセージを送った住人は、誰にも邪魔をされたくないため現在「取り込み中」モードです。 あなたのメッセージは、あとで確認できるように IM パネルに表示されます。
- </string>
- <string name="MuteByName">
- (名称別)
- </string>
- <string name="MuteAgent">
- (住人)
- </string>
- <string name="MuteObject">
- (オブジェクト)
- </string>
- <string name="MuteGroup">
- (グループ)
- </string>
- <string name="MuteExternal">
- (外部)
- </string>
- <string name="RegionNoCovenant">
- この不動産には約款がありません。
- </string>
- <string name="RegionNoCovenantOtherOwner">
- この不動産には約款がありません。 この不動産上の土地は不動産所有者により販売され、Linden Lab は販売しません。 販売に関するお問い合わせは、不動産所有者までお願い致します。
- </string>
- <string name="covenant_last_modified" value="最終修正日:"/>
- <string name="none_text" value=" (なし) "/>
- <string name="never_text" value=" (無) "/>
- <string name="GroupOwned">
- グループ所有
- </string>
- <string name="Public">
- パブリック
- </string>
- <string name="LocalSettings">
- ローカル設定
- </string>
- <string name="RegionSettings">
- リージョン(地域)の設定
- </string>
- <string name="ClassifiedClicksTxt">
- クリック数: [TELEPORT] テレポート、 [MAP] 地図、 [PROFILE] プロフィール
- </string>
- <string name="ClassifiedUpdateAfterPublish">
- (掲載後更新)
- </string>
- <string name="NoPicksClassifiedsText">
- ピックやクラシファイド広告を作成していません。 作成するには、下にある「プラス」ボタンをクリックします。
- </string>
- <string name="NoAvatarPicksClassifiedsText">
- ピック、またはクラシファイド広告がありません
- </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="InvOfferDecline">
- &lt;nolink&gt;[NAME]&lt;/nolink&gt; からの [DESC] を拒否しました。
- </string>
- <string name="GroupMoneyTotal">
- 合計
- </string>
- <string name="GroupMoneyBought">
- 購入:
- </string>
- <string name="GroupMoneyPaidYou">
- あなたに支払い:
- </string>
- <string name="GroupMoneyPaidInto">
- paid into
- </string>
- <string name="GroupMoneyBoughtPassTo">
- 入場許可を購入:
- </string>
- <string name="GroupMoneyPaidFeeForEvent">
- がイベント用の費用を支払いました
- </string>
- <string name="GroupMoneyPaidPrizeForEvent">
- がイベント用の賞金を支払いました
- </string>
- <string name="GroupMoneyBalance">
- 残高
- </string>
- <string name="GroupMoneyCredits">
- 収入
- </string>
- <string name="GroupMoneyDebits">
- 支出
- </string>
- <string name="GroupMoneyDate">
- [year,datetime,utc]年[mth,datetime,utc]月[day,datetime,utc]日[weekday,datetime,utc]
- </string>
- <string name="ViewerObjectContents">
- 内容
- </string>
- <string name="AcquiredItems">
- 取得アイテム
- </string>
- <string name="Cancel">
- キャンセル
- </string>
- <string name="UploadingCosts">
- [NAME] のアップロード料金は L$[AMOUNT] です
- </string>
- <string name="BuyingCosts">
- これを L$[AMOUNT] で購入します
- </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">
- ⌃
- </string>
- <string name="accel-mac-command">
- ⌘
- </string>
- <string name="accel-mac-option">
- ⌥
- </string>
- <string name="accel-mac-shift">
- ⇧
- </string>
- <string name="accel-win-control">
- Ctrl+
- </string>
- <string name="accel-win-alt">
- Alt+
- </string>
- <string name="accel-win-shift">
- Shift+
- </string>
- <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="Direction_Forward">
- 前
- </string>
- <string name="Direction_Left">
- 左
- </string>
- <string name="Direction_Right">
- 右
- </string>
- <string name="Direction_Back">
- 戻る
- </string>
- <string name="Direction_North">
- 北
- </string>
- <string name="Direction_South">
- 南
- </string>
- <string name="Direction_West">
- 西
- </string>
- <string name="Direction_East">
- 東
- </string>
- <string name="Direction_Up">
- 上
- </string>
- <string name="Direction_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">
- 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="Rental">
- レンタル
- </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="Breast Physics Mass">
- 胸の豊かさ
- </string>
- <string name="Breast Physics Smoothing">
- 胸の平滑化
- </string>
- <string name="Breast Physics Gravity">
- 胸の垂れ具合
- </string>
- <string name="Breast Physics Drag">
- 胸の空気抵抗
- </string>
- <string name="Breast Physics InOut Max Effect">
- 最大エフェクト数
- </string>
- <string name="Breast Physics InOut Spring">
- 振動速度
- </string>
- <string name="Breast Physics InOut Gain">
- 増加率
- </string>
- <string name="Breast Physics InOut Damping">
- 減衰
- </string>
- <string name="Breast Physics UpDown Max Effect">
- 最大エフェクト数
- </string>
- <string name="Breast Physics UpDown Spring">
- 振動速度
- </string>
- <string name="Breast Physics UpDown Gain">
- 増加率
- </string>
- <string name="Breast Physics UpDown Damping">
- 減衰
- </string>
- <string name="Breast Physics LeftRight Max Effect">
- 最大エフェクト数
- </string>
- <string name="Breast Physics LeftRight Spring">
- 振動速度
- </string>
- <string name="Breast Physics LeftRight Gain">
- 増加率
- </string>
- <string name="Breast Physics LeftRight Damping">
- 減衰
- </string>
- <string name="Belly Physics Mass">
- お腹の豊かさ
- </string>
- <string name="Belly Physics Smoothing">
- お腹の平滑化
- </string>
- <string name="Belly Physics Gravity">
- お腹の垂れ具合
- </string>
- <string name="Belly Physics Drag">
- お腹の空気抵抗
- </string>
- <string name="Belly Physics UpDown Max Effect">
- 最大エフェクト数
- </string>
- <string name="Belly Physics UpDown Spring">
- 振動速度
- </string>
- <string name="Belly Physics UpDown Gain">
- 増加率
- </string>
- <string name="Belly Physics UpDown Damping">
- 減衰
- </string>
- <string name="Butt Physics Mass">
- お尻の豊かさ
- </string>
- <string name="Butt Physics Smoothing">
- お尻の平滑化
- </string>
- <string name="Butt Physics Gravity">
- お尻の垂れ具合
- </string>
- <string name="Butt Physics Drag">
- お尻の空気抵抗
- </string>
- <string name="Butt Physics UpDown Max Effect">
- 最大エフェクト数
- </string>
- <string name="Butt Physics UpDown Spring">
- 振動速度
- </string>
- <string name="Butt Physics UpDown Gain">
- 増加率
- </string>
- <string name="Butt Physics UpDown Damping">
- 減衰
- </string>
- <string name="Butt Physics LeftRight Max Effect">
- 最大エフェクト数
- </string>
- <string name="Butt Physics LeftRight Spring">
- 振動速度
- </string>
- <string name="Butt Physics LeftRight Gain">
- 増加率
- </string>
- <string name="Butt Physics LeftRight Damping">
- 減衰
- </string>
- <string name="Bushy Eyebrows">
- 太
- </string>
- <string name="Bushy Hair">
- ぼさぼさヘア
- </string>
- <string name="Butt Size">
- お尻の大きさ
- </string>
- <string name="Butt Gravity">
- お尻の垂れ具合
- </string>
- <string name="bustle skirt">
- 後ろの膨らみ
- </string>
- <string name="no bustle">
- 膨らみなし
- </string>
- <string name="more bustle">
- 膨らみ大
- </string>
- <string name="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="Low Heels">
- ローヒール
- </string>
- <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>
- <string name="Taper Back">
- 後ろに先細
- </string>
- <string name="Taper Front">
- 前に先細
- </string>
- <string name="Thick Heels">
- 幅広
- </string>
- <string name="Thick Neck">
- 太
- </string>
- <string name="Thick Toe">
- 厚め
- </string>
- <string name="Thin">
- 薄い
- </string>
- <string name="Thin Eyebrows">
- 細
- </string>
- <string name="Thin Lips">
- 小
- </string>
- <string name="Thin Nose">
- 細い鼻
- </string>
- <string name="Tight Chin">
- ひきしまったあご
- </string>
- <string name="Tight Cuffs">
- タイト
- </string>
- <string name="Tight Pants">
- タイト
- </string>
- <string name="Tight Shirt">
- タイト
- </string>
- <string name="Tight Skirt">
- タイト
- </string>
- <string name="Tight Sleeves">
- タイト
- </string>
- <string name="Toe Shape">
- つま先の形
- </string>
- <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="LocationCtrlAdultIconTooltip">
- Adult リージョン
- </string>
- <string name="LocationCtrlModerateIconTooltip">
- Moderate リージョン
- </string>
- <string name="LocationCtrlGeneralIconTooltip">
- General リージョン
- </string>
- <string name="LocationCtrlSeeAVsTooltip">
- この区画外にアバターを見えるようにして、チャットも許可
- </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="ItemsComingInTooFastFrom">
- [APP_NAME] : アイテムが [FROM_NAME] から同時にたくさん読み込まれているため、自動プレビューが [TIME] 秒間無効となります。
- </string>
- <string name="ItemsComingInTooFast">
- [APP_NAME] : アイテムが同時にたくさん読み込まれているため、自動プレビューが [TIME] 秒間無効となります。
- </string>
- <string name="IM_logging_string">
- -- インスタントメッセージの保存開始 --
- </string>
- <string name="IM_typing_start_string">
- [NAME] は入力中です...
- </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="Saved_message">
- (保存日時:[LONG_TIMESTAMP])
- </string>
- <string name="IM_unblock_only_groups_friends">
- このメッセージを表示するには、「環境設定」の「プライバシー」で「フレンドとグループ以外からはコールと IM を受信しない」チェックボックスをオフにします。
- </string>
- <string name="answered_call">
- 相手がコールを受けました
- </string>
- <string name="you_started_call">
- ボイスコールを開始します
- </string>
- <string name="you_joined_call">
- ボイスコールに参加しました
- </string>
- <string name="name_started_call">
- [NAME] はボイスコールを開始します
- </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="conference-title-incoming">
- [AGENT_NAME] とコンファレンスする
- </string>
- <string name="inventory_item_offered-im">
- インベントリアイテムを送りました
- </string>
- <string name="share_alert">
- インベントリからここにアイテムをドラッグします
- </string>
- <string name="no_session_message">
- (IM セッションが存在しません)
- </string>
- <string name="only_user_message">
- このセッションにいるユーザーはあなただけです。
- </string>
- <string name="offline_message">
- [NAME] はオフライン中です。
- </string>
- <string name="invite_message">
- このボイスチャットに応答・接続する場合は、[BUTTON NAME] をクリックしてください。
- </string>
- <string name="muted_message">
- この住人をブロックしています。 メッセージを送ると、ブロックが自動的に解除されます。
- </string>
- <string name="generic">
- リクエスト中にエラーが発生しました。あとでもう一度お試しください。
- </string>
- <string name="generic_request_error">
- 要求中にエラーが発生しました。後でもう一度試してください。
- </string>
- <string name="insufficient_perms_error">
- あなたには充分な権限がありません。
- </string>
- <string name="session_does_not_exist_error">
- このセッションは既に切断されています。
- </string>
- <string name="no_ability_error">
- あなたにはその能力がありません。
- </string>
- <string name="no_ability">
- あなたにはその能力がありません。
- </string>
- <string name="not_a_mod_error">
- あなたはセッションモデレータではありません。
- </string>
- <string name="muted">
- グループのモデレーターが、あなたのテキストチャットを禁止しました。
- </string>
- <string name="muted_error">
- グループモデレータがあなたのテキストチャットを無効化しました
- </string>
- <string name="add_session_event">
- [RECIPIENT] とのチャットセッションにユーザーを追加することができません
- </string>
- <string name="message">
- [RECIPIENT] とのチャットセッションに、メッセージを送信することができません。
- </string>
- <string name="message_session_event">
- [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="unread_chat_single">
- [SOURCES] は何か新しいことを言いました。
- </string>
- <string name="unread_chat_multiple">
- [SOURCES] は何か新しいことを言いました。
- </string>
- <string name="session_initialization_timed_out_error">
- セッションの初期化がタイムアウトしました
- </string>
- <string name="Home position set.">
- 家の配置の設定。
- </string>
- <string name="voice_morphing_url">
- http://secondlife.com/landing/voicemorphing
- </string>
- <string name="paid_you_ldollars">
- [NAME] は [REASON] のために L$[AMOUNT] を支払いました。
- </string>
- <string name="paid_you_ldollars_no_reason">
- [NAME] は L$[AMOUNT] を支払いました。
- </string>
- <string name="you_paid_ldollars">
- [NAME] に L$ [AMOUNT] を支払いました:[REASON]
- </string>
- <string name="you_paid_ldollars_no_info">
- L$ [AMOUNT] を支払いました。
- </string>
- <string name="you_paid_ldollars_no_reason">
- [NAME] に L$ [AMOUNT] を支払いました。
- </string>
- <string name="you_paid_ldollars_no_name">
- L$ [AMOUNT] を支払いました:[REASON]
- </string>
- <string name="you_paid_failure_ldollars">
- [NAME] に [REASON] の代金 L$ [AMOUNT] を支払えませんでした。
- </string>
- <string name="you_paid_failure_ldollars_no_info">
- L$ [AMOUNT] を支払えませんでした。
- </string>
- <string name="you_paid_failure_ldollars_no_reason">
- [NAME] に L$ [AMOUNT] を支払えませんでした。
- </string>
- <string name="you_paid_failure_ldollars_no_name">
- [REASON] の 代金 L$ [AMOUNT] を支払えませんでした。
- </string>
- <string name="for item">
- [ITEM] 向け
- </string>
- <string name="for a parcel of land">
- 土地区画のため
- </string>
- <string name="for a land access pass">
- 土地の入場許可を得るため
- </string>
- <string name="for deeding land">
- 土地を譲渡するため
- </string>
- <string name="to create a group">
- グループを作成するため
- </string>
- <string name="to join a group">
- グループに参加するため
- </string>
- <string name="to upload">
- アップロードするため
- </string>
- <string name="to publish a classified ad">
- クラシファイド広告を掲載する
- </string>
- <string name="giving">
- L$[AMOUNT] を渡します
- </string>
- <string name="uploading_costs">
- アップロード料金は L$[AMOUNT] です
- </string>
- <string name="this_costs">
- 料金は L$[AMOUNT] です
- </string>
- <string name="buying_selected_land">
- 選択した土地を L$ [AMOUNT] で購入します
- </string>
- <string name="this_object_costs">
- このオブジェクトは L$[AMOUNT] です
- </string>
- <string name="group_role_everyone">
- 全員
- </string>
- <string name="group_role_officers">
- オフィサー
- </string>
- <string name="group_role_owners">
- オーナー
- </string>
- <string name="group_member_status_online">
- オンライン
- </string>
- <string name="uploading_abuse_report">
- アップロード中...
-
-嫌がらせの報告
- </string>
- <string name="New Shape">
- 新しいシェイプ
- </string>
- <string name="New Skin">
- 新しいスキン
- </string>
- <string name="New Hair">
- 新しい髪
- </string>
- <string name="New Eyes">
- 新しい目
- </string>
- <string name="New Shirt">
- 新しいシャツ
- </string>
- <string name="New Pants">
- 新しいパンツ
- </string>
- <string name="New Shoes">
- 新しい靴
- </string>
- <string name="New Socks">
- 新しい靴下
- </string>
- <string name="New Jacket">
- 新しいジャケット
- </string>
- <string name="New Gloves">
- 新しい手袋
- </string>
- <string name="New Undershirt">
- 新しい下着(上)
- </string>
- <string name="New Underpants">
- 新しい下着(下)
- </string>
- <string name="New Skirt">
- 新しいスカート
- </string>
- <string name="New Alpha">
- 新しいアルファ
- </string>
- <string name="New Tattoo">
- 新しいタトゥ
- </string>
- <string name="New Physics">
- 新規の物理作用
- </string>
- <string name="Invalid Wearable">
- 無効な着用物
- </string>
- <string name="New Gesture">
- ジェスチャー
- </string>
- <string name="New Script">
- 新規スクリプト
- </string>
- <string name="New Note">
- ノート
- </string>
- <string name="New Folder">
- 新規フォルダ
- </string>
- <string name="Contents">
- コンテンツ
- </string>
- <string name="Gesture">
- ジェスチャー
- </string>
- <string name="Male Gestures">
- 男性用ジェスチャー
- </string>
- <string name="Female Gestures">
- 女性用ジェスチャー
- </string>
- <string name="Other Gestures">
- その他のジェスチャー
- </string>
- <string name="Speech Gestures">
- 会話ジェスチャー
- </string>
- <string name="Common Gestures">
- 一般的ジェスチャー
- </string>
- <string name="Male - Excuse me">
- 男性 - すみません
- </string>
- <string name="Male - Get lost">
- 男性 - Get lost
- </string>
- <string name="Male - Blow kiss">
- 男性 - 投げキッス
- </string>
- <string name="Male - Boo">
- 男性 - Boo
- </string>
- <string name="Male - Bored">
- 男性 - 退屈
- </string>
- <string name="Male - Hey">
- 男性 - Hey
- </string>
- <string name="Male - Laugh">
- 男性 - 笑う
- </string>
- <string name="Male - Repulsed">
- 男性 - 拒絶
- </string>
- <string name="Male - Shrug">
- 男性 - 肩をすくめる
- </string>
- <string name="Male - Stick tougue out">
- 男性 - 舌を出す
- </string>
- <string name="Male - Wow">
- 男性 - Wow
- </string>
- <string name="Female - Chuckle">
- 女性 – クスクス
- </string>
- <string name="Female - Cry">
- 女性 – 泣く
- </string>
- <string name="Female - Embarrassed">
- 女性 – 恥ずかしい
- </string>
- <string name="Female - Excuse me">
- 女性 – すみません
- </string>
- <string name="Female - Get lost">
- 女性 – あっち行ってよ
- </string>
- <string name="Female - Blow kiss">
- 女性 - 投げキッス
- </string>
- <string name="Female - Boo">
- 女性 – ワッ!
- </string>
- <string name="Female - Bored">
- 女性 - 退屈
- </string>
- <string name="Female - Hey">
- 女性 - Hey
- </string>
- <string name="Female - Hey baby">
- 女性 – ヘイ、ベィビー!
- </string>
- <string name="Female - Laugh">
- 女性 - 笑う
- </string>
- <string name="Female - Looking good">
- 女性 – いい感じ
- </string>
- <string name="Female - Over here">
- 女性 – こっちよ
- </string>
- <string name="Female - Please">
- 女性 – プリーズ
- </string>
- <string name="Female - Repulsed">
- 女性 - 拒絶
- </string>
- <string name="Female - Shrug">
- 女性 - 肩をすくめる
- </string>
- <string name="Female - Stick tougue out">
- 女性 - 舌を出す
- </string>
- <string name="Female - Wow">
- 女性 - Wow
- </string>
- <string name="/bow">
- /おじぎする
- </string>
- <string name="/clap">
- /拍手
- </string>
- <string name="/count">
- /数える
- </string>
- <string name="/extinguish">
- /消す
- </string>
- <string name="/kmb">
- /くそくらえ
- </string>
- <string name="/muscle">
- /筋肉もりもり
- </string>
- <string name="/no">
- /いいえ
- </string>
- <string name="/no!">
- /だめ!
- </string>
- <string name="/paper">
- /パー
- </string>
- <string name="/pointme">
- /自分を指差す
- </string>
- <string name="/pointyou">
- /相手を指差す
- </string>
- <string name="/rock">
- /グー
- </string>
- <string name="/scissor">
- /チョキ
- </string>
- <string name="/smoke">
- /タバコを吸う
- </string>
- <string name="/stretch">
- /伸びをする
- </string>
- <string name="/whistle">
- /口笛を吹く
- </string>
- <string name="/yes">
- /はい
- </string>
- <string name="/yes!">
- /イエス!
- </string>
- <string name="afk">
- 一時退席中
- </string>
- <string name="dance1">
- ダンス1
- </string>
- <string name="dance2">
- ダンス2
- </string>
- <string name="dance3">
- ダンス3
- </string>
- <string name="dance4">
- ダンス4
- </string>
- <string name="dance5">
- ダンス5
- </string>
- <string name="dance6">
- ダンス6
- </string>
- <string name="dance7">
- ダンス7
- </string>
- <string name="dance8">
- ダンス8
- </string>
- <string name="AvatarBirthDateFormat">
- [year,datetime,slt]/[mthnum,datetime,slt]/[day,datetime,slt]
- </string>
- <string name="DefaultMimeType">
- なし/なし
- </string>
- <string name="texture_load_dimensions_error">
- [WIDTH]*[HEIGHT] 以上の画像は読み込めません
- </string>
- <string name="words_separator" value=","/>
- <string name="server_is_down">
- 大変申し訳ございませんが、予期しない問題が発生しました。
-
- サービスに関する既知の問題については、status.secondlifegrid.net をご覧ください。
-問題が引き続き発生する場合は、お使いのネットワークやファイアウォールの設定を調べてください。
- </string>
- <string name="dateTimeWeekdaysNames">
- 日曜日:月曜日:火曜日:水曜日:木曜日:金曜日:土曜日
- </string>
- <string name="dateTimeWeekdaysShortNames">
- 日:月:火:水:木:金:土
- </string>
- <string name="dateTimeMonthNames">
- 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月
- </string>
- <string name="dateTimeMonthShortNames">
- 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月
- </string>
- <string name="dateTimeDayFormat">
- [MDAY]
- </string>
- <string name="dateTimeAM">
- AM
- </string>
- <string name="dateTimePM">
- PM
- </string>
- <string name="LocalEstimateUSD">
- US$ [AMOUNT]
- </string>
- <string name="Membership">
- 会員
- </string>
- <string name="Roles">
- 役割
- </string>
- <string name="Group Identity">
- グループの識別情報
- </string>
- <string name="Parcel Management">
- 区画の管理
- </string>
- <string name="Parcel Identity">
- 区画の識別情報
- </string>
- <string name="Parcel Settings">
- 区画の設定
- </string>
- <string name="Parcel Powers">
- 区画の権限
- </string>
- <string name="Parcel Access">
- 区画へのアクセス
- </string>
- <string name="Parcel Content">
- 区画のコンテンツ
- </string>
- <string name="Object Management">
- オブジェクトの管理
- </string>
- <string name="Accounting">
- 会計
- </string>
- <string name="Notices">
- 通知
- </string>
- <string name="Chat" value=" チャット:">
- チャット
- </string>
- <string name="DeleteItems">
- 選択したアイテムを削除しますか
- </string>
- <string name="DeleteItem">
- 選択したアイテムを削除しますか
- </string>
- <string name="EmptyOutfitText">
- このアウトフィットにはアイテムがありません
- </string>
- <string name="ExternalEditorNotSet">
- ExternalEditor 設定を使ってエディターを選択します。
- </string>
- <string name="ExternalEditorNotFound">
- 指定された外部エディターが見つかりません。
-エディターへのパスを二重引用符で囲んでみてください。
-(例:&quot;/path to my/editor&quot; &quot;%s&quot;)
- </string>
- <string name="ExternalEditorCommandParseError">
- 外部エディターのコマンドの解析中にエラーが見つかりました。
- </string>
- <string name="ExternalEditorFailedToRun">
- 外部エディターを実行できませんでした。
- </string>
- <string name="TranslationFailed">
- 翻訳できませんでした:[REASON]
- </string>
- <string name="TranslationResponseParseError">
- 翻訳の応答にエラーが発生しました。
- </string>
- <string name="Esc">
- Esc
- </string>
- <string name="Space">
- Space
- </string>
- <string name="Enter">
- Enter
- </string>
- <string name="Tab">
- Tab
- </string>
- <string name="Ins">
- Ins
- </string>
- <string name="Del">
- Del
- </string>
- <string name="Backsp">
- Backsp
- </string>
- <string name="Shift">
- Shift
- </string>
- <string name="Ctrl">
- Ctrl
- </string>
- <string name="Alt">
- Alt
- </string>
- <string name="CapsLock">
- CapsLock
- </string>
- <string name="Home">
- ホーム
- </string>
- <string name="End">
- End
- </string>
- <string name="PgUp">
- PgUp
- </string>
- <string name="PgDn">
- PgDn
- </string>
- <string name="F1">
- F1
- </string>
- <string name="F2">
- F2
- </string>
- <string name="F3">
- F3
- </string>
- <string name="F4">
- F4
- </string>
- <string name="F5">
- F5
- </string>
- <string name="F6">
- F6
- </string>
- <string name="F7">
- F7
- </string>
- <string name="F8">
- F8
- </string>
- <string name="F9">
- F9
- </string>
- <string name="F10">
- F10
- </string>
- <string name="F11">
- F11
- </string>
- <string name="F12">
- F12
- </string>
- <string name="Add">
- 追加
- </string>
- <string name="Subtract">
- 減算
- </string>
- <string name="Multiply">
- 乗算
- </string>
- <string name="Divide">
- 除算
- </string>
- <string name="PAD_DIVIDE">
- PAD_DIVIDE
- </string>
- <string name="PAD_LEFT">
- PAD_LEFT
- </string>
- <string name="PAD_RIGHT">
- PAD_RIGHT
- </string>
- <string name="PAD_DOWN">
- PAD_DOWN
- </string>
- <string name="PAD_UP">
- PAD_UP
- </string>
- <string name="PAD_HOME">
- PAD_HOME
- </string>
- <string name="PAD_END">
- PAD_END
- </string>
- <string name="PAD_PGUP">
- PAD_PGUP
- </string>
- <string name="PAD_PGDN">
- PAD_PGDN
- </string>
- <string name="PAD_CENTER">
- PAD_CENTER
- </string>
- <string name="PAD_INS">
- PAD_INS
- </string>
- <string name="PAD_DEL">
- PAD_DEL
- </string>
- <string name="PAD_Enter">
- PAD_Enter
- </string>
- <string name="PAD_BUTTON0">
- PAD_BUTTON0
- </string>
- <string name="PAD_BUTTON1">
- PAD_BUTTON1
- </string>
- <string name="PAD_BUTTON2">
- PAD_BUTTON2
- </string>
- <string name="PAD_BUTTON3">
- PAD_BUTTON3
- </string>
- <string name="PAD_BUTTON4">
- PAD_BUTTON4
- </string>
- <string name="PAD_BUTTON5">
- PAD_BUTTON5
- </string>
- <string name="PAD_BUTTON6">
- PAD_BUTTON6
- </string>
- <string name="PAD_BUTTON7">
- PAD_BUTTON7
- </string>
- <string name="PAD_BUTTON8">
- PAD_BUTTON8
- </string>
- <string name="PAD_BUTTON9">
- PAD_BUTTON9
- </string>
- <string name="PAD_BUTTON10">
- PAD_BUTTON10
- </string>
- <string name="PAD_BUTTON11">
- PAD_BUTTON11
- </string>
- <string name="PAD_BUTTON12">
- PAD_BUTTON12
- </string>
- <string name="PAD_BUTTON13">
- PAD_BUTTON13
- </string>
- <string name="PAD_BUTTON14">
- PAD_BUTTON14
- </string>
- <string name="PAD_BUTTON15">
- PAD_BUTTON15
- </string>
- <string name="-">
- -
- </string>
- <string name="=">
- =
- </string>
- <string name="`">
- `
- </string>
- <string name=";">
- ;
- </string>
- <string name="[">
- [
- </string>
- <string name="]">
- ]
- </string>
- <string name="\">
- \
- </string>
- <string name="0">
- 0
- </string>
- <string name="1">
- 1
- </string>
- <string name="2">
- 2
- </string>
- <string name="3">
- 3
- </string>
- <string name="4">
- 4
- </string>
- <string name="5">
- 5
- </string>
- <string name="6">
- 6
- </string>
- <string name="7">
- 7
- </string>
- <string name="8">
- 8
- </string>
- <string name="9">
- 9
- </string>
- <string name="A">
- A
- </string>
- <string name="B">
- B
- </string>
- <string name="C">
- C
- </string>
- <string name="D">
- D
- </string>
- <string name="E">
- E
- </string>
- <string name="F">
- F
- </string>
- <string name="G">
- G
- </string>
- <string name="H">
- H
- </string>
- <string name="I">
- I
- </string>
- <string name="J">
- J
- </string>
- <string name="K">
- K
- </string>
- <string name="L">
- L
- </string>
- <string name="M">
- M
- </string>
- <string name="N">
- N
- </string>
- <string name="O">
- O
- </string>
- <string name="P">
- P
- </string>
- <string name="Q">
- Q
- </string>
- <string name="R">
- R
- </string>
- <string name="S">
- S
- </string>
- <string name="T">
- T
- </string>
- <string name="U">
- U
- </string>
- <string name="V">
- V
- </string>
- <string name="W">
- W
- </string>
- <string name="X">
- X
- </string>
- <string name="Y">
- Y
- </string>
- <string name="Z">
- Z
- </string>
- <string name="BeaconParticle">
- パーティクル源ビーコン(青)を表示中
- </string>
- <string name="BeaconPhysical">
- 物理的オブジェクトのビーコン(緑)を表示中
- </string>
- <string name="BeaconScripted">
- スクリプトのオブジェクトのビーコン(赤)を表示中
- </string>
- <string name="BeaconScriptedTouch">
- タッチ機能のビーコンが付いたスクリプトのオブジェクト(赤)を表示中
- </string>
- <string name="BeaconSound">
- サウンドビーコン(黄)を表示中
- </string>
- <string name="BeaconMedia">
- メディアビーコン(白)を表示中
- </string>
- <string name="ParticleHiding">
- パーティクルを非表示
- </string>
- <string name="Command_AboutLand_Label">
- 土地情報
- </string>
- <string name="Command_Appearance_Label">
- 容姿
- </string>
- <string name="Command_Avatar_Label">
- アバター
- </string>
- <string name="Command_Build_Label">
- 制作
- </string>
- <string name="Command_Chat_Label">
- チャット
- </string>
- <string name="Command_Compass_Label">
- コンパス
- </string>
- <string name="Command_Destinations_Label">
- 行き先
- </string>
- <string name="Command_Gestures_Label">
- ジェスチャー
- </string>
- <string name="Command_HowTo_Label">
- ハウツー
- </string>
- <string name="Command_Inventory_Label">
- インベントリ
- </string>
- <string name="Command_Map_Label">
- 地図
- </string>
- <string name="Command_Marketplace_Label">
- マーケットプレイス
- </string>
- <string name="Command_MiniMap_Label">
- ミニマップ
- </string>
- <string name="Command_Move_Label">
- 歩行 / 走行 / 飛行
- </string>
- <string name="Command_Outbox_Label">
- マーチャントアウトボックス
- </string>
- <string name="Command_People_Label">
- 人
- </string>
- <string name="Command_Picks_Label">
- ピック
- </string>
- <string name="Command_Places_Label">
- 場所
- </string>
- <string name="Command_Preferences_Label">
- 環境設定
- </string>
- <string name="Command_Profile_Label">
- プロフィール
- </string>
- <string name="Command_Search_Label">
- 検索
- </string>
- <string name="Command_Snapshot_Label">
- スナップショット
- </string>
- <string name="Command_Speak_Label">
- 話す
- </string>
- <string name="Command_View_Label">
- カメラコントロール
- </string>
- <string name="Command_Voice_Label">
- ボイス設定
- </string>
- <string name="Command_AboutLand_Tooltip">
- 訪問先に関する情報
- </string>
- <string name="Command_Appearance_Tooltip">
- アバターを変更
- </string>
- <string name="Command_Avatar_Tooltip">
- アバター一式を選択
- </string>
- <string name="Command_Build_Tooltip">
- オブジェクトの制作と地形の変形
- </string>
- <string name="Command_Chat_Tooltip">
- 近くの人と文字チャットする
- </string>
- <string name="Command_Compass_Tooltip">
- コンパス
- </string>
- <string name="Command_Destinations_Tooltip">
- 行ってみたい場所
- </string>
- <string name="Command_Gestures_Tooltip">
- アバターのジェスチャー
- </string>
- <string name="Command_HowTo_Tooltip">
- 一般的タスクの実行方法
- </string>
- <string name="Command_Inventory_Tooltip">
- インベントリを表示・使用
- </string>
- <string name="Command_Map_Tooltip">
- 世界地図
- </string>
- <string name="Command_Marketplace_Tooltip">
- ショッピングに出掛ける
- </string>
- <string name="Command_MiniMap_Tooltip">
- 近くの人を表示する
- </string>
- <string name="Command_Move_Tooltip">
- アバターの移動
- </string>
- <string name="Command_Outbox_Tooltip">
- 販売用にアイテムをマーケットプレイスに転送
- </string>
- <string name="Command_People_Tooltip">
- フレンド、グループ、近くの人
- </string>
- <string name="Command_Picks_Tooltip">
- プロフィールで紹介するお気に入りの場所
- </string>
- <string name="Command_Places_Tooltip">
- 保存済みの場所
- </string>
- <string name="Command_Preferences_Tooltip">
- 環境設定
- </string>
- <string name="Command_Profile_Tooltip">
- プロフィールを編集・表示
- </string>
- <string name="Command_Search_Tooltip">
- 場所、イベント、人を検索
- </string>
- <string name="Command_Snapshot_Tooltip">
- ピクチャを撮る
- </string>
- <string name="Command_Speak_Tooltip">
- マイクを使って近くの人と話す
- </string>
- <string name="Command_View_Tooltip">
- カメラの角度を変更
- </string>
- <string name="Command_Voice_Tooltip">
- インワールドでのコールや近くにいる人の音量調整
- </string>
- <string name="Toolbar_Bottom_Tooltip">
- 現在、下のツールバーにあります
- </string>
- <string name="Toolbar_Left_Tooltip">
- 現在、左のツールバーにあります
- </string>
- <string name="Toolbar_Right_Tooltip">
- 現在、右のツールバーにあります
- </string>
- <string name="Retain%">
- 維持率
- </string>
- <string name="Detail">
- 詳細
- </string>
- <string name="Better Detail">
- もっと詳しく
- </string>
- <string name="Surface">
- 表面
- </string>
- <string name="Solid">
- ソリッド
- </string>
- <string name="Wrap">
- ラップ
- </string>
- <string name="Preview">
- プレビュー
- </string>
- <string name="Normal">
- 普通
- </string>
- <string name="snapshot_quality_very_low">
- 非常に低い
- </string>
- <string name="snapshot_quality_low">
- 低
- </string>
- <string name="snapshot_quality_medium">
- 中
- </string>
- <string name="snapshot_quality_high">
- 高
- </string>
- <string name="snapshot_quality_very_high">
- 非常に高い
- </string>
-</strings>
diff --git a/indra/newview/skins/steam/xui/pl/strings.xml b/indra/newview/skins/steam/xui/pl/strings.xml
deleted file mode 100644
index f6dec8536b..0000000000
--- a/indra/newview/skins/steam/xui/pl/strings.xml
+++ /dev/null
@@ -1,4340 +0,0 @@
-<?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
- that are returned from one component and may appear in many places-->
-<strings>
- <string name="CAPITALIZED_APP_NAME">
- SECOND LIFE
- </string>
- <string name="SUPPORT_SITE">
- Portal Pomocy Second Life
- </string>
- <string name="StartupDetectingHardware">
- Wykrywanie dysku twardego...
- </string>
- <string name="StartupLoading">
- Ładowanie [APP_NAME]...
- </string>
- <string name="StartupClearingCache">
- Czyszczenie bufora danych...
- </string>
- <string name="StartupInitializingTextureCache">
- Inicjowanie bufora danych tekstur...
- </string>
- <string name="StartupInitializingVFS">
- Inicjowanie VFS...
- </string>
- <string name="ProgressRestoring">
- Przywracanie...
- </string>
- <string name="ProgressChangingResolution">
- Zmiana rozdzielczości...
- </string>
- <string name="LoginInProgress">
- Trwa logowanie. [APP_NAME] Proszę czekać.
- </string>
- <string name="LoginInProgressNoFrozen">
- Logowanie...
- </string>
- <string name="LoginAuthenticating">
- Autoryzacja
- </string>
- <string name="LoginMaintenance">
- W trakcie obslugi konta...
- </string>
- <string name="LoginAttempt">
- Poprzednie logowanie nie udalo się. Logowanie, próba numer [NUMBER]
- </string>
- <string name="LoginPrecaching">
- Ładowanie świata...
- </string>
- <string name="LoginInitializingBrowser">
- Inicjalizacja przeglądarki internetowej...
- </string>
- <string name="LoginInitializingMultimedia">
- Inicjalizacja multimediów...
- </string>
- <string name="LoginInitializingFonts">
- Ładowanie czcionek...
- </string>
- <string name="LoginVerifyingCache">
- Weryfikacja bufora danych na dysku (może trwać od 60 do 90 sekund)...
- </string>
- <string name="LoginProcessingResponse">
- Przetwarzanie odpowiedzi...
- </string>
- <string name="LoginInitializingWorld">
- Inicjacja świata...
- </string>
- <string name="LoginDecodingImages">
- Przetwarzanie obrazów...
- </string>
- <string name="LoginInitializingQuicktime">
- Inicjacja QuickTime...
- </string>
- <string name="LoginQuicktimeNotFound">
- QuickTime nie został znaleziony - inicjacja przerwana.
- </string>
- <string name="LoginQuicktimeOK">
- QuickTime zainicjowany.
- </string>
- <string name="LoginWaitingForRegionHandshake">
- Oczekiwanie na połączenie z regionem...
- </string>
- <string name="LoginConnectingToRegion">
- Łączenie z regionem...
- </string>
- <string name="LoginDownloadingClothing">
- Ładowanie ubrania...
- </string>
- <string name="InvalidCertificate">
- Serwer zwrócił nieważny lub zniekształcony certyfikat. Proszę skontaktuj się z administratorem Grida.
- </string>
- <string name="CertInvalidHostname">
- Nazwa hosta jest nieważna, proszę sprawdź SLURL lub nazwę hosta Grida.
- </string>
- <string name="CertExpired">
- Termin ważności certyfikatu zwróconego przez Grid minął. Proszę sprawdzić swój zegar systemowy lub skontaktować się z administratorem Grida.
- </string>
- <string name="CertKeyUsage">
- Certyfikat zwrócony przez serwer nie może być użyty dla SSL. Proszę skontaktuj się z administratorem Grida.
- </string>
- <string name="CertBasicConstraints">
- Zbyt wiele certyfikatów w łańcuchu certyfikatów serwera. Proszę skontaktować się z administratorem Grida.
- </string>
- <string name="CertInvalidSignature">
- Podpis certyfikatu zwrócony przez Grid nie mógł zostać zweryfikowany. Proszę skontaktować się z administratorem Grida.
- </string>
- <string name="LoginFailedNoNetwork">
- Błąd sieci: Brak połączenia z siecią, sprawdź status swojego połączenia internetowego.
- </string>
- <string name="LoginFailed">
- Logowanie nie powiodło się.
- </string>
- <string name="Quit">
- Wyłącz program
- </string>
- <string name="AgentLostConnection">
- Ten region może mieć problemy. Sprawdź podłączenie do Internetu.
- </string>
- <string name="SavingSettings">
- Zachowanie ustawień...
- </string>
- <string name="LoggingOut">
- Trwa wylogowanie...
- </string>
- <string name="ShuttingDown">
- Zamykanie...
- </string>
- <string name="YouHaveBeenDisconnected">
- Nastąpiło rozłączenie z regionem.
- </string>
- <string name="SentToInvalidRegion">
- Region jest niedostępny.
- </string>
- <string name="TestingDisconnect">
- Nastąpiło rozłączenie testowania klienta
- </string>
- <string name="TooltipPerson">
- Osoba
- </string>
- <string name="TooltipNoName">
- (brak nazwy)
- </string>
- <string name="TooltipOwner">
- Właściciel:
- </string>
- <string name="TooltipPublic">
- Publiczny
- </string>
- <string name="TooltipIsGroup">
- (Grupa)
- </string>
- <string name="TooltipForSaleL$">
- Na sprzedaż: L$[AMOUNT]
- </string>
- <string name="TooltipFlagGroupBuild">
- Budowanie grupowe
- </string>
- <string name="TooltipFlagNoBuild">
- Budowanie zabronione
- </string>
- <string name="TooltipFlagNoEdit">
- Edycja zabroniona
- </string>
- <string name="TooltipFlagNotSafe">
- Niebezpieczny obszar
- </string>
- <string name="TooltipFlagNoFly">
- Latanie zabronione
- </string>
- <string name="TooltipFlagGroupScripts">
- Skrypty grupowe
- </string>
- <string name="TooltipFlagNoScripts">
- Skrypty zabronione
- </string>
- <string name="TooltipLand">
- Posiadłość:
- </string>
- <string name="TooltipMustSingleDrop">
- Tylko pojedynczy obiekt może być tutaj przeciągnięty
- </string>
- <string name="TooltipPrice" value="L$[AMOUNT]:"/>
- <string name="TooltipHttpUrl">
- Kliknij aby zobaczyć zawartość tej strony internetowej
- </string>
- <string name="TooltipSLURL">
- Kliknij aby zobaczyć szczegóły tego miejsca
- </string>
- <string name="TooltipAgentUrl">
- Kliknij aby zobaczyc profil Rezydenta
- </string>
- <string name="TooltipAgentInspect">
- Dowiedz się więcej o tym Rezydencie
- </string>
- <string name="TooltipAgentMute">
- Kliknij aby wyciszyc tego Rezydenta
- </string>
- <string name="TooltipAgentUnmute">
- Kliknij aby cofnąć zablokowanie tego Rezydenta
- </string>
- <string name="TooltipAgentIM">
- Kliknij aby wysłać wiadomość IM do tego Rezydenta
- </string>
- <string name="TooltipAgentPay">
- Kliknij aby zapłacić temu Rezydentowi
- </string>
- <string name="TooltipAgentOfferTeleport">
- Kliknij aby oferować teleport temu Rezydentowi
- </string>
- <string name="TooltipAgentRequestFriend">
- Kliknij aby wysłać temu Rezydentowi zaproszenie do Znajomych
- </string>
- <string name="TooltipGroupUrl">
- Kliknij aby zobaczyć opis tej grupy
- </string>
- <string name="TooltipEventUrl">
- Klinij aby zobaczyć szczegóły tego wydarzenia
- </string>
- <string name="TooltipClassifiedUrl">
- Kliknij aby zobaczyć tę reklamę
- </string>
- <string name="TooltipParcelUrl">
- Kliknij aby zobaczyć opis tej posiadłości
- </string>
- <string name="TooltipTeleportUrl">
- Kliknij aby teleportować się do tego miejsca
- </string>
- <string name="TooltipObjectIMUrl">
- Kliknij aby zobaczyć opis tego obiektu
- </string>
- <string name="TooltipMapUrl">
- Kliknij aby zobaczyć to miejsce na mapie
- </string>
- <string name="TooltipSLAPP">
- Kliknij aby 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="SLappAgentMute">
- Zablokuj
- </string>
- <string name="SLappAgentUnmute">
- Cofnij zablokowanie
- </string>
- <string name="SLappAgentIM">
- IM
- </string>
- <string name="SLappAgentPay">
- Zapłać
- </string>
- <string name="SLappAgentOfferTeleport">
- Teleportuj do
- </string>
- <string name="SLappAgentRequestFriend">
- Oferta znajomości
- </string>
- <string name="BUTTON_CLOSE_DARWIN">
- Zamknij (⌘W)
- </string>
- <string name="BUTTON_CLOSE_WIN">
- Zamknij (Ctrl+W)
- </string>
- <string name="BUTTON_CLOSE_CHROME">
- Zamknij
- </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_HELP">
- Pokaż Pomoc
- </string>
- <string name="Searching">
- Wyszukiwanie...
- </string>
- <string name="NoneFound">
- Nie odnaleziono.
- </string>
- <string name="RetrievingData">
- Odzyskiwanie danych...
- </string>
- <string name="ReleaseNotes">
- O tej wersji
- </string>
- <string name="RELEASE_NOTES_BASE_URL">
- http://wiki.secondlife.com/wiki/Release_Notes/
- </string>
- <string name="LoadingData">
- Ładowanie danych...
- </string>
- <string name="AvatarNameNobody">
- (brak danych)
- </string>
- <string name="AvatarNameWaiting">
- (ładowanie)
- </string>
- <string name="GroupNameNone">
- (brak danych)
- </string>
- <string name="AvalineCaller">
- Avaline [ORDER]
- </string>
- <string name="AssetErrorNone">
- OK
- </string>
- <string name="AssetErrorRequestFailed">
- Pobieranie danych: błąd
- </string>
- <string name="AssetErrorNonexistentFile">
- Pobieranie danych: brak pliku
- </string>
- <string name="AssetErrorNotInDatabase">
- Pobieranie danych: dane nie zostały znalezione w bazie danych
- </string>
- <string name="AssetErrorEOF">
- Koniec pliku
- </string>
- <string name="AssetErrorCannotOpenFile">
- Nie można otworzyć pliku
- </string>
- <string name="AssetErrorFileNotFound">
- Brak pliku
- </string>
- <string name="AssetErrorTCPTimeout">
- Transfer pliku - przekroczony limit czasu
- </string>
- <string name="AssetErrorCircuitGone">
- Połączenie przerwane
- </string>
- <string name="AssetErrorPriceMismatch">
- Brak zgodności pomiędzy serwerem i klientem na realizację podanej ceny.
- </string>
- <string name="AssetErrorUnknownStatus">
- Status nieznany
- </string>
- <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">
- obiek
- </string>
- <string name="note card">
- notatki
- </string>
- <string name="folder">
- folder
- </string>
- <string name="root">
- podstawy
- </string>
- <string name="lsl2 script">
- skrypt LSL2
- </string>
- <string name="lsl bytecode">
- kod 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">
- obraz typu targa
- </string>
- <string name="trash">
- Kosz
- </string>
- <string name="jpeg image">
- obraz typu jpg
- </string>
- <string name="animation">
- animacja
- </string>
- <string name="gesture">
- gesturka
- </string>
- <string name="simstate">
- simstate
- </string>
- <string name="favorite">
- ulubione
- </string>
- <string name="symbolic link">
- link
- </string>
- <string name="symbolic folder link">
- link folderu
- </string>
- <string name="AvatarEditingAppearance">
- (Edycja Wygląd)
- </string>
- <string name="AvatarAway">
- Śpi
- </string>
- <string name="AvatarBusy">
- Pracuje
- </string>
- <string name="AvatarMuted">
- Wyciszony
- </string>
- <string name="anim_express_afraid">
- Strach
- </string>
- <string name="anim_express_anger">
- Złość
- </string>
- <string name="anim_away">
- Sen
- </string>
- <string name="anim_backflip">
- Salto
- </string>
- <string name="anim_express_laugh">
- Śmiech do rozpuku
- </string>
- <string name="anim_express_toothsmile">
- Wielki uśmiech
- </string>
- <string name="anim_blowkiss">
- Całusek
- </string>
- <string name="anim_express_bored">
- Ale nudy!
- </string>
- <string name="anim_bow">
- Ukłon
- </string>
- <string name="anim_clap">
- Oklaski
- </string>
- <string name="anim_courtbow">
- Dworski ukłon
- </string>
- <string name="anim_express_cry">
- Płacz
- </string>
- <string name="anim_dance1">
- Taniec 1
- </string>
- <string name="anim_dance2">
- Taniec 2
- </string>
- <string name="anim_dance3">
- Taniec 3
- </string>
- <string name="anim_dance4">
- Taniec 4
- </string>
- <string name="anim_dance5">
- Taniec 5
- </string>
- <string name="anim_dance6">
- Taniec 6
- </string>
- <string name="anim_dance7">
- Taniec 7
- </string>
- <string name="anim_dance8">
- Taniec 8
- </string>
- <string name="anim_express_disdain">
- Pogarda
- </string>
- <string name="anim_drink">
- Picie
- </string>
- <string name="anim_express_embarrased">
- Zakłopotanie
- </string>
- <string name="anim_angry_fingerwag">
- Grożenie paluszkiem
- </string>
- <string name="anim_fist_pump">
- Udało się!
- </string>
- <string name="anim_yoga_float">
- Yoga
- </string>
- <string name="anim_express_frown">
- Grymas
- </string>
- <string name="anim_impatient">
- Niecierpliwość
- </string>
- <string name="anim_jumpforjoy">
- Radocha
- </string>
- <string name="anim_kissmybutt">
- Pocałuj mnie gdzieś
- </string>
- <string name="anim_express_kiss">
- Pocałunek
- </string>
- <string name="anim_laugh_short">
- Śmiech
- </string>
- <string name="anim_musclebeach">
- Szpan
- </string>
- <string name="anim_no_unhappy">
- Nie (Smutno)
- </string>
- <string name="anim_no_head">
- Nie
- </string>
- <string name="anim_nyanya">
- Nie-nie-nie
- </string>
- <string name="anim_punch_onetwo">
- Za ciosem cios
- </string>
- <string name="anim_express_open_mouth">
- Szczęka opada
- </string>
- <string name="anim_peace">
- Pokój
- </string>
- <string name="anim_point_you">
- Wskazuj na innych
- </string>
- <string name="anim_point_me">
- Wskazuj na siebie
- </string>
- <string name="anim_punch_l">
- Uderz z lewej
- </string>
- <string name="anim_punch_r">
- Uderz z prawej
- </string>
- <string name="anim_rps_countdown">
- KPN licz
- </string>
- <string name="anim_rps_paper">
- KPN papier
- </string>
- <string name="anim_rps_rock">
- KPN kamień
- </string>
- <string name="anim_rps_scissors">
- KPN nożyce
- </string>
- <string name="anim_express_repulsed">
- Odrzuca mnie
- </string>
- <string name="anim_kick_roundhouse_r">
- Kopniak
- </string>
- <string name="anim_express_sad">
- Smutek
- </string>
- <string name="anim_salute">
- Pozdrów
- </string>
- <string name="anim_shout">
- Krzycz
- </string>
- <string name="anim_express_shrug">
- Wzrusz ramionami
- </string>
- <string name="anim_express_smile">
- Uśmiechaj się
- </string>
- <string name="anim_smoke_idle">
- Pal
- </string>
- <string name="anim_smoke_inhale">
- Pal i zaciągaj się
- </string>
- <string name="anim_smoke_throw_down">
- Rzuć papierosa
- </string>
- <string name="anim_express_surprise">
- Zaskoczenie
- </string>
- <string name="anim_sword_strike_r">
- Uderz mieczem
- </string>
- <string name="anim_angry_tantrum">
- Wściekłość
- </string>
- <string name="anim_express_tongue_out">
- Pokaż język
- </string>
- <string name="anim_hello">
- Pomachaj
- </string>
- <string name="anim_whisper">
- Zaszeptaj
- </string>
- <string name="anim_whistle">
- Zagwiżdż
- </string>
- <string name="anim_express_wink">
- Puść oko
- </string>
- <string name="anim_wink_hollywood">
- Puść oko (Hollywood)
- </string>
- <string name="anim_express_worry">
- Zmartwienie
- </string>
- <string name="anim_yes_happy">
- Tak (Szczęście)
- </string>
- <string name="anim_yes_head">
- Tak
- </string>
- <string name="texture_loading">
- Ładowanie...
- </string>
- <string name="worldmap_offline">
- Mapa Świata jest niedostępna
- </string>
- <string name="worldmap_item_tooltip_format">
- [AREA] m² L$[PRICE]
- </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:
- </string>
- <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="reconnect_nearby">
- Przełączanie do pobliskich rozmów głosowych
- </string>
- <string name="ScriptQuestionCautionChatGranted">
- &apos;[OBJECTNAME]&apos;, właściciel: &apos;[OWNERNAME]&apos;, położenie: [REGIONNAME] [REGIONPOS], pozwala Ci na: [PERMISSIONS].
- </string>
- <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 / rozłącz z innymi obiektami
- </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;General&apos;
- </string>
- <string name="SIM_ACCESS_MATURE">
- &apos;Moderate&apos;
- </string>
- <string name="SIM_ACCESS_ADULT">
- &apos;Adult&apos;
- </string>
- <string name="SIM_ACCESS_DOWN">
- Niedostępny
- </string>
- <string name="SIM_ACCESS_MIN">
- Nieznany
- </string>
- <string name="land_type_unknown">
- (nieznane)
- </string>
- <string name="Estate / Full Region">
- Majątek / Region
- </string>
- <string name="Estate / Homestead">
- Estate / Homestead
- </string>
- <string name="Mainland / Homestead">
- Mainland / Homestead
- </string>
- <string name="Mainland / Full Region">
- Mainland / Region
- </string>
- <string name="all_files">
- Wszystkie pliki
- </string>
- <string name="sound_files">
- Dźwięki
- </string>
- <string name="animation_files">
- Animacje
- </string>
- <string name="image_files">
- Obrazy
- </string>
- <string name="save_file_verb">
- Zapisz
- </string>
- <string name="load_file_verb">
- Załaduj
- </string>
- <string name="targa_image_files">
- Obrazy targa
- </string>
- <string name="bitmap_image_files">
- Obrazy bitmap
- </string>
- <string name="avi_movie_file">
- Pliki filmowe AVI
- </string>
- <string name="xaf_animation_file">
- Plik animacji XAF
- </string>
- <string name="xml_file">
- Plik XML
- </string>
- <string name="raw_file">
- Plik RAW
- </string>
- <string name="compressed_image_files">
- Obrazy skomprensowane
- </string>
- <string name="load_files">
- Załaduj pliki
- </string>
- <string name="choose_the_directory">
- Wybierz katalog
- </string>
- <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 Alpha
- </string>
- <string name="tattoo">
- Tatuaż
- </string>
- <string name="physics">
- Fizyka
- </string>
- <string name="invalid">
- niewłaściwa funkcja
- </string>
- <string name="none">
- żadne
- </string>
- <string name="shirt_not_worn">
- Koszula nie jest założona
- </string>
- <string name="pants_not_worn">
- Spodnie nie są założone
- </string>
- <string name="shoes_not_worn">
- Buty nie są założone
- </string>
- <string name="socks_not_worn">
- Skarpetki nie są założone
- </string>
- <string name="jacket_not_worn">
- Kurtka nie jest założona
- </string>
- <string name="gloves_not_worn">
- Rękawiczki nie są założone
- </string>
- <string name="undershirt_not_worn">
- Podkoszulek nie jest założony
- </string>
- <string name="underpants_not_worn">
- Bielizna nie jest założona
- </string>
- <string name="skirt_not_worn">
- Spódnica nie jest założona
- </string>
- <string name="alpha_not_worn">
- Alpha nie jest założone
- </string>
- <string name="tattoo_not_worn">
- Tatuaż nie jest założony
- </string>
- <string name="physics_not_worn">
- Fizyka niezałożona
- </string>
- <string name="invalid_not_worn">
- nieważny
- </string>
- <string name="create_new_shape">
- Nowy kształt
- </string>
- <string name="create_new_skin">
- Nowa skórka
- </string>
- <string name="create_new_hair">
- Nowe włosy
- </string>
- <string name="create_new_eyes">
- Nowe oczy
- </string>
- <string name="create_new_shirt">
- Nowa koszula
- </string>
- <string name="create_new_pants">
- Nowe spodnie
- </string>
- <string name="create_new_shoes">
- Nowe buty
- </string>
- <string name="create_new_socks">
- Nowe skarpetki
- </string>
- <string name="create_new_jacket">
- Nowa kurtka
- </string>
- <string name="create_new_gloves">
- Nowe rękawiczki
- </string>
- <string name="create_new_undershirt">
- Nowy podkoszulek
- </string>
- <string name="create_new_underpants">
- Nowa bielizna
- </string>
- <string name="create_new_skirt">
- Nowa spódnica
- </string>
- <string name="create_new_alpha">
- Nowe alpha
- </string>
- <string name="create_new_tattoo">
- Nowy tatuaż
- </string>
- <string name="create_new_physics">
- Stwórz nową fizykę
- </string>
- <string name="create_new_invalid">
- nieważny
- </string>
- <string name="NewWearable">
- Nowa [WEARABLE_ITEM]
- </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 otrzymane 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="StartUpNotifications">
- Nowe zawiadomienia zostały wysłane kiedy byłeś/byłaś 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 aby powrócić do trybu widoku normalnego
- </string>
- <string name="InventoryNoMatchingItems">
- Nie znaleziono tego czego szukasz? Spróbuj [secondlife:///app/search/all/[SEARCH_TERM] Szukaj].
- </string>
- <string name="PlacesNoMatchingItems">
- Nie znaleziono tego czego szukasz? Spróbuj [secondlife:///app/search/places/[SEARCH_TERM] Szukaj].
- </string>
- <string name="FavoritesNoMatchingItems">
- Przeciągnij landmark tutaj aby dodać go do swoich ulubionych.
- </string>
- <string name="InventoryNoTexture">
- Nie posiadasz kopii tej tekstury w Twojej 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="ActiveGesture" value="[GESLABEL] (aktywne)"/>
- <string name="Chat Message" 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="GestureActionNone" value="Żadne"/>
- <string name="HelloAvatar" value=" Witaj, Awatarze!"/>
- <string name="ViewAllGestures" value=" Zobacz wszystkie &gt;&gt;"/>
- <string name="GetMoreGestures" value="Więcej gesturek &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 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">
- Landmarki
- </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">
- Moje ulubione
- </string>
- <string name="InvFolder favorite">
- Moje ulubione
- </string>
- <string name="InvFolder Current Outfit">
- Obecny strój
- </string>
- <string name="InvFolder Initial Outfits">
- Początkowe stroje
- </string>
- <string name="InvFolder My Outfits">
- Moje stroje
- </string>
- <string name="InvFolder Accessories">
- Akcesoria
- </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">
- Miednica
- </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">
- Lewy Pec
- </string>
- <string name="Right Pec">
- Prawy Pec
- </string>
- <string name="Invalid Attachment">
- Nieważny punkt załącznika
- </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="AcctTypeCharterMember">
- Wyróżniony członek
- </string>
- <string name="AcctTypeEmployee">
- Pracownik Linden Lab
- </string>
- <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 do [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="GroupColumn" value="Grupa"/>
- <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">
- Dozwoleni Rezydenci: ([ALLOWEDAGENTS], maks. [MAXACCESS])
- </string>
- <string name="RegionInfoAllowedGroups">
- Grupy mające dostęp: ([ALLOWEDGROUPS], max [MAXACCESS])
- </string>
- <string name="ScriptLimitsParcelScriptMemory">
- Pamięć skryptów Posiadłości
- </string>
- <string name="ScriptLimitsParcelsOwned">
- Posiadłości: [PARCELS]
- </string>
- <string name="ScriptLimitsMemoryUsed">
- Pamięć wykorzystana: [COUNT] kb z [MAX] kb; [AVAILABLE] kb pozostało
- </string>
- <string name="ScriptLimitsMemoryUsedSimple">
- Pamięć wykorzystana: [COUNT] kb
- </string>
- <string name="ScriptLimitsParcelScriptURLs">
- Skrypty URL Posiadłości
- </string>
- <string name="ScriptLimitsURLsUsed">
- URL: [COUNT] z [MAX]; [AVAILABLE] dostępne
- </string>
- <string name="ScriptLimitsURLsUsedSimple">
- URL: [COUNT]
- </string>
- <string name="ScriptLimitsRequestError">
- Błąd wyszukiwania informacji
- </string>
- <string name="ScriptLimitsRequestNoParcelSelected">
- Posiadłość nie została wybrana
- </string>
- <string name="ScriptLimitsRequestWrongRegion">
- Błąd: informacja o skrypcie jest dostępna tylko w obecnym regionie.
- </string>
- <string name="ScriptLimitsRequestWaiting">
- Wyszukiwanie informacji...
- </string>
- <string name="ScriptLimitsRequestDontOwnParcel">
- Nie masz pozwolenia na sprawdzenie pasiadłości.
- </string>
- <string name="SITTING_ON">
- Usiądź na
- </string>
- <string name="ATTACH_CHEST">
- Klatka piersiowa
- </string>
- <string name="ATTACH_HEAD">
- Głowa
- </string>
- <string name="ATTACH_LSHOULDER">
- Lewe ramię
- </string>
- <string name="ATTACH_RSHOULDER">
- Prawe ramię
- </string>
- <string name="ATTACH_LHAND">
- Lewa ręka
- </string>
- <string name="ATTACH_RHAND">
- Prawa ręka
- </string>
- <string name="ATTACH_LFOOT">
- Lewa stopa
- </string>
- <string name="ATTACH_RFOOT">
- Prawa stopa
- </string>
- <string name="ATTACH_BACK">
- Plecy
- </string>
- <string name="ATTACH_PELVIS">
- Miednica
- </string>
- <string name="ATTACH_MOUTH">
- Usta
- </string>
- <string name="ATTACH_CHIN">
- Podbródek
- </string>
- <string name="ATTACH_LEAR">
- Ucho lewe
- </string>
- <string name="ATTACH_REAR">
- Prawe ucho
- </string>
- <string name="ATTACH_LEYE">
- Lewe oko
- </string>
- <string name="ATTACH_REYE">
- Prawe oko
- </string>
- <string name="ATTACH_NOSE">
- Nos
- </string>
- <string name="ATTACH_RUARM">
- Prawe górne ramię
- </string>
- <string name="ATTACH_RLARM">
- Prawe dolne ramię
- </string>
- <string name="ATTACH_LUARM">
- Ramię L Górne
- </string>
- <string name="ATTACH_LLARM">
- Lewe dolne ramię
- </string>
- <string name="ATTACH_RHIP">
- Biodro prawe
- </string>
- <string name="ATTACH_RULEG">
- Prawa górna noga
- </string>
- <string name="ATTACH_RLLEG">
- Prawa dolna noga
- </string>
- <string name="ATTACH_LHIP">
- Biodro lewe
- </string>
- <string name="ATTACH_LULEG">
- Lewa gorna noga
- </string>
- <string name="ATTACH_LLLEG">
- Lewa dolna noga
- </string>
- <string name="ATTACH_BELLY">
- Brzuch
- </string>
- <string name="ATTACH_RPEC">
- Prawa klatka
- </string>
- <string name="ATTACH_LPEC">
- Lewa klatka
- </string>
- <string name="ATTACH_HUD_CENTER_2">
- HUD środek 2
- </string>
- <string name="ATTACH_HUD_TOP_RIGHT">
- HUD prawy górny
- </string>
- <string name="ATTACH_HUD_TOP_CENTER">
- HUD środek górny
- </string>
- <string name="ATTACH_HUD_TOP_LEFT">
- HUD lewa gora
- </string>
- <string name="ATTACH_HUD_CENTER_1">
- HUD środek 1
- </string>
- <string name="ATTACH_HUD_BOTTOM_LEFT">
- HUD lewa dolna strona
- </string>
- <string name="ATTACH_HUD_BOTTOM">
- HUD dolny
- </string>
- <string name="ATTACH_HUD_BOTTOM_RIGHT">
- HUD prawa dolna strona
- </string>
- <string name="CursorPos">
- Linia [LINE], Kolumna [COLUMN]
- </string>
- <string name="PanelDirCountFound">
- [COUNT] odnalezionych
- </string>
- <string name="PanelContentsTooltip">
- Zawartość obiektu
- </string>
- <string name="PanelContentsNewScript">
- Nowy skrypt
- </string>
- <string name="BusyModeResponseDefault">
- Rezydent, do którego wysłałeś wiadomość prywatną znajduje się w trybie pracy. Oznacza to, iż Twoja wiadomość zostanie zapisana do przejrzenia poźniej.
- </string>
- <string name="MuteByName">
- (Nazwa)
- </string>
- <string name="MuteAgent">
- (Rezydent)
- </string>
- <string name="MuteObject">
- (Obiekt)
- </string>
- <string name="MuteGroup">
- (Grupę)
- </string>
- <string name="MuteExternal">
- (Zewnętrzne)
- </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" value="Ostatnio modyfikowano: "/>
- <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="NoPicksClassifiedsText">
- Nie dodałeś nic do Ulubionych i Reklam. Kliknij na poniższy przycisk Dodaj aby dodać miejsce do Ulubionych lub Reklamy.
- </string>
- <string name="NoAvatarPicksClassifiedsText">
- Brak ulubionych miejsc/reklam
- </string>
- <string name="PicksClassifiedsLoadingText">
- Ładowanie...
- </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="InvOfferDecline">
- Odrzucono [DESC] od &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
- </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">
- Załadowanie [NAME] kosztuje [AMOUNT]L$
- </string>
- <string name="BuyingCosts">
- Cena zakupu tego wynosi L$ [AMOUNT]
- </string>
- <string name="UnknownFileExtension">
- Nieznane rozszerzenie dla pliku [.%s]
-Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
- </string>
- <string name="MuteObject2">
- Zablokuj
- </string>
- <string name="AddLandmarkNavBarMenu">
- Dodaj Ulubione Miejsce...
- </string>
- <string name="EditLandmarkNavBarMenu">
- Edytuj Ulubione Miejce...
- </string>
- <string name="accel-mac-control">
- ⌃
- </string>
- <string name="accel-mac-command">
- ⌘
- </string>
- <string name="accel-mac-option">
- ⌥
- </string>
- <string name="accel-mac-shift">
- ⇧
- </string>
- <string name="accel-win-control">
- Ctrl+
- </string>
- <string name="accel-win-alt">
- Alt+
- </string>
- <string name="accel-win-shift">
- Shift+
- </string>
- <string name="FileSaved">
- Zapisane pliki
- </string>
- <string name="Receiving">
- Otrzymane
- </string>
- <string name="AM">
- AM
- </string>
- <string name="PM">
- PM
- </string>
- <string name="PST">
- PST
- </string>
- <string name="PDT">
- PDT
- </string>
- <string name="Direction_Forward">
- Do przodu
- </string>
- <string name="Direction_Left">
- Lewo
- </string>
- <string name="Direction_Right">
- Prawo
- </string>
- <string name="Direction_Back">
- Wstecz
- </string>
- <string name="Direction_North">
- Północ
- </string>
- <string name="Direction_South">
- Południe
- </string>
- <string name="Direction_West">
- Zachód
- </string>
- <string name="Direction_East">
- Wschód
- </string>
- <string name="Direction_Up">
- W górę
- </string>
- <string name="Direction_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 Lokalizacja
- </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">
- Parki i Natura
- </string>
- <string name="Residential">
- Mieszkalna
- </string>
- <string name="Stage">
- Scena
- </string>
- <string name="Other">
- Inna
- </string>
- <string name="Rental">
- Wynajem
- </string>
- <string name="Any">
- Jakiekolwiek
- </string>
- <string name="You">
- Ty
- </string>
- <string name="Multiple Media">
- Multimedia
- </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 zminimalizowanych 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 wykrycia dysku twardego i/lub nieaktualizowanych dysków twardych, które mogą przyczynić się do obniżenia stabilności, wydajności systemowej 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">
- Nie można uruchomić 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, ponieważ nie jest możliwe dostanie 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 Fringe">
- Tylnia grzywka
- </string>
- <string name="Baggy">
- Wypchane
- </string>
- <string name="Bangs">
- Pasemka
- </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 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 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">
- Wytrzeszcz oczu
- </string>
- <string name="Bugged Eyes">
- Wytrzeszczone oczy
- </string>
- <string name="Bulbous">
- Bulwiasty
- </string>
- <string name="Bulbous Nose">
- Bulwiasty nos
- </string>
- <string name="Breast Physics Mass">
- Masa piersi
- </string>
- <string name="Breast Physics Smoothing">
- Wygładzanie piersi
- </string>
- <string name="Breast Physics Gravity">
- Grawitacja piersi
- </string>
- <string name="Breast Physics Drag">
- Ściśnięcie piersi
- </string>
- <string name="Breast Physics InOut Max Effect">
- Efekt max
- </string>
- <string name="Breast Physics InOut Spring">
- Sprężystość
- </string>
- <string name="Breast Physics InOut Gain">
- Wzmocnienie
- </string>
- <string name="Breast Physics InOut Damping">
- Tłumienie
- </string>
- <string name="Breast Physics UpDown Max Effect">
- Efekt max
- </string>
- <string name="Breast Physics UpDown Spring">
- Sprężystość
- </string>
- <string name="Breast Physics UpDown Gain">
- Wzmocnienie
- </string>
- <string name="Breast Physics UpDown Damping">
- Tłumienie
- </string>
- <string name="Breast Physics LeftRight Max Effect">
- Efekt max
- </string>
- <string name="Breast Physics LeftRight Spring">
- Sprężystość
- </string>
- <string name="Breast Physics LeftRight Gain">
- Wzmocnienie
- </string>
- <string name="Breast Physics LeftRight Damping">
- Tłumienie
- </string>
- <string name="Belly Physics Mass">
- Masa brzucha
- </string>
- <string name="Belly Physics Smoothing">
- Wygładzanie brzucha
- </string>
- <string name="Belly Physics Gravity">
- Grawitacja brzucha
- </string>
- <string name="Belly Physics Drag">
- Ściśnięcie brzucha
- </string>
- <string name="Belly Physics UpDown Max Effect">
- Efekt max
- </string>
- <string name="Belly Physics UpDown Spring">
- Sprężystość
- </string>
- <string name="Belly Physics UpDown Gain">
- Wzmocnienie
- </string>
- <string name="Belly Physics UpDown Damping">
- Tłumienie
- </string>
- <string name="Butt Physics Mass">
- Masa pośladków
- </string>
- <string name="Butt Physics Smoothing">
- Wygładzanie pośladków
- </string>
- <string name="Butt Physics Gravity">
- Grawitacja pośladków
- </string>
- <string name="Butt Physics Drag">
- Ściśnięcie pośladków
- </string>
- <string name="Butt Physics UpDown Max Effect">
- Efekt max
- </string>
- <string name="Butt Physics UpDown Spring">
- Sprężystość
- </string>
- <string name="Butt Physics UpDown Gain">
- Wzmocnienie
- </string>
- <string name="Butt Physics UpDown Damping">
- Tłumienie
- </string>
- <string name="Butt Physics LeftRight Max Effect">
- Efekt max
- </string>
- <string name="Butt Physics LeftRight Spring">
- Sprężystość
- </string>
- <string name="Butt Physics LeftRight Gain">
- Wzmocnienie
- </string>
- <string name="Butt Physics LeftRight Damping">
- Tłumienie
- </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="Butt Gravity">
- Grawitacja 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">
- Oczy blisko ustawione
- </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">
- Kącik w dół
- </string>
- <string name="Corner Up">
- Kącik w górę
- </string>
- <string name="Creased">
- Pognieciony
- </string>
- <string name="Crooked Nose">
- Skrzywienie nosa
- </string>
- <string name="Cuff Flare">
- Szeroki rękaw
- </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="Dense">
- Gęstość
- </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="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">
- Kredka do oczu
- </string>
- <string name="Eyeliner Color">
- Kolor kredki do oczu&apos;a
- </string>
- <string name="Eyes Bugged">
- Wytrzeszczone oczy
- </string>
- <string name="Face Shear">
- Usunięcie twarzy
- </string>
- <string name="Facial Definition">
- Detale twarzy
- </string>
- <string name="Far Set Eyes">
- Oczy szeroko rozstawione
- </string>
- <string name="Fat Lips">
- Grube usta
- </string>
- <string name="Female">
- Kobieta
- </string>
- <string name="Fingerless">
- Bez palców
- </string>
- <string name="Fingers">
- Palce
- </string>
- <string name="Flared Cuffs">
- Rozszerzane rękawy
- </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 Fringe">
- Przednia grzywka
- </string>
- <string name="Full Back">
- Gęstość włosów po bokach
- </string>
- <string name="Full Eyeliner">
- Gęsta kredka do oczu
- </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">
- Włosy: 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">
- Przes. fryzury
- </string>
- <string name="Hair Tilted Left">
- Przes. fryzury L
- </string>
- <string name="Hair Tilted Right">
- Przes. fryzury P
- </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>
- <string name="High Heels">
- Wysokie obcasy
- </string>
- <string name="High Jaw">
- Wysoka szczęka
- </string>
- <string name="High Platforms">
- Wysokie obcasy
- </string>
- <string name="High and Tight">
- Wysokie i wąskie
- </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">
- Wewnę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">
- Kąt szczęki
- </string>
- <string name="Jaw Jut">
- Wystająca szczęka
- </string>
- <string name="Jaw Shape">
- Kształt szczęki
- </string>
- <string name="Join">
- Złącz
- </string>
- <string name="Jowls">
- Dolna część policzka
- </string>
- <string name="Knee Angle">
- Kąt kolana
- </string>
- <string name="Knock Kneed">
- Iksowate nogi
- </string>
- <string name="Large">
- Duże
- </string>
- <string name="Large Hands">
- Duże dłonie
- </string>
- <string name="Left Part">
- Lewa część
- </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">
- Mniej pełne
- </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">
- Mniej zaróżowione
- </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łne usta
- </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="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">
- Niskie obcasy
- </string>
- <string name="Low and Loose">
- Niskie i luźne
- </string>
- <string name="Lower">
- Niżej
- </string>
- <string name="Lower Bridge">
- Dolny mostek
- </string>
- <string name="Lower Cheeks">
- Niższe policzki
- </string>
- <string name="Male">
- Mężczyzna
- </string>
- <string name="Middle Part">
- Część środkowa
- </string>
- <string name="More">
- Więcej
- </string>
- <string name="More Blush">
- Bardziej zarumienione
- </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">
- Ciemniejszy cień oczu
- </string>
- <string name="More Freckles">
- Więcej piegów
- </string>
- <string name="More Full">
- Bardziej pełne
- </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">
- Bardziej zaróżowione
- </string>
- <string name="More Round">
- Więcej zaokrąglenia
- </string>
- <string name="More Saddle">
- More Saddle
- </string>
- <string name="More Sloped">
- Bardziej spadziste
- </string>
- <string name="More Square">
- Więcej kwadratowy
- </string>
- <string name="More Upper Lip">
- Więcej górnej wargi
- </string>
- <string name="More Vertical">
- Bardziej pionowe
- </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">
- Brak rumieńca
- </string>
- <string name="No Eyeliner">
- Brak kredki do oczu&apos;s
- </string>
- <string name="No Eyeshadow">
- Brak cienia pod powieką
- </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="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">
- Przodozgryz górny
- </string>
- <string name="Package">
- Package
- </string>
- <string name="Painted Nails">
- Pomalowane paznokcie
- </string>
- <string name="Pale">
- Blady
- </string>
- <string name="Pants Crotch">
- Krocze spodni
- </string>
- <string name="Pants Fit">
- Dopasowanie spodni
- </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">
- Część grzywki
- </string>
- <string name="Pectorals">
- Mięśnie klatki piersiowej
- </string>
- <string name="Pigment">
- Pigment
- </string>
- <string name="Pigtails">
- Warkocz
- </string>
- <string name="Pink">
- Różowe
- </string>
- <string name="Pinker">
- Róż
- </string>
- <string name="Platform Height">
- Wysokie obcasy
- </string>
- <string name="Platform Width">
- Szerokie obcasy
- </string>
- <string name="Pointy">
- Pointy
- </string>
- <string name="Pointy Heels">
- Obcasy pointy
- </string>
- <string name="Ponytail">
- Kucyk
- </string>
- <string name="Poofy Skirt">
- Poofy Skirt
- </string>
- <string name="Pop Left Eye">
- Wybałuszone lewe oko
- </string>
- <string name="Pop Right Eye">
- Wybałuszone prawe oko
- </string>
- <string name="Puffy">
- Opuchnięty
- </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="Regular">
- Regularne
- </string>
- <string name="Right Part">
- Prawa część
- </string>
- <string name="Rosy Complexion">
- Kompleksowość różu
- </string>
- <string name="Round">
- Zaokrąglenie
- </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="Scrawny Leg">
- Koścista noga
- </string>
- <string name="Separate">
- Odzielne
- </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 Up">
- Usunięcie od lewej strony do góry
- </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ęść koszuli
- </string>
- <string name="Shirt Fit">
- Dopasowanie koszuli
- </string>
- <string name="Shirt Wrinkles">
- Zmarszczki na koszuli
- </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">
- Krótkie warkoczyki
- </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 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 Neck">
- Smukły kark
- </string>
- <string name="Skirt Fit">
- Dopasowanie spódnicy
- </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źne rękawy
- </string>
- <string name="Slit Back">
- Rozcięcie: tył
- </string>
- <string name="Slit Front">
- Rozcięcie: przód
- </string>
- <string name="Slit Left">
- Rozcięcie: po prawej
- </string>
- <string name="Slit Right">
- Rozcięcie: po lewej
- </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="Soulpatch">
- Zarost na dolnej wardze
- </string>
- <string name="Sparse">
- Rzadki
- </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="Stretch Head">
- Rozciągnięta głowa
- </string>
- <string name="Sunken">
- Zapadnięte
- </string>
- <string name="Sunken Chest">
- Zapadnięta klatka piersiowa
- </string>
- <string name="Sunken Eyes">
- Zapadnięte oczy
- </string>
- <string name="Sweep Back">
- Sweep Back
- </string>
- <string name="Sweep Forward">
- Sweep Forward
- </string>
- <string name="Tall">
- Wysokość
- </string>
- <string name="Taper Back">
- Zwężenie do przodu
- </string>
- <string name="Taper Front">
- Zwężenie do tyłu
- </string>
- <string name="Thick Heels">
- Grube obcasy
- </string>
- <string name="Thick Neck">
- Gruby kark
- </string>
- <string name="Thick Toe">
- Gruby palec
- </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">
- Wąska spódnica
- </string>
- <string name="Tight Sleeves">
- Obcisłe rękawy
- </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">
- Przodozgryz
- </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ść talii
- </string>
- <string name="Well-Fed">
- Dobrze odżywiony
- </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 landmarków
- </string>
- <string name="LocationCtrlEditLandmarkTooltip">
- Edytuj Landmarki
- </string>
- <string name="LocationCtrlInfoBtnTooltip">
- Zobacz więcej szczegółów na temat obecnej lokalizacji
- </string>
- <string name="LocationCtrlComboBtnTooltip">
- Historia odwiedzonych miejsc
- </string>
- <string name="LocationCtrlAdultIconTooltip">
- Region Adult
- </string>
- <string name="LocationCtrlModerateIconTooltip">
- Region Moderate
- </string>
- <string name="LocationCtrlGeneralIconTooltip">
- Region
- </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="ItemsComingInTooFastFrom">
- [APP_NAME]: Obiekty ładują się zbyt szybko od [FROM_NAME], automatyczny podgląd jest wyłączony na [TIME] sekund
- </string>
- <string name="ItemsComingInTooFast">
- [APP_NAME]: Obiekty ładują się zbyt szybko, automatyczny podgląd jest wyłączony na [TIME] sekund
- </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="Saved_message">
- (Zapisano [LONG_TIMESTAMP])
- </string>
- <string name="answered_call">
- Twoja rozmowa głosowa została odebrana
- </string>
- <string name="you_started_call">
- Rozmowa głosowa została rozpoczęta
- </string>
- <string name="you_joined_call">
- Dołączyłeś/Dołączyłaś do rozmowy głosowej
- </string>
- <string name="name_started_call">
- [NAME] zaczyna rozmowę głosową
- </string>
- <string name="ringing-im">
- Rozmowa głosowa...
- </string>
- <string name="connected-im">
- Połączono, kliknij Zakończ rozmowę aby się rozłączyć
- </string>
- <string name="hang_up-im">
- Rozmowa głosowa zakończona
- </string>
- <string name="conference-title-incoming">
- Konferencja z [AGENT_NAME]
- </string>
- <string name="no_session_message">
- (Sesja IM wygasła)
- </string>
- <string name="only_user_message">
- Jesteś jedyną osobą w tej konferencji.
- </string>
- <string name="offline_message">
- [NAME] opuszcza Second Life.
- </string>
- <string name="invite_message">
- Kliknij na [BUTTON NAME] przycisk by zaakceptować/dołączyć do tej rozmowy.
- </string>
- <string name="muted_message">
- Zablokowałeś tego Rezydenta. Wysłanie wiadomości automatycznie odblokuje go.
- </string>
- <string name="generic">
- Błąd zapytania, proszę spróbować później
- </string>
- <string name="generic_request_error">
- Błąd. Spróbuj ponownie za kilka minut.
- </string>
- <string name="insufficient_perms_error">
- Nie posiadasz praw do kontynuacji.
- </string>
- <string name="session_does_not_exist_error">
- Ta konferencja jest już zakończona.
- </string>
- <string name="no_ability_error">
- Nie posiadesz tego przywileju.
- </string>
- <string name="no_ability">
- Nie posiadesz tego przywileju.
- </string>
- <string name="not_a_mod_error">
- Nie jesteś moderatorem konferencji.
- </string>
- <string name="muted">
- Moderator grupy wyłączył czat.
- </string>
- <string name="muted_error">
- Moderator wyciszył Cię.
- </string>
- <string name="add_session_event">
- Nie można dodać nikogo do czatu z [RECIPIENT].
- </string>
- <string name="message">
- Nie można wysłać Twojej wiadomości do sesji czatu z [RECIPIENT].
- </string>
- <string name="message_session_event">
- Nie można wysłać Twojej wiadomości do sesji czatu z [RECIPIENT].
- </string>
- <string name="mute">
- Błąd poczas moderacji.
- </string>
- <string name="removed">
- Zostałeś usunięty z grupy
- </string>
- <string name="removed_from_group">
- Usunięto Cię z grupy.
- </string>
- <string name="close_on_no_ability">
- Nie posiadasz praw by uczestniczyć w tej konferencji.
- </string>
- <string name="unread_chat_single">
- [SOURCES] powiedział/a coś nowego
- </string>
- <string name="unread_chat_multiple">
- [SOURCES] powiedział/a coś nowego
- </string>
- <string name="session_initialization_timed_out_error">
- Inicjacja sesji wygasła
- </string>
- <string name="voice_morphing_url">
- http://secondlife.com/landing/voicemorphing
- </string>
- <string name="paid_you_ldollars">
- [NAME] zapłaciła/zapłacił Tobie [AMOUNT]L$ [REASON].
- </string>
- <string name="paid_you_ldollars_no_reason">
- [NAME] zapłacił/zapłaciła Tobie L$[AMOUNT].
- </string>
- <string name="you_paid_ldollars">
- Zapłacono [NAME] [AMOUNT]L$ [REASON].
- </string>
- <string name="you_paid_ldollars_no_info">
- Zapłacono L$[AMOUNT].
- </string>
- <string name="you_paid_ldollars_no_reason">
- Zapłacono [NAME] [AMOUNT]L$.
- </string>
- <string name="you_paid_ldollars_no_name">
- Zapłacono [AMOUNT]L$ [REASON].
- </string>
- <string name="for item">
- dla [ITEM]
- </string>
- <string name="for a parcel of land">
- za Posiadłość
- </string>
- <string name="for a land access pass">
- za przepustkę na Posiadłość
- </string>
- <string name="for deeding land">
- dla przypisania Posiadłości
- </string>
- <string name="to create a group">
- aby stworzyć grupę
- </string>
- <string name="to join a group">
- aby dołączyć do grupy
- </string>
- <string name="to upload">
- aby pobrać
- </string>
- <string name="to publish a classified ad">
- publikacja reklamy
- </string>
- <string name="giving">
- Dajesz L$ [AMOUNT]
- </string>
- <string name="uploading_costs">
- Ładowanie kosztuje [AMOUNT]L$
- </string>
- <string name="this_costs">
- To kosztuje [AMOUNT]L$
- </string>
- <string name="buying_selected_land">
- Kupno wybranej Posiadłości [AMOUNT]L$
- </string>
- <string name="this_object_costs">
- Ten obiekt kosztuje [AMOUNT]L$
- </string>
- <string name="group_role_everyone">
- Każdy
- </string>
- <string name="group_role_officers">
- Oficerowie
- </string>
- <string name="group_role_owners">
- Właściciele
- </string>
- <string name="group_member_status_online">
- Obecnie w SL
- </string>
- <string name="uploading_abuse_report">
- Pobieranie...
-
-Raport o Nadużyciu
- </string>
- <string name="New Shape">
- Nowy ksztalt
- </string>
- <string name="New Skin">
- Nowa skórka
- </string>
- <string name="New Hair">
- Nowe włosy
- </string>
- <string name="New Eyes">
- Nowe oczy
- </string>
- <string name="New Shirt">
- Nowa koszula
- </string>
- <string name="New Pants">
- Nowe spodnie
- </string>
- <string name="New Shoes">
- Nowe buty
- </string>
- <string name="New Socks">
- Nowe skarpetki
- </string>
- <string name="New Jacket">
- Nowa kurtka
- </string>
- <string name="New Gloves">
- Nowe rękawiczki
- </string>
- <string name="New Undershirt">
- Nowy podkoszulek
- </string>
- <string name="New Underpants">
- Nowa bielizna
- </string>
- <string name="New Skirt">
- Nowa spódnica
- </string>
- <string name="New Alpha">
- Nowa alpha
- </string>
- <string name="New Tattoo">
- Nowy tatuaż
- </string>
- <string name="New Physics">
- Nowa fizyka
- </string>
- <string name="Invalid Wearable">
- Nieaktualne ubranie/część ciała
- </string>
- <string name="New Gesture">
- Nowa gesturka
- </string>
- <string name="New Script">
- Nowy skrypt
- </string>
- <string name="New Note">
- Stwórz nowe ogłoszenie
- </string>
- <string name="New Folder">
- Nowy folder
- </string>
- <string name="Contents">
- Zawartość
- </string>
- <string name="Gesture">
- Gesturki
- </string>
- <string name="Male Gestures">
- Gesturki dla mężczyzn
- </string>
- <string name="Female Gestures">
- Gesturki dla kobiet
- </string>
- <string name="Other Gestures">
- Inne gesturki
- </string>
- <string name="Speech Gestures">
- Gesturki przemówienia
- </string>
- <string name="Common Gestures">
- Gesturki
- </string>
- <string name="Male - Excuse me">
- Mężczyzna - Excuse me
- </string>
- <string name="Male - Get lost">
- Mężczyzna - Get lost
- </string>
- <string name="Male - Blow kiss">
- Mężczyzna - Całusek
- </string>
- <string name="Male - Boo">
- Mężczyzna - Boo
- </string>
- <string name="Male - Bored">
- Mężczyzna - Znudzony
- </string>
- <string name="Male - Hey">
- Mężczyzna - Hey
- </string>
- <string name="Male - Laugh">
- Mężczyzna - Śmiech
- </string>
- <string name="Male - Repulsed">
- Mężczyzna - Odrzucenie
- </string>
- <string name="Male - Shrug">
- Mężczyzna - Wzruszenie ramionami
- </string>
- <string name="Male - Stick tougue out">
- Mężczyzna - Pokaż język
- </string>
- <string name="Male - Wow">
- Mężczyzna - Wow
- </string>
- <string name="Female - Chuckle">
- Kobieta - Chichot
- </string>
- <string name="Female - Cry">
- Kobieta - Płacze
- </string>
- <string name="Female - Embarrassed">
- Kobieta - Zakłopotana
- </string>
- <string name="Female - Excuse me">
- Kobieta - Excuse me
- </string>
- <string name="Female - Get lost">
- Kobieta - Get lost
- </string>
- <string name="Female - Blow kiss">
- Kobieta - Całusek
- </string>
- <string name="Female - Boo">
- Kobieta - Boo
- </string>
- <string name="Female - Bored">
- Kobieta - Znudzona
- </string>
- <string name="Female - Hey">
- Kobieta - Hey
- </string>
- <string name="Female - Hey baby">
- Kobieta - Hey baby
- </string>
- <string name="Female - Laugh">
- Kobieta - Śmiech
- </string>
- <string name="Female - Looking good">
- Kobieta - Looking good
- </string>
- <string name="Female - Over here">
- Kobieta - Over here
- </string>
- <string name="Female - Please">
- Kobieta - Please
- </string>
- <string name="Female - Repulsed">
- Kobieta - Odrzucenie
- </string>
- <string name="Female - Shrug">
- Kobieta - Wzruszenie ramionami
- </string>
- <string name="Female - Stick tougue out">
- Kobieta - Pokaż język
- </string>
- <string name="Female - Wow">
- Kobieta - Wow
- </string>
- <string name="AvatarBirthDateFormat">
- [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
- </string>
- <string name="DefaultMimeType">
- żadne/żadne
- </string>
- <string name="texture_load_dimensions_error">
- Nie można załadować zdjęcia większego niż [WIDTH]*[HEIGHT]
- </string>
- <string name="words_separator" value=","/>
- <string name="server_is_down">
- Pomimo naszych najlepszych starań wystąpił niespodziewany problem.
-
- Proszę sprawdzić czy na stronie status.secondlifegrid.net nie zostały umieszczone informacje o rozpoznanych problemach serwera.
- Jeśli problemy będą występowały nadal, proszę sprawdź sieć i ustawienia firewall.
- </string>
- <string name="dateTimeWeekdaysNames">
- Niedziela:Poniedziałek:Wtorek:Środa:Czwartek:Piątek:Sobota
- </string>
- <string name="dateTimeWeekdaysShortNames">
- Niedz.:Pon.:Wt.:Śr.:Czw.:Pt.:Sob.
- </string>
- <string name="dateTimeMonthNames">
- Styczeń:Luty:Marzec:Kwiecień:Maj:Czerwiec:Lipiec:Sierpień:Wrzesień:Październik:Listopad:Grudzień
- </string>
- <string name="dateTimeMonthShortNames">
- St.:Lt.:Mrz.:Kw.:Maj:Cz.:Lp.:Sie.:Wrz.:Li.:Paź.:Gru.
- </string>
- <string name="dateTimeDayFormat">
- [MDAY]
- </string>
- <string name="dateTimeAM">
- AM
- </string>
- <string name="dateTimePM">
- PM
- </string>
- <string name="LocalEstimateUSD">
- US$ [AMOUNT]
- </string>
- <string name="Membership">
- Członkostwo
- </string>
- <string name="Roles">
- Funkcje
- </string>
- <string name="Group Identity">
- Status grupy
- </string>
- <string name="Parcel Management">
- Parcel Management
- </string>
- <string name="Parcel Identity">
- Parcel Identity
- </string>
- <string name="Parcel Settings">
- Parcel Settings
- </string>
- <string name="Parcel Powers">
- Parcel Powers
- </string>
- <string name="Parcel Access">
- Dostęp do posiadłości
- </string>
- <string name="Parcel Content">
- Parcel Content
- </string>
- <string name="Object Management">
- Object Management
- </string>
- <string name="Accounting">
- Accounting
- </string>
- <string name="Notices">
- Ogłoszenia
- </string>
- <string name="Chat" value=" Czat :">
- Czat
- </string>
- <string name="DeleteItems">
- Usuń wybrane obiekty?
- </string>
- <string name="DeleteItem">
- Usuń wybrane obiekty?
- </string>
- <string name="EmptyOutfitText">
- W tym stroju nie ma elementów
- </string>
- <string name="ExternalEditorNotSet">
- Wybierz edytor używając ustawień ExternalEditor.
- </string>
- <string name="ExternalEditorNotFound">
- Nie odnaleziono zewnętrzego edytora wskazanego przez Ciebie.
-Spróbuj załączyć ścieżkę do edytora w cytowaniu.
-(np. &quot;/ścieżka do mojego/edytora&quot; &quot;%s&quot;)
- </string>
- <string name="ExternalEditorCommandParseError">
- Błąd w składni komendy zewnętrznego edytora.
- </string>
- <string name="ExternalEditorFailedToRun">
- Uruchomienie zewnętrznego edytora nie powiodło się.
- </string>
- <string name="Esc">
- Esc
- </string>
- <string name="Space">
- Space
- </string>
- <string name="Enter">
- Enter
- </string>
- <string name="Tab">
- Tab
- </string>
- <string name="Ins">
- Ins
- </string>
- <string name="Del">
- Del
- </string>
- <string name="Backsp">
- Backsp
- </string>
- <string name="Shift">
- Shift
- </string>
- <string name="Ctrl">
- Ctrl
- </string>
- <string name="Alt">
- Alt
- </string>
- <string name="CapsLock">
- CapsLock
- </string>
- <string name="Home">
- Miejsce Startu
- </string>
- <string name="End">
- End
- </string>
- <string name="PgUp">
- PgUp
- </string>
- <string name="PgDn">
- PgDn
- </string>
- <string name="F1">
- F1
- </string>
- <string name="F2">
- F2
- </string>
- <string name="F3">
- F3
- </string>
- <string name="F4">
- F4
- </string>
- <string name="F5">
- F5
- </string>
- <string name="F6">
- F6
- </string>
- <string name="F7">
- F7
- </string>
- <string name="F8">
- F8
- </string>
- <string name="F9">
- F9
- </string>
- <string name="F10">
- F10
- </string>
- <string name="F11">
- F11
- </string>
- <string name="F12">
- F12
- </string>
- <string name="Add">
- Dodaj
- </string>
- <string name="Subtract">
- Odejmij
- </string>
- <string name="Multiply">
- Mnożenie
- </string>
- <string name="Divide">
- Podziel
- </string>
- <string name="PAD_DIVIDE">
- PAD_DIVIDE
- </string>
- <string name="PAD_LEFT">
- PAD_LEFT
- </string>
- <string name="PAD_RIGHT">
- PAD_RIGHT
- </string>
- <string name="PAD_DOWN">
- PAD_DOWN
- </string>
- <string name="PAD_UP">
- PAD_UP
- </string>
- <string name="PAD_HOME">
- PAD_HOME
- </string>
- <string name="PAD_END">
- PAD_END
- </string>
- <string name="PAD_PGUP">
- PAD_PGUP
- </string>
- <string name="PAD_PGDN">
- PAD_PGDN
- </string>
- <string name="PAD_CENTER">
- PAD_CENTER
- </string>
- <string name="PAD_INS">
- PAD_INS
- </string>
- <string name="PAD_DEL">
- PAD_DEL
- </string>
- <string name="PAD_Enter">
- PAD_Enter
- </string>
- <string name="PAD_BUTTON0">
- PAD_BUTTON0
- </string>
- <string name="PAD_BUTTON1">
- PAD_BUTTON1
- </string>
- <string name="PAD_BUTTON2">
- PAD_BUTTON2
- </string>
- <string name="PAD_BUTTON3">
- PAD_BUTTON3
- </string>
- <string name="PAD_BUTTON4">
- PAD_BUTTON4
- </string>
- <string name="PAD_BUTTON5">
- PAD_BUTTON5
- </string>
- <string name="PAD_BUTTON6">
- PAD_BUTTON6
- </string>
- <string name="PAD_BUTTON7">
- PAD_BUTTON7
- </string>
- <string name="PAD_BUTTON8">
- PAD_BUTTON8
- </string>
- <string name="PAD_BUTTON9">
- PAD_BUTTON9
- </string>
- <string name="PAD_BUTTON10">
- PAD_BUTTON10
- </string>
- <string name="PAD_BUTTON11">
- PAD_BUTTON11
- </string>
- <string name="PAD_BUTTON12">
- PAD_BUTTON12
- </string>
- <string name="PAD_BUTTON13">
- PAD_BUTTON13
- </string>
- <string name="PAD_BUTTON14">
- PAD_BUTTON14
- </string>
- <string name="PAD_BUTTON15">
- PAD_BUTTON15
- </string>
- <string name="-">
- -
- </string>
- <string name="=">
- =
- </string>
- <string name="`">
- `
- </string>
- <string name=";">
- ;
- </string>
- <string name="[">
- [
- </string>
- <string name="]">
- ]
- </string>
- <string name="\">
- \
- </string>
- <string name="0">
- 0
- </string>
- <string name="1">
- 1
- </string>
- <string name="2">
- 2
- </string>
- <string name="3">
- 3
- </string>
- <string name="4">
- 4
- </string>
- <string name="5">
- 5
- </string>
- <string name="6">
- 6
- </string>
- <string name="7">
- 7
- </string>
- <string name="8">
- 8
- </string>
- <string name="9">
- 9
- </string>
- <string name="A">
- A
- </string>
- <string name="B">
- B
- </string>
- <string name="C">
- C
- </string>
- <string name="D">
- D
- </string>
- <string name="E">
- E
- </string>
- <string name="F">
- F
- </string>
- <string name="G">
- G
- </string>
- <string name="H">
- H
- </string>
- <string name="I">
- I
- </string>
- <string name="J">
- J
- </string>
- <string name="K">
- K
- </string>
- <string name="L">
- L
- </string>
- <string name="M">
- M
- </string>
- <string name="N">
- N
- </string>
- <string name="O">
- O
- </string>
- <string name="P">
- P
- </string>
- <string name="Q">
- Q
- </string>
- <string name="R">
- R
- </string>
- <string name="S">
- S
- </string>
- <string name="T">
- T
- </string>
- <string name="U">
- U
- </string>
- <string name="V">
- V
- </string>
- <string name="W">
- W
- </string>
- <string name="X">
- X
- </string>
- <string name="Y">
- Y
- </string>
- <string name="Z">
- Z
- </string>
- <string name="BeaconParticle">
- Podgląd lokalizatorów cząsteczek (niebieski)
- </string>
- <string name="BeaconPhysical">
- Podgląd lokalizatorów fizycznych obiektów (zielony)
- </string>
- <string name="BeaconScripted">
- Podgląd lokalizatorów obiektów skryptowanych (czerwony)
- </string>
- <string name="BeaconScriptedTouch">
- Podgląd lokalizatorów obiektów skryptowanych z opcją dotyku (czerwony)
- </string>
- <string name="BeaconSound">
- Podgląd lokalizatorów dźwięków (żółty)
- </string>
- <string name="BeaconMedia">
- Podgląd lokalizatorów mediów (biały)
- </string>
- <string name="ParticleHiding">
- Ukryj cząsteczki
- </string>
-</strings>
diff --git a/indra/newview/skins/steam/xui/pt/strings.xml b/indra/newview/skins/steam/xui/pt/strings.xml
deleted file mode 100644
index 07fd95c907..0000000000
--- a/indra/newview/skins/steam/xui/pt/strings.xml
+++ /dev/null
@@ -1,4885 +0,0 @@
-<?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
- that are returned from one component and may appear in many places-->
-<strings>
- <string name="CAPITALIZED_APP_NAME">
- SECOND LIFE
- </string>
- <string name="SUPPORT_SITE">
- Portal de Supporte Second Life
- </string>
- <string name="StartupDetectingHardware">
- Detectando hardware...
- </string>
- <string name="StartupLoading">
- Carregando [APP_NAME]...
- </string>
- <string name="StartupClearingCache">
- Limpando o cache...
- </string>
- <string name="StartupInitializingTextureCache">
- Iniciando cache de texturas...
- </string>
- <string name="StartupInitializingVFS">
- Iniciando VFS...
- </string>
- <string name="StartupRequireDriverUpdate">
- Falha na inicialização dos gráficos. Atualize seu driver gráfico!
- </string>
- <string name="ProgressRestoring">
- Restaurando...
- </string>
- <string name="ProgressChangingResolution">
- Alterando a resolução...
- </string>
- <string name="Fullbright">
- Fullbright (antigo)
- </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>
- <string name="LoginMaintenance">
- Executando manutenção da conta...
- </string>
- <string name="LoginAttempt">
- Falha na tentativa anterior de login. Login, tentativa [NUMBER]
- </string>
- <string name="LoginPrecaching">
- Carregando mundo...
- </string>
- <string name="LoginInitializingBrowser">
- Inicializando navegador embutido...
- </string>
- <string name="LoginInitializingMultimedia">
- Inicializando multimídia...
- </string>
- <string name="LoginInitializingFonts">
- Carregando fontes...
- </string>
- <string name="LoginVerifyingCache">
- Verificando arquivos cache (pode levar de 60-90 segundos)...
- </string>
- <string name="LoginProcessingResponse">
- Processando resposta...
- </string>
- <string name="LoginInitializingWorld">
- Inicializando mundo...
- </string>
- <string name="LoginDecodingImages">
- Decodificando imagens...
- </string>
- <string name="LoginInitializingQuicktime">
- Inicializando o QuickTime...
- </string>
- <string name="LoginQuicktimeNotFound">
- O QuickTime não foi encontrado - falha ao iniciar.
- </string>
- <string name="LoginQuicktimeOK">
- O QuickTime foi inicializado com sucesso.
- </string>
- <string name="LoginRequestSeedCapGrant">
- Solicitando recursos da região...
- </string>
- <string name="LoginRetrySeedCapGrant">
- Solicitando recursos da região, tentativa [NUMBER]...
- </string>
- <string name="LoginWaitingForRegionHandshake">
- Aguardando handshake com a região...
- </string>
- <string name="LoginConnectingToRegion">
- Conectando à região...
- </string>
- <string name="LoginDownloadingClothing">
- Baixando roupas...
- </string>
- <string name="InvalidCertificate">
- O servidor respondeu com um certificado inválido ou corrompido. Por favor contate o administrador do Grid.
- </string>
- <string name="CertInvalidHostname">
- Um hostname inválido foi usado para acessar o servidor. Verifique o SLURL ou hostname do Grid.
- </string>
- <string name="CertExpired">
- O certificado dado pelo Grid parece estar vencido. Verifique o relógio do sistema ou contate o administrador do Grid.
- </string>
- <string name="CertKeyUsage">
- O certificado dado pelo servidor não pôde ser usado para SSL. Por favor contate o administrador do Grid.
- </string>
- <string name="CertBasicConstraints">
- A cadeia de certificados do servidor tinha certificados demais. Por favor contate o administrador do Grid.
- </string>
- <string name="CertInvalidSignature">
- A assinatura do certificado dado pelo servidor do Grid não pôde ser verificada. Contate o administrador do seu Grid.
- </string>
- <string name="LoginFailedNoNetwork">
- Erro de rede: Falha de conexão: verifique sua conexão à internet.
- </string>
- <string name="LoginFailed">
- Falha do login.
- </string>
- <string name="Quit">
- Sair
- </string>
- <string name="create_account_url">
- http://join.secondlife.com/index.php?sourceid=1206_steam&amp;lang=pt-BR
- </string>
- <string name="LoginFailedViewerNotPermitted">
- O visualizador utilizado já não é compatível com o Second Life. Visite a página abaixo para baixar uma versão atual: http://secondlife.com/download
-
-Para saber mais, visite as perguntas frequentes abaixo: http://secondlife.com/viewer-access-faq
- </string>
- <string name="LoginIntermediateOptionalUpdateAvailable">
- Existe uma versão atualizada do seu visualizador: [VERSION]
- </string>
- <string name="LoginFailedRequiredUpdate">
- Atualização de visualizador obrigatória: [VERSION]
- </string>
- <string name="LoginFailedAlreadyLoggedIn">
- Este agente já fez login.
- </string>
- <string name="LoginFailedAuthenticationFailed">
- Desculpe! Não foi possível fazer seu login. Verifique se digitou o nome de usuário correto* (como kiki45 ou astro.física) * e senha. Verifique também que a tecla Maiúscula está desativada.
- </string>
- <string name="LoginFailedPasswordChanged">
- Como medida de precaução, sua senha foi alterada. Visite sua conta em http://secondlife.com/password e responda a pergunta de segurança para mudar sua senha. Lamentamos qualquer inconveniente.
- </string>
- <string name="LoginFailedPasswordReset">
- Fizemos algumas alterações a seu sistema. Você precisa selecionar outra senha. Visite sua conta em http://secondlife.com/password e responda a pergunta de segurança para mudar sua senha. Lamentamos qualquer inconveniente.
- </string>
- <string name="LoginFailedEmployeesOnly">
- O Second Life está fechado para manutenção no momento. Somente funcionários podem acessá-lo. Consulte www.secondlife.com/status para as últimas atualizações.
- </string>
- <string name="LoginFailedPremiumOnly">
- Logons do Second Life estão temporariamente restritos para garantir a melhor experiência possível para os usuários no mundo virtual.
-
-Pessoas com contas gratuitas não poderão acessar o Second Life no momento para dar espaço para aquelas que pagaram pelo Second Life.
- </string>
- <string name="LoginFailedComputerProhibited">
- O Second Life não pode ser acessado deste computador. Se você acredita que houve algum equívoco, contate support@secondlife.com.
- </string>
- <string name="LoginFailedAcountSuspended">
- Sua conta não está disponível para acesso até [TIME], horário do Pacífico nos EUA (GMT-08).
- </string>
- <string name="LoginFailedAccountDisabled">
- Não é possível concluir a solicitação neste momento. Para obter mais ajuda, conte o suporte em http://secondlife.com/support. Caso você não possa mudar sua senha, ligue para (866) 476-9763.
- </string>
- <string name="LoginFailedTransformError">
- Dados discrepantes detectados durante o login. Contate support@secondlife.com.
- </string>
- <string name="LoginFailedAccountMaintenance">
- Sua conta está passando por um breve período de manutenção. Sua conta não está disponível para acesso até [TIME], horário do Pacífico nos EUA (GMT-08). Se você acredita que houve algum equívoco, contate support@secondlife.com.
- </string>
- <string name="LoginFailedPendingLogoutFault">
- Reação à solicitação de saída foi uma falha do simulador.
- </string>
- <string name="LoginFailedPendingLogout">
- O sistema está passando para o modo offline. Sua conta não está disponível para acesso até [TIME], horário do Pacífico nos EUA (GMT-08).
- </string>
- <string name="LoginFailedUnableToCreateSession">
- Impossível criar sessão válida.
- </string>
- <string name="LoginFailedUnableToConnectToSimulator">
- Não foi possível conectar o simulador.
- </string>
- <string name="LoginFailedRestrictedHours">
- Sua conta possui acesso ao Second Life das [START] às [END], horário da costa leste dos EUA. Volte novamente durante seu horário de acesso. Se você acredita que houve algum equívoco, contate support@secondlife.com.
- </string>
- <string name="LoginFailedIncorrectParameters">
- Parâmetros incorretos. Se você acredita que houve algum equívoco, contate support@secondlife.com.
- </string>
- <string name="LoginFailedFirstNameNotAlphanumeric">
- O parâmetro de primeiro nome deve ser alfanumérico. Se você acredita que houve algum equívoco, contate support@secondlife.com.
- </string>
- <string name="LoginFailedLastNameNotAlphanumeric">
- O parâmetro de sobrenome deve ser alfanumérico. Se você acredita que houve algum equívoco, contate support@secondlife.com.
- </string>
- <string name="LogoutFailedRegionGoingOffline">
- Região passando para modo offline. Tente novamente dentro de alguns instantes.
- </string>
- <string name="LogoutFailedAgentNotInRegion">
- Não há agente na região. Tente novamente dentro de alguns instantes.
- </string>
- <string name="LogoutFailedPendingLogin">
- A região estava acessada por outra sessão. Tente novamente dentro de alguns instantes.
- </string>
- <string name="LogoutFailedLoggingOut">
- A região estava passando para o modo offline na sessão anterior. Tente novamente dentro de alguns instantes.
- </string>
- <string name="LogoutFailedStillLoggingOut">
- A região estava passando para o modo offline na sessão anterior. Tente novamente dentro de alguns instantes.
- </string>
- <string name="LogoutSucceeded">
- A região passou para o modo offline na última sessão. Tente novamente dentro de alguns instantes.
- </string>
- <string name="LogoutFailedLogoutBegun">
- A região inicou o modo offline. Tente novamente dentro de alguns instantes.
- </string>
- <string name="LoginFailedLoggingOutSession">
- O sistema iniciou o modo offline em sua sessão anterior. Tente novamente dentro de alguns instantes.
- </string>
- <string name="AgentLostConnection">
- Esta região pode estar passando por problemas. Por favor, verifique sua conexão com a internet.
- </string>
- <string name="SavingSettings">
- Salvando configurações...
- </string>
- <string name="LoggingOut">
- Saindo...
- </string>
- <string name="ShuttingDown">
- Fechando...
- </string>
- <string name="YouHaveBeenDisconnected">
- Você foi desconectado da região onde estava.
- </string>
- <string name="SentToInvalidRegion">
- Você foi enviado para uma região inválida.
- </string>
- <string name="TestingDisconnect">
- Teste de desconexão
- </string>
- <string name="TooltipPerson">
- Pessoa
- </string>
- <string name="TooltipNoName">
- (sem nome)
- </string>
- <string name="TooltipOwner">
- Proprietário:
- </string>
- <string name="TooltipPublic">
- Público
- </string>
- <string name="TooltipIsGroup">
- (Grupo)
- </string>
- <string name="TooltipForSaleL$">
- À venda: L$[AMOUNT]
- </string>
- <string name="TooltipFlagGroupBuild">
- Construído por Grupo
- </string>
- <string name="TooltipFlagNoBuild">
- Não é permitido construir
- </string>
- <string name="TooltipFlagNoEdit">
- Construído por Grupo
- </string>
- <string name="TooltipFlagNotSafe">
- Não é seguro
- </string>
- <string name="TooltipFlagNoFly">
- Não é permitido voar
- </string>
- <string name="TooltipFlagGroupScripts">
- Scripts de Grupo
- </string>
- <string name="TooltipFlagNoScripts">
- Não são permitidos scripts
- </string>
- <string name="TooltipLand">
- Terreno:
- </string>
- <string name="TooltipMustSingleDrop">
- Apenas um item único pode ser arrastado para este local
- </string>
- <string name="TooltipPrice" value="L$[AMOUNT]"/>
- <string name="TooltipOutboxDragToWorld">
- Não é possível fazer rez do itens em sua caixa de saída do lojista
- </string>
- <string name="TooltipOutboxNoTransfer">
- Um ou mais destes objetos não podem ser vendidos ou transferidos.
- </string>
- <string name="TooltipOutboxNotInInventory">
- Sua caixa de saída do lojista aceita apenas itens direto do seu inventário
- </string>
- <string name="TooltipOutboxWorn">
- Você não pode colocar os itens que está vestindo na sua caixa de saída do lojista
- </string>
- <string name="TooltipOutboxCallingCard">
- Não é possível colocar cartões de visita em sua caixa de saída do lojista
- </string>
- <string name="TooltipOutboxFolderLevels">
- A profundidade das pastas aninhadas excede 3
- </string>
- <string name="TooltipOutboxTooManyFolders">
- A contagem de subpastas na pasta de nível superior excede 20
- </string>
- <string name="TooltipOutboxTooManyObjects">
- A contagem de itens na pasta de nível superior excede 200
- </string>
- <string name="TooltipDragOntoOwnChild">
- Não é possível mover uma pasta para seu filho
- </string>
- <string name="TooltipDragOntoSelf">
- Não é possível mover uma pasta para dentro dela mesma
- </string>
- <string name="TooltipHttpUrl">
- Clique para ver a página web
- </string>
- <string name="TooltipSLURL">
- Clique para ver os dados desta localização
- </string>
- <string name="TooltipAgentUrl">
- Clique para ver o perfil deste residente
- </string>
- <string name="TooltipAgentInspect">
- Saiba mais sobre este residente
- </string>
- <string name="TooltipAgentMute">
- Clique para silenciar este residente
- </string>
- <string name="TooltipAgentUnmute">
- Clique para desfazer silenciar neste residente
- </string>
- <string name="TooltipAgentIM">
- Clique para enviar uma MI para este residente
- </string>
- <string name="TooltipAgentPay">
- Clique para pagar este residente
- </string>
- <string name="TooltipAgentOfferTeleport">
- Clique para enviar um pedido de amizade a este residente
- </string>
- <string name="TooltipAgentRequestFriend">
- Clique para enviar um pedido de amizade a este residente
- </string>
- <string name="TooltipGroupUrl">
- Clique para ver a descrição deste Grupo
- </string>
- <string name="TooltipEventUrl">
- Clique para ver a descrição deste evento
- </string>
- <string name="TooltipClassifiedUrl">
- Clique para ver este anúncio
- </string>
- <string name="TooltipParcelUrl">
- Clique para ver a descrição desta parcela
- </string>
- <string name="TooltipTeleportUrl">
- Clique para teletransportar para esta localização
- </string>
- <string name="TooltipObjectIMUrl">
- Clique para ver a descrição deste objeto
- </string>
- <string name="TooltipMapUrl">
- Clique para ver esta localização no mapa
- </string>
- <string name="TooltipSLAPP">
- Clique para ativar no secondlife:// comando
- </string>
- <string name="CurrentURL" value="URL atual: [CurrentURL]"/>
- <string name="SLurlLabelTeleport">
- Teletransportar para
- </string>
- <string name="SLurlLabelShowOnMap">
- Mostrar no mapa para
- </string>
- <string name="SLappAgentMute">
- Silenciar
- </string>
- <string name="SLappAgentUnmute">
- Desfazer silenciar
- </string>
- <string name="SLappAgentIM">
- MI
- </string>
- <string name="SLappAgentPay">
- Pagar
- </string>
- <string name="SLappAgentOfferTeleport">
- Oferecer teletransporte para
- </string>
- <string name="SLappAgentRequestFriend">
- Pedido de amizade
- </string>
- <string name="BUTTON_CLOSE_DARWIN">
- Fechar (⌘W)
- </string>
- <string name="BUTTON_CLOSE_WIN">
- Fechar (Ctrl+W)
- </string>
- <string name="BUTTON_CLOSE_CHROME">
- Fechar
- </string>
- <string name="BUTTON_RESTORE">
- Restaurar
- </string>
- <string name="BUTTON_MINIMIZE">
- Minimizar
- </string>
- <string name="BUTTON_TEAR_OFF">
- Separar-se da janela
- </string>
- <string name="BUTTON_DOCK">
- conectar-se à barra
- </string>
- <string name="BUTTON_HELP">
- Mostrar ajuda
- </string>
- <string name="Searching">
- Buscando...
- </string>
- <string name="NoneFound">
- Não encontrado.
- </string>
- <string name="RetrievingData">
- Buscando...
- </string>
- <string name="ReleaseNotes">
- Notas de versão
- </string>
- <string name="RELEASE_NOTES_BASE_URL">
- http://wiki.secondlife.com/wiki/Release_Notes/
- </string>
- <string name="LoadingData">
- Carregando...
- </string>
- <string name="AvatarNameNobody">
- (ninguém)
- </string>
- <string name="AvatarNameWaiting">
- (aguardando)
- </string>
- <string name="GroupNameNone">
- (nenhum)
- </string>
- <string name="AvalineCaller">
- Interlocutor Avaline [ORDER]
- </string>
- <string name="AssetErrorNone">
- Nenhum erro
- </string>
- <string name="AssetErrorRequestFailed">
- Item pedido falhou
- </string>
- <string name="AssetErrorNonexistentFile">
- Item pedido: arquivo inexistente
- </string>
- <string name="AssetErrorNotInDatabase">
- Item pedido: item não encontrado na base de dados.
- </string>
- <string name="AssetErrorEOF">
- Fim do arquivo
- </string>
- <string name="AssetErrorCannotOpenFile">
- Não é possível abrir arquivo
- </string>
- <string name="AssetErrorFileNotFound">
- Arquivo não encontrado
- </string>
- <string name="AssetErrorTCPTimeout">
- Tempo de transferência de arquivo expirado
- </string>
- <string name="AssetErrorCircuitGone">
- Circuito caiu
- </string>
- <string name="AssetErrorPriceMismatch">
- Visualizador e servidor não concordam no preço
- </string>
- <string name="AssetErrorUnknownStatus">
- Status desconhecido
- </string>
- <string name="texture">
- textura
- </string>
- <string name="sound">
- som
- </string>
- <string name="calling card">
- cartão de visitas
- </string>
- <string name="landmark">
- landmark
- </string>
- <string name="legacy script">
- script obsoleto
- </string>
- <string name="clothing">
- roupas
- </string>
- <string name="object">
- objeto
- </string>
- <string name="note card">
- anotação
- </string>
- <string name="folder">
- pasta
- </string>
- <string name="root">
- raiz
- </string>
- <string name="lsl2 script">
- script LSL2
- </string>
- <string name="lsl bytecode">
- bytecode LSL
- </string>
- <string name="tga texture">
- textura tga
- </string>
- <string name="body part">
- parte do corpo
- </string>
- <string name="snapshot">
- fotografia
- </string>
- <string name="lost and found">
- Achados e Perdidos
- </string>
- <string name="targa image">
- imagem targa
- </string>
- <string name="trash">
- Lixo
- </string>
- <string name="jpeg image">
- imagem jpeg
- </string>
- <string name="animation">
- animação
- </string>
- <string name="gesture">
- gesto
- </string>
- <string name="simstate">
- simstate
- </string>
- <string name="favorite">
- favorito
- </string>
- <string name="symbolic link">
- link
- </string>
- <string name="symbolic folder link">
- link da pasta
- </string>
- <string name="mesh">
- mesh
- </string>
- <string name="AvatarEditingAppearance">
- (Edição Aparência)
- </string>
- <string name="AvatarAway">
- Distante
- </string>
- <string name="AvatarBusy">
- Ocupado
- </string>
- <string name="AvatarMuted">
- Mudo
- </string>
- <string name="anim_express_afraid">
- Temeroso
- </string>
- <string name="anim_express_anger">
- Bravo
- </string>
- <string name="anim_away">
- Distante
- </string>
- <string name="anim_backflip">
- Virar para trás
- </string>
- <string name="anim_express_laugh">
- Rir segurando a barriga
- </string>
- <string name="anim_express_toothsmile">
- Sorriso largo
- </string>
- <string name="anim_blowkiss">
- Mandar beijo
- </string>
- <string name="anim_express_bored">
- Entediado
- </string>
- <string name="anim_bow">
- Reverência
- </string>
- <string name="anim_clap">
- Aplaudir
- </string>
- <string name="anim_courtbow">
- Saudação formal
- </string>
- <string name="anim_express_cry">
- Chorar
- </string>
- <string name="anim_dance1">
- Dança 1
- </string>
- <string name="anim_dance2">
- Dança 2
- </string>
- <string name="anim_dance3">
- Dança 3
- </string>
- <string name="anim_dance4">
- Dança 4
- </string>
- <string name="anim_dance5">
- Dança 5
- </string>
- <string name="anim_dance6">
- Dança 6
- </string>
- <string name="anim_dance7">
- Dança 7
- </string>
- <string name="anim_dance8">
- Dança 8
- </string>
- <string name="anim_express_disdain">
- Desdém
- </string>
- <string name="anim_drink">
- Beber
- </string>
- <string name="anim_express_embarrased">
- Envergonhado
- </string>
- <string name="anim_angry_fingerwag">
- Negar com o dedo.
- </string>
- <string name="anim_fist_pump">
- Vibrar provocando
- </string>
- <string name="anim_yoga_float">
- Levitar Yoga
- </string>
- <string name="anim_express_frown">
- Careta
- </string>
- <string name="anim_impatient">
- Impaciente
- </string>
- <string name="anim_jumpforjoy">
- Pular de alegria
- </string>
- <string name="anim_kissmybutt">
- Beije meu bumbum
- </string>
- <string name="anim_express_kiss">
- Beijar
- </string>
- <string name="anim_laugh_short">
- Rir
- </string>
- <string name="anim_musclebeach">
- Exibir músculos
- </string>
- <string name="anim_no_unhappy">
- Não (descontente)
- </string>
- <string name="anim_no_head">
- Não
- </string>
- <string name="anim_nyanya">
- Nya-nya-nya
- </string>
- <string name="anim_punch_onetwo">
- Soco um-dois
- </string>
- <string name="anim_express_open_mouth">
- Abrir a boca
- </string>
- <string name="anim_peace">
- Paz
- </string>
- <string name="anim_point_you">
- Apontar para o outro
- </string>
- <string name="anim_point_me">
- Apontar para si
- </string>
- <string name="anim_punch_l">
- Soco esquerdo
- </string>
- <string name="anim_punch_r">
- Soco direito
- </string>
- <string name="anim_rps_countdown">
- RPS contar
- </string>
- <string name="anim_rps_paper">
- RPS papel
- </string>
- <string name="anim_rps_rock">
- RPS pedra
- </string>
- <string name="anim_rps_scissors">
- RPS tesoura
- </string>
- <string name="anim_express_repulsed">
- Repulsa
- </string>
- <string name="anim_kick_roundhouse_r">
- Chute giratório
- </string>
- <string name="anim_express_sad">
- Triste
- </string>
- <string name="anim_salute">
- Saúde
- </string>
- <string name="anim_shout">
- Gritar
- </string>
- <string name="anim_express_shrug">
- Encolher ombros
- </string>
- <string name="anim_express_smile">
- Sorrir
- </string>
- <string name="anim_smoke_idle">
- Fumar à toa
- </string>
- <string name="anim_smoke_inhale">
- Inalar fumaça
- </string>
- <string name="anim_smoke_throw_down">
- Expelir fumaça
- </string>
- <string name="anim_express_surprise">
- Surpresa
- </string>
- <string name="anim_sword_strike_r">
- Golpe de espada
- </string>
- <string name="anim_angry_tantrum">
- Enraivecer
- </string>
- <string name="anim_express_tongue_out">
- Mostrar a língua
- </string>
- <string name="anim_hello">
- Onda
- </string>
- <string name="anim_whisper">
- Sussurrar
- </string>
- <string name="anim_whistle">
- Assobiar
- </string>
- <string name="anim_express_wink">
- Piscar
- </string>
- <string name="anim_wink_hollywood">
- Piscar (Hollywood)
- </string>
- <string name="anim_express_worry">
- Preocupar-se
- </string>
- <string name="anim_yes_happy">
- Sim (Feliz)
- </string>
- <string name="anim_yes_head">
- Sim
- </string>
- <string name="multiple_textures">
- Múltiplo
- </string>
- <string name="texture_loading">
- Carregando...
- </string>
- <string name="worldmap_offline">
- Offline
- </string>
- <string name="worldmap_item_tooltip_format">
- L$[PRICE] por [AREA] m²
- </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:
- </string>
- <string name="shout">
- grita:
- </string>
- <string name="ringing">
- Conectando à conversa de voz no mundo
- </string>
- <string name="connected">
- Conectado
- </string>
- <string name="unavailable">
- Voz não disponível na sua localização atual
- </string>
- <string name="hang_up">
- Desconectado da conversa de Voz no mundo
- </string>
- <string name="reconnect_nearby">
- Agora você será reconectado ao bate-papo local.
- </string>
- <string name="ScriptQuestionCautionChatGranted">
- &apos;[OBJECTNAME]&apos;, um objeto de &apos;[OWNERNAME]&apos;, localizado em [REGIONNAME] a [REGIONPOS], obteve permissão para: [PERMISSIONS].
- </string>
- <string name="ScriptQuestionCautionChatDenied">
- &apos;[OBJECTNAME]&apos;, um objeto de &apos;[OWNERNAME]&apos;, localizado em [REGIONNAME] a [REGIONPOS], teve permissão negada para: [PERMISSIONS].
- </string>
- <string name="ScriptTakeMoney">
- Tomar linden dólares (L$) de você
- </string>
- <string name="ActOnControlInputs">
- Atue nas suas entradas de controle
- </string>
- <string name="RemapControlInputs">
- Remapeie suas entradas de controle
- </string>
- <string name="AnimateYourAvatar">
- Faça uma animação para o seu avatar
- </string>
- <string name="AttachToYourAvatar">
- Anexe ao seu avatar
- </string>
- <string name="ReleaseOwnership">
- Libere a propriedade e torne-a pública
- </string>
- <string name="LinkAndDelink">
- Una e desuna de outros objetos
- </string>
- <string name="AddAndRemoveJoints">
- Adicione e remova junções com outros objetos
- </string>
- <string name="ChangePermissions">
- Modifique as permissões
- </string>
- <string name="TrackYourCamera">
- Acompanhe sua câmera
- </string>
- <string name="ControlYourCamera">
- Controle sua camera
- </string>
- <string name="SIM_ACCESS_PG">
- Público geral
- </string>
- <string name="SIM_ACCESS_MATURE">
- Moderado
- </string>
- <string name="SIM_ACCESS_ADULT">
- Adulto
- </string>
- <string name="SIM_ACCESS_DOWN">
- Desconectado
- </string>
- <string name="SIM_ACCESS_MIN">
- Desconhecido
- </string>
- <string name="land_type_unknown">
- (desconhecido)
- </string>
- <string name="Estate / Full Region">
- Propriedadade / Região inteira:
- </string>
- <string name="Estate / Homestead">
- Imóvel / Homestead
- </string>
- <string name="Mainland / Homestead">
- Continente / Homestead
- </string>
- <string name="Mainland / Full Region">
- Continente / Região inteira:
- </string>
- <string name="all_files">
- Todos os arquivos
- </string>
- <string name="sound_files">
- Sons
- </string>
- <string name="animation_files">
- Animações
- </string>
- <string name="image_files">
- Imagens
- </string>
- <string name="save_file_verb">
- Salvar
- </string>
- <string name="load_file_verb">
- Carregar
- </string>
- <string name="targa_image_files">
- Imagens Targa
- </string>
- <string name="bitmap_image_files">
- Imagens Bitmap
- </string>
- <string name="avi_movie_file">
- Arquivo de vídeo AVI
- </string>
- <string name="xaf_animation_file">
- Arquivo de animação XAF
- </string>
- <string name="xml_file">
- Arquivo XML
- </string>
- <string name="raw_file">
- Arquivo RAW
- </string>
- <string name="compressed_image_files">
- Imagens compactadas
- </string>
- <string name="load_files">
- Carregar arquivos
- </string>
- <string name="choose_the_directory">
- Selecionar pasta
- </string>
- <string name="script_files">
- Scripts
- </string>
- <string name="AvatarSetNotAway">
- deixar como ausente
- </string>
- <string name="AvatarSetAway">
- deixar como ausente
- </string>
- <string name="AvatarSetNotBusy">
- deixar como não ocupado
- </string>
- <string name="AvatarSetBusy">
- Deixar como ocupado
- </string>
- <string name="shape">
- Silhueta
- </string>
- <string name="skin">
- Pele
- </string>
- <string name="hair">
- Cabelo
- </string>
- <string name="eyes">
- Olhos
- </string>
- <string name="shirt">
- Camisa
- </string>
- <string name="pants">
- Calças
- </string>
- <string name="shoes">
- Sapatos
- </string>
- <string name="socks">
- Meias
- </string>
- <string name="jacket">
- Blusa
- </string>
- <string name="gloves">
- Luvas
- </string>
- <string name="undershirt">
- Camiseta
- </string>
- <string name="underpants">
- Roupa de baixo
- </string>
- <string name="skirt">
- Saia
- </string>
- <string name="alpha">
- Alpha
- </string>
- <string name="tattoo">
- Tatuagem
- </string>
- <string name="physics">
- Físico
- </string>
- <string name="invalid">
- Inválido
- </string>
- <string name="none">
- nenhum
- </string>
- <string name="shirt_not_worn">
- Camisa não vestida
- </string>
- <string name="pants_not_worn">
- Calças não vestidas
- </string>
- <string name="shoes_not_worn">
- Sapatos não calçados
- </string>
- <string name="socks_not_worn">
- Meias não calçadas
- </string>
- <string name="jacket_not_worn">
- Jaqueta não vestida
- </string>
- <string name="gloves_not_worn">
- Luvas não calçadas
- </string>
- <string name="undershirt_not_worn">
- Camiseta não vestida
- </string>
- <string name="underpants_not_worn">
- Roupa de baixo não vestida
- </string>
- <string name="skirt_not_worn">
- Saia não vestida
- </string>
- <string name="alpha_not_worn">
- Alpha não vestido
- </string>
- <string name="tattoo_not_worn">
- Tatuagem não usada
- </string>
- <string name="physics_not_worn">
- Físico não usado
- </string>
- <string name="invalid_not_worn">
- inválido
- </string>
- <string name="create_new_shape">
- Criar novo físico
- </string>
- <string name="create_new_skin">
- Criar pele nova
- </string>
- <string name="create_new_hair">
- Criar cabelo novo
- </string>
- <string name="create_new_eyes">
- Criar olhos novos
- </string>
- <string name="create_new_shirt">
- Criar camisa nova
- </string>
- <string name="create_new_pants">
- Criar calças novas
- </string>
- <string name="create_new_shoes">
- Criar sapatos novos
- </string>
- <string name="create_new_socks">
- Criar meias novas
- </string>
- <string name="create_new_jacket">
- Criar jaqueta nova
- </string>
- <string name="create_new_gloves">
- Criar luvas novas
- </string>
- <string name="create_new_undershirt">
- Criar camiseta nova
- </string>
- <string name="create_new_underpants">
- Criar roupa de baixo nova
- </string>
- <string name="create_new_skirt">
- Criar saia nova
- </string>
- <string name="create_new_alpha">
- Criar Alpha novo
- </string>
- <string name="create_new_tattoo">
- Criar nova tatuagem
- </string>
- <string name="create_new_physics">
- Criar novo físico
- </string>
- <string name="create_new_invalid">
- inválido
- </string>
- <string name="NewWearable">
- Novo [WEARABLE_ITEM]
- </string>
- <string name="next">
- Próximo
- </string>
- <string name="ok">
- OK
- </string>
- <string name="GroupNotifyGroupNotice">
- Anúncio de grupo
- </string>
- <string name="GroupNotifyGroupNotices">
- Anúncios do grupo
- </string>
- <string name="GroupNotifySentBy">
- Enviado por
- </string>
- <string name="GroupNotifyAttached">
- Anexo:
- </string>
- <string name="GroupNotifyViewPastNotices">
- Ver últimos anúncios ou optar por não receber essas mensagens aqui.
- </string>
- <string name="GroupNotifyOpenAttachment">
- Abrir anexo
- </string>
- <string name="GroupNotifySaveAttachment">
- Salvar anexo
- </string>
- <string name="TeleportOffer">
- Oferta de teletransporte
- </string>
- <string name="StartUpNotifications">
- Novas notificações chegaram enquanto você estava fora...
- </string>
- <string name="OverflowInfoChannelString">
- Você tem mais [%d] notificações
- </string>
- <string name="BodyPartsRightArm">
- Braço direito
- </string>
- <string name="BodyPartsHead">
- Cabeça
- </string>
- <string name="BodyPartsLeftArm">
- Braço esquerdo
- </string>
- <string name="BodyPartsLeftLeg">
- Perna esquerda
- </string>
- <string name="BodyPartsTorso">
- Tronco
- </string>
- <string name="BodyPartsRightLeg">
- Perna direita
- </string>
- <string name="GraphicsQualityLow">
- Baixo
- </string>
- <string name="GraphicsQualityMid">
- Meio
- </string>
- <string name="GraphicsQualityHigh">
- Alto
- </string>
- <string name="LeaveMouselook">
- Pressione ESC para retornar para visão do mundo
- </string>
- <string name="InventoryNoMatchingItems">
- Não encontrou o que procura? Tente buscar no [secondlife:///app/search/people/[SEARCH_TERM] Search].
- </string>
- <string name="PlacesNoMatchingItems">
- Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search].
- </string>
- <string name="FavoritesNoMatchingItems">
- Arraste um marco para adicioná-lo aos seus favoritos.
- </string>
- <string name="InventoryNoTexture">
- Você não possui uma cópia desta textura no seu inventário
- </string>
- <string name="InventoryInboxNoItems">
- Suas compras do Marketplace aparecerão aqui. Depois, você poderá arrastá-las para seu inventário para usá-las.
- </string>
- <string name="MarketplaceURL">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
- </string>
- <string name="MarketplaceURL_CreateStore">
- http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
- </string>
- <string name="MarketplaceURL_Dashboard">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
- </string>
- <string name="MarketplaceURL_Imports">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
- </string>
- <string name="MarketplaceURL_LearnMore">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
- </string>
- <string name="InventoryOutboxNotMerchantTitle">
- Qualquer um pode vender itens no Mercado.
- </string>
- <string name="InventoryOutboxNotMerchantTooltip"/>
- <string name="InventoryOutboxNotMerchant">
- Se você deseja se tornar um lojista, precisará [[MARKETPLACE_CREATE_STORE_URL] criar uma loja no Mercado].
- </string>
- <string name="InventoryOutboxNoItemsTitle">
- Sua caixa de saída está vazia
- </string>
- <string name="InventoryOutboxNoItemsTooltip"/>
- <string name="InventoryOutboxNoItems">
- Arraste as pastas para estas áreas e então clique em &quot;Enviar para Mercado&quot; para listar os itens para venda no [[MARKETPLACE_DASHBOARD_URL] Mercado].
- </string>
- <string name="Marketplace Error None">
- Sem erros
- </string>
- <string name="Marketplace Error Not Merchant">
- Erro: antes de enviar os itens para o Mercado, é necessário que você se defina como um lojista (sem custos).
- </string>
- <string name="Marketplace Error Empty Folder">
- Erro: esta pasta está vazia.
- </string>
- <string name="Marketplace Error Unassociated Products">
- Erro: ocorreu uma falha ao enviar este item, pois sua conta de lojista tem muitos itens não associados a produtos. Para corrigir esse erro, faça o login no site do mercado e reduza a contagem de itens não associados.
- </string>
- <string name="Marketplace Error Object Limit">
- Erro: este item contém muitos objetos. Corrija esse erro unindo os objetos em caixa para reduzir a contagem total a menos de 200.
- </string>
- <string name="Marketplace Error Folder Depth">
- Erro: este item contém muitos níveis de pastas aninhadas. Reorganize-o em até 3 níveis de pastas aninhadas, no máximo.
- </string>
- <string name="Marketplace Error Unsellable Item">
- Erro: este item não pode ser vendido no mercado.
- </string>
- <string name="Marketplace Error Internal Import">
- Erro: ocorreu um problema com este item. Tente novamente mais tarde.
- </string>
- <string name="Open landmarks">
- Marcos abertos
- </string>
- <string name="no_transfer" value="(não transferível)"/>
- <string name="no_modify" value="(não modificável)"/>
- <string name="no_copy" value="(não copiável)"/>
- <string name="worn" value="(vestido)"/>
- <string name="link" value="(link)"/>
- <string name="broken_link" value="(link_quebrado)&quot;"/>
- <string name="LoadingContents">
- Carregando conteúdo...
- </string>
- <string name="NoContents">
- Nenhum conteúdo
- </string>
- <string name="WornOnAttachmentPoint" value="(vestido em [ATTACHMENT_POINT])"/>
- <string name="ActiveGesture" value="[GESLABEL] (ativado)"/>
- <string name="Chat Message" value="Bate-papo:"/>
- <string name="Sound" value="Som"/>
- <string name="Wait" value="--- Aguarde"/>
- <string name="AnimFlagStop" value="Parar animação"/>
- <string name="AnimFlagStart" value="Iniciar animação"/>
- <string name="Wave" value="Acenar"/>
- <string name="GestureActionNone" value="Nenhum"/>
- <string name="HelloAvatar" value="Olá, avatar!"/>
- <string name="ViewAllGestures" value="Ver todos&gt;&gt;"/>
- <string name="GetMoreGestures" value="Mais &gt;&gt;"/>
- <string name="Animations" value="Animações,"/>
- <string name="Calling Cards" value="Cartões de visitas,"/>
- <string name="Clothing" value="Vestuário,"/>
- <string name="Gestures" value="Gestos,"/>
- <string name="Landmarks" value="Marcos"/>
- <string name="Notecards" value="Anotações"/>
- <string name="Objects" value="Objetos,"/>
- <string name="Scripts" value="Scripts,"/>
- <string name="Sounds" value="Sons"/>
- <string name="Textures" value="Texturas"/>
- <string name="Snapshots" value="Fotografias"/>
- <string name="No Filters" value="Não"/>
- <string name="Since Logoff" value="- Desde desligado"/>
- <string name="InvFolder My Inventory">
- Meu inventário
- </string>
- <string name="InvFolder Library">
- Biblioteca
- </string>
- <string name="InvFolder Textures">
- Texturas
- </string>
- <string name="InvFolder Sounds">
- Sons
- </string>
- <string name="InvFolder Calling Cards">
- Cartões de visitas
- </string>
- <string name="InvFolder Landmarks">
- Marcos
- </string>
- <string name="InvFolder Scripts">
- Scripts
- </string>
- <string name="InvFolder Clothing">
- Vestuário
- </string>
- <string name="InvFolder Objects">
- Objetos
- </string>
- <string name="InvFolder Notecards">
- Anotações
- </string>
- <string name="InvFolder New Folder">
- Nova pasta
- </string>
- <string name="InvFolder Inventory">
- Inventário
- </string>
- <string name="InvFolder Uncompressed Images">
- Imagens descompactadas
- </string>
- <string name="InvFolder Body Parts">
- Corpo
- </string>
- <string name="InvFolder Trash">
- Lixo
- </string>
- <string name="InvFolder Photo Album">
- Álbum de fotografias
- </string>
- <string name="InvFolder Lost And Found">
- Achados e Perdidos
- </string>
- <string name="InvFolder Uncompressed Sounds">
- Sons descompactados
- </string>
- <string name="InvFolder Animations">
- Animações
- </string>
- <string name="InvFolder Gestures">
- Gestos
- </string>
- <string name="InvFolder Favorite">
- Meus favoritos
- </string>
- <string name="InvFolder favorite">
- Meus favoritos
- </string>
- <string name="InvFolder Current Outfit">
- Look atual
- </string>
- <string name="InvFolder Initial Outfits">
- Looks iniciais
- </string>
- <string name="InvFolder My Outfits">
- Meus looks
- </string>
- <string name="InvFolder Accessories">
- Acessórios
- </string>
- <string name="InvFolder Meshes">
- Meshes:
- </string>
- <string name="InvFolder Friends">
- Amigos
- </string>
- <string name="InvFolder All">
- Tudo
- </string>
- <string name="no_attachments">
- Nenhum anexo vestido
- </string>
- <string name="Attachments remain">
- Anexos ([COUNT] slots permanecem)
- </string>
- <string name="Buy">
- Comprar
- </string>
- <string name="BuyforL$">
- Comprar por L$
- </string>
- <string name="Stone">
- Pedra
- </string>
- <string name="Metal">
- Metal
- </string>
- <string name="Glass">
- Vidro
- </string>
- <string name="Wood">
- Madeira
- </string>
- <string name="Flesh">
- Carne
- </string>
- <string name="Plastic">
- Plástico
- </string>
- <string name="Rubber">
- Borrracha
- </string>
- <string name="Light">
- Luz
- </string>
- <string name="KBShift">
- Shift
- </string>
- <string name="KBCtrl">
- Ctrl
- </string>
- <string name="Chest">
- Peito
- </string>
- <string name="Skull">
- Crânio
- </string>
- <string name="Left Shoulder">
- Ombro esquerdo
- </string>
- <string name="Right Shoulder">
- Ombro direito
- </string>
- <string name="Left Hand">
- Mão esquerda
- </string>
- <string name="Right Hand">
- Mão direita
- </string>
- <string name="Left Foot">
- Pé esquerdo
- </string>
- <string name="Right Foot">
- Pé direito
- </string>
- <string name="Spine">
- Espinha
- </string>
- <string name="Pelvis">
- Pélvis
- </string>
- <string name="Mouth">
- Boca
- </string>
- <string name="Chin">
- Queixo
- </string>
- <string name="Left Ear">
- Orelha esquerda
- </string>
- <string name="Right Ear">
- Orelha direita
- </string>
- <string name="Left Eyeball">
- Globo ocular esquerdo
- </string>
- <string name="Right Eyeball">
- Globo ocular direito
- </string>
- <string name="Nose">
- Nariz
- </string>
- <string name="R Upper Arm">
- Braço superior D
- </string>
- <string name="R Forearm">
- Antebraço D
- </string>
- <string name="L Upper Arm">
- Braço superior E
- </string>
- <string name="L Forearm">
- Antebraço E
- </string>
- <string name="Right Hip">
- Quadril direito
- </string>
- <string name="R Upper Leg">
- Coxa D
- </string>
- <string name="R Lower Leg">
- Perna inferior D
- </string>
- <string name="Left Hip">
- Quadril esquerdo
- </string>
- <string name="L Upper Leg">
- Coxa E
- </string>
- <string name="L Lower Leg">
- Perna inferior E
- </string>
- <string name="Stomach">
- Estômago
- </string>
- <string name="Left Pec">
- Peitoral E
- </string>
- <string name="Right Pec">
- Peitoral D
- </string>
- <string name="Neck">
- Pescoço
- </string>
- <string name="Avatar Center">
- Centro do avatar
- </string>
- <string name="Invalid Attachment">
- Ponto de encaixe inválido
- </string>
- <string name="YearsMonthsOld">
- [AGEYEARS] [AGEMONTHS] de idade
- </string>
- <string name="YearsOld">
- [AGEYEARS] de idade
- </string>
- <string name="MonthsOld">
- [AGEMONTHS] de idade
- </string>
- <string name="WeeksOld">
- [AGEWEEKS] de idade
- </string>
- <string name="DaysOld">
- [AGEDAYS] de idade
- </string>
- <string name="TodayOld">
- Cadastrado hoje
- </string>
- <string name="AgeYearsA">
- [COUNT] ano
- </string>
- <string name="AgeYearsB">
- [COUNT] anos
- </string>
- <string name="AgeYearsC">
- [COUNT] anos
- </string>
- <string name="AgeMonthsA">
- [COUNT] mês
- </string>
- <string name="AgeMonthsB">
- [COUNT] meses
- </string>
- <string name="AgeMonthsC">
- [COUNT] meses
- </string>
- <string name="AgeWeeksA">
- [COUNT] semana
- </string>
- <string name="AgeWeeksB">
- [COUNT] semanas
- </string>
- <string name="AgeWeeksC">
- [COUNT] semanas
- </string>
- <string name="AgeDaysA">
- [COUNT] dia
- </string>
- <string name="AgeDaysB">
- [COUNT] dias
- </string>
- <string name="AgeDaysC">
- [COUNT] dias
- </string>
- <string name="GroupMembersA">
- [COUNT] membro
- </string>
- <string name="GroupMembersB">
- [COUNT] membros
- </string>
- <string name="GroupMembersC">
- [COUNT] membros
- </string>
- <string name="AcctTypeResident">
- Residente
- </string>
- <string name="AcctTypeTrial">
- Prova
- </string>
- <string name="AcctTypeCharterMember">
- Lista de membros
- </string>
- <string name="AcctTypeEmployee">
- Empregado da Linden Lab
- </string>
- <string name="PaymentInfoUsed">
- Dados de pagamento usados
- </string>
- <string name="PaymentInfoOnFile">
- Dados de pagamento fornecidos
- </string>
- <string name="NoPaymentInfoOnFile">
- Nenhum dado de pagamento
- </string>
- <string name="AgeVerified">
- Idade comprovada
- </string>
- <string name="NotAgeVerified">
- Idade não comprovada
- </string>
- <string name="Center 2">
- Centro 2
- </string>
- <string name="Top Right">
- Topo direita
- </string>
- <string name="Top">
- Topo
- </string>
- <string name="Top Left">
- Topo esquerda
- </string>
- <string name="Center">
- Centro
- </string>
- <string name="Bottom Left">
- Inferior esquerdo
- </string>
- <string name="Bottom">
- Inferior
- </string>
- <string name="Bottom Right">
- Inferior direito
- </string>
- <string name="CompileQueueDownloadedCompiling">
- Baixado, agora compilando
- </string>
- <string name="CompileQueueScriptNotFound">
- Script não encontrado no servidor.
- </string>
- <string name="CompileQueueProblemDownloading">
- Problema no download
- </string>
- <string name="CompileQueueInsufficientPermDownload">
- Permissões insuficientes para fazer o download do script.
- </string>
- <string name="CompileQueueInsufficientPermFor">
- Permissões insuficientes para
- </string>
- <string name="CompileQueueUnknownFailure">
- Falha desconhecida para download
- </string>
- <string name="CompileQueueTitle">
- Progresso do recompilamento
- </string>
- <string name="CompileQueueStart">
- recompilar
- </string>
- <string name="ResetQueueTitle">
- Reset Progresso
- </string>
- <string name="ResetQueueStart">
- Zerar
- </string>
- <string name="RunQueueTitle">
- Definir funcionamento do progresso
- </string>
- <string name="RunQueueStart">
- deixar funcionando
- </string>
- <string name="NotRunQueueTitle">
- Definir progresso não funcionando
- </string>
- <string name="NotRunQueueStart">
- não deixar funcionando
- </string>
- <string name="CompileSuccessful">
- Compilação bem sucedida
- </string>
- <string name="CompileSuccessfulSaving">
- Compilação bem sucedida, salvando...
- </string>
- <string name="SaveComplete">
- Salvo.
- </string>
- <string name="ObjectOutOfRange">
- Script (objeto fora de alcance)
- </string>
- <string name="GodToolsObjectOwnedBy">
- Objeto [OBJECT] de propriedade de [OWNER]
- </string>
- <string name="GroupsNone">
- nenhum
- </string>
- <string name="Group" value="(grupo)"/>
- <string name="Unknown">
- (Desconhecido)
- </string>
- <string name="SummaryForTheWeek" value="Resumo para esta semana, com início em "/>
- <string name="NextStipendDay" value=". Próximo dia de salário é "/>
- <string name="GroupPlanningDate">
- [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
- </string>
- <string name="GroupIndividualShare" value="Grupo Divisão individualI"/>
- <string name="GroupColumn" value="Grupo"/>
- <string name="Balance">
- Balanço
- </string>
- <string name="Credits">
- Créditos
- </string>
- <string name="Debits">
- Débitos
- </string>
- <string name="Total">
- Total
- </string>
- <string name="NoGroupDataFound">
- Não há dados de grupo
- </string>
- <string name="IMParentEstate">
- Propriedade-pai
- </string>
- <string name="IMMainland">
- continente
- </string>
- <string name="IMTeen">
- adolescente
- </string>
- <string name="Anyone">
- qualquer um
- </string>
- <string name="RegionInfoError">
- erro
- </string>
- <string name="RegionInfoAllEstatesOwnedBy">
- todas as propriedades pertencem a [OWNER]
- </string>
- <string name="RegionInfoAllEstatesYouOwn">
- todas as propriedades que você possui
- </string>
- <string name="RegionInfoAllEstatesYouManage">
- todas as propriedades que você gerencia para [OWNER]
- </string>
- <string name="RegionInfoAllowedResidents">
- Residentes autorizados: ([ALLOWEDAGENTS], max [MAXACCESS])
- </string>
- <string name="RegionInfoAllowedGroups">
- Grupos permitidos: ([ALLOWEDGROUPS], max [MAXACCESS])
- </string>
- <string name="ScriptLimitsParcelScriptMemory">
- Memória de scripts no lote
- </string>
- <string name="ScriptLimitsParcelsOwned">
- Lotes listados: [PARCELS]
- </string>
- <string name="ScriptLimitsMemoryUsed">
- Memória usada: [COUNT] kb de [MAX] kb; [AVAILABLE] kb disponíveis
- </string>
- <string name="ScriptLimitsMemoryUsedSimple">
- Memória usada: [COUNT] kb
- </string>
- <string name="ScriptLimitsParcelScriptURLs">
- URL dos scripts do lote
- </string>
- <string name="ScriptLimitsURLsUsed">
- URLs usados: [COUNT] de [MAX]; [AVAILABLE] disponíveis
- </string>
- <string name="ScriptLimitsURLsUsedSimple">
- URLs usados: [COUNT]
- </string>
- <string name="ScriptLimitsRequestError">
- Erro ao solicitar dados
- </string>
- <string name="ScriptLimitsRequestNoParcelSelected">
- Nenhum lote foi selecionado
- </string>
- <string name="ScriptLimitsRequestWrongRegion">
- Erro: dados de script só disponíveis na região da posição atual
- </string>
- <string name="ScriptLimitsRequestWaiting">
- Obtendo dados...
- </string>
- <string name="ScriptLimitsRequestDontOwnParcel">
- Você não está autorizado a examinar este lote.
- </string>
- <string name="SITTING_ON">
- Sentado em
- </string>
- <string name="ATTACH_CHEST">
- Peito
- </string>
- <string name="ATTACH_HEAD">
- Cabeça
- </string>
- <string name="ATTACH_LSHOULDER">
- Ombro esquerdo
- </string>
- <string name="ATTACH_RSHOULDER">
- Ombro direito
- </string>
- <string name="ATTACH_LHAND">
- Mão esquerda
- </string>
- <string name="ATTACH_RHAND">
- Mão direita
- </string>
- <string name="ATTACH_LFOOT">
- Pé esquerdo
- </string>
- <string name="ATTACH_RFOOT">
- Pé direito
- </string>
- <string name="ATTACH_BACK">
- Atrás
- </string>
- <string name="ATTACH_PELVIS">
- Pélvis
- </string>
- <string name="ATTACH_MOUTH">
- Boca
- </string>
- <string name="ATTACH_CHIN">
- Queixo
- </string>
- <string name="ATTACH_LEAR">
- Orelha esquerda
- </string>
- <string name="ATTACH_REAR">
- Orelha direita
- </string>
- <string name="ATTACH_LEYE">
- Olho esquerdo
- </string>
- <string name="ATTACH_REYE">
- Olho direito
- </string>
- <string name="ATTACH_NOSE">
- Nariz
- </string>
- <string name="ATTACH_RUARM">
- Braço direito
- </string>
- <string name="ATTACH_RLARM">
- Antebraço direito
- </string>
- <string name="ATTACH_LUARM">
- Braço esquerdo
- </string>
- <string name="ATTACH_LLARM">
- Antebraço esquerdo
- </string>
- <string name="ATTACH_RHIP">
- Quadril direito
- </string>
- <string name="ATTACH_RULEG">
- Coxa direita
- </string>
- <string name="ATTACH_RLLEG">
- Perna direita
- </string>
- <string name="ATTACH_LHIP">
- Quadril esquerdo
- </string>
- <string name="ATTACH_LULEG">
- Coxa esquerda
- </string>
- <string name="ATTACH_LLLEG">
- Perna esquerda
- </string>
- <string name="ATTACH_BELLY">
- Barriga
- </string>
- <string name="ATTACH_RPEC">
- Peitorais D
- </string>
- <string name="ATTACH_LPEC">
- Peitorais E
- </string>
- <string name="ATTACH_HUD_CENTER_2">
- HUD Central 2
- </string>
- <string name="ATTACH_HUD_TOP_RIGHT">
- HUD superior direito
- </string>
- <string name="ATTACH_HUD_TOP_CENTER">
- HUD centro superior
- </string>
- <string name="ATTACH_HUD_TOP_LEFT">
- HUD superior esquerdo
- </string>
- <string name="ATTACH_HUD_CENTER_1">
- HUD Central 1
- </string>
- <string name="ATTACH_HUD_BOTTOM_LEFT">
- HUD esquerda inferior
- </string>
- <string name="ATTACH_HUD_BOTTOM">
- HUD inferior
- </string>
- <string name="ATTACH_HUD_BOTTOM_RIGHT">
- HUD direito inferior
- </string>
- <string name="CursorPos">
- Linha [LINE], Coluna [COLUMN]
- </string>
- <string name="PanelDirCountFound">
- [COUNT] encontrado
- </string>
- <string name="PanelContentsTooltip">
- Conteúdo do objeto
- </string>
- <string name="PanelContentsNewScript">
- Novo Script
- </string>
- <string name="BusyModeResponseDefault">
- O residente para o qual escreveu está no modo &apos;ocupado&apos;, ou seja, ele prefere não receber nada no momento. Sua mensagem será exibida como uma MI mais tarde.
- </string>
- <string name="MuteByName">
- (por nome)
- </string>
- <string name="MuteAgent">
- (residente)
- </string>
- <string name="MuteObject">
- (objeto)
- </string>
- <string name="MuteGroup">
- (grupo)
- </string>
- <string name="MuteExternal">
- (Externo)
- </string>
- <string name="RegionNoCovenant">
- Não foi definido um contrato para essa região.
- </string>
- <string name="RegionNoCovenantOtherOwner">
- Não foi definido um contrato para essa Região. O terreno nesta região está sendo vendido pelo Proprietário, não pela Linden Lab. Favor contatar o Proprietário da região para detalhes de venda.
- </string>
- <string name="covenant_last_modified" value="Última modificação: "/>
- <string name="none_text" value="(nenhum)"/>
- <string name="never_text" value="(nunca)"/>
- <string name="GroupOwned">
- Propriedade do Grupo
- </string>
- <string name="Public">
- Público
- </string>
- <string name="LocalSettings">
- Configurações locais
- </string>
- <string name="RegionSettings">
- Configurações da região
- </string>
- <string name="ClassifiedClicksTxt">
- Cliques: [TELEPORT] teletransporte, [MAP] mapa, [PROFILE] perfil
- </string>
- <string name="ClassifiedUpdateAfterPublish">
- (vai atualizar depois de publicado)
- </string>
- <string name="NoPicksClassifiedsText">
- Você não criou nenhum Destaque ou Anúncio. Clique no botão &quot;+&quot; para criar um Destaque ou Anúncio.
- </string>
- <string name="NoAvatarPicksClassifiedsText">
- O usuário não tem nenhum destaque ou anúncio
- </string>
- <string name="PicksClassifiedsLoadingText">
- Carregando...
- </string>
- <string name="MultiPreviewTitle">
- Preview
- </string>
- <string name="MultiPropertiesTitle">
- Propriedades
- </string>
- <string name="InvOfferAnObjectNamed">
- um objeto chamado
- </string>
- <string name="InvOfferOwnedByGroup">
- possuído pelo grupo
- </string>
- <string name="InvOfferOwnedByUnknownGroup">
- de um grupo desconhecido
- </string>
- <string name="InvOfferOwnedBy">
- de
- </string>
- <string name="InvOfferOwnedByUnknownUser">
- de usuário desconhecido
- </string>
- <string name="InvOfferGaveYou">
- deu a você
- </string>
- <string name="InvOfferDecline">
- Você recusou um(a) [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
- </string>
- <string name="GroupMoneyTotal">
- Total
- </string>
- <string name="GroupMoneyBought">
- comprou
- </string>
- <string name="GroupMoneyPaidYou">
- pagou a você
- </string>
- <string name="GroupMoneyPaidInto">
- depositado
- </string>
- <string name="GroupMoneyBoughtPassTo">
- comprou passe para
- </string>
- <string name="GroupMoneyPaidFeeForEvent">
- pagou taxa para o evento
- </string>
- <string name="GroupMoneyPaidPrizeForEvent">
- pagou prêmio para o evento
- </string>
- <string name="GroupMoneyBalance">
- Saldo
- </string>
- <string name="GroupMoneyCredits">
- Créditos
- </string>
- <string name="GroupMoneyDebits">
- Débitos
- </string>
- <string name="GroupMoneyDate">
- [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
- </string>
- <string name="ViewerObjectContents">
- Conteúdo
- </string>
- <string name="AcquiredItems">
- Itens adquiridos
- </string>
- <string name="Cancel">
- Cancelar
- </string>
- <string name="UploadingCosts">
- Carregar [NAME] custa L$ [AMOUNT]
- </string>
- <string name="BuyingCosts">
- Isso custa L$ [AMOUNT]
- </string>
- <string name="UnknownFileExtension">
- Extensão de arquivo desconhecida [.%s]
-Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
- </string>
- <string name="MuteObject2">
- Bloquear
- </string>
- <string name="AddLandmarkNavBarMenu">
- Adicionar marco...
- </string>
- <string name="EditLandmarkNavBarMenu">
- Editar marco...
- </string>
- <string name="accel-mac-control">
- ⌃
- </string>
- <string name="accel-mac-command">
- ⌘
- </string>
- <string name="accel-mac-option">
- ⌥
- </string>
- <string name="accel-mac-shift">
- ⇧
- </string>
- <string name="accel-win-control">
- Ctrl+
- </string>
- <string name="accel-win-alt">
- Alt+
- </string>
- <string name="accel-win-shift">
- Shift+
- </string>
- <string name="FileSaved">
- Arquivo salvo
- </string>
- <string name="Receiving">
- Recebendo
- </string>
- <string name="AM">
- AM
- </string>
- <string name="PM">
- PM
- </string>
- <string name="PST">
- PST
- </string>
- <string name="PDT">
- PDT
- </string>
- <string name="Direction_Forward">
- Frente
- </string>
- <string name="Direction_Left">
- Esquerda
- </string>
- <string name="Direction_Right">
- Direita
- </string>
- <string name="Direction_Back">
- Atrás
- </string>
- <string name="Direction_North">
- Norte
- </string>
- <string name="Direction_South">
- Sul
- </string>
- <string name="Direction_West">
- Oeste
- </string>
- <string name="Direction_East">
- Leste
- </string>
- <string name="Direction_Up">
- P/ cima
- </string>
- <string name="Direction_Down">
- P/ baixo
- </string>
- <string name="Any Category">
- Qualquer categoria
- </string>
- <string name="Shopping">
- Compras
- </string>
- <string name="Land Rental">
- Aluguel de terrenos
- </string>
- <string name="Property Rental">
- Aluguel de propriedade
- </string>
- <string name="Special Attraction">
- Atração especial
- </string>
- <string name="New Products">
- Novos Produtos
- </string>
- <string name="Employment">
- Emprego
- </string>
- <string name="Wanted">
- Desejado
- </string>
- <string name="Service">
- Serviço
- </string>
- <string name="Personal">
- Pessoal
- </string>
- <string name="None">
- Nenhum
- </string>
- <string name="Linden Location">
- Locação Linden
- </string>
- <string name="Adult">
- Adulto
- </string>
- <string name="Arts&amp;Culture">
- Artes e Cultura
- </string>
- <string name="Business">
- Negócios
- </string>
- <string name="Educational">
- Educacional
- </string>
- <string name="Gaming">
- Games
- </string>
- <string name="Hangout">
- Moradia
- </string>
- <string name="Newcomer Friendly">
- Para recém-chegados
- </string>
- <string name="Parks&amp;Nature">
- Parques &amp; Natureza
- </string>
- <string name="Residential">
- Residencial
- </string>
- <string name="Stage">
- Estágio
- </string>
- <string name="Other">
- Outros
- </string>
- <string name="Rental">
- Aluguel
- </string>
- <string name="Any">
- Qualquer
- </string>
- <string name="You">
- Você
- </string>
- <string name="Multiple Media">
- Mídia múltipla
- </string>
- <string name="Play Media">
- Tocar/Pausar mídia
- </string>
- <string name="MBCmdLineError">
- Um erro foi encontrado analisando a linha de comando.
-Consulte: http://wiki.secondlife.com/wiki/Client_parameters
-Erro:
- </string>
- <string name="MBCmdLineUsg">
- [APP_NAME] Uso de linha de comando:
- </string>
- <string name="MBUnableToAccessFile">
- [APP_NAME] não é capaz de acessar um arquivo que ele precisa.
-
-Isto pode ocorrer porque você de alguma maneira tem várias cópias em execução, ou o seu sistema acredita de maneira incorreta que um arquivo está aberto.
-Se a mensagem persistir, reinicie o computador e tente novamente.
-Se o error persistir, pode ser necessário desinstalar completamente [APP_NAME] e reinstalá-lo.
- </string>
- <string name="MBFatalError">
- Erro fatal
- </string>
- <string name="MBRequiresAltiVec">
- [APP_NAME] exige processador com AltiVec (G4 ou superior).
- </string>
- <string name="MBAlreadyRunning">
- [APP_NAME] já está em execução.
-Verifique a sua barra de tarefas para obter uma cópia do programa minimizado.
-Se a mensagem persistir, reinicie o computador.
- </string>
- <string name="MBFrozenCrashed">
- [APP_NAME] parece ter congelado ou falhado na execução anterior. Enviar relatório de falha?
- </string>
- <string name="MBAlert">
- Alerta
- </string>
- <string name="MBNoDirectX">
- [APP_NAME] é incapaz de detectar o DirectX 9.0b ou superior.
-[APP_NAME] usa o DirectX para a detecção de hardware e / ou controladores desatualizados que podem causar problemas de estabilidade, desempenho ruim e falhas. Embora você possa executar [APP_NAME] sem ele, nós recomendamos fortemente que utilize o DirectX 9.0b.
-
-Deseja continuar?
- </string>
- <string name="MBWarning">
- Aviso
- </string>
- <string name="MBNoAutoUpdate">
- Atualização automática ainda não está implementada para o Linux.
-Faça o download da versão mais recente do www.secondlife.com.
- </string>
- <string name="MBRegClassFailed">
- RegisterClass falhou
- </string>
- <string name="MBError">
- Erro
- </string>
- <string name="MBFullScreenErr">
- Incapaz de funcionar com tela cheia de [WIDTH] x [HEIGHT].
-Executando em janela.
- </string>
- <string name="MBDestroyWinFailed">
- Erro de desligamento ao destruir janela (DestroyWindow() failed)
- </string>
- <string name="MBShutdownErr">
- Erro de desligamento
- </string>
- <string name="MBDevContextErr">
- Não é possível fazer contexto do dispositivo GL
- </string>
- <string name="MBPixelFmtErr">
- Não é possível encontrar um formato de pixel adequado
- </string>
- <string name="MBPixelFmtDescErr">
- Não é possível encontrar descrição de formato de pixel
- </string>
- <string name="MBTrueColorWindow">
- [APP_NAME] requer True Color (32-bit) para ser executado.
-Por favor, vá para as configurações de vídeo do computador e defina o modo de cores para 32-bit.
- </string>
- <string name="MBAlpha">
- [APP_NAME] é incapaz de executar porque ele não consegue obter um canal alpha de 8 bits. Geralmente isso ocorre devido a problemas de drivers da placa de vídeo.
-Por favor, certifique-se que os últimos drivers da placa de vídeo estão instalados.
-Também não se esqueça de definir seu monitor para True Color (32-bit), em painéis de controle Configurações&gt; Display&gt;.
-Se você continuar a receber esta mensagem, contate o [SUPPORT_SITE].
- </string>
- <string name="MBPixelFmtSetErr">
- Não é possível definir o formato de pixel
- </string>
- <string name="MBGLContextErr">
- Não é possível criar o contexto de renderização GL
- </string>
- <string name="MBGLContextActErr">
- Não é possível ativar o contexto de renderização GL
- </string>
- <string name="MBVideoDrvErr">
- [APP_NAME] é incapaz de funcionar por causa do seu driver de video não ter sido instalado corretamente, estão desatualizados, ou não são suportados pelo hardware. Por favor certifique-se que você possui os drivers de placa de vídeo mais recente e mesmo assim, tente reinstalá-los.
-
-If you continue to receive this message, contact the [SUPPORT_SITE].
- </string>
- <string name="5 O&apos;Clock Shadow">
- Barba por fazer
- </string>
- <string name="All White">
- Todo branco
- </string>
- <string name="Anime Eyes">
- Olhos de Anime
- </string>
- <string name="Arced">
- Arqueados
- </string>
- <string name="Arm Length">
- Comprimento do braço
- </string>
- <string name="Attached">
- Anexado
- </string>
- <string name="Attached Earlobes">
- Lóbulos da orelha anexados
- </string>
- <string name="Back Fringe">
- corte traseiro
- </string>
- <string name="Baggy">
- folgado
- </string>
- <string name="Bangs">
- Franja
- </string>
- <string name="Beady Eyes">
- Olhos pequenos
- </string>
- <string name="Belly Size">
- Tamanho da barriga
- </string>
- <string name="Big">
- Grande
- </string>
- <string name="Big Butt">
- Bunda grande
- </string>
- <string name="Big Hair Back">
- Cabelo volumoso: Trás
- </string>
- <string name="Big Hair Front">
- Cabelo volumoso: Frente
- </string>
- <string name="Big Hair Top">
- Cabelo volumoso: Topo
- </string>
- <string name="Big Head">
- cabeça grande
- </string>
- <string name="Big Pectorals">
- Peitorais grandes
- </string>
- <string name="Big Spikes">
- Pontas grandes
- </string>
- <string name="Black">
- Negro
- </string>
- <string name="Blonde">
- Loiro
- </string>
- <string name="Blonde Hair">
- Cabelo loiro
- </string>
- <string name="Blush">
- Blush
- </string>
- <string name="Blush Color">
- Cor do blush
- </string>
- <string name="Blush Opacity">
- Opacidade do blush
- </string>
- <string name="Body Definition">
- Definição do corpo
- </string>
- <string name="Body Fat">
- Gordura
- </string>
- <string name="Body Freckles">
- Sardas
- </string>
- <string name="Body Thick">
- Corpo cheio
- </string>
- <string name="Body Thickness">
- Ossatura
- </string>
- <string name="Body Thin">
- Corpo magro
- </string>
- <string name="Bow Legged">
- Pernas arqueadas
- </string>
- <string name="Breast Buoyancy">
- Caimento dos seios
- </string>
- <string name="Breast Cleavage">
- Separação dos seios
- </string>
- <string name="Breast Size">
- Tamanho dos seios
- </string>
- <string name="Bridge Width">
- Largura do nariz
- </string>
- <string name="Broad">
- Largo
- </string>
- <string name="Brow Size">
- Tamanho da sobrancelha
- </string>
- <string name="Bug Eyes">
- Olhos saltados
- </string>
- <string name="Bugged Eyes">
- Olhos esbugalhados
- </string>
- <string name="Bulbous">
- Bulbos
- </string>
- <string name="Bulbous Nose">
- Nariz em bulbo
- </string>
- <string name="Breast Physics Mass">
- Seios - massa
- </string>
- <string name="Breast Physics Smoothing">
- Seios - suavização
- </string>
- <string name="Breast Physics Gravity">
- Seios - gravidade
- </string>
- <string name="Breast Physics Drag">
- Seios - resistência do ar
- </string>
- <string name="Breast Physics InOut Max Effect">
- Efeito máximo
- </string>
- <string name="Breast Physics InOut Spring">
- Vibração
- </string>
- <string name="Breast Physics InOut Gain">
- Ganho
- </string>
- <string name="Breast Physics InOut Damping">
- Duração
- </string>
- <string name="Breast Physics UpDown Max Effect">
- Efeito máximo
- </string>
- <string name="Breast Physics UpDown Spring">
- Vibração
- </string>
- <string name="Breast Physics UpDown Gain">
- Ganho
- </string>
- <string name="Breast Physics UpDown Damping">
- Duração
- </string>
- <string name="Breast Physics LeftRight Max Effect">
- Efeito máximo
- </string>
- <string name="Breast Physics LeftRight Spring">
- Vibração
- </string>
- <string name="Breast Physics LeftRight Gain">
- Ganho
- </string>
- <string name="Breast Physics LeftRight Damping">
- Duração
- </string>
- <string name="Belly Physics Mass">
- Barriga - massa
- </string>
- <string name="Belly Physics Smoothing">
- Barriga - suavização
- </string>
- <string name="Belly Physics Gravity">
- Barriga - gravidade
- </string>
- <string name="Belly Physics Drag">
- Barriga - resistência do ar
- </string>
- <string name="Belly Physics UpDown Max Effect">
- Efeito máximo
- </string>
- <string name="Belly Physics UpDown Spring">
- Vibração
- </string>
- <string name="Belly Physics UpDown Gain">
- Ganho
- </string>
- <string name="Belly Physics UpDown Damping">
- Duração
- </string>
- <string name="Butt Physics Mass">
- Nádegas - massa
- </string>
- <string name="Butt Physics Smoothing">
- Nádegas - suavização
- </string>
- <string name="Butt Physics Gravity">
- Nádegas - gravidade
- </string>
- <string name="Butt Physics Drag">
- Nádegas - resistência do ar
- </string>
- <string name="Butt Physics UpDown Max Effect">
- Efeito máximo
- </string>
- <string name="Butt Physics UpDown Spring">
- Vibração
- </string>
- <string name="Butt Physics UpDown Gain">
- Ganho
- </string>
- <string name="Butt Physics UpDown Damping">
- Duração
- </string>
- <string name="Butt Physics LeftRight Max Effect">
- Efeito máximo
- </string>
- <string name="Butt Physics LeftRight Spring">
- Vibração
- </string>
- <string name="Butt Physics LeftRight Gain">
- Ganho
- </string>
- <string name="Butt Physics LeftRight Damping">
- Duração
- </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="Butt Gravity">
- Nádegas - gravidade
- </string>
- <string name="bustle skirt">
- Saia armada
- </string>
- <string name="no bustle">
- Saia reta
- </string>
- <string name="more bustle">
- Mais
- </string>
- <string name="Chaplin">
- Chaplin
- </string>
- <string name="Cheek Bones">
- Maçãs do rosto
- </string>
- <string name="Chest Size">
- Tamanho do peito
- </string>
- <string name="Chin Angle">
- Ângulo do queixo
- </string>
- <string name="Chin Cleft">
- Fissura do queixo
- </string>
- <string name="Chin Curtains">
- Barba de contorno
- </string>
- <string name="Chin Depth">
- Profundidade do queixo
- </string>
- <string name="Chin Heavy">
- Queixo pronunciado
- </string>
- <string name="Chin In">
- Queixo para dentro
- </string>
- <string name="Chin Out">
- Queixo para fora
- </string>
- <string name="Chin-Neck">
- Queixo-pescoço
- </string>
- <string name="Clear">
- Limpar
- </string>
- <string name="Cleft">
- Fenda
- </string>
- <string name="Close Set Eyes">
- Fechar conjunto de olhos
- </string>
- <string name="Closed">
- Fechado
- </string>
- <string name="Closed Back">
- Trás fechada
- </string>
- <string name="Closed Front">
- Frente fechada
- </string>
- <string name="Closed Left">
- Esquerda fechada
- </string>
- <string name="Closed Right">
- Direita fechada
- </string>
- <string name="Coin Purse">
- Pouco volume
- </string>
- <string name="Collar Back">
- Colarinho posterior
- </string>
- <string name="Collar Front">
- Colarinho anterior
- </string>
- <string name="Corner Down">
- Canto para baixo
- </string>
- <string name="Corner Up">
- Canto para cima
- </string>
- <string name="Creased">
- Vincado
- </string>
- <string name="Crooked Nose">
- Nariz torto
- </string>
- <string name="Cuff Flare">
- Bainha larga
- </string>
- <string name="Dark">
- Escuro
- </string>
- <string name="Dark Green">
- Verde escuro
- </string>
- <string name="Darker">
- Mais escuro
- </string>
- <string name="Deep">
- Profundidade
- </string>
- <string name="Default Heels">
- Salto padrão
- </string>
- <string name="Dense">
- Densidade
- </string>
- <string name="Double Chin">
- Queixo duplo
- </string>
- <string name="Downturned">
- Curvado para baixo
- </string>
- <string name="Duffle Bag">
- Mais volume
- </string>
- <string name="Ear Angle">
- Ângulo da orelha
- </string>
- <string name="Ear Size">
- Tamanho da orelha
- </string>
- <string name="Ear Tips">
- Pontas das orelhas
- </string>
- <string name="Egg Head">
- Cabeça oval
- </string>
- <string name="Eye Bags">
- Olheiras
- </string>
- <string name="Eye Color">
- Cor dos olhos
- </string>
- <string name="Eye Depth">
- Profundidade dos olhos
- </string>
- <string name="Eye Lightness">
- Luminosidade dos olhos
- </string>
- <string name="Eye Opening">
- Abertura dos olhos
- </string>
- <string name="Eye Pop">
- Olho saltado
- </string>
- <string name="Eye Size">
- Tamanho dos olhos
- </string>
- <string name="Eye Spacing">
- Espaçamento dos olhos
- </string>
- <string name="Eyebrow Arc">
- Arco da sobrancelha
- </string>
- <string name="Eyebrow Density">
- Densidade da sobrancelha
- </string>
- <string name="Eyebrow Height">
- Altura da sobrancelha
- </string>
- <string name="Eyebrow Points">
- Pontas da sobrancelha
- </string>
- <string name="Eyebrow Size">
- Tamanho da sobrancelha
- </string>
- <string name="Eyelash Length">
- Comprimento das pestanas
- </string>
- <string name="Eyeliner">
- Delineador
- </string>
- <string name="Eyeliner Color">
- Cor do delineador
- </string>
- <string name="Eyes Bugged">
- Olhos esbugalhados
- </string>
- <string name="Face Shear">
- Face raspada
- </string>
- <string name="Facial Definition">
- Definição facial
- </string>
- <string name="Far Set Eyes">
- Distância entre os olhos
- </string>
- <string name="Fat Lips">
- Lábios carnudos
- </string>
- <string name="Female">
- Feminino
- </string>
- <string name="Fingerless">
- Dedos
- </string>
- <string name="Fingers">
- Dedos
- </string>
- <string name="Flared Cuffs">
- Punhos largos
- </string>
- <string name="Flat">
- Chato
- </string>
- <string name="Flat Butt">
- Traseiro chato
- </string>
- <string name="Flat Head">
- Cabeça chata
- </string>
- <string name="Flat Toe">
- Dedos dos pés chatos
- </string>
- <string name="Foot Size">
- Tamanho dos pés
- </string>
- <string name="Forehead Angle">
- Ângulo da testa
- </string>
- <string name="Forehead Heavy">
- Testa pronunciada
- </string>
- <string name="Freckles">
- Sardas
- </string>
- <string name="Front Fringe">
- Franja
- </string>
- <string name="Full Back">
- Trás cheia
- </string>
- <string name="Full Eyeliner">
- Delienador cheio
- </string>
- <string name="Full Front">
- Frente cheia
- </string>
- <string name="Full Hair Sides">
- Cabelos laterais cheios
- </string>
- <string name="Full Sides">
- Lados cheios
- </string>
- <string name="Glossy">
- Brilhante
- </string>
- <string name="Glove Fingers">
- Dedos da luva
- </string>
- <string name="Glove Length">
- Comprimento das luvas
- </string>
- <string name="Hair">
- Cabelo
- </string>
- <string name="Hair Back">
- Cabelo: Trás
- </string>
- <string name="Hair Front">
- Cabelo: Frente
- </string>
- <string name="Hair Sides">
- Cabelos: Lateral
- </string>
- <string name="Hair Sweep">
- Cabelo penteado
- </string>
- <string name="Hair Thickess">
- Espessura do cabelo
- </string>
- <string name="Hair Thickness">
- Espessura do cabelo
- </string>
- <string name="Hair Tilt">
- Divisão do cabelo
- </string>
- <string name="Hair Tilted Left">
- Divistão do cabelo esquerda
- </string>
- <string name="Hair Tilted Right">
- Divisão do cabelo direita
- </string>
- <string name="Hair Volume">
- Cabelo: Volume
- </string>
- <string name="Hand Size">
- Tamanho das mãos
- </string>
- <string name="Handlebars">
- Bigode
- </string>
- <string name="Head Length">
- Comprimento da cabeça
- </string>
- <string name="Head Shape">
- Formato da cabeça
- </string>
- <string name="Head Size">
- Tamanho da cabeça
- </string>
- <string name="Head Stretch">
- Extensão da cabeça
- </string>
- <string name="Heel Height">
- Altura do salto
- </string>
- <string name="Heel Shape">
- Formato do salto
- </string>
- <string name="Height">
- Altura
- </string>
- <string name="High">
- Alto
- </string>
- <string name="High Heels">
- Salto alto
- </string>
- <string name="High Jaw">
- Maxilar alto
- </string>
- <string name="High Platforms">
- Plataformas altas
- </string>
- <string name="High and Tight">
- Alto e justo
- </string>
- <string name="Higher">
- Mais alto
- </string>
- <string name="Hip Length">
- Comprimento do quadril
- </string>
- <string name="Hip Width">
- Largura do quadril
- </string>
- <string name="In">
- Dentro
- </string>
- <string name="In Shdw Color">
- Cor da sombra interna
- </string>
- <string name="In Shdw Opacity">
- Opacidade da sombra interna
- </string>
- <string name="Inner Eye Corner">
- Canto interno dos olhos
- </string>
- <string name="Inner Eye Shadow">
- Sombra interna dos olhos
- </string>
- <string name="Inner Shadow">
- Sombra interna
- </string>
- <string name="Jacket Length">
- Comprimento da blusa
- </string>
- <string name="Jacket Wrinkles">
- Dobras da jaqueta
- </string>
- <string name="Jaw Angle">
- Ângulo da mandíbula
- </string>
- <string name="Jaw Jut">
- Posição do maxilar
- </string>
- <string name="Jaw Shape">
- Formato do maxilar
- </string>
- <string name="Join">
- Juntar
- </string>
- <string name="Jowls">
- Papo
- </string>
- <string name="Knee Angle">
- Ângulo do joelho
- </string>
- <string name="Knock Kneed">
- Joelhos para dentro
- </string>
- <string name="Large">
- Grande
- </string>
- <string name="Large Hands">
- Mãos grandes
- </string>
- <string name="Left Part">
- Parte esquerda
- </string>
- <string name="Leg Length">
- Comprimento da perna
- </string>
- <string name="Leg Muscles">
- Musculatura da perna
- </string>
- <string name="Less">
- Menos
- </string>
- <string name="Less Body Fat">
- Menos gordura
- </string>
- <string name="Less Curtains">
- Menos barba
- </string>
- <string name="Less Freckles">
- Menos sardas
- </string>
- <string name="Less Full">
- Menos
- </string>
- <string name="Less Gravity">
- Menos gravidade
- </string>
- <string name="Less Love">
- Menos excesso
- </string>
- <string name="Less Muscles">
- Menos músculos
- </string>
- <string name="Less Muscular">
- Menos musculoso
- </string>
- <string name="Less Rosy">
- Menos rosado
- </string>
- <string name="Less Round">
- Menos arredondado
- </string>
- <string name="Less Saddle">
- Menos ancas
- </string>
- <string name="Less Square">
- Menos quadrado
- </string>
- <string name="Less Volume">
- Menos volume
- </string>
- <string name="Less soul">
- Menos alma
- </string>
- <string name="Lighter">
- Lighter
- </string>
- <string name="Lip Cleft">
- Fenda dos lábios
- </string>
- <string name="Lip Cleft Depth">
- Profundidade da fenda dos lábios
- </string>
- <string name="Lip Fullness">
- Volume dos lábios
- </string>
- <string name="Lip Pinkness">
- Rosado dos lábios
- </string>
- <string name="Lip Ratio">
- Proporção dos lábios
- </string>
- <string name="Lip Thickness">
- Espessura dos lábios
- </string>
- <string name="Lip Width">
- Largura dos lábios
- </string>
- <string name="Lipgloss">
- Brilho dos lábios
- </string>
- <string name="Lipstick">
- Batom
- </string>
- <string name="Lipstick Color">
- Cor do batom
- </string>
- <string name="Long">
- Longo
- </string>
- <string name="Long Head">
- Cabeça alongada
- </string>
- <string name="Long Hips">
- Lábios longos
- </string>
- <string name="Long Legs">
- Pernas longas
- </string>
- <string name="Long Neck">
- Pescoço longo
- </string>
- <string name="Long Pigtails">
- Chiquinhas longas
- </string>
- <string name="Long Ponytail">
- Rabo de cavalo longo
- </string>
- <string name="Long Torso">
- Torso longo
- </string>
- <string name="Long arms">
- Braços longos
- </string>
- <string name="Loose Pants">
- Pantalonas
- </string>
- <string name="Loose Shirt">
- Camisa folgada
- </string>
- <string name="Loose Sleeves">
- Mangas folgadas
- </string>
- <string name="Love Handles">
- Pneu
- </string>
- <string name="Low">
- Baixo
- </string>
- <string name="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">
- Mais baixo
- </string>
- <string name="Lower Bridge">
- Mais baixa
- </string>
- <string name="Lower Cheeks">
- Bochechas abaixadas
- </string>
- <string name="Male">
- Masculino
- </string>
- <string name="Middle Part">
- Parte do meio
- </string>
- <string name="More">
- Mais
- </string>
- <string name="More Blush">
- Mais blush
- </string>
- <string name="More Body Fat">
- Mais gordura
- </string>
- <string name="More Curtains">
- Mais barba
- </string>
- <string name="More Eyeshadow">
- Mais sombra dos olhos
- </string>
- <string name="More Freckles">
- Mais sardas
- </string>
- <string name="More Full">
- Mais volume
- </string>
- <string name="More Gravity">
- Mais gravidade
- </string>
- <string name="More Lipstick">
- Mais batom
- </string>
- <string name="More Love">
- Mais cintura
- </string>
- <string name="More Lower Lip">
- Mais lábio inferior
- </string>
- <string name="More Muscles">
- Mais músculos
- </string>
- <string name="More Muscular">
- Mais musculoso
- </string>
- <string name="More Rosy">
- Mais rosado
- </string>
- <string name="More Round">
- Mais arredondado
- </string>
- <string name="More Saddle">
- Mais ancas
- </string>
- <string name="More Sloped">
- Mais inclinado
- </string>
- <string name="More Square">
- Mais quadrado
- </string>
- <string name="More Upper Lip">
- Mais lábios superiores
- </string>
- <string name="More Vertical">
- Mais vertical
- </string>
- <string name="More Volume">
- Mais volume
- </string>
- <string name="More soul">
- Mais alma
- </string>
- <string name="Moustache">
- Bigode
- </string>
- <string name="Mouth Corner">
- Canto da boca
- </string>
- <string name="Mouth Position">
- Posição da boca
- </string>
- <string name="Mowhawk">
- Moicano
- </string>
- <string name="Muscular">
- Muscular
- </string>
- <string name="Mutton Chops">
- Costeletas
- </string>
- <string name="Nail Polish">
- Esmate das unhas
- </string>
- <string name="Nail Polish Color">
- Cor do esmalte das unhas
- </string>
- <string name="Narrow">
- Estreito
- </string>
- <string name="Narrow Back">
- Costas estreitas
- </string>
- <string name="Narrow Front">
- Frente estreita
- </string>
- <string name="Narrow Lips">
- Lábios estreitos
- </string>
- <string name="Natural">
- Natural
- </string>
- <string name="Neck Length">
- Comprimento do pescoço
- </string>
- <string name="Neck Thickness">
- Espessura do pescoço
- </string>
- <string name="No Blush">
- Sem blush
- </string>
- <string name="No Eyeliner">
- Sem delineador
- </string>
- <string name="No Eyeshadow">
- Sem sombra
- </string>
- <string name="No Lipgloss">
- Sem brilho
- </string>
- <string name="No Lipstick">
- Sem batom
- </string>
- <string name="No Part">
- Sem parte
- </string>
- <string name="No Polish">
- Sem esmalte
- </string>
- <string name="No Red">
- Sem vermelho
- </string>
- <string name="No Spikes">
- Sem pontas
- </string>
- <string name="No White">
- Sem branco
- </string>
- <string name="No Wrinkles">
- Sem dobras
- </string>
- <string name="Normal Lower">
- Normal inferior
- </string>
- <string name="Normal Upper">
- Normal superior
- </string>
- <string name="Nose Left">
- Nariz para esquerda
- </string>
- <string name="Nose Right">
- Nariz para direita
- </string>
- <string name="Nose Size">
- Tamanho do nariz
- </string>
- <string name="Nose Thickness">
- Espessura do nariz
- </string>
- <string name="Nose Tip Angle">
- Ângulo da ponta do nariz
- </string>
- <string name="Nose Tip Shape">
- Formato da ponta do nariz
- </string>
- <string name="Nose Width">
- Largura do nariz
- </string>
- <string name="Nostril Division">
- Divisão das narinas
- </string>
- <string name="Nostril Width">
- Largura das narinas
- </string>
- <string name="Opaque">
- Opaco
- </string>
- <string name="Open">
- Abrir
- </string>
- <string name="Open Back">
- Aberto atrás
- </string>
- <string name="Open Front">
- Aberto na frente
- </string>
- <string name="Open Left">
- Aberto esquerdo
- </string>
- <string name="Open Right">
- Aberto direito
- </string>
- <string name="Orange">
- Laranja
- </string>
- <string name="Out">
- Fora
- </string>
- <string name="Out Shdw Color">
- Cor da sombra externa
- </string>
- <string name="Out Shdw Opacity">
- Opacidade da sombra externa
- </string>
- <string name="Outer Eye Corner">
- Canto externo do olho
- </string>
- <string name="Outer Eye Shadow">
- Sombra externa do olho
- </string>
- <string name="Outer Shadow">
- Sombra externa
- </string>
- <string name="Overbite">
- Má oclusão
- </string>
- <string name="Package">
- Púbis
- </string>
- <string name="Painted Nails">
- Unhas pintadas
- </string>
- <string name="Pale">
- Pálido
- </string>
- <string name="Pants Crotch">
- Cavalo da calça
- </string>
- <string name="Pants Fit">
- Caimento das calças
- </string>
- <string name="Pants Length">
- Comprimento das calças
- </string>
- <string name="Pants Waist">
- Cintura da calça
- </string>
- <string name="Pants Wrinkles">
- Dobras das calças
- </string>
- <string name="Part">
- Parte
- </string>
- <string name="Part Bangs">
- Divisão da franja
- </string>
- <string name="Pectorals">
- Peitorais
- </string>
- <string name="Pigment">
- Pigmento
- </string>
- <string name="Pigtails">
- Chiquinhas
- </string>
- <string name="Pink">
- Rosa
- </string>
- <string name="Pinker">
- Mais rosado
- </string>
- <string name="Platform Height">
- Altura da plataforma
- </string>
- <string name="Platform Width">
- Largura da plataforma
- </string>
- <string name="Pointy">
- Pontudo
- </string>
- <string name="Pointy Heels">
- Salto agulha
- </string>
- <string name="Ponytail">
- Rabo de cavalo
- </string>
- <string name="Poofy Skirt">
- Saia bufante
- </string>
- <string name="Pop Left Eye">
- Olho saltado esquerdo
- </string>
- <string name="Pop Right Eye">
- Olho saltado direito
- </string>
- <string name="Puffy">
- Inchado
- </string>
- <string name="Puffy Eyelids">
- Pálpebras inchadas
- </string>
- <string name="Rainbow Color">
- Cor do arco íris
- </string>
- <string name="Red Hair">
- Cabelo ruivo
- </string>
- <string name="Regular">
- Normal
- </string>
- <string name="Right Part">
- Parte direita
- </string>
- <string name="Rosy Complexion">
- Rosado da face
- </string>
- <string name="Round">
- Arredondado
- </string>
- <string name="Ruddiness">
- Rubor
- </string>
- <string name="Ruddy">
- Corado
- </string>
- <string name="Rumpled Hair">
- Cabelo desalinhado
- </string>
- <string name="Saddle Bags">
- Culote
- </string>
- <string name="Scrawny Leg">
- Pernas magricelas
- </string>
- <string name="Separate">
- Separar
- </string>
- <string name="Shallow">
- Raso
- </string>
- <string name="Shear Back">
- Trás rente
- </string>
- <string name="Shear Face">
- Face raspada
- </string>
- <string name="Shear Front">
- Frente rente
- </string>
- <string name="Shear Left Up">
- Esquerda rente para cima
- </string>
- <string name="Shear Right Up">
- Trás rente para cima
- </string>
- <string name="Sheared Back">
- Rente atrás
- </string>
- <string name="Sheared Front">
- Rente frente
- </string>
- <string name="Shift Left">
- Deslocar p/ esquerda
- </string>
- <string name="Shift Mouth">
- Deslocar boca
- </string>
- <string name="Shift Right">
- Deslocar p/ direita
- </string>
- <string name="Shirt Bottom">
- Barra da camisa
- </string>
- <string name="Shirt Fit">
- Ajuste da camisa
- </string>
- <string name="Shirt Wrinkles">
- +/- amassada
- </string>
- <string name="Shoe Height">
- Altura do sapato
- </string>
- <string name="Short">
- Curto
- </string>
- <string name="Short Arms">
- Braços curtos
- </string>
- <string name="Short Legs">
- Pernas curtas
- </string>
- <string name="Short Neck">
- Pescoço curto
- </string>
- <string name="Short Pigtails">
- Chiquinhas curtas
- </string>
- <string name="Short Ponytail">
- Rabo de cavalo curto
- </string>
- <string name="Short Sideburns">
- Costeletas curtas
- </string>
- <string name="Short Torso">
- Tronco curto
- </string>
- <string name="Short hips">
- Quadril curto
- </string>
- <string name="Shoulders">
- Ombros
- </string>
- <string name="Side Fringe">
- pontas laterais
- </string>
- <string name="Sideburns">
- Costeletas
- </string>
- <string name="Sides Hair">
- Cabelo lateral
- </string>
- <string name="Sides Hair Down">
- Cabelo lateral long
- </string>
- <string name="Sides Hair Up">
- Cabelo lateral superior
- </string>
- <string name="Skinny Neck">
- Pescoço fino
- </string>
- <string name="Skirt Fit">
- Ajuste de saia
- </string>
- <string name="Skirt Length">
- Comprimento da saia
- </string>
- <string name="Slanted Forehead">
- Testa inclinada
- </string>
- <string name="Sleeve Length">
- Comprimento da manga
- </string>
- <string name="Sleeve Looseness">
- Folga da manga
- </string>
- <string name="Slit Back">
- Abertura : Atrás
- </string>
- <string name="Slit Front">
- Abertura: Frente
- </string>
- <string name="Slit Left">
- Abertura: Esquerda
- </string>
- <string name="Slit Right">
- Abertura: Direita
- </string>
- <string name="Small">
- Pequeno
- </string>
- <string name="Small Hands">
- Mãos pequenas
- </string>
- <string name="Small Head">
- Cabeça pequena
- </string>
- <string name="Smooth">
- Suavizar
- </string>
- <string name="Smooth Hair">
- Suavizar cabelo
- </string>
- <string name="Socks Length">
- Comprimento das meias
- </string>
- <string name="Soulpatch">
- Cavanhaque
- </string>
- <string name="Sparse">
- Disperso
- </string>
- <string name="Spiked Hair">
- Cabelo espetado
- </string>
- <string name="Square">
- Quadrado
- </string>
- <string name="Square Toe">
- Dedo quadrado
- </string>
- <string name="Squash Head">
- Cabeça de Pera
- </string>
- <string name="Stretch Head">
- Cabeça esticada
- </string>
- <string name="Sunken">
- Afundar
- </string>
- <string name="Sunken Chest">
- Peito afundado
- </string>
- <string name="Sunken Eyes">
- Olhos afundados
- </string>
- <string name="Sweep Back">
- Pentear para trás
- </string>
- <string name="Sweep Forward">
- Pentear para frente
- </string>
- <string name="Tall">
- Alto
- </string>
- <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="Thin">
- Fino
- </string>
- <string name="Thin Eyebrows">
- Sobrancelhas finas
- </string>
- <string name="Thin Lips">
- Lábios finos
- </string>
- <string name="Thin Nose">
- Nariz fino
- </string>
- <string name="Tight Chin">
- Queixo apertado
- </string>
- <string name="Tight Cuffs">
- Punho justo
- </string>
- <string name="Tight Pants">
- Calça justa
- </string>
- <string name="Tight Shirt">
- Camisa justa
- </string>
- <string name="Tight Skirt">
- Saia justa
- </string>
- <string name="Tight Sleeves">
- Tight Sleeves
- </string>
- <string name="Toe Shape">
- Formato dos dedos
- </string>
- <string name="Toe Thickness">
- Espessura dos dos dedos
- </string>
- <string name="Torso Length">
- Comprimento do tronco
- </string>
- <string name="Torso Muscles">
- Músculos do tronco
- </string>
- <string name="Torso Scrawny">
- Tronco magricela
- </string>
- <string name="Unattached">
- Desanexado
- </string>
- <string name="Uncreased">
- Uncreased
- </string>
- <string name="Underbite">
- Underbite
- </string>
- <string name="Unnatural">
- Não natural
- </string>
- <string name="Upper Bridge">
- Parte alta do nariz
- </string>
- <string name="Upper Cheeks">
- Bochechas altas
- </string>
- <string name="Upper Chin Cleft">
- fenda do queixo alta
- </string>
- <string name="Upper Eyelid Fold">
- Curvatura dos cílios supériores
- </string>
- <string name="Upturned">
- Voltado para cima
- </string>
- <string name="Very Red">
- Bem vermelho
- </string>
- <string name="Waist Height">
- Altura da cintura
- </string>
- <string name="Well-Fed">
- Corpulento
- </string>
- <string name="White Hair">
- Grisalho
- </string>
- <string name="Wide">
- Amplo
- </string>
- <string name="Wide Back">
- Costas largas
- </string>
- <string name="Wide Front">
- Testa larga
- </string>
- <string name="Wide Lips">
- Lábios amplos
- </string>
- <string name="Wild">
- Selvagem
- </string>
- <string name="Wrinkles">
- Rugas
- </string>
- <string name="LocationCtrlAddLandmarkTooltip">
- Adicionar às minhas Landmarks
- </string>
- <string name="LocationCtrlEditLandmarkTooltip">
- Editar minhas Landmarks
- </string>
- <string name="LocationCtrlInfoBtnTooltip">
- Ver mais informações sobre a localização atual
- </string>
- <string name="LocationCtrlComboBtnTooltip">
- Histórico de localizações
- </string>
- <string name="LocationCtrlAdultIconTooltip">
- Região Adulta
- </string>
- <string name="LocationCtrlModerateIconTooltip">
- Região Moderada
- </string>
- <string name="LocationCtrlGeneralIconTooltip">
- Região em geral
- </string>
- <string name="LocationCtrlSeeAVsTooltip">
- Avatar visíveis e bate-papo permitido fora deste terreno
- </string>
- <string name="UpdaterWindowTitle">
- [APP_NAME] Atualização
- </string>
- <string name="UpdaterNowUpdating">
- Atualizando agora o [APP_NAME]...
- </string>
- <string name="UpdaterNowInstalling">
- Instalando [APP_NAME]...
- </string>
- <string name="UpdaterUpdatingDescriptive">
- Seu visualizador [APP_NAME] está sendo atualizado para a versão mais recente. Isso pode levar algum tempo, então por favor seja paciente.
- </string>
- <string name="UpdaterProgressBarTextWithEllipses">
- Fazendo o download da atualização...
- </string>
- <string name="UpdaterProgressBarText">
- Fazendo o download da atualização
- </string>
- <string name="UpdaterFailDownloadTitle">
- Falha no download da atualização
- </string>
- <string name="UpdaterFailUpdateDescriptive">
- Um erro ocorreu ao atualizar [APP_NAME]. Por favor, faça o download da versão mais recente em www.secondlife.com.
- </string>
- <string name="UpdaterFailInstallTitle">
- Falha ao instalar a atualização
- </string>
- <string name="UpdaterFailStartTitle">
- Falha ao iniciar o visualizador
- </string>
- <string name="ItemsComingInTooFastFrom">
- [APP_NAME]: Entrada de itens rápida demais de [FROM_NAME], visualização automática suspensa por [TIME] segundos
- </string>
- <string name="ItemsComingInTooFast">
- [APP_NAME]: Entrada de itens rápida demais, visualização automática suspensa por [TIME] segundos
- </string>
- <string name="IM_logging_string">
- -- Log de mensagem instantânea habilitado --
- </string>
- <string name="IM_typing_start_string">
- [NAME] está digitando...
- </string>
- <string name="Unnamed">
- (Anônimo)
- </string>
- <string name="IM_moderated_chat_label">
- (Moderado: Voz desativado por padrão)
- </string>
- <string name="IM_unavailable_text_label">
- Bate-papo de texto não está disponível para esta chamada.
- </string>
- <string name="IM_muted_text_label">
- Seu bate- papo de texto foi desabilitado por um Moderador do Grupo.
- </string>
- <string name="IM_default_text_label">
- Clique aqui para menagem instantânea.
- </string>
- <string name="IM_to_label">
- Para
- </string>
- <string name="IM_moderator_label">
- (Moderador)
- </string>
- <string name="Saved_message">
- (Salvo em [LONG_TIMESTAMP])
- </string>
- <string name="IM_unblock_only_groups_friends">
- Para visualizar esta mensagem, você deve desmarcar &quot;Apenas amigos e grupos podem me ligar ou enviar MIs&quot; em Preferências/Privacidade.
- </string>
- <string name="answered_call">
- Ligação atendida
- </string>
- <string name="you_started_call">
- Você iniciou uma ligação de voz
- </string>
- <string name="you_joined_call">
- Você entrou na ligação
- </string>
- <string name="name_started_call">
- [NAME] iniciou uma ligação de voz
- </string>
- <string name="ringing-im">
- Entrando em ligação de voz...
- </string>
- <string name="connected-im">
- Conectado. Para sair, clique em Desligar
- </string>
- <string name="hang_up-im">
- Saiu da ligação de voz
- </string>
- <string name="conference-title-incoming">
- Conversa com [AGENT_NAME]
- </string>
- <string name="inventory_item_offered-im">
- Oferta de item de inventário
- </string>
- <string name="no_session_message">
- (Sessão de MI inexistente)
- </string>
- <string name="only_user_message">
- Você é o único usuário desta sessão.
- </string>
- <string name="offline_message">
- [NAME] está offline.
- </string>
- <string name="invite_message">
- Clique no botão [BUTTON NAME] para aceitar/ conectar a este bate-papo em voz.
- </string>
- <string name="muted_message">
- Você bloqueou este residente. Se quiser retirar o bloqueio, basta enviar uma mensagem.
- </string>
- <string name="generic">
- Erro de solicitação, tente novamente mais tarde.
- </string>
- <string name="generic_request_error">
- Erro na requisição, por favor, tente novamente.
- </string>
- <string name="insufficient_perms_error">
- Você não tem permissões suficientes.
- </string>
- <string name="session_does_not_exist_error">
- A sessão deixou de existir
- </string>
- <string name="no_ability_error">
- Você não possui esta habilidade.
- </string>
- <string name="no_ability">
- Você não possui esta habilidade.
- </string>
- <string name="not_a_mod_error">
- Você não é um moderador de sessão.
- </string>
- <string name="muted">
- Bate-papo de texto desativado por um moderador.
- </string>
- <string name="muted_error">
- Um moderador do grupo desabilitou seu bate-papo em texto.
- </string>
- <string name="add_session_event">
- Não foi possível adicionar usuários na sessão de bate-papo com [RECIPIENT].
- </string>
- <string name="message">
- Não foi possível enviar sua mensagem para o bate-papo com [RECIPIENT].
- </string>
- <string name="message_session_event">
- Não foi possível enviar sua mensagem na sessão de bate- papo com [RECIPIENT].
- </string>
- <string name="mute">
- Erro durante a moderação.
- </string>
- <string name="removed">
- Você foi tirado do grupo.
- </string>
- <string name="removed_from_group">
- Você foi removido do grupo.
- </string>
- <string name="close_on_no_ability">
- Você não possui mais a habilidade de estar na sessão de bate-papo.
- </string>
- <string name="unread_chat_single">
- [SOURCES] disse alguma coisa
- </string>
- <string name="unread_chat_multiple">
- [SOURCES] disseram alguma coisa
- </string>
- <string name="session_initialization_timed_out_error">
- A inicialização da sessão expirou
- </string>
- <string name="Home position set.">
- Posição inicial definida.
- </string>
- <string name="voice_morphing_url">
- http://secondlife.com/landing/voicemorphing
- </string>
- <string name="paid_you_ldollars">
- [NAME] lhe pagou L$ [AMOUNT] [REASON].
- </string>
- <string name="paid_you_ldollars_no_reason">
- [NAME] lhe pagou L$ [AMOUNT]
- </string>
- <string name="you_paid_ldollars">
- Você pagou L$[AMOUNT] por [REASON] a [NAME].
- </string>
- <string name="you_paid_ldollars_no_info">
- Você acaba de pagar L$[AMOUNT].
- </string>
- <string name="you_paid_ldollars_no_reason">
- Você pagou L$[AMOUNT] a [NAME].
- </string>
- <string name="you_paid_ldollars_no_name">
- Você pagou L$[AMOUNT] por [REASON].
- </string>
- <string name="you_paid_failure_ldollars">
- Você não pagou L$[AMOUNT] a [NAME] referentes a [REASON].
- </string>
- <string name="you_paid_failure_ldollars_no_info">
- Você não pagou L$[AMOUNT].
- </string>
- <string name="you_paid_failure_ldollars_no_reason">
- Você não pagou L$[AMOUNT] a [NAME].
- </string>
- <string name="you_paid_failure_ldollars_no_name">
- Você não pagou L$[AMOUNT] referentes a [REASON].
- </string>
- <string name="for item">
- por [ITEM]
- </string>
- <string name="for a parcel of land">
- por uma parcela
- </string>
- <string name="for a land access pass">
- por um passe de acesso
- </string>
- <string name="for deeding land">
- para doar um terreno
- </string>
- <string name="to create a group">
- para criar um grupo
- </string>
- <string name="to join a group">
- para entrar em um grupo
- </string>
- <string name="to upload">
- para carregar
- </string>
- <string name="to publish a classified ad">
- para publicar um anúncio
- </string>
- <string name="giving">
- Dando L$ [AMOUNT]
- </string>
- <string name="uploading_costs">
- O upload custa L$ [AMOUNT]
- </string>
- <string name="this_costs">
- Isso custa L$ [AMOUNT]
- </string>
- <string name="buying_selected_land">
- Comprando terreno selecionado L$ [AMOUNT]
- </string>
- <string name="this_object_costs">
- Esse objeto custa L$ [AMOUNT]
- </string>
- <string name="group_role_everyone">
- Todos
- </string>
- <string name="group_role_officers">
- Oficiais
- </string>
- <string name="group_role_owners">
- Proprietários
- </string>
- <string name="group_member_status_online">
- Conectado
- </string>
- <string name="uploading_abuse_report">
- Carregando...
-
-Denunciar abuso
- </string>
- <string name="New Shape">
- Nova forma
- </string>
- <string name="New Skin">
- Nova pele
- </string>
- <string name="New Hair">
- Novo cabelo
- </string>
- <string name="New Eyes">
- Novos olhos
- </string>
- <string name="New Shirt">
- Nova camisa
- </string>
- <string name="New Pants">
- Novas calças
- </string>
- <string name="New Shoes">
- Novos sapatos
- </string>
- <string name="New Socks">
- Novas meias
- </string>
- <string name="New Jacket">
- Nova blusa
- </string>
- <string name="New Gloves">
- Novas luvas
- </string>
- <string name="New Undershirt">
- Nova camiseta
- </string>
- <string name="New Underpants">
- Novas roupa de baixo
- </string>
- <string name="New Skirt">
- Nova saia
- </string>
- <string name="New Alpha">
- Novo alpha
- </string>
- <string name="New Tattoo">
- Nova tatuagem
- </string>
- <string name="New Physics">
- Novo físico
- </string>
- <string name="Invalid Wearable">
- Item inválido
- </string>
- <string name="New Gesture">
- Novo gesto
- </string>
- <string name="New Script">
- Novo script
- </string>
- <string name="New Note">
- Nova nota
- </string>
- <string name="New Folder">
- Nova pasta
- </string>
- <string name="Contents">
- Conteúdo
- </string>
- <string name="Gesture">
- Gesto
- </string>
- <string name="Male Gestures">
- Gestos masculinos
- </string>
- <string name="Female Gestures">
- Gestos femininos
- </string>
- <string name="Other Gestures">
- Outros gestos
- </string>
- <string name="Speech Gestures">
- Gestos da fala
- </string>
- <string name="Common Gestures">
- Gestos comuns
- </string>
- <string name="Male - Excuse me">
- Perdão - masculino
- </string>
- <string name="Male - Get lost">
- Deixe-me em paz - masculino
- </string>
- <string name="Male - Blow kiss">
- Mandar beijo - masculino
- </string>
- <string name="Male - Boo">
- Vaia - masculino
- </string>
- <string name="Male - Bored">
- Maçante - masculino
- </string>
- <string name="Male - Hey">
- Ôpa! - masculino
- </string>
- <string name="Male - Laugh">
- Risada - masculino
- </string>
- <string name="Male - Repulsed">
- Quero distância! - masculino
- </string>
- <string name="Male - Shrug">
- Encolher de ombros - masculino
- </string>
- <string name="Male - Stick tougue out">
- Mostrar a língua - masculino
- </string>
- <string name="Male - Wow">
- Wow - masculino
- </string>
- <string name="Female - Chuckle">
- Engraçado - Feminino
- </string>
- <string name="Female - Cry">
- Chorar - Feminino
- </string>
- <string name="Female - Embarrassed">
- Com vergonha - Feminino
- </string>
- <string name="Female - Excuse me">
- Perdão - fem
- </string>
- <string name="Female - Get lost">
- Deixe-me em paz - feminino
- </string>
- <string name="Female - Blow kiss">
- Mandar beijo - fem
- </string>
- <string name="Female - Boo">
- Vaia - fem
- </string>
- <string name="Female - Bored">
- Maçante - feminino
- </string>
- <string name="Female - Hey">
- Ôpa - feminino
- </string>
- <string name="Female - Hey baby">
- E aí, beliza? - Feminino
- </string>
- <string name="Female - Laugh">
- Risada - feminina
- </string>
- <string name="Female - Looking good">
- Que chique - Feminino
- </string>
- <string name="Female - Over here">
- Acenar - Feminino
- </string>
- <string name="Female - Please">
- Por favor - Feminino
- </string>
- <string name="Female - Repulsed">
- Quero distância! - feminino
- </string>
- <string name="Female - Shrug">
- Encolher ombros - feminino
- </string>
- <string name="Female - Stick tougue out">
- Mostrar a língua - feminino
- </string>
- <string name="Female - Wow">
- Wow - feminino
- </string>
- <string name="/bow">
- /reverência
- </string>
- <string name="/clap">
- /palmas
- </string>
- <string name="/count">
- /contar
- </string>
- <string name="/extinguish">
- /apagar
- </string>
- <string name="/kmb">
- /dane_se
- </string>
- <string name="/muscle">
- /músculos
- </string>
- <string name="/no">
- /não
- </string>
- <string name="/no!">
- /não!
- </string>
- <string name="/paper">
- /papel
- </string>
- <string name="/pointme">
- /apontar_eu
- </string>
- <string name="/pointyou">
- /apontar_você
- </string>
- <string name="/rock">
- /pedra
- </string>
- <string name="/scissor">
- /tesoura
- </string>
- <string name="/smoke">
- /fumar
- </string>
- <string name="/stretch">
- /alongar
- </string>
- <string name="/whistle">
- /assobiar
- </string>
- <string name="/yes">
- /sim
- </string>
- <string name="/yes!">
- /sim!
- </string>
- <string name="afk">
- ldt
- </string>
- <string name="dance1">
- dança1
- </string>
- <string name="dance2">
- dança2
- </string>
- <string name="dance3">
- dança3
- </string>
- <string name="dance4">
- dança4
- </string>
- <string name="dance5">
- dança5
- </string>
- <string name="dance6">
- dança6
- </string>
- <string name="dance7">
- dança7
- </string>
- <string name="dance8">
- dança8
- </string>
- <string name="AvatarBirthDateFormat">
- [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
- </string>
- <string name="DefaultMimeType">
- nenhum/nehum
- </string>
- <string name="texture_load_dimensions_error">
- A imagem excede o limite [WIDTH]*[HEIGHT]
- </string>
- <string name="words_separator" value=","/>
- <string name="server_is_down">
- Aconteceu algo inesperado, apesar de termos tentado impedir isso.
-
- Cheque secondlifegrid.net para saber se foi detectado um problema com o serviço.
- Se o problema persistir, cheque a configuração da sua rede e firewall.
- </string>
- <string name="dateTimeWeekdaysNames">
- Domingo:Segunda:Terça:Quarta:Quinta:Sexta:Sábado
- </string>
- <string name="dateTimeWeekdaysShortNames">
- Dom:Seg:Ter:Qua:Qui:Sex:Sab
- </string>
- <string name="dateTimeMonthNames">
- Janeiro:Fevereiro:Março:Abril:Maio:Junho:Julho:Agosto:Setembro:Outubro:Novembro:Dezembro
- </string>
- <string name="dateTimeMonthShortNames">
- Jan:Fev:Mar:Abr:Maio:Jun:Jul:Ago:Set:Out:Nov:Dez
- </string>
- <string name="dateTimeDayFormat">
- [MDAY]
- </string>
- <string name="dateTimeAM">
- AM
- </string>
- <string name="dateTimePM">
- PM
- </string>
- <string name="LocalEstimateUSD">
- US$ [AMOUNT]
- </string>
- <string name="Membership">
- Plano
- </string>
- <string name="Roles">
- Cargos
- </string>
- <string name="Group Identity">
- Identidade do lote
- </string>
- <string name="Parcel Management">
- Gestão do lote
- </string>
- <string name="Parcel Identity">
- ID do lote
- </string>
- <string name="Parcel Settings">
- Configurações do lote
- </string>
- <string name="Parcel Powers">
- Poderes do lote
- </string>
- <string name="Parcel Access">
- Acesso ao lote
- </string>
- <string name="Parcel Content">
- Conteúdo do lote
- </string>
- <string name="Object Management">
- Gestão de objetos
- </string>
- <string name="Accounting">
- Contabilidade
- </string>
- <string name="Notices">
- Avisos
- </string>
- <string name="Chat" value="Bate papo">
- Bate-papo
- </string>
- <string name="DeleteItems">
- Excluir itens selecionados?
- </string>
- <string name="DeleteItem">
- Excluir item selecionado?
- </string>
- <string name="EmptyOutfitText">
- Este look não possui nenhuma peça
- </string>
- <string name="ExternalEditorNotSet">
- Selecione um editor utilizando a configuração ExternalEditor.
- </string>
- <string name="ExternalEditorNotFound">
- O editor externo especificado não foi localizado.
-Tente colocar o caminho do editor entre aspas.
-(ex. &quot;/caminho para/editor&quot; &quot;%s&quot;)
- </string>
- <string name="ExternalEditorCommandParseError">
- Error ao analisar o comando do editor externo.
- </string>
- <string name="ExternalEditorFailedToRun">
- Falha de execução do editor externo.
- </string>
- <string name="TranslationFailed">
- Falha na tradução: [REASON]
- </string>
- <string name="TranslationResponseParseError">
- Erro ao analisar resposta de tradução.
- </string>
- <string name="Esc">
- Esc
- </string>
- <string name="Space">
- Space
- </string>
- <string name="Enter">
- Enter
- </string>
- <string name="Tab">
- Tab
- </string>
- <string name="Ins">
- Ins
- </string>
- <string name="Del">
- Del
- </string>
- <string name="Backsp">
- Backsp
- </string>
- <string name="Shift">
- Shift
- </string>
- <string name="Ctrl">
- Ctrl
- </string>
- <string name="Alt">
- Alt
- </string>
- <string name="CapsLock">
- CapsLock
- </string>
- <string name="Home">
- Início
- </string>
- <string name="End">
- End
- </string>
- <string name="PgUp">
- PgUp
- </string>
- <string name="PgDn">
- PgDn
- </string>
- <string name="F1">
- F1
- </string>
- <string name="F2">
- F2
- </string>
- <string name="F3">
- F3
- </string>
- <string name="F4">
- F4
- </string>
- <string name="F5">
- F5
- </string>
- <string name="F6">
- F6
- </string>
- <string name="F7">
- F7
- </string>
- <string name="F8">
- F8
- </string>
- <string name="F9">
- F9
- </string>
- <string name="F10">
- F10
- </string>
- <string name="F11">
- F11
- </string>
- <string name="F12">
- F12
- </string>
- <string name="Add">
- Adicionar
- </string>
- <string name="Subtract">
- Subtrair
- </string>
- <string name="Multiply">
- Multiplicar
- </string>
- <string name="Divide">
- Dividir
- </string>
- <string name="PAD_DIVIDE">
- PAD_DIVIDE
- </string>
- <string name="PAD_LEFT">
- PAD_LEFT
- </string>
- <string name="PAD_RIGHT">
- PAD_RIGHT
- </string>
- <string name="PAD_DOWN">
- PAD_DOWN
- </string>
- <string name="PAD_UP">
- PAD_UP
- </string>
- <string name="PAD_HOME">
- PAD_HOME
- </string>
- <string name="PAD_END">
- PAD_END
- </string>
- <string name="PAD_PGUP">
- PAD_PGUP
- </string>
- <string name="PAD_PGDN">
- PAD_PGDN
- </string>
- <string name="PAD_CENTER">
- PAD_CENTER
- </string>
- <string name="PAD_INS">
- PAD_INS
- </string>
- <string name="PAD_DEL">
- PAD_DEL
- </string>
- <string name="PAD_Enter">
- PAD_Enter
- </string>
- <string name="PAD_BUTTON0">
- PAD_BUTTON0
- </string>
- <string name="PAD_BUTTON1">
- PAD_BUTTON1
- </string>
- <string name="PAD_BUTTON2">
- PAD_BUTTON2
- </string>
- <string name="PAD_BUTTON3">
- PAD_BUTTON3
- </string>
- <string name="PAD_BUTTON4">
- PAD_BUTTON4
- </string>
- <string name="PAD_BUTTON5">
- PAD_BUTTON5
- </string>
- <string name="PAD_BUTTON6">
- PAD_BUTTON6
- </string>
- <string name="PAD_BUTTON7">
- PAD_BUTTON7
- </string>
- <string name="PAD_BUTTON8">
- PAD_BUTTON8
- </string>
- <string name="PAD_BUTTON9">
- PAD_BUTTON9
- </string>
- <string name="PAD_BUTTON10">
- PAD_BUTTON10
- </string>
- <string name="PAD_BUTTON11">
- PAD_BUTTON11
- </string>
- <string name="PAD_BUTTON12">
- PAD_BUTTON12
- </string>
- <string name="PAD_BUTTON13">
- PAD_BUTTON13
- </string>
- <string name="PAD_BUTTON14">
- PAD_BUTTON14
- </string>
- <string name="PAD_BUTTON15">
- PAD_BUTTON15
- </string>
- <string name="-">
- -
- </string>
- <string name="=">
- =
- </string>
- <string name="`">
- `
- </string>
- <string name=";">
- ;
- </string>
- <string name="[">
- [
- </string>
- <string name="]">
- ]
- </string>
- <string name="\">
- \
- </string>
- <string name="0">
- 0
- </string>
- <string name="1">
- 1
- </string>
- <string name="2">
- 2
- </string>
- <string name="3">
- 3
- </string>
- <string name="4">
- 4
- </string>
- <string name="5">
- 5
- </string>
- <string name="6">
- 6
- </string>
- <string name="7">
- 7
- </string>
- <string name="8">
- 8
- </string>
- <string name="9">
- 9
- </string>
- <string name="A">
- A
- </string>
- <string name="B">
- B
- </string>
- <string name="C">
- C
- </string>
- <string name="D">
- D
- </string>
- <string name="E">
- E
- </string>
- <string name="F">
- F
- </string>
- <string name="G">
- G
- </string>
- <string name="H">
- H
- </string>
- <string name="I">
- I
- </string>
- <string name="J">
- J
- </string>
- <string name="K">
- K
- </string>
- <string name="L">
- L
- </string>
- <string name="M">
- M
- </string>
- <string name="N">
- N
- </string>
- <string name="O">
- O
- </string>
- <string name="P">
- P
- </string>
- <string name="Q">
- Q
- </string>
- <string name="R">
- R
- </string>
- <string name="S">
- S
- </string>
- <string name="T">
- T
- </string>
- <string name="U">
- U
- </string>
- <string name="V">
- V
- </string>
- <string name="W">
- W
- </string>
- <string name="X">
- X
- </string>
- <string name="Y">
- Y
- </string>
- <string name="Z">
- Z
- </string>
- <string name="BeaconParticle">
- Vendo balizas de partículas (azul)
- </string>
- <string name="BeaconPhysical">
- Vendo balizas de objetos físicos (verde)
- </string>
- <string name="BeaconScripted">
- Vendo balizas de objetos com script (vermelho)
- </string>
- <string name="BeaconScriptedTouch">
- Vendo objeto com script com balizas com funcionalidade de toque (vermelho)
- </string>
- <string name="BeaconSound">
- Vendo balizas de som (amarelo)
- </string>
- <string name="BeaconMedia">
- Vendo balizas de mídia (branco)
- </string>
- <string name="ParticleHiding">
- Ocultar partículas
- </string>
- <string name="Command_AboutLand_Label">
- Sobre terrenos
- </string>
- <string name="Command_Appearance_Label">
- Aparência
- </string>
- <string name="Command_Avatar_Label">
- Avatar
- </string>
- <string name="Command_Build_Label">
- Construir
- </string>
- <string name="Command_Chat_Label">
- Bate-papo
- </string>
- <string name="Command_Compass_Label">
- Bússola
- </string>
- <string name="Command_Destinations_Label">
- Destinos
- </string>
- <string name="Command_Gestures_Label">
- Gestos
- </string>
- <string name="Command_HowTo_Label">
- Como
- </string>
- <string name="Command_Inventory_Label">
- Inventário
- </string>
- <string name="Command_Map_Label">
- Mapa
- </string>
- <string name="Command_Marketplace_Label">
- Mercado
- </string>
- <string name="Command_MiniMap_Label">
- Mini Mapa
- </string>
- <string name="Command_Move_Label">
- Andar/correr/voar
- </string>
- <string name="Command_Outbox_Label">
- Caixa de saída do lojista
- </string>
- <string name="Command_People_Label">
- Pessoas
- </string>
- <string name="Command_Picks_Label">
- Destaques
- </string>
- <string name="Command_Places_Label">
- Lugares
- </string>
- <string name="Command_Preferences_Label">
- Preferências
- </string>
- <string name="Command_Profile_Label">
- Perfil
- </string>
- <string name="Command_Search_Label">
- Buscar
- </string>
- <string name="Command_Snapshot_Label">
- Foto
- </string>
- <string name="Command_Speak_Label">
- Falar
- </string>
- <string name="Command_View_Label">
- Controles da câmera
- </string>
- <string name="Command_Voice_Label">
- Configurações de voz
- </string>
- <string name="Command_AboutLand_Tooltip">
- Informações sobre o terreno que você está visitando
- </string>
- <string name="Command_Appearance_Tooltip">
- Mudar seu avatar
- </string>
- <string name="Command_Avatar_Tooltip">
- Escolha um avatar completo
- </string>
- <string name="Command_Build_Tooltip">
- Construindo objetos e redimensionando terreno
- </string>
- <string name="Command_Chat_Tooltip">
- Bater papo com pessoas próximas usando texto
- </string>
- <string name="Command_Compass_Tooltip">
- Bússola
- </string>
- <string name="Command_Destinations_Tooltip">
- Destinos de interesse
- </string>
- <string name="Command_Gestures_Tooltip">
- Gestos para seu avatar
- </string>
- <string name="Command_HowTo_Tooltip">
- Como executar tarefas comuns
- </string>
- <string name="Command_Inventory_Tooltip">
- Exibir e usar seus pertences
- </string>
- <string name="Command_Map_Tooltip">
- Mapa-múndi
- </string>
- <string name="Command_Marketplace_Tooltip">
- Faça compras
- </string>
- <string name="Command_MiniMap_Tooltip">
- Mostrar quem está aqui
- </string>
- <string name="Command_Move_Tooltip">
- Movendo seu avatar
- </string>
- <string name="Command_Outbox_Tooltip">
- Transferir itens para o seu mercado para venda
- </string>
- <string name="Command_People_Tooltip">
- Amigos, grupos e pessoas próximas
- </string>
- <string name="Command_Picks_Tooltip">
- Lugares mostrados como favoritos em seu perfil
- </string>
- <string name="Command_Places_Tooltip">
- Lugares salvos
- </string>
- <string name="Command_Preferences_Tooltip">
- Preferências
- </string>
- <string name="Command_Profile_Tooltip">
- Edite ou visualize seu perfil
- </string>
- <string name="Command_Search_Tooltip">
- Encontre lugares, eventos, pessoas
- </string>
- <string name="Command_Snapshot_Tooltip">
- Tirar uma foto
- </string>
- <string name="Command_Speak_Tooltip">
- Fale com pessoas próximas usando seu microfone
- </string>
- <string name="Command_View_Tooltip">
- Alterar o ângulo da câmera
- </string>
- <string name="Command_Voice_Tooltip">
- Controles de volume das chamadas e pessoas próximas a você no mundo virtual
- </string>
- <string name="Toolbar_Bottom_Tooltip">
- atualmente na sua barra de ferramentas inferior
- </string>
- <string name="Toolbar_Left_Tooltip">
- atualmente na sua barra de ferramentas esquerda
- </string>
- <string name="Toolbar_Right_Tooltip">
- atualmente na sua barra de ferramentas direita
- </string>
- <string name="Retain%">
- Reter%
- </string>
- <string name="Detail">
- Detalhe
- </string>
- <string name="Better Detail">
- Detalhamento maior
- </string>
- <string name="Surface">
- Superfície
- </string>
- <string name="Solid">
- Sólido
- </string>
- <string name="Wrap">
- Conclusão
- </string>
- <string name="Preview">
- Visualizar
- </string>
- <string name="Normal">
- Normal
- </string>
- <string name="snapshot_quality_very_low">
- Muito baixo
- </string>
- <string name="snapshot_quality_low">
- Baixo
- </string>
- <string name="snapshot_quality_medium">
- Médio
- </string>
- <string name="snapshot_quality_high">
- Alto
- </string>
- <string name="snapshot_quality_very_high">
- Muito alto
- </string>
-</strings>
diff --git a/indra/newview/skins/steam/xui/ru/strings.xml b/indra/newview/skins/steam/xui/ru/strings.xml
deleted file mode 100644
index 2b4c6e6f48..0000000000
--- a/indra/newview/skins/steam/xui/ru/strings.xml
+++ /dev/null
@@ -1,5024 +0,0 @@
-<?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
- 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
- </string>
- <string name="SUPPORT_SITE">
- Портал поддержки Second Life
- </string>
- <string name="StartupDetectingHardware">
- Проверка оборудования...
- </string>
- <string name="StartupLoading">
- Загружается [APP_NAME]...
- </string>
- <string name="StartupClearingCache">
- Очистка кэша...
- </string>
- <string name="StartupInitializingTextureCache">
- Инициализация кэша текстур...
- </string>
- <string name="StartupInitializingVFS">
- Инициализация виртуальной файловой системы...
- </string>
- <string name="StartupRequireDriverUpdate">
- Ошибка инициализации графики. Обновите графический драйвер!
- </string>
- <string name="ProgressRestoring">
- Восстановление...
- </string>
- <string name="ProgressChangingResolution">
- Изменение разрешения...
- </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]
- </string>
- <string name="LoginPrecaching">
- Загрузка мира...
- </string>
- <string name="LoginInitializingBrowser">
- Инициализация встроенного веб-браузера...
- </string>
- <string name="LoginInitializingMultimedia">
- Инициализация мультимедиа...
- </string>
- <string name="LoginInitializingFonts">
- Загрузка шрифтов...
- </string>
- <string name="LoginVerifyingCache">
- Проверка файлов кэша (может занять 60-90 с)...
- </string>
- <string name="LoginProcessingResponse">
- Обработка ответа...
- </string>
- <string name="LoginInitializingWorld">
- Инициализация мира...
- </string>
- <string name="LoginDecodingImages">
- Декодирование изображений...
- </string>
- <string name="LoginInitializingQuicktime">
- Инициализация QuickTime...
- </string>
- <string name="LoginQuicktimeNotFound">
- QuickTime не найден – ошибка инициализации.
- </string>
- <string name="LoginQuicktimeOK">
- Успешная инициализация QuickTime.
- </string>
- <string name="LoginRequestSeedCapGrant">
- Запрос возможностей региона...
- </string>
- <string name="LoginRetrySeedCapGrant">
- Запрос возможностей региона, попытка [NUMBER]...
- </string>
- <string name="LoginWaitingForRegionHandshake">
- Устанавливается связь с регионом...
- </string>
- <string name="LoginConnectingToRegion">
- Подключение к региону...
- </string>
- <string name="LoginDownloadingClothing">
- Загрузка одежды...
- </string>
- <string name="InvalidCertificate">
- Сервер возвратил недействительный или поврежденный сертификат. Обратитесь к администратору сетки.
- </string>
- <string name="CertInvalidHostname">
- Для доступа к серверу использовалось недействительное имя узла. Проверьте URL-адрес SL или имя узла в сетке.
- </string>
- <string name="CertExpired">
- Судя по всему, истек срок действия сертификата, возвращенного сеткой. Проверьте время, установленное в системе, или обратитесь к администратору сетки.
- </string>
- <string name="CertKeyUsage">
- Не удалось использовать в протоколе SSL сертификат, возвращенный сервером. Обратитесь к администратору сетки.
- </string>
- <string name="CertBasicConstraints">
- В цепочке сертификатов серверов слишком много сертификатов. Обратитесь к администратору сетки.
- </string>
- <string name="CertInvalidSignature">
- Не удалось проверить подпись сертификата, возвращенного сервером сетки. Обратитесь к администратору сетки.
- </string>
- <string name="LoginFailedNoNetwork">
- Ошибка сети: не удалось установить соединение. Проверьте подключение к сети.
- </string>
- <string name="LoginFailed">
- Ошибка входа.
- </string>
- <string name="Quit">
- Выйти
- </string>
- <string name="create_account_url">
- http://join.secondlife.com/index.php?sourceid=1206_steam&amp;lang=ru-RU
- </string>
- <string name="LoginFailedViewerNotPermitted">
- У клиента, которым вы пользуетесь, больше нет доступа к игре Second Life. Загрузить новую версию клиента можно по адресу
-http://secondlife.com/download
-
-Дополнительные сведения см. в разделе вопросов и ответов по адресу
-http://secondlife.com/viewer-access-faq
- </string>
- <string name="LoginIntermediateOptionalUpdateAvailable">
- Доступно необязательное обновление клиента: [VERSION]
- </string>
- <string name="LoginFailedRequiredUpdate">
- Необходимо обновить клиент: [VERSION]
- </string>
- <string name="LoginFailedAlreadyLoggedIn">
- С этого клиента уже выполнен вход.
- </string>
- <string name="LoginFailedAuthenticationFailed">
- Извините! Не удается обеспечить ваш вход.
-Убедитесь, что вы правильно ввели:
- * имя пользователя (например, bobsmith12 или steller.sunshine)
- * пароль
-Кроме того, убедитесь, что режим Caps Lock отключен.
- </string>
- <string name="LoginFailedPasswordChanged">
- В качестве меры предосторожности ваш пароль изменен.
-Перейдите на страницу своего аккаунта по адресу http://secondlife.com/password
-и ответьте на контрольный вопрос, чтобы восстановить свой пароль
-Приносим извинения за неудобство.
- </string>
- <string name="LoginFailedPasswordReset">
- В нашу систему внесены изменения, поэтому вам следует восстановить свой пароль.
-Перейдите на страницу своего аккаунта по адресу http://secondlife.com/password
-и ответьте на контрольный вопрос, чтобы восстановить свой пароль
-Приносим извинения за неудобство.
- </string>
- <string name="LoginFailedEmployeesOnly">
- Сайт Second Life временно закрыт на техническое обслуживание.
-В данное время входить могут только сотрудники.
-Обновление состояния см. на веб-странице www.secondlife.com/status.
- </string>
- <string name="LoginFailedPremiumOnly">
- Вход в Second Life временно ограничен, чтобы сохранить наивысшее качество игрового мира для текущих пользователей.
-
-В это время у пользователей с бесплатными аккаунтами не будет доступа к Second Life, чтобы у тех, кто заплатил, было больше места.
- </string>
- <string name="LoginFailedComputerProhibited">
- Нельзя входить в игру Second Life на этом компьютере.
-Если вы считаете, что это ошибка, отправьте сообщение по адресу
-support@secondlife.com.
- </string>
- <string name="LoginFailedAcountSuspended">
- Ваш аккаунт не будет доступен до
-[TIME] по тихоокеанскому времени.
- </string>
- <string name="LoginFailedAccountDisabled">
- В данное время нам не удается выполнить ваш запрос.
-Обратитесь за помощью в службу поддержки Second Life по адресу http://secondlife.com/support.
-Если вам не удается изменить свой пароль, позвоните по телефону (866) 476-9763.
- </string>
- <string name="LoginFailedTransformError">
- При входе обнаружена несогласованность данных.
-Напишите сообщения по адресу support@secondlife.com.
- </string>
- <string name="LoginFailedAccountMaintenance">
- Выполняется небольшое обслуживание вашего аккаунта.
-Ваш аккаунт не будет доступен до
-[TIME] по тихоокеанскому времени.
-Если вы считаете, что это ошибка, отправьте сообщение по адресу support@secondlife.com.
- </string>
- <string name="LoginFailedPendingLogoutFault">
- В ответ на запрос выхода симулятор возвратил сообщение о сбое.
- </string>
- <string name="LoginFailedPendingLogout">
- В системе выполняется выход для вашего аккаунта.
-Она будет недоступна до
-[TIME] по тихоокеанскому времени.
- </string>
- <string name="LoginFailedUnableToCreateSession">
- Не удается создать допустимый сеанс.
- </string>
- <string name="LoginFailedUnableToConnectToSimulator">
- Не удается подключиться к симулятору.
- </string>
- <string name="LoginFailedRestrictedHours">
- Вы можете входить в Second Life только
-от [START] до [END] по тихоокеанскому времени.
-Заходите в это время.
-Если вы считаете, что это ошибка, отправьте сообщение по адресу support@secondlife.com.
- </string>
- <string name="LoginFailedIncorrectParameters">
- Неправильные параметры.
-Если вы считаете, что это ошибка, отправьте сообщение по адресу support@secondlife.com.
- </string>
- <string name="LoginFailedFirstNameNotAlphanumeric">
- Имя должно состоять только из букв и цифр.
-Если вы считаете, что это ошибка, отправьте сообщение по адресу support@secondlife.com.
- </string>
- <string name="LoginFailedLastNameNotAlphanumeric">
- Фамилия должна состоять только из букв и цифр.
-Если вы считаете, что это ошибка, отправьте сообщение по адресу support@secondlife.com.
- </string>
- <string name="LogoutFailedRegionGoingOffline">
- Регион переходит в автономный режим.
-Попробуйте повторно войти через минуту.
- </string>
- <string name="LogoutFailedAgentNotInRegion">
- Агент отсутствует в регионе.
-Попробуйте повторно войти через минуту.
- </string>
- <string name="LogoutFailedPendingLogin">
- Вход в регион выполнен в другом сеансе.
-Попробуйте повторно войти через минуту.
- </string>
- <string name="LogoutFailedLoggingOut">
- Для региона выполнен выход в предыдущем сеансе.
-Попробуйте повторно войти через минуту.
- </string>
- <string name="LogoutFailedStillLoggingOut">
- Для региона все еще выполняется выход в предыдущем сеансе.
-Попробуйте повторно войти через минуту.
- </string>
- <string name="LogoutSucceeded">
- В последнем сеансе для региона выполнен выход.
-Попробуйте повторно войти через минуту.
- </string>
- <string name="LogoutFailedLogoutBegun">
- Для региона начат процесс выхода.
-Попробуйте повторно войти через минуту.
- </string>
- <string name="LoginFailedLoggingOutSession">
- Во время вашего последнего сеанса система начала процедуру выхода.
-Попробуйте повторно войти через минуту.
- </string>
- <string name="AgentLostConnection">
- Возможно, в этом регионе возникли проблемы. Проверьте подключение к Интернету.
- </string>
- <string name="SavingSettings">
- Сохранение настроек...
- </string>
- <string name="LoggingOut">
- Выполняется выход...
- </string>
- <string name="ShuttingDown">
- Игра закрывается...
- </string>
- <string name="YouHaveBeenDisconnected">
- Произошло отключение от региона, в котором вы находились.
- </string>
- <string name="SentToInvalidRegion">
- Вы отправлены в недействительный регион.
- </string>
- <string name="TestingDisconnect">
- Тестирование отключения клиента
- </string>
- <string name="TooltipPerson">
- Человек
- </string>
- <string name="TooltipNoName">
- (нет имени)
- </string>
- <string name="TooltipOwner">
- Владелец:
- </string>
- <string name="TooltipPublic">
- Общедоступно
- </string>
- <string name="TooltipIsGroup">
- (группа)
- </string>
- <string name="TooltipForSaleL$">
- Продается: L$[AMOUNT]
- </string>
- <string name="TooltipFlagGroupBuild">
- Стройка в составе группы
- </string>
- <string name="TooltipFlagNoBuild">
- Стройка запрещена
- </string>
- <string name="TooltipFlagNoEdit">
- Стройка в составе группы
- </string>
- <string name="TooltipFlagNotSafe">
- Небезопасно
- </string>
- <string name="TooltipFlagNoFly">
- Полеты запрещены
- </string>
- <string name="TooltipFlagGroupScripts">
- Скрипты для группы
- </string>
- <string name="TooltipFlagNoScripts">
- Скрипты запрещены
- </string>
- <string name="TooltipLand">
- Земля:
- </string>
- <string name="TooltipMustSingleDrop">
- Сюда можно перетащить только одну вещь
- </string>
- <string name="TooltipPrice" value="L$[AMOUNT]:"/>
- <string name="TooltipOutboxDragToWorld">
- Нельзя выложить предметы из папке «Торговые исходящие»
- </string>
- <string name="TooltipOutboxNoTransfer">
- Часть этих объектов нельзя продать или передать.
- </string>
- <string name="TooltipOutboxNotInInventory">
- Ваша папка «Торговые исходящие» может получать вещи только непосредственно из вашего инвентаря
- </string>
- <string name="TooltipOutboxWorn">
- Носимые предметы нельзя поместить в папку «Торговые исходящие»
- </string>
- <string name="TooltipOutboxCallingCard">
- Визитки нельзя поместить в папку «Торговые исходящие»
- </string>
- <string name="TooltipOutboxFolderLevels">
- Глубина вложения папок превышает 3
- </string>
- <string name="TooltipOutboxTooManyFolders">
- В папке верхнего уровня более 20 подпапок
- </string>
- <string name="TooltipOutboxTooManyObjects">
- В папке верхнего уровня более 200 предметов
- </string>
- <string name="TooltipDragOntoOwnChild">
- Папку нельзя переместить в ее подпапку
- </string>
- <string name="TooltipDragOntoSelf">
- Папку нельзя переместить саму в себя
- </string>
- <string name="TooltipHttpUrl">
- Щелкните, чтобы просмотреть эту веб-страницу
- </string>
- <string name="TooltipSLURL">
- Щелкните, чтобы просмотреть информацию об этом месте
- </string>
- <string name="TooltipAgentUrl">
- Щелкните, чтобы просмотреть профиль этого жителя
- </string>
- <string name="TooltipAgentInspect">
- Узнать больше об этом жителе
- </string>
- <string name="TooltipAgentMute">
- Щелкните, чтобы не слышать этого жителя
- </string>
- <string name="TooltipAgentUnmute">
- Щелкните, чтобы слышать этого жителя
- </string>
- <string name="TooltipAgentIM">
- Щелкните, чтобы открыть личный чат с этим жителем
- </string>
- <string name="TooltipAgentPay">
- Щелкните, чтобы заплатить жителю
- </string>
- <string name="TooltipAgentOfferTeleport">
- Щелкните, чтобы предложить этому жителю телепортацию
- </string>
- <string name="TooltipAgentRequestFriend">
- Щелкните, чтобы предложить этому жителю дружбу
- </string>
- <string name="TooltipGroupUrl">
- Щелкните, чтобы просмотреть описание группы
- </string>
- <string name="TooltipEventUrl">
- Щелкните, чтобы просмотреть описание события
- </string>
- <string name="TooltipClassifiedUrl">
- Щелкните, чтобы просмотреть эту рекламу
- </string>
- <string name="TooltipParcelUrl">
- Щелкните, чтобы посмотреть описание участка
- </string>
- <string name="TooltipTeleportUrl">
- Щелкните, чтобы телепортироваться в это место
- </string>
- <string name="TooltipObjectIMUrl">
- Щелкните, открыть описание этого объекта
- </string>
- <string name="TooltipMapUrl">
- Щелкните, чтобы посмотреть это место на карте
- </string>
- <string name="TooltipSLAPP">
- Щелкните, чтобы выполнить команду secondlife://
- </string>
- <string name="CurrentURL" value="Текущий URL-адрес: [CurrentURL]"/>
- <string name="SLurlLabelTeleport">
- Телепортироваться в
- </string>
- <string name="SLurlLabelShowOnMap">
- Показать карту для
- </string>
- <string name="SLappAgentMute">
- Откл. звук
- </string>
- <string name="SLappAgentUnmute">
- Вкл. звук
- </string>
- <string name="SLappAgentIM">
- IM
- </string>
- <string name="SLappAgentPay">
- Заплатить
- </string>
- <string name="SLappAgentOfferTeleport">
- Предложить телепортацию в
- </string>
- <string name="SLappAgentRequestFriend">
- Предложить дружбу
- </string>
- <string name="BUTTON_CLOSE_DARWIN">
- Закрыть (⌘W)
- </string>
- <string name="BUTTON_CLOSE_WIN">
- Закрыть (Ctrl+W)
- </string>
- <string name="BUTTON_CLOSE_CHROME">
- Закрыть
- </string>
- <string name="BUTTON_RESTORE">
- Развернуть
- </string>
- <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="AvatarNameMultiple">
- (несколько)
- </string>
- <string name="GroupNameNone">
- (нет)
- </string>
- <string name="AvalineCaller">
- [ORDER] абонента Avaline
- </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="snapshot">
- снимок
- </string>
- <string name="lost and found">
- найденные вещи
- </string>
- <string name="targa image">
- изображение TGA
- </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="symbolic folder link">
- ссылку на папку
- </string>
- <string name="mesh">
- сетка
- </string>
- <string name="AvatarEditingAppearance">
- (внешний вид редактируется)
- </string>
- <string name="AvatarAway">
- Нет на месте
- </string>
- <string name="AvatarBusy">
- Не беспокоить
- </string>
- <string name="AvatarMuted">
- В черном списке
- </string>
- <string name="anim_express_afraid">
- Страх
- </string>
- <string name="anim_express_anger">
- Гнев
- </string>
- <string name="anim_away">
- Нет на месте
- </string>
- <string name="anim_backflip">
- Сальто назад
- </string>
- <string name="anim_express_laugh">
- Хохот
- </string>
- <string name="anim_express_toothsmile">
- Широкая улыбка
- </string>
- <string name="anim_blowkiss">
- Воздушный поцелуй
- </string>
- <string name="anim_express_bored">
- Скука
- </string>
- <string name="anim_bow">
- Поклон
- </string>
- <string name="anim_clap">
- Хлопок
- </string>
- <string name="anim_courtbow">
- Учтивый поклон
- </string>
- <string name="anim_express_cry">
- Плач
- </string>
- <string name="anim_dance1">
- Танец 1
- </string>
- <string name="anim_dance2">
- Танец 2
- </string>
- <string name="anim_dance3">
- Танец 3
- </string>
- <string name="anim_dance4">
- Танец 4
- </string>
- <string name="anim_dance5">
- Танец 5
- </string>
- <string name="anim_dance6">
- Танец 6
- </string>
- <string name="anim_dance7">
- Танец 7
- </string>
- <string name="anim_dance8">
- Танец 8
- </string>
- <string name="anim_express_disdain">
- Презрение
- </string>
- <string name="anim_drink">
- Питьё
- </string>
- <string name="anim_express_embarrased">
- Смущение
- </string>
- <string name="anim_angry_fingerwag">
- Погрозить пальцем
- </string>
- <string name="anim_fist_pump">
- Поднимание кулака
- </string>
- <string name="anim_yoga_float">
- Парящий Будда
- </string>
- <string name="anim_express_frown">
- Хмурость
- </string>
- <string name="anim_impatient">
- Нетерпение
- </string>
- <string name="anim_jumpforjoy">
- Прыжок радости
- </string>
- <string name="anim_kissmybutt">
- Поцелуй в зад
- </string>
- <string name="anim_express_kiss">
- Поцелуй
- </string>
- <string name="anim_laugh_short">
- Смех
- </string>
- <string name="anim_musclebeach">
- Демонстрация мускулов
- </string>
- <string name="anim_no_unhappy">
- Грустный отказ
- </string>
- <string name="anim_no_head">
- Отказ
- </string>
- <string name="anim_nyanya">
- Ня-ня-ня
- </string>
- <string name="anim_punch_onetwo">
- Двойка руками
- </string>
- <string name="anim_express_open_mouth">
- Открывание рта
- </string>
- <string name="anim_peace">
- Дружелюбие
- </string>
- <string name="anim_point_you">
- Указывание на кого-то
- </string>
- <string name="anim_point_me">
- Указывание на себя
- </string>
- <string name="anim_punch_l">
- Удар левой рукой
- </string>
- <string name="anim_punch_r">
- Удар правой рукой
- </string>
- <string name="anim_rps_countdown">
- Счет в КНБ
- </string>
- <string name="anim_rps_paper">
- КНБ – бумага
- </string>
- <string name="anim_rps_rock">
- КНБ – камень
- </string>
- <string name="anim_rps_scissors">
- КНБ – ножницы
- </string>
- <string name="anim_express_repulsed">
- Отказ
- </string>
- <string name="anim_kick_roundhouse_r">
- «Вертушка»
- </string>
- <string name="anim_express_sad">
- Грусть
- </string>
- <string name="anim_salute">
- Приветствие
- </string>
- <string name="anim_shout">
- Крик
- </string>
- <string name="anim_express_shrug">
- Пожимание плечами
- </string>
- <string name="anim_express_smile">
- Улыбка
- </string>
- <string name="anim_smoke_idle">
- Курение не в затяжку
- </string>
- <string name="anim_smoke_inhale">
- Курение в затяжку
- </string>
- <string name="anim_smoke_throw_down">
- Бросить сигарету
- </string>
- <string name="anim_express_surprise">
- Удивление
- </string>
- <string name="anim_sword_strike_r">
- Удар мечом
- </string>
- <string name="anim_angry_tantrum">
- Вспышка гнева
- </string>
- <string name="anim_express_tongue_out">
- Показ языка
- </string>
- <string name="anim_hello">
- Приветствие рукой
- </string>
- <string name="anim_whisper">
- Шепот
- </string>
- <string name="anim_whistle">
- Свист
- </string>
- <string name="anim_express_wink">
- Подмигивание
- </string>
- <string name="anim_wink_hollywood">
- Подмигивание по-голливудски
- </string>
- <string name="anim_express_worry">
- Беспокойство
- </string>
- <string name="anim_yes_happy">
- Радостное согласие
- </string>
- <string name="anim_yes_head">
- Согласие
- </string>
- <string name="multiple_textures">
- Несколько
- </string>
- <string name="texture_loading">
- Загрузка...
- </string>
- <string name="worldmap_offline">
- Не в сети
- </string>
- <string name="worldmap_item_tooltip_format">
- [AREA] м² L$[PRICE]
- </string>
- <string name="worldmap_results_none_found">
- Ничего не найдено.
- </string>
- <string name="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">
- Объекту «[OBJECTNAME]», который принадлежит пользователю «[OWNERNAME]» и находится в [REGIONPOS] в регионе «[REGIONNAME]», предоставлено разрешение: [PERMISSIONS].
- </string>
- <string name="ScriptQuestionCautionChatDenied">
- Объекту «[OBJECTNAME]», который принадлежит пользователю «[OWNERNAME]» и находится в [REGIONPOS] в регионе «[REGIONNAME]», отказано в разрешении: [PERMISSIONS].
- </string>
- <string name="ScriptTakeMoney">
- У вас берут Linden-деньги
- </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">
- Общий
- </string>
- <string name="SIM_ACCESS_MATURE">
- Умеренный
- </string>
- <string name="SIM_ACCESS_ADULT">
- Для взрослых
- </string>
- <string name="SIM_ACCESS_DOWN">
- Не в сети
- </string>
- <string name="SIM_ACCESS_MIN">
- Неизвестно
- </string>
- <string name="land_type_unknown">
- (неизвестно)
- </string>
- <string name="Estate / Full Region">
- Землевладение/весь регион
- </string>
- <string name="Estate / Homestead">
- Землевладение/поместье
- </string>
- <string name="Mainland / Homestead">
- Материк/поместье
- </string>
- <string name="Mainland / Full Region">
- Материк/весь регион
- </string>
- <string name="all_files">
- Все файлы
- </string>
- <string name="sound_files">
- Звуки
- </string>
- <string name="animation_files">
- Анимация
- </string>
- <string name="image_files">
- Изображения
- </string>
- <string name="save_file_verb">
- Сохранить
- </string>
- <string name="load_file_verb">
- Загрузить
- </string>
- <string name="targa_image_files">
- Изображения TGA
- </string>
- <string name="bitmap_image_files">
- Изображения BMP
- </string>
- <string name="avi_movie_file">
- Видео AVI
- </string>
- <string name="xaf_animation_file">
- Анимация XAF
- </string>
- <string name="xml_file">
- XML-файл
- </string>
- <string name="raw_file">
- RAW-файл
- </string>
- <string name="compressed_image_files">
- Несжатые изображения
- </string>
- <string name="load_files">
- Загрузить файлы
- </string>
- <string name="choose_the_directory">
- Выбрать каталог
- </string>
- <string name="script_files">
- Скрипты
- </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="physics">
- Физические данные
- </string>
- <string name="invalid">
- ошибка
- </string>
- <string name="none">
- нет
- </string>
- <string name="shirt_not_worn">
- Рубашка не надета
- </string>
- <string name="pants_not_worn">
- Брюки не надеты
- </string>
- <string name="shoes_not_worn">
- Обувь не надета
- </string>
- <string name="socks_not_worn">
- Носки не надеты
- </string>
- <string name="jacket_not_worn">
- Пиджак не надет
- </string>
- <string name="gloves_not_worn">
- Перчатки не надеты
- </string>
- <string name="undershirt_not_worn">
- Майка не надета
- </string>
- <string name="underpants_not_worn">
- Трусы не надеты
- </string>
- <string name="skirt_not_worn">
- Юбка не надета
- </string>
- <string name="alpha_not_worn">
- Альфа-маска не надета
- </string>
- <string name="tattoo_not_worn">
- Тату не надето
- </string>
- <string name="physics_not_worn">
- Физика не учитывается
- </string>
- <string name="invalid_not_worn">
- ошибка
- </string>
- <string name="create_new_shape">
- Создать фигуру
- </string>
- <string name="create_new_skin">
- Создать кожу
- </string>
- <string name="create_new_hair">
- Создать волосы
- </string>
- <string name="create_new_eyes">
- Создать глаза
- </string>
- <string name="create_new_shirt">
- Создать рубашку
- </string>
- <string name="create_new_pants">
- Создать брюки
- </string>
- <string name="create_new_shoes">
- Создать обувь
- </string>
- <string name="create_new_socks">
- Создать носки
- </string>
- <string name="create_new_jacket">
- Создать пиджак
- </string>
- <string name="create_new_gloves">
- Создать перчатки
- </string>
- <string name="create_new_undershirt">
- Создать майку
- </string>
- <string name="create_new_underpants">
- Создать трусы
- </string>
- <string name="create_new_skirt">
- Создать юбку
- </string>
- <string name="create_new_alpha">
- Создать альфа-маску
- </string>
- <string name="create_new_tattoo">
- Создать тату
- </string>
- <string name="create_new_physics">
- Создать физику
- </string>
- <string name="create_new_invalid">
- ошибка
- </string>
- <string name="NewWearable">
- Создать [WEARABLE_ITEM]
- </string>
- <string name="next">
- Далее
- </string>
- <string name="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/all/[SEARCH_TERM] поиском].
- </string>
- <string name="PlacesNoMatchingItems">
- Не нашли того, что вам нужно? Воспользуйтесь [secondlife:///app/search/places/[SEARCH_TERM] поиском].
- </string>
- <string name="FavoritesNoMatchingItems">
- Перетащите сюда закладку, чтобы добавить ее в список избранного.
- </string>
- <string name="InventoryNoTexture">
- В вашем инвентаре нет копии этой текстуры
- </string>
- <string name="InventoryInboxNoItems">
- Здесь будут показаны ваши покупки из торгового центра. Их можно будет перетащить в ваш инвентарь для использования.
- </string>
- <string name="MarketplaceURL">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
- </string>
- <string name="MarketplaceURL_CreateStore">
- http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
- </string>
- <string name="MarketplaceURL_Dashboard">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
- </string>
- <string name="MarketplaceURL_Imports">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
- </string>
- <string name="MarketplaceURL_LearnMore">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
- </string>
- <string name="InventoryOutboxNotMerchantTitle">
- Продавать вещи в торговом центре может кто угодно.
- </string>
- <string name="InventoryOutboxNotMerchantTooltip"/>
- <string name="InventoryOutboxNotMerchant">
- Если вы хотите стать торговцем, [[MARKETPLACE_CREATE_STORE_URL] создайте магазин].
- </string>
- <string name="InventoryOutboxNoItemsTitle">
- Ваша папка «Исходящие» пуста.
- </string>
- <string name="InventoryOutboxNoItemsTooltip"/>
- <string name="InventoryOutboxNoItems">
- Перетащите папки в эту область и щелкните «Отправить в торговый центр», чтобы выставить их на продажу в [[MARKETPLACE_DASHBOARD_URL] Торговом центре].
- </string>
- <string name="Marketplace Error None">
- Ошибок нет
- </string>
- <string name="Marketplace Error Not Merchant">
- Ошибка. Прежде чем отправлять вещи в магазин, необходимо зарегистрироваться как торговец (бесплатно).
- </string>
- <string name="Marketplace Error Empty Folder">
- Ошибка. В этой папке нет контента.
- </string>
- <string name="Marketplace Error Unassociated Products">
- Ошибка. Не удается передать эту вещь, поскольку в вашем торговом аккаунте слишком много вещей, не связанных с продуктами. Чтобы исправить эту ошибку, войдите на веб-сайт торгового центра и уменьшите число своих вещей, которые ни с чем не связаны.
- </string>
- <string name="Marketplace Error Object Limit">
- Ошибка. Эта вещь содержит слишком много объектов. Исправьте эту ошибку, сложив объекты в коробки и уменьшив их общее число (должно быть меньше 200).
- </string>
- <string name="Marketplace Error Folder Depth">
- Ошибка. Эта вещь содержит слишком много уровней вложенных папок. Измените структуру так, чтобы уровней вложенных папок было не более 3.
- </string>
- <string name="Marketplace Error Unsellable Item">
- Ошибка. Эту вещь нельзя продать в магазине.
- </string>
- <string name="Marketplace Error Internal Import">
- Ошибка. Эта вещь создает проблему. Повторите попытку позже.
- </string>
- <string name="Open landmarks">
- Открыть закладки
- </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="(broken_link)"/>
- <string name="LoadingContents">
- Загрузка содержимого...
- </string>
- <string name="NoContents">
- Нет контента
- </string>
- <string name="WornOnAttachmentPoint" value="(где носится: [ATTACHMENT_POINT])"/>
- <string name="ActiveGesture" value="[GESLABEL] (активно)"/>
- <string name="PermYes">
- Да
- </string>
- <string name="PermNo">
- Нет
- </string>
- <string name="Chat Message" value="Чат:"/>
- <string name="Sound" value="Звук:"/>
- <string name="Wait" value="--- Ждите:"/>
- <string name="AnimFlagStop" value="Остановить анимацию:"/>
- <string name="AnimFlagStart" value="Начать анимацию:"/>
- <string name="Wave" value="Приветствие рукой"/>
- <string name="GestureActionNone" value="Нет"/>
- <string name="HelloAvatar" value="Привет, аватар!"/>
- <string name="ViewAllGestures" value="Просмотреть все &gt;&gt;"/>
- <string name="GetMoreGestures" value="Дополнительно &gt;&gt;"/>
- <string name="Animations" value="Анимация,"/>
- <string name="Calling Cards" value="Визитки,"/>
- <string name="Clothing" value="Одежда,"/>
- <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 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 favorite">
- Мое избранное
- </string>
- <string name="InvFolder Current Outfit">
- Текущий костюм
- </string>
- <string name="InvFolder Initial Outfits">
- Начальные костюмы
- </string>
- <string name="InvFolder My Outfits">
- Мои костюмы
- </string>
- <string name="InvFolder Accessories">
- Аксессуары
- </string>
- <string name="InvFolder Meshes">
- Меши
- </string>
- <string name="InvFolder Friends">
- Друзья
- </string>
- <string name="InvFolder All">
- Все
- </string>
- <string name="no_attachments">
- Нет прикрепленных объектов
- </string>
- <string name="Attachments remain">
- Присоединения (осталось гнезд: [COUNT])
- </string>
- <string name="Buy">
- Купить
- </string>
- <string name="BuyforL$">
- Купить за 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="Neck">
- Шея
- </string>
- <string name="Avatar Center">
- Центр аватара
- </string>
- <string name="Invalid Attachment">
- Неверная точка присоединения
- </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">
- Объект [OBJECT] пользователя [OWNER]
- </string>
- <string name="GroupsNone">
- нет
- </string>
- <string name="Group" value="(группа)"/>
- <string name="Unknown">
- (Неизвестно)
- </string>
- <string name="SummaryForTheWeek" value="Сводка за неделю, начиная с"/>
- <string name="NextStipendDay" value="Дата очередного жалования:"/>
- <string name="GroupPlanningDate">
- [day,datetime,utc].[mthnum,datetime,utc].[year,datetime,utc]
- </string>
- <string name="GroupIndividualShare" value="Для группы Персонально Совместно"/>
- <string name="GroupColumn" value="Группа"/>
- <string name="Balance">
- Баланс
- </string>
- <string name="Credits">
- Расход
- </string>
- <string name="Debits">
- Приход
- </string>
- <string name="Total">
- Итого
- </string>
- <string name="NoGroupDataFound">
- Не найдены данные для группы
- </string>
- <string name="IMParentEstate">
- родовое землевладение
- </string>
- <string name="IMMainland">
- материк
- </string>
- <string name="IMTeen">
- подростковый
- </string>
- <string name="Anyone">
- все
- </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">
- Используется памяти: [COUNT] КБ из [MAX] КБ; доступно: [AVAILABLE] КБ
- </string>
- <string name="ScriptLimitsMemoryUsedSimple">
- Используется памяти: [COUNT] КБ
- </string>
- <string name="ScriptLimitsParcelScriptURLs">
- URL-адреса скрипта участков
- </string>
- <string name="ScriptLimitsURLsUsed">
- Используется URL-адресов: [COUNT] из [MAX] (доступно: [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">
- Данные в игре в центре 2
- </string>
- <string name="ATTACH_HUD_TOP_RIGHT">
- Данные в игре вверху справа
- </string>
- <string name="ATTACH_HUD_TOP_CENTER">
- Данные в игре вверху в центре
- </string>
- <string name="ATTACH_HUD_TOP_LEFT">
- Данные в игре вверху слева
- </string>
- <string name="ATTACH_HUD_CENTER_1">
- Данные в игре в центре 1
- </string>
- <string name="ATTACH_HUD_BOTTOM_LEFT">
- Данные в игре внизу слева
- </string>
- <string name="ATTACH_HUD_BOTTOM">
- Данные в игре внизу
- </string>
- <string name="ATTACH_HUD_BOTTOM_RIGHT">
- Данные в игре внизу справа
- </string>
- <string name="CursorPos">
- Строка [LINE], столбец [COLUMN]
- </string>
- <string name="PanelDirCountFound">
- Найдено: [COUNT]
- </string>
- <string name="PanelDirTimeStr">
- [hour,datetime,slt]:[min,datetime,slt]
- </string>
- <string name="PanelDirEventsDateText">
- [day,datetime,slt].[mthnum,datetime,slt]
- </string>
- <string name="PanelContentsTooltip">
- Подключение к объекту
- </string>
- <string name="PanelContentsNewScript">
- Новый скрипт
- </string>
- <string name="BusyModeResponseDefault">
- У адресата вашего сообщения задан статус «Не беспокоить». Ваше сообщение все равно будет отображено на панели IM для просмотра позже.
- </string>
- <string name="MuteByName">
- (по имени)
- </string>
- <string name="MuteAgent">
- (для жителя)
- </string>
- <string name="MuteObject">
- (для объекта)
- </string>
- <string name="MuteGroup">
- (для группы)
- </string>
- <string name="MuteExternal">
- (внешний)
- </string>
- <string name="RegionNoCovenant">
- Нет соглашения для этого землевладения.
- </string>
- <string name="RegionNoCovenantOtherOwner">
- Нет соглашения для этого землевладения. Земля в этом землевладении продается его владельцем, а не компанией Linden Lab. Чтобы узнать подробности о продаже, обратитесь к землевладельцу.
- </string>
- <string name="covenant_last_modified" value="Дата последнего изменения:"/>
- <string name="none_text" value="(нет)"/>
- <string name="never_text" value="(никогда)"/>
- <string name="GroupOwned">
- Собственность группы
- </string>
- <string name="Public">
- Общая собственность
- </string>
- <string name="LocalSettings">
- Локальные настройки
- </string>
- <string name="RegionSettings">
- Региональные настройки
- </string>
- <string name="ClassifiedClicksTxt">
- Щелчки: телепорт [TELEPORT], карта [MAP], профиль [PROFILE]
- </string>
- <string name="ClassifiedUpdateAfterPublish">
- (будет обновлено после публикации)
- </string>
- <string name="NoPicksClassifiedsText">
- Вы не создали подборки или рекламы. Нажмите кнопку со знаком «плюс» ниже, чтобы создать подборку или рекламу
- </string>
- <string name="NoAvatarPicksClassifiedsText">
- У жителя нет подборки или рекламы
- </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="InvOfferDecline">
- Вы не приняли [DESC] от жителя &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
- </string>
- <string name="GroupMoneyTotal">
- Итого
- </string>
- <string name="GroupMoneyBought">
- куплено
- </string>
- <string name="GroupMoneyPaidYou">
- уплачено вам
- </string>
- <string name="GroupMoneyPaidInto">
- уплачено в
- </string>
- <string name="GroupMoneyBoughtPassTo">
- куплен пропуск в
- </string>
- <string name="GroupMoneyPaidFeeForEvent">
- уплачено за событие
- </string>
- <string name="GroupMoneyPaidPrizeForEvent">
- выплачено призовых за событие
- </string>
- <string name="GroupMoneyBalance">
- Баланс
- </string>
- <string name="GroupMoneyCredits">
- Расход
- </string>
- <string name="GroupMoneyDebits">
- Приход
- </string>
- <string name="GroupMoneyDate">
- [weekday,datetime,utc], [day,datetime,utc] [mth,datetime,utc] [year,datetime,utc]
- </string>
- <string name="ViewerObjectContents">
- Контент
- </string>
- <string name="AcquiredItems">
- Купленные вещи
- </string>
- <string name="Cancel">
- Отмена
- </string>
- <string name="UploadingCosts">
- Передача [NAME] стоит L$[AMOUNT]
- </string>
- <string name="BuyingCosts">
- Стоимость покупки: L$[AMOUNT]
- </string>
- <string name="UnknownFileExtension">
- Неизвестное расширение файла .%s
-Ожидаются расширения: WAV, TGA, BMP, JPG, JPEG или 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">
- ⌃
- </string>
- <string name="accel-mac-command">
- ⌘
- </string>
- <string name="accel-mac-option">
- ⌥
- </string>
- <string name="accel-mac-shift">
- ⇧
- </string>
- <string name="accel-win-control">
- CTRL+
- </string>
- <string name="accel-win-alt">
- ALT+
- </string>
- <string name="accel-win-shift">
- SHIFT+
- </string>
- <string name="FileSaved">
- Файл сохранен
- </string>
- <string name="Receiving">
- Получение
- </string>
- <string name="AM">
- до полудня
- </string>
- <string name="PM">
- после полудня
- </string>
- <string name="PST">
- Тихоокеанское время
- </string>
- <string name="PDT">
- Летнее тихоокеанское время
- </string>
- <string name="Direction_Forward">
- Вперед
- </string>
- <string name="Direction_Left">
- Влево
- </string>
- <string name="Direction_Right">
- Вправо
- </string>
- <string name="Direction_Back">
- Назад
- </string>
- <string name="Direction_North">
- Север
- </string>
- <string name="Direction_South">
- Юг
- </string>
- <string name="Direction_West">
- Запад
- </string>
- <string name="Direction_East">
- Восток
- </string>
- <string name="Direction_Up">
- Вверх
- </string>
- <string name="Direction_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="Rental">
- Аренда
- </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] работает и без этого компонента.
-Продолжить?
- </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-битный режим True Color (Панель управления &gt; Экран &gt; Параметры).
-Если это сообщение продолжает отображаться, обратитесь на сайт [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">
- Выпученные глаза
- </string>
- <string name="Bugged Eyes">
- Выпученные глаза
- </string>
- <string name="Bulbous">
- Картошкой
- </string>
- <string name="Bulbous Nose">
- Нос картошкой
- </string>
- <string name="Breast Physics Mass">
- Масса груди
- </string>
- <string name="Breast Physics Smoothing">
- Гладкость груди
- </string>
- <string name="Breast Physics Gravity">
- Обвислость груди
- </string>
- <string name="Breast Physics Drag">
- Аэродинамика груди
- </string>
- <string name="Breast Physics InOut Max Effect">
- Верхняя граница
- </string>
- <string name="Breast Physics InOut Spring">
- Упругость
- </string>
- <string name="Breast Physics InOut Gain">
- Отклик
- </string>
- <string name="Breast Physics InOut Damping">
- Затухание
- </string>
- <string name="Breast Physics UpDown Max Effect">
- Верхняя граница
- </string>
- <string name="Breast Physics UpDown Spring">
- Упругость
- </string>
- <string name="Breast Physics UpDown Gain">
- Отклик
- </string>
- <string name="Breast Physics UpDown Damping">
- Затухание
- </string>
- <string name="Breast Physics LeftRight Max Effect">
- Верхняя граница
- </string>
- <string name="Breast Physics LeftRight Spring">
- Упругость
- </string>
- <string name="Breast Physics LeftRight Gain">
- Отклик
- </string>
- <string name="Breast Physics LeftRight Damping">
- Затухание
- </string>
- <string name="Belly Physics Mass">
- Масса живота
- </string>
- <string name="Belly Physics Smoothing">
- Гладкость живота
- </string>
- <string name="Belly Physics Gravity">
- Обвислость живота
- </string>
- <string name="Belly Physics Drag">
- Инертность живота
- </string>
- <string name="Belly Physics UpDown Max Effect">
- Верхняя граница
- </string>
- <string name="Belly Physics UpDown Spring">
- Упругость
- </string>
- <string name="Belly Physics UpDown Gain">
- Отклик
- </string>
- <string name="Belly Physics UpDown Damping">
- Затухание
- </string>
- <string name="Butt Physics Mass">
- Масса зада
- </string>
- <string name="Butt Physics Smoothing">
- Гладкость зада
- </string>
- <string name="Butt Physics Gravity">
- Обвислость зада
- </string>
- <string name="Butt Physics Drag">
- Инертность зада
- </string>
- <string name="Butt Physics UpDown Max Effect">
- Верхняя граница
- </string>
- <string name="Butt Physics UpDown Spring">
- Упругость
- </string>
- <string name="Butt Physics UpDown Gain">
- Отклик
- </string>
- <string name="Butt Physics UpDown Damping">
- Затухание
- </string>
- <string name="Butt Physics LeftRight Max Effect">
- Верхняя граница
- </string>
- <string name="Butt Physics LeftRight Spring">
- Упругость
- </string>
- <string name="Butt Physics LeftRight Gain">
- Отклик
- </string>
- <string name="Butt Physics LeftRight Damping">
- Затухание
- </string>
- <string name="Bushy Eyebrows">
- Кустистые брови
- </string>
- <string name="Bushy Hair">
- Пышные
- </string>
- <string name="Butt Size">
- Размер зада
- </string>
- <string name="Butt Gravity">
- Обвислость зада
- </string>
- <string name="bustle skirt">
- Турнюр
- </string>
- <string name="no bustle">
- Без турнюра
- </string>
- <string name="more bustle">
- Большой турнюр
- </string>
- <string name="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="Low Heels">
- Низкий каблук
- </string>
- <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>
- <string name="Taper Back">
- Конус сзади
- </string>
- <string name="Taper Front">
- Конус спереди
- </string>
- <string name="Thick Heels">
- Широкий каблук
- </string>
- <string name="Thick Neck">
- Толстая шея
- </string>
- <string name="Thick Toe">
- Толстый носок
- </string>
- <string name="Thin">
- Тонкий
- </string>
- <string name="Thin Eyebrows">
- Тонкие брови
- </string>
- <string name="Thin Lips">
- Тонкие губы
- </string>
- <string name="Thin Nose">
- Тонкий нос
- </string>
- <string name="Tight Chin">
- Тонкий подбородок
- </string>
- <string name="Tight Cuffs">
- Манжеты на резинке
- </string>
- <string name="Tight Pants">
- Облегающие брюки
- </string>
- <string name="Tight Shirt">
- Облегающая рубашка
- </string>
- <string name="Tight Skirt">
- Облегающая юбка
- </string>
- <string name="Tight Sleeves">
- Облегающие рукава
- </string>
- <string name="Toe Shape">
- Форма носка
- </string>
- <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="LocationCtrlAdultIconTooltip">
- Область для взрослых
- </string>
- <string name="LocationCtrlModerateIconTooltip">
- Область умеренной дозволенности
- </string>
- <string name="LocationCtrlGeneralIconTooltip">
- Область общей дозволенности
- </string>
- <string name="LocationCtrlSeeAVsTooltip">
- Все жители с других участков могут видеть аватары и общаться в чате
- </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="ItemsComingInTooFastFrom">
- [APP_NAME]: Из-за слишком быстрого поступления элементов с [FROM_NAME] автоматический просмотр отключен на [TIME] с
- </string>
- <string name="ItemsComingInTooFast">
- [APP_NAME]: из-за слишком быстрого поступления элементов автоматический просмотр отключен на [TIME] с
- </string>
- <string name="IM_logging_string">
- -- Включена регистрация сообщений IM --
- </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">
- Щелкните здесь, чтобы создать IM-сообщение.
- </string>
- <string name="IM_to_label">
- Кому
- </string>
- <string name="IM_moderator_label">
- (Модератор)
- </string>
- <string name="Saved_message">
- (Сохранено [LONG_TIMESTAMP])
- </string>
- <string name="IM_unblock_only_groups_friends">
- Для просмотра этого сообщения снимите флажок «Только друзья и группы могут звонить мне и отправлять IM» в окне «Настройки/Приватность».
- </string>
- <string name="answered_call">
- На ваш звонок ответили
- </string>
- <string name="you_started_call">
- Вы начали голосовую беседу
- </string>
- <string name="you_joined_call">
- Вы присоединились к голосовой беседе
- </string>
- <string name="name_started_call">
- Житель [NAME] начал голосовую беседу
- </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="conference-title-incoming">
- Конференция с жителем [AGENT_NAME]
- </string>
- <string name="inventory_item_offered-im">
- Предложено пополнить инвентарь
- </string>
- <string name="share_alert">
- Перетаскивайте вещи из инвентаря сюда
- </string>
- <string name="no_session_message">
- (Сеанс IM не существует)
- </string>
- <string name="only_user_message">
- Вы – единственный пользователь в этом сеансе.
- </string>
- <string name="offline_message">
- [NAME] не в сети.
- </string>
- <string name="invite_message">
- Нажмите кнопку [BUTTON NAME], чтобы участвовать в этом голосовом чате.
- </string>
- <string name="muted_message">
- Вы заблокировали этого жителя. Если отправить ему сообщение, блок автоматически снимется.
- </string>
- <string name="generic">
- Ошибка при запросе. Повторите попытку.
- </string>
- <string name="generic_request_error">
- Ошибка при запросе. Повторите попытку.
- </string>
- <string name="insufficient_perms_error">
- У вас недостаточно разрешений.
- </string>
- <string name="session_does_not_exist_error">
- Сеанс больше не существует
- </string>
- <string name="no_ability_error">
- У вас нет этой способности.
- </string>
- <string name="no_ability">
- У вас нет этой способности.
- </string>
- <string name="not_a_mod_error">
- Вы – не модератор сеанса.
- </string>
- <string name="muted">
- Модератор группы отключил для вас текстовый чат.
- </string>
- <string name="muted_error">
- Модератор группы отключил для вас текстовый чат.
- </string>
- <string name="add_session_event">
- Не удается добавить пользователей в сеанс чата с жителем [RECIPIENT].
- </string>
- <string name="message">
- Не удается отправить ваше сообщение в сеанс чата с жителем [RECIPIENT].
- </string>
- <string name="message_session_event">
- Не удается отправить ваше сообщение в сеанс чата с жителем [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="unread_chat_single">
- [SOURCES] сказал что-то новое
- </string>
- <string name="unread_chat_multiple">
- [SOURCES] сказал что-то новое
- </string>
- <string name="session_initialization_timed_out_error">
- Истекло время ожидания инициализации сеанса
- </string>
- <string name="Home position set.">
- Задано положение дома.
- </string>
- <string name="voice_morphing_url">
- http://secondlife.com/landing/voicemorphing
- </string>
- <string name="paid_you_ldollars">
- Житель [NAME] заплатил вам L$[AMOUNT] за [REASON].
- </string>
- <string name="paid_you_ldollars_no_reason">
- Житель [NAME] заплатил вам L$[AMOUNT].
- </string>
- <string name="you_paid_ldollars">
- Вы заплатили жителю [NAME] L$[AMOUNT] за [REASON].
- </string>
- <string name="you_paid_ldollars_no_info">
- Вы заплатили L$[AMOUNT].
- </string>
- <string name="you_paid_ldollars_no_reason">
- Вы заплатили жителю [NAME] L$[AMOUNT].
- </string>
- <string name="you_paid_ldollars_no_name">
- Вы заплатили L$[AMOUNT] за [REASON].
- </string>
- <string name="you_paid_failure_ldollars">
- Вы не смогли заплатить пользователю [NAME] L$[AMOUNT]: [REASON].
- </string>
- <string name="you_paid_failure_ldollars_no_info">
- Вы не смогли заплатить L$[AMOUNT]
- </string>
- <string name="you_paid_failure_ldollars_no_reason">
- Вы не смогли заплатить пользователю [NAME] L$[AMOUNT]
- </string>
- <string name="you_paid_failure_ldollars_no_name">
- Вы не смогли заплатить L$[AMOUNT]: [REASON].
- </string>
- <string name="for item">
- за [ITEM]
- </string>
- <string name="for a parcel of land">
- за земельный участок
- </string>
- <string name="for a land access pass">
- за пропуск на землю
- </string>
- <string name="for deeding land">
- за передачу земли
- </string>
- <string name="to create a group">
- за создание группы
- </string>
- <string name="to join a group">
- за вступление в группу
- </string>
- <string name="to upload">
- за передачу по сети
- </string>
- <string name="to publish a classified ad">
- за публикацию рекламы
- </string>
- <string name="giving">
- Уплата L$[AMOUNT]
- </string>
- <string name="uploading_costs">
- Передача стоит L$[AMOUNT]
- </string>
- <string name="this_costs">
- Это стоит L$[AMOUNT]
- </string>
- <string name="buying_selected_land">
- Покупка выбранной земли за L$[AMOUNT]
- </string>
- <string name="this_object_costs">
- Этот объект стоит L$[AMOUNT]
- </string>
- <string name="group_role_everyone">
- Все
- </string>
- <string name="group_role_officers">
- Должностные лица
- </string>
- <string name="group_role_owners">
- Владельцы
- </string>
- <string name="group_member_status_online">
- В сети
- </string>
- <string name="uploading_abuse_report">
- Загружается...
-
-Жалоба
- </string>
- <string name="New Shape">
- Новая фигура
- </string>
- <string name="New Skin">
- Новая кожа
- </string>
- <string name="New Hair">
- Новые волосы
- </string>
- <string name="New Eyes">
- Новые глаза
- </string>
- <string name="New Shirt">
- Новая рубашка
- </string>
- <string name="New Pants">
- Новые брюки
- </string>
- <string name="New Shoes">
- Новая обувь
- </string>
- <string name="New Socks">
- Новые носки
- </string>
- <string name="New Jacket">
- Новый пиджак
- </string>
- <string name="New Gloves">
- Новые перчатки
- </string>
- <string name="New Undershirt">
- Новая майка
- </string>
- <string name="New Underpants">
- Новые трусы
- </string>
- <string name="New Skirt">
- Новая юбка
- </string>
- <string name="New Alpha">
- Новая альфа-маска
- </string>
- <string name="New Tattoo">
- Новое тату
- </string>
- <string name="New Physics">
- Новая физика
- </string>
- <string name="Invalid Wearable">
- Нельзя носить
- </string>
- <string name="New Gesture">
- Новый жест
- </string>
- <string name="New Script">
- Новый скрипт
- </string>
- <string name="New Note">
- Новая заметка
- </string>
- <string name="New Folder">
- Новая папка
- </string>
- <string name="Contents">
- Контент
- </string>
- <string name="Gesture">
- Жест
- </string>
- <string name="Male Gestures">
- Мужские жесты
- </string>
- <string name="Female Gestures">
- Женские жесты
- </string>
- <string name="Other Gestures">
- Прочие жесты
- </string>
- <string name="Speech Gestures">
- Жесты в разговорах
- </string>
- <string name="Common Gestures">
- Стандартные жесты
- </string>
- <string name="Male - Excuse me">
- Мужчина – извинение
- </string>
- <string name="Male - Get lost">
- Мужчина – скройтесь
- </string>
- <string name="Male - Blow kiss">
- Мужчина – воздушный поцелуй
- </string>
- <string name="Male - Boo">
- Мужчина – фу!
- </string>
- <string name="Male - Bored">
- Мужчина – скука
- </string>
- <string name="Male - Hey">
- Мужчина – эй!
- </string>
- <string name="Male - Laugh">
- Мужчина – смех
- </string>
- <string name="Male - Repulsed">
- Мужчина – неприятие
- </string>
- <string name="Male - Shrug">
- Мужчина – пожимает плечами
- </string>
- <string name="Male - Stick tougue out">
- Мужчина – показывает язык
- </string>
- <string name="Male - Wow">
- Мужчина – ух ты!
- </string>
- <string name="Female - Chuckle">
- Женщина – смешок
- </string>
- <string name="Female - Cry">
- Женщина – плач
- </string>
- <string name="Female - Embarrassed">
- Женщина – смущение
- </string>
- <string name="Female - Excuse me">
- Женщина – извинение
- </string>
- <string name="Female - Get lost">
- Женщина – скройтесь
- </string>
- <string name="Female - Blow kiss">
- Женщина – воздушный поцелуй
- </string>
- <string name="Female - Boo">
- Женщина – фу!
- </string>
- <string name="Female - Bored">
- Женщина – скука
- </string>
- <string name="Female - Hey">
- Женщина – эй!
- </string>
- <string name="Female - Hey baby">
- Женщина – эй, бейби!
- </string>
- <string name="Female - Laugh">
- Женщина – смех
- </string>
- <string name="Female - Looking good">
- Женщина – хорошо выглядишь
- </string>
- <string name="Female - Over here">
- Женщина – сюда!
- </string>
- <string name="Female - Please">
- Женщина – просьба
- </string>
- <string name="Female - Repulsed">
- Женщина – неприятие
- </string>
- <string name="Female - Shrug">
- Женщина – пожимает плечами
- </string>
- <string name="Female - Stick tougue out">
- Женщина – показывает язык
- </string>
- <string name="Female - Wow">
- Женщина – ух ты!
- </string>
- <string name="/bow">
- /поклониться
- </string>
- <string name="/clap">
- /хлопнуть
- </string>
- <string name="/count">
- /счет
- </string>
- <string name="/extinguish">
- /затушить
- </string>
- <string name="/kmb">
- /поцелуй меня в зад
- </string>
- <string name="/muscle">
- /силач
- </string>
- <string name="/no">
- /нет
- </string>
- <string name="/no!">
- /нет!
- </string>
- <string name="/paper">
- /бумага
- </string>
- <string name="/pointme">
- /показать на себя
- </string>
- <string name="/pointyou">
- /показать на другого
- </string>
- <string name="/rock">
- /камень
- </string>
- <string name="/scissor">
- /ножницы
- </string>
- <string name="/smoke">
- /курить
- </string>
- <string name="/stretch">
- /потянуться
- </string>
- <string name="/whistle">
- /свистнуть
- </string>
- <string name="/yes">
- /да
- </string>
- <string name="/yes!">
- /о да!
- </string>
- <string name="afk">
- отошел
- </string>
- <string name="dance1">
- танец1
- </string>
- <string name="dance2">
- танец2
- </string>
- <string name="dance3">
- танец3
- </string>
- <string name="dance4">
- танец4
- </string>
- <string name="dance5">
- танец5
- </string>
- <string name="dance6">
- танец6
- </string>
- <string name="dance7">
- танец7
- </string>
- <string name="dance8">
- танец8
- </string>
- <string name="AvatarBirthDateFormat">
- [day,datetime,slt].[mthnum,datetime,slt].[year,datetime,slt]
- </string>
- <string name="DefaultMimeType">
- нет/нет
- </string>
- <string name="texture_load_dimensions_error">
- Нельзя загружать изображения, размер которых превышает [WIDTH]*[HEIGHT]
- </string>
- <string name="words_separator" value=","/>
- <string name="server_is_down">
- Несмотря на наши усилия, что-то неожиданно пошло не так.
-
- Ознакомьтесь с описанием известных проблем в работе этой службы на сайте status.secondlifegrid.net.
- Если проблемы продолжаются, то проверьте подключение к сети и настройки брандмауэра.
- </string>
- <string name="dateTimeWeekdaysNames">
- Воскресенье:Понедельник:Вторник:Среда:Четверг:Пятница:Суббота
- </string>
- <string name="dateTimeWeekdaysShortNames">
- Вс:Пн:Вт:Ср:Чт:Пт:Сб
- </string>
- <string name="dateTimeMonthNames">
- Январь:Февраль:Март:Апрель:Май:Июнь:Июль:Август:Сентябрь:Октябрь:Ноябрь:Декабрь
- </string>
- <string name="dateTimeMonthShortNames">
- Янв:Фев:Мар:Апр:Май:Июн:Июл:Авг:Сен:Окт:Ноя:Дек
- </string>
- <string name="dateTimeDayFormat">
- [MDAY]
- </string>
- <string name="dateTimeAM">
- до полудня
- </string>
- <string name="dateTimePM">
- после полудня
- </string>
- <string name="LocalEstimateUSD">
- [AMOUNT] US$
- </string>
- <string name="Membership">
- Членство
- </string>
- <string name="Roles">
- Роли
- </string>
- <string name="Group Identity">
- Удостоверение группы
- </string>
- <string name="Parcel Management">
- Управление участком
- </string>
- <string name="Parcel Identity">
- Удостоверение участка
- </string>
- <string name="Parcel Settings">
- Параметры участка
- </string>
- <string name="Parcel Powers">
- Способности для участка
- </string>
- <string name="Parcel Access">
- Доступ к участку
- </string>
- <string name="Parcel Content">
- Содержимое на участке
- </string>
- <string name="Object Management">
- Управление объектами
- </string>
- <string name="Accounting">
- Бухгалтерия
- </string>
- <string name="Notices">
- Уведомления
- </string>
- <string name="Chat">
- Чат
- </string>
- <string name="DeleteItems">
- Удалить выбранные объекты?
- </string>
- <string name="DeleteItem">
- Удалить выбранный объект?
- </string>
- <string name="EmptyOutfitText">
- Для этого костюма нет вещей
- </string>
- <string name="ExternalEditorNotSet">
- Выберите редактор, используя параметр ExternalEditor.
- </string>
- <string name="ExternalEditorNotFound">
- Не удается найти указанный внешний редактор.
-Попробуйте взять путь к редактору в двойные кавычки
-(например &quot;/path to my/editor&quot; &quot;%s&quot;)
- </string>
- <string name="ExternalEditorCommandParseError">
- Ошибка анализа командной строки для внешнего редактора.
- </string>
- <string name="ExternalEditorFailedToRun">
- Не удалось запустить внешний редактор.
- </string>
- <string name="TranslationFailed">
- Ошибка телепортации: [REASON]
- </string>
- <string name="TranslationResponseParseError">
- Ошибка при анализе ответа переводчика.
- </string>
- <string name="Esc">
- ESC
- </string>
- <string name="Space">
- ПРОБЕЛ
- </string>
- <string name="Enter">
- ВВОД
- </string>
- <string name="Tab">
- TAB
- </string>
- <string name="Ins">
- INS
- </string>
- <string name="Del">
- DEL
- </string>
- <string name="Backsp">
- BACKSP
- </string>
- <string name="Shift">
- SHIFT
- </string>
- <string name="Ctrl">
- CTRL
- </string>
- <string name="Alt">
- ALT
- </string>
- <string name="CapsLock">
- CAPSLOCK
- </string>
- <string name="Left">
- Стрелка влево
- </string>
- <string name="Right">
- Стрелка вправо
- </string>
- <string name="Up">
- Стрелка вверх
- </string>
- <string name="Down">
- Стрелка вниз
- </string>
- <string name="Home">
- HOME
- </string>
- <string name="End">
- END
- </string>
- <string name="PgUp">
- PgUp
- </string>
- <string name="PgDn">
- PgDn
- </string>
- <string name="F1">
- F1
- </string>
- <string name="F2">
- F2
- </string>
- <string name="F3">
- F3
- </string>
- <string name="F4">
- F4
- </string>
- <string name="F5">
- F5
- </string>
- <string name="F6">
- F6
- </string>
- <string name="F7">
- F7
- </string>
- <string name="F8">
- F8
- </string>
- <string name="F9">
- F9
- </string>
- <string name="F10">
- F10
- </string>
- <string name="F11">
- F11
- </string>
- <string name="F12">
- F12
- </string>
- <string name="Add">
- +
- </string>
- <string name="Subtract">
- -
- </string>
- <string name="Multiply">
- *
- </string>
- <string name="Divide">
- /
- </string>
- <string name="PAD_DIVIDE">
- PAD_DIVIDE
- </string>
- <string name="PAD_LEFT">
- PAD_LEFT
- </string>
- <string name="PAD_RIGHT">
- PAD_RIGHT
- </string>
- <string name="PAD_DOWN">
- PAD_DOWN
- </string>
- <string name="PAD_UP">
- PAD_UP
- </string>
- <string name="PAD_HOME">
- PAD_HOME
- </string>
- <string name="PAD_END">
- PAD_END
- </string>
- <string name="PAD_PGUP">
- PAD_PGUP
- </string>
- <string name="PAD_PGDN">
- PAD_PGDN
- </string>
- <string name="PAD_CENTER">
- PAD_CENTER
- </string>
- <string name="PAD_INS">
- PAD_INS
- </string>
- <string name="PAD_DEL">
- PAD_DEL
- </string>
- <string name="PAD_Enter">
- PAD_Enter
- </string>
- <string name="PAD_BUTTON0">
- PAD_BUTTON0
- </string>
- <string name="PAD_BUTTON1">
- PAD_BUTTON1
- </string>
- <string name="PAD_BUTTON2">
- PAD_BUTTON2
- </string>
- <string name="PAD_BUTTON3">
- PAD_BUTTON3
- </string>
- <string name="PAD_BUTTON4">
- PAD_BUTTON4
- </string>
- <string name="PAD_BUTTON5">
- PAD_BUTTON5
- </string>
- <string name="PAD_BUTTON6">
- PAD_BUTTON6
- </string>
- <string name="PAD_BUTTON7">
- PAD_BUTTON7
- </string>
- <string name="PAD_BUTTON8">
- PAD_BUTTON8
- </string>
- <string name="PAD_BUTTON9">
- PAD_BUTTON9
- </string>
- <string name="PAD_BUTTON10">
- PAD_BUTTON10
- </string>
- <string name="PAD_BUTTON11">
- PAD_BUTTON11
- </string>
- <string name="PAD_BUTTON12">
- PAD_BUTTON12
- </string>
- <string name="PAD_BUTTON13">
- PAD_BUTTON13
- </string>
- <string name="PAD_BUTTON14">
- PAD_BUTTON14
- </string>
- <string name="PAD_BUTTON15">
- PAD_BUTTON15
- </string>
- <string name="-">
- -
- </string>
- <string name="=">
- =
- </string>
- <string name="`">
- `
- </string>
- <string name=";">
- ;
- </string>
- <string name="[">
- [
- </string>
- <string name="]">
- ]
- </string>
- <string name="\">
- \
- </string>
- <string name="0">
- 0
- </string>
- <string name="1">
- 1
- </string>
- <string name="2">
- 2
- </string>
- <string name="3">
- 3
- </string>
- <string name="4">
- 4
- </string>
- <string name="5">
- 5
- </string>
- <string name="6">
- 6
- </string>
- <string name="7">
- 7
- </string>
- <string name="8">
- 8
- </string>
- <string name="9">
- 9
- </string>
- <string name="A">
- A
- </string>
- <string name="B">
- B
- </string>
- <string name="C">
- C
- </string>
- <string name="D">
- D
- </string>
- <string name="E">
- E
- </string>
- <string name="F">
- F
- </string>
- <string name="G">
- G
- </string>
- <string name="H">
- H
- </string>
- <string name="I">
- I
- </string>
- <string name="J">
- J
- </string>
- <string name="K">
- K
- </string>
- <string name="L">
- L
- </string>
- <string name="M">
- M
- </string>
- <string name="N">
- N
- </string>
- <string name="O">
- O
- </string>
- <string name="P">
- P
- </string>
- <string name="Q">
- Q
- </string>
- <string name="R">
- R
- </string>
- <string name="S">
- S
- </string>
- <string name="T">
- T
- </string>
- <string name="U">
- U
- </string>
- <string name="V">
- V
- </string>
- <string name="W">
- W
- </string>
- <string name="X">
- X
- </string>
- <string name="Y">
- Y
- </string>
- <string name="Z">
- Z
- </string>
- <string name="BeaconParticle">
- Просмотр меток участков (синие)
- </string>
- <string name="BeaconPhysical">
- Просмотр меток физических объектов (зеленые)
- </string>
- <string name="BeaconScripted">
- Просмотр меток объектов со скриптами (красные)
- </string>
- <string name="BeaconScriptedTouch">
- Просмотр меток объектов со скриптами и функцией касания (красные)
- </string>
- <string name="BeaconSound">
- Просмотр звуковых меток (желтые)
- </string>
- <string name="BeaconMedia">
- Просмотр медийных меток (белые)
- </string>
- <string name="ParticleHiding">
- Частицы скрыты
- </string>
- <string name="Command_AboutLand_Label">
- О земле
- </string>
- <string name="Command_Appearance_Label">
- Внешность
- </string>
- <string name="Command_Avatar_Label">
- Аватар
- </string>
- <string name="Command_Build_Label">
- Строительство
- </string>
- <string name="Command_Chat_Label">
- Чат
- </string>
- <string name="Command_Compass_Label">
- Компас
- </string>
- <string name="Command_Destinations_Label">
- Пункты
- </string>
- <string name="Command_Gestures_Label">
- Жесты
- </string>
- <string name="Command_HowTo_Label">
- Инструкции
- </string>
- <string name="Command_Inventory_Label">
- Инвентарь
- </string>
- <string name="Command_Map_Label">
- Карта
- </string>
- <string name="Command_Marketplace_Label">
- Торговый центр
- </string>
- <string name="Command_MiniMap_Label">
- Миникарта
- </string>
- <string name="Command_Move_Label">
- Ходьба / бег / полет
- </string>
- <string name="Command_Outbox_Label">
- Торговые исходящие
- </string>
- <string name="Command_People_Label">
- Люди
- </string>
- <string name="Command_Picks_Label">
- Подборка
- </string>
- <string name="Command_Places_Label">
- Места
- </string>
- <string name="Command_Preferences_Label">
- Настройки
- </string>
- <string name="Command_Profile_Label">
- Профиль
- </string>
- <string name="Command_Search_Label">
- Поиск
- </string>
- <string name="Command_Snapshot_Label">
- Снимок
- </string>
- <string name="Command_Speak_Label">
- Говорить
- </string>
- <string name="Command_View_Label">
- Управление камерой
- </string>
- <string name="Command_Voice_Label">
- Настройки голоса
- </string>
- <string name="Command_AboutLand_Tooltip">
- Информация о посещаемой вами земле
- </string>
- <string name="Command_Appearance_Tooltip">
- Изменить аватар
- </string>
- <string name="Command_Avatar_Tooltip">
- Выбор аватара
- </string>
- <string name="Command_Build_Tooltip">
- Построение объектов и формирование ландшафта
- </string>
- <string name="Command_Chat_Tooltip">
- Обменивайтесь текстовыми репликами с людьми вокруг вас
- </string>
- <string name="Command_Compass_Tooltip">
- Компас
- </string>
- <string name="Command_Destinations_Tooltip">
- Интересные места
- </string>
- <string name="Command_Gestures_Tooltip">
- Жесты для аватара
- </string>
- <string name="Command_HowTo_Tooltip">
- Выполнение типичных задач
- </string>
- <string name="Command_Inventory_Tooltip">
- Просмотр и использование вашего имущества
- </string>
- <string name="Command_Map_Tooltip">
- Карта мира
- </string>
- <string name="Command_Marketplace_Tooltip">
- Покупки
- </string>
- <string name="Command_MiniMap_Tooltip">
- Показать людей поблизости
- </string>
- <string name="Command_Move_Tooltip">
- Перемещение аватара
- </string>
- <string name="Command_Outbox_Tooltip">
- Перенести предметы в торговый центр для продажи
- </string>
- <string name="Command_People_Tooltip">
- Друзья, группы и люди поблизости
- </string>
- <string name="Command_Picks_Tooltip">
- Места, которые будут показаны в вашем профиле как избранное
- </string>
- <string name="Command_Places_Tooltip">
- Сохраненные вами места
- </string>
- <string name="Command_Preferences_Tooltip">
- Настройки
- </string>
- <string name="Command_Profile_Tooltip">
- Редактирование или просмотр вашего профиля
- </string>
- <string name="Command_Search_Tooltip">
- Поиск мест, событий, людей
- </string>
- <string name="Command_Snapshot_Tooltip">
- Сделать снимок
- </string>
- <string name="Command_Speak_Tooltip">
- Говорите с людьми вокруг вас с помощью микрофона
- </string>
- <string name="Command_View_Tooltip">
- Изменение угла камеры
- </string>
- <string name="Command_Voice_Tooltip">
- Регулировка громкости вызовов и разговоров с людьми около вас
- </string>
- <string name="Toolbar_Bottom_Tooltip">
- сейчас на нижней панели инструментов
- </string>
- <string name="Toolbar_Left_Tooltip">
- сейчас на левой панели инструментов
- </string>
- <string name="Toolbar_Right_Tooltip">
- сейчас на правой панели инструментов
- </string>
- <string name="Retain%">
- Остаток%
- </string>
- <string name="Detail">
- Детализация
- </string>
- <string name="Better Detail">
- Более детально
- </string>
- <string name="Surface">
- Поверхность
- </string>
- <string name="Solid">
- Сплошной
- </string>
- <string name="Wrap">
- Оболочка
- </string>
- <string name="Preview">
- Предварительный просмотр
- </string>
- <string name="Normal">
- Нормальный
- </string>
- <string name="snapshot_quality_very_low">
- Очень низкий
- </string>
- <string name="snapshot_quality_low">
- Низкий
- </string>
- <string name="snapshot_quality_medium">
- Средний
- </string>
- <string name="snapshot_quality_high">
- Высокий
- </string>
- <string name="snapshot_quality_very_high">
- Очень высокий
- </string>
-</strings>
diff --git a/indra/newview/skins/steam/xui/tr/strings.xml b/indra/newview/skins/steam/xui/tr/strings.xml
deleted file mode 100644
index 74bb33a5c5..0000000000
--- a/indra/newview/skins/steam/xui/tr/strings.xml
+++ /dev/null
@@ -1,5025 +0,0 @@
-<?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
- 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 Ağı
- </string>
- <string name="SUPPORT_SITE">
- Second Life Destek Portalı
- </string>
- <string name="StartupDetectingHardware">
- Donanım saptanıyor...
- </string>
- <string name="StartupLoading">
- [APP_NAME] yükleniyor...
- </string>
- <string name="StartupClearingCache">
- Önbellek temizleniyor...
- </string>
- <string name="StartupInitializingTextureCache">
- Doku önbelleği başlatılıyor...
- </string>
- <string name="StartupInitializingVFS">
- VFS Başlatılıyor...
- </string>
- <string name="StartupRequireDriverUpdate">
- Grafik başlatma başarılamadı. Lütfen grafik sürücünüzü güncelleştirin!
- </string>
- <string name="ProgressRestoring">
- Geri yükleniyor...
- </string>
- <string name="ProgressChangingResolution">
- Çözünürlük değiştiriliyor...
- </string>
- <string name="Fullbright">
- Tam parlak (eski)
- </string>
- <string name="LoginInProgress">
- Oturum açılıyor. [APP_NAME] kilitlenmiş görünebilir. Lütfen bekleyin.
- </string>
- <string name="LoginInProgressNoFrozen">
- Oturum açılıyor...
- </string>
- <string name="LoginAuthenticating">
- Kimlik doğrulaması yapılıyor
- </string>
- <string name="LoginMaintenance">
- Hesap bakımı yapılıyor...
- </string>
- <string name="LoginAttempt">
- Önceki oturum açma girişimi başarılamadı. Oturum açılıyor, [NUMBER]. girişim.
- </string>
- <string name="LoginPrecaching">
- Dünya yükleniyor...
- </string>
- <string name="LoginInitializingBrowser">
- Katıştırılmış web tarayıcısı başlatılıyor...
- </string>
- <string name="LoginInitializingMultimedia">
- Multimedya başlatılıyor...
- </string>
- <string name="LoginInitializingFonts">
- Fontlar yükleniyor...
- </string>
- <string name="LoginVerifyingCache">
- Önbellek dosyaları doğrulanıyor (60-90 saniye zaman alabilir)...
- </string>
- <string name="LoginProcessingResponse">
- Yanıt işleniyor...
- </string>
- <string name="LoginInitializingWorld">
- Dünya başlatılıyor...
- </string>
- <string name="LoginDecodingImages">
- Görüntülerin kodu çözülüyor...
- </string>
- <string name="LoginInitializingQuicktime">
- QuickTime Başlatılıyor...
- </string>
- <string name="LoginQuicktimeNotFound">
- QuickTime bulunamadı - başlatılamadı.
- </string>
- <string name="LoginQuicktimeOK">
- QuickTime başarıyla başlatıldı.
- </string>
- <string name="LoginRequestSeedCapGrant">
- Bölge özellikleri talep ediliyor...
- </string>
- <string name="LoginRetrySeedCapGrant">
- Bölge özellikleri talep ediliyor: [NUMBER]. girişim...
- </string>
- <string name="LoginWaitingForRegionHandshake">
- Bölge el sıkışması bekleniyor...
- </string>
- <string name="LoginConnectingToRegion">
- Bölgeye bağlanılıyor...
- </string>
- <string name="LoginDownloadingClothing">
- Giysiler karşıdan yükleniyor...
- </string>
- <string name="InvalidCertificate">
- Sunucu geçersiz veya bozuk bir sertifika döndürdü. Lütfen Ağ yöneticisine başvurun.
- </string>
- <string name="CertInvalidHostname">
- Sunucuya erişmek için geçersiz bir ana bilgisayar adı kullanıldı, lütfen SLURL veya Ağ ana bilgisayar adınızı kontrol edin.
- </string>
- <string name="CertExpired">
- Ağ tarafından döndürülen sertifikanın süresi sona ermiş görünüyor. Lütfen sistem saatinizi kontrol edin veya Ağ yöneticinize başvurun.
- </string>
- <string name="CertKeyUsage">
- Sunucu tarafından döndürülen sertifika SSL için kullanılamadı. Lütfen Ağ yöneticinize başvurun.
- </string>
- <string name="CertBasicConstraints">
- Sunucunun Sertifika zincirinde çok fazla sertifika vardı. Lütfen Ağ yöneticinize başvurun.
- </string>
- <string name="CertInvalidSignature">
- Ağ sunucusu tarafından döndürülen sertifika imzası doğrulanamadı. Lütfen Ağ yöneticinize başvurun.
- </string>
- <string name="LoginFailedNoNetwork">
- Ağ hatası: Bağlantı kurulamadı, lütfen ağ bağlantınızı kontrol edin.
- </string>
- <string name="LoginFailed">
- Oturum açılamadı.
- </string>
- <string name="Quit">
- Çık
- </string>
- <string name="create_account_url">
- http://join.secondlife.com/index.php?sourceid=1206_steam&amp;lang=tr-TR
- </string>
- <string name="LoginFailedViewerNotPermitted">
- Kullandığınız görüntüleyici ile artık Second Life&apos;a erişemezsiniz. Yeni bir görüntüleyiciyi karşıdan yüklemek için lütfen şu sayfayı ziyaret edin:
-http://secondlife.com/download
-
-Daha fazla bilgi edinmek için asağıdaki SSS sayfamızı ziyaret edin:
-http://secondlife.com/viewer-access-faq
- </string>
- <string name="LoginIntermediateOptionalUpdateAvailable">
- Opsiyonel görüntüleyici güncelleştirmesi mevcut: [VERSION]
- </string>
- <string name="LoginFailedRequiredUpdate">
- Gerekli görüntüleyici güncelleştirmesi: [VERSION]
- </string>
- <string name="LoginFailedAlreadyLoggedIn">
- Bu aracı zaten oturum açmış durumda.
- </string>
- <string name="LoginFailedAuthenticationFailed">
- Üzgünüz! Oturumunuzu açamadık.
-Lütfen şunları doğru girdiğinizi kontrol edin:
- * Kullanıcı adı (mustafayalcin12 veya faruk.gungoren gibi)
- * Parola:
-Ayrıca lütfen Caps Lock tuşuna basmadığınıza emin olun.
- </string>
- <string name="LoginFailedPasswordChanged">
- Güvenlik önlemi olarak parolanız değiştirildi.
-Lütfen hesap sayfanıza gidin: http://secondlife.com/password
-ve parolanızı sıfırlamak için güvenlik sorusunu yanıtlayın.
-Bu sorun için özür dileriz.
- </string>
- <string name="LoginFailedPasswordReset">
- Sistemimizde bazı değişiklikler yaptık, parolanızı sıfırlamanız gerekecek.
-Lütfen hesap sayfanıza gidin: http://secondlife.com/password
-ve parolanızı sıfırlamak için güvenlik sorusunu yanıtlayın.
-Bu sorun için özür dileriz.
- </string>
- <string name="LoginFailedEmployeesOnly">
- Second Life bakım amacıyla geçici olarak kapatıldı.
-Şu anda sadece çalışanlar oturum açabilir.
-Güncelleştirmeler için www.secondlife.com/status adresini kontrol edin.
- </string>
- <string name="LoginFailedPremiumOnly">
- Second Life üzerindeki aktif kullanıcıların olası en iyi deneyimi yaşamasını sağlamak için, oturum açılması geçici olarak kısıtlanmıştır.
-
-Second Life için ödeme yapmış olan kişilere öncelik tanımak amacıyla, ücretsiz hesaplara sahip kişiler bu süre içerisinde Second Life&apos;a erişemeyecekler.
- </string>
- <string name="LoginFailedComputerProhibited">
- Second Life&apos;a bu bilgisayardan erişemezsiniz.
-Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun:
-support@secondlife.com.
- </string>
- <string name="LoginFailedAcountSuspended">
- Hesabınıza şu zamana kadar erişemeyeceksiniz:
-Pasifik Saati ile [TIME].
- </string>
- <string name="LoginFailedAccountDisabled">
- Talebinizi şu anda tamamlayamıyoruz.
-Lütfen yardım almak için Second Life destek bölümüne başvurun: http://secondlife.com/support
-Eğer parolanızı değiştiremiyorsanız, lütfen şu numarayı arayın: (866) 476-9763.
- </string>
- <string name="LoginFailedTransformError">
- Oturum açılması sırasında veri tutarsızlığı saptandı.
-Lütfen şu adrese başvurun: support@secondlife.com
- </string>
- <string name="LoginFailedAccountMaintenance">
- Hesabınızda küçük çaplı bir bakım işlemi sürüyor.
-Hesabınıza şu zamana kadar erişemeyeceksiniz:
-Pasifik Saati ile [TIME].
-Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
- </string>
- <string name="LoginFailedPendingLogoutFault">
- Oturum kapatma talebi simülatörden bir hata yanıtı gelmesine neden oldu.
- </string>
- <string name="LoginFailedPendingLogout">
- Sistem şu anda oturumunuzu sonlandırıyor.
-Hesabınıza şu zamana kadar erişemeyeceksiniz:
-Pasifik Saati ile [TIME].
- </string>
- <string name="LoginFailedUnableToCreateSession">
- Geçerli bir oturum oluşturulamadı.
- </string>
- <string name="LoginFailedUnableToConnectToSimulator">
- Bir simülatöre bağlanılamadı.
- </string>
- <string name="LoginFailedRestrictedHours">
- Hesabınız Second Life&apos;a sadece
-Pasifik Saati ile [START] ve [END] arasında erişebilir.
-Lütfen bu saatler arasında tekrar uğrayın.
-Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
- </string>
- <string name="LoginFailedIncorrectParameters">
- Yanlış parametreler.
-Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
- </string>
- <string name="LoginFailedFirstNameNotAlphanumeric">
- Ad parametresi alfasayısal olmalıdır.
-Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
- </string>
- <string name="LoginFailedLastNameNotAlphanumeric">
- Soyadı parametresi alfasayısal olmalıdır.
-Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
- </string>
- <string name="LogoutFailedRegionGoingOffline">
- Bölge şu anda çevrimdışı oluyor.
-Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
- </string>
- <string name="LogoutFailedAgentNotInRegion">
- Aracı bölgede değil.
-Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
- </string>
- <string name="LogoutFailedPendingLogin">
- Bu bölge başka bir oturum açmaktaydı.
-Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
- </string>
- <string name="LogoutFailedLoggingOut">
- Bu bölge önceki oturumu sonlandırmaktaydı.
-Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
- </string>
- <string name="LogoutFailedStillLoggingOut">
- Bu bölge hala bir önceki oturumu sonlandırma işlemini sürdürüyor.
-Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
- </string>
- <string name="LogoutSucceeded">
- Bu bölge son oturumu sonlandırdı.
-Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
- </string>
- <string name="LogoutFailedLogoutBegun">
- Bölge oturumu sonlandırma işlemini başlattı.
-Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
- </string>
- <string name="LoginFailedLoggingOutSession">
- Sistem son oturumunuzu sonlandırma işlemini başlattı.
-Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
- </string>
- <string name="AgentLostConnection">
- Bu bölgede sorun yaşanıyor olabilir. Lütfen İnternet bağlantınızı kontrol edin.
- </string>
- <string name="SavingSettings">
- Ayarlarınız kaydediliyor...
- </string>
- <string name="LoggingOut">
- Oturum kapatılıyor...
- </string>
- <string name="ShuttingDown">
- Kapatılıyor...
- </string>
- <string name="YouHaveBeenDisconnected">
- Bulunduğunuz bölgeyle bağlantınız kesildi.
- </string>
- <string name="SentToInvalidRegion">
- Geçersiz bir bölgeye gönderildiniz.
- </string>
- <string name="TestingDisconnect">
- Görüntüleyici bağlantısının kesilmesi test ediliyor
- </string>
- <string name="TooltipPerson">
- Kişi
- </string>
- <string name="TooltipNoName">
- (adsız)
- </string>
- <string name="TooltipOwner">
- Sahip:
- </string>
- <string name="TooltipPublic">
- Kamuya Açık
- </string>
- <string name="TooltipIsGroup">
- (Grup)
- </string>
- <string name="TooltipForSaleL$">
- Satılık: L$[AMOUNT]
- </string>
- <string name="TooltipFlagGroupBuild">
- Grup İnşası
- </string>
- <string name="TooltipFlagNoBuild">
- İnşa Edilemez
- </string>
- <string name="TooltipFlagNoEdit">
- Grup İnşası
- </string>
- <string name="TooltipFlagNotSafe">
- Güvenli Değil
- </string>
- <string name="TooltipFlagNoFly">
- Uçamaz
- </string>
- <string name="TooltipFlagGroupScripts">
- Grup Komut Dosyaları
- </string>
- <string name="TooltipFlagNoScripts">
- Komut Dosyası Yok
- </string>
- <string name="TooltipLand">
- Arazi:
- </string>
- <string name="TooltipMustSingleDrop">
- Buraya sadece bir öğe sürüklenebilir.
- </string>
- <string name="TooltipPrice" value="L$[AMOUNT]:"/>
- <string name="TooltipOutboxDragToWorld">
- Satıcı giden kutunuzda öğeler oluşturamazsınız
- </string>
- <string name="TooltipOutboxNoTransfer">
- Bu nesnelerden bir veya daha fazlası satılamaz veya aktarılamaz.
- </string>
- <string name="TooltipOutboxNotInInventory">
- Satıcı giden kutunuza sadece doğrudan kendi envanterinizden öğeler koyabilirsiniz
- </string>
- <string name="TooltipOutboxWorn">
- Giymekte olduğunuz öğeleri Satıcı giden kutunuza koyamazsınız.
- </string>
- <string name="TooltipOutboxCallingCard">
- Satıcı giden kutunuza arama kartları koyamazsınız
- </string>
- <string name="TooltipOutboxFolderLevels">
- İç içe geçmiş klasörlerin derinliği üçü geçiyor
- </string>
- <string name="TooltipOutboxTooManyFolders">
- Üst seviyedeki klasördeki alt klasör sayısı 20&apos;yi geçiyor
- </string>
- <string name="TooltipOutboxTooManyObjects">
- Üst seviyedeki klasördeki öğe sayısı 200&apos;ü geçiyor
- </string>
- <string name="TooltipDragOntoOwnChild">
- Bir klasörü alt klasörüne taşıyamazsınız
- </string>
- <string name="TooltipDragOntoSelf">
- Bir klasörü kendi içine taşıyamazsınız
- </string>
- <string name="TooltipHttpUrl">
- Bu web sayfasını görmek için tıklayın
- </string>
- <string name="TooltipSLURL">
- Bu konumun bilgisini görmek için tıklayın
- </string>
- <string name="TooltipAgentUrl">
- Bu Sakinin profilini görmek için tıklayın
- </string>
- <string name="TooltipAgentInspect">
- Bu Sakin hakkında daha fazla bilgi öğrenin
- </string>
- <string name="TooltipAgentMute">
- Bu Sakini engellemek için tıklayın
- </string>
- <string name="TooltipAgentUnmute">
- Bu Sakinin engellemesini kaldırmak için tıklayın
- </string>
- <string name="TooltipAgentIM">
- Bu Sakine Aİ göndermek için tıklayın
- </string>
- <string name="TooltipAgentPay">
- Bu Sakine ödeme yapmak için tıklayın
- </string>
- <string name="TooltipAgentOfferTeleport">
- Bu Sakine bir ışınlama talebi teklif etmek için tıklayın
- </string>
- <string name="TooltipAgentRequestFriend">
- Bu Sakine bir arkadaşlık talebi teklif etmek için tıklayın
- </string>
- <string name="TooltipGroupUrl">
- Bu grubun açıklamasını görmek için tıklayın
- </string>
- <string name="TooltipEventUrl">
- Bu etkinliğin açıklamasını görmek için tıklayın
- </string>
- <string name="TooltipClassifiedUrl">
- Bu ilanı görmek için tıklayın
- </string>
- <string name="TooltipParcelUrl">
- Bu parselin açıklamasını görmek için tıklayın
- </string>
- <string name="TooltipTeleportUrl">
- Bu konuma ışınlama yapmak için tıklayın
- </string>
- <string name="TooltipObjectIMUrl">
- Bu nesnenin açıklamasını görmek için tıklayın
- </string>
- <string name="TooltipMapUrl">
- Bu konumu bir haritada görmek için tıklayın
- </string>
- <string name="TooltipSLAPP">
- secondlife:// komutunu çalıştırmak için tıklayın
- </string>
- <string name="CurrentURL" value="Geçerli URL: [CurrentURL]"/>
- <string name="SLurlLabelTeleport">
- Şuraya ışınla:
- </string>
- <string name="SLurlLabelShowOnMap">
- Şunun için Harita göster:
- </string>
- <string name="SLappAgentMute">
- Engelle
- </string>
- <string name="SLappAgentUnmute">
- Engellemeyi kaldır
- </string>
- <string name="SLappAgentIM">
- Aİ
- </string>
- <string name="SLappAgentPay">
- Öde
- </string>
- <string name="SLappAgentOfferTeleport">
- Şuraya Işınlama Teklif Et:
- </string>
- <string name="SLappAgentRequestFriend">
- Arkadaşlık Talebi
- </string>
- <string name="BUTTON_CLOSE_DARWIN">
- Kapat (⌘W)
- </string>
- <string name="BUTTON_CLOSE_WIN">
- Kapat (Ctrl+W)
- </string>
- <string name="BUTTON_CLOSE_CHROME">
- Kapat
- </string>
- <string name="BUTTON_RESTORE">
- Geri Yükle
- </string>
- <string name="BUTTON_MINIMIZE">
- Simge Durumuna Küçült
- </string>
- <string name="BUTTON_TEAR_OFF">
- Böl
- </string>
- <string name="BUTTON_DOCK">
- Yerleştir
- </string>
- <string name="BUTTON_HELP">
- Yardımı Göster
- </string>
- <string name="Searching">
- Arıyor...
- </string>
- <string name="NoneFound">
- Hiçbiri bulunamadı.
- </string>
- <string name="RetrievingData">
- Alınıyor...
- </string>
- <string name="ReleaseNotes">
- Sürüm Notları
- </string>
- <string name="LoadingData">
- Yükleniyor...
- </string>
- <string name="AvatarNameNobody">
- (hiçbiri)
- </string>
- <string name="AvatarNameWaiting">
- (bekliyor)
- </string>
- <string name="AvatarNameMultiple">
- (birden çok)
- </string>
- <string name="GroupNameNone">
- (hiçbiri)
- </string>
- <string name="AvalineCaller">
- Avaline Arayanı [ORDER]
- </string>
- <string name="AssetErrorNone">
- Hata yok
- </string>
- <string name="AssetErrorRequestFailed">
- Varlık talebi: başarısız oldu
- </string>
- <string name="AssetErrorNonexistentFile">
- Varlık talebi: var olmayan dosya
- </string>
- <string name="AssetErrorNotInDatabase">
- Varlık talebi: veri tabanında varlık bulunamadı
- </string>
- <string name="AssetErrorEOF">
- Dosya sonu
- </string>
- <string name="AssetErrorCannotOpenFile">
- Dosya açılamadı
- </string>
- <string name="AssetErrorFileNotFound">
- Dosya bulunamadı
- </string>
- <string name="AssetErrorTCPTimeout">
- Dosya aktarımı zaman aşımı
- </string>
- <string name="AssetErrorCircuitGone">
- Devre yok
- </string>
- <string name="AssetErrorPriceMismatch">
- Görüntüleyici ile sunucu fiyatta anlaşmadı
- </string>
- <string name="AssetErrorUnknownStatus">
- Bilinmeyen durum
- </string>
- <string name="texture">
- doku
- </string>
- <string name="sound">
- ses
- </string>
- <string name="calling card">
- arama kartı
- </string>
- <string name="landmark">
- yer imi
- </string>
- <string name="legacy script">
- eski komut dosyası
- </string>
- <string name="clothing">
- giysi
- </string>
- <string name="object">
- nesne
- </string>
- <string name="note card">
- not kartı
- </string>
- <string name="folder">
- klasör
- </string>
- <string name="root">
- kök
- </string>
- <string name="lsl2 script">
- LSL2 komut dosyası
- </string>
- <string name="lsl bytecode">
- LSL bayt kodu
- </string>
- <string name="tga texture">
- tga dokusu
- </string>
- <string name="body part">
- vücut bölümü
- </string>
- <string name="snapshot">
- anlık görüntü
- </string>
- <string name="lost and found">
- Kaybedip Bulduklarım
- </string>
- <string name="targa image">
- targa görüntüsü
- </string>
- <string name="trash">
- Çöp
- </string>
- <string name="jpeg image">
- jpeg görüntüsü
- </string>
- <string name="animation">
- animasyon
- </string>
- <string name="gesture">
- mimik
- </string>
- <string name="simstate">
- sim durumu
- </string>
- <string name="favorite">
- favori
- </string>
- <string name="symbolic link">
- bağlantı
- </string>
- <string name="symbolic folder link">
- klasör bağlantısı
- </string>
- <string name="mesh">
- örgü
- </string>
- <string name="AvatarEditingAppearance">
- (Görünümü Düzenliyor)
- </string>
- <string name="AvatarAway">
- Uzakta
- </string>
- <string name="AvatarBusy">
- Meşgul
- </string>
- <string name="AvatarMuted">
- Engellenmiş
- </string>
- <string name="anim_express_afraid">
- Korkmuş
- </string>
- <string name="anim_express_anger">
- Kızgın
- </string>
- <string name="anim_away">
- Uzakta
- </string>
- <string name="anim_backflip">
- Geriye salto
- </string>
- <string name="anim_express_laugh">
- İçten Kahkaha
- </string>
- <string name="anim_express_toothsmile">
- Büyük Gülümseme
- </string>
- <string name="anim_blowkiss">
- Öpücük Atma
- </string>
- <string name="anim_express_bored">
- Canı Sıkılmış
- </string>
- <string name="anim_bow">
- Selamlama
- </string>
- <string name="anim_clap">
- Alkış
- </string>
- <string name="anim_courtbow">
- Reverans
- </string>
- <string name="anim_express_cry">
- Ağlama
- </string>
- <string name="anim_dance1">
- Dans 1
- </string>
- <string name="anim_dance2">
- Dans 2
- </string>
- <string name="anim_dance3">
- Dans 3
- </string>
- <string name="anim_dance4">
- Dans 4
- </string>
- <string name="anim_dance5">
- Dans 5
- </string>
- <string name="anim_dance6">
- Dans 6
- </string>
- <string name="anim_dance7">
- Dans 7
- </string>
- <string name="anim_dance8">
- Dans 8
- </string>
- <string name="anim_express_disdain">
- Dudak Bükme
- </string>
- <string name="anim_drink">
- İçme
- </string>
- <string name="anim_express_embarrased">
- Utanmış
- </string>
- <string name="anim_angry_fingerwag">
- İşaret Etme
- </string>
- <string name="anim_fist_pump">
- Yumruk Sallama
- </string>
- <string name="anim_yoga_float">
- Uçan Yoga
- </string>
- <string name="anim_express_frown">
- Kaş Çatma
- </string>
- <string name="anim_impatient">
- Sabırsız
- </string>
- <string name="anim_jumpforjoy">
- Sevinçten Zıplama
- </string>
- <string name="anim_kissmybutt">
- Kıçımı Öp
- </string>
- <string name="anim_express_kiss">
- Öpücük
- </string>
- <string name="anim_laugh_short">
- Gülme
- </string>
- <string name="anim_musclebeach">
- Muscle Beach
- </string>
- <string name="anim_no_unhappy">
- Hayır (Mutsuz)
- </string>
- <string name="anim_no_head">
- Hayır
- </string>
- <string name="anim_nyanya">
- Ha-ha-ha
- </string>
- <string name="anim_punch_onetwo">
- Peşpeşe İki Yumruk
- </string>
- <string name="anim_express_open_mouth">
- Ağız Açık
- </string>
- <string name="anim_peace">
- Barış
- </string>
- <string name="anim_point_you">
- Diğerini Göster
- </string>
- <string name="anim_point_me">
- Kendini Göster
- </string>
- <string name="anim_punch_l">
- Sola Yumruk At
- </string>
- <string name="anim_punch_r">
- Sağa Yumruk At
- </string>
- <string name="anim_rps_countdown">
- RPS sayımı
- </string>
- <string name="anim_rps_paper">
- RPS kağıdı
- </string>
- <string name="anim_rps_rock">
- RPS kayası
- </string>
- <string name="anim_rps_scissors">
- RPS makası
- </string>
- <string name="anim_express_repulsed">
- Tiksinmiş
- </string>
- <string name="anim_kick_roundhouse_r">
- Döner Tekme
- </string>
- <string name="anim_express_sad">
- Üzgün
- </string>
- <string name="anim_salute">
- Selam
- </string>
- <string name="anim_shout">
- Bağırma
- </string>
- <string name="anim_express_shrug">
- Omuz Silkme
- </string>
- <string name="anim_express_smile">
- Gülümseme
- </string>
- <string name="anim_smoke_idle">
- Duman Tüttürme
- </string>
- <string name="anim_smoke_inhale">
- Duman Çekme
- </string>
- <string name="anim_smoke_throw_down">
- Yere İzmarit Atma
- </string>
- <string name="anim_express_surprise">
- Sürpriz
- </string>
- <string name="anim_sword_strike_r">
- Kılıç Darbesi
- </string>
- <string name="anim_angry_tantrum">
- Öfke Nöbeti
- </string>
- <string name="anim_express_tongue_out">
- Dil Çıkarma
- </string>
- <string name="anim_hello">
- El Sallama
- </string>
- <string name="anim_whisper">
- Fısıldama
- </string>
- <string name="anim_whistle">
- Islık Çalma
- </string>
- <string name="anim_express_wink">
- Göz Kırpma
- </string>
- <string name="anim_wink_hollywood">
- Göz Kırpma (Hollywood)
- </string>
- <string name="anim_express_worry">
- Endişelenme
- </string>
- <string name="anim_yes_happy">
- Evet (Mutlu)
- </string>
- <string name="anim_yes_head">
- Evet
- </string>
- <string name="multiple_textures">
- Birden Çok
- </string>
- <string name="texture_loading">
- Yükleniyor...
- </string>
- <string name="worldmap_offline">
- Çevrimdışı
- </string>
- <string name="worldmap_item_tooltip_format">
- [AREA] m² L$[PRICE]
- </string>
- <string name="worldmap_results_none_found">
- Hiçbiri bulunamadı.
- </string>
- <string name="Ok">
- Tamam
- </string>
- <string name="Premature end of file">
- Dosyanın zamanından önce sonu
- </string>
- <string name="ST_NO_JOINT">
- KÖK veya EKLEM bulunamıyor.
- </string>
- <string name="whisper">
- fısıldar:
- </string>
- <string name="shout">
- bağırır:
- </string>
- <string name="ringing">
- SL dünyası içindeki Sesli Sohbete bağlanılıyor...
- </string>
- <string name="connected">
- Bağlı
- </string>
- <string name="unavailable">
- Geçerli konumunuzda ses mevcut değil
- </string>
- <string name="hang_up">
- SL dünyası içindeki Sesli Sohbet ile bağlantı kesildi
- </string>
- <string name="reconnect_nearby">
- Şimdi Yakındaki bir Sesli Sohbete yeniden bağlanılacaksınız.
- </string>
- <string name="ScriptQuestionCautionChatGranted">
- &apos;[OWNERNAME]&apos; adlı kişiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan &apos;[OBJECTNAME]&apos; nesnesine şunu yapma izni verildi: [PERMISSIONS].
- </string>
- <string name="ScriptQuestionCautionChatDenied">
- &apos;[OWNERNAME]&apos; adlı kişiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan &apos;[OBJECTNAME]&apos; nesnesine şunu yapma izni verilmedi: [PERMISSIONS].
- </string>
- <string name="ScriptTakeMoney">
- Sizden Linden dolar (L$) almak
- </string>
- <string name="ActOnControlInputs">
- Denetim girişlerinizle ilgili eylem gerçekleştirmek
- </string>
- <string name="RemapControlInputs">
- Denetim girişleriniz için yeniden eşleme yapmak
- </string>
- <string name="AnimateYourAvatar">
- Avatarınızı canlandırmak
- </string>
- <string name="AttachToYourAvatar">
- Avatarınıza eklemek
- </string>
- <string name="ReleaseOwnership">
- Mülkiyeti bırakmak ve kamuya açık hale gelmek
- </string>
- <string name="LinkAndDelink">
- Başka nesnelerle bağlantı kurmak veya koparmak
- </string>
- <string name="AddAndRemoveJoints">
- Başka nesnelerle eklem eklemek ve kaldırmak
- </string>
- <string name="ChangePermissions">
- İzinlerini değiştirmek
- </string>
- <string name="TrackYourCamera">
- Kameranızı takip etmek
- </string>
- <string name="ControlYourCamera">
- Kameranızı kontrol etmek
- </string>
- <string name="NotConnected">
- Bağlı Değil
- </string>
- <string name="SIM_ACCESS_PG">
- Genel
- </string>
- <string name="SIM_ACCESS_MATURE">
- Orta
- </string>
- <string name="SIM_ACCESS_ADULT">
- Yetişkin
- </string>
- <string name="SIM_ACCESS_DOWN">
- Çevrimdışı
- </string>
- <string name="SIM_ACCESS_MIN">
- Bilinmiyor
- </string>
- <string name="land_type_unknown">
- (bilinmiyor)
- </string>
- <string name="Estate / Full Region">
- Gayrimenkul / Tam Bölge
- </string>
- <string name="Estate / Homestead">
- Gayrimenkul / Banliyö
- </string>
- <string name="Mainland / Homestead">
- Anakara / Banliyö
- </string>
- <string name="Mainland / Full Region">
- Anakara / Tam Bölge
- </string>
- <string name="all_files">
- Tüm Dosyalar
- </string>
- <string name="sound_files">
- Sesler
- </string>
- <string name="animation_files">
- Animasyonlar
- </string>
- <string name="image_files">
- Görüntüler
- </string>
- <string name="save_file_verb">
- Kaydet
- </string>
- <string name="load_file_verb">
- Yükle
- </string>
- <string name="targa_image_files">
- Targa Görüntüleri
- </string>
- <string name="bitmap_image_files">
- Bitmap Görüntüler
- </string>
- <string name="avi_movie_file">
- AVI Film Dosyası
- </string>
- <string name="xaf_animation_file">
- XAF Animasyon Dosyası
- </string>
- <string name="xml_file">
- XML Dosyası
- </string>
- <string name="raw_file">
- Ham Dosya
- </string>
- <string name="compressed_image_files">
- Sıkıştırılmış Görüntüler
- </string>
- <string name="load_files">
- Dosyalar Yükle
- </string>
- <string name="choose_the_directory">
- Dizin Seç
- </string>
- <string name="script_files">
- Komut Dosyaları
- </string>
- <string name="AvatarSetNotAway">
- Uzakta Değil
- </string>
- <string name="AvatarSetAway">
- Uzakta
- </string>
- <string name="AvatarSetNotBusy">
- Meşgul Değil
- </string>
- <string name="AvatarSetBusy">
- Meşgul
- </string>
- <string name="shape">
- Şekil
- </string>
- <string name="skin">
- Dış Katman
- </string>
- <string name="hair">
- Saç
- </string>
- <string name="eyes">
- Gözler
- </string>
- <string name="shirt">
- Gömlek
- </string>
- <string name="pants">
- Pantolon
- </string>
- <string name="shoes">
- Ayakkabılar
- </string>
- <string name="socks">
- Çoraplar
- </string>
- <string name="jacket">
- Ceket
- </string>
- <string name="gloves">
- Eldivenler
- </string>
- <string name="undershirt">
- Fanila
- </string>
- <string name="underpants">
- Külot
- </string>
- <string name="skirt">
- Etek
- </string>
- <string name="alpha">
- Alfa
- </string>
- <string name="tattoo">
- Dövme
- </string>
- <string name="physics">
- Fizik
- </string>
- <string name="invalid">
- geçersiz
- </string>
- <string name="none">
- hiçbiri
- </string>
- <string name="shirt_not_worn">
- Giyilmemiş gömlek
- </string>
- <string name="pants_not_worn">
- Giyilmemiş pantolon
- </string>
- <string name="shoes_not_worn">
- Giyilmemiş ayakkabılar
- </string>
- <string name="socks_not_worn">
- Giyilmemiş çoraplar
- </string>
- <string name="jacket_not_worn">
- Giyilmemiş ceket
- </string>
- <string name="gloves_not_worn">
- Giyilmemiş eldivenler
- </string>
- <string name="undershirt_not_worn">
- Giyilmemiş fanila
- </string>
- <string name="underpants_not_worn">
- Giyilmemiş külot
- </string>
- <string name="skirt_not_worn">
- Giyilmemiş etek
- </string>
- <string name="alpha_not_worn">
- Giyilmemiş alfa
- </string>
- <string name="tattoo_not_worn">
- Giyilmemiş dövme
- </string>
- <string name="physics_not_worn">
- Giyilmemiş fizik
- </string>
- <string name="invalid_not_worn">
- geçersiz
- </string>
- <string name="create_new_shape">
- Yeni şekil oluştur
- </string>
- <string name="create_new_skin">
- Yeni dış katman oluştur
- </string>
- <string name="create_new_hair">
- Yeni saç oluştur
- </string>
- <string name="create_new_eyes">
- Yeni gözler oluştur
- </string>
- <string name="create_new_shirt">
- Yeni gömlek oluştur
- </string>
- <string name="create_new_pants">
- Yeni pantolon oluştur
- </string>
- <string name="create_new_shoes">
- Yeni ayakkabılar oluştur
- </string>
- <string name="create_new_socks">
- Yeni çoraplar oluştur
- </string>
- <string name="create_new_jacket">
- Yeni ceket oluştur
- </string>
- <string name="create_new_gloves">
- Yeni eldivenler oluştur
- </string>
- <string name="create_new_undershirt">
- Yeni fanila oluştur
- </string>
- <string name="create_new_underpants">
- Yeni külot oluştur
- </string>
- <string name="create_new_skirt">
- Yeni etek oluştur
- </string>
- <string name="create_new_alpha">
- Yeni alfa oluştur
- </string>
- <string name="create_new_tattoo">
- Yeni dövme oluştur
- </string>
- <string name="create_new_physics">
- Yeni fizik oluştur
- </string>
- <string name="create_new_invalid">
- geçersiz
- </string>
- <string name="NewWearable">
- Yeni [WEARABLE_ITEM]
- </string>
- <string name="next">
- Sonraki
- </string>
- <string name="ok">
- Tamam
- </string>
- <string name="GroupNotifyGroupNotice">
- Grup Bildirimi
- </string>
- <string name="GroupNotifyGroupNotices">
- Grup Bildirimleri
- </string>
- <string name="GroupNotifySentBy">
- Gönderen:
- </string>
- <string name="GroupNotifyAttached">
- Eklenmiş:
- </string>
- <string name="GroupNotifyViewPastNotices">
- Burada eski bildirimleri görüntüleyin veya bu iletilerin alınmasını iptal edin.
- </string>
- <string name="GroupNotifyOpenAttachment">
- Aksesuarı Aç
- </string>
- <string name="GroupNotifySaveAttachment">
- Aksesuarı Kaydet
- </string>
- <string name="TeleportOffer">
- Işınlama teklifi
- </string>
- <string name="StartUpNotifications">
- Siz yokken yeni bildirimler geldi.
- </string>
- <string name="OverflowInfoChannelString">
- %d ilave bildiriminiz var
- </string>
- <string name="BodyPartsRightArm">
- Sağ Kol
- </string>
- <string name="BodyPartsHead">
- Baş
- </string>
- <string name="BodyPartsLeftArm">
- Sol Kol
- </string>
- <string name="BodyPartsLeftLeg">
- Sol Bacak
- </string>
- <string name="BodyPartsTorso">
- Gövde
- </string>
- <string name="BodyPartsRightLeg">
- Sağ Bacak
- </string>
- <string name="GraphicsQualityLow">
- Düşük
- </string>
- <string name="GraphicsQualityMid">
- Orta
- </string>
- <string name="GraphicsQualityHigh">
- Yüksek
- </string>
- <string name="LeaveMouselook">
- Dünya Görünümüne dönmek için ESC&apos;e basın
- </string>
- <string name="InventoryNoMatchingItems">
- Aradığınızı bulamadınız mı? [secondlife:///app/search/all/[SEARCH_TERM] Arama] ile bulmayı deneyin.
- </string>
- <string name="PlacesNoMatchingItems">
- Aradığınızı bulamadınız mı? [secondlife:///app/search/places/[SEARCH_TERM] Arama] ile bulmayı deneyin.
- </string>
- <string name="FavoritesNoMatchingItems">
- Bir yer imini favorilerinize eklemek için buraya sürükleyin.
- </string>
- <string name="InventoryNoTexture">
- Envanterinizde bu dokunun kopyası yok
- </string>
- <string name="InventoryInboxNoItems">
- Pazaryerinda satın aldıklarınız burada görünecektir. Bunları kullanmak için envanterinize sürükleyebilirsiniz.
- </string>
- <string name="MarketplaceURL">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
- </string>
- <string name="MarketplaceURL_CreateStore">
- http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
- </string>
- <string name="MarketplaceURL_Dashboard">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
- </string>
- <string name="MarketplaceURL_Imports">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
- </string>
- <string name="MarketplaceURL_LearnMore">
- https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
- </string>
- <string name="InventoryOutboxNotMerchantTitle">
- Pazaryerinde herkes öğe satabilir.
- </string>
- <string name="InventoryOutboxNotMerchantTooltip"/>
- <string name="InventoryOutboxNotMerchant">
- Eğer bir satıcı olmak istiyorsanız, [Pazaryerinde [MARKETPLACE_CREATE_STORE_URL] bir mağaza açmanız gerekir].
- </string>
- <string name="InventoryOutboxNoItemsTitle">
- Giden kutunuz boş.
- </string>
- <string name="InventoryOutboxNoItemsTooltip"/>
- <string name="InventoryOutboxNoItems">
- Bu alana klasörleri sürükleyin ve bunları [[MARKETPLACE_DASHBOARD_URL] Pazaryerinde] satılık olarak duyurmak için &quot;Pazaryerine Gönder&quot; üzerine tıklayın.
- </string>
- <string name="Marketplace Error None">
- Hata yok
- </string>
- <string name="Marketplace Error Not Merchant">
- Hata: Öğeleri Pazaryerine göndermeden önce kendinizi bir satıcı olarak belirlemelisiniz (ücretsizdir).
- </string>
- <string name="Marketplace Error Empty Folder">
- Hata: Bu klasörün içeriği boş.
- </string>
- <string name="Marketplace Error Unassociated Products">
- Hata: Bu öğe karşıya yüklenemedi çünkü satıcı hesabınızda ürünlerle ilişkisiz çok fazla öğe mevcut. Bu hatayı düzeltmek için Pazaryeri web sitesine oturum açın ve ilişkisiz öğe sayınızı azaltın.
- </string>
- <string name="Marketplace Error Object Limit">
- Hata: Bu öğe çok fazla nesne içeriyor. Bu hatayı düzeltmek için nesneleri birlikte kutulara yerleştirerek, toplam nesne sayısını 200&apos;ün altına düşürün.
- </string>
- <string name="Marketplace Error Folder Depth">
- Hata: Bu öğede çok fazla iç içe geçmiş klasör seviyesi var. Bunu tekrar düzenleyerek maksimum 3 iç içe geçmiş klasör seviyesine indirin.
- </string>
- <string name="Marketplace Error Unsellable Item">
- Hata: Bu öğe Pazaryerinde satılamaz.
- </string>
- <string name="Marketplace Error Internal Import">
- Hata: Bu öğede bir sorun var. Daha sonra tekrar deneyin.
- </string>
- <string name="Open landmarks">
- Açık yer imleri
- </string>
- <string name="no_transfer" value="(aktarım yok)"/>
- <string name="no_modify" value="(değiştirme yok)"/>
- <string name="no_copy" value="(kopya yok)"/>
- <string name="worn" value="(giyilmiş)"/>
- <string name="link" value="(bağlantı)"/>
- <string name="broken_link" value="(broken_link)"/>
- <string name="LoadingContents">
- İçerik yükleniyor...
- </string>
- <string name="NoContents">
- İçerik yok
- </string>
- <string name="WornOnAttachmentPoint" value="([ATTACHMENT_POINT] üzerinde giyilmiş)"/>
- <string name="ActiveGesture" value="[GESLABEL] (etkin)"/>
- <string name="PermYes">
- Evet
- </string>
- <string name="PermNo">
- Hayır
- </string>
- <string name="Chat Message" value="Sohbet:"/>
- <string name="Sound" value="Ses:"/>
- <string name="Wait" value="--- Bekleyin:"/>
- <string name="AnimFlagStop" value="Animasyonu Durdur:"/>
- <string name="AnimFlagStart" value="Animasyonu Başlat:"/>
- <string name="Wave" value="El Sallama"/>
- <string name="GestureActionNone" value="Hiçbiri"/>
- <string name="HelloAvatar" value="Merhaba avatar!"/>
- <string name="ViewAllGestures" value="Tümünü Göster &gt;&gt;"/>
- <string name="GetMoreGestures" value="İlave Al &gt;&gt;"/>
- <string name="Animations" value="Animasyonlar,"/>
- <string name="Calling Cards" value="Arama Kartları,"/>
- <string name="Clothing" value="Giysiler,"/>
- <string name="Gestures" value="Mimikler,"/>
- <string name="Landmarks" value="Yer İmleri,"/>
- <string name="Notecards" value="Not Kartları,"/>
- <string name="Objects" value="Nesneler,"/>
- <string name="Scripts" value="Komut Dosyaları,"/>
- <string name="Sounds" value="Sesler,"/>
- <string name="Textures" value="Dokular,"/>
- <string name="Snapshots" value="Anlık Görüntüler,"/>
- <string name="No Filters" value="Hayır"/>
- <string name="Since Logoff" value="- Oturum Kapandıktan Beri"/>
- <string name="InvFolder My Inventory">
- Envanterim
- </string>
- <string name="InvFolder Library">
- Kütüphane
- </string>
- <string name="InvFolder Textures">
- Dokular
- </string>
- <string name="InvFolder Sounds">
- Sesler
- </string>
- <string name="InvFolder Calling Cards">
- Arama Kartları
- </string>
- <string name="InvFolder Landmarks">
- Yer İmleri
- </string>
- <string name="InvFolder Scripts">
- Komut Dosyaları
- </string>
- <string name="InvFolder Clothing">
- Giysiler
- </string>
- <string name="InvFolder Objects">
- Nesneler
- </string>
- <string name="InvFolder Notecards">
- Not Kartları
- </string>
- <string name="InvFolder New Folder">
- Yeni Klasör
- </string>
- <string name="InvFolder Inventory">
- Envanter
- </string>
- <string name="InvFolder Uncompressed Images">
- Sıkıştırılmamış Görüntüler
- </string>
- <string name="InvFolder Body Parts">
- Vücut Bölümleri
- </string>
- <string name="InvFolder Trash">
- Çöp
- </string>
- <string name="InvFolder Photo Album">
- Fotoğraf Albümü
- </string>
- <string name="InvFolder Lost And Found">
- Kaybedip Bulduklarım
- </string>
- <string name="InvFolder Uncompressed Sounds">
- Sıkıştırılmamış Sesler
- </string>
- <string name="InvFolder Animations">
- Animasyonlar
- </string>
- <string name="InvFolder Gestures">
- Mimikler
- </string>
- <string name="InvFolder Favorite">
- Favorilerim
- </string>
- <string name="InvFolder favorite">
- Favorilerim
- </string>
- <string name="InvFolder Current Outfit">
- Mevcut Dış Görünüm
- </string>
- <string name="InvFolder Initial Outfits">
- Başlangıçtakı Dış Görünümler
- </string>
- <string name="InvFolder My Outfits">
- Benim Dış Görünümlerim
- </string>
- <string name="InvFolder Accessories">
- Aksesuarlar
- </string>
- <string name="InvFolder Meshes">
- Örgüler
- </string>
- <string name="InvFolder Friends">
- Arkadaşlar
- </string>
- <string name="InvFolder All">
- Tümü
- </string>
- <string name="no_attachments">
- Giyilen aksesuar yok
- </string>
- <string name="Attachments remain">
- Aksesuarlar ([COUNT] yuva mevcut)
- </string>
- <string name="Buy">
- Satın Al
- </string>
- <string name="BuyforL$">
- L$&apos;a Satın Al
- </string>
- <string name="Stone">
- Taş
- </string>
- <string name="Metal">
- Metal
- </string>
- <string name="Glass">
- Cam
- </string>
- <string name="Wood">
- Ahşap
- </string>
- <string name="Flesh">
- Et
- </string>
- <string name="Plastic">
- Plastik
- </string>
- <string name="Rubber">
- Lastik
- </string>
- <string name="Light">
- Işık
- </string>
- <string name="KBShift">
- Shift
- </string>
- <string name="KBCtrl">
- Ctrl
- </string>
- <string name="Chest">
- Göğüs
- </string>
- <string name="Skull">
- Kafatası
- </string>
- <string name="Left Shoulder">
- Sol Omuz
- </string>
- <string name="Right Shoulder">
- Sağ Omuz
- </string>
- <string name="Left Hand">
- Sol El
- </string>
- <string name="Right Hand">
- Sağ El
- </string>
- <string name="Left Foot">
- Sol Ayak
- </string>
- <string name="Right Foot">
- Sağ Ayak
- </string>
- <string name="Spine">
- Omurga
- </string>
- <string name="Pelvis">
- Leğen Kemiği
- </string>
- <string name="Mouth">
- Ağız
- </string>
- <string name="Chin">
- Çene
- </string>
- <string name="Left Ear">
- Sol Kulak
- </string>
- <string name="Right Ear">
- Sağ Kulak
- </string>
- <string name="Left Eyeball">
- Sol Göz Küresi
- </string>
- <string name="Right Eyeball">
- Sağ Göz Küresi
- </string>
- <string name="Nose">
- Burun
- </string>
- <string name="R Upper Arm">
- Sağ Üst Kol
- </string>
- <string name="R Forearm">
- Sağ Ön Kol
- </string>
- <string name="L Upper Arm">
- Sol Üst Kol
- </string>
- <string name="L Forearm">
- Sol Ön Kol
- </string>
- <string name="Right Hip">
- Sağ Kalça
- </string>
- <string name="R Upper Leg">
- Sağ Üst Bacak
- </string>
- <string name="R Lower Leg">
- Sağ Alt Bacak
- </string>
- <string name="Left Hip">
- Sol Kalça
- </string>
- <string name="L Upper Leg">
- Sol Üst Bacak
- </string>
- <string name="L Lower Leg">
- Sol Alt Bacak
- </string>
- <string name="Stomach">
- Karın
- </string>
- <string name="Left Pec">
- Sol Göğüs
- </string>
- <string name="Right Pec">
- Sağ Göğüs
- </string>
- <string name="Neck">
- Boyun
- </string>
- <string name="Avatar Center">
- Avatar Merkezi
- </string>
- <string name="Invalid Attachment">
- Geçersiz Aksesuar Noktası
- </string>
- <string name="YearsMonthsOld">
- [AGEYEARS] [AGEMONTHS]&apos;lık
- </string>
- <string name="YearsOld">
- [AGEYEARS] yaşında
- </string>
- <string name="MonthsOld">
- [AGEMONTHS]&apos;lık
- </string>
- <string name="WeeksOld">
- [AGEWEEKS]&apos;lık
- </string>
- <string name="DaysOld">
- [AGEDAYS]&apos;lük
- </string>
- <string name="TodayOld">
- Bugün katıldı
- </string>
- <string name="AgeYearsA">
- [COUNT] yıl
- </string>
- <string name="AgeYearsB">
- [COUNT] yıl
- </string>
- <string name="AgeYearsC">
- [COUNT] yıl
- </string>
- <string name="AgeMonthsA">
- [COUNT] ay
- </string>
- <string name="AgeMonthsB">
- [COUNT] ay
- </string>
- <string name="AgeMonthsC">
- [COUNT] ay
- </string>
- <string name="AgeWeeksA">
- [COUNT] hafta
- </string>
- <string name="AgeWeeksB">
- [COUNT] hafta
- </string>
- <string name="AgeWeeksC">
- [COUNT] hafta
- </string>
- <string name="AgeDaysA">
- [COUNT] gün
- </string>
- <string name="AgeDaysB">
- [COUNT] gün
- </string>
- <string name="AgeDaysC">
- [COUNT] gün
- </string>
- <string name="GroupMembersA">
- [COUNT] üye
- </string>
- <string name="GroupMembersB">
- [COUNT] üye
- </string>
- <string name="GroupMembersC">
- [COUNT] üye
- </string>
- <string name="AcctTypeResident">
- Sakin
- </string>
- <string name="AcctTypeTrial">
- Deneme
- </string>
- <string name="AcctTypeCharterMember">
- Ayrıcalıklı Üye
- </string>
- <string name="AcctTypeEmployee">
- Linden Lab Çalışanı
- </string>
- <string name="PaymentInfoUsed">
- Kullanılan Ödeme Bilgisi
- </string>
- <string name="PaymentInfoOnFile">
- Dosyadaki Ödeme Bilgisi
- </string>
- <string name="NoPaymentInfoOnFile">
- Dosyada Ödeme Bilgisi Yok
- </string>
- <string name="AgeVerified">
- Yaşı Doğrulanmış
- </string>
- <string name="NotAgeVerified">
- Yaşı Doğrulanmamış
- </string>
- <string name="Center 2">
- 2. Merkez
- </string>
- <string name="Top Right">
- Sağ Üst
- </string>
- <string name="Top">
- Üst
- </string>
- <string name="Top Left">
- Sol Üst
- </string>
- <string name="Center">
- Merkez
- </string>
- <string name="Bottom Left">
- Sol Alt
- </string>
- <string name="Bottom">
- Alt
- </string>
- <string name="Bottom Right">
- Sağ Alt
- </string>
- <string name="CompileQueueDownloadedCompiling">
- Karşıdan yüklendi, şimdi derleniyor
- </string>
- <string name="CompileQueueScriptNotFound">
- Komut dosyası sunucuda bulunamadı.
- </string>
- <string name="CompileQueueProblemDownloading">
- Karşıdan yüklenirken sorun oluştu
- </string>
- <string name="CompileQueueInsufficientPermDownload">
- Komut dosyasını karşıdan yüklemek için yeterli izin yok.
- </string>
- <string name="CompileQueueInsufficientPermFor">
- Şunun için yeterli izin yok:
- </string>
- <string name="CompileQueueUnknownFailure">
- Karşıdan yüklerken bilinmeyen hata
- </string>
- <string name="CompileQueueTitle">
- Tekrar Derleme İlerlemesi
- </string>
- <string name="CompileQueueStart">
- tekrar derle
- </string>
- <string name="ResetQueueTitle">
- Sıfırlama İlerlemesi
- </string>
- <string name="ResetQueueStart">
- sıfırla
- </string>
- <string name="RunQueueTitle">
- Çalışan Süreçlerin İlerlemesini Ayarla
- </string>
- <string name="RunQueueStart">
- çalıştırmayı ayarla
- </string>
- <string name="NotRunQueueTitle">
- Çalışmayan Süreçlerin İlerlemesini Ayarla
- </string>
- <string name="NotRunQueueStart">
- çalıştırmamayı ayarla
- </string>
- <string name="CompileSuccessful">
- Derleme başarılı oldu!
- </string>
- <string name="CompileSuccessfulSaving">
- Derleme başarılı, kaydediliyor...
- </string>
- <string name="SaveComplete">
- Kaydetme tamamlandı.
- </string>
- <string name="ObjectOutOfRange">
- Komut dosyası (nesne kapsam dışı)
- </string>
- <string name="GodToolsObjectOwnedBy">
- [OWNER] mülkiyetindeki [OBJECT] nesnesi
- </string>
- <string name="GroupsNone">
- hiçbiri
- </string>
- <string name="Group" value="(grup)"/>
- <string name="Unknown">
- (Bilinmiyor)
- </string>
- <string name="SummaryForTheWeek" value="Bu haftanın özeti, şu tarihten itibaren:"/>
- <string name="NextStipendDay" value="Sonraki ödeme günü şudur:"/>
- <string name="GroupPlanningDate">
- [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
- </string>
- <string name="GroupIndividualShare" value="Grup Bireysel Pay"/>
- <string name="GroupColumn" value="Grup"/>
- <string name="Balance">
- Bakiye
- </string>
- <string name="Credits">
- Katkıda Bulunanlar
- </string>
- <string name="Debits">
- Borçlar
- </string>
- <string name="Total">
- Toplam
- </string>
- <string name="NoGroupDataFound">
- Bu grup için grup verisi bulunamadı
- </string>
- <string name="IMParentEstate">
- ana gayrimenkul
- </string>
- <string name="IMMainland">
- anakara
- </string>
- <string name="IMTeen">
- on sekiz yaş altı
- </string>
- <string name="Anyone">
- herkes
- </string>
- <string name="RegionInfoError">
- hata
- </string>
- <string name="RegionInfoAllEstatesOwnedBy">
- [OWNER] mülkiyetindeki tüm gayrimenkuller
- </string>
- <string name="RegionInfoAllEstatesYouOwn">
- sahip olduğunuz tüm gayrimenkuller
- </string>
- <string name="RegionInfoAllEstatesYouManage">
- [OWNER] adına yönettiğiniz tüm gayrimenkuller
- </string>
- <string name="RegionInfoAllowedResidents">
- İzin verilen Sakinler: ([ALLOWEDAGENTS], maks [MAXACCESS])
- </string>
- <string name="RegionInfoAllowedGroups">
- İzin verilen gruplar: ([ALLOWEDGROUPS], maks [MAXACCESS])
- </string>
- <string name="ScriptLimitsParcelScriptMemory">
- Parsel Komut Dosyası Belleği
- </string>
- <string name="ScriptLimitsParcelsOwned">
- Listelenen Parseller: [PARCELS]
- </string>
- <string name="ScriptLimitsMemoryUsed">
- Kullanılan bellek: [COUNT] kb / [MAX] kb içerisinden; [AVAILABLE] kb serbest
- </string>
- <string name="ScriptLimitsMemoryUsedSimple">
- Kullanılan bellek: [COUNT] kb
- </string>
- <string name="ScriptLimitsParcelScriptURLs">
- Parsel Komut Dosyası URL&apos;leri
- </string>
- <string name="ScriptLimitsURLsUsed">
- Kullanılan URL&apos;ler: [COUNT] / [MAX] içerisinden; [AVAILABLE] serbest
- </string>
- <string name="ScriptLimitsURLsUsedSimple">
- Kullanılan URL&apos;ler: [COUNT]
- </string>
- <string name="ScriptLimitsRequestError">
- Bilgi talep edilirken hata oluştu
- </string>
- <string name="ScriptLimitsRequestNoParcelSelected">
- Seçili Parsel Yok
- </string>
- <string name="ScriptLimitsRequestWrongRegion">
- Hata: Komut dosyası bilgisi sadece mevcut bölgenizde geçerli
- </string>
- <string name="ScriptLimitsRequestWaiting">
- Bilgiler alınıyor...
- </string>
- <string name="ScriptLimitsRequestDontOwnParcel">
- Bu parseli inceleme izniniz yok
- </string>
- <string name="SITTING_ON">
- Üzerinde Oturuyor
- </string>
- <string name="ATTACH_CHEST">
- Göğüs
- </string>
- <string name="ATTACH_HEAD">
- Baş
- </string>
- <string name="ATTACH_LSHOULDER">
- Sol Omuz
- </string>
- <string name="ATTACH_RSHOULDER">
- Sağ Omuz
- </string>
- <string name="ATTACH_LHAND">
- Sol El
- </string>
- <string name="ATTACH_RHAND">
- Sağ El
- </string>
- <string name="ATTACH_LFOOT">
- Sol Ayak
- </string>
- <string name="ATTACH_RFOOT">
- Sağ Ayak
- </string>
- <string name="ATTACH_BACK">
- Geri
- </string>
- <string name="ATTACH_PELVIS">
- Leğen Kemiği
- </string>
- <string name="ATTACH_MOUTH">
- Ağız
- </string>
- <string name="ATTACH_CHIN">
- Çene
- </string>
- <string name="ATTACH_LEAR">
- Sol Kulak
- </string>
- <string name="ATTACH_REAR">
- Sağ Kulak
- </string>
- <string name="ATTACH_LEYE">
- Sol Göz
- </string>
- <string name="ATTACH_REYE">
- Sağ Göz
- </string>
- <string name="ATTACH_NOSE">
- Burun
- </string>
- <string name="ATTACH_RUARM">
- Sol Üst Kol
- </string>
- <string name="ATTACH_RLARM">
- Sağ Alt Kol
- </string>
- <string name="ATTACH_LUARM">
- Sol Üst Kol
- </string>
- <string name="ATTACH_LLARM">
- Sol Alt Kol
- </string>
- <string name="ATTACH_RHIP">
- Sağ Kalça
- </string>
- <string name="ATTACH_RULEG">
- Sağ Üst Bacak
- </string>
- <string name="ATTACH_RLLEG">
- Sağ Alt Bacak
- </string>
- <string name="ATTACH_LHIP">
- Sol Kalça
- </string>
- <string name="ATTACH_LULEG">
- Sol Üst Bacak
- </string>
- <string name="ATTACH_LLLEG">
- Sol Alt Bacak
- </string>
- <string name="ATTACH_BELLY">
- Göbek
- </string>
- <string name="ATTACH_RPEC">
- Sağ Göğüs
- </string>
- <string name="ATTACH_LPEC">
- Sol Göğüs
- </string>
- <string name="ATTACH_HUD_CENTER_2">
- BÜG 2. Merkez
- </string>
- <string name="ATTACH_HUD_TOP_RIGHT">
- BÜG Sağ Üst
- </string>
- <string name="ATTACH_HUD_TOP_CENTER">
- BÜG Merkez Üst
- </string>
- <string name="ATTACH_HUD_TOP_LEFT">
- BÜG Sol Üst
- </string>
- <string name="ATTACH_HUD_CENTER_1">
- BÜG 1. Merkez
- </string>
- <string name="ATTACH_HUD_BOTTOM_LEFT">
- BÜG Sol Alt
- </string>
- <string name="ATTACH_HUD_BOTTOM">
- BÜG Alt
- </string>
- <string name="ATTACH_HUD_BOTTOM_RIGHT">
- BÜG Sağ Alt
- </string>
- <string name="CursorPos">
- Satır [LINE], Sütun [COLUMN]
- </string>
- <string name="PanelDirCountFound">
- [COUNT] bulundu
- </string>
- <string name="PanelDirTimeStr">
- [hour,datetime,slt]:[min,datetime,slt]
- </string>
- <string name="PanelDirEventsDateText">
- [mthnum,datetime,slt]/[day,datetime,slt]
- </string>
- <string name="PanelContentsTooltip">
- Nesnenin içeriği
- </string>
- <string name="PanelContentsNewScript">
- Yeni Komut Dosyası
- </string>
- <string name="BusyModeResponseDefault">
- İleti gönderdiğiniz Sakin &apos;meşgul modu&apos;nda, bu da rahatsız edilmek istemediği anlamına geliyor. İletiniz daha sonra incelenmesi için kendisine ait Aİ panelinde gösterilecektir.
- </string>
- <string name="MuteByName">
- (Adına göre)
- </string>
- <string name="MuteAgent">
- (Sakin)
- </string>
- <string name="MuteObject">
- (Nesne)
- </string>
- <string name="MuteGroup">
- (Grup)
- </string>
- <string name="MuteExternal">
- (Harici)
- </string>
- <string name="RegionNoCovenant">
- Bu Gayrimenkul için Sözleşmesi yok.
- </string>
- <string name="RegionNoCovenantOtherOwner">
- Bu Gayrimenkul için Sözleşmesi yok. Bu gayrimenkul üzerindeki arazi Linden Lab. değil, Gayrimenkul sahibi tarafından satılmaktadır. Satış ayrıntılarını öğrenmek için lütfen Gayrimenkul Sahibiyle bağlantıya geçin.
- </string>
- <string name="covenant_last_modified" value="Son Değiştirildiği Tarih:"/>
- <string name="none_text" value="(hiçbiri)"/>
- <string name="never_text" value="(asla)"/>
- <string name="GroupOwned">
- Sahibi Olunan Grup
- </string>
- <string name="Public">
- Kamuya Açık
- </string>
- <string name="LocalSettings">
- Yerel Ayarlar
- </string>
- <string name="RegionSettings">
- Bölge Ayarları
- </string>
- <string name="ClassifiedClicksTxt">
- Tıklamalar: [TELEPORT] ışınlama, [MAP] harita, [PROFILE] profil
- </string>
- <string name="ClassifiedUpdateAfterPublish">
- (yayınlandıktan sonra güncelleştirilir)
- </string>
- <string name="NoPicksClassifiedsText">
- Herhangi bir Seçme veya İlan oluşturmadınız. Bir Seçme veya İlan oluşturmak için aşağıdaki Artı düğmesine tıklayın.
- </string>
- <string name="NoAvatarPicksClassifiedsText">
- Kullanıcının herhangi bir seçmesi veya ilanı yok
- </string>
- <string name="PicksClassifiedsLoadingText">
- Yükleniyor...
- </string>
- <string name="MultiPreviewTitle">
- Önizleme
- </string>
- <string name="MultiPropertiesTitle">
- Özellikler
- </string>
- <string name="InvOfferAnObjectNamed">
- Şu ada sahip bir nesne:
- </string>
- <string name="InvOfferOwnedByGroup">
- grubun sahip olduğu:
- </string>
- <string name="InvOfferOwnedByUnknownGroup">
- bilinmeyen grubun sahip olduğu:
- </string>
- <string name="InvOfferOwnedBy">
- sahibi:
- </string>
- <string name="InvOfferOwnedByUnknownUser">
- bilinmeyen bir kullanıcının sahip olduğu:
- </string>
- <string name="InvOfferGaveYou">
- size verdi:
- </string>
- <string name="InvOfferDecline">
- &lt;nolink&gt;[NAME]&lt;/nolink&gt; tarafından gönderilen [DESC]&apos;i reddettiniz.
- </string>
- <string name="GroupMoneyTotal">
- Toplam
- </string>
- <string name="GroupMoneyBought">
- alınan:
- </string>
- <string name="GroupMoneyPaidYou">
- size ödenen:
- </string>
- <string name="GroupMoneyPaidInto">
- şuraya ödenen:
- </string>
- <string name="GroupMoneyBoughtPassTo">
- şuraya geçiş hakkı alınan:
- </string>
- <string name="GroupMoneyPaidFeeForEvent">
- etkinlik için ödenen ücret:
- </string>
- <string name="GroupMoneyPaidPrizeForEvent">
- etkinlik için verilen ödül:
- </string>
- <string name="GroupMoneyBalance">
- Bakiye
- </string>
- <string name="GroupMoneyCredits">
- Katkıda Bulunanlar
- </string>
- <string name="GroupMoneyDebits">
- Borçlar
- </string>
- <string name="GroupMoneyDate">
- [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
- </string>
- <string name="ViewerObjectContents">
- İçerik
- </string>
- <string name="AcquiredItems">
- Alınan Öğeler
- </string>
- <string name="Cancel">
- İptal
- </string>
- <string name="UploadingCosts">
- [NAME] için karşıya yükleme maliyeti: L$ [AMOUNT]
- </string>
- <string name="BuyingCosts">
- Bunu satın almanın maliyeti: L$ [AMOUNT]
- </string>
- <string name="UnknownFileExtension">
- Bilinmeyen dosya uzantısı .%s
-.wav, .tga, .bmp, .jpg, .jpeg veya .bvh bekleniyordu
- </string>
- <string name="MuteObject2">
- Engelle
- </string>
- <string name="MuteAvatar">
- Engelle
- </string>
- <string name="UnmuteObject">
- Engellemeyi Kaldır
- </string>
- <string name="UnmuteAvatar">
- Engellemeyi Kaldır
- </string>
- <string name="AddLandmarkNavBarMenu">
- Yer İmlerime Ekle...
- </string>
- <string name="EditLandmarkNavBarMenu">
- Yer İmimi Düzenle...
- </string>
- <string name="accel-mac-control">
- ⌃
- </string>
- <string name="accel-mac-command">
- ⌘
- </string>
- <string name="accel-mac-option">
- ⌥
- </string>
- <string name="accel-mac-shift">
- ⇧
- </string>
- <string name="accel-win-control">
- Ctrl+
- </string>
- <string name="accel-win-alt">
- Alt+
- </string>
- <string name="accel-win-shift">
- Shift+
- </string>
- <string name="FileSaved">
- Dosya Kaydedildi
- </string>
- <string name="Receiving">
- Alınıyor
- </string>
- <string name="AM">
- ÖÖ
- </string>
- <string name="PM">
- ÖS
- </string>
- <string name="PST">
- PST
- </string>
- <string name="PDT">
- PDT
- </string>
- <string name="Direction_Forward">
- İleri
- </string>
- <string name="Direction_Left">
- Sol
- </string>
- <string name="Direction_Right">
- Sağ
- </string>
- <string name="Direction_Back">
- Geri
- </string>
- <string name="Direction_North">
- Kuzey
- </string>
- <string name="Direction_South">
- Güney
- </string>
- <string name="Direction_West">
- Batı
- </string>
- <string name="Direction_East">
- Doğu
- </string>
- <string name="Direction_Up">
- Yukarı
- </string>
- <string name="Direction_Down">
- Aşağı
- </string>
- <string name="Any Category">
- Herh. Bir Kategori
- </string>
- <string name="Shopping">
- Alışveriş
- </string>
- <string name="Land Rental">
- Arazi Kiralama
- </string>
- <string name="Property Rental">
- Mülk Kiralama
- </string>
- <string name="Special Attraction">
- Özel Atraksiyon
- </string>
- <string name="New Products">
- Yeni Ürünler
- </string>
- <string name="Employment">
- İstihdam
- </string>
- <string name="Wanted">
- Arananlar
- </string>
- <string name="Service">
- Hizmet
- </string>
- <string name="Personal">
- Kişisel
- </string>
- <string name="None">
- Renksiz
- </string>
- <string name="Linden Location">
- Linden Konumu
- </string>
- <string name="Adult">
- Yetişkin
- </string>
- <string name="Arts&amp;Culture">
- Sanat ve Kültür
- </string>
- <string name="Business">
- İş
- </string>
- <string name="Educational">
- Eğitim
- </string>
- <string name="Gaming">
- Oyun
- </string>
- <string name="Hangout">
- Uğrak Mekan
- </string>
- <string name="Newcomer Friendly">
- Yeni Gelenlere Yardım Sunan
- </string>
- <string name="Parks&amp;Nature">
- Park ve Doğa
- </string>
- <string name="Residential">
- Yerleşim
- </string>
- <string name="Stage">
- Sahne
- </string>
- <string name="Other">
- Diğer
- </string>
- <string name="Rental">
- Kiralık
- </string>
- <string name="Any">
- Herhangi
- </string>
- <string name="You">
- Siz
- </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">
- Birden Çok Ortam
- </string>
- <string name="Play Media">
- Ortamı Oynat/Durdur
- </string>
- <string name="MBCmdLineError">
- Komut satırı ayrıştırılırken bir hata oluştu.
-Lütfen bakınız: http://wiki.secondlife.com/wiki/Client_parameters
-Hata:
- </string>
- <string name="MBCmdLineUsg">
- [APP_NAME] Komut satırı kullanımı:
- </string>
- <string name="MBUnableToAccessFile">
- [APP_NAME] ihtiyaç duyduğu bir dosyaya erişemiyor.
-
-Bunun nedeni bir şekilde birden fazla kopyanın çalışıyor olması veya sisteminizin, bir dosyanın açık olduğunu sanması olabilir.
-Bu iletiyi görmeye devam ederseniz, bilgisayarınızı yeniden başlatın ve tekrar deneyin.
-Sorun devam ederse [APP_NAME] uygulamasını tümüyle kaldırmanız ve tekrar yüklemeniz gerekebilir.
- </string>
- <string name="MBFatalError">
- Önemli Hata
- </string>
- <string name="MBRequiresAltiVec">
- [APP_NAME], AltiVec (G4 veya üzeri) bir işlemciye ihtiyaç duyuyor.
- </string>
- <string name="MBAlreadyRunning">
- [APP_NAME] zaten çalışıyor.
-Programın simge durumuna küçültülmüş bir kopyası için görev çubuğunuza bakın.
-Bu iletiyi görmeye devam ederseniz, bilgisayarınızı tekrar başlatın.
- </string>
- <string name="MBFrozenCrashed">
- [APP_NAME] uygulaması bir önceki çalıştırmada kilitlenmiş görünüyor.
-Bir kilitlenme raporu göndermek ister misiniz?
- </string>
- <string name="MBAlert">
- Bildirim
- </string>
- <string name="MBNoDirectX">
- [APP_NAME], DirectX 9.0b veya üzerini saptayamıyor.
-[APP_NAME], kararlılık problemleri, kötü performans ve çökmelere neden olabilecek donanım ve/veya süresi geçmiş sürücüleri saptamak için DirectX kullanır. [APP_NAME] uygulamasını bu olmadan da çalıştırmanız mümkündür, ancak DirectX 9.0b ile çalıştırmanızı kuvvetle tavsiye ederiz.
-
-Devam etmek istiyor musunuz?
- </string>
- <string name="MBWarning">
- Uyarı
- </string>
- <string name="MBNoAutoUpdate">
- Linux için henüz otomatik güncelleştirme uygulanmamıştır.
-Lütfen www.secondlife.com adresinden son sürümü karşıdan yükleyin.
- </string>
- <string name="MBRegClassFailed">
- RegisterClass başarısız oldu
- </string>
- <string name="MBError">
- Hata
- </string>
- <string name="MBFullScreenErr">
- [WIDTH] x [HEIGHT] çözünürlüğünde tam ekran çalıştırma yapılamıyor.
-Pencerede çalışıyor.
- </string>
- <string name="MBDestroyWinFailed">
- Pencere yok edilirken Kapatma Hatası oluştu (DestroyWindow() başarısız oldu)
- </string>
- <string name="MBShutdownErr">
- Kapatma Hatası
- </string>
- <string name="MBDevContextErr">
- GL cihazı içeriği oluşturulamıyor
- </string>
- <string name="MBPixelFmtErr">
- Uygun piksel formatı bulunamadı
- </string>
- <string name="MBPixelFmtDescErr">
- Piksel formatı açıklaması alınamıyor
- </string>
- <string name="MBTrueColorWindow">
- [APP_NAME] uygulamasının çalışması için Gerçek Renk (32 bit) gerekiyor.
-Lütfen bilgisayarınızın ekran ayarlarına gidin ve renk modunu 32 bit olarak ayarlayın.
- </string>
- <string name="MBAlpha">
- [APP_NAME] çalışamıyor çünkü 8 bit bir alfa kanalı alamıyor. Bunun nedeni genellikle video kartı sürücü sorunlarıdır.
-Lütfen en yeni video sürücülerinin yüklü olduğuna emin olun.
-Ayrıca Denetim Masaları &gt; Ekran &gt; Ayarlar içerisinde ekranınız için Gerçek Renk (32 bit) ayarı yapıldığına emin olun.
-Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
- </string>
- <string name="MBPixelFmtSetErr">
- Piksel formatı ayarlanamıyor
- </string>
- <string name="MBGLContextErr">
- GL işlemi bağlamı oluşturulamıyor
- </string>
- <string name="MBGLContextActErr">
- GL işlemi bağlamı etkinleştirilemiyor
- </string>
- <string name="MBVideoDrvErr">
- [APP_NAME] çalışamıyor çünkü video kartı sürücüleriniz düzgün yüklenemedi, süresi geçmiş durumda veya desteklenmeyen donanımlar için geliştirilmiş. Lütfen en yeni video kartı sürücülerine sahip olduğunuza emin olun; en yeni sürücüler mevcutsa da bunları tekrar yüklemeyi deneyin.
-
-Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
- </string>
- <string name="5 O&apos;Clock Shadow">
- Bir Günlük Sakal
- </string>
- <string name="All White">
- Tümü Beyaz
- </string>
- <string name="Anime Eyes">
- Anime Gözler
- </string>
- <string name="Arced">
- Yay Şeklinde
- </string>
- <string name="Arm Length">
- Kol Uzunluğu
- </string>
- <string name="Attached">
- Bitişik
- </string>
- <string name="Attached Earlobes">
- Kafaya Bitişik Kulak Memeleri
- </string>
- <string name="Back Fringe">
- Arka Perçem
- </string>
- <string name="Baggy">
- Torbalı
- </string>
- <string name="Bangs">
- Kahküller
- </string>
- <string name="Beady Eyes">
- Boncuk Gözler
- </string>
- <string name="Belly Size">
- Göbek Büyüklüğü
- </string>
- <string name="Big">
- Büyük
- </string>
- <string name="Big Butt">
- Büyük Kıç
- </string>
- <string name="Big Hair Back">
- Kabarık Saç: Arkada
- </string>
- <string name="Big Hair Front">
- Kabarık Saç: Önde
- </string>
- <string name="Big Hair Top">
- Kabarık Saç: Tepede
- </string>
- <string name="Big Head">
- Büyük Kafa
- </string>
- <string name="Big Pectorals">
- Büyük Göğüs Kasları
- </string>
- <string name="Big Spikes">
- Büyük Dik Kısımlar
- </string>
- <string name="Black">
- Siyah
- </string>
- <string name="Blonde">
- Sarışın
- </string>
- <string name="Blonde Hair">
- Sarı Saç
- </string>
- <string name="Blush">
- Allık
- </string>
- <string name="Blush Color">
- Allık Rengi
- </string>
- <string name="Blush Opacity">
- Allık Geçirgenliği
- </string>
- <string name="Body Definition">
- Vücut Tanımı
- </string>
- <string name="Body Fat">
- Vücut Yağı
- </string>
- <string name="Body Freckles">
- Vücut Çilleri
- </string>
- <string name="Body Thick">
- Kalın Vücut
- </string>
- <string name="Body Thickness">
- Vücut Kalınlığı
- </string>
- <string name="Body Thin">
- İnce Vücut
- </string>
- <string name="Bow Legged">
- Çarpık Bacaklı
- </string>
- <string name="Breast Buoyancy">
- Göğüs Kalkıklığı
- </string>
- <string name="Breast Cleavage">
- Göğüs Çatalı
- </string>
- <string name="Breast Size">
- Göğüs Büyüklüğü
- </string>
- <string name="Bridge Width">
- Burun Kemiği Genişliği
- </string>
- <string name="Broad">
- Geniş
- </string>
- <string name="Brow Size">
- Alın Genişliği
- </string>
- <string name="Bug Eyes">
- Patlak Gözlü
- </string>
- <string name="Bugged Eyes">
- Patlak Gözlü
- </string>
- <string name="Bulbous">
- Patates Burunlu
- </string>
- <string name="Bulbous Nose">
- Patates Burunlu
- </string>
- <string name="Breast Physics Mass">
- Göğüs Kütlesi
- </string>
- <string name="Breast Physics Smoothing">
- Göğüs Düzleştirme
- </string>
- <string name="Breast Physics Gravity">
- Göğüs Yerçekimi
- </string>
- <string name="Breast Physics Drag">
- Göğüs Direnci
- </string>
- <string name="Breast Physics InOut Max Effect">
- Maks Etki
- </string>
- <string name="Breast Physics InOut Spring">
- Yaylanma
- </string>
- <string name="Breast Physics InOut Gain">
- Kazanç
- </string>
- <string name="Breast Physics InOut Damping">
- Sönüm
- </string>
- <string name="Breast Physics UpDown Max Effect">
- Maks Etki
- </string>
- <string name="Breast Physics UpDown Spring">
- Yaylanma
- </string>
- <string name="Breast Physics UpDown Gain">
- Kazanç
- </string>
- <string name="Breast Physics UpDown Damping">
- Sönüm
- </string>
- <string name="Breast Physics LeftRight Max Effect">
- Maks Etki
- </string>
- <string name="Breast Physics LeftRight Spring">
- Yaylanma
- </string>
- <string name="Breast Physics LeftRight Gain">
- Kazanç
- </string>
- <string name="Breast Physics LeftRight Damping">
- Sönüm
- </string>
- <string name="Belly Physics Mass">
- Göbek Kütlesi
- </string>
- <string name="Belly Physics Smoothing">
- Göbek Düzleştirme
- </string>
- <string name="Belly Physics Gravity">
- Göbek Yerçekimi
- </string>
- <string name="Belly Physics Drag">
- Göbek Direnci
- </string>
- <string name="Belly Physics UpDown Max Effect">
- Maks Etki
- </string>
- <string name="Belly Physics UpDown Spring">
- Yaylanma
- </string>
- <string name="Belly Physics UpDown Gain">
- Kazanç
- </string>
- <string name="Belly Physics UpDown Damping">
- Sönüm
- </string>
- <string name="Butt Physics Mass">
- Kıç Kütlesi
- </string>
- <string name="Butt Physics Smoothing">
- Kıç Düzleştirme
- </string>
- <string name="Butt Physics Gravity">
- Kıç Yerçekimi
- </string>
- <string name="Butt Physics Drag">
- Kıç Direnci
- </string>
- <string name="Butt Physics UpDown Max Effect">
- Maks Etki
- </string>
- <string name="Butt Physics UpDown Spring">
- Yaylanma
- </string>
- <string name="Butt Physics UpDown Gain">
- Kazanç
- </string>
- <string name="Butt Physics UpDown Damping">
- Sönüm
- </string>
- <string name="Butt Physics LeftRight Max Effect">
- Maks Etki
- </string>
- <string name="Butt Physics LeftRight Spring">
- Yaylanma
- </string>
- <string name="Butt Physics LeftRight Gain">
- Kazanç
- </string>
- <string name="Butt Physics LeftRight Damping">
- Sönüm
- </string>
- <string name="Bushy Eyebrows">
- Gür Kaşlar
- </string>
- <string name="Bushy Hair">
- Gür Saç
- </string>
- <string name="Butt Size">
- Kıç Büyüklüğü
- </string>
- <string name="Butt Gravity">
- Kıç Yerçekimi
- </string>
- <string name="bustle skirt">
- Tarlatanlı Etek
- </string>
- <string name="no bustle">
- Tarlatansız
- </string>
- <string name="more bustle">
- Çok Tarlatanlı
- </string>
- <string name="Chaplin">
- Chaplin pantalon
- </string>
- <string name="Cheek Bones">
- Elmacık Kemikleri
- </string>
- <string name="Chest Size">
- Göğüs Büyüklüğü
- </string>
- <string name="Chin Angle">
- Çene Açısı
- </string>
- <string name="Chin Cleft">
- Çene Çukuru
- </string>
- <string name="Chin Curtains">
- Lincoln Sakal
- </string>
- <string name="Chin Depth">
- Çene Derinliği
- </string>
- <string name="Chin Heavy">
- Geniş Çene
- </string>
- <string name="Chin In">
- Çene İçeri
- </string>
- <string name="Chin Out">
- Çene Dışarı
- </string>
- <string name="Chin-Neck">
- Çene-Boyun
- </string>
- <string name="Clear">
- Temizle
- </string>
- <string name="Cleft">
- Çukur
- </string>
- <string name="Close Set Eyes">
- Yakın Gözler
- </string>
- <string name="Closed">
- Kapalı
- </string>
- <string name="Closed Back">
- Arkası Kapalı
- </string>
- <string name="Closed Front">
- Önü Kapalı
- </string>
- <string name="Closed Left">
- Solu Kapalı
- </string>
- <string name="Closed Right">
- Sağı Kapalı
- </string>
- <string name="Coin Purse">
- Para Cüzdanı
- </string>
- <string name="Collar Back">
- Yaka Arkası
- </string>
- <string name="Collar Front">
- Yaka Önü
- </string>
- <string name="Corner Down">
- Köşesi Aşağıda
- </string>
- <string name="Corner Up">
- Köşesi Yukarıda
- </string>
- <string name="Creased">
- Kırışık
- </string>
- <string name="Crooked Nose">
- Yamuk Burun
- </string>
- <string name="Cuff Flare">
- Geniş Paça
- </string>
- <string name="Dark">
- Karanlık
- </string>
- <string name="Dark Green">
- Koyu Yeşil
- </string>
- <string name="Darker">
- Daha Koyu
- </string>
- <string name="Deep">
- Derin
- </string>
- <string name="Default Heels">
- Varsayılan Topuklar
- </string>
- <string name="Dense">
- Yoğun
- </string>
- <string name="Double Chin">
- Çift Çene
- </string>
- <string name="Downturned">
- Aşağı Dönük
- </string>
- <string name="Duffle Bag">
- Spor Çanta
- </string>
- <string name="Ear Angle">
- Kulak Açısı
- </string>
- <string name="Ear Size">
- Kulak Büyüklüğü
- </string>
- <string name="Ear Tips">
- Kulak Uçları
- </string>
- <string name="Egg Head">
- Yumurta Kafa
- </string>
- <string name="Eye Bags">
- Göz Altı Torbaları
- </string>
- <string name="Eye Color">
- Göz Rengi
- </string>
- <string name="Eye Depth">
- Gözün İçeri Çöküklüğü
- </string>
- <string name="Eye Lightness">
- Göz Parlaklığı
- </string>
- <string name="Eye Opening">
- Göz Açıklığı
- </string>
- <string name="Eye Pop">
- Gözlerin Dışarı Çıkıklığı
- </string>
- <string name="Eye Size">
- Göz Büyüklüğü
- </string>
- <string name="Eye Spacing">
- Gözlerin Aralığı
- </string>
- <string name="Eyebrow Arc">
- Kaş Kavisi
- </string>
- <string name="Eyebrow Density">
- Kaş Kalınlığı
- </string>
- <string name="Eyebrow Height">
- Kaş Yüksekliği
- </string>
- <string name="Eyebrow Points">
- Kaş Yapısı
- </string>
- <string name="Eyebrow Size">
- Kaş Büyüklüğü
- </string>
- <string name="Eyelash Length">
- Kirpik Uzunluğu
- </string>
- <string name="Eyeliner">
- Göz Kalemi
- </string>
- <string name="Eyeliner Color">
- Göz Kalemi Rengi
- </string>
- <string name="Eyes Bugged">
- Patlak Gözler
- </string>
- <string name="Face Shear">
- Dikey Yüz Kaydırma
- </string>
- <string name="Facial Definition">
- Yüz İfadesi
- </string>
- <string name="Far Set Eyes">
- Ayrık Gözler
- </string>
- <string name="Fat Lips">
- Kalın Dudaklar
- </string>
- <string name="Female">
- Kadın
- </string>
- <string name="Fingerless">
- Parmaksız
- </string>
- <string name="Fingers">
- Parmaklar
- </string>
- <string name="Flared Cuffs">
- Geniş Paçalar
- </string>
- <string name="Flat">
- Düz
- </string>
- <string name="Flat Butt">
- Düz Kıç
- </string>
- <string name="Flat Head">
- Düz Kafa
- </string>
- <string name="Flat Toe">
- Düz Ayak Ucu
- </string>
- <string name="Foot Size">
- Ayak Büyüklüğü
- </string>
- <string name="Forehead Angle">
- Alın Açısı
- </string>
- <string name="Forehead Heavy">
- Belirgin Alın
- </string>
- <string name="Freckles">
- Çiller
- </string>
- <string name="Front Fringe">
- Ön Perçem
- </string>
- <string name="Full Back">
- Arkası Düz
- </string>
- <string name="Full Eyeliner">
- Çift Taraflı Göz Kalemi
- </string>
- <string name="Full Front">
- Önü Düz
- </string>
- <string name="Full Hair Sides">
- Saçlar Yanda
- </string>
- <string name="Full Sides">
- Saçlar Yanda
- </string>
- <string name="Glossy">
- Parlak
- </string>
- <string name="Glove Fingers">
- Eldiven Parmakları
- </string>
- <string name="Glove Length">
- Eldiven Uzunluğu
- </string>
- <string name="Hair">
- Saç
- </string>
- <string name="Hair Back">
- Saç: Arka
- </string>
- <string name="Hair Front">
- Saç: Ön
- </string>
- <string name="Hair Sides">
- Saç: Yanlar
- </string>
- <string name="Hair Sweep">
- Saçı Yana Tarama
- </string>
- <string name="Hair Thickess">
- Saç Kalınlığı
- </string>
- <string name="Hair Thickness">
- Saç Kalınlığı
- </string>
- <string name="Hair Tilt">
- Saç Eğimi
- </string>
- <string name="Hair Tilted Left">
- Sola Eğimli Saç
- </string>
- <string name="Hair Tilted Right">
- Sağa Eğimli Saç
- </string>
- <string name="Hair Volume">
- Saç: Hacim
- </string>
- <string name="Hand Size">
- El Büyüklüğü
- </string>
- <string name="Handlebars">
- Gidon tipi
- </string>
- <string name="Head Length">
- Kafa Uzunluğu
- </string>
- <string name="Head Shape">
- Kafa Şekli
- </string>
- <string name="Head Size">
- Kafa Büyüklüğü
- </string>
- <string name="Head Stretch">
- Kafayı Uzatma
- </string>
- <string name="Heel Height">
- Topuk Yüksekliği
- </string>
- <string name="Heel Shape">
- Topuk Şekli
- </string>
- <string name="Height">
- Yükseklik
- </string>
- <string name="High">
- Yüksek
- </string>
- <string name="High Heels">
- Yüksek Topuklar
- </string>
- <string name="High Jaw">
- Ayrık
- </string>
- <string name="High Platforms">
- Yüksek Topuklu
- </string>
- <string name="High and Tight">
- Düşük
- </string>
- <string name="Higher">
- Daha Yüksek
- </string>
- <string name="Hip Length">
- Kalça Uzunluğu
- </string>
- <string name="Hip Width">
- Kalça Genişliği
- </string>
- <string name="In">
- İçeri
- </string>
- <string name="In Shdw Color">
- İç Gölge Rengi
- </string>
- <string name="In Shdw Opacity">
- İç Gölge Opaklığı
- </string>
- <string name="Inner Eye Corner">
- Gözün İç Köşesi
- </string>
- <string name="Inner Eye Shadow">
- İç Göz Gölgesi
- </string>
- <string name="Inner Shadow">
- İç Gölge
- </string>
- <string name="Jacket Length">
- Ceket Uzunluğu
- </string>
- <string name="Jacket Wrinkles">
- Ceket Kırışıklıkları
- </string>
- <string name="Jaw Angle">
- Çenenin Boyuna Uzaklığı
- </string>
- <string name="Jaw Jut">
- Alt Çene Uzunluğu
- </string>
- <string name="Jaw Shape">
- Çene Kemiği Genişliği
- </string>
- <string name="Join">
- Birleşik
- </string>
- <string name="Jowls">
- Avurtlar
- </string>
- <string name="Knee Angle">
- Diz Açısı
- </string>
- <string name="Knock Kneed">
- Çarpık Bacaklı
- </string>
- <string name="Large">
- Büyük
- </string>
- <string name="Large Hands">
- Büyük Eller
- </string>
- <string name="Left Part">
- Sola Ayırma
- </string>
- <string name="Leg Length">
- Bacak Uzunluğu
- </string>
- <string name="Leg Muscles">
- Bacak Kasları
- </string>
- <string name="Less">
- Daha Az
- </string>
- <string name="Less Body Fat">
- Daha Az Vücut Yağı
- </string>
- <string name="Less Curtains">
- Daha Az Lincoln Sakal
- </string>
- <string name="Less Freckles">
- Daha Az Çil
- </string>
- <string name="Less Full">
- Daha Az Dolgun
- </string>
- <string name="Less Gravity">
- Dik Göğüs
- </string>
- <string name="Less Love">
- Daha İnce Bel
- </string>
- <string name="Less Muscles">
- Daha Az Kas
- </string>
- <string name="Less Muscular">
- Daha Az Kaslı
- </string>
- <string name="Less Rosy">
- Daha Az Pembe
- </string>
- <string name="Less Round">
- Daha Az Yuvarlak
- </string>
- <string name="Less Saddle">
- Basensiz
- </string>
- <string name="Less Square">
- Daha Az Küt
- </string>
- <string name="Less Volume">
- Daha Az Hacim
- </string>
- <string name="Less soul">
- Daha az ruh
- </string>
- <string name="Lighter">
- Daha Hafif
- </string>
- <string name="Lip Cleft">
- Dudak Çukuru
- </string>
- <string name="Lip Cleft Depth">
- Dudak Çukuru Derinliği
- </string>
- <string name="Lip Fullness">
- Dudak Dolgunluğu
- </string>
- <string name="Lip Pinkness">
- Dudak Pembeliği
- </string>
- <string name="Lip Ratio">
- Dudak Oranı
- </string>
- <string name="Lip Thickness">
- Dudak Kalınlığı
- </string>
- <string name="Lip Width">
- Dudak Genişliği
- </string>
- <string name="Lipgloss">
- Dudak Parlatıcısı
- </string>
- <string name="Lipstick">
- Ruj
- </string>
- <string name="Lipstick Color">
- Ruj Rengi
- </string>
- <string name="Long">
- Uzun
- </string>
- <string name="Long Head">
- Uzun Kafa
- </string>
- <string name="Long Hips">
- Yüksek kalça
- </string>
- <string name="Long Legs">
- Uzun Bacaklar
- </string>
- <string name="Long Neck">
- Uzun Boyun
- </string>
- <string name="Long Pigtails">
- Yandan Uzun Kuyruk
- </string>
- <string name="Long Ponytail">
- Uzun Atkuyruğu
- </string>
- <string name="Long Torso">
- Uzun Gövde
- </string>
- <string name="Long arms">
- Uzun kollar
- </string>
- <string name="Loose Pants">
- Bol Pantolon
- </string>
- <string name="Loose Shirt">
- Bol Gömlek
- </string>
- <string name="Loose Sleeves">
- Bol Kollu
- </string>
- <string name="Love Handles">
- Bel Kalınlığı
- </string>
- <string name="Low">
- Düşük
- </string>
- <string name="Low Heels">
- Alçak Topuklar
- </string>
- <string name="Low Jaw">
- Bitişik
- </string>
- <string name="Low Platforms">
- Alçak Topuklu
- </string>
- <string name="Low and Loose">
- Yüksek
- </string>
- <string name="Lower">
- Daha Alçak
- </string>
- <string name="Lower Bridge">
- Alt Burun Kemiği
- </string>
- <string name="Lower Cheeks">
- Daha Alçak Yanaklar
- </string>
- <string name="Male">
- Erkek
- </string>
- <string name="Middle Part">
- Ortadan Ayırma
- </string>
- <string name="More">
- Daha Fazla
- </string>
- <string name="More Blush">
- Daha Fazla Allık
- </string>
- <string name="More Body Fat">
- Daha Fazla Vücut Yağı
- </string>
- <string name="More Curtains">
- Daha Çok Lincoln Sakal
- </string>
- <string name="More Eyeshadow">
- Daha Fazla Göz Farı
- </string>
- <string name="More Freckles">
- Daha Çok Çil
- </string>
- <string name="More Full">
- Daha Dolgun
- </string>
- <string name="More Gravity">
- Sarkık Göğüs
- </string>
- <string name="More Lipstick">
- Daha Çok Ruj
- </string>
- <string name="More Love">
- Daha Kalın Bel
- </string>
- <string name="More Lower Lip">
- Daha Dolgun Alt Dudak
- </string>
- <string name="More Muscles">
- Daha Çok Kas
- </string>
- <string name="More Muscular">
- Daha Kaslı
- </string>
- <string name="More Rosy">
- Daha Pembe
- </string>
- <string name="More Round">
- Daha Yuvarlak
- </string>
- <string name="More Saddle">
- Basenli
- </string>
- <string name="More Sloped">
- Daha Eğimli
- </string>
- <string name="More Square">
- Daha Küt
- </string>
- <string name="More Upper Lip">
- Daha Dolgun Üst Dudak
- </string>
- <string name="More Vertical">
- Daha Dikey
- </string>
- <string name="More Volume">
- Daha Hacimli
- </string>
- <string name="More soul">
- Daha çok ruh
- </string>
- <string name="Moustache">
- Bıyık
- </string>
- <string name="Mouth Corner">
- Ağız Köşesi
- </string>
- <string name="Mouth Position">
- Ağzın Konumu
- </string>
- <string name="Mowhawk">
- Mowhawk Saçı
- </string>
- <string name="Muscular">
- Kaslı
- </string>
- <string name="Mutton Chops">
- Geniş Favori
- </string>
- <string name="Nail Polish">
- Tırnak Cilası
- </string>
- <string name="Nail Polish Color">
- Tırnak Cilası Rengi
- </string>
- <string name="Narrow">
- Dar
- </string>
- <string name="Narrow Back">
- Arkası Dar
- </string>
- <string name="Narrow Front">
- Önü Dar
- </string>
- <string name="Narrow Lips">
- Küçük Dudaklar
- </string>
- <string name="Natural">
- Doğal
- </string>
- <string name="Neck Length">
- Boyun Uzunluğu
- </string>
- <string name="Neck Thickness">
- Boyun Kalınlığı
- </string>
- <string name="No Blush">
- Allık Yok
- </string>
- <string name="No Eyeliner">
- Göz Kalemi Yok
- </string>
- <string name="No Eyeshadow">
- Göz Farı Yok
- </string>
- <string name="No Lipgloss">
- Dudak Parlatıcısı Yok
- </string>
- <string name="No Lipstick">
- Ruj Yok
- </string>
- <string name="No Part">
- Ayırma Yok
- </string>
- <string name="No Polish">
- Cila Yok
- </string>
- <string name="No Red">
- Kırmızı Yok
- </string>
- <string name="No Spikes">
- Dikleştirme Yok
- </string>
- <string name="No White">
- Beyaz Yok
- </string>
- <string name="No Wrinkles">
- Kırışıklık Yok
- </string>
- <string name="Normal Lower">
- Normal Alt
- </string>
- <string name="Normal Upper">
- Normal Üst
- </string>
- <string name="Nose Left">
- Sola Eğimli Burun
- </string>
- <string name="Nose Right">
- Sağa Eğimli Burun
- </string>
- <string name="Nose Size">
- Burun Büyüklüğü
- </string>
- <string name="Nose Thickness">
- Burun Kalınlığı
- </string>
- <string name="Nose Tip Angle">
- Burun Ucu Açısı
- </string>
- <string name="Nose Tip Shape">
- Burun Ucu Şekli
- </string>
- <string name="Nose Width">
- Burun Genişliği
- </string>
- <string name="Nostril Division">
- Burun Deliği Ayrımı
- </string>
- <string name="Nostril Width">
- Burun Deliği Genişliği
- </string>
- <string name="Opaque">
- Opak
- </string>
- <string name="Open">
- Aç
- </string>
- <string name="Open Back">
- Arkayı Aç
- </string>
- <string name="Open Front">
- Önü Aç
- </string>
- <string name="Open Left">
- Solu Aç
- </string>
- <string name="Open Right">
- Sağı Aç
- </string>
- <string name="Orange">
- Turuncu
- </string>
- <string name="Out">
- Dışarı
- </string>
- <string name="Out Shdw Color">
- Dış Gölge Rengi
- </string>
- <string name="Out Shdw Opacity">
- Dış Gölge Opaklığı
- </string>
- <string name="Outer Eye Corner">
- Gözün Dış Köşesi
- </string>
- <string name="Outer Eye Shadow">
- Dış Göz Gölgesi
- </string>
- <string name="Outer Shadow">
- Dış Gölge
- </string>
- <string name="Overbite">
- Öne Doğru
- </string>
- <string name="Package">
- Apış Arası Şişkinliği
- </string>
- <string name="Painted Nails">
- Ojeli Tırnaklar
- </string>
- <string name="Pale">
- Soluk
- </string>
- <string name="Pants Crotch">
- Pantolon Ağı
- </string>
- <string name="Pants Fit">
- Pantolon Oturması
- </string>
- <string name="Pants Length">
- Pantolon Uzunluğu
- </string>
- <string name="Pants Waist">
- Pantolon Bel Ölçüsü
- </string>
- <string name="Pants Wrinkles">
- Pantolon Kırışıklıkları
- </string>
- <string name="Part">
- Ayırma
- </string>
- <string name="Part Bangs">
- Ayrılmış Kahküller
- </string>
- <string name="Pectorals">
- Göğüs Kasları
- </string>
- <string name="Pigment">
- Pigment
- </string>
- <string name="Pigtails">
- Yan Kuyruklar
- </string>
- <string name="Pink">
- Pembe
- </string>
- <string name="Pinker">
- Daha Pembe
- </string>
- <string name="Platform Height">
- Topuk Yüksekliği
- </string>
- <string name="Platform Width">
- Topuk Genişliği
- </string>
- <string name="Pointy">
- Dar
- </string>
- <string name="Pointy Heels">
- Sivri Topuklar
- </string>
- <string name="Ponytail">
- Atkuyruğu
- </string>
- <string name="Poofy Skirt">
- Kabarık Etek
- </string>
- <string name="Pop Left Eye">
- Sol Gözü Dışarı Çıkar
- </string>
- <string name="Pop Right Eye">
- Sağ Gözü Dışarı Çıkar
- </string>
- <string name="Puffy">
- Şişkin
- </string>
- <string name="Puffy Eyelids">
- Şişkin Göz Kapakları
- </string>
- <string name="Rainbow Color">
- Gökkuşağı Rengi
- </string>
- <string name="Red Hair">
- Kırmızı Saç
- </string>
- <string name="Regular">
- Normal
- </string>
- <string name="Right Part">
- Sağa Ayırma
- </string>
- <string name="Rosy Complexion">
- Kırmızı Yanaklı
- </string>
- <string name="Round">
- Yuvarlak
- </string>
- <string name="Ruddiness">
- Kırmızılık
- </string>
- <string name="Ruddy">
- Kırmızı
- </string>
- <string name="Rumpled Hair">
- Dağınık Saç
- </string>
- <string name="Saddle Bags">
- Basen Genişliği
- </string>
- <string name="Scrawny Leg">
- Sıska Bacak
- </string>
- <string name="Separate">
- Ayrık
- </string>
- <string name="Shallow">
- Sığ
- </string>
- <string name="Shear Back">
- Arka Dolgunluğu
- </string>
- <string name="Shear Face">
- Yüzü Dikey Kaydır
- </string>
- <string name="Shear Front">
- Ön Dolgunluğu
- </string>
- <string name="Shear Left Up">
- Solu Yukarı Kaydır
- </string>
- <string name="Shear Right Up">
- Sağı Yukarı Kaydır
- </string>
- <string name="Sheared Back">
- Arkası Dolgun
- </string>
- <string name="Sheared Front">
- Önü Dolgun
- </string>
- <string name="Shift Left">
- Sola Kaydır
- </string>
- <string name="Shift Mouth">
- Ağzı Kaydırma
- </string>
- <string name="Shift Right">
- Sağa Kaydır
- </string>
- <string name="Shirt Bottom">
- Gömlek Eteği
- </string>
- <string name="Shirt Fit">
- Gömlek Boyu
- </string>
- <string name="Shirt Wrinkles">
- Gömlek Kırışıklıkları
- </string>
- <string name="Shoe Height">
- Ayakkabı Yüksekliği
- </string>
- <string name="Short">
- Kısa
- </string>
- <string name="Short Arms">
- Kısa Kollar
- </string>
- <string name="Short Legs">
- Kısa Bacaklar
- </string>
- <string name="Short Neck">
- Kısa Boyun
- </string>
- <string name="Short Pigtails">
- Yandan Kısa Kuyruk
- </string>
- <string name="Short Ponytail">
- Kısa Atkuyruğu
- </string>
- <string name="Short Sideburns">
- Kısa Favoriler
- </string>
- <string name="Short Torso">
- Kısa Gövde
- </string>
- <string name="Short hips">
- Düşük kalça
- </string>
- <string name="Shoulders">
- Omuzlar
- </string>
- <string name="Side Fringe">
- Yan Perçem
- </string>
- <string name="Sideburns">
- Favoriler
- </string>
- <string name="Sides Hair">
- Yan Saçlar
- </string>
- <string name="Sides Hair Down">
- Aşağı Doğru Yan Saç
- </string>
- <string name="Sides Hair Up">
- Yukarı Doğru Yan Saç
- </string>
- <string name="Skinny Neck">
- İnce Boyun
- </string>
- <string name="Skirt Fit">
- Etek Boyu
- </string>
- <string name="Skirt Length">
- Etek Uzunluğu
- </string>
- <string name="Slanted Forehead">
- Eğimli Alın
- </string>
- <string name="Sleeve Length">
- Kol Uzunluğu
- </string>
- <string name="Sleeve Looseness">
- Kol Bolluğu
- </string>
- <string name="Slit Back">
- Yırtmaç: Geri
- </string>
- <string name="Slit Front">
- Yırtmaç: Ön
- </string>
- <string name="Slit Left">
- Yırtmaç: Sol
- </string>
- <string name="Slit Right">
- Yırtmaç: Sağ
- </string>
- <string name="Small">
- Küçük
- </string>
- <string name="Small Hands">
- Küçük Eller
- </string>
- <string name="Small Head">
- Küçük Kafa
- </string>
- <string name="Smooth">
- Düz
- </string>
- <string name="Smooth Hair">
- Düz Saç
- </string>
- <string name="Socks Length">
- Çorap Uzunluğu
- </string>
- <string name="Soulpatch">
- Dudak Altı Sakal
- </string>
- <string name="Sparse">
- Seyrek
- </string>
- <string name="Spiked Hair">
- Dikleştirilmiş Saç
- </string>
- <string name="Square">
- Geniş
- </string>
- <string name="Square Toe">
- Küt Burunlu
- </string>
- <string name="Squash Head">
- Kafayı Bastır
- </string>
- <string name="Stretch Head">
- Kafayı Uzat
- </string>
- <string name="Sunken">
- Çökük
- </string>
- <string name="Sunken Chest">
- Çökük Göğüs
- </string>
- <string name="Sunken Eyes">
- Çökük Gözler
- </string>
- <string name="Sweep Back">
- Arkaya Tarama
- </string>
- <string name="Sweep Forward">
- Öne Tarama
- </string>
- <string name="Tall">
- Uzun
- </string>
- <string name="Taper Back">
- Arkası Kısa
- </string>
- <string name="Taper Front">
- Önü Kısa
- </string>
- <string name="Thick Heels">
- Kalın Topuklar
- </string>
- <string name="Thick Neck">
- Kalın Boyun
- </string>
- <string name="Thick Toe">
- Kalın Ayak Ucu
- </string>
- <string name="Thin">
- İnce
- </string>
- <string name="Thin Eyebrows">
- İnce Kaşlar
- </string>
- <string name="Thin Lips">
- İnce Dudaklar
- </string>
- <string name="Thin Nose">
- İnce Burun
- </string>
- <string name="Tight Chin">
- Çift Çene
- </string>
- <string name="Tight Cuffs">
- Dar Paçalar
- </string>
- <string name="Tight Pants">
- Dar Pantolon
- </string>
- <string name="Tight Shirt">
- Dar Gömlek
- </string>
- <string name="Tight Skirt">
- Dar Etek
- </string>
- <string name="Tight Sleeves">
- Dar Kollu
- </string>
- <string name="Toe Shape">
- Ayakkabu Burnu Şekli
- </string>
- <string name="Toe Thickness">
- Ayakkabu Burnu Kalınlığı
- </string>
- <string name="Torso Length">
- Gövde Uzunluğu
- </string>
- <string name="Torso Muscles">
- Gövde Kasları
- </string>
- <string name="Torso Scrawny">
- Sıska Gövde
- </string>
- <string name="Unattached">
- Ayrık
- </string>
- <string name="Uncreased">
- Buruşuk olmayan
- </string>
- <string name="Underbite">
- Geriye Doğru
- </string>
- <string name="Unnatural">
- Doğal Olmayan
- </string>
- <string name="Upper Bridge">
- Üst Burun Kemiği
- </string>
- <string name="Upper Cheeks">
- Üst Yanaklar
- </string>
- <string name="Upper Chin Cleft">
- Üst Çene Çukuru
- </string>
- <string name="Upper Eyelid Fold">
- Üst Göz Kapağı Kıvrımı
- </string>
- <string name="Upturned">
- Yukarı dönük
- </string>
- <string name="Very Red">
- Çok Kırmızı
- </string>
- <string name="Waist Height">
- Bel Yüksekliği
- </string>
- <string name="Well-Fed">
- Dolgun
- </string>
- <string name="White Hair">
- Beyaz Saç
- </string>
- <string name="Wide">
- Geniş
- </string>
- <string name="Wide Back">
- Geniş Arka
- </string>
- <string name="Wide Front">
- Geniş Ön
- </string>
- <string name="Wide Lips">
- Geniş Dudaklar
- </string>
- <string name="Wild">
- Çılgın
- </string>
- <string name="Wrinkles">
- Kırışıklıklar
- </string>
- <string name="LocationCtrlAddLandmarkTooltip">
- Yer İmlerime Ekle
- </string>
- <string name="LocationCtrlEditLandmarkTooltip">
- Yer İmimi Düzenle
- </string>
- <string name="LocationCtrlInfoBtnTooltip">
- Geçerli konum hakkında daha fazla bilgi gör
- </string>
- <string name="LocationCtrlComboBtnTooltip">
- Konum geçmişim
- </string>
- <string name="LocationCtrlForSaleTooltip">
- Bu araziyi satın al
- </string>
- <string name="LocationCtrlVoiceTooltip">
- Ses burada kullanılamaz
- </string>
- <string name="LocationCtrlFlyTooltip">
- Uçmaya izin verilmiyor
- </string>
- <string name="LocationCtrlPushTooltip">
- İtme yok
- </string>
- <string name="LocationCtrlBuildTooltip">
- Nesne inşa etmeye/düşürmeye izin verilmiyor
- </string>
- <string name="LocationCtrlScriptsTooltip">
- Komut dosyalarına izin verilmiyor
- </string>
- <string name="LocationCtrlDamageTooltip">
- Sağlık
- </string>
- <string name="LocationCtrlAdultIconTooltip">
- Yetişkin Bölgesi
- </string>
- <string name="LocationCtrlModerateIconTooltip">
- Orta Bölge
- </string>
- <string name="LocationCtrlGeneralIconTooltip">
- Genel Bölge
- </string>
- <string name="LocationCtrlSeeAVsTooltip">
- Bu parselin dışında avatarlar görünür durumda ve sohbete izin veriliyor
- </string>
- <string name="UpdaterWindowTitle">
- [APP_NAME] Güncelleştirme
- </string>
- <string name="UpdaterNowUpdating">
- [APP_NAME] güncelleştiriliyor...
- </string>
- <string name="UpdaterNowInstalling">
- [APP_NAME] yükleniyor...
- </string>
- <string name="UpdaterUpdatingDescriptive">
- [APP_NAME] Görüntüleyiciniz en son sürüme güncelleştiriliyor. Bu biraz zaman alabilir, bu nedenle sabırlı olun.
- </string>
- <string name="UpdaterProgressBarTextWithEllipses">
- Güncelleştirme karşıdan yükleniyor...
- </string>
- <string name="UpdaterProgressBarText">
- Güncelleştirme karşıdan yükleniyor
- </string>
- <string name="UpdaterFailDownloadTitle">
- Güncelleştirmenin karşıdan yüklenmesi başarılamadı
- </string>
- <string name="UpdaterFailUpdateDescriptive">
- [APP_NAME] güncellenirken bir hata oluştu. Lütfen www.secondlife.com adresinden son sürümü karşıdan yükleyin.
- </string>
- <string name="UpdaterFailInstallTitle">
- Güncelleştirmenin yüklenmesi başarılamadı
- </string>
- <string name="UpdaterFailStartTitle">
- Görüntüleyici başlatılamadı
- </string>
- <string name="ItemsComingInTooFastFrom">
- [APP_NAME]: [FROM_NAME]&apos;den öğeler çok hızlı geliyor, [TIME] saniye boyunca otomatik ön izleme devre dışı bırakıldı
- </string>
- <string name="ItemsComingInTooFast">
- [APP_NAME]: Öğeler çok hızlı geliyor, [TIME] saniye boyunca otomatik ön izleme devre dışı bırakıldı
- </string>
- <string name="IM_logging_string">
- -- Anlık ileti günlük tutulması etkin --
- </string>
- <string name="IM_typing_start_string">
- [NAME] yazıyor...
- </string>
- <string name="Unnamed">
- (İsimsiz)
- </string>
- <string name="IM_moderated_chat_label">
- (Yönetilen: Varsayılan durumda sesler kapalı)
- </string>
- <string name="IM_unavailable_text_label">
- Bu aramada metin sohbeti kullanılamaz.
- </string>
- <string name="IM_muted_text_label">
- Bir Grup Moderatörü tarafından metin sohbetiniz devre dışı bırakıldı.
- </string>
- <string name="IM_default_text_label">
- Anlık ileti göndermek için buraya tıklayın.
- </string>
- <string name="IM_to_label">
- Kime
- </string>
- <string name="IM_moderator_label">
- (Moderatör)
- </string>
- <string name="Saved_message">
- (Kaydedildi [LONG_TIMESTAMP])
- </string>
- <string name="IM_unblock_only_groups_friends">
- Bu mesajı görmek için Tercihler/Gizlilik&apos;de &apos;Sadece arkadaşlar ve gruplar beni arasın veya Aİ göndersin&apos; seçeneğinin işaretini kaldırmalısınız.
- </string>
- <string name="answered_call">
- Aramanız yanıtlandı
- </string>
- <string name="you_started_call">
- Bir sesli arama başlattınız
- </string>
- <string name="you_joined_call">
- Sesli aramaya katıldınız
- </string>
- <string name="name_started_call">
- [NAME] bir sesli arama başlattı
- </string>
- <string name="ringing-im">
- Sesli aramaya katılınılıyor...
- </string>
- <string name="connected-im">
- Bağlandı, kapatmak için Aramadan Çık üzerine tıklayın
- </string>
- <string name="hang_up-im">
- Sesli aramadan çıkıldı
- </string>
- <string name="answering-im">
- Bağlanıyor...
- </string>
- <string name="conference-title">
- Özel Konferans
- </string>
- <string name="conference-title-incoming">
- [AGENT_NAME] ile konferans
- </string>
- <string name="inventory_item_offered-im">
- Teklif edilen envanter öğesi:
- </string>
- <string name="share_alert">
- Envanterinizden buraya öğeler sürükleyin
- </string>
- <string name="no_session_message">
- (Aİ Oturumu Mevcut Değil)
- </string>
- <string name="only_user_message">
- Bu oturumdaki tek kullanıcısınız.
- </string>
- <string name="offline_message">
- [NAME] çevrim dışı.
- </string>
- <string name="invite_message">
- Bu sesli sohbeti kabul etmek/bağlanmak için [BUTTON NAME] düğmesine tıklayın.
- </string>
- <string name="muted_message">
- Bu Sakini engellediniz. Bir ileti gönderdiğinizde engelleme otomatik olarak kaldırılır.
- </string>
- <string name="generic">
- Talep gönderilirken hata oluştu, lütfen daha sonra tekrar deneyin.
- </string>
- <string name="generic_request_error">
- Talep gönderilirken hata oluştu, lütfen daha sonra tekrar deneyin.
- </string>
- <string name="insufficient_perms_error">
- Yeterli izne sahip değilsiniz.
- </string>
- <string name="session_does_not_exist_error">
- Bu oturum artık mevcut değil.
- </string>
- <string name="no_ability_error">
- Bu yeteneğe sahip değilsiniz.
- </string>
- <string name="no_ability">
- Bu yeteneğe sahip değilsiniz.
- </string>
- <string name="not_a_mod_error">
- Bir oturum moderatörü değilsiniz.
- </string>
- <string name="muted">
- Bir grup moderatörü metin sohbetinizi devre dışı bıraktı.
- </string>
- <string name="muted_error">
- Bir grup moderatörü metin sohbetinizi devre dışı bıraktı.
- </string>
- <string name="add_session_event">
- [RECIPIENT] ile sohbet oturumuna kullanıcı eklenemiyor.
- </string>
- <string name="message">
- İletiniz [RECIPIENT] ile sohbet oturumuna gönderilemedi.
- </string>
- <string name="message_session_event">
- İletiniz [RECIPIENT] ile sohbet oturumuna gönderilemedi.
- </string>
- <string name="mute">
- Yönetme sırasında hata oluştu.
- </string>
- <string name="removed">
- Gruptan çıkarıldınız.
- </string>
- <string name="removed_from_group">
- Gruptan çıkarıldınız.
- </string>
- <string name="close_on_no_ability">
- Sohbet oturumunda bulunma yeteneğine artık sahip değilsiniz.
- </string>
- <string name="unread_chat_single">
- [SOURCES] yeni bir şey söyledi
- </string>
- <string name="unread_chat_multiple">
- [SOURCES] yeni bir şey söyledi
- </string>
- <string name="session_initialization_timed_out_error">
- Oturum başlatılması zaman aşımına uğradı.
- </string>
- <string name="Home position set.">
- Ana konum ayarlandı.
- </string>
- <string name="voice_morphing_url">
- http://secondlife.com/landing/voicemorphing
- </string>
- <string name="paid_you_ldollars">
- [NAME] size [REASON] L$[AMOUNT] ödedi.
- </string>
- <string name="paid_you_ldollars_no_reason">
- [NAME] size L$[AMOUNT] ödedi.
- </string>
- <string name="you_paid_ldollars">
- [NAME]&apos;e [REASON] L$[AMOUNT] ödediniz.
- </string>
- <string name="you_paid_ldollars_no_info">
- L$[AMOUNT] ödediniz.
- </string>
- <string name="you_paid_ldollars_no_reason">
- [NAME]&apos;e L$[AMOUNT] ödediniz.
- </string>
- <string name="you_paid_ldollars_no_name">
- [REASON] L$[AMOUNT] ödediniz.
- </string>
- <string name="you_paid_failure_ldollars">
- [REASON] [NAME]&apos;e L$[AMOUNT] ödeyemediniz.
- </string>
- <string name="you_paid_failure_ldollars_no_info">
- L$[AMOUNT] ödeyemediniz.
- </string>
- <string name="you_paid_failure_ldollars_no_reason">
- [NAME]&apos;e L$[AMOUNT] ödeyemediniz.
- </string>
- <string name="you_paid_failure_ldollars_no_name">
- [REASON] L$[AMOUNT] ödeyemediniz.
- </string>
- <string name="for item">
- [ITEM] için.
- </string>
- <string name="for a parcel of land">
- bir arazi parseli için.
- </string>
- <string name="for a land access pass">
- bir arazi erişim hakkı için
- </string>
- <string name="for deeding land">
- arazi devretmek için
- </string>
- <string name="to create a group">
- bir grup oluşturmak için
- </string>
- <string name="to join a group">
- bir grupa katılmak için
- </string>
- <string name="to upload">
- karşıya yüklemek için
- </string>
- <string name="to publish a classified ad">
- bir ilan yayınlamak için
- </string>
- <string name="giving">
- L$ [AMOUNT] veriliyor
- </string>
- <string name="uploading_costs">
- Karşıya yüklemenin maliyeti: L$ [AMOUNT]
- </string>
- <string name="this_costs">
- Bunun maliyeti: L$ [AMOUNT]
- </string>
- <string name="buying_selected_land">
- L$ [AMOUNT] karşılığında seçilen arazi satın alınıyor
- </string>
- <string name="this_object_costs">
- Bu nesnenin maliyeti: L$ [AMOUNT]
- </string>
- <string name="group_role_everyone">
- Herkes
- </string>
- <string name="group_role_officers">
- Yetkililer
- </string>
- <string name="group_role_owners">
- Sahipler
- </string>
- <string name="group_member_status_online">
- Çevrimiçi
- </string>
- <string name="uploading_abuse_report">
- Kötüye Kullanım Bildirimi Karşıya Yükleniyor...
- </string>
- <string name="New Shape">
- Yeni Şekil
- </string>
- <string name="New Skin">
- Yeni Dış Katman
- </string>
- <string name="New Hair">
- Yeni Saç
- </string>
- <string name="New Eyes">
- Yeni Gözler
- </string>
- <string name="New Shirt">
- Yeni Gömlek
- </string>
- <string name="New Pants">
- Yeni Pantolon
- </string>
- <string name="New Shoes">
- Yeni Ayakkabılar
- </string>
- <string name="New Socks">
- Yeni Çoraplar
- </string>
- <string name="New Jacket">
- Yeni Ceket
- </string>
- <string name="New Gloves">
- Yeni Eldivenler
- </string>
- <string name="New Undershirt">
- Yeni Fanila
- </string>
- <string name="New Underpants">
- Yeni Külot
- </string>
- <string name="New Skirt">
- Yeni Etek
- </string>
- <string name="New Alpha">
- Yeni Alfa
- </string>
- <string name="New Tattoo">
- Yeni Dövme
- </string>
- <string name="New Physics">
- Yeni Fizik
- </string>
- <string name="Invalid Wearable">
- Geçersiz Giyilebilir
- </string>
- <string name="New Gesture">
- Yeni Mimik
- </string>
- <string name="New Script">
- Yeni Komut Dosyası
- </string>
- <string name="New Note">
- Yeni Not
- </string>
- <string name="New Folder">
- Yeni Klasör
- </string>
- <string name="Contents">
- İçerik
- </string>
- <string name="Gesture">
- Mimik
- </string>
- <string name="Male Gestures">
- Erkek Mimikleri
- </string>
- <string name="Female Gestures">
- Kadın Mimikleri
- </string>
- <string name="Other Gestures">
- Diğer Mimikler
- </string>
- <string name="Speech Gestures">
- Konuşma Mimikleri
- </string>
- <string name="Common Gestures">
- Favori Mimikler
- </string>
- <string name="Male - Excuse me">
- Erkek - Afedersiniz
- </string>
- <string name="Male - Get lost">
- Erkek - İşine bak
- </string>
- <string name="Male - Blow kiss">
- Erkek - Öpücük gönderme
- </string>
- <string name="Male - Boo">
- Erkek - Yuh çekme
- </string>
- <string name="Male - Bored">
- Erkek - Canı sıkılmış
- </string>
- <string name="Male - Hey">
- Erkek - Hey
- </string>
- <string name="Male - Laugh">
- Erkek - Gülme
- </string>
- <string name="Male - Repulsed">
- Erkek - Tiksinmiş
- </string>
- <string name="Male - Shrug">
- Erkek - Omuz Silkme
- </string>
- <string name="Male - Stick tougue out">
- Erkek - Dil çıkarma
- </string>
- <string name="Male - Wow">
- Erkek - Vay be
- </string>
- <string name="Female - Chuckle">
- Kadın - Kıkırdama
- </string>
- <string name="Female - Cry">
- Kadın - Ağlama
- </string>
- <string name="Female - Embarrassed">
- Kadın - Utanmış
- </string>
- <string name="Female - Excuse me">
- Kadın - Afedersiniz
- </string>
- <string name="Female - Get lost">
- Kadın - İşine bak
- </string>
- <string name="Female - Blow kiss">
- Kadın - Öpücük gönderme
- </string>
- <string name="Female - Boo">
- Kadın - Yuh çekme
- </string>
- <string name="Female - Bored">
- Kadın - Canı sıkılmış
- </string>
- <string name="Female - Hey">
- Kadın - Hey
- </string>
- <string name="Female - Hey baby">
- Kadın - Hey bebek
- </string>
- <string name="Female - Laugh">
- Kadın - Gülme
- </string>
- <string name="Female - Looking good">
- Kadın - Yakışıklı
- </string>
- <string name="Female - Over here">
- Kadın - Buraya baksana
- </string>
- <string name="Female - Please">
- Kadın - Lütfen
- </string>
- <string name="Female - Repulsed">
- Kadın - Tiksinmiş
- </string>
- <string name="Female - Shrug">
- Kadın - Omuz Silkme
- </string>
- <string name="Female - Stick tougue out">
- Kadın - Dil çıkarma
- </string>
- <string name="Female - Wow">
- Kadın - Vay be
- </string>
- <string name="/bow">
- /selamlama
- </string>
- <string name="/clap">
- /alkış
- </string>
- <string name="/count">
- /sayım
- </string>
- <string name="/extinguish">
- /söndürme
- </string>
- <string name="/kmb">
- /hib
- </string>
- <string name="/muscle">
- /kas
- </string>
- <string name="/no">
- /hayır
- </string>
- <string name="/no!">
- /hayır!
- </string>
- <string name="/paper">
- /kağıt
- </string>
- <string name="/pointme">
- /beni göster
- </string>
- <string name="/pointyou">
- /seni göster
- </string>
- <string name="/rock">
- /kaya
- </string>
- <string name="/scissor">
- /makas
- </string>
- <string name="/smoke">
- /duman
- </string>
- <string name="/stretch">
- /uzatma
- </string>
- <string name="/whistle">
- /ıslık
- </string>
- <string name="/yes">
- /evet
- </string>
- <string name="/yes!">
- /evet!
- </string>
- <string name="afk">
- kbd
- </string>
- <string name="dance1">
- dans1
- </string>
- <string name="dance2">
- dans2
- </string>
- <string name="dance3">
- dans3
- </string>
- <string name="dance4">
- dans4
- </string>
- <string name="dance5">
- dans5
- </string>
- <string name="dance6">
- dans6
- </string>
- <string name="dance7">
- dans7
- </string>
- <string name="dance8">
- dans8
- </string>
- <string name="AvatarBirthDateFormat">
- [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
- </string>
- <string name="DefaultMimeType">
- hiçbiri/hiçbiri
- </string>
- <string name="texture_load_dimensions_error">
- [WIDTH]*[HEIGHT] çözünürlüğünden büyük görüntüler yüklenemez
- </string>
- <string name="words_separator" value=","/>
- <string name="server_is_down">
- Tüm çabalarımıza rağmen beklenmeyen bir hata meydana geldi.
-
- Hizmetle ilişkili bilinen bir sorun olup olmadığını görmek için lütfen status.secondlifegrid.net adresine bakın.
- Sorun yaşamaya devam ederseniz lütfen ağınızın ve güvenlik duvarınızın ayarlarına bakın.
- </string>
- <string name="dateTimeWeekdaysNames">
- Pazar:Pazartesi:Salı:Çarşamba:Perşembe:Cuma:Cumartesi
- </string>
- <string name="dateTimeWeekdaysShortNames">
- Paz:Pzt:Sal:Çar:Per:Cum:Cmt
- </string>
- <string name="dateTimeMonthNames">
- Ocak:Şubat:Mart:Nisan:Mayıs:Haziran:Temmuz:Ağustos:Eylül:Ekim:Kasım:Aralık
- </string>
- <string name="dateTimeMonthShortNames">
- Oca:Şub:Mar:Nis:May:Haz:Tem:Ağu:Eyl:Eki:Kas:Ara
- </string>
- <string name="dateTimeDayFormat">
- [MDAY]
- </string>
- <string name="dateTimeAM">
- ÖÖ
- </string>
- <string name="dateTimePM">
- ÖS
- </string>
- <string name="LocalEstimateUSD">
- US$ [AMOUNT]
- </string>
- <string name="Membership">
- Üyelik
- </string>
- <string name="Roles">
- Roller
- </string>
- <string name="Group Identity">
- Grup Kimliği
- </string>
- <string name="Parcel Management">
- Parsel Yönetimi
- </string>
- <string name="Parcel Identity">
- Parsel Kimliği
- </string>
- <string name="Parcel Settings">
- Parsel Ayarları
- </string>
- <string name="Parcel Powers">
- Parsel Güçleri
- </string>
- <string name="Parcel Access">
- Parsel Erişimi
- </string>
- <string name="Parcel Content">
- Parsel İçeriği
- </string>
- <string name="Object Management">
- Nesne Yönetimi
- </string>
- <string name="Accounting">
- Muhasebe
- </string>
- <string name="Notices">
- Bildirimler
- </string>
- <string name="Chat">
- Sohbet
- </string>
- <string name="DeleteItems">
- Seçili öğeler silinsin mi?
- </string>
- <string name="DeleteItem">
- Seçili öğe silinsin mi?
- </string>
- <string name="EmptyOutfitText">
- Bu dış görünümde herhangi bir öğe yok
- </string>
- <string name="ExternalEditorNotSet">
- ExternalEditor ayarını kullanarak bir düzenleyici seçin.
- </string>
- <string name="ExternalEditorNotFound">
- Belirttiğiniz harici düzenleyici bulunamadı.
-Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin.
-(örn. &quot;/yolum/duzenleyici&quot; &quot;%s&quot;)
- </string>
- <string name="ExternalEditorCommandParseError">
- Harici düzenleyici komutu ayrıştırılırken hata oluştu.
- </string>
- <string name="ExternalEditorFailedToRun">
- Harici düzenleyici çalışmadı.
- </string>
- <string name="TranslationFailed">
- Çeviri başarılamadı: [REASON]
- </string>
- <string name="TranslationResponseParseError">
- Çeviri yanıtı ayrıştırılırken hata meydana geldi.
- </string>
- <string name="Esc">
- Esc
- </string>
- <string name="Space">
- Boşluk
- </string>
- <string name="Enter">
- Enter
- </string>
- <string name="Tab">
- Sekme
- </string>
- <string name="Ins">
- Ins
- </string>
- <string name="Del">
- Del
- </string>
- <string name="Backsp">
- Geri tuşu
- </string>
- <string name="Shift">
- Shift
- </string>
- <string name="Ctrl">
- Ctrl
- </string>
- <string name="Alt">
- Alt
- </string>
- <string name="CapsLock">
- CapsLock
- </string>
- <string name="Left">
- Sol
- </string>
- <string name="Right">
- Sağ
- </string>
- <string name="Up">
- Yukarı
- </string>
- <string name="Down">
- Aşağı
- </string>
- <string name="Home">
- Home
- </string>
- <string name="End">
- End
- </string>
- <string name="PgUp">
- PgUp
- </string>
- <string name="PgDn">
- PgDn
- </string>
- <string name="F1">
- F1
- </string>
- <string name="F2">
- F2
- </string>
- <string name="F3">
- F3
- </string>
- <string name="F4">
- F4
- </string>
- <string name="F5">
- F5
- </string>
- <string name="F6">
- F6
- </string>
- <string name="F7">
- F7
- </string>
- <string name="F8">
- F8
- </string>
- <string name="F9">
- F9
- </string>
- <string name="F10">
- F10
- </string>
- <string name="F11">
- F11
- </string>
- <string name="F12">
- F12
- </string>
- <string name="Add">
- Ekle
- </string>
- <string name="Subtract">
- Çıkar
- </string>
- <string name="Multiply">
- Çarp
- </string>
- <string name="Divide">
- Böl
- </string>
- <string name="PAD_DIVIDE">
- PAD_DIVIDE
- </string>
- <string name="PAD_LEFT">
- PAD_LEFT
- </string>
- <string name="PAD_RIGHT">
- PAD_RIGHT
- </string>
- <string name="PAD_DOWN">
- PAD_DOWN
- </string>
- <string name="PAD_UP">
- PAD_UP
- </string>
- <string name="PAD_HOME">
- PAD_HOME
- </string>
- <string name="PAD_END">
- PAD_END
- </string>
- <string name="PAD_PGUP">
- PAD_PGUP
- </string>
- <string name="PAD_PGDN">
- PAD_PGDN
- </string>
- <string name="PAD_CENTER">
- PAD_CENTER
- </string>
- <string name="PAD_INS">
- PAD_INS
- </string>
- <string name="PAD_DEL">
- PAD_DEL
- </string>
- <string name="PAD_Enter">
- PAD_Enter
- </string>
- <string name="PAD_BUTTON0">
- PAD_BUTTON0
- </string>
- <string name="PAD_BUTTON1">
- PAD_BUTTON1
- </string>
- <string name="PAD_BUTTON2">
- PAD_BUTTON2
- </string>
- <string name="PAD_BUTTON3">
- PAD_BUTTON3
- </string>
- <string name="PAD_BUTTON4">
- PAD_BUTTON4
- </string>
- <string name="PAD_BUTTON5">
- PAD_BUTTON5
- </string>
- <string name="PAD_BUTTON6">
- PAD_BUTTON6
- </string>
- <string name="PAD_BUTTON7">
- PAD_BUTTON7
- </string>
- <string name="PAD_BUTTON8">
- PAD_BUTTON8
- </string>
- <string name="PAD_BUTTON9">
- PAD_BUTTON9
- </string>
- <string name="PAD_BUTTON10">
- PAD_BUTTON10
- </string>
- <string name="PAD_BUTTON11">
- PAD_BUTTON11
- </string>
- <string name="PAD_BUTTON12">
- PAD_BUTTON12
- </string>
- <string name="PAD_BUTTON13">
- PAD_BUTTON13
- </string>
- <string name="PAD_BUTTON14">
- PAD_BUTTON14
- </string>
- <string name="PAD_BUTTON15">
- PAD_BUTTON15
- </string>
- <string name="-">
- -
- </string>
- <string name="=">
- =
- </string>
- <string name="`">
- `
- </string>
- <string name=";">
- ;
- </string>
- <string name="[">
- [
- </string>
- <string name="]">
- ]
- </string>
- <string name="\">
- \
- </string>
- <string name="0">
- 0
- </string>
- <string name="1">
- 1
- </string>
- <string name="2">
- 2
- </string>
- <string name="3">
- 3
- </string>
- <string name="4">
- 4
- </string>
- <string name="5">
- 5
- </string>
- <string name="6">
- 6
- </string>
- <string name="7">
- 7
- </string>
- <string name="8">
- 8
- </string>
- <string name="9">
- 9
- </string>
- <string name="A">
- A
- </string>
- <string name="B">
- B
- </string>
- <string name="C">
- C
- </string>
- <string name="D">
- D
- </string>
- <string name="E">
- E
- </string>
- <string name="F">
- F
- </string>
- <string name="G">
- G
- </string>
- <string name="H">
- H
- </string>
- <string name="I">
- I
- </string>
- <string name="J">
- J
- </string>
- <string name="K">
- K
- </string>
- <string name="L">
- L
- </string>
- <string name="M">
- M
- </string>
- <string name="N">
- N
- </string>
- <string name="O">
- O
- </string>
- <string name="P">
- P
- </string>
- <string name="Q">
- Q
- </string>
- <string name="R">
- R
- </string>
- <string name="S">
- S
- </string>
- <string name="T">
- T
- </string>
- <string name="U">
- U
- </string>
- <string name="V">
- V
- </string>
- <string name="W">
- W
- </string>
- <string name="X">
- X
- </string>
- <string name="Y">
- Y
- </string>
- <string name="Z">
- Z
- </string>
- <string name="BeaconParticle">
- Parçacık işaretleri gösteriliyor (mavi)
- </string>
- <string name="BeaconPhysical">
- Fiziksel nesne işaretleri gösteriliyor (yeşil)
- </string>
- <string name="BeaconScripted">
- Komut dosyalı nesne işaretleri gösteriliyor (kırmızı)
- </string>
- <string name="BeaconScriptedTouch">
- Dokunma işlevli komut dosyalı nesne işaretleri gösteriliyor (kırmızı)
- </string>
- <string name="BeaconSound">
- Ses işaretleri gösteriliyor (sarı)
- </string>
- <string name="BeaconMedia">
- Ortam işaretleri gösteriliyor (beyaz)
- </string>
- <string name="ParticleHiding">
- Parçacıklar Gizleniyor
- </string>
- <string name="Command_AboutLand_Label">
- Arazi hakkında
- </string>
- <string name="Command_Appearance_Label">
- Görünüm
- </string>
- <string name="Command_Avatar_Label">
- Avatar
- </string>
- <string name="Command_Build_Label">
- İnşa Et
- </string>
- <string name="Command_Chat_Label">
- Sohbet
- </string>
- <string name="Command_Compass_Label">
- Pusula
- </string>
- <string name="Command_Destinations_Label">
- Hedef Konum
- </string>
- <string name="Command_Gestures_Label">
- Mimikler
- </string>
- <string name="Command_HowTo_Label">
- Nasıl yapılır
- </string>
- <string name="Command_Inventory_Label">
- Envanter
- </string>
- <string name="Command_Map_Label">
- Harita
- </string>
- <string name="Command_Marketplace_Label">
- Pazaryeri
- </string>
- <string name="Command_MiniMap_Label">
- Mini-harita
- </string>
- <string name="Command_Move_Label">
- Yürü / koş / uç
- </string>
- <string name="Command_Outbox_Label">
- Satıcı giden kutusu
- </string>
- <string name="Command_People_Label">
- Kişiler
- </string>
- <string name="Command_Picks_Label">
- Seçmeler
- </string>
- <string name="Command_Places_Label">
- Yerler
- </string>
- <string name="Command_Preferences_Label">
- Tercihler
- </string>
- <string name="Command_Profile_Label">
- Profil
- </string>
- <string name="Command_Search_Label">
- Ara
- </string>
- <string name="Command_Snapshot_Label">
- Anlık görüntü
- </string>
- <string name="Command_Speak_Label">
- Konuş
- </string>
- <string name="Command_View_Label">
- Kamera denetimleri
- </string>
- <string name="Command_Voice_Label">
- Ses ayarları
- </string>
- <string name="Command_AboutLand_Tooltip">
- Ziyaret ettiğiniz araziyle ilgili bilgi
- </string>
- <string name="Command_Appearance_Tooltip">
- Avatarınızı değiştirin
- </string>
- <string name="Command_Avatar_Tooltip">
- Eksiksiz bir avatar seçin
- </string>
- <string name="Command_Build_Tooltip">
- Nesneler oluşturma ve yüzeyi şekillendirme
- </string>
- <string name="Command_Chat_Tooltip">
- Metin kullanarak yakındaki kişilerle sohbet etmek
- </string>
- <string name="Command_Compass_Tooltip">
- Pusula
- </string>
- <string name="Command_Destinations_Tooltip">
- İlgilendiğiniz hedef konumlar
- </string>
- <string name="Command_Gestures_Tooltip">
- Avatarınız için mimikler
- </string>
- <string name="Command_HowTo_Tooltip">
- Genel görevleri nasıl yapacağınız
- </string>
- <string name="Command_Inventory_Tooltip">
- Eşyalarınızı görüntüleyin ve kullanın
- </string>
- <string name="Command_Map_Tooltip">
- Dünya haritası
- </string>
- <string name="Command_Marketplace_Tooltip">
- Alışveriş yap
- </string>
- <string name="Command_MiniMap_Tooltip">
- Yakındaki kişileri göster
- </string>
- <string name="Command_Move_Tooltip">
- Avatarınızı hareket ettirmek
- </string>
- <string name="Command_Outbox_Tooltip">
- Satmak amacıyla Pazaryerinize öğeler taşıyın
- </string>
- <string name="Command_People_Tooltip">
- Arkadaşlar, gruplar ve yakındaki kişiler
- </string>
- <string name="Command_Picks_Tooltip">
- Profilinizde favori olarak gösterilecek yerler
- </string>
- <string name="Command_Places_Tooltip">
- Kaydettiğiniz yerler
- </string>
- <string name="Command_Preferences_Tooltip">
- Tercihler
- </string>
- <string name="Command_Profile_Tooltip">
- Profilinizi düzenleyin veya görüntüleyin
- </string>
- <string name="Command_Search_Tooltip">
- Yerler, etkinlikler ve kişiler bulmak
- </string>
- <string name="Command_Snapshot_Tooltip">
- Resim çekin
- </string>
- <string name="Command_Speak_Tooltip">
- Mikrofonunuzu kullanarak yakındaki kişilerle konuşun
- </string>
- <string name="Command_View_Tooltip">
- Kamera açısını değiştirmek
- </string>
- <string name="Command_Voice_Tooltip">
- Aramalar ve SL dünyası içinde size yakın kişiler için ses denetimleri
- </string>
- <string name="Toolbar_Bottom_Tooltip">
- şu anda alt araç çubuğunuzda
- </string>
- <string name="Toolbar_Left_Tooltip">
- şu anda sol araç çubuğunuzda
- </string>
- <string name="Toolbar_Right_Tooltip">
- şu anda sağ araç çubuğunuzda
- </string>
- <string name="Retain%">
- Koru %
- </string>
- <string name="Detail">
- Ayrıntı
- </string>
- <string name="Better Detail">
- Daha İyi Ayrıntı
- </string>
- <string name="Surface">
- Yüzey
- </string>
- <string name="Solid">
- Katı
- </string>
- <string name="Wrap">
- Sar
- </string>
- <string name="Preview">
- Önizleme
- </string>
- <string name="Normal">
- Normal
- </string>
- <string name="snapshot_quality_very_low">
- Çok Düşük
- </string>
- <string name="snapshot_quality_low">
- Düşük
- </string>
- <string name="snapshot_quality_medium">
- Orta
- </string>
- <string name="snapshot_quality_high">
- Yüksek
- </string>
- <string name="snapshot_quality_very_high">
- Çok Yüksek
- </string>
-</strings>
diff --git a/indra/newview/skins/steam/xui/zh/strings.xml b/indra/newview/skins/steam/xui/zh/strings.xml
deleted file mode 100644
index 882b617289..0000000000
--- a/indra/newview/skins/steam/xui/zh/strings.xml
+++ /dev/null
@@ -1,4454 +0,0 @@
-<?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
- that are returned from one component and may appear in many places-->
-<strings>
- <string name="SECOND_LIFE">
- 第二人生
- </string>
- <string name="APP_NAME">
- 第二人生
- </string>
- <string name="CAPITALIZED_APP_NAME">
- 第二人生
- </string>
- <string name="SECOND_LIFE_GRID">
- 第二人生網格
- </string>
- <string name="SUPPORT_SITE">
- 第二人生支援入口
- </string>
- <string name="StartupDetectingHardware">
- 硬體偵測中...
- </string>
- <string name="StartupLoading">
- [APP_NAME] 載入中...
- </string>
- <string name="StartupClearingCache">
- 快取清除中...
- </string>
- <string name="StartupInitializingTextureCache">
- 材質快取初始化中...
- </string>
- <string name="StartupInitializingVFS">
- VFS 初始化中...
- </string>
- <string name="ProgressRestoring">
- 回存中...
- </string>
- <string name="ProgressChangingResolution">
- 變更解析度...
- </string>
- <string name="Fullbright">
- 全亮(舊版)
- </string>
- <string name="LoginInProgress">
- 登入中。[APP_NAME] 可能出現凍結狀態。請耐心稍等。
- </string>
- <string name="LoginInProgressNoFrozen">
- 登入中...
- </string>
- <string name="LoginAuthenticating">
- 身份驗證中
- </string>
- <string name="LoginMaintenance">
- 進行帳戶維護...
- </string>
- <string name="LoginAttempt">
- 先前企圖嘗試登入失敗。現登入中,嘗試 [NUMBER]
- </string>
- <string name="LoginPrecaching">
- 世界載入中...
- </string>
- <string name="LoginInitializingBrowser">
- 內嵌式網頁瀏覽器初始化中...
- </string>
- <string name="LoginInitializingMultimedia">
- 多媒體初始化中...
- </string>
- <string name="LoginInitializingFonts">
- 字型載入中...
- </string>
- <string name="LoginVerifyingCache">
- 驗證快取檔案(約需 60-90 秒左右)...
- </string>
- <string name="LoginProcessingResponse">
- 回應處理中...
- </string>
- <string name="LoginInitializingWorld">
- 世界初始化中...
- </string>
- <string name="LoginDecodingImages">
- 圖像解碼中...
- </string>
- <string name="LoginInitializingQuicktime">
- QuickTime 初始化中...
- </string>
- <string name="LoginQuicktimeNotFound">
- QuickTime 未發現 - 無法進行初始化。
- </string>
- <string name="LoginQuicktimeOK">
- QuickTime 已成功初始化。
- </string>
- <string name="LoginWaitingForRegionHandshake">
- 地區交握等待中...
- </string>
- <string name="LoginConnectingToRegion">
- 地區聯結中...
- </string>
- <string name="LoginDownloadingClothing">
- 服裝下載中...
- </string>
- <string name="InvalidCertificate">
- 伺服器回傳一個無效果損壞的憑證。請連繫網格管理者。
- </string>
- <string name="CertInvalidHostname">
- An invalid hostname was used to access the server, please check your SLURL or Grid hostname.
- </string>
- <string name="CertExpired">
- The certificate returned by the Grid appears to be expired. Please check your system clock, or contact your Grid administrator.
- </string>
- <string name="CertKeyUsage">
- The certificate returned by the server could not be used for SSL. Please contact your Grid administrator.
- </string>
- <string name="CertBasicConstraints">
- Too many certificates were in the servers Certificate chain. Please contact your Grid administrator.
- </string>
- <string name="CertInvalidSignature">
- The certificate signature returned by the Grid server could not be verified. Please contact your Grid administrator.
- </string>
- <string name="LoginFailedNoNetwork">
- Network Error: Could not establish connection, please check your network connection.
- </string>
- <string name="LoginFailed">
- 登入失敗。
- </string>
- <string name="Quit">
- 結束退出
- </string>
- <string name="create_account_url">
- http://join.secondlife.com/?sourceid=1206_steam
- </string>
- <string name="AgentLostConnection">
- 這個地區可能遭遇問題,請檢查你的網路連線。
- </string>
- <string name="SavingSettings">
- 你的設定儲存中...
- </string>
- <string name="LoggingOut">
- 登出中...
- </string>
- <string name="ShuttingDown">
- 關閉中...
- </string>
- <string name="YouHaveBeenDisconnected">
- 你已經被所在的地區中斷聯結。
- </string>
- <string name="SentToInvalidRegion">
- 你被傳送到一個無效的地區。
- </string>
- <string name="TestingDisconnect">
- 測試瀏覽器斷線
- </string>
- <string name="TooltipPerson">
- 人
- </string>
- <string name="TooltipNoName">
- (無名稱)
- </string>
- <string name="TooltipOwner">
- 擁有者:
- </string>
- <string name="TooltipPublic">
- 公開
- </string>
- <string name="TooltipIsGroup">
- (群組)
- </string>
- <string name="TooltipForSaleL$">
- 出售: L$[AMOUNT]
- </string>
- <string name="TooltipFlagGroupBuild">
- 群組建造
- </string>
- <string name="TooltipFlagNoBuild">
- 禁止建造
- </string>
- <string name="TooltipFlagNoEdit">
- 群組建造
- </string>
- <string name="TooltipFlagNotSafe">
- 非安全
- </string>
- <string name="TooltipFlagNoFly">
- 禁止飛行
- </string>
- <string name="TooltipFlagGroupScripts">
- 群組腳本
- </string>
- <string name="TooltipFlagNoScripts">
- 禁止腳本
- </string>
- <string name="TooltipLand">
- 土地:
- </string>
- <string name="TooltipMustSingleDrop">
- 只有一個物品可以被拖曳到此處
- </string>
- <string name="TooltipPrice" value="L$[AMOUNT]:"/>
- <string name="TooltipHttpUrl">
- 點擊以察看這個網頁
- </string>
- <string name="TooltipSLURL">
- 點擊以察看這個位置資訊
- </string>
- <string name="TooltipAgentUrl">
- 點擊以察看這個居民檔案
- </string>
- <string name="TooltipAgentInspect">
- 瞭解更多有關這個居民
- </string>
- <string name="TooltipAgentMute">
- 點擊以封鎖這位居民
- </string>
- <string name="TooltipAgentUnmute">
- 點擊以解除封鎖這位居民
- </string>
- <string name="TooltipAgentIM">
- 點擊開始 IM 這位居民
- </string>
- <string name="TooltipAgentPay">
- 點擊以支付這位居民
- </string>
- <string name="TooltipAgentOfferTeleport">
- 點擊以送出瞬間傳送邀請給這位居民
- </string>
- <string name="TooltipAgentRequestFriend">
- 點擊以送出交友邀請給這位居民
- </string>
- <string name="TooltipGroupUrl">
- 點擊以察看這個群組的描述
- </string>
- <string name="TooltipEventUrl">
- 點擊以察看這個活動的描述
- </string>
- <string name="TooltipClassifiedUrl">
- Click to view this classified
- </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="目前網址:[CurrentURL]"/>
- <string name="SLurlLabelTeleport">
- 瞬間傳送到
- </string>
- <string name="SLurlLabelShowOnMap">
- 顯示地圖為了
- </string>
- <string name="SLappAgentMute">
- 封鎖
- </string>
- <string name="SLappAgentUnmute">
- 解除封鎖
- </string>
- <string name="SLappAgentIM">
- IM
- </string>
- <string name="SLappAgentPay">
- 支付
- </string>
- <string name="SLappAgentOfferTeleport">
- 發給瞬間傳送請求到
- </string>
- <string name="SLappAgentRequestFriend">
- 交友要求
- </string>
- <string name="BUTTON_CLOSE_DARWIN">
- 關閉(⌘W)
- </string>
- <string name="BUTTON_CLOSE_WIN">
- 關閉(Ctrl+W)
- </string>
- <string name="BUTTON_CLOSE_CHROME">
- 關閉
- </string>
- <string name="BUTTON_RESTORE">
- 還原
- </string>
- <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="AvatarNameMultiple">
- (多個)
- </string>
- <string name="GroupNameNone">
- (無)
- </string>
- <string name="AvalineCaller">
- Avaline Caller [ORDER]
- </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">
- Circuit gone
- </string>
- <string name="AssetErrorPriceMismatch">
- Viewer and server do not agree on price
- </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">
- root
- </string>
- <string name="lsl2 script">
- LSL2 script
- </string>
- <string name="lsl bytecode">
- LSL bytecode
- </string>
- <string name="tga texture">
- tga 材質
- </string>
- <string name="body part">
- 身體部位
- </string>
- <string name="snapshot">
- 快照
- </string>
- <string name="lost and found">
- 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="symbolic folder link">
- 資料夾聯結
- </string>
- <string name="AvatarEditingAppearance">
- (外觀編輯中)
- </string>
- <string name="AvatarAway">
- 離開
- </string>
- <string name="AvatarBusy">
- 忙碌
- </string>
- <string name="AvatarMuted">
- 封鎖的
- </string>
- <string name="anim_express_afraid">
- 害怕
- </string>
- <string name="anim_express_anger">
- 生氣
- </string>
- <string name="anim_away">
- Away
- </string>
- <string name="anim_backflip">
- Backflip
- </string>
- <string name="anim_express_laugh">
- Belly Laugh
- </string>
- <string name="anim_express_toothsmile">
- BigSmile
- </string>
- <string name="anim_blowkiss">
- Blow Kiss
- </string>
- <string name="anim_express_bored">
- 無聊
- </string>
- <string name="anim_bow">
- Bow
- </string>
- <string name="anim_clap">
- 拍手
- </string>
- <string name="anim_courtbow">
- Court Bow
- </string>
- <string name="anim_express_cry">
- 哭泣
- </string>
- <string name="anim_dance1">
- Dance 1
- </string>
- <string name="anim_dance2">
- Dance 2
- </string>
- <string name="anim_dance3">
- Dance 3
- </string>
- <string name="anim_dance4">
- Dance 4
- </string>
- <string name="anim_dance5">
- Dance 5
- </string>
- <string name="anim_dance6">
- Dance 6
- </string>
- <string name="anim_dance7">
- Dance 7
- </string>
- <string name="anim_dance8">
- Dance 8
- </string>
- <string name="anim_express_disdain">
- Disdain
- </string>
- <string name="anim_drink">
- Drink
- </string>
- <string name="anim_express_embarrased">
- Embarrassed
- </string>
- <string name="anim_angry_fingerwag">
- Finger Wag
- </string>
- <string name="anim_fist_pump">
- Fist Pump
- </string>
- <string name="anim_yoga_float">
- Floating Yoga
- </string>
- <string name="anim_express_frown">
- Frown
- </string>
- <string name="anim_impatient">
- Impatient
- </string>
- <string name="anim_jumpforjoy">
- Jump For Joy
- </string>
- <string name="anim_kissmybutt">
- Kiss My Butt
- </string>
- <string name="anim_express_kiss">
- 親吻
- </string>
- <string name="anim_laugh_short">
- 笑
- </string>
- <string name="anim_musclebeach">
- Muscle Beach
- </string>
- <string name="anim_no_unhappy">
- 不(不快樂)
- </string>
- <string name="anim_no_head">
- 不
- </string>
- <string name="anim_nyanya">
- Nya-nya-nya
- </string>
- <string name="anim_punch_onetwo">
- One-Two Punch
- </string>
- <string name="anim_express_open_mouth">
- Open Mouth
- </string>
- <string name="anim_peace">
- Peace
- </string>
- <string name="anim_point_you">
- Point at Other
- </string>
- <string name="anim_point_me">
- Point at Self
- </string>
- <string name="anim_punch_l">
- Punch Left
- </string>
- <string name="anim_punch_r">
- Punch Right
- </string>
- <string name="anim_rps_countdown">
- RPS count
- </string>
- <string name="anim_rps_paper">
- RPS paper
- </string>
- <string name="anim_rps_rock">
- RPS rock
- </string>
- <string name="anim_rps_scissors">
- RPS scissors
- </string>
- <string name="anim_express_repulsed">
- Repulsed
- </string>
- <string name="anim_kick_roundhouse_r">
- Roundhouse Kick
- </string>
- <string name="anim_express_sad">
- 傷心
- </string>
- <string name="anim_salute">
- 敬禮
- </string>
- <string name="anim_shout">
- Shout
- </string>
- <string name="anim_express_shrug">
- Shrug
- </string>
- <string name="anim_express_smile">
- 微笑
- </string>
- <string name="anim_smoke_idle">
- Smoke Idle
- </string>
- <string name="anim_smoke_inhale">
- Smoke Inhale
- </string>
- <string name="anim_smoke_throw_down">
- Smoke Throw Down
- </string>
- <string name="anim_express_surprise">
- 驚喜
- </string>
- <string name="anim_sword_strike_r">
- Sword Strike
- </string>
- <string name="anim_angry_tantrum">
- Tantrum
- </string>
- <string name="anim_express_tongue_out">
- TongueOut
- </string>
- <string name="anim_hello">
- Wave
- </string>
- <string name="anim_whisper">
- 耳語
- </string>
- <string name="anim_whistle">
- 吹口哨
- </string>
- <string name="anim_express_wink">
- 眨眼
- </string>
- <string name="anim_wink_hollywood">
- 眨眼(好萊塢)
- </string>
- <string name="anim_express_worry">
- 擔心
- </string>
- <string name="anim_yes_happy">
- 是(快樂)
- </string>
- <string name="anim_yes_head">
- 是
- </string>
- <string name="texture_loading">
- 載入中...
- </string>
- <string name="worldmap_offline">
- 離線
- </string>
- <string name="worldmap_item_tooltip_format">
- [AREA] m² L$[PRICE]
- </string>
- <string name="worldmap_results_none_found">
- 沒有發現。
- </string>
- <string name="Ok">
- 確定
- </string>
- <string name="Premature end of file">
- Premature end of file
- </string>
- <string name="ST_NO_JOINT">
- Can&apos;t find ROOT or 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">
- &apos;[OBJECTNAME]&apos;, an object owned by &apos;[OWNERNAME]&apos;, located in [REGIONNAME] at [REGIONPOS], has been granted permission to: [PERMISSIONS].
- </string>
- <string name="ScriptQuestionCautionChatDenied">
- &apos;[OBJECTNAME]&apos;, an object owned by &apos;[OWNERNAME]&apos;, located in [REGIONNAME] at [REGIONPOS], has been denied permission to: [PERMISSIONS].
- </string>
- <string name="ScriptTakeMoney">
- 由你身上拿走林登幣(L$)
- </string>
- <string name="ActOnControlInputs">
- Act on your control inputs
- </string>
- <string name="RemapControlInputs">
- Remap your control inputs
- </string>
- <string name="AnimateYourAvatar">
- Animate your avatar
- </string>
- <string name="AttachToYourAvatar">
- Attach to your avatar
- </string>
- <string name="ReleaseOwnership">
- Release ownership and become public
- </string>
- <string name="LinkAndDelink">
- Link and delink from other objects
- </string>
- <string name="AddAndRemoveJoints">
- Add and remove joints with other objects
- </string>
- <string name="ChangePermissions">
- 變更它的權限
- </string>
- <string name="TrackYourCamera">
- 追蹤你的攝影機
- </string>
- <string name="ControlYourCamera">
- 控制你的攝影機
- </string>
- <string name="NotConnected">
- 未聯接
- </string>
- <string name="SIM_ACCESS_PG">
- 一般普級
- </string>
- <string name="SIM_ACCESS_MATURE">
- 適度成人
- </string>
- <string name="SIM_ACCESS_ADULT">
- 完全成人
- </string>
- <string name="SIM_ACCESS_DOWN">
- 離線
- </string>
- <string name="SIM_ACCESS_MIN">
- 未知
- </string>
- <string name="land_type_unknown">
- (未知)
- </string>
- <string name="Estate / Full Region">
- 領地 / 完整地區
- </string>
- <string name="Estate / Homestead">
- 領地 / 家園
- </string>
- <string name="Mainland / Homestead">
- 大陸 / 家園
- </string>
- <string name="Mainland / Full Region">
- 大陸 / 完整地區
- </string>
- <string name="all_files">
- 全部檔案
- </string>
- <string name="sound_files">
- 聲音
- </string>
- <string name="animation_files">
- 動作
- </string>
- <string name="image_files">
- 圖像
- </string>
- <string name="save_file_verb">
- 儲存
- </string>
- <string name="load_file_verb">
- 載入
- </string>
- <string name="targa_image_files">
- Targa 圖像
- </string>
- <string name="bitmap_image_files">
- Bitmap 圖像
- </string>
- <string name="avi_movie_file">
- AVI 視頻檔案
- </string>
- <string name="xaf_animation_file">
- XAF Anim File
- </string>
- <string name="xml_file">
- XML 檔案
- </string>
- <string name="raw_file">
- RAW 檔案
- </string>
- <string name="compressed_image_files">
- 壓縮的圖像
- </string>
- <string name="load_files">
- 載入檔案
- </string>
- <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="physics">
- 身體物理
- </string>
- <string name="invalid">
- 無效
- </string>
- <string name="none">
- 無
- </string>
- <string name="shirt_not_worn">
- 襯衫未穿
- </string>
- <string name="pants_not_worn">
- 褲子未穿
- </string>
- <string name="shoes_not_worn">
- 鞋子未穿
- </string>
- <string name="socks_not_worn">
- 襪子未穿
- </string>
- <string name="jacket_not_worn">
- 夾克未穿
- </string>
- <string name="gloves_not_worn">
- 手套未穿
- </string>
- <string name="undershirt_not_worn">
- 內衣未穿
- </string>
- <string name="underpants_not_worn">
- 內褲未穿
- </string>
- <string name="skirt_not_worn">
- 裙子未穿
- </string>
- <string name="alpha_not_worn">
- 半透明未穿
- </string>
- <string name="tattoo_not_worn">
- 刺青未穿
- </string>
- <string name="physics_not_worn">
- 身體物理未穿
- </string>
- <string name="invalid_not_worn">
- 無效
- </string>
- <string name="create_new_shape">
- 創造新體形
- </string>
- <string name="create_new_skin">
- 創造新皮膚
- </string>
- <string name="create_new_hair">
- 創造新頭髮
- </string>
- <string name="create_new_eyes">
- 創造新眼睛
- </string>
- <string name="create_new_shirt">
- 創造新襯衫
- </string>
- <string name="create_new_pants">
- 創造新褲子
- </string>
- <string name="create_new_shoes">
- 創造新鞋子
- </string>
- <string name="create_new_socks">
- 創造新襪子
- </string>
- <string name="create_new_jacket">
- 創造新夾克
- </string>
- <string name="create_new_gloves">
- 創造新手套
- </string>
- <string name="create_new_undershirt">
- 創造新內衣
- </string>
- <string name="create_new_underpants">
- 創造新內褲
- </string>
- <string name="create_new_skirt">
- 創造新裙子
- </string>
- <string name="create_new_alpha">
- 創造新半透明
- </string>
- <string name="create_new_tattoo">
- 創造新刺青
- </string>
- <string name="create_new_physics">
- 創造新身體物理
- </string>
- <string name="create_new_invalid">
- 無效
- </string>
- <string name="NewWearable">
- 新 [WEARABLE_ITEM]
- </string>
- <string name="next">
- 下一個
- </string>
- <string name="ok">
- 確定
- </string>
- <string name="GroupNotifyGroupNotice">
- 群組通知
- </string>
- <string name="GroupNotifyGroupNotices">
- 群組通知
- </string>
- <string name="GroupNotifySentBy">
- 送出由
- </string>
- <string name="GroupNotifyAttached">
- Attached:
- </string>
- <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>
- <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/all/[SEARCH_TERM] 搜尋]。
- </string>
- <string name="PlacesNoMatchingItems">
- 沒有發現你想要找的嗎?試試 [secondlife:///app/search/places/[SEARCH_TERM] 搜尋]。
- </string>
- <string name="FavoritesNoMatchingItems">
- Drag a landmark here to add it to your favorites.
- </string>
- <string name="InventoryNoTexture">
- You do not have a copy of this texture in your inventory
- </string>
- <string name="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="ActiveGesture" value="[GESLABEL] (active)"/>
- <string name="PermYes">
- 是
- </string>
- <string name="PermNo">
- 否
- </string>
- <string name="Chat Message" value="聊天:"/>
- <string name="Sound" value="聲音:"/>
- <string name="Wait" value="--- 等待:"/>
- <string name="AnimFlagStop" value="停止動作:"/>
- <string name="AnimFlagStart" value="開始動作:"/>
- <string name="Wave" value="Wave"/>
- <string name="GestureActionNone" value="無"/>
- <string name="HelloAvatar" value="Hello, avatar!"/>
- <string name="ViewAllGestures" value="察看全部 &gt;&gt;"/>
- <string name="GetMoreGestures" value="取得更多 &gt;&gt;"/>
- <string name="Animations" value="動作,"/>
- <string name="Calling Cards" value="名片,"/>
- <string name="Clothing" value="服裝,"/>
- <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="No"/>
- <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">
- 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">
- 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 favorite">
- 我的最愛
- </string>
- <string name="InvFolder Current Outfit">
- 目前裝扮
- </string>
- <string name="InvFolder Initial Outfits">
- 初始裝扮
- </string>
- <string name="InvFolder My Outfits">
- 我的裝扮
- </string>
- <string name="InvFolder Accessories">
- 配件
- </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">
- 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="Invalid Attachment">
- 無效的附件聯接點
- </string>
- <string name="YearsMonthsOld">
- [AGEYEARS] [AGEMONTHS] old
- </string>
- <string name="YearsOld">
- [AGEYEARS] old
- </string>
- <string name="MonthsOld">
- [AGEMONTHS] old
- </string>
- <string name="WeeksOld">
- [AGEWEEKS] old
- </string>
- <string name="DaysOld">
- [AGEDAYS] old
- </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">
- Trial
- </string>
- <string name="AcctTypeCharterMember">
- Charter Member
- </string>
- <string name="AcctTypeEmployee">
- 林登實驗室員工
- </string>
- <string name="PaymentInfoUsed">
- Payment Info Used
- </string>
- <string name="PaymentInfoOnFile">
- Payment Info On File
- </string>
- <string name="NoPaymentInfoOnFile">
- No Payment Info On File
- </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">
- Insufficient permissions to download a script.
- </string>
- <string name="CompileQueueInsufficientPermFor">
- Insufficient permissions for
- </string>
- <string name="CompileQueueUnknownFailure">
- Unknown failure to download
- </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">
- 物件 [OBJECT] 為 [OWNER] 所擁有
- </string>
- <string name="GroupsNone">
- 無
- </string>
- <string name="Group" value="(群組)"/>
- <string name="Unknown">
- (未知)
- </string>
- <string name="SummaryForTheWeek" value="Summary for this week, beginning on"/>
- <string name="NextStipendDay" value="下一個發薪日為"/>
- <string name="GroupIndividualShare" value="Group Individual Share"/>
- <string name="GroupColumn" value="群組"/>
- <string name="Balance">
- Balance
- </string>
- <string name="Credits">
- Credits
- </string>
- <string name="Debits">
- Debits
- </string>
- <string name="Total">
- Total
- </string>
- <string name="NoGroupDataFound">
- 無群組資料發現
- </string>
- <string name="IMParentEstate">
- parent estate
- </string>
- <string name="IMMainland">
- mainland
- </string>
- <string name="IMTeen">
- teen
- </string>
- <string name="RegionInfoError">
- error
- </string>
- <string name="RegionInfoAllEstatesOwnedBy">
- [OWNER] 所擁有的的全部領地
- </string>
- <string name="RegionInfoAllEstatesYouOwn">
- 你所擁有的全部領地
- </string>
- <string name="RegionInfoAllEstatesYouManage">
- all estates that you manage for [OWNER]
- </string>
- <string name="RegionInfoAllowedResidents">
- Allowed Residents: ([ALLOWEDAGENTS], max [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">
- 地段腳本 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">
- 無地段被選擇
- </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">
- 坐在
- </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 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>
- <string name="CursorPos">
- Line [LINE], Column [COLUMN]
- </string>
- <string name="PanelDirCountFound">
- [COUNT] found
- </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="PanelContentsTooltip">
- 物件的內容
- </string>
- <string name="PanelContentsNewScript">
- 新腳本
- </string>
- <string name="BusyModeResponseDefault">
- 你傳送訊息的居民目前處於忙碌模式中,這意味著他要求不被打擾。你所傳的訊息仍將會留存並顯示於 IM 面板上供他稍後時查閱。
- </string>
- <string name="MuteByName">
- (由名稱)
- </string>
- <string name="MuteAgent">
- (居民)
- </string>
- <string name="MuteObject">
- (物件)
- </string>
- <string name="MuteGroup">
- (群組)
- </string>
- <string name="MuteExternal">
- (外部)
- </string>
- <string name="RegionNoCovenant">
- 此領地未提供任何契約要求。
- </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" value="最後修改於:"/>
- <string name="none_text" value="(無)"/>
- <string name="never_text" value="(絕不)"/>
- <string name="GroupOwned">
- 群組所擁有
- </string>
- <string name="Public">
- 公開
- </string>
- <string name="ClassifiedClicksTxt">
- Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile
- </string>
- <string name="ClassifiedUpdateAfterPublish">
- (將於發布後自動更新)
- </string>
- <string name="NoPicksClassifiedsText">
- You haven&apos;t created any Picks or Classifieds. Click the Plus button below to create a Pick or Classified.
- </string>
- <string name="NoAvatarPicksClassifiedsText">
- 使用者無精選地點或個人廣告
- </string>
- <string name="PicksClassifiedsLoadingText">
- 載入中...
- </string>
- <string name="MultiPreviewTitle">
- 預覽
- </string>
- <string name="MultiPropertiesTitle">
- 屬性
- </string>
- <string name="InvOfferAnObjectNamed">
- An object named
- </string>
- <string name="InvOfferOwnedByGroup">
- 群組所擁有
- </string>
- <string name="InvOfferOwnedByUnknownGroup">
- 由一個未知的群組所擁有
- </string>
- <string name="InvOfferOwnedBy">
- owned by
- </string>
- <string name="InvOfferOwnedByUnknownUser">
- owned by an unknown user
- </string>
- <string name="InvOfferGaveYou">
- gave you
- </string>
- <string name="InvOfferDecline">
- You decline [DESC] from &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
- </string>
- <string name="GroupMoneyTotal">
- Total
- </string>
- <string name="GroupMoneyBought">
- bought
- </string>
- <string name="GroupMoneyPaidYou">
- paid you
- </string>
- <string name="GroupMoneyPaidInto">
- paid into
- </string>
- <string name="GroupMoneyBoughtPassTo">
- bought pass to
- </string>
- <string name="GroupMoneyPaidFeeForEvent">
- paid fee for event
- </string>
- <string name="GroupMoneyPaidPrizeForEvent">
- paid prize for event
- </string>
- <string name="GroupMoneyBalance">
- Balance
- </string>
- <string name="GroupMoneyCredits">
- Credits
- </string>
- <string name="GroupMoneyDebits">
- Debits
- </string>
- <string name="ViewerObjectContents">
- Contents
- </string>
- <string name="AcquiredItems">
- Acquired Items
- </string>
- <string name="Cancel">
- 取消
- </string>
- <string name="UploadingCosts">
- 花費 L$ [AMOUNT] 上傳 [NAME]
- </string>
- <string name="BuyingCosts">
- 花費 L$ [AMOUNT] 購買這個
- </string>
- <string name="UnknownFileExtension">
- 未知的副檔名 .%s
-預期為 .wav, .tga, .bmp, .jpg, .jpeg, or .bvh 類型
- </string>
- <string name="MuteObject2">
- Block
- </string>
- <string name="MuteAvatar">
- Block
- </string>
- <string name="UnmuteObject">
- Unblock
- </string>
- <string name="UnmuteAvatar">
- Unblock
- </string>
- <string name="AddLandmarkNavBarMenu">
- 添加到我的地標...
- </string>
- <string name="EditLandmarkNavBarMenu">
- 編輯我的地標...
- </string>
- <string name="accel-mac-control">
- ⌃
- </string>
- <string name="accel-mac-command">
- ⌘
- </string>
- <string name="accel-mac-option">
- ⌥
- </string>
- <string name="accel-mac-shift">
- ⇧
- </string>
- <string name="accel-win-control">
- Ctrl+
- </string>
- <string name="accel-win-alt">
- Alt+
- </string>
- <string name="accel-win-shift">
- Shift+
- </string>
- <string name="FileSaved">
- 檔案已儲存
- </string>
- <string name="Receiving">
- 接收中
- </string>
- <string name="AM">
- AM
- </string>
- <string name="PM">
- PM
- </string>
- <string name="PST">
- PST
- </string>
- <string name="PDT">
- PDT
- </string>
- <string name="Direction_Forward">
- 向前
- </string>
- <string name="Direction_Left">
- 向左
- </string>
- <string name="Direction_Right">
- 向右
- </string>
- <string name="Direction_Back">
- 向後
- </string>
- <string name="Direction_North">
- 北
- </string>
- <string name="Direction_South">
- 南
- </string>
- <string name="Direction_West">
- 西
- </string>
- <string name="Direction_East">
- 東
- </string>
- <string name="Direction_Up">
- 向上
- </string>
- <string name="Direction_Down">
- 向下
- </string>
- <string name="Any Category">
- 任何類別
- </string>
- <string name="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="None">
- 無
- </string>
- <string name="Linden Location">
- Linden Location
- </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">
- Stage
- </string>
- <string name="Other">
- Other
- </string>
- <string name="Rental">
- Rental
- </string>
- <string name="Any">
- 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] 無法存取它所需要的檔案。
-
-This can be because you somehow have multiple copies running, or your system incorrectly thinks a file is open.
-If this message persists, restart your computer and try again.
-If it continues to persist, you may need to completely uninstall [APP_NAME] and reinstall it.
- </string>
- <string name="MBFatalError">
- 致命錯誤
- </string>
- <string name="MBRequiresAltiVec">
- [APP_NAME] requires a processor with AltiVec (G4 or later).
- </string>
- <string name="MBAlreadyRunning">
- [APP_NAME] 已經在執行中。
-請檢查你的工作列裡是否有其他最小化的相同程式。
-如果這個訊息持續出現,請重新啟動你的電腦。
- </string>
- <string name="MBFrozenCrashed">
- [APP_NAME] appears to have frozen or crashed on the previous run.
-Would you like to send a crash report?
- </string>
- <string name="MBAlert">
- 通知
- </string>
- <string name="MBNoDirectX">
- [APP_NAME] is unable to detect DirectX 9.0b or greater.
-[APP_NAME] uses DirectX to detect hardware and/or outdated drivers that can cause stability problems, poor performance and crashes. While you can run [APP_NAME] without it, we highly recommend running with DirectX 9.0b.
-
-Do you wish to continue?
- </string>
- <string name="MBWarning">
- 警告
- </string>
- <string name="MBNoAutoUpdate">
- Automatic updating is not yet implemented for Linux.
-Please download the latest version from www.secondlife.com.
- </string>
- <string name="MBRegClassFailed">
- RegisterClass failed
- </string>
- <string name="MBError">
- 錯誤
- </string>
- <string name="MBFullScreenErr">
- 無法執行全螢幕於 [WIDTH] x [HEIGHT].
-執行於視窗中。
- </string>
- <string name="MBDestroyWinFailed">
- Shutdown Error while destroying window (DestroyWindow() failed)
- </string>
- <string name="MBShutdownErr">
- Shutdown Error
- </string>
- <string name="MBDevContextErr">
- Can&apos;t make GL device context
- </string>
- <string name="MBPixelFmtErr">
- Can&apos;t find suitable pixel format
- </string>
- <string name="MBPixelFmtDescErr">
- Can&apos;t get pixel format description
- </string>
- <string name="MBTrueColorWindow">
- [APP_NAME] requires True Color (32-bit) to run.
-Please go to your computer&apos;s display settings and set the color mode to 32-bit.
- </string>
- <string name="MBAlpha">
- [APP_NAME] is unable to run because it can&apos;t get an 8 bit alpha channel. Usually this is due to video card driver issues.
-Please make sure you have the latest video card drivers installed.
-Also be sure your monitor is set to True Color (32-bit) in Control Panels &gt; Display &gt; Settings.
-If you continue to receive this message, contact the [SUPPORT_SITE].
- </string>
- <string name="MBPixelFmtSetErr">
- 無法設定像素格式
- </string>
- <string name="MBGLContextErr">
- Can&apos;t create GL rendering context
- </string>
- <string name="MBGLContextActErr">
- Can&apos;t activate GL rendering context
- </string>
- <string name="MBVideoDrvErr">
- [APP_NAME] is unable to run because your video card drivers did not install properly, are out of date, or are for unsupported hardware. Please make sure you have the latest video card drivers and even if you do have the latest, try reinstalling them.
-
-If you continue to receive this message, contact the [SUPPORT_SITE].
- </string>
- <string name="5 O&apos;Clock Shadow">
- 5 O&apos;Clock Shadow
- </string>
- <string name="All White">
- 全白
- </string>
- <string name="Anime Eyes">
- Anime Eyes
- </string>
- <string name="Arced">
- Arced
- </string>
- <string name="Arm Length">
- Arm Length
- </string>
- <string name="Attached">
- Attached
- </string>
- <string name="Attached Earlobes">
- Attached Earlobes
- </string>
- <string name="Back Fringe">
- Back Fringe
- </string>
- <string name="Baggy">
- Baggy
- </string>
- <string name="Bangs">
- Bangs
- </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 Hair Back">
- Big Hair: Back
- </string>
- <string name="Big Hair Front">
- Big Hair: Front
- </string>
- <string name="Big Hair Top">
- Big Hair: Top
- </string>
- <string name="Big Head">
- Big Head
- </string>
- <string name="Big Pectorals">
- Big Pectorals
- </string>
- <string name="Big Spikes">
- Big Spikes
- </string>
- <string name="Black">
- Black
- </string>
- <string name="Blonde">
- Blonde
- </string>
- <string name="Blonde Hair">
- Blonde Hair
- </string>
- <string name="Blush">
- Blush
- </string>
- <string name="Blush Color">
- Blush Color
- </string>
- <string name="Blush Opacity">
- Blush Opacity
- </string>
- <string name="Body Definition">
- Body Definition
- </string>
- <string name="Body Fat">
- Body Fat
- </string>
- <string name="Body Freckles">
- Body Freckles
- </string>
- <string name="Body Thick">
- Body Thick
- </string>
- <string name="Body Thickness">
- Body Thickness
- </string>
- <string name="Body Thin">
- Body Thin
- </string>
- <string name="Bow Legged">
- Bow Legged
- </string>
- <string name="Breast Buoyancy">
- Breast Buoyancy
- </string>
- <string name="Breast Cleavage">
- Breast Cleavage
- </string>
- <string name="Breast Size">
- Breast Size
- </string>
- <string name="Bridge Width">
- Bridge Width
- </string>
- <string name="Broad">
- Broad
- </string>
- <string name="Brow Size">
- Brow Size
- </string>
- <string name="Bug Eyes">
- Bug Eyes
- </string>
- <string name="Bugged Eyes">
- Bugged Eyes
- </string>
- <string name="Bulbous">
- Bulbous
- </string>
- <string name="Bulbous Nose">
- Bulbous Nose
- </string>
- <string name="Breast Physics Mass">
- Breast Mass
- </string>
- <string name="Breast Physics Smoothing">
- Breast Smoothing
- </string>
- <string name="Breast Physics Gravity">
- Breast Gravity
- </string>
- <string name="Breast Physics Drag">
- Breast Drag
- </string>
- <string name="Breast Physics InOut Max Effect">
- Max Effect
- </string>
- <string name="Breast Physics InOut Spring">
- Spring
- </string>
- <string name="Breast Physics InOut Gain">
- Gain
- </string>
- <string name="Breast Physics InOut Damping">
- Damping
- </string>
- <string name="Breast Physics UpDown Max Effect">
- Max Effect
- </string>
- <string name="Breast Physics UpDown Spring">
- Spring
- </string>
- <string name="Breast Physics UpDown Gain">
- Gain
- </string>
- <string name="Breast Physics UpDown Damping">
- Damping
- </string>
- <string name="Breast Physics LeftRight Max Effect">
- Max Effect
- </string>
- <string name="Breast Physics LeftRight Spring">
- Spring
- </string>
- <string name="Breast Physics LeftRight Gain">
- Gain
- </string>
- <string name="Breast Physics LeftRight Damping">
- Damping
- </string>
- <string name="Belly Physics Mass">
- Belly Mass
- </string>
- <string name="Belly Physics Smoothing">
- Belly Smoothing
- </string>
- <string name="Belly Physics Gravity">
- Belly Gravity
- </string>
- <string name="Belly Physics Drag">
- Belly Drag
- </string>
- <string name="Belly Physics UpDown Max Effect">
- Max Effect
- </string>
- <string name="Belly Physics UpDown Spring">
- Spring
- </string>
- <string name="Belly Physics UpDown Gain">
- Gain
- </string>
- <string name="Belly Physics UpDown Damping">
- Damping
- </string>
- <string name="Butt Physics Mass">
- Butt Mass
- </string>
- <string name="Butt Physics Smoothing">
- Butt Smoothing
- </string>
- <string name="Butt Physics Gravity">
- Butt Gravity
- </string>
- <string name="Butt Physics Drag">
- Butt Drag
- </string>
- <string name="Butt Physics UpDown Max Effect">
- Max Effect
- </string>
- <string name="Butt Physics UpDown Spring">
- Spring
- </string>
- <string name="Butt Physics UpDown Gain">
- Gain
- </string>
- <string name="Butt Physics UpDown Damping">
- Damping
- </string>
- <string name="Butt Physics LeftRight Max Effect">
- Max Effect
- </string>
- <string name="Butt Physics LeftRight Spring">
- Spring
- </string>
- <string name="Butt Physics LeftRight Gain">
- Gain
- </string>
- <string name="Butt Physics LeftRight Damping">
- Damping
- </string>
- <string name="Bushy Eyebrows">
- Bushy Eyebrows
- </string>
- <string name="Bushy Hair">
- Bushy Hair
- </string>
- <string name="Butt Size">
- Butt Size
- </string>
- <string name="Butt Gravity">
- Butt Gravity
- </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">
- Cheek Bones
- </string>
- <string name="Chest Size">
- Chest Size
- </string>
- <string name="Chin Angle">
- 下巴角度
- </string>
- <string name="Chin Cleft">
- Chin Cleft
- </string>
- <string name="Chin Curtains">
- Chin Curtains
- </string>
- <string name="Chin Depth">
- Chin Depth
- </string>
- <string name="Chin Heavy">
- Chin Heavy
- </string>
- <string name="Chin In">
- Chin In
- </string>
- <string name="Chin Out">
- Chin Out
- </string>
- <string name="Chin-Neck">
- Chin-Neck
- </string>
- <string name="Clear">
- 清除
- </string>
- <string name="Cleft">
- Cleft
- </string>
- <string name="Close Set Eyes">
- Close Set Eyes
- </string>
- <string name="Closed">
- Closed
- </string>
- <string name="Closed Back">
- Closed Back
- </string>
- <string name="Closed Front">
- Closed Front
- </string>
- <string name="Closed Left">
- Closed Left
- </string>
- <string name="Closed Right">
- Closed Right
- </string>
- <string name="Coin Purse">
- Coin Purse
- </string>
- <string name="Collar Back">
- Collar Back
- </string>
- <string name="Collar Front">
- Collar Front
- </string>
- <string name="Corner Down">
- Corner Down
- </string>
- <string name="Corner Up">
- Corner Up
- </string>
- <string name="Creased">
- Creased
- </string>
- <string name="Crooked Nose">
- Crooked Nose
- </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="Dense">
- Dense
- </string>
- <string name="Double Chin">
- Double Chin
- </string>
- <string name="Downturned">
- Downturned
- </string>
- <string name="Duffle Bag">
- Duffle Bag
- </string>
- <string name="Ear Angle">
- Ear Angle
- </string>
- <string name="Ear Size">
- Ear Size
- </string>
- <string name="Ear Tips">
- Ear Tips
- </string>
- <string name="Egg Head">
- Egg Head
- </string>
- <string name="Eye Bags">
- Eye Bags
- </string>
- <string name="Eye Color">
- Eye Color
- </string>
- <string name="Eye Depth">
- Eye Depth
- </string>
- <string name="Eye Lightness">
- Eye Lightness
- </string>
- <string name="Eye Opening">
- Eye Opening
- </string>
- <string name="Eye Pop">
- Eye Pop
- </string>
- <string name="Eye Size">
- Eye Size
- </string>
- <string name="Eye Spacing">
- Eye Spacing
- </string>
- <string name="Eyebrow Arc">
- Eyebrow Arc
- </string>
- <string name="Eyebrow Density">
- Eyebrow Density
- </string>
- <string name="Eyebrow Height">
- Eyebrow Height
- </string>
- <string name="Eyebrow Points">
- Eyebrow Points
- </string>
- <string name="Eyebrow Size">
- Eyebrow Size
- </string>
- <string name="Eyelash Length">
- Eyelash Length
- </string>
- <string name="Eyeliner">
- Eyeliner
- </string>
- <string name="Eyeliner Color">
- Eyeliner Color
- </string>
- <string name="Eyes Bugged">
- Eyes Bugged
- </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 Lips">
- Fat Lips
- </string>
- <string name="Female">
- Female
- </string>
- <string name="Fingerless">
- Fingerless
- </string>
- <string name="Fingers">
- Fingers
- </string>
- <string name="Flared Cuffs">
- Flared Cuffs
- </string>
- <string name="Flat">
- Flat
- </string>
- <string name="Flat Butt">
- Flat Butt
- </string>
- <string name="Flat Head">
- Flat Head
- </string>
- <string name="Flat Toe">
- Flat Toe
- </string>
- <string name="Foot Size">
- Foot Size
- </string>
- <string name="Forehead Angle">
- Forehead Angle
- </string>
- <string name="Forehead Heavy">
- Forehead Heavy
- </string>
- <string name="Freckles">
- Freckles
- </string>
- <string name="Front Fringe">
- Front Fringe
- </string>
- <string name="Full Back">
- Full Back
- </string>
- <string name="Full Eyeliner">
- Full Eyeliner
- </string>
- <string name="Full Front">
- Full Front
- </string>
- <string name="Full Hair Sides">
- Full Hair Sides
- </string>
- <string name="Full Sides">
- Full Sides
- </string>
- <string name="Glossy">
- Glossy
- </string>
- <string name="Glove Fingers">
- Glove Fingers
- </string>
- <string name="Glove Length">
- Glove Length
- </string>
- <string name="Hair">
- 頭髮
- </string>
- <string name="Hair Back">
- Hair: Back
- </string>
- <string name="Hair Front">
- Hair: Front
- </string>
- <string name="Hair Sides">
- Hair: Sides
- </string>
- <string name="Hair Sweep">
- Hair Sweep
- </string>
- <string name="Hair Thickess">
- Hair Thickness
- </string>
- <string name="Hair Thickness">
- Hair Thickness
- </string>
- <string name="Hair Tilt">
- Hair Tilt
- </string>
- <string name="Hair Tilted Left">
- Hair Tilted Left
- </string>
- <string name="Hair Tilted Right">
- Hair Tilted Right
- </string>
- <string name="Hair Volume">
- Hair: Volume
- </string>
- <string name="Hand Size">
- Hand Size
- </string>
- <string name="Handlebars">
- Handlebars
- </string>
- <string name="Head Length">
- Head Length
- </string>
- <string name="Head Shape">
- Head Shape
- </string>
- <string name="Head Size">
- Head Size
- </string>
- <string name="Head Stretch">
- Head Stretch
- </string>
- <string name="Heel Height">
- Heel Height
- </string>
- <string name="Heel Shape">
- Heel Shape
- </string>
- <string name="Height">
- Height
- </string>
- <string name="High">
- High
- </string>
- <string name="High Heels">
- High Heels
- </string>
- <string name="High Jaw">
- High Jaw
- </string>
- <string name="High Platforms">
- High Platforms
- </string>
- <string name="High and Tight">
- High and Tight
- </string>
- <string name="Higher">
- Higher
- </string>
- <string name="Hip Length">
- Hip Length
- </string>
- <string name="Hip Width">
- Hip Width
- </string>
- <string name="In">
- In
- </string>
- <string name="In Shdw Color">
- Inner Shadow Color
- </string>
- <string name="In Shdw Opacity">
- Inner Shadow Opacity
- </string>
- <string name="Inner Eye Corner">
- Inner Eye Corner
- </string>
- <string name="Inner Eye Shadow">
- Inner Eye Shadow
- </string>
- <string name="Inner Shadow">
- Inner Shadow
- </string>
- <string name="Jacket Length">
- Jacket Length
- </string>
- <string name="Jacket Wrinkles">
- Jacket Wrinkles
- </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">
- Join
- </string>
- <string name="Jowls">
- Jowls
- </string>
- <string name="Knee Angle">
- Knee Angle
- </string>
- <string name="Knock Kneed">
- Knock Kneed
- </string>
- <string name="Large">
- Large
- </string>
- <string name="Large Hands">
- Large Hands
- </string>
- <string name="Left Part">
- Left Part
- </string>
- <string name="Leg Length">
- Leg Length
- </string>
- <string name="Leg Muscles">
- Leg Muscles
- </string>
- <string name="Less">
- Less
- </string>
- <string name="Less Body Fat">
- Less Body Fat
- </string>
- <string name="Less Curtains">
- Less Curtains
- </string>
- <string name="Less Freckles">
- Less Freckles
- </string>
- <string name="Less Full">
- Less Full
- </string>
- <string name="Less Gravity">
- Less Gravity
- </string>
- <string name="Less Love">
- Less Love
- </string>
- <string name="Less Muscles">
- Less Muscles
- </string>
- <string name="Less Muscular">
- Less Muscular
- </string>
- <string name="Less Rosy">
- Less Rosy
- </string>
- <string name="Less Round">
- Less Round
- </string>
- <string name="Less Saddle">
- Less Saddle
- </string>
- <string name="Less Square">
- Less Square
- </string>
- <string name="Less Volume">
- Less Volume
- </string>
- <string name="Less soul">
- Less soul
- </string>
- <string name="Lighter">
- Lighter
- </string>
- <string name="Lip Cleft">
- Lip Cleft
- </string>
- <string name="Lip Cleft Depth">
- Lip Cleft Depth
- </string>
- <string name="Lip Fullness">
- Lip Fullness
- </string>
- <string name="Lip Pinkness">
- Lip Pinkness
- </string>
- <string name="Lip Ratio">
- Lip Ratio
- </string>
- <string name="Lip Thickness">
- Lip Thickness
- </string>
- <string name="Lip Width">
- Lip Width
- </string>
- <string name="Lipgloss">
- Lipgloss
- </string>
- <string name="Lipstick">
- Lipstick
- </string>
- <string name="Lipstick Color">
- Lipstick Color
- </string>
- <string name="Long">
- Long
- </string>
- <string name="Long Head">
- Long Head
- </string>
- <string name="Long Hips">
- Long Hips
- </string>
- <string name="Long Legs">
- Long Legs
- </string>
- <string name="Long Neck">
- Long Neck
- </string>
- <string name="Long Pigtails">
- Long Pigtails
- </string>
- <string name="Long Ponytail">
- Long Ponytail
- </string>
- <string name="Long Torso">
- Long Torso
- </string>
- <string name="Long arms">
- Long arms
- </string>
- <string name="Loose Pants">
- Loose Pants
- </string>
- <string name="Loose Shirt">
- Loose Shirt
- </string>
- <string name="Loose Sleeves">
- Loose Sleeves
- </string>
- <string name="Love Handles">
- Love Handles
- </string>
- <string name="Low">
- Low
- </string>
- <string name="Low Heels">
- Low Heels
- </string>
- <string name="Low Jaw">
- Low Jaw
- </string>
- <string name="Low Platforms">
- Low Platforms
- </string>
- <string name="Low and Loose">
- Low and Loose
- </string>
- <string name="Lower">
- Lower
- </string>
- <string name="Lower Bridge">
- Lower Bridge
- </string>
- <string name="Lower Cheeks">
- Lower Cheeks
- </string>
- <string name="Male">
- 男性
- </string>
- <string name="Middle Part">
- Middle Part
- </string>
- <string name="More">
- 更多
- </string>
- <string name="More Blush">
- More Blush
- </string>
- <string name="More Body Fat">
- More Body Fat
- </string>
- <string name="More Curtains">
- More Curtains
- </string>
- <string name="More Eyeshadow">
- More Eyeshadow
- </string>
- <string name="More Freckles">
- More Freckles
- </string>
- <string name="More Full">
- More Full
- </string>
- <string name="More Gravity">
- More Gravity
- </string>
- <string name="More Lipstick">
- More Lipstick
- </string>
- <string name="More Love">
- More Love
- </string>
- <string name="More Lower Lip">
- More Lower Lip
- </string>
- <string name="More Muscles">
- More Muscles
- </string>
- <string name="More Muscular">
- More Muscular
- </string>
- <string name="More Rosy">
- More Rosy
- </string>
- <string name="More Round">
- More Round
- </string>
- <string name="More Saddle">
- More Saddle
- </string>
- <string name="More Sloped">
- More Sloped
- </string>
- <string name="More Square">
- More Square
- </string>
- <string name="More Upper Lip">
- More Upper Lip
- </string>
- <string name="More Vertical">
- More Vertical
- </string>
- <string name="More Volume">
- More Volume
- </string>
- <string name="More soul">
- More soul
- </string>
- <string name="Moustache">
- Moustache
- </string>
- <string name="Mouth Corner">
- Mouth Corner
- </string>
- <string name="Mouth Position">
- Mouth Position
- </string>
- <string name="Mowhawk">
- Mowhawk
- </string>
- <string name="Muscular">
- Muscular
- </string>
- <string name="Mutton Chops">
- Mutton Chops
- </string>
- <string name="Nail Polish">
- Nail Polish
- </string>
- <string name="Nail Polish Color">
- Nail Polish Color
- </string>
- <string name="Narrow">
- Narrow
- </string>
- <string name="Narrow Back">
- Narrow Back
- </string>
- <string name="Narrow Front">
- Narrow Front
- </string>
- <string name="Narrow Lips">
- Narrow Lips
- </string>
- <string name="Natural">
- Natural
- </string>
- <string name="Neck Length">
- Neck Length
- </string>
- <string name="Neck Thickness">
- Neck Thickness
- </string>
- <string name="No Blush">
- No Blush
- </string>
- <string name="No Eyeliner">
- No Eyeliner
- </string>
- <string name="No Eyeshadow">
- No Eyeshadow
- </string>
- <string name="No Lipgloss">
- No Lipgloss
- </string>
- <string name="No Lipstick">
- No Lipstick
- </string>
- <string name="No Part">
- No Part
- </string>
- <string name="No Polish">
- No Polish
- </string>
- <string name="No Red">
- No Red
- </string>
- <string name="No Spikes">
- No Spikes
- </string>
- <string name="No White">
- No White
- </string>
- <string name="No Wrinkles">
- No Wrinkles
- </string>
- <string name="Normal Lower">
- Normal Lower
- </string>
- <string name="Normal Upper">
- Normal Upper
- </string>
- <string name="Nose Left">
- Nose Left
- </string>
- <string name="Nose Right">
- Nose Right
- </string>
- <string name="Nose Size">
- Nose Size
- </string>
- <string name="Nose Thickness">
- Nose Thickness
- </string>
- <string name="Nose Tip Angle">
- Nose Tip Angle
- </string>
- <string name="Nose Tip Shape">
- Nose Tip Shape
- </string>
- <string name="Nose Width">
- Nose Width
- </string>
- <string name="Nostril Division">
- Nostril Division
- </string>
- <string name="Nostril Width">
- Nostril Width
- </string>
- <string name="Opaque">
- Opaque
- </string>
- <string name="Open">
- Open
- </string>
- <string name="Open Back">
- Open Back
- </string>
- <string name="Open Front">
- Open Front
- </string>
- <string name="Open Left">
- Open Left
- </string>
- <string name="Open Right">
- Open Right
- </string>
- <string name="Orange">
- Orange
- </string>
- <string name="Out">
- Out
- </string>
- <string name="Out Shdw Color">
- Outer Shadow Color
- </string>
- <string name="Out Shdw Opacity">
- Outer Shadow Opacity
- </string>
- <string name="Outer Eye Corner">
- Outer Eye Corner
- </string>
- <string name="Outer Eye Shadow">
- Outer Eye Shadow
- </string>
- <string name="Outer Shadow">
- Outer Shadow
- </string>
- <string name="Overbite">
- Overbite
- </string>
- <string name="Package">
- Package
- </string>
- <string name="Painted Nails">
- Painted Nails
- </string>
- <string name="Pale">
- Pale
- </string>
- <string name="Pants Crotch">
- Pants Crotch
- </string>
- <string name="Pants Fit">
- Pants Fit
- </string>
- <string name="Pants Length">
- Pants Length
- </string>
- <string name="Pants Waist">
- Pants Waist
- </string>
- <string name="Pants Wrinkles">
- Pants Wrinkles
- </string>
- <string name="Part">
- Part
- </string>
- <string name="Part Bangs">
- Part Bangs
- </string>
- <string name="Pectorals">
- Pectorals
- </string>
- <string name="Pigment">
- Pigment
- </string>
- <string name="Pigtails">
- Pigtails
- </string>
- <string name="Pink">
- Pink
- </string>
- <string name="Pinker">
- Pinker
- </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="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="Rainbow Color">
- Rainbow Color
- </string>
- <string name="Red Hair">
- Red Hair
- </string>
- <string name="Regular">
- Regular
- </string>
- <string name="Right Part">
- Right Part
- </string>
- <string name="Rosy Complexion">
- Rosy Complexion
- </string>
- <string name="Round">
- Round
- </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="Scrawny Leg">
- Scrawny Leg
- </string>
- <string name="Separate">
- Separate
- </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 Up">
- Shear Left Up
- </string>
- <string name="Shear Right Up">
- Shear Right Up
- </string>
- <string name="Sheared Back">
- Sheared Back
- </string>
- <string name="Sheared Front">
- Sheared Front
- </string>
- <string name="Shift Left">
- Shift Left
- </string>
- <string name="Shift Mouth">
- Shift Mouth
- </string>
- <string name="Shift Right">
- Shift Right
- </string>
- <string name="Shirt Bottom">
- Shirt Bottom
- </string>
- <string name="Shirt Fit">
- Shirt Fit
- </string>
- <string name="Shirt Wrinkles">
- Shirt Wrinkles
- </string>
- <string name="Shoe Height">
- Shoe Height
- </string>
- <string name="Short">
- Short
- </string>
- <string name="Short Arms">
- Short Arms
- </string>
- <string name="Short Legs">
- Short Legs
- </string>
- <string name="Short Neck">
- Short Neck
- </string>
- <string name="Short Pigtails">
- Short Pigtails
- </string>
- <string name="Short Ponytail">
- Short Ponytail
- </string>
- <string name="Short Sideburns">
- Short Sideburns
- </string>
- <string name="Short Torso">
- Short Torso
- </string>
- <string name="Short hips">
- Short hips
- </string>
- <string name="Shoulders">
- Shoulders
- </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 Neck">
- Skinny Neck
- </string>
- <string name="Skirt Fit">
- Skirt Fit
- </string>
- <string name="Skirt Length">
- Skirt Length
- </string>
- <string name="Slanted Forehead">
- Slanted Forehead
- </string>
- <string name="Sleeve Length">
- Sleeve Length
- </string>
- <string name="Sleeve Looseness">
- Sleeve Looseness
- </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">
- Small
- </string>
- <string name="Small Hands">
- Small Hands
- </string>
- <string name="Small Head">
- Small Head
- </string>
- <string name="Smooth">
- Smooth
- </string>
- <string name="Smooth Hair">
- Smooth Hair
- </string>
- <string name="Socks Length">
- Socks Length
- </string>
- <string name="Soulpatch">
- Soulpatch
- </string>
- <string name="Sparse">
- Sparse
- </string>
- <string name="Spiked Hair">
- Spiked Hair
- </string>
- <string name="Square">
- Square
- </string>
- <string name="Square Toe">
- Square Toe
- </string>
- <string name="Squash Head">
- Squash Head
- </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="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="Thin">
- Thin
- </string>
- <string name="Thin Eyebrows">
- Thin Eyebrows
- </string>
- <string name="Thin Lips">
- Thin Lips
- </string>
- <string name="Thin Nose">
- Thin Nose
- </string>
- <string name="Tight Chin">
- Tight Chin
- </string>
- <string name="Tight Cuffs">
- Tight Cuffs
- </string>
- <string name="Tight Pants">
- Tight Pants
- </string>
- <string name="Tight Shirt">
- Tight Shirt
- </string>
- <string name="Tight Skirt">
- Tight Skirt
- </string>
- <string name="Tight Sleeves">
- Tight Sleeves
- </string>
- <string name="Toe Shape">
- Toe Shape
- </string>
- <string name="Toe Thickness">
- Toe Thickness
- </string>
- <string name="Torso Length">
- Torso Length
- </string>
- <string name="Torso Muscles">
- Torso Muscles
- </string>
- <string name="Torso Scrawny">
- Torso Scrawny
- </string>
- <string name="Unattached">
- Unattached
- </string>
- <string name="Uncreased">
- Uncreased
- </string>
- <string name="Underbite">
- Underbite
- </string>
- <string name="Unnatural">
- Unnatural
- </string>
- <string name="Upper Bridge">
- Upper Bridge
- </string>
- <string name="Upper Cheeks">
- Upper Cheeks
- </string>
- <string name="Upper Chin Cleft">
- Upper Chin Cleft
- </string>
- <string name="Upper Eyelid Fold">
- Upper Eyelid Fold
- </string>
- <string name="Upturned">
- Upturned
- </string>
- <string name="Very Red">
- Very Red
- </string>
- <string name="Waist Height">
- Waist Height
- </string>
- <string name="Well-Fed">
- Well-Fed
- </string>
- <string name="White Hair">
- White Hair
- </string>
- <string name="Wide">
- Wide
- </string>
- <string name="Wide Back">
- Wide Back
- </string>
- <string name="Wide Front">
- Wide Front
- </string>
- <string name="Wide Lips">
- Wide Lips
- </string>
- <string name="Wild">
- Wild
- </string>
- <string name="Wrinkles">
- 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="LocationCtrlAdultIconTooltip">
- 完全成人地區
- </string>
- <string name="LocationCtrlModerateIconTooltip">
- 適度成人地區
- </string>
- <string name="LocationCtrlGeneralIconTooltip">
- 一般普級地區
- </string>
- <string name="UpdaterWindowTitle">
- [APP_NAME] 更新
- </string>
- <string name="UpdaterNowUpdating">
- [APP_NAME] 現更新中...
- </string>
- <string name="UpdaterNowInstalling">
- [APP_NAME] 安裝中...
- </string>
- <string name="UpdaterUpdatingDescriptive">
- Your [APP_NAME] Viewer is being updated to the latest release. This may take some time, so please be patient.
- </string>
- <string name="UpdaterProgressBarTextWithEllipses">
- 更新下載中...
- </string>
- <string name="UpdaterProgressBarText">
- 更新下載
- </string>
- <string name="UpdaterFailDownloadTitle">
- 夏載更新失敗
- </string>
- <string name="UpdaterFailUpdateDescriptive">
- An error occurred while updating [APP_NAME]. Please download the latest version from www.secondlife.com.
- </string>
- <string name="UpdaterFailInstallTitle">
- 安裝更新失敗
- </string>
- <string name="UpdaterFailStartTitle">
- 啟動瀏覽器失敗
- </string>
- <string name="ItemsComingInTooFastFrom">
- [APP_NAME]: Items coming in too fast from [FROM_NAME], automatic preview disabled for [TIME] seconds
- </string>
- <string name="ItemsComingInTooFast">
- [APP_NAME]: Items coming in too fast, automatic preview disabled for [TIME] seconds
- </string>
- <string name="IM_logging_string">
- -- Instant message logging enabled --
- </string>
- <string name="IM_typing_start_string">
- [NAME] 正在輸入...
- </string>
- <string name="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">
- 點擊此處以傳送即時訊息。
- </string>
- <string name="IM_to_label">
- 至
- </string>
- <string name="IM_moderator_label">
- (Moderator)
- </string>
- <string name="Saved_message">
- (Saved [LONG_TIMESTAMP])
- </string>
- <string name="answered_call">
- Your call has been answered
- </string>
- <string name="you_started_call">
- You started a voice call
- </string>
- <string name="you_joined_call">
- You joined the voice call
- </string>
- <string name="name_started_call">
- [NAME] started a voice call
- </string>
- <string name="ringing-im">
- 加入語音通話...
- </string>
- <string name="connected-im">
- Connected, click Leave Call to hang up
- </string>
- <string name="hang_up-im">
- 離開語音通話
- </string>
- <string name="answering-im">
- 聯接中...
- </string>
- <string name="conference-title">
- Ad-hoc Conference
- </string>
- <string name="conference-title-incoming">
- Conference with [AGENT_NAME]
- </string>
- <string name="inventory_item_offered-im">
- Inventory item offered
- </string>
- <string name="share_alert">
- Drag items from inventory here
- </string>
- <string name="no_session_message">
- (IM 會話不存在)
- </string>
- <string name="only_user_message">
- You are the only user in this session.
- </string>
- <string name="offline_message">
- [NAME] 離線。
- </string>
- <string name="invite_message">
- 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.
- </string>
- <string name="generic">
- Error making request, please try again later.
- </string>
- <string name="generic_request_error">
- Error making request, please try again later.
- </string>
- <string name="insufficient_perms_error">
- You do not have sufficient permissions.
- </string>
- <string name="session_does_not_exist_error">
- 此會話不再存在
- </string>
- <string name="no_ability_error">
- 你並不具有這個能力。
- </string>
- <string name="no_ability">
- 你並不具有這個能力。
- </string>
- <string name="not_a_mod_error">
- You are not a session moderator.
- </string>
- <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>
- <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>
- <string name="removed">
- 你已經由群組中被移除。
- </string>
- <string name="removed_from_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>
- <string name="session_initialization_timed_out_error">
- The session initialization is timed out
- </string>
- <string name="voice_morphing_url">
- http://secondlife.com/landing/voicemorphing
- </string>
- <string name="paid_you_ldollars">
- [NAME] paid you L$[AMOUNT] [REASON].
- </string>
- <string name="paid_you_ldollars_no_reason">
- [NAME] paid you L$[AMOUNT].
- </string>
- <string name="you_paid_ldollars">
- You paid [NAME] L$[AMOUNT] [REASON].
- </string>
- <string name="you_paid_ldollars_no_info">
- You paid L$[AMOUNT].
- </string>
- <string name="you_paid_ldollars_no_reason">
- You paid [NAME] L$[AMOUNT].
- </string>
- <string name="you_paid_ldollars_no_name">
- You paid L$[AMOUNT] [REASON].
- </string>
- <string name="for item">
- for [ITEM]
- </string>
- <string name="for a parcel of land">
- for a parcel of land
- </string>
- <string name="for a land access pass">
- for a land access pass
- </string>
- <string name="for deeding land">
- for deeding land
- </string>
- <string name="to create a group">
- 以創造群組
- </string>
- <string name="to join a group">
- 以加入群組
- </string>
- <string name="to upload">
- 以上傳
- </string>
- <string name="to publish a classified ad">
- to publish a classified ad
- </string>
- <string name="giving">
- Giving L$ [AMOUNT]
- </string>
- <string name="uploading_costs">
- 上傳花費 L$ [AMOUNT]
- </string>
- <string name="this_costs">
- This costs L$ [AMOUNT]
- </string>
- <string name="buying_selected_land">
- Buying selected land for L$ [AMOUNT]
- </string>
- <string name="this_object_costs">
- This object costs L$ [AMOUNT]
- </string>
- <string name="group_role_everyone">
- 任何人
- </string>
- <string name="group_role_officers">
- Officers
- </string>
- <string name="group_role_owners">
- 擁有者
- </string>
- <string name="group_member_status_online">
- 上線
- </string>
- <string name="uploading_abuse_report">
- 上傳中...
-
-舉報濫用
- </string>
- <string name="New Shape">
- 新體形
- </string>
- <string name="New Skin">
- 新皮膚
- </string>
- <string name="New Hair">
- 新頭髮
- </string>
- <string name="New Eyes">
- 新眼睛
- </string>
- <string name="New Shirt">
- 新襯衫
- </string>
- <string name="New Pants">
- 新褲子
- </string>
- <string name="New Shoes">
- 新鞋子
- </string>
- <string name="New Socks">
- 新襪子
- </string>
- <string name="New Jacket">
- 新夾克
- </string>
- <string name="New Gloves">
- 新手套
- </string>
- <string name="New Undershirt">
- 新內衣
- </string>
- <string name="New Underpants">
- 新內褲
- </string>
- <string name="New Skirt">
- 新裙子
- </string>
- <string name="New Alpha">
- 新半透明
- </string>
- <string name="New Tattoo">
- 新刺青
- </string>
- <string name="New Physics">
- 新身體物理
- </string>
- <string name="Invalid Wearable">
- 無效的可穿裝扮
- </string>
- <string name="New Gesture">
- 新姿勢
- </string>
- <string name="New Script">
- 新腳本
- </string>
- <string name="New Note">
- 新記事卡
- </string>
- <string name="New Folder">
- 新資料夾
- </string>
- <string name="Contents">
- 內容
- </string>
- <string name="Gesture">
- 姿勢
- </string>
- <string name="Male Gestures">
- 男性姿勢
- </string>
- <string name="Female Gestures">
- 女性姿勢
- </string>
- <string name="Other Gestures">
- 其他姿勢
- </string>
- <string name="Speech Gestures">
- 演說姿勢
- </string>
- <string name="Common Gestures">
- 一般姿勢
- </string>
- <string name="Male - Excuse me">
- Male - Excuse me
- </string>
- <string name="Male - Get lost">
- Male - Get lost
- </string>
- <string name="Male - Blow kiss">
- Male - Blow kiss
- </string>
- <string name="Male - Boo">
- Male - Boo
- </string>
- <string name="Male - Bored">
- Male - Bored
- </string>
- <string name="Male - Hey">
- Male - Hey
- </string>
- <string name="Male - Laugh">
- Male - Laugh
- </string>
- <string name="Male - Repulsed">
- Male - Repulsed
- </string>
- <string name="Male - Shrug">
- Male - Shrug
- </string>
- <string name="Male - Stick tougue out">
- Male - Stick tougue out
- </string>
- <string name="Male - Wow">
- Male - Wow
- </string>
- <string name="Female - Chuckle">
- Female - Chuckle
- </string>
- <string name="Female - Cry">
- Female - Cry
- </string>
- <string name="Female - Embarrassed">
- Female - Embarrassed
- </string>
- <string name="Female - Excuse me">
- Female - Excuse me
- </string>
- <string name="Female - Get lost">
- Female - Get lost
- </string>
- <string name="Female - Blow kiss">
- Female - Blow kiss
- </string>
- <string name="Female - Boo">
- Female - Boo
- </string>
- <string name="Female - Bored">
- Female - Bored
- </string>
- <string name="Female - Hey">
- Female - Hey
- </string>
- <string name="Female - Hey baby">
- Female - Hey baby
- </string>
- <string name="Female - Laugh">
- Female - Laugh
- </string>
- <string name="Female - Looking good">
- Female - Looking good
- </string>
- <string name="Female - Over here">
- Female - Over here
- </string>
- <string name="Female - Please">
- Female - Please
- </string>
- <string name="Female - Repulsed">
- Female - Repulsed
- </string>
- <string name="Female - Shrug">
- Female - Shrug
- </string>
- <string name="Female - Stick tougue out">
- Female - Stick tougue out
- </string>
- <string name="Female - Wow">
- Female - Wow
- </string>
- <string name="AvatarBirthDateFormat">
- [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
- </string>
- <string name="DefaultMimeType">
- 無/無
- </string>
- <string name="texture_load_dimensions_error">
- 無法載入圖像大於 [WIDTH]*[HEIGHT]
- </string>
- <string name="words_separator" value=","/>
- <string name="server_is_down">
- Despite our best efforts, something unexpected has gone wrong.
-
- Please check status.secondlifegrid.net to see if there is a known problem with the service.
- If you continue to experience problems, please check your network and firewall setup.
- </string>
- <string name="dateTimeWeekdaysNames">
- Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday
- </string>
- <string name="dateTimeWeekdaysShortNames">
- Sun:Mon:Tue:Wed:Thu:Fri:Sat
- </string>
- <string name="dateTimeMonthNames">
- January:February:March:April:May:June:July:August:September:October:November:December
- </string>
- <string name="dateTimeMonthShortNames">
- Jan:Feb:Mar:Apr:May:Jun:Jul:Aug:Sep:Oct:Nov:Dec
- </string>
- <string name="dateTimeDayFormat">
- [MDAY]
- </string>
- <string name="dateTimeAM">
- AM
- </string>
- <string name="dateTimePM">
- PM
- </string>
- <string name="LocalEstimateUSD">
- US$ [AMOUNT]
- </string>
- <string name="Membership">
- 成員資格
- </string>
- <string name="Roles">
- 角色
- </string>
- <string name="Group Identity">
- Group Identity
- </string>
- <string name="Parcel Management">
- 地段管理
- </string>
- <string name="Parcel Identity">
- Parcel Identity
- </string>
- <string name="Parcel Settings">
- 地段設定
- </string>
- <string name="Parcel Powers">
- Parcel Powers
- </string>
- <string name="Parcel Access">
- Parcel Access
- </string>
- <string name="Parcel Content">
- Parcel Content
- </string>
- <string name="Object Management">
- 物件管理
- </string>
- <string name="Accounting">
- 會計
- </string>
- <string name="Notices">
- 通知
- </string>
- <string name="Chat">
- 聊天
- </string>
- <string name="DeleteItems">
- 刪除所選取的物品?
- </string>
- <string name="DeleteItem">
- 刪除所選取的物品?
- </string>
- <string name="EmptyOutfitText">
- 沒有任何物品在這個裝扮內
- </string>
- <string name="ExternalEditorNotSet">
- 選擇一個編輯器使用 ExternalEditor 設定。
- </string>
- <string name="ExternalEditorNotFound">
- Cannot find the external editor you specified.
-Try enclosing path to the editor with double quotes.
-(e.g. &quot;/path to my/editor&quot; &quot;%s&quot;)
- </string>
- <string name="ExternalEditorCommandParseError">
- Error parsing the external editor command.
- </string>
- <string name="ExternalEditorFailedToRun">
- 執行外部編輯器失敗。
- </string>
- <string name="Esc">
- Esc
- </string>
- <string name="Space">
- Space
- </string>
- <string name="Enter">
- Enter
- </string>
- <string name="Tab">
- Tab
- </string>
- <string name="Ins">
- Ins
- </string>
- <string name="Del">
- Del
- </string>
- <string name="Backsp">
- Backsp
- </string>
- <string name="Shift">
- Shift
- </string>
- <string name="Ctrl">
- Ctrl
- </string>
- <string name="Alt">
- Alt
- </string>
- <string name="CapsLock">
- CapsLock
- </string>
- <string name="Left">
- Left
- </string>
- <string name="Right">
- Right
- </string>
- <string name="Up">
- Up
- </string>
- <string name="Down">
- Down
- </string>
- <string name="Home">
- Home
- </string>
- <string name="End">
- End
- </string>
- <string name="PgUp">
- PgUp
- </string>
- <string name="PgDn">
- PgDn
- </string>
- <string name="F1">
- F1
- </string>
- <string name="F2">
- F2
- </string>
- <string name="F3">
- F3
- </string>
- <string name="F4">
- F4
- </string>
- <string name="F5">
- F5
- </string>
- <string name="F6">
- F6
- </string>
- <string name="F7">
- F7
- </string>
- <string name="F8">
- F8
- </string>
- <string name="F9">
- F9
- </string>
- <string name="F10">
- F10
- </string>
- <string name="F11">
- F11
- </string>
- <string name="F12">
- F12
- </string>
- <string name="Add">
- Add
- </string>
- <string name="Subtract">
- Subtract
- </string>
- <string name="Multiply">
- Multiply
- </string>
- <string name="Divide">
- Divide
- </string>
- <string name="PAD_DIVIDE">
- PAD_DIVIDE
- </string>
- <string name="PAD_LEFT">
- PAD_LEFT
- </string>
- <string name="PAD_RIGHT">
- PAD_RIGHT
- </string>
- <string name="PAD_DOWN">
- PAD_DOWN
- </string>
- <string name="PAD_UP">
- PAD_UP
- </string>
- <string name="PAD_HOME">
- PAD_HOME
- </string>
- <string name="PAD_END">
- PAD_END
- </string>
- <string name="PAD_PGUP">
- PAD_PGUP
- </string>
- <string name="PAD_PGDN">
- PAD_PGDN
- </string>
- <string name="PAD_CENTER">
- PAD_CENTER
- </string>
- <string name="PAD_INS">
- PAD_INS
- </string>
- <string name="PAD_DEL">
- PAD_DEL
- </string>
- <string name="PAD_Enter">
- PAD_Enter
- </string>
- <string name="PAD_BUTTON0">
- PAD_BUTTON0
- </string>
- <string name="PAD_BUTTON1">
- PAD_BUTTON1
- </string>
- <string name="PAD_BUTTON2">
- PAD_BUTTON2
- </string>
- <string name="PAD_BUTTON3">
- PAD_BUTTON3
- </string>
- <string name="PAD_BUTTON4">
- PAD_BUTTON4
- </string>
- <string name="PAD_BUTTON5">
- PAD_BUTTON5
- </string>
- <string name="PAD_BUTTON6">
- PAD_BUTTON6
- </string>
- <string name="PAD_BUTTON7">
- PAD_BUTTON7
- </string>
- <string name="PAD_BUTTON8">
- PAD_BUTTON8
- </string>
- <string name="PAD_BUTTON9">
- PAD_BUTTON9
- </string>
- <string name="PAD_BUTTON10">
- PAD_BUTTON10
- </string>
- <string name="PAD_BUTTON11">
- PAD_BUTTON11
- </string>
- <string name="PAD_BUTTON12">
- PAD_BUTTON12
- </string>
- <string name="PAD_BUTTON13">
- PAD_BUTTON13
- </string>
- <string name="PAD_BUTTON14">
- PAD_BUTTON14
- </string>
- <string name="PAD_BUTTON15">
- PAD_BUTTON15
- </string>
- <string name="-">
- -
- </string>
- <string name="=">
- =
- </string>
- <string name="`">
- `
- </string>
- <string name=";">
- ;
- </string>
- <string name="[">
- [
- </string>
- <string name="]">
- ]
- </string>
- <string name="\">
- \
- </string>
- <string name="0">
- 0
- </string>
- <string name="1">
- 1
- </string>
- <string name="2">
- 2
- </string>
- <string name="3">
- 3
- </string>
- <string name="4">
- 4
- </string>
- <string name="5">
- 5
- </string>
- <string name="6">
- 6
- </string>
- <string name="7">
- 7
- </string>
- <string name="8">
- 8
- </string>
- <string name="9">
- 9
- </string>
- <string name="A">
- A
- </string>
- <string name="B">
- B
- </string>
- <string name="C">
- C
- </string>
- <string name="D">
- D
- </string>
- <string name="E">
- E
- </string>
- <string name="F">
- F
- </string>
- <string name="G">
- G
- </string>
- <string name="H">
- H
- </string>
- <string name="I">
- I
- </string>
- <string name="J">
- J
- </string>
- <string name="K">
- K
- </string>
- <string name="L">
- L
- </string>
- <string name="M">
- M
- </string>
- <string name="N">
- N
- </string>
- <string name="O">
- O
- </string>
- <string name="P">
- P
- </string>
- <string name="Q">
- Q
- </string>
- <string name="R">
- R
- </string>
- <string name="S">
- S
- </string>
- <string name="T">
- T
- </string>
- <string name="U">
- U
- </string>
- <string name="V">
- V
- </string>
- <string name="W">
- W
- </string>
- <string name="X">
- X
- </string>
- <string name="Y">
- Y
- </string>
- <string name="Z">
- Z
- </string>
- <string name="BeaconParticle">
- Viewing particle beacons (blue)
- </string>
- <string name="BeaconPhysical">
- Viewing physical object beacons (green)
- </string>
- <string name="BeaconScripted">
- Viewing scripted object beacons (red)
- </string>
- <string name="BeaconScriptedTouch">
- Viewing scripted object with touch function beacons (red)
- </string>
- <string name="BeaconSound">
- Viewing sound beacons (yellow)
- </string>
- <string name="BeaconMedia">
- Viewing media beacons (white)
- </string>
- <string name="ParticleHiding">
- Hiding Particles
- </string>
-</strings>
diff --git a/indra/newview/tests/lldir_stub.cpp b/indra/newview/tests/lldir_stub.cpp
index 18cf4e7419..2bc6772d86 100644
--- a/indra/newview/tests/lldir_stub.cpp
+++ b/indra/newview/tests/lldir_stub.cpp
@@ -32,7 +32,7 @@ BOOL LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask
void LLDir::setChatLogsDir(const std::string &path) {}
void LLDir::setPerAccountChatLogsDir(const std::string &first, const std::string &last) {}
void LLDir::setLindenUserDir(const std::string &first, const std::string &last) {}
-void LLDir::setSkinFolder(const std::string &skin_folder) {}
+void LLDir::setSkinFolder(const std::string &skin_folder, const std::string& language) {}
bool LLDir::setCacheDir(const std::string &path) { return true; }
void LLDir::dumpCurrentDirectories() {}
@@ -48,7 +48,7 @@ public:
/*virtual*/ U32 countFilesInDir(const std::string &dirname, const std::string &mask) { return 42; }
/*virtual*/ BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) { fname = fname + "_NEXT"; return false; }
/*virtual*/ void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) { fname = "RANDOM_FILE"; }
- /*virtual*/ BOOL fileExists(const std::string &filename) const { return false; }
+ /*virtual*/ bool fileExists(const std::string &filename) const { return false; }
};
LLDir_stub gDirUtil;
diff --git a/indra/newview/tests/lltranslate_test.cpp b/indra/newview/tests/lltranslate_test.cpp
index 10e37fae97..fd9527d631 100644
--- a/indra/newview/tests/lltranslate_test.cpp
+++ b/indra/newview/tests/lltranslate_test.cpp
@@ -299,11 +299,6 @@ LLControlGroup::LLControlGroup(const std::string& name) : LLInstanceTracker<LLCo
std::string LLControlGroup::getString(const std::string& name) { return "dummy"; }
LLControlGroup::~LLControlGroup() {}
-namespace boost {
- void intrusive_ptr_add_ref(LLCurl::Responder*) {}
- void intrusive_ptr_release(LLCurl::Responder*) {}
-}
-
LLCurl::Responder::Responder() {}
void LLCurl::Responder::completedHeader(U32, std::string const&, LLSD const&) {}
void LLCurl::Responder::completedRaw(U32, const std::string&, const LLChannelDescriptors&, const LLIOPipe::buffer_ptr_t& buffer) {}
@@ -314,7 +309,7 @@ void LLCurl::Responder::result(LLSD const&) {}
LLCurl::Responder::~Responder() {}
void LLHTTPClient::get(const std::string&, const LLSD&, ResponderPtr, const LLSD&, const F32) {}
-void LLHTTPClient::get(const std::string&, boost::intrusive_ptr<LLCurl::Responder>, const LLSD&, const F32) {}
+void LLHTTPClient::get(const std::string&, LLPointer<LLCurl::Responder>, const LLSD&, const F32) {}
LLBufferStream::LLBufferStream(const LLChannelDescriptors& channels, LLBufferArray* buffer)
: std::iostream(&mStreamBuf), mStreamBuf(channels, buffer) {}
diff --git a/indra/newview/tests/llviewerassetstats_test.cpp b/indra/newview/tests/llviewerassetstats_test.cpp
index f8923b9868..f8923b9868 100755..100644
--- a/indra/newview/tests/llviewerassetstats_test.cpp
+++ b/indra/newview/tests/llviewerassetstats_test.cpp
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 3c3aba23f8..e7108141ee 100644
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -28,6 +28,7 @@ $/LicenseInfo$
"""
import sys
import os.path
+import errno
import re
import tarfile
import time
@@ -74,20 +75,20 @@ class ViewerManifest(LLManifest):
# include the list of Lindens (if any)
# see https://wiki.lindenlab.com/wiki/Generated_Linden_Credits
linden_names_path = os.getenv("LINDEN_CREDITS")
- if linden_names_path :
+ if not linden_names_path :
+ print "No 'LINDEN_CREDITS' specified in environment, using built-in list"
+ else:
try:
linden_file = open(linden_names_path,'r')
+ except IOError:
+ print "No Linden names found at '%s', using built-in list" % linden_names_path
+ else:
# all names should be one line, but the join below also converts to a string
linden_names = ', '.join(linden_file.readlines())
self.put_in_file(linden_names, "lindens.txt")
linden_file.close()
print "Linden names extracted from '%s'" % linden_names_path
self.file_list.append([linden_names_path,self.dst_path_of("lindens.txt")])
- except IOError:
- print "No Linden names found at '%s', using built-in list" % linden_names_path
- pass
- else :
- print "No 'LINDEN_CREDITS' specified in environment, using built-in list"
# ... and the entire windlight directory
self.path("windlight")
@@ -114,7 +115,6 @@ class ViewerManifest(LLManifest):
# skins
if self.prefix(src="skins"):
- self.path("paths.xml")
# include the entire textures directory recursively
if self.prefix(src="*/textures"):
self.path("*/*.tga")
@@ -132,11 +132,18 @@ class ViewerManifest(LLManifest):
self.path("*/*.xml")
# Local HTML files (e.g. loading screen)
- if self.prefix(src="*/html"):
+ # The claim is that we never use local html files any
+ # longer. But rather than commenting out this block, let's
+ # rename every html subdirectory as html.old. That way, if
+ # we're wrong, a user actually does have the relevant
+ # files; s/he just needs to rename every html.old
+ # directory back to html to recover them.
+ if self.prefix(src="*/html", dst="*/html.old"):
self.path("*.png")
self.path("*/*/*.html")
self.path("*/*/*.gif")
self.end_prefix("*/html")
+
self.end_prefix("skins")
# local_assets dir (for pre-cached textures)
@@ -149,14 +156,9 @@ class ViewerManifest(LLManifest):
self.path("gpu_table.txt")
# The summary.json file gets left in the base checkout dir by
- # build.sh. It's only created for a build.sh build, therefore we
- # have to check whether it exists. :-P
- summary_json = "summary.json"
- summary_json_path = os.path.join(os.pardir, os.pardir, summary_json)
- if os.path.exists(os.path.join(self.get_src_prefix(), summary_json_path)):
- self.path(summary_json_path, summary_json)
- else:
- print "No %s" % os.path.join(self.get_src_prefix(), summary_json_path)
+ # build.sh. It's only created for a build.sh build.
+ if not self.path2basename(os.path.join(os.pardir, os.pardir), "summary.json"):
+ print "No summary.json file"
def login_channel(self):
"""Channel reported for login and upgrade purposes ONLY;
@@ -327,13 +329,13 @@ class WindowsManifest(ViewerManifest):
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")
+ self.path2basename(os.path.join(os.pardir,
+ 'llplugin', 'slplugin', self.args['configuration']),
+ "slplugin.exe")
#self.disable_manifest_check()
- self.path(src="../viewer_components/updater/scripts/windows/update_install.bat", dst="update_install.bat")
+ self.path2basename("../viewer_components/updater/scripts/windows", "update_install.bat")
# Get shared libs from the shared libs staging directory
if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']),
dst=""):
@@ -367,9 +369,7 @@ class WindowsManifest(ViewerManifest):
# Get fmod dll, continue if missing
- try:
- self.path("fmod.dll")
- except:
+ if not self.path("fmod.dll"):
print "Skipping fmod.dll"
# For textures
@@ -537,6 +537,7 @@ class WindowsManifest(ViewerManifest):
result += 'File ' + pkg_file + '\n'
else:
result += 'Delete ' + wpath(os.path.join('$INSTDIR', rel_file)) + '\n'
+
# at the end of a delete, just rmdir all the directories
if not install:
deleted_file_dirs = [os.path.dirname(pair[1].replace(self.get_dst_prefix()+os.path.sep,'')) for pair in self.file_list]
@@ -710,85 +711,82 @@ class DarwinManifest(ViewerManifest):
self.path("uk.lproj")
self.path("zh-Hans.lproj")
- libdir = "../packages/lib/release"
- dylibs = {}
+ def path_optional(src, dst):
+ """
+ For a number of our self.path() calls, not only do we want
+ to deal with the absence of src, we also want to remember
+ which were present. Return either an empty list (absent)
+ or a list containing dst (present). Concatenate these
+ return values to get a list of all libs that are present.
+ """
+ if self.path(src, dst):
+ return [dst]
+ print "Skipping %s" % dst
+ return []
- # Need to get the llcommon dll from any of the build directories as well
- lib = "llcommon"
- libfile = "lib%s.dylib" % lib
- try:
- self.path(self.find_existing_file(os.path.join(os.pardir,
- lib,
- self.args['configuration'],
- libfile),
- os.path.join(libdir, libfile)),
- dst=libfile)
- except RuntimeError:
- print "Skipping %s" % libfile
- dylibs[lib] = False
- else:
- dylibs[lib] = True
-
- if dylibs["llcommon"]:
- for libfile in ("libapr-1.0.dylib",
- "libaprutil-1.0.dylib",
- "libexpat.1.5.2.dylib",
- "libexception_handler.dylib",
- "libGLOD.dylib",
- "libcollada14dom.dylib"
- ):
- self.path(os.path.join(libdir, libfile), libfile)
-
- # SLVoice and vivox lols
- for libfile in ('libsndfile.dylib', 'libvivoxoal.dylib', 'libortp.dylib', \
- 'libvivoxsdk.dylib', 'libvivoxplatform.dylib', 'SLVoice') :
- self.path(os.path.join(libdir, libfile), libfile)
+ libdir = "../packages/lib/release"
+ # dylibs is a list of all the .dylib files we expect to need
+ # in our bundled sub-apps. For each of these we'll create a
+ # symlink from sub-app/Contents/Resources to the real .dylib.
+ # Need to get the llcommon dll from any of the build directories as well.
+ libfile = "libllcommon.dylib"
+ dylibs = path_optional(self.find_existing_file(os.path.join(os.pardir,
+ "llcommon",
+ self.args['configuration'],
+ libfile),
+ os.path.join(libdir, libfile)),
+ dst=libfile)
+
+ for libfile in (
+ "libapr-1.0.dylib",
+ "libaprutil-1.0.dylib",
+ "libcollada14dom.dylib",
+ "libexpat.1.5.2.dylib",
+ "libexception_handler.dylib",
+ "libGLOD.dylib",
+ ):
+ dylibs += path_optional(os.path.join(libdir, libfile), libfile)
+
+ # SLVoice and vivox lols, no symlinks needed
+ for libfile in (
+ 'libortp.dylib',
+ 'libsndfile.dylib',
+ 'libvivoxoal.dylib',
+ 'libvivoxsdk.dylib',
+ 'libvivoxplatform.dylib',
+ 'SLVoice',
+ ):
+ self.path2basename(libdir, libfile)
- try:
- # FMOD for sound
- self.path(self.args['configuration'] + "/libfmodwrapper.dylib", "libfmodwrapper.dylib")
- except:
- print "Skipping FMOD - not found"
+ # FMOD for sound
+ libfile = "libfmodwrapper.dylib"
+ path_optional(os.path.join(self.args['configuration'], libfile), libfile)
# our apps
- self.path("../mac_crash_logger/" + self.args['configuration'] + "/mac-crash-logger.app", "mac-crash-logger.app")
- self.path("../mac_updater/" + self.args['configuration'] + "/mac-updater.app", "mac-updater.app")
-
- # plugin launcher
- self.path("../llplugin/slplugin/" + self.args['configuration'] + "/SLPlugin.app", "SLPlugin.app")
-
- # our apps dependencies on shared libs
- if dylibs["llcommon"]:
- mac_crash_logger_res_path = self.dst_path_of("mac-crash-logger.app/Contents/Resources")
- mac_updater_res_path = self.dst_path_of("mac-updater.app/Contents/Resources")
- slplugin_res_path = self.dst_path_of("SLPlugin.app/Contents/Resources")
- for libfile in ("libllcommon.dylib",
- "libapr-1.0.dylib",
- "libaprutil-1.0.dylib",
- "libexpat.1.5.2.dylib",
- "libexception_handler.dylib",
- "libGLOD.dylib",
- "libcollada14dom.dylib"
- ):
- target_lib = os.path.join('../../..', libfile)
- self.run_command("ln -sf %(target)r %(link)r" %
- {'target': target_lib,
- 'link' : os.path.join(mac_crash_logger_res_path, libfile)}
- )
- self.run_command("ln -sf %(target)r %(link)r" %
- {'target': target_lib,
- 'link' : os.path.join(mac_updater_res_path, libfile)}
- )
- self.run_command("ln -sf %(target)r %(link)r" %
- {'target': target_lib,
- 'link' : os.path.join(slplugin_res_path, libfile)}
- )
+ for app_bld_dir, app in (("mac_crash_logger", "mac-crash-logger.app"),
+ ("mac_updater", "mac-updater.app"),
+ # plugin launcher
+ (os.path.join("llplugin", "slplugin"), "SLPlugin.app"),
+ ):
+ self.path2basename(os.path.join(os.pardir,
+ app_bld_dir, self.args['configuration']),
+ app)
+
+ # our apps dependencies on shared libs
+ # for each app, for each dylib we collected in dylibs,
+ # create a symlink to the real copy of the dylib.
+ resource_path = self.dst_path_of(os.path.join(app, "Contents", "Resources"))
+ for libfile in dylibs:
+ symlinkf(os.path.join(os.pardir, os.pardir, os.pardir, libfile),
+ os.path.join(resource_path, libfile))
# plugins
if self.prefix(src="", dst="llplugin"):
- self.path("../media_plugins/quicktime/" + self.args['configuration'] + "/media_plugin_quicktime.dylib", "media_plugin_quicktime.dylib")
- self.path("../media_plugins/webkit/" + self.args['configuration'] + "/media_plugin_webkit.dylib", "media_plugin_webkit.dylib")
- self.path("../packages/lib/release/libllqtwebkit.dylib", "libllqtwebkit.dylib")
+ self.path2basename("../media_plugins/quicktime/" + self.args['configuration'],
+ "media_plugin_quicktime.dylib")
+ self.path2basename("../media_plugins/webkit/" + self.args['configuration'],
+ "media_plugin_webkit.dylib")
+ self.path2basename("../packages/lib/release", "libllqtwebkit.dylib")
self.end_prefix("llplugin")
@@ -955,20 +953,24 @@ class LinuxManifest(ViewerManifest):
self.path("client-readme-voice.txt","README-linux-voice.txt")
self.path("client-readme-joystick.txt","README-linux-joystick.txt")
self.path("wrapper.sh","secondlife")
- self.path("handle_secondlifeprotocol.sh", "etc/handle_secondlifeprotocol.sh")
- self.path("register_secondlifeprotocol.sh", "etc/register_secondlifeprotocol.sh")
- self.path("refresh_desktop_app_entry.sh", "etc/refresh_desktop_app_entry.sh")
- self.path("launch_url.sh","etc/launch_url.sh")
+ if self.prefix(src="", dst="etc"):
+ self.path("handle_secondlifeprotocol.sh")
+ self.path("register_secondlifeprotocol.sh")
+ self.path("refresh_desktop_app_entry.sh")
+ self.path("launch_url.sh")
+ self.end_prefix("etc")
self.path("install.sh")
self.end_prefix("linux_tools")
# Create an appropriate gridargs.dat for this package, denoting required grid.
self.put_in_file(self.flags_list(), 'etc/gridargs.dat')
- 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(src="", dst="bin"):
+ self.path("secondlife-bin","do-not-directly-run-secondlife-bin")
+ self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin")
+ self.path2basename("../llplugin/slplugin", "SLPlugin")
+ self.path2basename("../viewer_components/updater/scripts/linux", "update_install")
+ self.end_prefix("bin")
if self.prefix("res-sdl"):
self.path("*")
@@ -984,17 +986,13 @@ class LinuxManifest(ViewerManifest):
self.end_prefix("res-sdl")
self.end_prefix(icon_path)
- self.path("../viewer_components/updater/scripts/linux/update_install", "bin/update_install")
-
# plugins
if self.prefix(src="", dst="bin/llplugin"):
- self.path("../media_plugins/webkit/libmedia_plugin_webkit.so", "libmedia_plugin_webkit.so")
+ self.path2basename("../media_plugins/webkit", "libmedia_plugin_webkit.so")
self.path("../media_plugins/gstreamer010/libmedia_plugin_gstreamer010.so", "libmedia_plugin_gstreamer.so")
self.end_prefix("bin/llplugin")
- try:
- self.path("../llcommon/libllcommon.so", "lib/libllcommon.so")
- except:
+ if not self.path("../llcommon/libllcommon.so", "lib/libllcommon.so"):
print "Skipping llcommon.so (assuming llcommon was linked statically)"
self.path("featuretable_linux.txt")
@@ -1018,9 +1016,7 @@ class LinuxManifest(ViewerManifest):
else:
installer_name += '_' + self.channel_oneword().upper()
- if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer():
- print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build"
- self.run_command("find %(d)r/bin %(d)r/lib -type f \\! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure
+ self.strip_binaries()
# Fix access permissions
self.run_command("""
@@ -1055,14 +1051,31 @@ class LinuxManifest(ViewerManifest):
'dst': self.get_dst_prefix(),
'inst': self.build_path_of(installer_name)})
+ def strip_binaries(self):
+ if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer():
+ print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build"
+ self.run_command(r"find %(d)r/bin %(d)r/lib -type f \! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure
+
class Linux_i686Manifest(LinuxManifest):
def construct(self):
super(Linux_i686Manifest, self).construct()
if self.prefix("../packages/lib/release", dst="lib"):
- self.path("libapr-1.so*")
- self.path("libaprutil-1.so*")
- self.path("libbreakpad_client.so*")
+ self.path("libapr-1.so")
+ self.path("libapr-1.so.0")
+ self.path("libapr-1.so.0.4.5")
+ self.path("libaprutil-1.so")
+ self.path("libaprutil-1.so.0")
+ self.path("libaprutil-1.so.0.4.1")
+ self.path("libboost_program_options-mt.so.*")
+ self.path("libboost_regex-mt.so.*")
+ self.path("libboost_thread-mt.so.*")
+ self.path("libboost_filesystem-mt.so.*")
+ self.path("libboost_signals-mt.so.*")
+ self.path("libboost_system-mt.so.*")
+ self.path("libbreakpad_client.so.0.0.0")
+ self.path("libbreakpad_client.so.0")
+ self.path("libbreakpad_client.so")
self.path("libcollada14dom.so")
self.path("libdb*.so")
self.path("libcrypto.so.*")
@@ -1078,15 +1091,11 @@ class Linux_i686Manifest(LinuxManifest):
self.path("libopenjpeg.so*")
self.path("libdirectfb-1.4.so.5")
self.path("libfusion-1.4.so.5")
- self.path("libdirect-1.4.so.5.0.4")
- self.path("libdirect-1.4.so.5")
- self.path("libhunspell-1.3.so")
- self.path("libhunspell-1.3.so.0")
- self.path("libhunspell-1.3.so.0.0.0")
+ self.path("libdirect-1.4.so.5*")
+ self.path("libhunspell-1.3.so*")
self.path("libalut.so")
self.path("libopenal.so", "libopenal.so.1")
self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname
-
# KLUDGE: As of 2012-04-11, the 'fontconfig' package installs
# libfontconfig.so.1.4.4, along with symlinks libfontconfig.so.1
# and libfontconfig.so. Before we added support for library-file
@@ -1105,7 +1114,13 @@ class Linux_i686Manifest(LinuxManifest):
# previous call did, without having to explicitly state the
# version number.
self.path("libfontconfig.so.*.*")
- self.path("libtcmalloc.so*") #formerly called google perf tools
+ try:
+ self.path("libtcmalloc.so*") #formerly called google perf tools
+ pass
+ except:
+ print "tcmalloc files not found, skipping"
+ pass
+
try:
self.path("libfmod-3.75.so")
pass
@@ -1126,9 +1141,7 @@ class Linux_i686Manifest(LinuxManifest):
self.path("libvivoxplatform.so")
self.end_prefix("lib")
- if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer():
- print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build"
- self.run_command("find %(d)r/bin %(d)r/lib -type f \\! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure
+ self.strip_binaries()
class Linux_x86_64Manifest(LinuxManifest):
@@ -1140,5 +1153,25 @@ class Linux_x86_64Manifest(LinuxManifest):
################################################################
+def symlinkf(src, dst):
+ """
+ Like ln -sf, but uses os.symlink() instead of running ln.
+ """
+ try:
+ os.symlink(src, dst)
+ except OSError, err:
+ if err.errno != errno.EEXIST:
+ raise
+ # We could just blithely attempt to remove and recreate the target
+ # file, but that strategy doesn't work so well if we don't have
+ # permissions to remove it. Check to see if it's already the
+ # symlink we want, which is the usual reason for EEXIST.
+ if not (os.path.islink(dst) and os.readlink(dst) == src):
+ # Here either dst isn't a symlink or it's the wrong symlink.
+ # Remove and recreate. Caller will just have to deal with any
+ # exceptions at this stage.
+ os.remove(dst)
+ os.symlink(src, dst)
+
if __name__ == "__main__":
main()