summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rwxr-xr-xindra/newview/CMakeLists.txt44
-rw-r--r--indra/newview/VIEWER_VERSION.txt2
-rwxr-xr-xindra/newview/app_settings/commands.xml12
-rwxr-xr-xindra/newview/app_settings/high_graphics.xml6
-rwxr-xr-xindra/newview/app_settings/keywords.ini20
-rwxr-xr-xindra/newview/app_settings/low_graphics.xml8
-rwxr-xr-xindra/newview/app_settings/mid_graphics.xml6
-rwxr-xr-xindra/newview/app_settings/settings.xml376
-rwxr-xr-xindra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl3
-rwxr-xr-xindra/newview/app_settings/shaders/class1/deferred/bumpF.glsl24
-rwxr-xr-xindra/newview/app_settings/toolbars.xml3
-rwxr-xr-xindra/newview/app_settings/ultra_graphics.xml7
-rwxr-xr-xindra/newview/featuretable.txt44
-rwxr-xr-xindra/newview/featuretable_linux.txt16
-rwxr-xr-xindra/newview/featuretable_mac.txt33
-rwxr-xr-xindra/newview/featuretable_solaris.txt2
-rwxr-xr-xindra/newview/featuretable_xp.txt24
-rwxr-xr-xindra/newview/installers/windows/installer_template.nsi11
-rwxr-xr-xindra/newview/llagent.cpp8
-rwxr-xr-xindra/newview/llagentcamera.cpp6
-rwxr-xr-xindra/newview/llagentcamera.h4
-rwxr-xr-xindra/newview/llagentdata.cpp1
-rwxr-xr-xindra/newview/llagentdata.h1
-rwxr-xr-xindra/newview/llagentwearables.cpp115
-rwxr-xr-xindra/newview/llaisapi.cpp7
-rwxr-xr-xindra/newview/llaisapi.h2
-rwxr-xr-xindra/newview/llappearancemgr.cpp515
-rwxr-xr-xindra/newview/llappearancemgr.h29
-rwxr-xr-xindra/newview/llappviewer.cpp64
-rwxr-xr-xindra/newview/llappviewer.h4
-rwxr-xr-xindra/newview/llappviewermacosx.cpp50
-rwxr-xr-xindra/newview/llassetuploadqueue.cpp5
-rwxr-xr-xindra/newview/llassetuploadqueue.h4
-rwxr-xr-xindra/newview/llattachmentsmgr.cpp451
-rwxr-xr-xindra/newview/llattachmentsmgr.h107
-rwxr-xr-xindra/newview/llavatariconctrl.cpp1
-rw-r--r--indra/newview/llavatarrenderinfoaccountant.cpp534
-rw-r--r--indra/newview/llavatarrenderinfoaccountant.h33
-rw-r--r--indra/newview/llavatarrendernotifier.cpp258
-rw-r--r--indra/newview/llavatarrendernotifier.h84
-rw-r--r--[-rwxr-xr-x]indra/newview/llcallbacklist.cpp0
-rwxr-xr-xindra/newview/llcallbacklist.h72
-rwxr-xr-xindra/newview/llcallingcard.cpp25
-rwxr-xr-xindra/newview/llcallingcard.h3
-rwxr-xr-xindra/newview/llchannelmanager.cpp3
-rwxr-xr-xindra/newview/llchathistory.cpp6
-rwxr-xr-xindra/newview/llchiclet.cpp8
-rwxr-xr-xindra/newview/llchicletbar.cpp3
-rwxr-xr-xindra/newview/llcommandhandler.cpp12
-rwxr-xr-xindra/newview/llcompilequeue.cpp152
-rwxr-xr-xindra/newview/llcompilequeue.h12
-rwxr-xr-xindra/newview/llconversationlog.h3
-rwxr-xr-xindra/newview/llconversationmodel.cpp19
-rw-r--r--indra/newview/llconversationmodel.h2
-rwxr-xr-xindra/newview/lldrawpoolavatar.cpp36
-rwxr-xr-xindra/newview/lldrawpoolbump.cpp1
-rwxr-xr-xindra/newview/llexpandabletextbox.cpp2
-rwxr-xr-xindra/newview/llexpandabletextbox.h2
-rw-r--r--indra/newview/llexperienceassociationresponder.cpp104
-rw-r--r--indra/newview/llexperienceassociationresponder.h58
-rw-r--r--indra/newview/llexperiencelog.cpp273
-rw-r--r--indra/newview/llexperiencelog.h85
-rwxr-xr-xindra/newview/llfavoritesbar.cpp407
-rwxr-xr-xindra/newview/llfavoritesbar.h26
-rwxr-xr-xindra/newview/llfeaturemanager.cpp33
-rwxr-xr-xindra/newview/llfloaterabout.cpp105
-rwxr-xr-xindra/newview/llfloaterabout.h3
-rwxr-xr-xindra/newview/llfloaterauction.cpp33
-rwxr-xr-xindra/newview/llfloaterauction.h2
-rwxr-xr-xindra/newview/llfloaterbump.cpp32
-rwxr-xr-xindra/newview/llfloaterbump.h4
-rw-r--r--indra/newview/llfloaterdeleteprefpreset.cpp101
-rw-r--r--indra/newview/llfloaterdeleteprefpreset.h53
-rw-r--r--indra/newview/llfloaterexperiencepicker.cpp162
-rw-r--r--indra/newview/llfloaterexperiencepicker.h67
-rw-r--r--indra/newview/llfloaterexperienceprofile.cpp1004
-rw-r--r--indra/newview/llfloaterexperienceprofile.h104
-rw-r--r--indra/newview/llfloaterexperiences.cpp340
-rw-r--r--indra/newview/llfloaterexperiences.h60
-rw-r--r--indra/newview/llfloaterfacebook.cpp6
-rwxr-xr-xindra/newview/llfloaterhardwaresettings.cpp201
-rwxr-xr-xindra/newview/llfloaterhardwaresettings.h84
-rwxr-xr-xindra/newview/llfloaterimcontainer.cpp74
-rwxr-xr-xindra/newview/llfloaterimcontainer.h2
-rwxr-xr-xindra/newview/llfloaterjoystick.cpp14
-rwxr-xr-xindra/newview/llfloaterjoystick.h5
-rwxr-xr-xindra/newview/llfloaterland.cpp211
-rwxr-xr-xindra/newview/llfloaterland.h8
-rw-r--r--indra/newview/llfloaterloadprefpreset.cpp91
-rw-r--r--indra/newview/llfloaterloadprefpreset.h53
-rwxr-xr-xindra/newview/llfloatermarketplacelistings.cpp949
-rwxr-xr-xindra/newview/llfloatermarketplacelistings.h226
-rwxr-xr-xindra/newview/llfloatermodelpreview.cpp3071
-rwxr-xr-xindra/newview/llfloatermodelpreview.h132
-rw-r--r--indra/newview/llfloaternotificationstabbed.cpp575
-rw-r--r--indra/newview/llfloaternotificationstabbed.h174
-rwxr-xr-xindra/newview/llfloateroutbox.cpp14
-rwxr-xr-xindra/newview/llfloateroutbox.h4
-rwxr-xr-xindra/newview/llfloaterperms.cpp86
-rwxr-xr-xindra/newview/llfloaterperms.h33
-rwxr-xr-xindra/newview/llfloaterpreference.cpp615
-rwxr-xr-xindra/newview/llfloaterpreference.h67
-rwxr-xr-xindra/newview/llfloaterregioninfo.cpp371
-rwxr-xr-xindra/newview/llfloaterregioninfo.h34
-rwxr-xr-xindra/newview/llfloaterreporter.cpp69
-rwxr-xr-xindra/newview/llfloaterreporter.h12
-rw-r--r--indra/newview/llfloatersaveprefpreset.cpp108
-rw-r--r--indra/newview/llfloatersaveprefpreset.h57
-rwxr-xr-xindra/newview/llfloatersnapshot.cpp26
-rwxr-xr-xindra/newview/llfloatertools.cpp7
-rwxr-xr-xindra/newview/llfloatertools.h2
-rwxr-xr-xindra/newview/llfloatertos.cpp6
-rwxr-xr-xindra/newview/llfloaterworldmap.cpp6
-rwxr-xr-xindra/newview/llfolderviewmodelinventory.cpp51
-rwxr-xr-xindra/newview/llfolderviewmodelinventory.h3
-rwxr-xr-xindra/newview/llgesturemgr.cpp32
-rwxr-xr-xindra/newview/llgroupmgr.cpp91
-rwxr-xr-xindra/newview/llgroupmgr.h7
-rwxr-xr-xindra/newview/llimview.cpp10
-rwxr-xr-xindra/newview/llinspecttoast.cpp13
-rwxr-xr-xindra/newview/llinventorybridge.cpp1631
-rwxr-xr-xindra/newview/llinventorybridge.h69
-rwxr-xr-xindra/newview/llinventoryfilter.cpp129
-rwxr-xr-xindra/newview/llinventoryfilter.h19
-rwxr-xr-xindra/newview/llinventoryfunctions.cpp1557
-rwxr-xr-xindra/newview/llinventoryfunctions.h39
-rwxr-xr-xindra/newview/llinventoryicon.cpp2
-rwxr-xr-xindra/newview/llinventorymodel.cpp46
-rwxr-xr-xindra/newview/llinventorypanel.cpp72
-rwxr-xr-xindra/newview/llinventorypanel.h13
-rwxr-xr-xindra/newview/lllocalbitmaps.cpp18
-rwxr-xr-xindra/newview/lllogchat.cpp16
-rwxr-xr-xindra/newview/lllogchat.h1
-rwxr-xr-xindra/newview/llmanipscale.cpp16
-rwxr-xr-xindra/newview/llmaniptranslate.cpp8
-rwxr-xr-xindra/newview/llmarketplacefunctions.cpp1569
-rwxr-xr-xindra/newview/llmarketplacefunctions.h177
-rwxr-xr-xindra/newview/llmediactrl.cpp23
-rwxr-xr-xindra/newview/llmediactrl.h3
-rwxr-xr-xindra/newview/llmeshrepository.cpp422
-rwxr-xr-xindra/newview/llmeshrepository.h50
-rwxr-xr-xindra/newview/llmoveview.cpp10
-rwxr-xr-xindra/newview/llmutelist.cpp19
-rwxr-xr-xindra/newview/llmutelist.h5
-rwxr-xr-xindra/newview/llnamelistctrl.cpp24
-rwxr-xr-xindra/newview/llnamelistctrl.h22
-rwxr-xr-xindra/newview/llnetmap.cpp6
-rwxr-xr-xindra/newview/llnotificationhandler.h2
-rw-r--r--indra/newview/llnotificationlistitem.cpp645
-rw-r--r--indra/newview/llnotificationlistitem.h250
-rw-r--r--indra/newview/llnotificationlistview.cpp44
-rw-r--r--indra/newview/llnotificationlistview.h49
-rwxr-xr-xindra/newview/llnotificationscripthandler.cpp69
-rwxr-xr-xindra/newview/llnotificationtiphandler.cpp16
-rwxr-xr-xindra/newview/llpaneleditwearable.cpp47
-rw-r--r--indra/newview/llpanelexperiencelisteditor.cpp264
-rw-r--r--indra/newview/llpanelexperiencelisteditor.h101
-rw-r--r--indra/newview/llpanelexperiencelog.cpp264
-rw-r--r--indra/newview/llpanelexperiencelog.h64
-rw-r--r--indra/newview/llpanelexperiencepicker.cpp483
-rw-r--r--indra/newview/llpanelexperiencepicker.h95
-rw-r--r--indra/newview/llpanelexperiences.cpp218
-rw-r--r--indra/newview/llpanelexperiences.h97
-rwxr-xr-xindra/newview/llpanelface.h2
-rwxr-xr-xindra/newview/llpanelgroup.cpp14
-rw-r--r--indra/newview/llpanelgroupbulk.cpp1
-rw-r--r--indra/newview/llpanelgroupexperiences.cpp143
-rw-r--r--indra/newview/llpanelgroupexperiences.h53
-rwxr-xr-xindra/newview/llpanelgroupgeneral.cpp5
-rwxr-xr-xindra/newview/llpanelgroupinvite.cpp92
-rwxr-xr-xindra/newview/llpanelgrouproles.cpp136
-rwxr-xr-xindra/newview/llpanelgrouproles.h3
-rwxr-xr-xindra/newview/llpanellandmarkinfo.cpp11
-rwxr-xr-xindra/newview/llpanellogin.cpp1
-rwxr-xr-xindra/newview/llpanelmaininventory.cpp10
-rwxr-xr-xindra/newview/llpanelmarketplaceinboxinventory.cpp3
-rwxr-xr-xindra/newview/llpanelmarketplaceinboxinventory.h2
-rwxr-xr-xindra/newview/llpanelmediasettingsgeneral.cpp4
-rwxr-xr-xindra/newview/llpanelnearbymedia.cpp6
-rwxr-xr-xindra/newview/llpanelobject.cpp11
-rwxr-xr-xindra/newview/llpanelobjectinventory.cpp12
-rwxr-xr-xindra/newview/llpanelpeople.cpp18
-rwxr-xr-xindra/newview/llpanelpeople.h1
-rwxr-xr-xindra/newview/llpanelpicks.cpp2
-rwxr-xr-xindra/newview/llpanelplaceprofile.cpp30
-rwxr-xr-xindra/newview/llpanelplaceprofile.h1
-rwxr-xr-xindra/newview/llpanelplaces.cpp16
-rw-r--r--indra/newview/llpanelpresetspulldown.cpp206
-rw-r--r--indra/newview/llpanelpresetspulldown.h60
-rwxr-xr-xindra/newview/llpanelprofile.cpp2
-rwxr-xr-xindra/newview/llpanelsnapshotinventory.cpp11
-rwxr-xr-xindra/newview/llpanelsnapshotlocal.cpp8
-rw-r--r--[-rwxr-xr-x]indra/newview/llpanelsnapshotpostcard.cpp0
-rwxr-xr-xindra/newview/llpanelvolumepulldown.cpp4
-rw-r--r--indra/newview/llpresetsmanager.cpp305
-rw-r--r--indra/newview/llpresetsmanager.h79
-rwxr-xr-xindra/newview/llpreview.cpp20
-rwxr-xr-xindra/newview/llpreview.h6
-rwxr-xr-xindra/newview/llpreviewnotecard.cpp7
-rwxr-xr-xindra/newview/llpreviewscript.cpp363
-rwxr-xr-xindra/newview/llpreviewscript.h39
-rwxr-xr-xindra/newview/llpreviewtexture.cpp1
-rw-r--r--indra/newview/llscenemonitor.cpp16
-rw-r--r--indra/newview/llscenemonitor.h8
-rwxr-xr-xindra/newview/llscreenchannel.cpp14
-rwxr-xr-xindra/newview/llselectmgr.cpp118
-rwxr-xr-xindra/newview/llselectmgr.h6
-rwxr-xr-xindra/newview/llsidepanelappearance.cpp3
-rwxr-xr-xindra/newview/llsidepaneliteminfo.cpp35
-rwxr-xr-xindra/newview/llsidepaneliteminfo.h2
-rwxr-xr-xindra/newview/llsidepaneltaskinfo.cpp24
-rwxr-xr-xindra/newview/llslurl.cpp7
-rw-r--r--indra/newview/llsnapshotlivepreview.cpp109
-rw-r--r--indra/newview/llsnapshotlivepreview.h2
-rwxr-xr-xindra/newview/llspatialpartition.cpp5
-rwxr-xr-xindra/newview/llspeakers.cpp17
-rwxr-xr-xindra/newview/llstartup.cpp67
-rwxr-xr-xindra/newview/llstartup.h1
-rwxr-xr-xindra/newview/llstatusbar.cpp36
-rwxr-xr-xindra/newview/llstatusbar.h5
-rwxr-xr-xindra/newview/llsyswellwindow.cpp152
-rwxr-xr-xindra/newview/llsyswellwindow.h51
-rwxr-xr-xindra/newview/lltexturecache.cpp9
-rwxr-xr-xindra/newview/lltexturectrl.cpp15
-rwxr-xr-xindra/newview/lltoastalertpanel.cpp45
-rwxr-xr-xindra/newview/lltoastgroupnotifypanel.cpp2
-rwxr-xr-xindra/newview/lltoastnotifypanel.cpp2
-rwxr-xr-xindra/newview/lltooldraganddrop.cpp30
-rwxr-xr-xindra/newview/lltooldraganddrop.h1
-rwxr-xr-xindra/newview/lltoolgrab.h2
-rwxr-xr-xindra/newview/lltoolmgr.cpp20
-rwxr-xr-xindra/newview/lltoolmgr.h2
-rwxr-xr-xindra/newview/lltoolpie.cpp1
-rwxr-xr-xindra/newview/llurllineeditorctrl.cpp2
-rwxr-xr-xindra/newview/llversioninfo.cpp41
-rwxr-xr-xindra/newview/llversioninfo.h9
-rwxr-xr-xindra/newview/llviewercontrol.cpp20
-rwxr-xr-xindra/newview/llviewerfloaterreg.cpp28
-rw-r--r--indra/newview/llviewerfoldertype.cpp6
-rwxr-xr-xindra/newview/llviewerinventory.cpp34
-rwxr-xr-xindra/newview/llviewerinventory.h3
-rwxr-xr-xindra/newview/llviewermedia.cpp2
-rwxr-xr-xindra/newview/llviewermedia.h1
-rwxr-xr-xindra/newview/llviewermenu.cpp114
-rwxr-xr-xindra/newview/llviewermenu.h1
-rwxr-xr-xindra/newview/llviewermessage.cpp405
-rwxr-xr-xindra/newview/llviewernetwork.cpp4
-rwxr-xr-xindra/newview/llviewerobject.cpp54
-rwxr-xr-xindra/newview/llviewerobject.h3
-rwxr-xr-xindra/newview/llviewerobjectlist.cpp12
-rwxr-xr-xindra/newview/llviewerparcelmgr.cpp203
-rwxr-xr-xindra/newview/llviewerparcelmgr.h4
-rwxr-xr-xindra/newview/llviewerregion.cpp18
-rwxr-xr-xindra/newview/llviewerregion.h4
-rwxr-xr-xindra/newview/llviewerstats.cpp5
-rwxr-xr-xindra/newview/llviewerwindow.cpp62
-rwxr-xr-xindra/newview/llvoavatar.cpp619
-rwxr-xr-xindra/newview/llvoavatar.h61
-rwxr-xr-xindra/newview/llvoavatarself.cpp75
-rwxr-xr-xindra/newview/llvoavatarself.h10
-rwxr-xr-xindra/newview/llvovolume.cpp194
-rwxr-xr-xindra/newview/llvovolume.h6
-rwxr-xr-xindra/newview/llwearableitemslist.cpp67
-rwxr-xr-xindra/newview/llwearableitemslist.h1
-rwxr-xr-xindra/newview/llworldmap.cpp1
-rwxr-xr-xindra/newview/pipeline.cpp37
-rwxr-xr-xindra/newview/pipeline.h2
-rw-r--r--indra/newview/roles_constants.h3
-rwxr-xr-xindra/newview/skins/default/colors.xml7
-rw-r--r--indra/newview/skins/default/textures/icons/Icon_Attachment_Large.pngbin0 -> 4182 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Icon_Attachment_Small.pngbin0 -> 3774 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Icon_Notification_Condense.pngbin0 -> 262 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Icon_Notification_Expand.pngbin0 -> 239 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_StockFolderClosed.pngbin0 -> 1143 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_StockFolderOpen.pngbin0 -> 1319 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_VersionFolderClosed.pngbin0 -> 1132 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_VersionFolderOpen.pngbin0 -> 1521 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Presets_Icon.pngbin0 -> 366 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/System_Notification_Large.pngbin0 -> 1804 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/System_Notification_Small.pngbin0 -> 661 bytes
-rwxr-xr-xindra/newview/skins/default/textures/textures.xml14
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/mktlistings.pngbin0 -> 579 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Marketplace_Dropzone_Background.pngbin0 -> 459 bytes
-rwxr-xr-xindra/newview/skins/default/xui/da/menu_viewer.xml2
-rwxr-xr-xindra/newview/skins/default/xui/da/notifications.xml3
-rwxr-xr-xindra/newview/skins/default/xui/de/floater_about.xml69
-rwxr-xr-xindra/newview/skins/default/xui/de/floater_about_land.xml26
-rw-r--r--indra/newview/skins/default/xui/de/floater_associate_listing.xml7
-rw-r--r--indra/newview/skins/default/xui/de/floater_edit_hover_height.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_experience_search.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_experienceprofile.xml85
-rw-r--r--indra/newview/skins/default/xui/de/floater_experiences.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_facebook.xml29
-rwxr-xr-xindra/newview/skins/default/xui/de/floater_inventory_item_properties.xml69
-rwxr-xr-xindra/newview/skins/default/xui/de/floater_inventory_view_finder.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_item_properties.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_lagmeter.xml24
-rwxr-xr-xindra/newview/skins/default/xui/de/floater_live_lsleditor.xml17
-rw-r--r--indra/newview/skins/default/xui/de/floater_marketplace_listings.xml10
-rw-r--r--indra/newview/skins/default/xui/de/floater_marketplace_validation.xml5
-rwxr-xr-xindra/newview/skins/default/xui/de/floater_openobject.xml9
-rwxr-xr-xindra/newview/skins/default/xui/de/floater_pay.xml37
-rwxr-xr-xindra/newview/skins/default/xui/de/floater_pay_object.xml42
-rwxr-xr-xindra/newview/skins/default/xui/de/floater_report_abuse.xml2
-rwxr-xr-xindra/newview/skins/default/xui/de/floater_snapshot.xml14
-rwxr-xr-xindra/newview/skins/default/xui/de/floater_top_objects.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_twitter.xml24
-rwxr-xr-xindra/newview/skins/default/xui/de/menu_attachment_self.xml1
-rwxr-xr-xindra/newview/skins/default/xui/de/menu_avatar_self.xml1
-rwxr-xr-xindra/newview/skins/default/xui/de/menu_inventory.xml12
-rwxr-xr-xindra/newview/skins/default/xui/de/menu_inventory_gear_default.xml2
-rw-r--r--indra/newview/skins/default/xui/de/menu_marketplace_view.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_url_experience.xml4
-rwxr-xr-xindra/newview/skins/default/xui/de/menu_viewer.xml11
-rwxr-xr-xindra/newview/skins/default/xui/de/mime_types.xml13
-rwxr-xr-xindra/newview/skins/default/xui/de/mime_types_linux.xml8
-rwxr-xr-xindra/newview/skins/default/xui/de/mime_types_mac.xml8
-rwxr-xr-xindra/newview/skins/default/xui/de/notifications.xml210
-rw-r--r--indra/newview/skins/default/xui/de/panel_experience_info.xml46
-rw-r--r--indra/newview/skins/default/xui/de/panel_experience_list_editor.xml27
-rw-r--r--indra/newview/skins/default/xui/de/panel_experience_list_item.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_experience_log.xml24
-rw-r--r--indra/newview/skins/default/xui/de/panel_experience_search.xml41
-rw-r--r--indra/newview/skins/default/xui/de/panel_experiences.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_facebook_friends.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_facebook_photo.xml40
-rw-r--r--indra/newview/skins/default/xui/de/panel_facebook_place.xml20
-rw-r--r--indra/newview/skins/default/xui/de/panel_facebook_status.xml28
-rw-r--r--indra/newview/skins/default/xui/de/panel_flickr_photo.xml68
-rwxr-xr-xindra/newview/skins/default/xui/de/panel_group_info_sidetray.xml1
-rwxr-xr-xindra/newview/skins/default/xui/de/panel_login.xml19
-rw-r--r--indra/newview/skins/default/xui/de/panel_marketplace_listings.xml11
-rw-r--r--indra/newview/skins/default/xui/de/panel_marketplace_listings_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_marketplace_listings_listed.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_marketplace_listings_unassociated.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_marketplace_listings_unlisted.xml2
-rwxr-xr-xindra/newview/skins/default/xui/de/panel_postcard_settings.xml2
-rwxr-xr-xindra/newview/skins/default/xui/de/panel_preferences_setup.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_experiences.xml33
-rw-r--r--indra/newview/skins/default/xui/de/panel_script_experience.xml13
-rwxr-xr-xindra/newview/skins/default/xui/de/panel_snapshot_inventory.xml8
-rwxr-xr-xindra/newview/skins/default/xui/de/panel_snapshot_local.xml10
-rwxr-xr-xindra/newview/skins/default/xui/de/panel_snapshot_options.xml18
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml8
-rwxr-xr-xindra/newview/skins/default/xui/de/panel_snapshot_profile.xml10
-rwxr-xr-xindra/newview/skins/default/xui/de/panel_status_bar.xml26
-rw-r--r--indra/newview/skins/default/xui/de/panel_twitter_photo.xml50
-rwxr-xr-xindra/newview/skins/default/xui/de/role_actions.xml4
-rwxr-xr-xindra/newview/skins/default/xui/de/sidepanel_item_info.xml11
-rwxr-xr-xindra/newview/skins/default/xui/de/sidepanel_task_info.xml124
-rwxr-xr-xindra/newview/skins/default/xui/de/strings.xml253
-rwxr-xr-xindra/newview/skins/default/xui/de/teleport_strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_about.xml8
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_about_land.xml22
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_associate_listing.xml53
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_bumps.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_delete_pref_preset.xml49
-rw-r--r--indra/newview/skins/default/xui/en/floater_experience_search.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_experienceprofile.xml688
-rw-r--r--indra/newview/skins/default/xui/en/floater_experiences.xml28
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_hardware_settings.xml198
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_item_properties.xml23
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_live_lsleditor.xml175
-rw-r--r--indra/newview/skins/default/xui/en/floater_load_pref_preset.xml49
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_marketplace_listings.xml113
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_marketplace_validation.xml46
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_model_preview.xml38
-rw-r--r--indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml154
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_preferences.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml935
-rw-r--r--indra/newview/skins/default/xui/en/floater_save_pref_preset.xml51
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_sys_well.xml4
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_attachment_other.xml12
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_avatar_other.xml12
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_inventory.xml103
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_login.xml6
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_marketplace_view.xml48
-rw-r--r--indra/newview/skins/default/xui/en/menu_url_email.xml21
-rw-r--r--indra/newview/skins/default/xui/en/menu_url_experience.xml12
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_viewer.xml54
-rwxr-xr-xindra/newview/skins/default/xui/en/notifications.xml649
-rw-r--r--indra/newview/skins/default/xui/en/panel_experience_info.xml377
-rw-r--r--indra/newview/skins/default/xui/en/panel_experience_list_editor.xml83
-rw-r--r--indra/newview/skins/default/xui/en/panel_experience_list_item.xml21
-rw-r--r--indra/newview/skins/default/xui/en/panel_experience_log.xml152
-rw-r--r--indra/newview/skins/default/xui/en/panel_experience_search.xml182
-rw-r--r--indra/newview/skins/default/xui/en/panel_experiences.xml65
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_group_info_sidetray.xml16
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_main_inventory.xml2
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_marketplace_listings.xml117
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_marketplace_listings_inventory.xml25
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_marketplace_listings_listed.xml24
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_marketplace_listings_unassociated.xml23
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_marketplace_listings_unlisted.xml24
-rw-r--r--indra/newview/skins/default/xui/en/panel_notification_list_item.xml144
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_outbox_inventory.xml3
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_people.xml2
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_preferences_advanced.xml2
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_preferences_general.xml14
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_preferences_graphics1.xml1188
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_preferences_setup.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_presets_pulldown.xml69
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_experiences.xml136
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_script_ed.xml376
-rw-r--r--indra/newview/skins/default/xui/en/panel_script_experience.xml97
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_snapshot_inventory.xml4
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml0
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_status_bar.xml10
-rwxr-xr-xindra/newview/skins/default/xui/en/role_actions.xml12
-rwxr-xr-xindra/newview/skins/default/xui/en/sidepanel_item_info.xml898
-rwxr-xr-xindra/newview/skins/default/xui/en/strings.xml140
-rwxr-xr-xindra/newview/skins/default/xui/en/widgets/inbox_inventory_panel.xml3
-rwxr-xr-xindra/newview/skins/default/xui/en/widgets/inventory_panel.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/notification_list_view.xml18
-rwxr-xr-xindra/newview/skins/default/xui/es/floater_about.xml75
-rwxr-xr-xindra/newview/skins/default/xui/es/floater_about_land.xml26
-rw-r--r--indra/newview/skins/default/xui/es/floater_associate_listing.xml7
-rw-r--r--indra/newview/skins/default/xui/es/floater_edit_hover_height.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_experience_search.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_experienceprofile.xml85
-rw-r--r--indra/newview/skins/default/xui/es/floater_experiences.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_facebook.xml29
-rwxr-xr-xindra/newview/skins/default/xui/es/floater_inventory_item_properties.xml69
-rwxr-xr-xindra/newview/skins/default/xui/es/floater_inventory_view_finder.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_item_properties.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_lagmeter.xml50
-rwxr-xr-xindra/newview/skins/default/xui/es/floater_live_lsleditor.xml17
-rw-r--r--indra/newview/skins/default/xui/es/floater_marketplace_listings.xml10
-rw-r--r--indra/newview/skins/default/xui/es/floater_marketplace_validation.xml5
-rwxr-xr-xindra/newview/skins/default/xui/es/floater_openobject.xml9
-rwxr-xr-xindra/newview/skins/default/xui/es/floater_pay.xml38
-rwxr-xr-xindra/newview/skins/default/xui/es/floater_pay_object.xml42
-rwxr-xr-xindra/newview/skins/default/xui/es/floater_report_abuse.xml2
-rwxr-xr-xindra/newview/skins/default/xui/es/floater_snapshot.xml17
-rwxr-xr-xindra/newview/skins/default/xui/es/floater_top_objects.xml8
-rw-r--r--indra/newview/skins/default/xui/es/floater_twitter.xml24
-rwxr-xr-xindra/newview/skins/default/xui/es/menu_attachment_self.xml1
-rwxr-xr-xindra/newview/skins/default/xui/es/menu_avatar_self.xml1
-rwxr-xr-xindra/newview/skins/default/xui/es/menu_inventory.xml12
-rwxr-xr-xindra/newview/skins/default/xui/es/menu_inventory_gear_default.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_marketplace_view.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_experience.xml4
-rwxr-xr-xindra/newview/skins/default/xui/es/menu_viewer.xml11
-rwxr-xr-xindra/newview/skins/default/xui/es/mime_types.xml2
-rwxr-xr-xindra/newview/skins/default/xui/es/mime_types_linux.xml8
-rwxr-xr-xindra/newview/skins/default/xui/es/mime_types_mac.xml8
-rwxr-xr-xindra/newview/skins/default/xui/es/notifications.xml210
-rw-r--r--indra/newview/skins/default/xui/es/panel_experience_info.xml46
-rw-r--r--indra/newview/skins/default/xui/es/panel_experience_list_editor.xml27
-rw-r--r--indra/newview/skins/default/xui/es/panel_experience_list_item.xml6
-rw-r--r--indra/newview/skins/default/xui/es/panel_experience_log.xml24
-rw-r--r--indra/newview/skins/default/xui/es/panel_experience_search.xml41
-rw-r--r--indra/newview/skins/default/xui/es/panel_experiences.xml6
-rw-r--r--indra/newview/skins/default/xui/es/panel_facebook_friends.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_facebook_photo.xml40
-rw-r--r--indra/newview/skins/default/xui/es/panel_facebook_place.xml20
-rw-r--r--indra/newview/skins/default/xui/es/panel_facebook_status.xml28
-rw-r--r--indra/newview/skins/default/xui/es/panel_flickr_photo.xml68
-rwxr-xr-xindra/newview/skins/default/xui/es/panel_group_info_sidetray.xml1
-rwxr-xr-xindra/newview/skins/default/xui/es/panel_login.xml19
-rw-r--r--indra/newview/skins/default/xui/es/panel_marketplace_listings.xml11
-rw-r--r--indra/newview/skins/default/xui/es/panel_marketplace_listings_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_marketplace_listings_listed.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_marketplace_listings_unassociated.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_marketplace_listings_unlisted.xml2
-rwxr-xr-xindra/newview/skins/default/xui/es/panel_postcard_settings.xml16
-rwxr-xr-xindra/newview/skins/default/xui/es/panel_preferences_setup.xml6
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_experiences.xml33
-rw-r--r--indra/newview/skins/default/xui/es/panel_script_experience.xml13
-rwxr-xr-xindra/newview/skins/default/xui/es/panel_snapshot_inventory.xml6
-rwxr-xr-xindra/newview/skins/default/xui/es/panel_snapshot_local.xml31
-rwxr-xr-xindra/newview/skins/default/xui/es/panel_snapshot_options.xml20
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/es/panel_snapshot_postcard.xml10
-rwxr-xr-xindra/newview/skins/default/xui/es/panel_snapshot_profile.xml21
-rwxr-xr-xindra/newview/skins/default/xui/es/panel_status_bar.xml26
-rw-r--r--indra/newview/skins/default/xui/es/panel_twitter_photo.xml50
-rwxr-xr-xindra/newview/skins/default/xui/es/role_actions.xml4
-rwxr-xr-xindra/newview/skins/default/xui/es/sidepanel_item_info.xml9
-rwxr-xr-xindra/newview/skins/default/xui/es/sidepanel_task_info.xml124
-rwxr-xr-xindra/newview/skins/default/xui/es/strings.xml253
-rwxr-xr-xindra/newview/skins/default/xui/es/teleport_strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/fr/floater_about.xml69
-rwxr-xr-xindra/newview/skins/default/xui/fr/floater_about_land.xml26
-rw-r--r--indra/newview/skins/default/xui/fr/floater_associate_listing.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/floater_edit_hover_height.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_experience_search.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_experienceprofile.xml85
-rw-r--r--indra/newview/skins/default/xui/fr/floater_experiences.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_facebook.xml29
-rwxr-xr-xindra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml67
-rwxr-xr-xindra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_item_properties.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_lagmeter.xml38
-rwxr-xr-xindra/newview/skins/default/xui/fr/floater_live_lsleditor.xml17
-rw-r--r--indra/newview/skins/default/xui/fr/floater_marketplace_listings.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/floater_marketplace_validation.xml5
-rwxr-xr-xindra/newview/skins/default/xui/fr/floater_openobject.xml9
-rwxr-xr-xindra/newview/skins/default/xui/fr/floater_pay.xml38
-rwxr-xr-xindra/newview/skins/default/xui/fr/floater_pay_object.xml43
-rwxr-xr-xindra/newview/skins/default/xui/fr/floater_report_abuse.xml2
-rwxr-xr-xindra/newview/skins/default/xui/fr/floater_snapshot.xml17
-rwxr-xr-xindra/newview/skins/default/xui/fr/floater_top_objects.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_twitter.xml24
-rwxr-xr-xindra/newview/skins/default/xui/fr/menu_attachment_self.xml1
-rwxr-xr-xindra/newview/skins/default/xui/fr/menu_avatar_self.xml1
-rwxr-xr-xindra/newview/skins/default/xui/fr/menu_inventory.xml12
-rwxr-xr-xindra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_marketplace_view.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_url_experience.xml4
-rwxr-xr-xindra/newview/skins/default/xui/fr/menu_viewer.xml11
-rwxr-xr-xindra/newview/skins/default/xui/fr/mime_types_linux.xml8
-rwxr-xr-xindra/newview/skins/default/xui/fr/mime_types_mac.xml8
-rwxr-xr-xindra/newview/skins/default/xui/fr/notifications.xml210
-rw-r--r--indra/newview/skins/default/xui/fr/panel_experience_info.xml46
-rw-r--r--indra/newview/skins/default/xui/fr/panel_experience_list_editor.xml27
-rw-r--r--indra/newview/skins/default/xui/fr/panel_experience_list_item.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_experience_log.xml24
-rw-r--r--indra/newview/skins/default/xui/fr/panel_experience_search.xml41
-rw-r--r--indra/newview/skins/default/xui/fr/panel_experiences.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_facebook_friends.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_facebook_photo.xml40
-rw-r--r--indra/newview/skins/default/xui/fr/panel_facebook_place.xml20
-rw-r--r--indra/newview/skins/default/xui/fr/panel_facebook_status.xml28
-rw-r--r--indra/newview/skins/default/xui/fr/panel_flickr_photo.xml68
-rwxr-xr-xindra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml1
-rwxr-xr-xindra/newview/skins/default/xui/fr/panel_login.xml21
-rw-r--r--indra/newview/skins/default/xui/fr/panel_marketplace_listings.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/panel_marketplace_listings_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_marketplace_listings_listed.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_marketplace_listings_unassociated.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_marketplace_listings_unlisted.xml2
-rwxr-xr-xindra/newview/skins/default/xui/fr/panel_postcard_settings.xml16
-rwxr-xr-xindra/newview/skins/default/xui/fr/panel_preferences_setup.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_experiences.xml33
-rw-r--r--indra/newview/skins/default/xui/fr/panel_script_experience.xml13
-rwxr-xr-xindra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml6
-rwxr-xr-xindra/newview/skins/default/xui/fr/panel_snapshot_local.xml31
-rwxr-xr-xindra/newview/skins/default/xui/fr/panel_snapshot_options.xml18
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml8
-rwxr-xr-xindra/newview/skins/default/xui/fr/panel_snapshot_profile.xml21
-rwxr-xr-xindra/newview/skins/default/xui/fr/panel_status_bar.xml26
-rw-r--r--indra/newview/skins/default/xui/fr/panel_twitter_photo.xml50
-rwxr-xr-xindra/newview/skins/default/xui/fr/role_actions.xml4
-rwxr-xr-xindra/newview/skins/default/xui/fr/sidepanel_item_info.xml9
-rwxr-xr-xindra/newview/skins/default/xui/fr/sidepanel_task_info.xml124
-rwxr-xr-xindra/newview/skins/default/xui/fr/strings.xml253
-rwxr-xr-xindra/newview/skins/default/xui/fr/teleport_strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/it/floater_about.xml75
-rwxr-xr-xindra/newview/skins/default/xui/it/floater_about_land.xml26
-rw-r--r--indra/newview/skins/default/xui/it/floater_associate_listing.xml7
-rw-r--r--indra/newview/skins/default/xui/it/floater_edit_hover_height.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_experience_search.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_experienceprofile.xml85
-rw-r--r--indra/newview/skins/default/xui/it/floater_experiences.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_facebook.xml29
-rwxr-xr-xindra/newview/skins/default/xui/it/floater_inventory_item_properties.xml67
-rwxr-xr-xindra/newview/skins/default/xui/it/floater_inventory_view_finder.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_item_properties.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_lagmeter.xml52
-rwxr-xr-xindra/newview/skins/default/xui/it/floater_live_lsleditor.xml17
-rw-r--r--indra/newview/skins/default/xui/it/floater_marketplace_listings.xml10
-rw-r--r--indra/newview/skins/default/xui/it/floater_marketplace_validation.xml5
-rwxr-xr-xindra/newview/skins/default/xui/it/floater_openobject.xml9
-rwxr-xr-xindra/newview/skins/default/xui/it/floater_pay.xml38
-rwxr-xr-xindra/newview/skins/default/xui/it/floater_pay_object.xml43
-rwxr-xr-xindra/newview/skins/default/xui/it/floater_report_abuse.xml2
-rwxr-xr-xindra/newview/skins/default/xui/it/floater_snapshot.xml17
-rwxr-xr-xindra/newview/skins/default/xui/it/floater_stats.xml2
-rwxr-xr-xindra/newview/skins/default/xui/it/floater_top_objects.xml8
-rw-r--r--indra/newview/skins/default/xui/it/floater_twitter.xml24
-rwxr-xr-xindra/newview/skins/default/xui/it/menu_attachment_self.xml1
-rwxr-xr-xindra/newview/skins/default/xui/it/menu_avatar_self.xml1
-rwxr-xr-xindra/newview/skins/default/xui/it/menu_inventory.xml12
-rwxr-xr-xindra/newview/skins/default/xui/it/menu_inventory_gear_default.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_marketplace_view.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_experience.xml4
-rwxr-xr-xindra/newview/skins/default/xui/it/menu_viewer.xml11
-rwxr-xr-xindra/newview/skins/default/xui/it/mime_types.xml4
-rwxr-xr-xindra/newview/skins/default/xui/it/mime_types_linux.xml8
-rwxr-xr-xindra/newview/skins/default/xui/it/mime_types_mac.xml8
-rwxr-xr-xindra/newview/skins/default/xui/it/notifications.xml210
-rw-r--r--indra/newview/skins/default/xui/it/panel_experience_info.xml46
-rw-r--r--indra/newview/skins/default/xui/it/panel_experience_list_editor.xml27
-rw-r--r--indra/newview/skins/default/xui/it/panel_experience_list_item.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_experience_log.xml24
-rw-r--r--indra/newview/skins/default/xui/it/panel_experience_search.xml41
-rw-r--r--indra/newview/skins/default/xui/it/panel_experiences.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_facebook_friends.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_facebook_photo.xml40
-rw-r--r--indra/newview/skins/default/xui/it/panel_facebook_place.xml20
-rw-r--r--indra/newview/skins/default/xui/it/panel_facebook_status.xml28
-rw-r--r--indra/newview/skins/default/xui/it/panel_flickr_photo.xml68
-rwxr-xr-xindra/newview/skins/default/xui/it/panel_group_info_sidetray.xml1
-rwxr-xr-xindra/newview/skins/default/xui/it/panel_login.xml19
-rw-r--r--indra/newview/skins/default/xui/it/panel_marketplace_listings.xml11
-rw-r--r--indra/newview/skins/default/xui/it/panel_marketplace_listings_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_marketplace_listings_listed.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_marketplace_listings_unassociated.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_marketplace_listings_unlisted.xml2
-rwxr-xr-xindra/newview/skins/default/xui/it/panel_postcard_settings.xml16
-rwxr-xr-xindra/newview/skins/default/xui/it/panel_preferences_setup.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_experiences.xml33
-rw-r--r--indra/newview/skins/default/xui/it/panel_script_experience.xml13
-rwxr-xr-xindra/newview/skins/default/xui/it/panel_snapshot_inventory.xml6
-rwxr-xr-xindra/newview/skins/default/xui/it/panel_snapshot_local.xml31
-rwxr-xr-xindra/newview/skins/default/xui/it/panel_snapshot_options.xml18
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml8
-rwxr-xr-xindra/newview/skins/default/xui/it/panel_snapshot_profile.xml21
-rwxr-xr-xindra/newview/skins/default/xui/it/panel_status_bar.xml26
-rw-r--r--indra/newview/skins/default/xui/it/panel_twitter_photo.xml50
-rwxr-xr-xindra/newview/skins/default/xui/it/role_actions.xml4
-rwxr-xr-xindra/newview/skins/default/xui/it/sidepanel_item_info.xml9
-rwxr-xr-xindra/newview/skins/default/xui/it/sidepanel_task_info.xml124
-rwxr-xr-xindra/newview/skins/default/xui/it/strings.xml253
-rwxr-xr-xindra/newview/skins/default/xui/it/teleport_strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/ja/floater_about.xml69
-rwxr-xr-xindra/newview/skins/default/xui/ja/floater_about_land.xml26
-rw-r--r--indra/newview/skins/default/xui/ja/floater_associate_listing.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/floater_edit_hover_height.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_experience_search.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_experienceprofile.xml85
-rw-r--r--indra/newview/skins/default/xui/ja/floater_experiences.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_facebook.xml29
-rwxr-xr-xindra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml67
-rwxr-xr-xindra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_item_properties.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_lagmeter.xml60
-rwxr-xr-xindra/newview/skins/default/xui/ja/floater_live_lsleditor.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/floater_marketplace_listings.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_marketplace_validation.xml5
-rwxr-xr-xindra/newview/skins/default/xui/ja/floater_openobject.xml9
-rwxr-xr-xindra/newview/skins/default/xui/ja/floater_pay.xml37
-rwxr-xr-xindra/newview/skins/default/xui/ja/floater_pay_object.xml42
-rwxr-xr-xindra/newview/skins/default/xui/ja/floater_report_abuse.xml2
-rwxr-xr-xindra/newview/skins/default/xui/ja/floater_snapshot.xml17
-rwxr-xr-xindra/newview/skins/default/xui/ja/floater_top_objects.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_twitter.xml24
-rwxr-xr-xindra/newview/skins/default/xui/ja/menu_attachment_self.xml1
-rwxr-xr-xindra/newview/skins/default/xui/ja/menu_avatar_self.xml1
-rwxr-xr-xindra/newview/skins/default/xui/ja/menu_inventory.xml12
-rwxr-xr-xindra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_marketplace_view.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_experience.xml4
-rwxr-xr-xindra/newview/skins/default/xui/ja/menu_viewer.xml11
-rwxr-xr-xindra/newview/skins/default/xui/ja/mime_types.xml4
-rwxr-xr-xindra/newview/skins/default/xui/ja/mime_types_linux.xml8
-rwxr-xr-xindra/newview/skins/default/xui/ja/mime_types_mac.xml8
-rwxr-xr-xindra/newview/skins/default/xui/ja/notifications.xml210
-rw-r--r--indra/newview/skins/default/xui/ja/panel_experience_info.xml46
-rw-r--r--indra/newview/skins/default/xui/ja/panel_experience_list_editor.xml27
-rw-r--r--indra/newview/skins/default/xui/ja/panel_experience_list_item.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_experience_log.xml24
-rw-r--r--indra/newview/skins/default/xui/ja/panel_experience_search.xml41
-rw-r--r--indra/newview/skins/default/xui/ja/panel_experiences.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_facebook_friends.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_facebook_photo.xml40
-rw-r--r--indra/newview/skins/default/xui/ja/panel_facebook_place.xml20
-rw-r--r--indra/newview/skins/default/xui/ja/panel_facebook_status.xml28
-rw-r--r--indra/newview/skins/default/xui/ja/panel_flickr_photo.xml68
-rwxr-xr-xindra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml1
-rwxr-xr-xindra/newview/skins/default/xui/ja/panel_login.xml19
-rw-r--r--indra/newview/skins/default/xui/ja/panel_marketplace_listings.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/panel_marketplace_listings_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_marketplace_listings_listed.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_marketplace_listings_unassociated.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_marketplace_listings_unlisted.xml2
-rwxr-xr-xindra/newview/skins/default/xui/ja/panel_postcard_settings.xml16
-rwxr-xr-xindra/newview/skins/default/xui/ja/panel_preferences_setup.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_experiences.xml33
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_experience.xml13
-rwxr-xr-xindra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml8
-rwxr-xr-xindra/newview/skins/default/xui/ja/panel_snapshot_local.xml31
-rwxr-xr-xindra/newview/skins/default/xui/ja/panel_snapshot_options.xml20
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml10
-rwxr-xr-xindra/newview/skins/default/xui/ja/panel_snapshot_profile.xml21
-rwxr-xr-xindra/newview/skins/default/xui/ja/panel_status_bar.xml28
-rw-r--r--indra/newview/skins/default/xui/ja/panel_twitter_photo.xml50
-rwxr-xr-xindra/newview/skins/default/xui/ja/role_actions.xml4
-rwxr-xr-xindra/newview/skins/default/xui/ja/sidepanel_item_info.xml9
-rwxr-xr-xindra/newview/skins/default/xui/ja/sidepanel_task_info.xml124
-rwxr-xr-xindra/newview/skins/default/xui/ja/strings.xml253
-rwxr-xr-xindra/newview/skins/default/xui/ja/teleport_strings.xml3
-rw-r--r--indra/newview/skins/default/xui/pl/floater_associate_listing.xml7
-rwxr-xr-xindra/newview/skins/default/xui/pl/floater_font_test.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_item_properties.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_marketplace_listings.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/floater_marketplace_validation.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/menu_marketplace_view.xml5
-rwxr-xr-xindra/newview/skins/default/xui/pl/menu_viewer.xml2
-rwxr-xr-xindra/newview/skins/default/xui/pl/notifications.xml3
-rw-r--r--indra/newview/skins/default/xui/pl/panel_marketplace_listings.xml11
-rw-r--r--indra/newview/skins/default/xui/pl/panel_marketplace_listings_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_marketplace_listings_listed.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_marketplace_listings_unassociated.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_marketplace_listings_unlisted.xml2
-rwxr-xr-xindra/newview/skins/default/xui/pt/floater_about.xml68
-rwxr-xr-xindra/newview/skins/default/xui/pt/floater_about_land.xml26
-rw-r--r--indra/newview/skins/default/xui/pt/floater_associate_listing.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/floater_edit_hover_height.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_experience_search.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_experienceprofile.xml85
-rw-r--r--indra/newview/skins/default/xui/pt/floater_experiences.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_facebook.xml29
-rwxr-xr-xindra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml67
-rwxr-xr-xindra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_item_properties.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_lagmeter.xml52
-rwxr-xr-xindra/newview/skins/default/xui/pt/floater_live_lsleditor.xml17
-rw-r--r--indra/newview/skins/default/xui/pt/floater_marketplace_listings.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/floater_marketplace_validation.xml5
-rwxr-xr-xindra/newview/skins/default/xui/pt/floater_openobject.xml9
-rwxr-xr-xindra/newview/skins/default/xui/pt/floater_pay.xml37
-rwxr-xr-xindra/newview/skins/default/xui/pt/floater_pay_object.xml43
-rwxr-xr-xindra/newview/skins/default/xui/pt/floater_report_abuse.xml2
-rwxr-xr-xindra/newview/skins/default/xui/pt/floater_snapshot.xml17
-rwxr-xr-xindra/newview/skins/default/xui/pt/floater_top_objects.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/floater_twitter.xml24
-rwxr-xr-xindra/newview/skins/default/xui/pt/menu_attachment_self.xml1
-rwxr-xr-xindra/newview/skins/default/xui/pt/menu_avatar_self.xml1
-rwxr-xr-xindra/newview/skins/default/xui/pt/menu_inventory.xml12
-rwxr-xr-xindra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_marketplace_view.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_experience.xml4
-rwxr-xr-xindra/newview/skins/default/xui/pt/menu_viewer.xml13
-rwxr-xr-xindra/newview/skins/default/xui/pt/mime_types.xml6
-rwxr-xr-xindra/newview/skins/default/xui/pt/mime_types_linux.xml8
-rwxr-xr-xindra/newview/skins/default/xui/pt/mime_types_mac.xml8
-rwxr-xr-xindra/newview/skins/default/xui/pt/notifications.xml210
-rw-r--r--indra/newview/skins/default/xui/pt/panel_experience_info.xml46
-rw-r--r--indra/newview/skins/default/xui/pt/panel_experience_list_editor.xml27
-rw-r--r--indra/newview/skins/default/xui/pt/panel_experience_list_item.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/panel_experience_log.xml24
-rw-r--r--indra/newview/skins/default/xui/pt/panel_experience_search.xml41
-rw-r--r--indra/newview/skins/default/xui/pt/panel_experiences.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/panel_facebook_friends.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_facebook_photo.xml40
-rw-r--r--indra/newview/skins/default/xui/pt/panel_facebook_place.xml20
-rw-r--r--indra/newview/skins/default/xui/pt/panel_facebook_status.xml28
-rw-r--r--indra/newview/skins/default/xui/pt/panel_flickr_photo.xml68
-rwxr-xr-xindra/newview/skins/default/xui/pt/panel_group_info_sidetray.xml1
-rwxr-xr-xindra/newview/skins/default/xui/pt/panel_login.xml19
-rw-r--r--indra/newview/skins/default/xui/pt/panel_marketplace_listings.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/panel_marketplace_listings_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_marketplace_listings_listed.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_marketplace_listings_unassociated.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_marketplace_listings_unlisted.xml2
-rwxr-xr-xindra/newview/skins/default/xui/pt/panel_postcard_settings.xml16
-rwxr-xr-xindra/newview/skins/default/xui/pt/panel_preferences_setup.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_experiences.xml33
-rw-r--r--indra/newview/skins/default/xui/pt/panel_script_experience.xml13
-rwxr-xr-xindra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml6
-rwxr-xr-xindra/newview/skins/default/xui/pt/panel_snapshot_local.xml31
-rwxr-xr-xindra/newview/skins/default/xui/pt/panel_snapshot_options.xml20
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml10
-rwxr-xr-xindra/newview/skins/default/xui/pt/panel_snapshot_profile.xml21
-rwxr-xr-xindra/newview/skins/default/xui/pt/panel_status_bar.xml26
-rw-r--r--indra/newview/skins/default/xui/pt/panel_twitter_photo.xml50
-rwxr-xr-xindra/newview/skins/default/xui/pt/role_actions.xml4
-rwxr-xr-xindra/newview/skins/default/xui/pt/sidepanel_item_info.xml11
-rwxr-xr-xindra/newview/skins/default/xui/pt/sidepanel_task_info.xml124
-rwxr-xr-xindra/newview/skins/default/xui/pt/strings.xml253
-rwxr-xr-xindra/newview/skins/default/xui/pt/teleport_strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/ru/floater_about.xml65
-rwxr-xr-xindra/newview/skins/default/xui/ru/floater_about_land.xml17
-rw-r--r--indra/newview/skins/default/xui/ru/floater_associate_listing.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/floater_edit_hover_height.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/floater_experience_search.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_experienceprofile.xml85
-rw-r--r--indra/newview/skins/default/xui/ru/floater_experiences.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_facebook.xml29
-rwxr-xr-xindra/newview/skins/default/xui/ru/floater_inventory_item_properties.xml67
-rwxr-xr-xindra/newview/skins/default/xui/ru/floater_inventory_view_finder.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/floater_item_properties.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_lagmeter.xml12
-rwxr-xr-xindra/newview/skins/default/xui/ru/floater_live_lsleditor.xml17
-rw-r--r--indra/newview/skins/default/xui/ru/floater_marketplace_listings.xml10
-rw-r--r--indra/newview/skins/default/xui/ru/floater_marketplace_validation.xml5
-rwxr-xr-xindra/newview/skins/default/xui/ru/floater_openobject.xml9
-rwxr-xr-xindra/newview/skins/default/xui/ru/floater_pay.xml33
-rwxr-xr-xindra/newview/skins/default/xui/ru/floater_pay_object.xml41
-rwxr-xr-xindra/newview/skins/default/xui/ru/floater_report_abuse.xml2
-rwxr-xr-xindra/newview/skins/default/xui/ru/floater_snapshot.xml17
-rwxr-xr-xindra/newview/skins/default/xui/ru/floater_top_objects.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/floater_twitter.xml24
-rwxr-xr-xindra/newview/skins/default/xui/ru/menu_attachment_self.xml1
-rwxr-xr-xindra/newview/skins/default/xui/ru/menu_avatar_self.xml1
-rwxr-xr-xindra/newview/skins/default/xui/ru/menu_inventory.xml12
-rwxr-xr-xindra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/menu_marketplace_view.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_experience.xml4
-rwxr-xr-xindra/newview/skins/default/xui/ru/menu_viewer.xml11
-rwxr-xr-xindra/newview/skins/default/xui/ru/mime_types.xml8
-rwxr-xr-xindra/newview/skins/default/xui/ru/mime_types_linux.xml8
-rwxr-xr-xindra/newview/skins/default/xui/ru/mime_types_mac.xml8
-rwxr-xr-xindra/newview/skins/default/xui/ru/notifications.xml210
-rw-r--r--indra/newview/skins/default/xui/ru/panel_experience_info.xml46
-rw-r--r--indra/newview/skins/default/xui/ru/panel_experience_list_editor.xml27
-rw-r--r--indra/newview/skins/default/xui/ru/panel_experience_list_item.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/panel_experience_log.xml24
-rw-r--r--indra/newview/skins/default/xui/ru/panel_experience_search.xml41
-rw-r--r--indra/newview/skins/default/xui/ru/panel_experiences.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/panel_facebook_friends.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/panel_facebook_photo.xml40
-rw-r--r--indra/newview/skins/default/xui/ru/panel_facebook_place.xml20
-rw-r--r--indra/newview/skins/default/xui/ru/panel_facebook_status.xml28
-rw-r--r--indra/newview/skins/default/xui/ru/panel_flickr_photo.xml68
-rwxr-xr-xindra/newview/skins/default/xui/ru/panel_group_info_sidetray.xml1
-rwxr-xr-xindra/newview/skins/default/xui/ru/panel_login.xml19
-rw-r--r--indra/newview/skins/default/xui/ru/panel_marketplace_listings.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/panel_marketplace_listings_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/panel_marketplace_listings_listed.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/panel_marketplace_listings_unassociated.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/panel_marketplace_listings_unlisted.xml2
-rwxr-xr-xindra/newview/skins/default/xui/ru/panel_postcard_settings.xml16
-rwxr-xr-xindra/newview/skins/default/xui/ru/panel_preferences_setup.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/panel_region_experiences.xml33
-rw-r--r--indra/newview/skins/default/xui/ru/panel_script_experience.xml13
-rwxr-xr-xindra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml6
-rwxr-xr-xindra/newview/skins/default/xui/ru/panel_snapshot_local.xml31
-rwxr-xr-xindra/newview/skins/default/xui/ru/panel_snapshot_options.xml18
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml10
-rwxr-xr-xindra/newview/skins/default/xui/ru/panel_snapshot_profile.xml21
-rwxr-xr-xindra/newview/skins/default/xui/ru/panel_status_bar.xml26
-rw-r--r--indra/newview/skins/default/xui/ru/panel_twitter_photo.xml50
-rwxr-xr-xindra/newview/skins/default/xui/ru/role_actions.xml4
-rwxr-xr-xindra/newview/skins/default/xui/ru/sidepanel_item_info.xml9
-rwxr-xr-xindra/newview/skins/default/xui/ru/sidepanel_task_info.xml124
-rwxr-xr-xindra/newview/skins/default/xui/ru/strings.xml253
-rwxr-xr-xindra/newview/skins/default/xui/ru/teleport_strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/tr/floater_about.xml66
-rwxr-xr-xindra/newview/skins/default/xui/tr/floater_about_land.xml17
-rw-r--r--indra/newview/skins/default/xui/tr/floater_associate_listing.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/floater_edit_hover_height.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/floater_experience_search.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_experienceprofile.xml85
-rw-r--r--indra/newview/skins/default/xui/tr/floater_experiences.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_facebook.xml29
-rwxr-xr-xindra/newview/skins/default/xui/tr/floater_inventory_item_properties.xml67
-rwxr-xr-xindra/newview/skins/default/xui/tr/floater_inventory_view_finder.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/floater_item_properties.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_lagmeter.xml2
-rwxr-xr-xindra/newview/skins/default/xui/tr/floater_live_lsleditor.xml17
-rw-r--r--indra/newview/skins/default/xui/tr/floater_marketplace_listings.xml10
-rw-r--r--indra/newview/skins/default/xui/tr/floater_marketplace_validation.xml5
-rwxr-xr-xindra/newview/skins/default/xui/tr/floater_openobject.xml9
-rwxr-xr-xindra/newview/skins/default/xui/tr/floater_pay.xml33
-rwxr-xr-xindra/newview/skins/default/xui/tr/floater_pay_object.xml41
-rwxr-xr-xindra/newview/skins/default/xui/tr/floater_report_abuse.xml2
-rwxr-xr-xindra/newview/skins/default/xui/tr/floater_snapshot.xml17
-rwxr-xr-xindra/newview/skins/default/xui/tr/floater_top_objects.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/floater_twitter.xml24
-rwxr-xr-xindra/newview/skins/default/xui/tr/menu_attachment_self.xml1
-rwxr-xr-xindra/newview/skins/default/xui/tr/menu_avatar_self.xml1
-rwxr-xr-xindra/newview/skins/default/xui/tr/menu_inventory.xml12
-rwxr-xr-xindra/newview/skins/default/xui/tr/menu_inventory_gear_default.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/menu_marketplace_view.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_experience.xml4
-rwxr-xr-xindra/newview/skins/default/xui/tr/menu_viewer.xml11
-rwxr-xr-xindra/newview/skins/default/xui/tr/mime_types.xml8
-rwxr-xr-xindra/newview/skins/default/xui/tr/mime_types_linux.xml8
-rwxr-xr-xindra/newview/skins/default/xui/tr/mime_types_mac.xml8
-rwxr-xr-xindra/newview/skins/default/xui/tr/notifications.xml210
-rw-r--r--indra/newview/skins/default/xui/tr/panel_experience_info.xml46
-rw-r--r--indra/newview/skins/default/xui/tr/panel_experience_list_editor.xml27
-rw-r--r--indra/newview/skins/default/xui/tr/panel_experience_list_item.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/panel_experience_log.xml24
-rw-r--r--indra/newview/skins/default/xui/tr/panel_experience_search.xml41
-rw-r--r--indra/newview/skins/default/xui/tr/panel_experiences.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/panel_facebook_friends.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/panel_facebook_photo.xml40
-rw-r--r--indra/newview/skins/default/xui/tr/panel_facebook_place.xml20
-rw-r--r--indra/newview/skins/default/xui/tr/panel_facebook_status.xml28
-rw-r--r--indra/newview/skins/default/xui/tr/panel_flickr_photo.xml68
-rwxr-xr-xindra/newview/skins/default/xui/tr/panel_group_info_sidetray.xml1
-rwxr-xr-xindra/newview/skins/default/xui/tr/panel_login.xml19
-rw-r--r--indra/newview/skins/default/xui/tr/panel_marketplace_listings.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/panel_marketplace_listings_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/panel_marketplace_listings_listed.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/panel_marketplace_listings_unassociated.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/panel_marketplace_listings_unlisted.xml2
-rwxr-xr-xindra/newview/skins/default/xui/tr/panel_postcard_settings.xml16
-rwxr-xr-xindra/newview/skins/default/xui/tr/panel_preferences_setup.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/panel_region_experiences.xml33
-rw-r--r--indra/newview/skins/default/xui/tr/panel_script_experience.xml13
-rwxr-xr-xindra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml6
-rwxr-xr-xindra/newview/skins/default/xui/tr/panel_snapshot_local.xml31
-rwxr-xr-xindra/newview/skins/default/xui/tr/panel_snapshot_options.xml20
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml8
-rwxr-xr-xindra/newview/skins/default/xui/tr/panel_snapshot_profile.xml21
-rwxr-xr-xindra/newview/skins/default/xui/tr/panel_status_bar.xml26
-rw-r--r--indra/newview/skins/default/xui/tr/panel_twitter_photo.xml50
-rwxr-xr-xindra/newview/skins/default/xui/tr/role_actions.xml4
-rwxr-xr-xindra/newview/skins/default/xui/tr/sidepanel_item_info.xml9
-rwxr-xr-xindra/newview/skins/default/xui/tr/sidepanel_task_info.xml124
-rwxr-xr-xindra/newview/skins/default/xui/tr/strings.xml253
-rwxr-xr-xindra/newview/skins/default/xui/tr/teleport_strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/zh/floater_about.xml66
-rwxr-xr-xindra/newview/skins/default/xui/zh/floater_about_land.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/floater_associate_listing.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/floater_edit_hover_height.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/floater_experience_search.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_experienceprofile.xml85
-rw-r--r--indra/newview/skins/default/xui/zh/floater_experiences.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_facebook.xml29
-rwxr-xr-xindra/newview/skins/default/xui/zh/floater_inventory_item_properties.xml69
-rwxr-xr-xindra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/floater_item_properties.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_lagmeter.xml28
-rwxr-xr-xindra/newview/skins/default/xui/zh/floater_live_lsleditor.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/floater_marketplace_listings.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/floater_marketplace_validation.xml5
-rwxr-xr-xindra/newview/skins/default/xui/zh/floater_openobject.xml9
-rwxr-xr-xindra/newview/skins/default/xui/zh/floater_pay.xml33
-rwxr-xr-xindra/newview/skins/default/xui/zh/floater_pay_object.xml41
-rwxr-xr-xindra/newview/skins/default/xui/zh/floater_report_abuse.xml2
-rwxr-xr-xindra/newview/skins/default/xui/zh/floater_snapshot.xml17
-rwxr-xr-xindra/newview/skins/default/xui/zh/floater_top_objects.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/floater_twitter.xml24
-rwxr-xr-xindra/newview/skins/default/xui/zh/menu_attachment_self.xml1
-rwxr-xr-xindra/newview/skins/default/xui/zh/menu_avatar_self.xml1
-rwxr-xr-xindra/newview/skins/default/xui/zh/menu_inventory.xml12
-rwxr-xr-xindra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/menu_marketplace_view.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_experience.xml4
-rwxr-xr-xindra/newview/skins/default/xui/zh/menu_viewer.xml11
-rwxr-xr-xindra/newview/skins/default/xui/zh/mime_types.xml8
-rwxr-xr-xindra/newview/skins/default/xui/zh/mime_types_linux.xml8
-rwxr-xr-xindra/newview/skins/default/xui/zh/mime_types_mac.xml8
-rwxr-xr-xindra/newview/skins/default/xui/zh/notifications.xml210
-rw-r--r--indra/newview/skins/default/xui/zh/panel_experience_info.xml46
-rw-r--r--indra/newview/skins/default/xui/zh/panel_experience_list_editor.xml27
-rw-r--r--indra/newview/skins/default/xui/zh/panel_experience_list_item.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_experience_log.xml24
-rw-r--r--indra/newview/skins/default/xui/zh/panel_experience_search.xml41
-rw-r--r--indra/newview/skins/default/xui/zh/panel_experiences.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_facebook_photo.xml40
-rw-r--r--indra/newview/skins/default/xui/zh/panel_facebook_place.xml20
-rw-r--r--indra/newview/skins/default/xui/zh/panel_facebook_status.xml28
-rw-r--r--indra/newview/skins/default/xui/zh/panel_flickr_photo.xml68
-rwxr-xr-xindra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml1
-rwxr-xr-xindra/newview/skins/default/xui/zh/panel_login.xml19
-rw-r--r--indra/newview/skins/default/xui/zh/panel_marketplace_listings.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/panel_marketplace_listings_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_marketplace_listings_listed.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_marketplace_listings_unassociated.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_marketplace_listings_unlisted.xml2
-rwxr-xr-xindra/newview/skins/default/xui/zh/panel_postcard_settings.xml16
-rwxr-xr-xindra/newview/skins/default/xui/zh/panel_preferences_setup.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_experiences.xml33
-rw-r--r--indra/newview/skins/default/xui/zh/panel_script_experience.xml13
-rwxr-xr-xindra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml6
-rwxr-xr-xindra/newview/skins/default/xui/zh/panel_snapshot_local.xml31
-rwxr-xr-xindra/newview/skins/default/xui/zh/panel_snapshot_options.xml20
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/zh/panel_snapshot_postcard.xml8
-rwxr-xr-xindra/newview/skins/default/xui/zh/panel_snapshot_profile.xml21
-rwxr-xr-xindra/newview/skins/default/xui/zh/panel_status_bar.xml26
-rw-r--r--indra/newview/skins/default/xui/zh/panel_twitter_photo.xml50
-rwxr-xr-xindra/newview/skins/default/xui/zh/role_actions.xml4
-rwxr-xr-xindra/newview/skins/default/xui/zh/sidepanel_item_info.xml17
-rwxr-xr-xindra/newview/skins/default/xui/zh/sidepanel_task_info.xml124
-rwxr-xr-xindra/newview/skins/default/xui/zh/strings.xml257
-rwxr-xr-xindra/newview/skins/default/xui/zh/teleport_strings.xml3
-rwxr-xr-xindra/newview/tests/llslurl_test.cpp16
-rwxr-xr-xindra/newview/tests/llviewernetwork_test.cpp25
-rwxr-xr-xindra/newview/viewer_manifest.py4
965 files changed, 37126 insertions, 13662 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 13040ea423..35e7f77a7d 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -133,6 +133,7 @@ set(viewer_SOURCE_FILES
llavatarlist.cpp
llavatarlistitem.cpp
llavatarrenderinfoaccountant.cpp
+ llavatarrendernotifier.cpp
llavatarpropertiesprocessor.cpp
llblockedlistitem.cpp
llblocklist.cpp
@@ -140,7 +141,6 @@ set(viewer_SOURCE_FILES
llbreadcrumbview.cpp
llbrowsernotification.cpp
llbuycurrencyhtml.cpp
- llcallbacklist.cpp
llcallingcard.cpp
llcapabilitylistener.cpp
llcaphttpsender.cpp
@@ -197,6 +197,8 @@ set(viewer_SOURCE_FILES
lleventnotifier.cpp
lleventpoll.cpp
llexpandabletextbox.cpp
+ llexperienceassociationresponder.cpp
+ llexperiencelog.cpp
llexternaleditor.cpp
llface.cpp
llfacebookconnect.cpp
@@ -231,6 +233,7 @@ set(viewer_SOURCE_FILES
llfloaterconversationlog.cpp
llfloaterconversationpreview.cpp
llfloaterdeleteenvpreset.cpp
+ llfloaterdeleteprefpreset.cpp
llfloaterdestinations.cpp
llfloaterdisplayname.cpp
llfloatereditdaycycle.cpp
@@ -238,6 +241,9 @@ set(viewer_SOURCE_FILES
llfloatereditwater.cpp
llfloaterenvironmentsettings.cpp
llfloaterevent.cpp
+ llfloaterexperiencepicker.cpp
+ llfloaterexperienceprofile.cpp
+ llfloaterexperiences.cpp
llfloaterfacebook.cpp
llfloaterflickr.cpp
llfloaterfonttest.cpp
@@ -248,7 +254,6 @@ set(viewer_SOURCE_FILES
llfloatergroupinvite.cpp
llfloatergroups.cpp
llfloaterhandler.cpp
- llfloaterhardwaresettings.cpp
llfloaterhelpbrowser.cpp
llfloaterhoverheight.cpp
llfloaterhud.cpp
@@ -262,6 +267,8 @@ set(viewer_SOURCE_FILES
llfloaterlagmeter.cpp
llfloaterland.cpp
llfloaterlandholdings.cpp
+ llfloaterloadprefpreset.cpp
+ llfloatermarketplacelistings.cpp
llfloatermap.cpp
llfloatermediasettings.cpp
llfloatermemleak.cpp
@@ -269,6 +276,7 @@ set(viewer_SOURCE_FILES
llfloatermodeluploadbase.cpp
llfloaternamedesc.cpp
llfloaternotificationsconsole.cpp
+ llfloaternotificationstabbed.cpp
llfloaterobjectweights.cpp
llfloateropenobject.cpp
llfloateroutbox.cpp
@@ -285,6 +293,7 @@ set(viewer_SOURCE_FILES
llfloaterregioninfo.cpp
llfloaterreporter.cpp
llfloaterregionrestarting.cpp
+ llfloatersaveprefpreset.cpp
llfloatersceneloadstats.cpp
llfloaterscriptdebug.cpp
llfloaterscriptedprefs.cpp
@@ -403,6 +412,8 @@ set(viewer_SOURCE_FILES
llnotificationgrouphandler.cpp
llnotificationhandlerutil.cpp
llnotificationhinthandler.cpp
+ llnotificationlistitem.cpp
+ llnotificationlistview.cpp
llnotificationmanager.cpp
llnotificationofferhandler.cpp
llnotificationscripthandler.cpp
@@ -418,11 +429,16 @@ set(viewer_SOURCE_FILES
llpanelclassified.cpp
llpanelcontents.cpp
llpaneleditwearable.cpp
+ llpanelexperiencelisteditor.cpp
+ llpanelexperiencelog.cpp
+ llpanelexperiencepicker.cpp
+ llpanelexperiences.cpp
llpanelface.cpp
llpanelgenerictip.cpp
llpanelgroup.cpp
llpanelgroupbulk.cpp
llpanelgroupbulkban.cpp
+ llpanelgroupexperiences.cpp
llpanelgroupgeneral.cpp
llpanelgroupinvite.cpp
llpanelgrouplandmoney.cpp
@@ -458,6 +474,7 @@ set(viewer_SOURCE_FILES
llpanelplaceprofile.cpp
llpanelplaces.cpp
llpanelplacestab.cpp
+ llpanelpresetspulldown.cpp
llpanelprimmediacontrols.cpp
llpanelprofile.cpp
llpanelsnapshot.cpp
@@ -497,6 +514,7 @@ set(viewer_SOURCE_FILES
llplacesfolderview.cpp
llpopupview.cpp
llpostcard.cpp
+ llpresetsmanager.cpp
llpreview.cpp
llpreviewanim.cpp
llpreviewgesture.cpp
@@ -740,12 +758,12 @@ set(viewer_HEADER_FILES
llavatarlistitem.h
llavatarpropertiesprocessor.h
llavatarrenderinfoaccountant.h
+ llavatarrendernotifier.h
llblockedlistitem.h
llblocklist.h
llbox.h
llbreadcrumbview.h
llbuycurrencyhtml.h
- llcallbacklist.h
llcallingcard.h
llcapabilitylistener.h
llcapabilityprovider.h
@@ -803,6 +821,8 @@ set(viewer_HEADER_FILES
lleventnotifier.h
lleventpoll.h
llexpandabletextbox.h
+ llexperienceassociationresponder.h
+ llexperiencelog.h
llexternaleditor.h
llface.h
llfacebookconnect.h
@@ -836,6 +856,7 @@ set(viewer_HEADER_FILES
llfloatercolorpicker.h
llfloaterconversationlog.h
llfloaterconversationpreview.h
+ llfloaterdeleteprefpreset.h
llfloaterdeleteenvpreset.h
llfloaterdestinations.h
llfloaterdisplayname.h
@@ -844,6 +865,9 @@ set(viewer_HEADER_FILES
llfloatereditwater.h
llfloaterenvironmentsettings.h
llfloaterevent.h
+ llfloaterexperiencepicker.h
+ llfloaterexperienceprofile.h
+ llfloaterexperiences.h
llfloaterfacebook.h
llfloaterflickr.h
llfloaterfonttest.h
@@ -854,7 +878,6 @@ set(viewer_HEADER_FILES
llfloatergroupinvite.h
llfloatergroups.h
llfloaterhandler.h
- llfloaterhardwaresettings.h
llfloaterhelpbrowser.h
llfloaterhoverheight.h
llfloaterhud.h
@@ -871,13 +894,16 @@ set(viewer_HEADER_FILES
llfloaterlagmeter.h
llfloaterland.h
llfloaterlandholdings.h
+ llfloaterloadprefpreset.h
llfloatermap.h
+ llfloatermarketplacelistings.h
llfloatermediasettings.h
llfloatermemleak.h
llfloatermodelpreview.h
llfloatermodeluploadbase.h
llfloaternamedesc.h
llfloaternotificationsconsole.h
+ llfloaternotificationstabbed.h
llfloaterobjectweights.h
llfloateropenobject.h
llfloateroutbox.h
@@ -894,6 +920,7 @@ set(viewer_HEADER_FILES
llfloaterregioninfo.h
llfloaterreporter.h
llfloaterregionrestarting.h
+ llfloatersaveprefpreset.h
llfloatersceneloadstats.h
llfloaterscriptdebug.h
llfloaterscriptedprefs.h
@@ -1005,6 +1032,8 @@ set(viewer_HEADER_FILES
llnavigationbar.h
llnetmap.h
llnotificationhandler.h
+ llnotificationlistitem.h
+ llnotificationlistview.h
llnotificationmanager.h
llnotificationstorage.h
lloutfitslist.h
@@ -1017,12 +1046,17 @@ set(viewer_HEADER_FILES
llpanelclassified.h
llpanelcontents.h
llpaneleditwearable.h
+ llpanelexperiencelisteditor.h
+ llpanelexperiencelog.h
+ llpanelexperiencepicker.h
+ llpanelexperiences.h
llpanelface.h
llpanelgenerictip.h
llpanelgroup.h
llpanelgroupbulk.h
llpanelgroupbulkimpl.h
llpanelgroupbulkban.h
+ llpanelgroupexperiences.h
llpanelgroupgeneral.h
llpanelgroupinvite.h
llpanelgrouplandmoney.h
@@ -1058,6 +1092,7 @@ set(viewer_HEADER_FILES
llpanelplaceprofile.h
llpanelplaces.h
llpanelplacestab.h
+ llpanelpresetspulldown.h
llpanelprimmediacontrols.h
llpanelprofile.h
llpanelsnapshot.h
@@ -1092,6 +1127,7 @@ set(viewer_HEADER_FILES
llplacesfolderview.h
llpopupview.h
llpostcard.h
+ llpresetsmanager.h
llpreview.h
llpreviewanim.h
llpreviewgesture.h
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 1523336b0d..4351a7e3a3 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-3.7.29
+3.8.7
diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml
index 7b329e2092..2cd6638042 100755
--- a/indra/newview/app_settings/commands.xml
+++ b/indra/newview/app_settings/commands.xml
@@ -118,6 +118,18 @@
tooltip_ref="Command_Marketplace_Tooltip"
execute_function="Avatar.OpenMarketplace"
/>
+ <command name="marketplacelistings"
+ available_in_toybox="true"
+ icon="Command_MktListings_Icon"
+ label_ref="Command_MarketplaceListings_Label"
+ tooltip_ref="Command_MarketplaceListings_Tooltip"
+ execute_function="Marketplace.Toggle"
+ execute_parameters="marketplace"
+ is_enabled_function="Marketplace.Enabled"
+ is_enabled_parameters="marketplace"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="marketplace_listings"
+ />
<command name="minimap"
available_in_toybox="true"
icon="Command_MiniMap_Icon"
diff --git a/indra/newview/app_settings/high_graphics.xml b/indra/newview/app_settings/high_graphics.xml
index 5bc2e1b7e6..f66ba3c4df 100755
--- a/indra/newview/app_settings/high_graphics.xml
+++ b/indra/newview/app_settings/high_graphics.xml
@@ -26,8 +26,10 @@
<RenderTerrainLODFactor value="2"/>
<!--Default for now-->
<RenderTreeLODFactor value="0.5"/>
- <!--Try Impostors-->
- <RenderUseImpostors value="TRUE"/>
+ <!--Avater Impostors and Visual Muting Limits-->
+ <RenderAvatarMaxNonImpostors value="20"/>
+ <RenderAvatarMaxComplexity value="350000"/>
+ <RenderAutoMuteSurfaceAreaLimit value="10.0E6"/>
<!--Default for now-->
<RenderVolumeLODFactor value="1.125"/>
<!--NO SHADERS-->
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index 4972472f67..9699eda96b 100755
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -52,6 +52,7 @@ remote_data remote_data(integer event_type, key channel, key message_id, str
http_response http_response(key request_id, integer status, list metadata, string body):Triggered when task receives a response to one of its llHTTPRequests
http_request http_request(key id, string method, string body):Triggered when task receives an http request against a public URL
+
# integer constants
[word .1, .1, .5]
TRUE Integer constant for Boolean operations
@@ -714,6 +715,25 @@ TEXTURE_TRANSPARENT UUID for the "White - Transparent" texture
URL_REQUEST_GRANTED Used with http_request when a public URL is successfully granted
URL_REQUEST_DENIED Used with http_request when a public URL is not available
+XP_ERROR_NONE No error was detected
+XP_ERROR_THROTTLED The call failed due to too many recent calls.
+XP_ERROR_EXPERIENCES_DISABLED The region currently has experiences disabled.
+XP_ERROR_INVALID_PARAMETERS One of the string arguments was too big to fit in the key-value store.
+XP_ERROR_NOT_PERMITTED This experience is not allowed to run on the current region.
+XP_ERROR_NO_EXPERIENCE This script is not associated with an experience.
+XP_ERROR_NOT_FOUND The sim was unable to verify the validity of the experience. Retrying after a short wait is advised.
+XP_ERROR_INVALID_EXPERIENCE The script is associated with an experience that no longer exists.
+XP_ERROR_EXPERIENCE_DISABLED The experience owner has temporarily disabled the experience.
+XP_ERROR_EXPERIENCE_SUSPENDED The experience has been suspended by Linden Customer Support.
+XP_ERROR_QUOTA_EXCEEDED An attempted write data to the key-value store failed due to the data quota being met.
+XP_ERROR_STORE_DISABLED The key-value store is currently disabled on this region.
+XP_ERROR_STORAGE_EXCEPTION Unable to communicate with the key-value store.
+XP_ERROR_KEY_NOT_FOUND The requested key does not exist.
+XP_ERROR_RETRY_UPDATE A checked update failed due to an out of date request.
+XP_ERROR_MATURITY_EXCEEDED The request failed due to agent content preferences.
+XP_ERROR_UNKNOWN_ERROR Other unknown error.
+
+
# float constants
[word .3, .1, .5]
PI 3.1415926535897932384626433832795
diff --git a/indra/newview/app_settings/low_graphics.xml b/indra/newview/app_settings/low_graphics.xml
index ca1dae0b86..304e7c7347 100755
--- a/indra/newview/app_settings/low_graphics.xml
+++ b/indra/newview/app_settings/low_graphics.xml
@@ -6,8 +6,6 @@
<RenderAvatarLODFactor value="0.5"/>
<!--Default for now-->
<RenderAvatarPhysicsLODFactor value="0.0"/>
- <!--Default for now-->
- <RenderAvatarMaxVisible value="3"/>
<!--NO SHADERS-->
<RenderAvatarVP value="FALSE"/>
<!--Short Range-->
@@ -28,8 +26,10 @@
<RenderTerrainLODFactor value="1.0"/>
<!--Default for now-->
<RenderTreeLODFactor value="0.5"/>
- <!--Try Impostors-->
- <RenderUseImpostors value="TRUE"/>
+ <!--Avater Impostors and Visual Muting Limits-->
+ <RenderAvatarMaxNonImpostors value="12"/>
+ <RenderAvatarMaxComplexity value="75000"/>
+ <RenderAutoMuteSurfaceAreaLimit value="10.0E6"/>
<!--Default for now-->
<RenderVolumeLODFactor value="1.125"/>
<!--NO SHADERS-->
diff --git a/indra/newview/app_settings/mid_graphics.xml b/indra/newview/app_settings/mid_graphics.xml
index 01822fe64c..68f193a15f 100755
--- a/indra/newview/app_settings/mid_graphics.xml
+++ b/indra/newview/app_settings/mid_graphics.xml
@@ -26,8 +26,10 @@
<RenderTerrainLODFactor value="1.0"/>
<!--Default for now-->
<RenderTreeLODFactor value="0.5"/>
- <!--Try Impostors-->
- <RenderUseImpostors value="TRUE"/>
+ <!--Avater Impostors and Visual Muting Limits-->
+ <RenderAvatarMaxNonImpostors value="18"/>
+ <RenderAvatarMaxComplexity value="100000"/>
+ <RenderAutoMuteSurfaceAreaLimit value="10.0E6"/>
<!--Default for now-->
<RenderVolumeLODFactor value="1.125"/>
<!--NO SHADERS-->
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 845cb5ae96..7ec9f778bf 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -2,6 +2,39 @@
<llsd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="llsd.xsd">
<map>
+ <key>ImporterDebug</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable debug output to more precisely identify sources of import errors. Warning: the output can slow down import on many machines.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ImporterLegacyMatching</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable index based model matching.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ImporterModelLimit</key>
+ <map>
+ <key>Comment</key>
+ <string>Limits amount of importer generated models for dae files</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>768</integer>
+ </map>
<key>IMShowTime</key>
<map>
<key>Comment</key>
@@ -47,7 +80,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>300</real>
+ <real>300.0</real>
</map>
<key>AckCollectTime</key>
<map>
@@ -80,7 +113,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>1</real>
+ <real>1.0</real>
</map>
<key>AdvanceSnapshot</key>
<map>
@@ -1651,7 +1684,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>100</real>
+ <integer>100</integer>
</map>
<key>ChatLoadGroupTimeout</key>
<map>
@@ -3459,6 +3492,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>MinObjectsForUnlinkConfirm</key>
+ <map>
+ <key>Comment</key>
+ <string>Minimum amount of objects in linkset for showing confirmation dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>6</integer>
+ </map>
<key>EffectScriptChatParticles</key>
<map>
<key>Comment</key>
@@ -4260,7 +4304,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>3</real>
+ <real>3.0</real>
</map>
<key>FullScreenAutoDetectAspectRatio</key>
<map>
@@ -4680,17 +4724,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>InventoryDisplayOutbox</key>
- <map>
- <key>Comment</key>
- <string>Override merchant inventory outbox display</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>InventoryInboxToggleState</key>
<map>
<key>Comment</key>
@@ -4713,6 +4746,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>InventoryOutboxDisplayBoth</key>
+ <map>
+ <key>Comment</key>
+ <string>Show the legacy Merchant Outbox UI as well as the Marketplace Listings UI</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>InventoryOutboxLogging</key>
<map>
<key>Comment</key>
@@ -4744,7 +4788,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <integer>21</integer>
+ <integer>20</integer>
</map>
<key>InventoryOutboxMaxFolderDepth</key>
<map>
@@ -4768,6 +4812,17 @@
<key>Value</key>
<integer>200</integer>
</map>
+ <key>InventoryOutboxMaxStockItemCount</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of items allowed in a stock folder.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>200</integer>
+ </map>
<key>InventorySortOrder</key>
<map>
<key>Comment</key>
@@ -4779,6 +4834,17 @@
<key>Value</key>
<integer>7</integer>
</map>
+ <key>MarketplaceListingsSortOrder</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies sort for marketplace listings</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>2</integer>
+ </map>
<key>InvertMouse</key>
<map>
<key>Comment</key>
@@ -5628,6 +5694,17 @@
<key>Value</key>
<string />
</map>
+ <key>MarketplaceListingsLogging</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable debug output associated with the Marketplace Listings (SLM) API.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>MarketplaceURL</key>
<map>
<key>Comment</key>
@@ -6275,7 +6352,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <real>0</real>
+ <integer>0</integer>
</map>
<key>MeshEnabled</key>
<map>
@@ -6286,7 +6363,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <real>1</real>
+ <integer>1</integer>
</map>
<key>MeshImportUseSLM</key>
<map>
@@ -6297,7 +6374,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <real>1</real>
+ <integer>1</integer>
</map>
<key>MeshUploadLogXML</key>
<map>
@@ -6308,7 +6385,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <real>0</real>
+ <integer>0</integer>
</map>
<key>MeshUploadFakeErrors</key>
<map>
@@ -6319,7 +6396,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>0</real>
+ <integer>0</integer>
</map>
<key>MeshUploadTimeOut</key>
<map>
@@ -6330,7 +6407,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>600</real>
+ <integer>600</integer>
</map>
<key>MigrateCacheDirectory</key>
<map>
@@ -8229,21 +8306,10 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>RenderAvatarComplexityLimit</key>
- <map>
- <key>Comment</key>
- <string>Max visual complexity of avatars in a scene</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>-1</integer>
- </map>
<key>RenderComplexityColorMin</key>
<map>
<key>Comment</key>
- <string>Max visual complexity of avatars in a scene</string>
+ <string>Unused obsolete setting</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -8259,7 +8325,7 @@
<key>RenderComplexityColorMid</key>
<map>
<key>Comment</key>
- <string>Max visual complexity of avatars in a scene</string>
+ <string>Unused obsolete setting</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -8275,7 +8341,7 @@
<key>RenderComplexityColorMax</key>
<map>
<key>Comment</key>
- <string>Max visual complexity of avatars in a scene</string>
+ <string>Unused obsolete setting</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -8291,7 +8357,7 @@
<key>RenderComplexityThreshold</key>
<map>
<key>Comment</key>
- <string>Only color objects higher than render threshold</string>
+ <string>Unused obsolete setting</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -8302,8 +8368,7 @@
<key>RenderComplexityStaticMax</key>
<map>
<key>Comment</key>
- <string>Sets a static max value for scaling of RenderComplexity
- display (-1 for dynamic scaling)</string>
+ <string>Unused obsolete setting</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -8325,13 +8390,13 @@
<key>RenderAvatarMaxVisible</key>
<map>
<key>Comment</key>
- <string>Maximum number of avatars to display at any one time</string>
+ <string>OBSOLETE and UNUSED. See RenderAvatarMaxNonImpostors</string>
<key>Persist</key>
- <integer>1</integer>
+ <integer>0</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>12</integer>
+ <integer>0</integer>
</map>
<key>RenderAvatarPhysicsLODFactor</key>
<map>
@@ -8554,7 +8619,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>64</real>
+ <real>64.0</real>
</map>
<key>RenderCubeMap</key>
<map>
@@ -8690,7 +8755,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <real>16</real>
+ <integer>16</integer>
</map>
<key>RenderEdgeDepthCutoff</key>
@@ -8736,7 +8801,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>4</real>
+ <real>4.0</real>
</map>
<key>RenderDeferredSpotShadowBias</key>
<map>
@@ -8803,7 +8868,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>0</real>
+ <real>0.0</real>
</map>
<key>RenderDepthPrePass</key>
@@ -8997,7 +9062,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <real>0</real>
+ <integer>0</integer>
</map>
<key>RenderSpecularResX</key>
@@ -9009,7 +9074,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <real>1024</real>
+ <integer>1024</integer>
</map>
<key>RenderSpecularResY</key>
@@ -9021,7 +9086,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <real>256</real>
+ <integer>256</integer>
</map>
<key>RenderSpecularExponent</key>
@@ -9177,7 +9242,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <real>4</real>
+ <integer>4</integer>
</map>
<key>RenderShadowBlurDistFactor</key>
<map>
@@ -9344,9 +9409,9 @@
<string>Vector3</string>
<key>Value</key>
<array>
- <real>1</real>
- <real>0</real>
- <real>0</real>
+ <real>1.0</real>
+ <real>0.0</real>
+ <real>0.0</real>
</array>
</map>
<key>RenderGlowMaxExtractAlpha</key>
@@ -9764,13 +9829,13 @@
<key>RenderTerrainDetail</key>
<map>
<key>Comment</key>
- <string>Detail applied to terrain texturing (0 = none, 1 or 2 = full)</string>
+ <string>Detail applied to terrain texturing (0 = none, 1 = full)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>2</integer>
+ <integer>1</integer>
</map>
<key>RenderTerrainLODFactor</key>
<map>
@@ -9882,29 +9947,28 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>RenderUseFarClip</key>
- <map>
- <key>Comment</key>
- <string>If false, frustum culling will ignore far clip plane.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>RenderUseImpostors</key>
- <map>
- <key>Comment</key>
- <string>Whether we want to use impostors for far away avatars.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
-
+ <key>RenderUseFarClip</key>
+ <map>
+ <key>Comment</key>
+ <string>If false, frustum culling will ignore far clip plane.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderUseImpostors</key>
+ <map>
+ <key>Comment</key>
+ <string>OBSOLETE and UNUSED. See RenderAvatarMaxNonImpostors and RenderAvatarMaxComplexity.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>RenderAutoMuteByteLimit</key>
<map>
<key>Comment</key>
@@ -9914,40 +9978,65 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>10000000</integer>
</map>
- <key>RenderAutoMuteRenderWeightLimit</key>
+ <key>RenderAvatarMaxNonImpostors</key>
<map>
<key>Comment</key>
- <string>Maximum render weight before an avatar is rendered as a simple impostor (0 to not use this limit).</string>
+ <string>Maximum number of avatars to fully render at one time;
+ over this limit uses impostor rendering (simplified rendering
+ with less frequent updates), reducing client lag.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
+ <integer>12</integer>
+ </map>
+ <key>RenderAutoMuteRenderWeightLimit</key>
+ <map>
+ <key>Comment</key>
+ <string>OBSOLETE. This setting has been renamed RenderAvatarMaxNonImpostors.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
<integer>0</integer>
</map>
- <key>RenderAutoMuteSurfaceAreaLimit</key>
+ <key>ShowMyComplexityChanges</key>
<map>
<key>Comment</key>
- <string>Maximum surface area of attachments before an avatar is rendered as a simple impostor (0 to not use this limit).</string>
+ <string>How long to show notices about avatar complexity (set to zero to disable those notices)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>F32</string>
+ <string>U32</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>20</integer>
</map>
- <key>RenderAutoMuteFunctions</key>
+ <key>RenderAvatarMaxComplexity</key>
<map>
<key>Comment</key>
- <string>Developing feature to render some avatars using simple impostors or colored silhouettes. (Set to 7 for all functionality)</string>
+ <string>Maximum Avatar Complexity; above this value, the avatar is
+ rendered as a solid color outline (0 to disable this limit).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <real>0</real>
+ <integer>0</integer>
+ </map>
+ <key>RenderAutoMuteSurfaceAreaLimit</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum surface area of attachments before an avatar is rendered as a simple impostor (0 to not use this limit).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>10.0E6</real>
</map>
<key>RenderAutoMuteLogging</key>
<map>
@@ -9969,7 +10058,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <integer>0</integer>
+ <real>10.0E6</real>
</map>
<key>RenderVBOEnable</key>
@@ -10169,7 +10258,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <real>250000</real>
+ <integer>250000</integer>
</map>
<key>MeshMetaDataDiscount</key>
<map>
@@ -10180,7 +10269,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <real>384</real>
+ <integer>384</integer>
</map>
<key>MeshMinimumByteSize</key>
<map>
@@ -10191,7 +10280,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <real>16</real>
+ <integer>16</integer>
</map>
<key>MeshBytesPerTriangle</key>
<map>
@@ -10202,7 +10291,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <real>16</real>
+ <integer>16</integer>
</map>
<key>Mesh2MaxConcurrentRequests</key>
<map>
@@ -10334,7 +10423,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <real>1024</real>
+ <integer>1024</integer>
</map>
<key>SceneLoadLowMemoryBound</key>
<map>
@@ -10345,7 +10434,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <real>750</real>
+ <integer>750</integer>
</map>
<key>SceneLoadMinRadius</key>
<map>
@@ -10556,17 +10645,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>ShowAdvancedGraphicsSettings</key>
- <map>
- <key>Comment</key>
- <string>Show advanced graphics settings</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>ShowAllObjectHoverTip</key>
<map>
<key>Comment</key>
@@ -12138,7 +12216,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>6</real>
+ <integer>6</integer>
</map>
<key>UICheckboxctrlBtnSize</key>
<map>
@@ -12149,7 +12227,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>13</real>
+ <integer>13</integer>
</map>
<key>UICheckboxctrlHeight</key>
<map>
@@ -12160,7 +12238,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>16</real>
+ <integer>16</integer>
</map>
<key>UICheckboxctrlHPad</key>
<map>
@@ -12171,7 +12249,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>2</real>
+ <integer>2</integer>
</map>
<key>UICheckboxctrlSpacing</key>
<map>
@@ -12182,7 +12260,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>5</real>
+ <integer>5</integer>
</map>
<key>UICheckboxctrlVPad</key>
<map>
@@ -12193,7 +12271,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>2</real>
+ <integer>2</integer>
</map>
<key>UICloseBoxFromTop</key>
<map>
@@ -12204,7 +12282,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>5</real>
+ <integer>5</integer>
</map>
<key>UIExtraTriangleHeight</key>
<map>
@@ -12215,7 +12293,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>-1</real>
+ <integer>-1</integer>
</map>
<key>UIExtraTriangleWidth</key>
<map>
@@ -12226,7 +12304,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>4</real>
+ <integer>4</integer>
</map>
<key>UIFloaterCloseBoxSize</key>
<map>
@@ -12237,7 +12315,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>16</real>
+ <integer>16</integer>
</map>
<key>UIFloaterHPad</key>
<map>
@@ -12248,7 +12326,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>6</real>
+ <integer>6</integer>
</map>
<key>UIFloaterTestBool</key>
<map>
@@ -12468,7 +12546,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>500</real>
+ <integer>500</integer>
</map>
<key>UIMinimizedWidth</key>
<map>
@@ -12479,7 +12557,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>160</real>
+ <integer>160</integer>
</map>
<key>UIMultiSliderctrlSpacing</key>
<map>
@@ -12490,7 +12568,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>4</real>
+ <integer>4</integer>
</map>
<key>UIMultiTrackHeight</key>
<map>
@@ -13150,7 +13228,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>3</real>
+ <integer>3</integer>
</map>
<key>UseCircuitCodeTimeout</key>
<map>
@@ -14131,6 +14209,17 @@
<key>Value</key>
<integer>-1</integer>
</map>
+ <key>MaxFPS</key>
+ <map>
+ <key>Comment</key>
+ <string>OBSOLETE UNUSED setting.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>-1.0</real>
+ </map>
<key>ForcePeriodicRenderingTime</key>
<map>
<key>Comment</key>
@@ -15158,9 +15247,9 @@
<string>Color4</string>
<key>Value</key>
<array>
- <real>0</real>
- <real>0</real>
- <real>0</real>
+ <real>0.0</real>
+ <real>0.0</real>
+ <real>0.0</real>
<real>1.0</real>
</array>
</map>
@@ -15477,7 +15566,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>2</real>
+ <real>2.0</real>
</map>
<key>TeleportLocalDelay</key>
<map>
@@ -15488,7 +15577,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>1</real>
+ <real>1.0</real>
</map>
<key>FMODExProfilerEnable</key>
<map>
@@ -15611,6 +15700,41 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>PresetGraphicActive</key>
+ <map>
+ <key>Comment</key>
+ <string>Name of currently selected preference</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>IndirectMaxComplexity</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls RenderAvatarMaxComplexity in a non-linear fashion (do
+ not set this value)</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>IndirectMaxNonImpostors</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls RenderAvatarMaxNonImpostors in a non-linear fashion (do
+ not set this value)</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
</map>
</llsd>
diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
index 6cd38d8ef5..3060307b21 100755
--- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
@@ -37,8 +37,7 @@ mat4 getObjectSkinnedTransform()
index = min(index, vec4(51.0));
index = max(index, vec4( 0.0));
- float scale = 1.0/(w.x+w.y+w.z+w.w);
- w *= scale;
+ w *= 1.0/(w.x+w.y+w.z+w.w);
int i1 = int(index.x);
int i2 = int(index.y);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
index 595c11fae2..58fb01d200 100755
--- a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
@@ -29,6 +29,7 @@ out vec4 frag_data[3];
#define frag_data gl_FragData
#endif
+uniform float minimum_alpha;
uniform sampler2D diffuseMap;
uniform sampler2D bumpMap;
@@ -47,16 +48,23 @@ vec2 encode_normal(vec3 n)
void main()
{
- vec3 col = vertex_color.rgb * texture2D(diffuseMap, vary_texcoord0.xy).rgb;
- vec3 norm = texture2D(bumpMap, vary_texcoord0.xy).rgb * 2.0 - 1.0;
+ vec4 col = texture2D(diffuseMap, vary_texcoord0.xy);
+
+ if(col.a < minimum_alpha)
+ {
+ discard;
+ }
+ col *= vertex_color;
+
+ vec3 norm = texture2D(bumpMap, vary_texcoord0.xy).rgb * 2.0 - 1.0;
- vec3 tnorm = vec3(dot(norm,vary_mat0),
+ vec3 tnorm = vec3(dot(norm,vary_mat0),
dot(norm,vary_mat1),
dot(norm,vary_mat2));
- frag_data[0] = vec4(col, 0.0);
- frag_data[1] = vertex_color.aaaa; // spec
- //frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested
- vec3 nvn = normalize(tnorm);
- frag_data[2] = vec4(encode_normal(nvn.xyz), vertex_color.a, 0.0);
+ frag_data[0] = vec4(col.rgb, 0.0);
+ frag_data[1] = vertex_color.aaaa; // spec
+ //frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested
+ vec3 nvn = normalize(tnorm);
+ frag_data[2] = vec4(encode_normal(nvn), vertex_color.a, 0.0);
}
diff --git a/indra/newview/app_settings/toolbars.xml b/indra/newview/app_settings/toolbars.xml
index d61aee9a14..36e4eb91fd 100755
--- a/indra/newview/app_settings/toolbars.xml
+++ b/indra/newview/app_settings/toolbars.xml
@@ -23,4 +23,7 @@
<command name="snapshot"/>
<command name="facebook"/>
</left_toolbar>
+ <right_toolbar
+ button_display_mode="icons_only">
+ </right_toolbar>
</toolbars>
diff --git a/indra/newview/app_settings/ultra_graphics.xml b/indra/newview/app_settings/ultra_graphics.xml
index 71459e5470..a333634fea 100755
--- a/indra/newview/app_settings/ultra_graphics.xml
+++ b/indra/newview/app_settings/ultra_graphics.xml
@@ -26,8 +26,11 @@
<RenderTerrainLODFactor value="2.0"/>
<!--Default for now-->
<RenderTreeLODFactor value="1.0"/>
- <!--Try Impostors-->
- <RenderUseImpostors value="TRUE"/>
+ <!--Avater Impostors and Visual Muting Limits (real defaults set
+ based on default graphics setting -->
+ <RenderAvatarMaxNonImpostors value="0"/>
+ <RenderAvatarMaxComplexity value="0"/>
+ <RenderAutoMuteSurfaceAreaLimit value="10.0E6"/>
<!--Default for now-->
<RenderVolumeLODFactor value="2.0"/>
<!--NO SHADERS-->
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index 4030324ecb..3b58b943cf 100755
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -1,5 +1,5 @@
version 33
-// The version number above should be implemented IF AND ONLY IF some
+// The version number above should be incremented 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
// defaults. This should be as rare an event as we can manage.
@@ -31,8 +31,11 @@ RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
RenderAvatarPhysicsLODFactor 1 1.0
-RenderAvatarMaxVisible 1 12
+RenderAvatarMaxNonImpostors 1 16
+RenderAvatarMaxComplexity 1 80000
RenderAvatarVP 1 1
+RenderAutoMuteByteLimit 1 10000000
+RenderAutoMuteSurfaceAreaLimit 1 1.0E6
RenderCubeMap 1 1
RenderDelayVBUpdate 1 0
RenderFarClip 1 256
@@ -49,7 +52,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
-RenderUseImpostors 1 1
RenderVBOEnable 1 1
RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 2.0
@@ -66,12 +68,10 @@ RenderShaderLightingMaxLevel 1 3
RenderDeferred 1 1
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
-WatchdogDisabled 1 1
RenderUseStreamVBO 1 1
RenderFSAASamples 1 16
RenderMaxTextureIndex 1 16
-
//
// Low Graphics Settings (fixed function)
//
@@ -80,20 +80,20 @@ RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
RenderAvatarPhysicsLODFactor 1 0
-RenderAvatarMaxVisible 1 3
+RenderAvatarMaxNonImpostors 1 3
+RenderAvatarMaxComplexity 1 35000
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
+RenderLocalLights 1 0
RenderMaxPartCount 1 0
RenderObjectBump 1 0
-RenderLocalLights 1 0
RenderReflectionDetail 1 0
RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
-RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
@@ -103,7 +103,6 @@ RenderShadowDetail 1 0
WLSkyDetail 1 48
RenderFSAASamples 1 0
-
//
// Low Graphics Settings
//
@@ -112,20 +111,20 @@ RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
RenderAvatarPhysicsLODFactor 1 0
-RenderAvatarMaxVisible 1 3
+RenderAvatarMaxNonImpostors 1 3
+RenderAvatarMaxComplexity 1 35000
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
+RenderLocalLights 1 0
RenderMaxPartCount 1 0
RenderObjectBump 1 0
-RenderLocalLights 1 0
RenderReflectionDetail 1 0
RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
-RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
@@ -155,7 +154,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 1.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
-RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
@@ -185,7 +183,6 @@ 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
@@ -215,7 +212,6 @@ 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
@@ -245,7 +241,6 @@ 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
@@ -275,7 +270,6 @@ 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
@@ -293,19 +287,19 @@ list Ultra
RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarVP 1 1
RenderFarClip 1 256
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
+RenderLocalLights 1 1
RenderMaxPartCount 1 8192
RenderObjectBump 1 1
-RenderLocalLights 1 1
RenderReflectionDetail 1 4
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
-RenderUseImpostors 1 1
RenderVolumeLODFactor 1 2.0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@@ -315,7 +309,6 @@ RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
RenderFSAASamples 1 2
-
//
// Class Unknown Hardware (unknown)
//
@@ -407,18 +400,18 @@ list safe
RenderAnisotropic 1 0
RenderAvatarCloth 0 0
RenderAvatarVP 0 0
+RenderAvatarMaxNonImpostors 1 16
+RenderAvatarMaxComplexity 1 60000
RenderObjectBump 0 0
RenderLocalLights 1 0
RenderMaxPartCount 1 1024
RenderTerrainDetail 1 0
-RenderUseImpostors 0 0
RenderVBOEnable 1 0
RenderReflectionDetail 0 0
WindLightUseAtmosShaders 0 0
RenderDeferred 0 0
RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
-
//
// CPU based feature masks
@@ -462,37 +455,30 @@ UseOcclusion 0 0
list Intel_830M
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 0 0
list Intel_845G
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 0 0
list Intel_855GM
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 0 0
list Intel_865G
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 0 0
list Intel_900
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 0 0
list Intel_915GM
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 0 0
list Intel_915G
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 0 0
list Intel_945GM
RenderTerrainDetail 1 0
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index 6d5284c602..121559bb7a 100755
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -31,7 +31,7 @@ RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
RenderAvatarPhysicsLODFactor 1 1.0
-RenderAvatarMaxVisible 1 12
+RenderAvatarMaxNonImpostors 1 12
RenderAvatarVP 1 1
RenderCubeMap 1 1
RenderDelayVBUpdate 1 0
@@ -49,7 +49,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
-RenderUseImpostors 1 1
RenderVBOEnable 1 1
RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 2.0
@@ -77,7 +76,7 @@ RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
RenderAvatarPhysicsLODFactor 1 0
-RenderAvatarMaxVisible 1 3
+RenderAvatarMaxNonImpostors 1 3
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
@@ -90,7 +89,6 @@ RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
-RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
@@ -108,7 +106,7 @@ RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
RenderAvatarPhysicsLODFactor 1 0
-RenderAvatarMaxVisible 1 3
+RenderAvatarMaxNonImpostors 1 3
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
@@ -121,7 +119,6 @@ RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
-RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
@@ -151,7 +148,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 1.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
-RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
@@ -181,7 +177,6 @@ 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
@@ -211,7 +206,6 @@ 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
@@ -241,7 +235,6 @@ 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
@@ -271,7 +264,6 @@ 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
@@ -301,7 +293,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
-RenderUseImpostors 1 1
RenderVolumeLODFactor 1 2.0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@@ -405,7 +396,6 @@ RenderAvatarVP 0 0
RenderObjectBump 0 0
RenderMaxPartCount 1 1024
RenderTerrainDetail 1 0
-RenderUseImpostors 0 0
RenderVBOEnable 1 0
RenderReflectionDetail 0 0
WindLightUseAtmosShaders 0 0
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index 628a96e988..024aab83dd 100755
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -4,7 +4,7 @@ version 37
// resetting the graphics preferences of all users to the recommended
// defaults. This should be as rare an event as we can manage.
-// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
+// NOTE: This is mostly identical to featuretable.txt with a few differences
// Should be combined into one table
//
@@ -31,8 +31,11 @@ RenderAnisotropic 1 0
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
RenderAvatarPhysicsLODFactor 1 1.0
-RenderAvatarMaxVisible 1 12
+RenderAvatarMaxNonImpostors 1 12
+RenderAvatarMaxComplexity 1 60000
RenderAvatarVP 1 1
+RenderAutoMuteByteLimit 1 10000000
+RenderAutoMuteSurfaceAreaLimit 1 1.0E6
RenderCubeMap 1 1
RenderDelayVBUpdate 1 0
RenderFarClip 1 256
@@ -49,7 +52,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
-RenderUseImpostors 1 1
RenderVBOEnable 1 1
RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 2.0
@@ -66,7 +68,6 @@ RenderShaderLightingMaxLevel 1 3
RenderDeferred 1 1
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
-WatchdogDisabled 1 1
RenderUseStreamVBO 1 1
RenderFSAASamples 1 16
RenderMaxTextureIndex 1 16
@@ -79,7 +80,8 @@ RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
RenderAvatarPhysicsLODFactor 1 0
-RenderAvatarMaxVisible 1 3
+RenderAvatarMaxNonImpostors 1 3
+RenderAvatarMaxComplexity 1 30000
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
@@ -92,7 +94,6 @@ RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
-RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
@@ -110,7 +111,8 @@ RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
RenderAvatarPhysicsLODFactor 1 0
-RenderAvatarMaxVisible 1 3
+RenderAvatarMaxNonImpostors 1 3
+RenderAvatarMaxComplexity 1 30000
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
@@ -123,7 +125,6 @@ RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
-RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
@@ -153,7 +154,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 1.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
-RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
@@ -183,7 +183,6 @@ 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
@@ -213,7 +212,6 @@ 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
@@ -243,7 +241,6 @@ 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
@@ -273,7 +270,6 @@ 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
@@ -304,7 +300,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
-RenderUseImpostors 1 1
RenderVolumeLODFactor 1 2.0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@@ -319,6 +314,9 @@ RenderFSAASamples 1 2
//
list Unknown
RenderVBOEnable 1 0
+RenderShadowDetail 1 0
+RenderDeferred 1 0
+RenderDeferredSSAO 1 0
//
// Class 0 Hardware (just old)
@@ -343,6 +341,7 @@ RenderVBOEnable 1 1
//
list Class3
RenderVBOEnable 1 1
+
//
// Class 4 Hardware
//
@@ -394,11 +393,12 @@ list safe
RenderAnisotropic 1 0
RenderAvatarCloth 0 0
RenderAvatarVP 0 0
-RenderLocalLights 1 0
+RenderAvatarMaxNonImpostors 1 16
+RenderAvatarMaxComplexity 1 60000
RenderObjectBump 0 0
+RenderLocalLights 1 0
RenderMaxPartCount 1 1024
RenderTerrainDetail 1 0
-RenderUseImpostors 0 0
RenderVBOEnable 1 0
RenderReflectionDetail 0 0
WindLightUseAtmosShaders 0 0
@@ -523,7 +523,6 @@ Disregard96DefaultDrawDistance 1 0
list NVIDIA_GeForce_8600
RenderTextureMemoryMultiple 1 1
-RenderUseImpostors 0 0
UseOcclusion 0 0
/// tweaked ATI to 96 Draw distance
diff --git a/indra/newview/featuretable_solaris.txt b/indra/newview/featuretable_solaris.txt
index e7cae1abdc..f6f0a9cb17 100755
--- a/indra/newview/featuretable_solaris.txt
+++ b/indra/newview/featuretable_solaris.txt
@@ -129,7 +129,7 @@ RenderUseFBO 1 0
list low
RenderVBO 1 0
RenderAniso 1 0
-RenderAvatarMaxVisible 1 3
+RenderAvatarMaxNonImpostors 1 3
RenderLighting 1 0
list medium
diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt
index 68e09d010e..053dfb64d4 100755
--- a/indra/newview/featuretable_xp.txt
+++ b/indra/newview/featuretable_xp.txt
@@ -31,7 +31,7 @@ RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
RenderAvatarPhysicsLODFactor 1 1.0
-RenderAvatarMaxVisible 1 12
+RenderAvatarMaxNonImpostors 1 12
RenderAvatarVP 1 1
RenderCubeMap 1 1
RenderDelayVBUpdate 1 0
@@ -49,7 +49,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
-RenderUseImpostors 1 1
RenderVBOEnable 1 1
RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 2.0
@@ -79,7 +78,7 @@ RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
RenderAvatarPhysicsLODFactor 1 0
-RenderAvatarMaxVisible 1 3
+RenderAvatarMaxNonImpostors 1 3
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
@@ -92,7 +91,6 @@ RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
-RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
@@ -110,7 +108,7 @@ RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
RenderAvatarPhysicsLODFactor 1 0
-RenderAvatarMaxVisible 1 3
+RenderAvatarMaxNonImpostors 1 3
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
@@ -123,7 +121,6 @@ RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
-RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
@@ -153,7 +150,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 1.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
-RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
@@ -183,7 +179,6 @@ 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
@@ -213,7 +208,6 @@ 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
@@ -243,7 +237,6 @@ 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
@@ -273,7 +266,6 @@ 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
@@ -303,7 +295,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
-RenderUseImpostors 1 1
RenderVolumeLODFactor 1 2.0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@@ -404,7 +395,6 @@ RenderAvatarVP 0 0
RenderObjectBump 0 0
RenderMaxPartCount 1 1024
RenderTerrainDetail 1 0
-RenderUseImpostors 0 0
RenderVBOEnable 1 0
RenderReflectionDetail 0 0
WindLightUseAtmosShaders 0 0
@@ -454,37 +444,30 @@ UseOcclusion 0 0
list Intel_830M
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 0 0
list Intel_845G
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 0 0
list Intel_855GM
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 0 0
list Intel_865G
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 0 0
list Intel_900
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 0 0
list Intel_915GM
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 0 0
list Intel_915G
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 0 0
list Intel_945GM
RenderTerrainDetail 1 0
@@ -501,7 +484,6 @@ RenderVBOEnable 1 0
list Intel_965
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 1 0
UseOcclusion 0 0
list Intel_G33
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index 8c8b4971cf..b8677fd9e4 100755
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -165,7 +165,9 @@ lbl_configure_default_lang:
StrCpy $LANGUAGE $0
# For silent installs, no language prompt, use default
- IfSilent lbl_return
+ IfSilent 0 +3
+ StrCpy $SKIP_AUTORUN "true"
+ Goto lbl_return
StrCmp $SKIP_DIALOGS "true" lbl_return
lbl_build_menu:
@@ -298,6 +300,11 @@ CreateShortCut "$INSTDIR\$INSTSHORTCUT.lnk" \
CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \
'"$INSTDIR\uninst.exe"' ''
+# Create *.bat file to specify lang params on first run from installer - see MAINT-5259
+FileOpen $9 "$INSTDIR\autorun.bat" w
+FileWrite $9 'start "$INSTDIR\$INSTEXE" "$INSTDIR\$INSTEXE" $SHORTCUT_LANG_PARAM$\r$\n'
+FileClose $9
+
# Write registry
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "" "$INSTDIR"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version" "${VERSION_LONG}"
@@ -682,7 +689,7 @@ Call CheckWindowsServPack # Warn if not on the latest SP before asking to launc
Push $R0 # Option value, unused
StrCmp $SKIP_AUTORUN "true" +2;
# Assumes SetOutPath $INSTDIR
- Exec '"$WINDIR\explorer.exe" "$INSTDIR\$INSTEXE"'
+ Exec '"$WINDIR\explorer.exe" "$INSTDIR\autorun.bat"'
Pop $R0
FunctionEnd
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 359171c5bd..297bd9a05b 100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -2843,7 +2843,7 @@ BOOL LLAgent::isInGroup(const LLUUID& group_id, BOOL ignore_god_mode /* FALSE */
// This implementation should mirror LLAgentInfo::hasPowerInGroup
BOOL LLAgent::hasPowerInGroup(const LLUUID& group_id, U64 power) const
{
- if (isGodlike())
+ if (isGodlikeWithoutAdminMenuFakery())
return true;
// GP_NO_POWERS can also mean no power is enough to grant an ability.
@@ -3873,6 +3873,12 @@ void LLAgent::handleTeleportFinished()
LLNotificationsUtil::add("PreferredMaturityChanged", args);
mIsMaturityRatingChangingDuringTeleport = false;
}
+
+ // Init SLM Marketplace connection so we know which UI should be used for the user as a merchant
+ // Note: Eventually, all merchant will be migrated to the new SLM system and there will be no reason to show the old UI at all.
+ // Note: Some regions will not support the SLM cap for a while so we need to do that check for each teleport.
+ // *TODO : Suppress that line from here once the whole grid migrated to SLM and move it to idle_startup() (llstartup.cpp)
+ check_merchant_status();
}
void LLAgent::handleTeleportFailed()
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 7f0330ee99..aed27924fe 100755
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -147,6 +147,7 @@ LLAgentCamera::LLAgentCamera() :
mCameraUpVector(LLVector3::z_axis), // default is straight up
mFocusOnAvatar(TRUE),
+ mAllowChangeToFollow(FALSE),
mFocusGlobal(),
mFocusTargetGlobal(),
mFocusObject(NULL),
@@ -1152,8 +1153,10 @@ void LLAgentCamera::updateCamera()
mCameraUpVector = mCameraUpVector * gAgentAvatarp->getRenderRotation();
}
- if (cameraThirdPerson() && mFocusOnAvatar && LLFollowCamMgr::getActiveFollowCamParams())
+ if (cameraThirdPerson() && (mFocusOnAvatar || mAllowChangeToFollow) && LLFollowCamMgr::getActiveFollowCamParams())
{
+ mAllowChangeToFollow = FALSE;
+ mFocusOnAvatar = TRUE;
changeCameraToFollow();
}
@@ -2610,6 +2613,7 @@ void LLAgentCamera::setFocusOnAvatar(BOOL focus_on_avatar, BOOL animate)
{
// keep camera focus point consistent, even though it is now unlocked
setFocusGlobal(gAgent.getPositionGlobal() + calcThirdPersonFocusOffset(), gAgent.getID());
+ mAllowChangeToFollow = FALSE;
}
mFocusOnAvatar = focus_on_avatar;
diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h
index 4d0f9a80de..ab793ff316 100755
--- a/indra/newview/llagentcamera.h
+++ b/indra/newview/llagentcamera.h
@@ -206,13 +206,15 @@ public:
void setCameraPosAndFocusGlobal(const LLVector3d& pos, const LLVector3d& focus, const LLUUID &object_id);
void clearFocusObject();
void setFocusObject(LLViewerObject* object);
+ void setAllowChangeToFollow(BOOL focus) { mAllowChangeToFollow = focus; }
void setObjectTracking(BOOL track) { mTrackFocusObject = track; }
const LLVector3d &getFocusGlobal() const { return mFocusGlobal; }
const LLVector3d &getFocusTargetGlobal() const { return mFocusTargetGlobal; }
private:
LLVector3d mCameraFocusOffset; // Offset from focus point in build mode
LLVector3d mCameraFocusOffsetTarget; // Target towards which we are lerping the camera's focus offset
- BOOL mFocusOnAvatar;
+ BOOL mFocusOnAvatar;
+ BOOL mAllowChangeToFollow;
LLVector3d mFocusGlobal;
LLVector3d mFocusTargetGlobal;
LLPointer<LLViewerObject> mFocusObject;
diff --git a/indra/newview/llagentdata.cpp b/indra/newview/llagentdata.cpp
index 5f6a082d75..d2c644a06f 100755
--- a/indra/newview/llagentdata.cpp
+++ b/indra/newview/llagentdata.cpp
@@ -31,3 +31,4 @@
LLUUID gAgentID;
LLUUID gAgentSessionID;
+std::string gAgentUsername;
diff --git a/indra/newview/llagentdata.h b/indra/newview/llagentdata.h
index 83d6a53d5e..efdd97f6c4 100755
--- a/indra/newview/llagentdata.h
+++ b/indra/newview/llagentdata.h
@@ -30,5 +30,6 @@
extern LLUUID gAgentID;
extern LLUUID gAgentSessionID;
+extern std::string gAgentUsername;
#endif
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index f06ffb4fb3..cce1eb5895 100755
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -27,6 +27,7 @@
#include "llviewerprecompiledheaders.h"
#include "llagentwearables.h"
+#include "llattachmentsmgr.h"
#include "llaccordionctrltab.h"
#include "llagent.h"
#include "llagentcamera.h"
@@ -633,10 +634,13 @@ void LLAgentWearables::wearableUpdated(LLWearable *wearable, BOOL removed)
// the versions themselves are compatible. This code can be removed before release.
if( wearable->getDefinitionVersion() == 24 )
{
- wearable->setDefinitionVersion(22);
- U32 index = getWearableIndex(wearable);
- LL_INFOS() << "forcing wearable type " << wearable->getType() << " to version 22 from 24" << LL_ENDL;
- saveWearable(wearable->getType(),index);
+ U32 index;
+ if (getWearableIndex(wearable,index))
+ {
+ LL_INFOS() << "forcing wearable type " << wearable->getType() << " to version 22 from 24" << LL_ENDL;
+ wearable->setDefinitionVersion(22);
+ saveWearable(wearable->getType(),index);
+ }
}
checkWearableAgainstInventory(viewer_wearable);
@@ -949,7 +953,7 @@ void LLAgentWearables::removeWearableFinal(const LLWearableType::EType type, boo
LLViewerWearable* old_wearable = getViewerWearable(type,i);
if (old_wearable)
{
- popWearable(old_wearable);
+ eraseWearable(old_wearable);
old_wearable->removeFromAvatar();
}
}
@@ -961,7 +965,7 @@ void LLAgentWearables::removeWearableFinal(const LLWearableType::EType type, boo
if (old_wearable)
{
- popWearable(old_wearable);
+ eraseWearable(old_wearable);
old_wearable->removeFromAvatar();
}
}
@@ -982,6 +986,7 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
S32 matched = 0, mismatched = 0;
const S32 arr_size = LLWearableType::WT_COUNT;
S32 type_counts[arr_size];
+ BOOL update_inventory = FALSE;
std::fill(type_counts,type_counts+arr_size,0);
for (S32 i = 0; i < count; i++)
{
@@ -1009,10 +1014,9 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
continue;
}
- // Don't care about this case - ordering of wearables with the same asset id has no effect.
- // Causes the two-alphas error case in MAINT-4158.
+ // Update only inventory in this case - ordering of wearables with the same asset id has no effect.
+ // Updating wearables in this case causes the two-alphas error in MAINT-4158.
// We should actually disallow wearing two wearables with the same asset id.
-#if 0
if (curr_wearable->getName() != new_item->getName() ||
curr_wearable->getItemID() != new_item->getUUID())
{
@@ -1020,10 +1024,9 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
<< curr_wearable->getName() << " vs " << new_item->getName()
<< " item ids " << curr_wearable->getItemID() << " vs " << new_item->getUUID()
<< LL_ENDL;
- mismatched++;
+ update_inventory = TRUE;
continue;
}
-#endif
// If we got here, everything matches.
matched++;
}
@@ -1037,14 +1040,15 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
mismatched++;
}
}
- if (mismatched == 0)
+ if (mismatched == 0 && !update_inventory)
{
LL_DEBUGS("Avatar") << "no changes, bailing out" << LL_ENDL;
mCOFChangeInProgress = false;
return;
}
-
-
+
+ // updating inventory
+
// TODO: Removed check for ensuring that teens don't remove undershirt and underwear. Handle later
// note: shirt is the first non-body part wearable item. Update if wearable order changes.
// This loop should remove all clothing, but not any body parts
@@ -1065,7 +1069,8 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
if (new_wearable)
{
const LLWearableType::EType type = new_wearable->getType();
-
+
+ LLUUID old_wearable_id = new_wearable->getItemID();
new_wearable->setName(new_item->getName());
new_wearable->setItemID(new_item->getUUID());
@@ -1073,11 +1078,18 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
{
// exactly one wearable per body part
setWearable(type,0,new_wearable);
+ if (old_wearable_id.notNull())
+ {
+ // we changed id before setting wearable, update old item manually
+ // to complete the swap.
+ gInventory.addChangedMask(LLInventoryObserver::LABEL, old_wearable_id);
+ }
}
else
{
pushWearable(type,new_wearable);
}
+
const BOOL removed = FALSE;
wearableUpdated(new_wearable, removed);
}
@@ -1085,6 +1097,15 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
gInventory.notifyObservers();
+ if (mismatched == 0)
+ {
+ LL_DEBUGS("Avatar") << "inventory updated, wearable assets not changed, bailing out" << LL_ENDL;
+ mCOFChangeInProgress = false;
+ return;
+ }
+
+ // updating agent avatar
+
if (isAgentAvatarValid())
{
gAgentAvatarp->setCompositeUpdatesEnabled(TRUE);
@@ -1163,7 +1184,13 @@ bool LLAgentWearables::onSetWearableDialog(const LLSD& notification, const LLSD&
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLInventoryItem* new_item = gInventory.getItem(notification["payload"]["item_id"].asUUID());
- U32 index = gAgentWearables.getWearableIndex(wearable);
+ U32 index;
+ if (!gAgentWearables.getWearableIndex(wearable,index))
+ {
+ LL_WARNS() << "Wearable not found" << LL_ENDL;
+ delete wearable;
+ return false;
+ }
if (!new_item)
{
delete wearable;
@@ -1344,6 +1371,7 @@ void LLAgentWearables::userRemoveMultipleAttachments(llvo_vec_t& objects_to_remo
if (objects_to_remove.empty())
return;
+ LL_DEBUGS("Avatar") << "ATT [ObjectDetach] removing " << objects_to_remove.size() << " objects" << LL_ENDL;
gMessageSystem->newMessage("ObjectDetach");
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
@@ -1357,6 +1385,10 @@ void LLAgentWearables::userRemoveMultipleAttachments(llvo_vec_t& objects_to_remo
//gAgentAvatarp->resetJointPositionsOnDetach(objectp);
gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, objectp->getLocalID());
+ const LLUUID& item_id = objectp->getAttachmentItemID();
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ LL_DEBUGS("Avatar") << "ATT removing object, item is " << (item ? item->getName() : "UNKNOWN") << " " << item_id << LL_ENDL;
+ LLAttachmentsMgr::instance().onDetachRequested(item_id);
}
gMessageSystem->sendReliable(gAgent.getRegionHost());
}
@@ -1365,51 +1397,18 @@ void LLAgentWearables::userAttachMultipleAttachments(LLInventoryModel::item_arra
{
// Build a compound message to send all the objects that need to be rezzed.
S32 obj_count = obj_item_array.size();
-
- // Limit number of packets to send
- const S32 MAX_PACKETS_TO_SEND = 10;
- const S32 OBJECTS_PER_PACKET = 4;
- const S32 MAX_OBJECTS_TO_SEND = MAX_PACKETS_TO_SEND * OBJECTS_PER_PACKET;
- if( obj_count > MAX_OBJECTS_TO_SEND )
+ if (obj_count > 0)
{
- obj_count = MAX_OBJECTS_TO_SEND;
+ LL_DEBUGS("Avatar") << "ATT attaching multiple, total obj_count " << obj_count << LL_ENDL;
}
-
- // Create an id to keep the parts of the compound message together
- LLUUID compound_msg_id;
- compound_msg_id.generate();
- LLMessageSystem* msg = gMessageSystem;
- for(S32 i = 0; i < obj_count; ++i)
- {
- if( 0 == (i % OBJECTS_PER_PACKET) )
- {
- // Start a new message chunk
- msg->newMessageFast(_PREHASH_RezMultipleAttachmentsFromInv);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_HeaderData);
- msg->addUUIDFast(_PREHASH_CompoundMsgID, compound_msg_id );
- msg->addU8Fast(_PREHASH_TotalObjects, obj_count );
- msg->addBOOLFast(_PREHASH_FirstDetachAll, false );
- }
-
- const LLInventoryItem* item = obj_item_array.at(i).get();
- msg->nextBlockFast(_PREHASH_ObjectData );
- msg->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID());
- msg->addUUIDFast(_PREHASH_OwnerID, item->getPermissions().getOwner());
- msg->addU8Fast(_PREHASH_AttachmentPt, 0 | ATTACHMENT_ADD); // Wear at the previous or default attachment point
- pack_permissions_slam(msg, item->getFlags(), item->getPermissions());
- msg->addStringFast(_PREHASH_Name, item->getName());
- msg->addStringFast(_PREHASH_Description, item->getDescription());
-
- if( (i+1 == obj_count) || ((OBJECTS_PER_PACKET-1) == (i % OBJECTS_PER_PACKET)) )
- {
- // End of message chunk
- msg->sendReliable( gAgent.getRegion()->getHost() );
- }
- }
+ for(LLInventoryModel::item_array_t::const_iterator it = obj_item_array.begin();
+ it != obj_item_array.end();
+ ++it)
+ {
+ const LLInventoryItem* item = *it;
+ LLAttachmentsMgr::instance().addAttachmentRequest(item->getLinkedUUID(), 0, TRUE);
+ }
}
// Returns false if the given wearable is already topmost/bottommost
diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp
index 9d887a61f1..714b456ae7 100755
--- a/indra/newview/llaisapi.cpp
+++ b/indra/newview/llaisapi.cpp
@@ -315,7 +315,8 @@ SlamFolderCommand::SlamFolderCommand(const LLUUID& folder_id, const LLSD& conten
CopyLibraryCategoryCommand::CopyLibraryCategoryCommand(const LLUUID& source_id,
const LLUUID& dest_id,
- LLPointer<LLInventoryCallback> callback):
+ LLPointer<LLInventoryCallback> callback,
+ bool copy_subfolders):
AISCommand(callback)
{
std::string cap;
@@ -328,6 +329,10 @@ CopyLibraryCategoryCommand::CopyLibraryCategoryCommand(const LLUUID& source_id,
LLUUID tid;
tid.generate();
std::string url = cap + std::string("/category/") + source_id.asString() + "?tid=" + tid.asString();
+ if (!copy_subfolders)
+ {
+ url += ",depth=0";
+ }
LL_INFOS() << url << LL_ENDL;
LLCurl::ResponderPtr responder = this;
LLSD headers;
diff --git a/indra/newview/llaisapi.h b/indra/newview/llaisapi.h
index 5a2ec94af9..bb483fb133 100755
--- a/indra/newview/llaisapi.h
+++ b/indra/newview/llaisapi.h
@@ -124,7 +124,7 @@ private:
class CopyLibraryCategoryCommand: public AISCommand
{
public:
- CopyLibraryCategoryCommand(const LLUUID& source_id, const LLUUID& dest_id, LLPointer<LLInventoryCallback> callback);
+ CopyLibraryCategoryCommand(const LLUUID& source_id, const LLUUID& dest_id, LLPointer<LLInventoryCallback> callback, bool copy_subfolders = true);
protected:
/* virtual */ bool getResponseUUID(const LLSD& content, LLUUID& id);
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index a64d5b50b3..142a3250c8 100755
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -525,6 +525,15 @@ LLUpdateAppearanceAndEditWearableOnDestroy::LLUpdateAppearanceAndEditWearableOnD
{
}
+LLRequestServerAppearanceUpdateOnDestroy::~LLRequestServerAppearanceUpdateOnDestroy()
+{
+ LL_DEBUGS("Avatar") << "ATT requesting server appearance update" << LL_ENDL;
+ if (!LLApp::isExiting())
+ {
+ LLAppearanceMgr::instance().requestServerAppearanceUpdate();
+ }
+}
+
void edit_wearable_and_customize_avatar(LLUUID item_id)
{
// Start editing the item if previously requested.
@@ -828,6 +837,12 @@ void LLWearableHoldingPattern::onAllComplete()
// pre-attachment states.
gAgentAvatarp->clearAttachmentPosOverrides();
+ if (objects_to_remove.size() || items_to_add.size())
+ {
+ LL_DEBUGS("Avatar") << "ATT will remove " << objects_to_remove.size()
+ << " and add " << items_to_add.size() << " items" << LL_ENDL;
+ }
+
// Take off the attachments that will no longer be in the outfit.
LLAgentWearables::userRemoveMultipleAttachments(objects_to_remove);
@@ -1338,90 +1353,131 @@ void wear_on_avatar_cb(const LLUUID& inv_item, bool do_replace = false)
}
}
-bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear,
+void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear,
+ bool do_update,
+ bool replace,
+ LLPointer<LLInventoryCallback> cb)
+{
+ bool first = true;
+
+ LLInventoryObject::const_object_list_t items_to_link;
+
+ for (uuid_vec_t::const_iterator it = item_ids_to_wear.begin();
+ it != item_ids_to_wear.end();
+ ++it)
+ {
+ replace = first && replace;
+ first = false;
+
+ const LLUUID& item_id_to_wear = *it;
+
+ if (item_id_to_wear.isNull())
+ {
+ LL_DEBUGS("Avatar") << "null id " << item_id_to_wear << LL_ENDL;
+ continue;
+ }
+
+ LLViewerInventoryItem* item_to_wear = gInventory.getItem(item_id_to_wear);
+ if (!item_to_wear)
+ {
+ LL_DEBUGS("Avatar") << "inventory item not found for id " << item_id_to_wear << LL_ENDL;
+ continue;
+ }
+
+ if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getLibraryRootFolderID()))
+ {
+ LL_DEBUGS("Avatar") << "inventory item in library, will copy and wear "
+ << item_to_wear->getName() << " id " << item_id_to_wear << LL_ENDL;
+ LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(wear_on_avatar_cb,_1,replace));
+ copy_inventory_item(gAgent.getID(), item_to_wear->getPermissions().getOwner(),
+ item_to_wear->getUUID(), LLUUID::null, std::string(), cb);
+ continue;
+ }
+ else if (!gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getRootFolderID()))
+ {
+ // not in library and not in agent's inventory
+ LL_DEBUGS("Avatar") << "inventory item not in user inventory or library, skipping "
+ << item_to_wear->getName() << " id " << item_id_to_wear << LL_ENDL;
+ continue;
+ }
+ else if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH)))
+ {
+ LLNotificationsUtil::add("CannotWearTrash");
+ LL_DEBUGS("Avatar") << "inventory item is in trash, skipping "
+ << item_to_wear->getName() << " id " << item_id_to_wear << LL_ENDL;
+ continue;
+ }
+ else if (isLinkedInCOF(item_to_wear->getUUID())) // EXT-84911
+ {
+ LL_DEBUGS("Avatar") << "inventory item is already in COF, skipping "
+ << item_to_wear->getName() << " id " << item_id_to_wear << LL_ENDL;
+ continue;
+ }
+
+ switch (item_to_wear->getType())
+ {
+ case LLAssetType::AT_CLOTHING:
+ {
+ if (gAgentWearables.areWearablesLoaded())
+ {
+ if (!cb && do_update)
+ {
+ cb = new LLUpdateAppearanceAndEditWearableOnDestroy(item_id_to_wear);
+ }
+ LLWearableType::EType type = item_to_wear->getWearableType();
+ S32 wearable_count = gAgentWearables.getWearableCount(type);
+ if ((replace && wearable_count != 0) || !gAgentWearables.canAddWearable(type))
+ {
+ LLUUID item_id = gAgentWearables.getWearableItemID(item_to_wear->getWearableType(),
+ wearable_count-1);
+ removeCOFItemLinks(item_id, cb);
+ }
+
+ items_to_link.push_back(item_to_wear);
+ }
+ }
+ break;
+
+ case LLAssetType::AT_BODYPART:
+ {
+ // TODO: investigate wearables may not be loaded at this point EXT-8231
+
+ // Remove the existing wearables of the same type.
+ // Remove existing body parts anyway because we must not be able to wear e.g. two skins.
+ removeCOFLinksOfType(item_to_wear->getWearableType());
+ if (!cb && do_update)
+ {
+ cb = new LLUpdateAppearanceAndEditWearableOnDestroy(item_id_to_wear);
+ }
+ items_to_link.push_back(item_to_wear);
+ }
+ break;
+
+ case LLAssetType::AT_OBJECT:
+ {
+ rez_attachment(item_to_wear, NULL, replace);
+ }
+ break;
+
+ default: continue;
+ }
+ }
+
+ // Batch up COF link creation - more efficient if using AIS.
+ if (items_to_link.size())
+ {
+ link_inventory_array(getCOF(), items_to_link, cb);
+ }
+}
+
+void LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear,
bool do_update,
bool replace,
LLPointer<LLInventoryCallback> cb)
{
-
- if (item_id_to_wear.isNull()) return false;
-
- // *TODO: issue with multi-wearable should be fixed:
- // in this case this method will be called N times - loading started for each item
- // and than N times will be called - loading completed for each item.
- // That means subscribers will be notified that loading is done after first item in a batch is worn.
- // (loading indicator disappears for example before all selected items are worn)
- // Have not fix this issue for 2.1 because of stability reason. EXT-7777.
-
- // Disabled for now because it is *not* acceptable to call updateAppearanceFromCOF() multiple times
-// gAgentWearables.notifyLoadingStarted();
-
- LLViewerInventoryItem* item_to_wear = gInventory.getItem(item_id_to_wear);
- if (!item_to_wear) return false;
-
- if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getLibraryRootFolderID()))
- {
- LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(wear_on_avatar_cb,_1,replace));
- copy_inventory_item(gAgent.getID(), item_to_wear->getPermissions().getOwner(), item_to_wear->getUUID(), LLUUID::null, std::string(), cb);
- return false;
- }
- else if (!gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getRootFolderID()))
- {
- return false; // not in library and not in agent's inventory
- }
- else if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH)))
- {
- LLNotificationsUtil::add("CannotWearTrash");
- return false;
- }
- else if (isLinkedInCOF(item_to_wear->getUUID())) // EXT-84911
- {
- return false;
- }
-
- switch (item_to_wear->getType())
- {
- case LLAssetType::AT_CLOTHING:
- if (gAgentWearables.areWearablesLoaded())
- {
- if (!cb && do_update)
- {
- cb = new LLUpdateAppearanceAndEditWearableOnDestroy(item_id_to_wear);
- }
- S32 wearable_count = gAgentWearables.getWearableCount(item_to_wear->getWearableType());
- if ((replace && wearable_count != 0) ||
- (wearable_count >= LLAgentWearables::MAX_CLOTHING_PER_TYPE) )
- {
- LLUUID item_id = gAgentWearables.getWearableItemID(item_to_wear->getWearableType(),
- wearable_count-1);
- removeCOFItemLinks(item_id, cb);
- }
-
- addCOFItemLink(item_to_wear, cb);
- }
- break;
-
- case LLAssetType::AT_BODYPART:
- // TODO: investigate wearables may not be loaded at this point EXT-8231
-
- // Remove the existing wearables of the same type.
- // Remove existing body parts anyway because we must not be able to wear e.g. two skins.
- removeCOFLinksOfType(item_to_wear->getWearableType());
- if (!cb && do_update)
- {
- cb = new LLUpdateAppearanceAndEditWearableOnDestroy(item_id_to_wear);
- }
- addCOFItemLink(item_to_wear, cb);
- break;
-
- case LLAssetType::AT_OBJECT:
- rez_attachment(item_to_wear, NULL, replace);
- break;
-
- default: return false;;
- }
-
- return true;
+ uuid_vec_t ids;
+ ids.push_back(item_id_to_wear);
+ wearItemsOnAvatar(ids, do_update, replace, cb);
}
// Update appearance from outfit folder.
@@ -1730,9 +1786,15 @@ bool LLAppearanceMgr::getCanRemoveFromCOF(const LLUUID& outfit_cat_id)
{
return false;
}
-
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
LLFindWearablesEx is_worn(/*is_worn=*/ true, /*include_body_parts=*/ false);
- return gInventory.hasMatchingDirectDescendent(outfit_cat_id, is_worn);
+ gInventory.collectDescendentsIf(outfit_cat_id,
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ is_worn);
+ return items.size() > 0;
}
// static
@@ -1782,6 +1844,53 @@ bool LLAppearanceMgr::getCanReplaceCOF(const LLUUID& outfit_cat_id)
return items.size() > 0;
}
+// Moved from LLWearableList::ContextMenu for wider utility.
+bool LLAppearanceMgr::canAddWearables(const uuid_vec_t& item_ids)
+{
+ // TODO: investigate wearables may not be loaded at this point EXT-8231
+
+ U32 n_objects = 0;
+ U32 n_clothes = 0;
+
+ // Count given clothes (by wearable type) and objects.
+ for (uuid_vec_t::const_iterator it = item_ids.begin(); it != item_ids.end(); ++it)
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(*it);
+ if (!item)
+ {
+ return false;
+ }
+
+ if (item->getType() == LLAssetType::AT_OBJECT)
+ {
+ ++n_objects;
+ }
+ else if (item->getType() == LLAssetType::AT_CLOTHING)
+ {
+ ++n_clothes;
+ }
+ else if (item->getType() == LLAssetType::AT_BODYPART)
+ {
+ return isAgentAvatarValid();
+ }
+ else
+ {
+ LL_WARNS() << "Unexpected wearable type" << LL_ENDL;
+ return false;
+ }
+ }
+
+ // Check whether we can add all the objects.
+ if (!isAgentAvatarValid() || !gAgentAvatarp->canAttachMoreObjects(n_objects))
+ {
+ return false;
+ }
+
+ // Check whether we can add all the clothes.
+ U32 sum_clothes = n_clothes + gAgentWearables.getClothingLayerCount();
+ return sum_clothes <= LLAgentWearables::MAX_CLOTHING_LAYERS;
+}
+
void LLAppearanceMgr::purgeBaseOutfitLink(const LLUUID& category, LLPointer<LLInventoryCallback> cb)
{
LLInventoryModel::cat_array_t cats;
@@ -1804,25 +1913,39 @@ void LLAppearanceMgr::purgeBaseOutfitLink(const LLUUID& category, LLPointer<LLIn
// Keep the last N wearables of each type. For viewer 2.0, N is 1 for
// both body parts and clothing items.
void LLAppearanceMgr::filterWearableItems(
- LLInventoryModel::item_array_t& items, S32 max_per_type)
-{
- // Divvy items into arrays by wearable type.
- std::vector<LLInventoryModel::item_array_t> items_by_type(LLWearableType::WT_COUNT);
- divvyWearablesByType(items, items_by_type);
-
- // rebuild items list, retaining the last max_per_type of each array
- items.clear();
- for (S32 i=0; i<LLWearableType::WT_COUNT; i++)
- {
- S32 size = items_by_type[i].size();
- if (size <= 0)
- continue;
- S32 start_index = llmax(0,size-max_per_type);
- for (S32 j = start_index; j<size; j++)
- {
- items.push_back(items_by_type[i][j]);
- }
- }
+ LLInventoryModel::item_array_t& items, S32 max_per_type, S32 max_total)
+{
+ // Restrict by max total items first.
+ if ((max_total > 0) && (items.size() > max_total))
+ {
+ LLInventoryModel::item_array_t items_to_keep;
+ for (S32 i=0; i<max_total; i++)
+ {
+ items_to_keep.push_back(items[i]);
+ }
+ items = items_to_keep;
+ }
+
+ if (max_per_type > 0)
+ {
+ // Divvy items into arrays by wearable type.
+ std::vector<LLInventoryModel::item_array_t> items_by_type(LLWearableType::WT_COUNT);
+ divvyWearablesByType(items, items_by_type);
+
+ // rebuild items list, retaining the last max_per_type of each array
+ items.clear();
+ for (S32 i=0; i<LLWearableType::WT_COUNT; i++)
+ {
+ S32 size = items_by_type[i].size();
+ if (size <= 0)
+ continue;
+ S32 start_index = llmax(0,size-max_per_type);
+ for (S32 j = start_index; j<size; j++)
+ {
+ items.push_back(items_by_type[i][j]);
+ }
+ }
+ }
}
void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)
@@ -1864,7 +1987,7 @@ void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)
reverse(body_items.begin(), body_items.end());
// Reduce body items to max of one per type.
removeDuplicateItems(body_items);
- filterWearableItems(body_items, 1);
+ filterWearableItems(body_items, 1, 0);
// - Wearables: include COF contents only if appending.
LLInventoryModel::item_array_t wear_items;
@@ -1873,7 +1996,7 @@ void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)
getDescendentsOfAssetType(category, wear_items, LLAssetType::AT_CLOTHING);
// Reduce wearables to max of one per type.
removeDuplicateItems(wear_items);
- filterWearableItems(wear_items, LLAgentWearables::MAX_CLOTHING_PER_TYPE);
+ filterWearableItems(wear_items, 0, LLAgentWearables::MAX_CLOTHING_LAYERS);
// - Attachments: include COF contents only if appending.
LLInventoryModel::item_array_t obj_items;
@@ -2062,7 +2185,8 @@ void item_array_diff(LLInventoryModel::item_array_t& full_list,
S32 LLAppearanceMgr::findExcessOrDuplicateItems(const LLUUID& cat_id,
LLAssetType::EType type,
- S32 max_items,
+ S32 max_items_per_type,
+ S32 max_items_total,
LLInventoryObject::object_list_t& items_to_kill)
{
S32 to_kill_count = 0;
@@ -2071,9 +2195,9 @@ S32 LLAppearanceMgr::findExcessOrDuplicateItems(const LLUUID& cat_id,
getDescendentsOfAssetType(cat_id, items, type);
LLInventoryModel::item_array_t curr_items = items;
removeDuplicateItems(items);
- if (max_items > 0)
+ if (max_items_per_type > 0 || max_items_total > 0)
{
- filterWearableItems(items, max_items);
+ filterWearableItems(items, max_items_per_type, max_items_total);
}
LLInventoryModel::item_array_t kill_items;
item_array_diff(curr_items,items,kill_items);
@@ -2092,11 +2216,11 @@ void LLAppearanceMgr::findAllExcessOrDuplicateItems(const LLUUID& cat_id,
LLInventoryObject::object_list_t& items_to_kill)
{
findExcessOrDuplicateItems(cat_id,LLAssetType::AT_BODYPART,
- 1, items_to_kill);
+ 1, 0, items_to_kill);
findExcessOrDuplicateItems(cat_id,LLAssetType::AT_CLOTHING,
- LLAgentWearables::MAX_CLOTHING_PER_TYPE, items_to_kill);
+ 0, LLAgentWearables::MAX_CLOTHING_LAYERS, items_to_kill);
findExcessOrDuplicateItems(cat_id,LLAssetType::AT_OBJECT,
- -1, items_to_kill);
+ 0, 0, items_to_kill);
}
void LLAppearanceMgr::enforceCOFItemRestrictions(LLPointer<LLInventoryCallback> cb)
@@ -2351,7 +2475,7 @@ void LLAppearanceMgr::wearInventoryCategory(LLInventoryCategory* category, bool
LLPointer<LLInventoryCallback> copy_cb = new LLWearCategoryAfterCopy(append);
LLPointer<LLInventoryCallback> track_cb = new LLTrackPhaseWrapper(
std::string("wear_inventory_category_callback"), copy_cb);
- LLPointer<AISCommand> cmd_ptr = new CopyLibraryCategoryCommand(category->getUUID(), parent_id, track_cb);
+ LLPointer<AISCommand> cmd_ptr = new CopyLibraryCategoryCommand(category->getUUID(), parent_id, track_cb, false);
ais_ran=cmd_ptr->run_command();
}
@@ -2588,7 +2712,6 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item,
item_array,
LLInventoryModel::EXCLUDE_TRASH);
bool linked_already = false;
- U32 count = 0;
for (S32 i=0; i<item_array.size(); i++)
{
// Are these links to the same object?
@@ -2608,14 +2731,13 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item,
// type? If so, new item will replace old.
else if ((vitem->isWearableType()) && (vitem->getWearableType() == wearable_type))
{
- ++count;
- if (is_body_part && inv_item->getIsLinkType() && (vitem->getWearableType() == wearable_type))
+ if (is_body_part && inv_item->getIsLinkType())
{
remove_inventory_item(inv_item->getUUID(), cb);
}
- else if (count >= LLAgentWearables::MAX_CLOTHING_PER_TYPE)
+ else if (!gAgentWearables.canAddWearable(wearable_type))
{
- // MULTI-WEARABLES: make sure we don't go over MAX_CLOTHING_PER_TYPE
+ // MULTI-WEARABLES: make sure we don't go over clothing limits
remove_inventory_item(inv_item->getUUID(), cb);
}
}
@@ -2632,28 +2754,23 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item,
LLInventoryModel::item_array_t LLAppearanceMgr::findCOFItemLinks(const LLUUID& item_id)
{
-
LLInventoryModel::item_array_t result;
- const LLViewerInventoryItem *vitem =
- dynamic_cast<const LLViewerInventoryItem*>(gInventory.getItem(item_id));
- if (vitem)
- {
- LLInventoryModel::cat_array_t cat_array;
- LLInventoryModel::item_array_t item_array;
- gInventory.collectDescendents(LLAppearanceMgr::getCOF(),
- cat_array,
- item_array,
- LLInventoryModel::EXCLUDE_TRASH);
- for (S32 i=0; i<item_array.size(); i++)
- {
- const LLViewerInventoryItem* inv_item = item_array.at(i).get();
- if (inv_item->getLinkedUUID() == vitem->getLinkedUUID())
- {
- result.push_back(item_array.at(i));
- }
- }
- }
+ LLUUID linked_id = gInventory.getLinkedItemID(item_id);
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+ gInventory.collectDescendents(LLAppearanceMgr::getCOF(),
+ cat_array,
+ item_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+ for (S32 i=0; i<item_array.size(); i++)
+ {
+ const LLViewerInventoryItem* inv_item = item_array.at(i).get();
+ if (inv_item->getLinkedUUID() == linked_id)
+ {
+ result.push_back(item_array.at(i));
+ }
+ }
return result;
}
@@ -3230,7 +3347,7 @@ void RequestAgentUpdateAppearanceResponder::onRequestRequested()
}
// Actually send the request.
- LL_DEBUGS("Avatar") << "Will send request for cof_version " << cof_version << LL_ENDL;
+ LL_DEBUGS("Avatar") << "ATT sending bake request for cof_version " << cof_version << LL_ENDL;
mRetryPolicy->reset();
sendRequest();
}
@@ -3703,6 +3820,11 @@ void LLAppearanceMgr::removeItemsFromAvatar(const uuid_vec_t& ids_to_remove)
{
const LLUUID& id_to_remove = *it;
const LLUUID& linked_item_id = gInventory.getLinkedItemID(id_to_remove);
+ LLViewerInventoryItem *item = gInventory.getItem(linked_item_id);
+ if (item && item->getType() == LLAssetType::AT_OBJECT)
+ {
+ LL_DEBUGS("Avatar") << "ATT removing attachment " << item->getName() << " id " << item->getUUID() << LL_ENDL;
+ }
removeCOFItemLinks(linked_item_id, cb);
addDoomedTempAttachment(linked_item_id);
}
@@ -3710,10 +3832,9 @@ void LLAppearanceMgr::removeItemsFromAvatar(const uuid_vec_t& ids_to_remove)
void LLAppearanceMgr::removeItemFromAvatar(const LLUUID& id_to_remove)
{
- LLUUID linked_item_id = gInventory.getLinkedItemID(id_to_remove);
- LLPointer<LLInventoryCallback> cb = new LLUpdateAppearanceOnDestroy;
- removeCOFItemLinks(linked_item_id, cb);
- addDoomedTempAttachment(linked_item_id);
+ uuid_vec_t ids_to_remove;
+ ids_to_remove.push_back(id_to_remove);
+ removeItemsFromAvatar(ids_to_remove);
}
@@ -3898,37 +4019,32 @@ void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg)
void LLAppearanceMgr::registerAttachment(const LLUUID& item_id)
{
- gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
-
- if (mAttachmentInvLinkEnabled)
- {
- // we have to pass do_update = true to call LLAppearanceMgr::updateAppearanceFromCOF.
- // it will trigger gAgentWariables.notifyLoadingFinished()
- // But it is not acceptable solution. See EXT-7777
- if (!isLinkedInCOF(item_id))
- {
- LLPointer<LLInventoryCallback> cb = new LLUpdateAppearanceOnDestroy();
- LLAppearanceMgr::addCOFItemLink(item_id, cb); // Add COF link for item.
- }
- }
- else
- {
- //LL_INFOS() << "no link changes, inv link not enabled" << LL_ENDL;
- }
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ LL_DEBUGS("Avatar") << "ATT registering attachment "
+ << (item ? item->getName() : "UNKNOWN") << " " << item_id << LL_ENDL;
+ gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
+
+ LLAttachmentsMgr::instance().onAttachmentArrived(item_id);
}
void LLAppearanceMgr::unregisterAttachment(const LLUUID& item_id)
{
- gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ LL_DEBUGS("Avatar") << "ATT unregistering attachment "
+ << (item ? item->getName() : "UNKNOWN") << " " << item_id << LL_ENDL;
+ gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
- if (mAttachmentInvLinkEnabled)
- {
- LLAppearanceMgr::removeCOFItemLinks(item_id);
- }
- else
- {
- //LL_INFOS() << "no link changes, inv link not enabled" << LL_ENDL;
- }
+ LLAttachmentsMgr::instance().onDetachCompleted(item_id);
+ if (mAttachmentInvLinkEnabled && isLinkedInCOF(item_id))
+ {
+ LL_DEBUGS("Avatar") << "ATT removing COF link for attachment "
+ << (item ? item->getName() : "UNKNOWN") << " " << item_id << LL_ENDL;
+ LLAppearanceMgr::removeCOFItemLinks(item_id);
+ }
+ else
+ {
+ //LL_INFOS() << "no link changes, inv link not enabled" << LL_ENDL;
+ }
}
BOOL LLAppearanceMgr::getIsInCOF(const LLUUID& obj_id) const
@@ -3942,14 +4058,6 @@ BOOL LLAppearanceMgr::getIsInCOF(const LLUUID& obj_id) const
return FALSE;
}
-// static
-bool LLAppearanceMgr::isLinkInCOF(const LLUUID& obj_id)
-{
- const LLUUID& target_id = gInventory.getLinkedItemID(obj_id);
- LLLinkedItemIDMatches find_links(target_id);
- return gInventory.hasMatchingDirectDescendent(LLAppearanceMgr::instance().getCOF(), find_links);
-}
-
BOOL LLAppearanceMgr::getIsProtectedCOFItem(const LLUUID& obj_id) const
{
if (!getIsInCOF(obj_id)) return FALSE;
@@ -4068,19 +4176,56 @@ void callAfterCategoryFetch(const LLUUID& cat_id, nullary_func_t cb)
}
}
+void add_wearable_type_counts(const uuid_vec_t& ids,
+ S32& clothing_count,
+ S32& bodypart_count,
+ S32& object_count,
+ S32& other_count)
+{
+ for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
+ {
+ const LLUUID& item_id_to_wear = *it;
+ LLViewerInventoryItem* item_to_wear = gInventory.getItem(item_id_to_wear);
+ if (item_to_wear)
+ {
+ if (item_to_wear->getType() == LLAssetType::AT_CLOTHING)
+ {
+ clothing_count++;
+ }
+ else if (item_to_wear->getType() == LLAssetType::AT_BODYPART)
+ {
+ bodypart_count++;
+ }
+ else if (item_to_wear->getType() == LLAssetType::AT_OBJECT)
+ {
+ object_count++;
+ }
+ else
+ {
+ other_count++;
+ }
+ }
+ else
+ {
+ other_count++;
+ }
+ }
+}
+
void wear_multiple(const uuid_vec_t& ids, bool replace)
{
- LLPointer<LLInventoryCallback> cb = new LLUpdateAppearanceOnDestroy;
-
- bool first = true;
- uuid_vec_t::const_iterator it;
- for (it = ids.begin(); it != ids.end(); ++it)
- {
- // if replace is requested, the first item worn will replace the current top
- // item, and others will be added.
- LLAppearanceMgr::instance().wearItemOnAvatar(*it,false,first && replace,cb);
- first = false;
- }
+ S32 clothing_count = 0;
+ S32 bodypart_count = 0;
+ S32 object_count = 0;
+ S32 other_count = 0;
+ add_wearable_type_counts(ids, clothing_count, bodypart_count, object_count, other_count);
+
+ LLPointer<LLInventoryCallback> cb = NULL;
+ if (clothing_count > 0 || bodypart_count > 0)
+ {
+ cb = new LLUpdateAppearanceOnDestroy;
+ }
+ LLAppearanceMgr::instance().wearItemsOnAvatar(ids, true, replace, cb);
}
// SLapp for easy-wearing of a stock (library) avatar
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 7742a19c07..4ed8c1bfb9 100755
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -67,7 +67,8 @@ public:
void addCategoryToCurrentOutfit(const LLUUID& cat_id);
S32 findExcessOrDuplicateItems(const LLUUID& cat_id,
LLAssetType::EType type,
- S32 max_items,
+ S32 max_items_per_type,
+ S32 max_items_total,
LLInventoryObject::object_list_t& items_to_kill);
void findAllExcessOrDuplicateItems(const LLUUID& cat_id,
LLInventoryObject::object_list_t& items_to_kill);
@@ -99,6 +100,9 @@ public:
// Determine whether we can replace current outfit with the given one.
bool getCanReplaceCOF(const LLUUID& outfit_cat_id);
+ // Can we add all referenced items to the avatar?
+ bool canAddWearables(const uuid_vec_t& item_ids);
+
// Copy all items in a category.
void shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id,
LLPointer<LLInventoryCallback> cb);
@@ -117,8 +121,13 @@ public:
// find the UUID of the currently worn outfit (Base Outfit)
const LLUUID getBaseOutfitUUID();
+ void wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear,
+ bool do_update,
+ bool replace,
+ LLPointer<LLInventoryCallback> cb = NULL);
+
// Wear/attach an item (from a user's inventory) on the agent
- bool wearItemOnAvatar(const LLUUID& item_to_wear, bool do_update, bool replace = false,
+ void wearItemOnAvatar(const LLUUID& item_to_wear, bool do_update, bool replace = false,
LLPointer<LLInventoryCallback> cb = NULL);
// Update the displayed outfit name in UI.
@@ -235,7 +244,7 @@ protected:
private:
- void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type);
+ void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type, S32 max_total);
void getDescendentsOfAssetType(const LLUUID& category,
LLInventoryModel::item_array_t& items,
@@ -275,11 +284,6 @@ public:
BOOL getIsInCOF(const LLUUID& obj_id) const;
// Is this in the COF and can the user delete it from the COF?
BOOL getIsProtectedCOFItem(const LLUUID& obj_id) const;
-
- /**
- * Checks if COF contains link to specified object.
- */
- static bool isLinkInCOF(const LLUUID& obj_id);
};
class LLUpdateAppearanceOnDestroy: public LLInventoryCallback
@@ -311,6 +315,15 @@ private:
LLUUID mItemID;
};
+class LLRequestServerAppearanceUpdateOnDestroy: public LLInventoryCallback
+{
+public:
+ LLRequestServerAppearanceUpdateOnDestroy() {}
+ ~LLRequestServerAppearanceUpdateOnDestroy();
+
+ /* virtual */ void fire(const LLUUID& item_id) {}
+};
+
LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id,const std::string& name);
// Invoke a given callable after category contents are fully fetched.
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 6dc71bc94e..5a88db0ff4 100755
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -105,6 +105,7 @@
// Linden library includes
#include "llavatarnamecache.h"
#include "lldiriterator.h"
+#include "llexperiencecache.h"
#include "llimagej2c.h"
#include "llmemory.h"
#include "llprimitive.h"
@@ -588,7 +589,7 @@ static void settings_to_globals()
LLVOTree::sTreeFactor = gSavedSettings.getF32("RenderTreeLODFactor");
LLVOAvatar::sLODFactor = gSavedSettings.getF32("RenderAvatarLODFactor");
LLVOAvatar::sPhysicsLODFactor = gSavedSettings.getF32("RenderAvatarPhysicsLODFactor");
- LLVOAvatar::sMaxVisible = (U32)gSavedSettings.getS32("RenderAvatarMaxVisible");
+ LLVOAvatar::updateImpostorRendering(gSavedSettings.getU32("RenderAvatarMaxNonImpostors"));
LLVOAvatar::sVisibleInFirstPerson = gSavedSettings.getBOOL("FirstPersonAvatarVisible");
// clamp auto-open time to some minimum usable value
LLFolderView::sAutoOpenTime = llmax(0.25f, gSavedSettings.getF32("FolderAutoOpenDelay"));
@@ -610,7 +611,6 @@ static void settings_modify()
LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderDeferred");
LLPipeline::sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
LLPipeline::sRenderDeferred = LLPipeline::sRenderBump && gSavedSettings.getBOOL("RenderDeferred");
- LLVOAvatar::sUseImpostors = gSavedSettings.getBOOL("RenderUseImpostors");
LLVOSurfacePatch::sLODFactor = gSavedSettings.getF32("RenderTerrainLODFactor");
LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; //square lod factor to get exponential range of [1,4]
gDebugGL = gSavedSettings.getBOOL("RenderDebugGL") || gDebugSession;
@@ -2783,10 +2783,12 @@ bool LLAppViewer::initConfiguration()
//
gWindowTitle = LLTrans::getString("APP_NAME");
#if LL_DEBUG
- gWindowTitle += std::string(" [DEBUG] ") + gArgs;
-#else
- gWindowTitle += std::string(" ") + gArgs;
+ gWindowTitle += std::string(" [DEBUG]")
#endif
+ if (!gArgs.empty())
+ {
+ gWindowTitle += std::string(" ") + gArgs;
+ }
LLStringUtil::truncate(gWindowTitle, 255);
//RN: if we received a URL, hand it off to the existing instance.
@@ -3090,8 +3092,8 @@ void LLAppViewer::initUpdater()
U32 check_period = gSavedSettings.getU32("UpdaterServiceCheckPeriod");
bool willing_to_test;
LL_DEBUGS("UpdaterService") << "channel " << channel << LL_ENDL;
- static const boost::regex is_test_channel("\\bTest$");
- if (boost::regex_search(channel, is_test_channel))
+
+ if (LLVersionInfo::TEST_VIEWER == LLVersionInfo::getViewerMaturity())
{
LL_INFOS("UpdaterService") << "Test build: overriding willing_to_test by sending testno" << LL_ENDL;
willing_to_test = false;
@@ -4698,6 +4700,32 @@ void LLAppViewer::saveNameCache()
}
}
+
+void LLAppViewer::saveExperienceCache()
+{
+ std::string filename =
+ gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "experience_cache.xml");
+ LL_INFOS("ExperienceCache") << "Saving " << filename << LL_ENDL;
+ llofstream cache_stream(filename.c_str());
+ if(cache_stream.is_open())
+ {
+ LLExperienceCache::exportFile(cache_stream);
+ }
+}
+
+void LLAppViewer::loadExperienceCache()
+{
+ std::string filename =
+ gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "experience_cache.xml");
+ LL_INFOS("ExperienceCache") << "Loading " << filename << LL_ENDL;
+ llifstream cache_stream(filename.c_str());
+ if(cache_stream.is_open())
+ {
+ LLExperienceCache::importFile(cache_stream);
+ }
+}
+
+
/*! @brief This class is an LLFrameTimer that can be created with
an elapsed time that starts counting up from the given value
rather than 0.0.
@@ -4893,7 +4921,7 @@ void LLAppViewer::idle()
// floating throughout the various object lists.
//
idleNameCache();
-
+ idleExperienceCache();
idleNetwork();
@@ -4921,6 +4949,7 @@ void LLAppViewer::idle()
gIdleCallbacks.callFunctions();
gInventory.idleNotifyObservers();
+ LLAvatarTracker::instance().idleNotifyObservers();
}
// Metrics logging (LLViewerAssetStats, etc.)
@@ -5106,7 +5135,7 @@ void LLAppViewer::idle()
}
// Update AV render info
- LLAvatarRenderInfoAccountant::idle();
+ LLAvatarRenderInfoAccountant::getInstance()->idle();
{
LL_RECORD_BLOCK_TIME(FTM_AUDIO_UPDATE);
@@ -5323,6 +5352,22 @@ void LLAppViewer::idleNameCache()
LLAvatarNameCache::idle();
}
+void LLAppViewer::idleExperienceCache()
+{
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region) return;
+
+ std::string lookup_url=region->getCapability("GetExperienceInfo");
+ if(!lookup_url.empty() && *lookup_url.rbegin() != '/')
+ {
+ lookup_url += '/';
+ }
+
+ LLExperienceCache::setLookupURL(lookup_url);
+
+ LLExperienceCache::idle();
+}
+
//
// Handle messages, and all message related stuff
//
@@ -5485,6 +5530,7 @@ void LLAppViewer::disconnectViewer()
}
saveNameCache();
+ saveExperienceCache();
// close inventory interface, close all windows
LLFloaterInventory::cleanup();
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index e8a1ca036b..718871138e 100755
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -122,6 +122,9 @@ public:
void loadNameCache();
void saveNameCache();
+ void loadExperienceCache();
+ void saveExperienceCache();
+
void removeMarkerFiles();
void removeDumpDir();
@@ -230,6 +233,7 @@ private:
void idle();
void idleShutdown();
// update avatar SLID and display name caches
+ void idleExperienceCache();
void idleNameCache();
void idleNetwork();
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index 56154a2de3..09227806fd 100755
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -62,9 +62,10 @@ namespace
// They are not used immediately by the app.
int gArgC;
char** gArgV;
- LLAppViewerMacOSX* gViewerAppPtr;
+ LLAppViewerMacOSX* gViewerAppPtr = NULL;
void (*gOldTerminateHandler)() = NULL;
+ std::string gHandleSLURL;
}
static void exceptionTerminateHandler()
@@ -107,7 +108,11 @@ bool initViewer()
{
LL_WARNS() << "Application init failed." << LL_ENDL;
}
-
+ else if (!gHandleSLURL.empty())
+ {
+ dispatchUrl(gHandleSLURL);
+ gHandleSLURL = "";
+ }
return ok;
}
@@ -393,22 +398,31 @@ bool LLAppViewerMacOSX::getMasterSystemAudioMute()
void handleUrl(const char* url_utf8)
{
- if (url_utf8)
+ if (url_utf8 && gViewerAppPtr)
{
- std::string url = url_utf8;
- // Safari 3.2 silently mangles secondlife:///app/ URLs into
- // secondlife:/app/ (only one leading slash).
- // Fix them up to meet the URL specification. JC
- const std::string prefix = "secondlife:/app/";
- std::string test_prefix = url.substr(0, prefix.length());
- LLStringUtil::toLower(test_prefix);
- if (test_prefix == prefix)
- {
- url.replace(0, prefix.length(), "secondlife:///app/");
- }
-
- LLMediaCtrl* web = NULL;
- const bool trusted_browser = false;
- LLURLDispatcher::dispatch(url, "", web, trusted_browser);
+ gHandleSLURL = "";
+ dispatchUrl(url_utf8);
}
+ else if (url_utf8)
+ {
+ gHandleSLURL = url_utf8;
+ }
+}
+
+void dispatchUrl(std::string url)
+{
+ // Safari 3.2 silently mangles secondlife:///app/ URLs into
+ // secondlife:/app/ (only one leading slash).
+ // Fix them up to meet the URL specification. JC
+ const std::string prefix = "secondlife:/app/";
+ std::string test_prefix = url.substr(0, prefix.length());
+ LLStringUtil::toLower(test_prefix);
+ if (test_prefix == prefix)
+ {
+ url.replace(0, prefix.length(), "secondlife:///app/");
+ }
+
+ LLMediaCtrl* web = NULL;
+ const bool trusted_browser = false;
+ LLURLDispatcher::dispatch(url, "", web, trusted_browser);
}
diff --git a/indra/newview/llassetuploadqueue.cpp b/indra/newview/llassetuploadqueue.cpp
index 8833c57948..359ee1e221 100755
--- a/indra/newview/llassetuploadqueue.cpp
+++ b/indra/newview/llassetuploadqueue.cpp
@@ -168,6 +168,7 @@ void LLAssetUploadQueue::request(LLAssetUploadQueueSupplier** supplier)
body["item_id"] = data.mItemId;
body["is_script_running"] = data.mIsRunning;
body["target"] = data.mIsTargetMono? "mono" : "lsl2";
+ body["experience"] = data.mExperienceId;
std::string url = "";
LLViewerObject* object = gObjectList.findObject(data.mTaskId);
@@ -191,7 +192,8 @@ void LLAssetUploadQueue::queue(const std::string& filename,
const LLUUID& queue_id,
U8* script_data,
U32 data_size,
- std::string script_name)
+ std::string script_name,
+ const LLUUID& experience_id)
{
UploadData data;
data.mTaskId = task_id;
@@ -203,6 +205,7 @@ void LLAssetUploadQueue::queue(const std::string& filename,
data.mData = script_data;
data.mDataSize = data_size;
data.mScriptName = script_name;
+ data.mExperienceId = experience_id;
mQueue.push_back(data);
diff --git a/indra/newview/llassetuploadqueue.h b/indra/newview/llassetuploadqueue.h
index 434f3e5c03..2ceee8f700 100755
--- a/indra/newview/llassetuploadqueue.h
+++ b/indra/newview/llassetuploadqueue.h
@@ -50,7 +50,8 @@ public:
const LLUUID& queue_id,
U8* data,
U32 data_size,
- std::string script_name);
+ std::string script_name,
+ const LLUUID& experience_id);
bool isEmpty() const {return mQueue.empty();}
@@ -69,6 +70,7 @@ private:
U8* mData;
U32 mDataSize;
std::string mScriptName;
+ LLUUID mExperienceId;
};
// Ownership of mSupplier passed to currently waiting responder
diff --git a/indra/newview/llattachmentsmgr.cpp b/indra/newview/llattachmentsmgr.cpp
index 256980eb04..d3e66289d1 100755
--- a/indra/newview/llattachmentsmgr.cpp
+++ b/indra/newview/llattachmentsmgr.cpp
@@ -27,15 +27,24 @@
#include "llviewerprecompiledheaders.h"
#include "llattachmentsmgr.h"
+#include "llvoavatarself.h"
#include "llagent.h"
+#include "llappearancemgr.h"
#include "llinventorymodel.h"
#include "lltooldraganddrop.h" // pack_permissions_slam
#include "llviewerinventory.h"
#include "llviewerregion.h"
#include "message.h"
+const F32 COF_LINK_BATCH_TIME = 5.0F;
+const F32 MAX_ATTACHMENT_REQUEST_LIFETIME = 30.0F;
+const F32 MIN_RETRY_REQUEST_TIME = 5.0F;
+const F32 MAX_BAD_COF_TIME = 30.0F;
-LLAttachmentsMgr::LLAttachmentsMgr()
+LLAttachmentsMgr::LLAttachmentsMgr():
+ mAttachmentRequests("attach",MIN_RETRY_REQUEST_TIME),
+ mDetachRequests("detach",MIN_RETRY_REQUEST_TIME),
+ mQuestionableCOFLinks("badcof",MAX_BAD_COF_TIME)
{
}
@@ -43,15 +52,37 @@ LLAttachmentsMgr::~LLAttachmentsMgr()
{
}
-void LLAttachmentsMgr::addAttachment(const LLUUID& item_id,
- const U8 attachment_pt,
- const BOOL add)
+void LLAttachmentsMgr::addAttachmentRequest(const LLUUID& item_id,
+ const U8 attachment_pt,
+ const BOOL add)
{
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+
+ if (mAttachmentRequests.wasRequestedRecently(item_id))
+ {
+ LL_DEBUGS("Avatar") << "ATT not adding attachment to mPendingAttachments, recent request is already pending: "
+ << (item ? item->getName() : "UNKNOWN") << " id " << item_id << LL_ENDL;
+ return;
+ }
+
+ LL_DEBUGS("Avatar") << "ATT adding attachment to mPendingAttachments "
+ << (item ? item->getName() : "UNKNOWN") << " id " << item_id << LL_ENDL;
+
AttachmentsInfo attachment;
attachment.mItemID = item_id;
attachment.mAttachmentPt = attachment_pt;
attachment.mAdd = add;
mPendingAttachments.push_back(attachment);
+
+ mAttachmentRequests.addTime(item_id);
+}
+
+void LLAttachmentsMgr::onAttachmentRequested(const LLUUID& item_id)
+{
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ LL_DEBUGS("Avatar") << "ATT attachment was requested "
+ << (item ? item->getName() : "UNKNOWN") << " id " << item_id << LL_ENDL;
+ mAttachmentRequests.addTime(item_id);
}
// static
@@ -68,31 +99,79 @@ void LLAttachmentsMgr::onIdle()
return;
}
- S32 obj_count = mPendingAttachments.size();
+ if (LLApp::isExiting())
+ {
+ return;
+ }
+
+ requestPendingAttachments();
+
+ linkRecentlyArrivedAttachments();
+
+ expireOldAttachmentRequests();
+
+ expireOldDetachRequests();
+
+ checkInvalidCOFLinks();
+
+ spamStatusInfo();
+}
+
+void LLAttachmentsMgr::requestPendingAttachments()
+{
+ if (mPendingAttachments.size())
+ {
+ requestAttachments(mPendingAttachments);
+ }
+}
+
+// Send request(s) for a group of attachments. As coded, this can
+// request at most 40 attachments and the rest will be
+// ignored. Currently the max attachments per avatar is 38, so the 40
+// limit should not be hit in practice.
+void LLAttachmentsMgr::requestAttachments(attachments_vec_t& attachment_requests)
+{
+ // Make sure we got a region before trying anything else
+ if( !gAgent.getRegion() )
+ {
+ return;
+ }
+
+ // For unknown reasons, requesting many attachments at once causes
+ // frequent server-side failures. Here we're limiting the number
+ // of attachments requested per idle loop.
+ const S32 max_objects_per_request = 5;
+ S32 obj_count = llmin((S32)attachment_requests.size(),max_objects_per_request);
if (obj_count == 0)
{
return;
}
-
+
// Limit number of packets to send
const S32 MAX_PACKETS_TO_SEND = 10;
const S32 OBJECTS_PER_PACKET = 4;
const S32 MAX_OBJECTS_TO_SEND = MAX_PACKETS_TO_SEND * OBJECTS_PER_PACKET;
if( obj_count > MAX_OBJECTS_TO_SEND )
{
+ LL_WARNS() << "ATT Too many attachments requested: " << obj_count
+ << " exceeds limit of " << MAX_OBJECTS_TO_SEND << LL_ENDL;
+
obj_count = MAX_OBJECTS_TO_SEND;
}
+ LL_DEBUGS("Avatar") << "ATT [RezMultipleAttachmentsFromInv] attaching multiple from attachment_requests,"
+ " total obj_count " << obj_count << LL_ENDL;
+
LLUUID compound_msg_id;
compound_msg_id.generate();
LLMessageSystem* msg = gMessageSystem;
-
- S32 i = 0;
- for (attachments_vec_t::const_iterator iter = mPendingAttachments.begin();
- iter != mPendingAttachments.end();
- ++iter)
- {
+ // by construction above, obj_count <= attachment_requests.size(), so no
+ // check against attachment_requests.empty() is needed.
+ llassert(obj_count <= attachment_requests.size());
+
+ for (S32 i=0; i<obj_count; i++)
+ {
if( 0 == (i % OBJECTS_PER_PACKET) )
{
// Start a new message chunk
@@ -106,32 +185,346 @@ void LLAttachmentsMgr::onIdle()
msg->addBOOLFast(_PREHASH_FirstDetachAll, false );
}
- const AttachmentsInfo &attachment = (*iter);
+ const AttachmentsInfo& attachment = attachment_requests.front();
LLViewerInventoryItem* item = gInventory.getItem(attachment.mItemID);
- if (!item)
+ if (item)
+ {
+ LL_DEBUGS("Avatar") << "ATT requesting from attachment_requests " << item->getName()
+ << " " << item->getLinkedUUID() << LL_ENDL;
+ S32 attachment_pt = attachment.mAttachmentPt;
+ if (attachment.mAdd)
+ attachment_pt |= ATTACHMENT_ADD;
+
+ msg->nextBlockFast(_PREHASH_ObjectData );
+ msg->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID());
+ msg->addUUIDFast(_PREHASH_OwnerID, item->getPermissions().getOwner());
+ msg->addU8Fast(_PREHASH_AttachmentPt, attachment_pt);
+ pack_permissions_slam(msg, item->getFlags(), item->getPermissions());
+ msg->addStringFast(_PREHASH_Name, item->getName());
+ msg->addStringFast(_PREHASH_Description, item->getDescription());
+ }
+ else
{
- LL_INFOS() << "Attempted to add non-existant item ID:" << attachment.mItemID << LL_ENDL;
- continue;
+ LL_WARNS("Avatar") << "ATT Attempted to add non-existent item ID:" << attachment.mItemID << LL_ENDL;
}
- S32 attachment_pt = attachment.mAttachmentPt;
- if (attachment.mAdd)
- attachment_pt |= ATTACHMENT_ADD;
-
- msg->nextBlockFast(_PREHASH_ObjectData );
- msg->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID());
- msg->addUUIDFast(_PREHASH_OwnerID, item->getPermissions().getOwner());
- msg->addU8Fast(_PREHASH_AttachmentPt, attachment_pt);
- pack_permissions_slam(msg, item->getFlags(), item->getPermissions());
- msg->addStringFast(_PREHASH_Name, item->getName());
- msg->addStringFast(_PREHASH_Description, item->getDescription());
if( (i+1 == obj_count) || ((OBJECTS_PER_PACKET-1) == (i % OBJECTS_PER_PACKET)) )
{
// End of message chunk
msg->sendReliable( gAgent.getRegion()->getHost() );
}
- i++;
+ attachment_requests.pop_front();
}
+}
+
+void LLAttachmentsMgr::linkRecentlyArrivedAttachments()
+{
+ if (mRecentlyArrivedAttachments.size())
+ {
+ // One or more attachments have arrived but have not yet been
+ // processed for COF links
+ if (mAttachmentRequests.empty())
+ {
+ // Not waiting for any more.
+ LL_DEBUGS("Avatar") << "ATT all pending attachments have arrived after "
+ << mCOFLinkBatchTimer.getElapsedTimeF32() << " seconds" << LL_ENDL;
+ }
+ else if (mCOFLinkBatchTimer.getElapsedTimeF32() > COF_LINK_BATCH_TIME)
+ {
+ LL_DEBUGS("Avatar") << "ATT " << mAttachmentRequests.size()
+ << " pending attachments have not arrived, but wait time exceeded" << LL_ENDL;
+ }
+ else
+ {
+ return;
+ }
+
+ LL_DEBUGS("Avatar") << "ATT checking COF linkability for " << mRecentlyArrivedAttachments.size()
+ << " recently arrived items" << LL_ENDL;
+
+ uuid_vec_t ids_to_link;
+ for (std::set<LLUUID>::iterator it = mRecentlyArrivedAttachments.begin();
+ it != mRecentlyArrivedAttachments.end(); ++it)
+ {
+ if (isAgentAvatarValid() &&
+ gAgentAvatarp->isWearingAttachment(*it) &&
+ !LLAppearanceMgr::instance().isLinkedInCOF(*it))
+ {
+ LLUUID item_id = *it;
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ LL_DEBUGS("Avatar") << "ATT adding COF link for attachment "
+ << (item ? item->getName() : "UNKNOWN") << " " << item_id << LL_ENDL;
+ ids_to_link.push_back(item_id);
+ }
+ }
+ if (ids_to_link.size())
+ {
+ LLPointer<LLInventoryCallback> cb = new LLRequestServerAppearanceUpdateOnDestroy();
+ for (uuid_vec_t::const_iterator uuid_it = ids_to_link.begin();
+ uuid_it != ids_to_link.end(); ++uuid_it)
+ {
+ LLAppearanceMgr::instance().addCOFItemLink(*uuid_it, cb);
+ }
+ }
+ mRecentlyArrivedAttachments.clear();
+ }
+}
+
+LLAttachmentsMgr::LLItemRequestTimes::LLItemRequestTimes(const std::string& op_name, F32 timeout):
+ mOpName(op_name),
+ mTimeout(timeout)
+{
+}
+
+void LLAttachmentsMgr::LLItemRequestTimes::addTime(const LLUUID& inv_item_id)
+{
+ LLInventoryItem *item = gInventory.getItem(inv_item_id);
+ LL_DEBUGS("Avatar") << "ATT " << mOpName << " adding request time " << (item ? item->getName() : "UNKNOWN") << " " << inv_item_id << LL_ENDL;
+ LLTimer current_time;
+ (*this)[inv_item_id] = current_time;
+}
+
+void LLAttachmentsMgr::LLItemRequestTimes::removeTime(const LLUUID& inv_item_id)
+{
+ LLInventoryItem *item = gInventory.getItem(inv_item_id);
+ S32 remove_count = (*this).erase(inv_item_id);
+ if (remove_count)
+ {
+ LL_DEBUGS("Avatar") << "ATT " << mOpName << " removing request time "
+ << (item ? item->getName() : "UNKNOWN") << " " << inv_item_id << LL_ENDL;
+ }
+}
+
+BOOL LLAttachmentsMgr::LLItemRequestTimes::getTime(const LLUUID& inv_item_id, LLTimer& timer) const
+{
+ std::map<LLUUID,LLTimer>::const_iterator it = (*this).find(inv_item_id);
+ if (it != (*this).end())
+ {
+ timer = it->second;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+BOOL LLAttachmentsMgr::LLItemRequestTimes::wasRequestedRecently(const LLUUID& inv_item_id) const
+{
+ LLTimer request_time;
+ if (getTime(inv_item_id, request_time))
+ {
+ F32 request_time_elapsed = request_time.getElapsedTimeF32();
+ return request_time_elapsed < mTimeout;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+// If we've been waiting for an attachment a long time, we want to
+// forget the request, because if the request is invalid (say the
+// object does not exist), the existence of a request that never goes
+// away will gum up the COF batch logic, causing it to always wait for
+// the timeout. Expiring a request means if the item does show up
+// late, the COF link request may not get properly batched up, but
+// behavior will be no worse than before we had the batching mechanism
+// in place; the COF link will still be created, but extra
+// requestServerAppearanceUpdate() calls may occur.
+void LLAttachmentsMgr::expireOldAttachmentRequests()
+{
+ for (std::map<LLUUID,LLTimer>::iterator it = mAttachmentRequests.begin();
+ it != mAttachmentRequests.end(); )
+ {
+ std::map<LLUUID,LLTimer>::iterator curr_it = it;
+ ++it;
+ if (curr_it->second.getElapsedTimeF32() > MAX_ATTACHMENT_REQUEST_LIFETIME)
+ {
+ LLInventoryItem *item = gInventory.getItem(curr_it->first);
+ LL_WARNS("Avatar") << "ATT expiring request for attachment "
+ << (item ? item->getName() : "UNKNOWN") << " item_id " << curr_it->first
+ << " after " << MAX_ATTACHMENT_REQUEST_LIFETIME << " seconds" << LL_ENDL;
+ mAttachmentRequests.erase(curr_it);
+ }
+ }
+}
+
+void LLAttachmentsMgr::expireOldDetachRequests()
+{
+ for (std::map<LLUUID,LLTimer>::iterator it = mDetachRequests.begin();
+ it != mDetachRequests.end(); )
+ {
+ std::map<LLUUID,LLTimer>::iterator curr_it = it;
+ ++it;
+ if (curr_it->second.getElapsedTimeF32() > MAX_ATTACHMENT_REQUEST_LIFETIME)
+ {
+ LLInventoryItem *item = gInventory.getItem(curr_it->first);
+ LL_WARNS("Avatar") << "ATT expiring request for detach "
+ << (item ? item->getName() : "UNKNOWN") << " item_id " << curr_it->first
+ << " after " << MAX_ATTACHMENT_REQUEST_LIFETIME << " seconds" << LL_ENDL;
+ mDetachRequests.erase(curr_it);
+ }
+ }
+}
+
+// When an attachment arrives, we want to stop waiting for it, and add
+// it to the set of recently arrived items.
+void LLAttachmentsMgr::onAttachmentArrived(const LLUUID& inv_item_id)
+{
+ LLTimer timer;
+ bool expected = mAttachmentRequests.getTime(inv_item_id, timer);
+ if (!expected)
+ {
+ LLInventoryItem *item = gInventory.getItem(inv_item_id);
+ LL_WARNS() << "ATT Attachment was unexpected or arrived after " << MAX_ATTACHMENT_REQUEST_LIFETIME << " seconds: "
+ << (item ? item->getName() : "UNKNOWN") << " id " << inv_item_id << LL_ENDL;
+ }
+ mAttachmentRequests.removeTime(inv_item_id);
+ if (expected && mAttachmentRequests.empty())
+ {
+ // mAttachmentRequests just emptied out
+ LL_DEBUGS("Avatar") << "ATT all active attachment requests have completed" << LL_ENDL;
+ }
+ if (mRecentlyArrivedAttachments.empty())
+ {
+ // Start the timer for sending off a COF link batch.
+ mCOFLinkBatchTimer.reset();
+ }
+ mRecentlyArrivedAttachments.insert(inv_item_id);
+}
+
+void LLAttachmentsMgr::onDetachRequested(const LLUUID& inv_item_id)
+{
+ mDetachRequests.addTime(inv_item_id);
+}
+
+void LLAttachmentsMgr::onDetachCompleted(const LLUUID& inv_item_id)
+{
+ LLTimer timer;
+ LLInventoryItem *item = gInventory.getItem(inv_item_id);
+ if (mDetachRequests.getTime(inv_item_id, timer))
+ {
+ LL_DEBUGS("Avatar") << "ATT detach completed after " << timer.getElapsedTimeF32()
+ << " seconds for " << (item ? item->getName() : "UNKNOWN") << " " << inv_item_id << LL_ENDL;
+ mDetachRequests.removeTime(inv_item_id);
+ if (mDetachRequests.empty())
+ {
+ LL_DEBUGS("Avatar") << "ATT all detach requests have completed" << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_WARNS() << "ATT unexpected detach for "
+ << (item ? item->getName() : "UNKNOWN") << " id " << inv_item_id << LL_ENDL;
+ }
+
+ LL_DEBUGS("Avatar") << "ATT detached item flagging as questionable for COF link checking "
+ << (item ? item->getName() : "UNKNOWN") << " id " << inv_item_id << LL_ENDL;
+ mQuestionableCOFLinks.addTime(inv_item_id);
+}
+
+bool LLAttachmentsMgr::isAttachmentStateComplete() const
+{
+ return mPendingAttachments.empty()
+ && mAttachmentRequests.empty()
+ && mDetachRequests.empty()
+ && mRecentlyArrivedAttachments.empty()
+ && mQuestionableCOFLinks.empty();
+}
+
+// Check for attachments that are (a) linked in COF and (b) not
+// attached to the avatar. This is a rotten function to have to
+// include, because it runs the risk of either repeatedly spamming out
+// COF link removals if they're failing for some reason, or getting
+// into a tug of war with some other sequence of events that's in the
+// process of adding the attachment in question. However, it's needed
+// because we have no definitive source of authority for what things
+// are actually supposed to be attached. Scripts, run on the server
+// side, can remove an attachment without our expecting it. If this
+// happens to an attachment that's just been added, then the COF link
+// creation may still be in flight, and we will have to delete the
+// link after it shows up.
+//
+// Note that we only flag items for possible link removal if they have
+// been previously detached. This means that an attachment failure
+// will leave the link in the COF, where it will hopefully resolve
+// correctly on relog.
+//
+// See related: MAINT-5070, MAINT-4409
+//
+void LLAttachmentsMgr::checkInvalidCOFLinks()
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+ gInventory.collectDescendents(LLAppearanceMgr::instance().getCOF(),
+ cat_array,item_array,LLInventoryModel::EXCLUDE_TRASH);
+ for (S32 i=0; i<item_array.size(); i++)
+ {
+ const LLViewerInventoryItem* inv_item = item_array.at(i).get();
+ const LLUUID& item_id = inv_item->getLinkedUUID();
+ if (inv_item->getType() == LLAssetType::AT_OBJECT)
+ {
+ LLTimer timer;
+ bool is_flagged_questionable = mQuestionableCOFLinks.getTime(item_id,timer);
+ bool is_wearing_attachment = isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(item_id);
+ if (is_wearing_attachment && is_flagged_questionable)
+ {
+ LL_DEBUGS("Avatar") << "ATT was flagged questionable but is now "
+ << (is_wearing_attachment ? "attached " : "")
+ <<"removing flag after "
+ << timer.getElapsedTimeF32() << " item "
+ << inv_item->getName() << " id " << item_id << LL_ENDL;
+ mQuestionableCOFLinks.removeTime(item_id);
+ }
+ }
+ }
+
+ for(LLItemRequestTimes::iterator it = mQuestionableCOFLinks.begin();
+ it != mQuestionableCOFLinks.end(); )
+ {
+ LLItemRequestTimes::iterator curr_it = it;
+ ++it;
+ const LLUUID& item_id = curr_it->first;
+ LLViewerInventoryItem *inv_item = gInventory.getItem(item_id);
+ if (curr_it->second.getElapsedTimeF32() > MAX_BAD_COF_TIME)
+ {
+ if (LLAppearanceMgr::instance().isLinkedInCOF(item_id))
+ {
+ LL_DEBUGS("Avatar") << "ATT Linked in COF but not attached or requested, deleting link after "
+ << curr_it->second.getElapsedTimeF32() << " seconds for "
+ << (inv_item ? inv_item->getName() : "UNKNOWN") << " id " << item_id << LL_ENDL;
+ LLAppearanceMgr::instance().removeCOFItemLinks(item_id);
+ }
+ mQuestionableCOFLinks.erase(curr_it);
+ continue;
+ }
+ }
+}
+
+void LLAttachmentsMgr::spamStatusInfo()
+{
+#if 0
+ static LLTimer spam_timer;
+ const F32 spam_frequency = 100.0F;
- mPendingAttachments.clear();
+ if (spam_timer.getElapsedTimeF32() > spam_frequency)
+ {
+ spam_timer.reset();
+
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+ gInventory.collectDescendents(LLAppearanceMgr::instance().getCOF(),
+ cat_array,item_array,LLInventoryModel::EXCLUDE_TRASH);
+ for (S32 i=0; i<item_array.size(); i++)
+ {
+ const LLViewerInventoryItem* inv_item = item_array.at(i).get();
+ if (inv_item->getType() == LLAssetType::AT_OBJECT)
+ {
+ LL_DEBUGS("Avatar") << "item_id: " << inv_item->getUUID()
+ << " linked_item_id: " << inv_item->getLinkedUUID()
+ << " name: " << inv_item->getName()
+ << " parent: " << inv_item->getParentUUID()
+ << LL_ENDL;
+ }
+ }
+ }
+#endif
}
diff --git a/indra/newview/llattachmentsmgr.h b/indra/newview/llattachmentsmgr.h
index 1d8ab74dfd..bb7d35edbc 100755
--- a/indra/newview/llattachmentsmgr.h
+++ b/indra/newview/llattachmentsmgr.h
@@ -32,42 +32,103 @@
class LLViewerInventoryItem;
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//--------------------------------------------------------------------------------
// LLAttachmentsMgr
//
-// The sole purpose of this class is to take attachment
-// requests, queue them up, and send them all at once.
-// This handles situations where the viewer may request
-// a bunch of attachments at once in a short period of
-// time, where each of the requests would normally be
-// sent as a separate message versus being batched into
-// one single message.
-//
-// The intent of this batching is to reduce viewer->server
-// traffic.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// This class manages batching up of requests at two stages of
+// attachment rezzing.
+//
+// First, attachments requested to rez get saved in
+// mPendingAttachments and sent as a single
+// RezMultipleAttachmentsFromInv request. This batching is needed
+// mainly because of weaknessing the UI element->inventory item
+// handling, such that we don't always know when we are requesting
+// multiple items. Now they just pile up and get swept into a single
+// request during the idle loop.
+//
+// Second, after attachments arrive, we need to generate COF links for
+// them. There are both efficiency and UI correctness reasons why it
+// is better to request all the COF links at once and run a single
+// callback after they all complete. Given the vagaries of the
+// attachment system, there is no guarantee that we will get all the
+// attachments we ask for, but we frequently do. So in the common case
+// that all the desired attachments arrive fairly quickly, we generate
+// a single batched request for COF links. If attachments arrive late
+// or not at all, we will still issue COF link requests once a timeout
+// value has been exceeded.
+//
+// To handle attachments that never arrive, we forget about requests
+// that exceed a timeout value.
+//--------------------------------------------------------------------------------
class LLAttachmentsMgr: public LLSingleton<LLAttachmentsMgr>
{
public:
- LLAttachmentsMgr();
- virtual ~LLAttachmentsMgr();
-
- void addAttachment(const LLUUID& item_id,
- const U8 attachment_pt,
- const BOOL add);
- static void onIdle(void *);
-protected:
- void onIdle();
-private:
+ // Stores info for attachments that will be requested during idle.
struct AttachmentsInfo
{
LLUUID mItemID;
U8 mAttachmentPt;
BOOL mAdd;
};
+ typedef std::deque<AttachmentsInfo> attachments_vec_t;
+
+ LLAttachmentsMgr();
+ virtual ~LLAttachmentsMgr();
+
+ void addAttachmentRequest(const LLUUID& item_id,
+ const U8 attachment_pt,
+ const BOOL add);
+ void onAttachmentRequested(const LLUUID& item_id);
+ void requestAttachments(attachments_vec_t& attachment_requests);
+ static void onIdle(void *);
+
+ void onAttachmentArrived(const LLUUID& inv_item_id);
- typedef std::vector<AttachmentsInfo> attachments_vec_t;
+ void onDetachRequested(const LLUUID& inv_item_id);
+ void onDetachCompleted(const LLUUID& inv_item_id);
+
+ bool isAttachmentStateComplete() const;
+
+private:
+
+ class LLItemRequestTimes: public std::map<LLUUID,LLTimer>
+ {
+ public:
+ LLItemRequestTimes(const std::string& op_name, F32 timeout);
+ void addTime(const LLUUID& inv_item_id);
+ void removeTime(const LLUUID& inv_item_id);
+ BOOL wasRequestedRecently(const LLUUID& item_id) const;
+ BOOL getTime(const LLUUID& inv_item_id, LLTimer& timer) const;
+
+ private:
+ F32 mTimeout;
+ std::string mOpName;
+ };
+
+ void removeAttachmentRequestTime(const LLUUID& inv_item_id);
+ void onIdle();
+ void requestPendingAttachments();
+ void linkRecentlyArrivedAttachments();
+ void expireOldAttachmentRequests();
+ void expireOldDetachRequests();
+ void checkInvalidCOFLinks();
+ void spamStatusInfo();
+
+ // Attachments that we are planning to rez but haven't requested from the server yet.
attachments_vec_t mPendingAttachments;
+
+ // Attachments that have been requested from server but have not arrived yet.
+ LLItemRequestTimes mAttachmentRequests;
+
+ // Attachments that have been requested to detach but have not gone away yet.
+ LLItemRequestTimes mDetachRequests;
+
+ // Attachments that have arrived but have not been linked in the COF yet.
+ std::set<LLUUID> mRecentlyArrivedAttachments;
+ LLTimer mCOFLinkBatchTimer;
+
+ // Attachments that are linked in the COF but may be invalid.
+ LLItemRequestTimes mQuestionableCOFLinks;
};
#endif
diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index 281e591b48..25a5df9781 100755
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -311,6 +311,7 @@ bool LLAvatarIconCtrl::updateFromCache()
else
{
LLIconCtrl::setValue(mDefaultIconName);
+ return false;
}
return true;
diff --git a/indra/newview/llavatarrenderinfoaccountant.cpp b/indra/newview/llavatarrenderinfoaccountant.cpp
index 38e153137c..d351b38653 100644
--- a/indra/newview/llavatarrenderinfoaccountant.cpp
+++ b/indra/newview/llavatarrenderinfoaccountant.cpp
@@ -28,14 +28,17 @@
// Precompiled header
#include "llviewerprecompiledheaders.h"
-// associated header
-#include "llavatarrenderinfoaccountant.h"
// STL headers
// std headers
// external library headers
// other Linden headers
#include "llcharacter.h"
-#include "llhttpclient.h"
+#include "httprequest.h"
+#include "httphandler.h"
+#include "httpresponse.h"
+#include "llcorehttputil.h"
+#include "llappcorehttp.h"
+#include "llavatarrendernotifier.h"
#include "lltimer.h"
#include "llviewercontrol.h"
#include "llviewermenu.h"
@@ -43,233 +46,290 @@
#include "llviewerregion.h"
#include "llvoavatar.h"
#include "llworld.h"
+// associated header
+#include "llavatarrenderinfoaccountant.h"
static const std::string KEY_AGENTS = "agents"; // map
static const std::string KEY_WEIGHT = "weight"; // integer
+static const std::string KEY_TOO_COMPLEX = "tooComplex"; // bool
+static const std::string KEY_OVER_COMPLEXITY_LIMIT = "overlimit"; // integer
+static const std::string KEY_REPORTING_COMPLEXITY_LIMIT = "reportinglimit"; // integer
static const std::string KEY_IDENTIFIER = "identifier";
static const std::string KEY_MESSAGE = "message";
static const std::string KEY_ERROR = "error";
-// Send data updates about once per minute, only need per-frame resolution
-LLFrameTimer LLAvatarRenderInfoAccountant::sRenderInfoReportTimer;
+static const F32 SECS_BETWEEN_REGION_SCANS = 5.f; // Scan the region list every 5 seconds
+static const F32 SECS_BETWEEN_REGION_REQUEST = 15.0; // Look for new avs every 15 seconds
+static const F32 SECS_BETWEEN_REGION_REPORTS = 60.0; // Update each region every 60 seconds
+
+
+// The policy class for HTTP traffic; this is the right value for all capability requests.
+static LLCore::HttpRequest::policy_t http_policy(LLAppCoreHttp::AP_REPORTING);
+
+// Priority for HTTP requests. Use 0U.
+static LLCore::HttpRequest::priority_t http_priority(0U);
+LLAvatarRenderInfoAccountant::LLAvatarRenderInfoAccountant()
+ : mHttpRequest(new LLCore::HttpRequest)
+ , mHttpHeaders(new LLCore::HttpHeaders)
+ , mHttpOptions(new LLCore::HttpOptions)
+{
+ mHttpOptions->setTransferTimeout(SECS_BETWEEN_REGION_SCANS);
+
+ mHttpHeaders->append(HTTP_OUT_HEADER_CONTENT_TYPE, HTTP_CONTENT_LLSD_XML);
+ mHttpHeaders->append(HTTP_OUT_HEADER_ACCEPT, HTTP_CONTENT_LLSD_XML);
+}
+
+LLAvatarRenderInfoAccountant::~LLAvatarRenderInfoAccountant()
+{
+ mHttpOptions->release();
+ mHttpHeaders->release();
+ // delete mHttpRequest; ???
+}
// HTTP responder class for GET request for avatar render weight information
-class LLAvatarRenderInfoGetResponder : public LLHTTPClient::Responder
+class LLAvatarRenderInfoGetHandler : public LLCore::HttpHandler
{
+private:
+ LOG_CLASS(LLAvatarRenderInfoGetHandler);
+
public:
- LLAvatarRenderInfoGetResponder(U64 region_handle) : mRegionHandle(region_handle)
- {
- }
-
- virtual void error(U32 statusNum, const std::string& reason)
+ LLAvatarRenderInfoGetHandler() : LLCore::HttpHandler()
{
- LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);
- if (regionp)
- {
- LL_WARNS() << "HTTP error result for avatar weight GET: " << statusNum
- << ", " << reason
- << " returned by region " << regionp->getName()
- << LL_ENDL;
- }
- else
- {
- LL_WARNS() << "Avatar render weight GET error recieved but region not found for "
- << mRegionHandle
- << ", error " << statusNum
- << ", " << reason
- << LL_ENDL;
- }
-
}
- virtual void result(const LLSD& content)
+ void onCompleted(LLCore::HttpHandle handle,
+ LLCore::HttpResponse* response)
{
- LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);
- if (regionp)
- {
- if (LLAvatarRenderInfoAccountant::logRenderInfo())
- {
- LL_INFOS() << "LRI: Result for avatar weights request for region " << regionp->getName() << ":" << LL_ENDL;
- }
-
- if (content.isMap())
- {
- if (content.has(KEY_AGENTS))
+ LLCore::HttpStatus status = response->getStatus();
+ if (status)
+ {
+ LL_DEBUGS("AvatarRenderInfo") << "response"<<LL_ENDL;
+ LLSD avatar_render_info;
+ if (LLCoreHttpUtil::responseToLLSD(response, false /* quiet logging */,
+ avatar_render_info))
{
- const LLSD & agents = content[KEY_AGENTS];
- if (agents.isMap())
+ if (avatar_render_info.isMap())
{
- LLSD::map_const_iterator report_iter = agents.beginMap();
- while (report_iter != agents.endMap())
+ if ( avatar_render_info.has(KEY_REPORTING_COMPLEXITY_LIMIT)
+ && avatar_render_info.has(KEY_OVER_COMPLEXITY_LIMIT))
{
- LLUUID target_agent_id = LLUUID(report_iter->first);
- const LLSD & agent_info_map = report_iter->second;
- LLViewerObject* avatarp = gObjectList.findObject(target_agent_id);
- if (avatarp &&
- avatarp->isAvatar() &&
- agent_info_map.isMap())
- { // Extract the data for this avatar
-
- if (LLAvatarRenderInfoAccountant::logRenderInfo())
- {
- LL_INFOS() << "LRI: Agent " << target_agent_id
- << ": " << agent_info_map << LL_ENDL;
- }
+ U32 reporting = avatar_render_info[KEY_REPORTING_COMPLEXITY_LIMIT].asInteger();
+ U32 overlimit = avatar_render_info[KEY_OVER_COMPLEXITY_LIMIT].asInteger();
- if (agent_info_map.has(KEY_WEIGHT))
+ LL_DEBUGS("AvatarRenderInfo") << "complexity limit: "<<reporting<<" reporting, "<<overlimit<<" over limit"<<LL_ENDL;
+
+ LLAvatarRenderNotifier::getInstance()->updateNotificationRegion(reporting, overlimit);
+ }
+
+ if (avatar_render_info.has(KEY_AGENTS))
+ {
+ const LLSD & agents = avatar_render_info[KEY_AGENTS];
+ if (agents.isMap())
+ {
+ for (LLSD::map_const_iterator agent_iter = agents.beginMap();
+ agent_iter != agents.endMap();
+ agent_iter++
+ )
{
- ((LLVOAvatar *) avatarp)->setReportedVisualComplexity(agent_info_map[KEY_WEIGHT].asInteger());
- }
+ LLUUID target_agent_id = LLUUID(agent_iter->first);
+ LLViewerObject* avatarp = gObjectList.findObject(target_agent_id);
+ if (avatarp && avatarp->isAvatar())
+ {
+ const LLSD & agent_info_map = agent_iter->second;
+ if (agent_info_map.isMap())
+ {
+ LL_DEBUGS("AvatarRenderInfo") << " Agent " << target_agent_id
+ << ": " << agent_info_map << LL_ENDL;
+
+ if (agent_info_map.has(KEY_WEIGHT))
+ {
+ ((LLVOAvatar *) avatarp)->setReportedVisualComplexity(agent_info_map[KEY_WEIGHT].asInteger());
+ }
+ }
+ else
+ {
+ LL_WARNS("AvatarRenderInfo") << "agent entry invalid"
+ << " agent " << target_agent_id
+ << " map " << agent_info_map
+ << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_DEBUGS("AvatarRenderInfo") << "Unknown agent " << target_agent_id << LL_ENDL;
+ }
+ } // for agent_iter
}
- report_iter++;
+ else
+ {
+ LL_WARNS("AvatarRenderInfo") << "malformed get response agents avatar_render_info is not map" << LL_ENDL;
+ }
+ } // has "agents"
+ else if (avatar_render_info.has(KEY_ERROR))
+ {
+ const LLSD & error = avatar_render_info[KEY_ERROR];
+ LL_WARNS("AvatarRenderInfo") << "Avatar render info GET error: "
+ << error[KEY_IDENTIFIER]
+ << ": " << error[KEY_MESSAGE]
+ << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS("AvatarRenderInfo") << "no agent key in get response" << LL_ENDL;
}
}
- } // has "agents"
- else if (content.has(KEY_ERROR))
+ else
+ {
+ LL_WARNS("AvatarRenderInfo") << "malformed get response is not map" << LL_ENDL;
+ }
+ }
+ else
{
- const LLSD & error = content[KEY_ERROR];
- LL_WARNS() << "Avatar render info GET error: "
- << error[KEY_IDENTIFIER]
- << ": " << error[KEY_MESSAGE]
- << " from region " << regionp->getName()
- << LL_ENDL;
+ LL_WARNS("AvatarRenderInfo") << "malformed get response parse failure" << LL_ENDL;
}
- }
- }
- else
- {
- LL_INFOS() << "Avatar render weight info recieved but region not found for "
- << mRegionHandle << LL_ENDL;
+ }
+ else
+ {
+ // Something went wrong. Translate the status to
+ // a meaningful message.
+ LL_WARNS("AvatarRenderInfo") << "GET failed Status: "
+ << status.toTerseString()
+ << ", Reason: " << status.toString()
+ << LL_ENDL;
+ }
+
+ delete this; // release the handler object
}
- }
-
-private:
- U64 mRegionHandle;
};
// HTTP responder class for POST request for avatar render weight information
-class LLAvatarRenderInfoPostResponder : public LLHTTPClient::Responder
+class LLAvatarRenderInfoPostHandler : public LLCore::HttpHandler
{
-public:
- LLAvatarRenderInfoPostResponder(U64 region_handle) : mRegionHandle(region_handle)
- {
- }
+ private:
+ LOG_CLASS(LLAvatarRenderInfoPostHandler);
- virtual void error(U32 statusNum, const std::string& reason)
+ public:
+ LLAvatarRenderInfoPostHandler() : LLCore::HttpHandler()
{
- LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);
- if (regionp)
- {
- LL_WARNS() << "HTTP error result for avatar weight POST: " << statusNum
- << ", " << reason
- << " returned by region " << regionp->getName()
- << LL_ENDL;
- }
- else
- {
- LL_WARNS() << "Avatar render weight POST error recieved but region not found for "
- << mRegionHandle
- << ", error " << statusNum
- << ", " << reason
- << LL_ENDL;
- }
}
- virtual void result(const LLSD& content)
- {
- LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);
- if (regionp)
+ void onCompleted(LLCore::HttpHandle handle,
+ LLCore::HttpResponse* response)
{
- if (LLAvatarRenderInfoAccountant::logRenderInfo())
+ LLCore::HttpStatus status = response->getStatus();
+ if (status)
{
- LL_INFOS() << "LRI: Result for avatar weights POST for region " << regionp->getName()
- << ": " << content << LL_ENDL;
+ LL_DEBUGS("AvatarRenderInfo") << "post succeeded" << LL_ENDL;
}
-
- if (content.isMap())
+ else
{
- if (content.has(KEY_ERROR))
- {
- const LLSD & error = content[KEY_ERROR];
- LL_WARNS() << "Avatar render info POST error: "
- << error[KEY_IDENTIFIER]
- << ": " << error[KEY_MESSAGE]
- << " from region " << regionp->getName()
- << LL_ENDL;
- }
- }
+ // Something went wrong. Translate the status to
+ // a meaningful message.
+ LL_WARNS("AvatarRenderInfo") << "POST failed Status: "
+ << status.toTerseString()
+ << ", Reason: " << status.toString()
+ << LL_ENDL;
+ }
+
+ delete this; // release the handler object
}
- else
- {
- LL_INFOS() << "Avatar render weight POST result recieved but region not found for "
- << mRegionHandle << LL_ENDL;
- }
- }
-
-private:
- U64 mRegionHandle;
};
-// static
-// Send request for one region, no timer checks
+// Send request for avatar weights in one region
+// called when the mRenderInfoScanTimer expires (forced when entering a new region)
void LLAvatarRenderInfoAccountant::sendRenderInfoToRegion(LLViewerRegion * regionp)
{
- std::string url = regionp->getCapability("AvatarRenderInfo");
- if (!url.empty())
+ if ( regionp->getRenderInfoReportTimer().hasExpired() ) // Time to make request
{
- if (logRenderInfo())
+ U32 num_avs = 0;
+
+ std::string url = regionp->getCapability("AvatarRenderInfo");
+ if (!url.empty())
{
- LL_INFOS() << "LRI: Sending avatar render info to region "
- << regionp->getName()
- << " from " << url
- << LL_ENDL;
- }
-
- // Build the render info to POST to the region
- LLSD report = LLSD::emptyMap();
- LLSD agents = LLSD::emptyMap();
+ // Build the render info to POST to the region
+ LLSD agents = LLSD::emptyMap();
- std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
- while( iter != LLCharacter::sInstances.end() )
- {
- LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*iter);
- if (avatar &&
- avatar->getRezzedStatus() >= 2 && // Mostly rezzed (maybe without baked textures downloaded)
- !avatar->isDead() && // Not dead yet
- avatar->getObjectHost() == regionp->getHost()) // Ensure it's on the same region
+ std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
+ while( iter != LLCharacter::sInstances.end() )
{
- avatar->calculateUpdateRenderCost(); // Make sure the numbers are up-to-date
-
- LLSD info = LLSD::emptyMap();
- if (avatar->getVisualComplexity() > 0)
+ LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*iter);
+ if (avatar &&
+ avatar->getRezzedStatus() >= 2 && // Mostly rezzed (maybe without baked textures downloaded)
+ !avatar->isDead() && // Not dead yet
+ avatar->getObjectHost() == regionp->getHost()) // Ensure it's on the same region
{
- info[KEY_WEIGHT] = avatar->getVisualComplexity();
- agents[avatar->getID().asString()] = info;
+ avatar->calculateUpdateRenderComplexity(); // Make sure the numbers are up-to-date
- if (logRenderInfo())
+ LLSD info = LLSD::emptyMap();
+ U32 avatar_complexity = avatar->getVisualComplexity();
+ if (avatar_complexity > 0)
{
- LL_INFOS() << "LRI: Sending avatar render info for " << avatar->getID()
- << ": " << info << LL_ENDL;
- LL_INFOS() << "LRI: other info geometry " << avatar->getAttachmentGeometryBytes()
- << ", area " << avatar->getAttachmentSurfaceArea()
- << LL_ENDL;
+ // the weight/complexity is unsigned, but LLSD only stores signed integers,
+ // so if it's over that (which would be ridiculously high), just store the maximum signed int value
+ info[KEY_WEIGHT] = (S32)(avatar_complexity < S32_MAX ? avatar_complexity : S32_MAX);
+ info[KEY_TOO_COMPLEX] = LLSD::Boolean(avatar->isTooComplex());
+ agents[avatar->getID().asString()] = info;
+
+ LL_DEBUGS("AvatarRenderInfo") << "Sending avatar render info for " << avatar->getID()
+ << ": " << info << LL_ENDL;
+ num_avs++;
}
}
+ iter++;
}
- iter++;
- }
- report[KEY_AGENTS] = agents;
- if (agents.size() > 0)
+ if (num_avs > 0)
+ {
+ LLSD report = LLSD::emptyMap();
+ report[KEY_AGENTS] = agents;
+
+ LLCore::HttpHandle handle(LLCORE_HTTP_HANDLE_INVALID);
+ LLAvatarRenderInfoPostHandler* handler = new LLAvatarRenderInfoPostHandler;
+
+ handle = LLCoreHttpUtil::requestPostWithLLSD(mHttpRequest,
+ http_policy,
+ http_priority,
+ url,
+ report,
+ mHttpOptions,
+ mHttpHeaders,
+ handler);
+ if (LLCORE_HTTP_HANDLE_INVALID == handle)
+ {
+ LLCore::HttpStatus status(mHttpRequest->getStatus());
+ LL_WARNS("AvatarRenderInfo") << "HTTP POST request failed"
+ << " Status: " << status.toTerseString()
+ << " Reason: '" << status.toString() << "'"
+ << LL_ENDL;
+ delete handler;
+ }
+ else
+ {
+ LL_INFOS("AvatarRenderInfo") << "Sent render costs for " << num_avs
+ << " avatars to region " << regionp->getName()
+ << LL_ENDL;
+
+
+ }
+ }
+ else
+ {
+ LL_DEBUGS("AvatarRenderInfo") << "no agent info to send" << LL_ENDL;
+ }
+ }
+ else
{
- LLHTTPClient::post(url, report, new LLAvatarRenderInfoPostResponder(regionp->getHandle()));
+ LL_WARNS("AvatarRenderInfo") << "AvatarRenderInfo cap is empty" << LL_ENDL;
}
+
+ // Reset this regions timer, moving to longer intervals if there are lots of avatars around
+ regionp->getRenderInfoReportTimer().resetWithExpiry(SECS_BETWEEN_REGION_REPORTS + (2.f * num_avs));
}
}
@@ -280,19 +340,39 @@ void LLAvatarRenderInfoAccountant::sendRenderInfoToRegion(LLViewerRegion * regio
// Send request for one region, no timer checks
void LLAvatarRenderInfoAccountant::getRenderInfoFromRegion(LLViewerRegion * regionp)
{
- std::string url = regionp->getCapability("AvatarRenderInfo");
- if (!url.empty())
+ if (regionp->getRenderInfoRequestTimer().hasExpired())
{
- if (logRenderInfo())
+ std::string url = regionp->getCapability("AvatarRenderInfo");
+ if (!url.empty())
{
- LL_INFOS() << "LRI: Requesting avatar render info for region "
- << regionp->getName()
- << " from " << url
- << LL_ENDL;
+
+ LLAvatarRenderInfoGetHandler* handler = new LLAvatarRenderInfoGetHandler;
+ // First send a request to get the latest data
+ LLCore::HttpHandle handle = mHttpRequest->requestGet(http_policy,
+ http_priority,
+ url,
+ NULL,
+ NULL,
+ handler);
+ if (LLCORE_HTTP_HANDLE_INVALID != handle)
+ {
+ LL_INFOS("AvatarRenderInfo") << "Requested avatar render info for region "
+ << regionp->getName()
+ << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS("AvatarRenderInfo") << "Failed to launch HTTP GET request. Try again."
+ << LL_ENDL;
+ delete handler;
+ }
+ }
+ else
+ {
+ LL_WARNS("AvatarRenderInfo") << "no AvatarRenderInfo cap for " << regionp->getName() << LL_ENDL;
}
- // First send a request to get the latest data
- LLHTTPClient::get(url, new LLAvatarRenderInfoGetResponder(regionp->getHandle()));
+ regionp->getRenderInfoRequestTimer().resetWithExpiry(SECS_BETWEEN_REGION_REQUEST);
}
}
@@ -301,98 +381,60 @@ void LLAvatarRenderInfoAccountant::getRenderInfoFromRegion(LLViewerRegion * regi
// Called every frame - send render weight requests to every region
void LLAvatarRenderInfoAccountant::idle()
{
- if (sRenderInfoReportTimer.hasExpired())
- {
- const F32 SECS_BETWEEN_REGION_SCANS = 5.f; // Scan the region list every 5 seconds
- const F32 SECS_BETWEEN_REGION_REQUEST = 60.0; // Update each region every 60 seconds
+ mHttpRequest->update(0); // give any pending http operations a chance to call completion methods
- S32 num_avs = LLCharacter::sInstances.size();
-
- if (logRenderInfo())
- {
- LL_INFOS() << "LRI: Scanning all regions and checking for render info updates"
- << LL_ENDL;
- }
+ if (mRenderInfoScanTimer.hasExpired())
+ {
+ LL_DEBUGS("AvatarRenderInfo") << "Scanning regions for render info updates"
+ << LL_ENDL;
- // Check all regions and see if it's time to fetch/send data
+ // Check all regions
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
- iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
+ iter != LLWorld::getInstance()->getRegionList().end();
+ ++iter)
{
LLViewerRegion* regionp = *iter;
- if (regionp &&
- regionp->isAlive() &&
- regionp->capabilitiesReceived() && // Region has capability URLs available
- regionp->getRenderInfoRequestTimer().hasExpired()) // Time to make request
+ if ( regionp
+ && regionp->isAlive()
+ && regionp->capabilitiesReceived())
{
+ // each of these is further governed by and resets its own timer
sendRenderInfoToRegion(regionp);
getRenderInfoFromRegion(regionp);
-
- // Reset this regions timer, moving to longer intervals if there are lots of avatars around
- regionp->getRenderInfoRequestTimer().resetWithExpiry(SECS_BETWEEN_REGION_REQUEST + (2.f * num_avs));
}
}
// We scanned all the regions, reset the request timer.
- sRenderInfoReportTimer.resetWithExpiry(SECS_BETWEEN_REGION_SCANS);
- }
-
- static LLCachedControl<U32> render_auto_mute_functions(gSavedSettings, "RenderAutoMuteFunctions", 0);
- static U32 prev_render_auto_mute_functions = (U32) -1;
- if (prev_render_auto_mute_functions != render_auto_mute_functions)
- {
- prev_render_auto_mute_functions = render_auto_mute_functions;
-
- // Adjust menus
- BOOL show_items = (BOOL)(render_auto_mute_functions & 0x04);
- gMenuAvatarOther->setItemVisible( std::string("Normal"), show_items);
- gMenuAvatarOther->setItemVisible( std::string("Always use impostor"), show_items);
- gMenuAvatarOther->setItemVisible( std::string("Never use impostor"), show_items);
- gMenuAvatarOther->setItemVisible( std::string("Impostor seperator"), show_items);
-
- gMenuAttachmentOther->setItemVisible( std::string("Normal"), show_items);
- gMenuAttachmentOther->setItemVisible( std::string("Always use impostor"), show_items);
- gMenuAttachmentOther->setItemVisible( std::string("Never use impostor"), show_items);
- gMenuAttachmentOther->setItemVisible( std::string("Impostor seperator"), show_items);
-
- if (!show_items)
- { // Turning off visual muting
- for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
- iter != LLCharacter::sInstances.end(); ++iter)
- { // Make sure all AVs have the setting cleared
- LLVOAvatar* inst = (LLVOAvatar*) *iter;
- inst->setCachedVisualMute(false);
- }
- }
+ mRenderInfoScanTimer.resetWithExpiry(SECS_BETWEEN_REGION_SCANS);
}
}
+void LLAvatarRenderInfoAccountant::resetRenderInfoScanTimer()
+{
+ // this will force the next frame to rescan
+ mRenderInfoScanTimer.reset();
+}
// static
-// Make sRenderInfoReportTimer expire so the next call to idle() will scan and query a new region
-// called via LLViewerRegion::setCapabilitiesReceived() boost signals when the capabilities
+// Called via LLViewerRegion::setCapabilitiesReceived() boost signals when the capabilities
// are returned for a new LLViewerRegion, and is the earliest time to get render info
-void LLAvatarRenderInfoAccountant::expireRenderInfoReportTimer(const LLUUID& region_id)
+void LLAvatarRenderInfoAccountant::scanNewRegion(const LLUUID& region_id)
{
- if (logRenderInfo())
- {
- LL_INFOS() << "LRI: Viewer has new region capabilities, clearing global render info timer"
- << " and timer for region " << region_id
- << LL_ENDL;
- }
+ LL_INFOS("AvatarRenderInfo") << region_id << LL_ENDL;
- // Reset the global timer so it will scan regions immediately
- sRenderInfoReportTimer.reset();
+ // Reset the global timer so it will scan regions on the next call to ::idle
+ LLAvatarRenderInfoAccountant::getInstance()->resetRenderInfoScanTimer();
LLViewerRegion* regionp = LLWorld::instance().getRegionFromID(region_id);
if (regionp)
- { // Reset the region's timer so it will request data immediately
+ { // Reset the region's timers so we will:
+ // * request render info from it immediately
+ // * report on the following scan
regionp->getRenderInfoRequestTimer().reset();
+ regionp->getRenderInfoReportTimer().resetWithExpiry(SECS_BETWEEN_REGION_SCANS);
+ }
+ else
+ {
+ LL_WARNS("AvatarRenderInfo") << "unable to resolve region "<<region_id<<LL_ENDL;
}
-}
-
-// static
-bool LLAvatarRenderInfoAccountant::logRenderInfo()
-{
- static LLCachedControl<bool> render_mute_logging_enabled(gSavedSettings, "RenderAutoMuteLogging", false);
- return render_mute_logging_enabled;
}
diff --git a/indra/newview/llavatarrenderinfoaccountant.h b/indra/newview/llavatarrenderinfoaccountant.h
index d68f2dccfb..8117c18f4d 100644
--- a/indra/newview/llavatarrenderinfoaccountant.h
+++ b/indra/newview/llavatarrenderinfoaccountant.h
@@ -33,24 +33,33 @@ class LLViewerRegion;
// Class to gather avatar rendering information
// that is sent to or fetched from regions.
-class LLAvatarRenderInfoAccountant
+class LLAvatarRenderInfoAccountant : public LLSingleton<LLAvatarRenderInfoAccountant>
{
-public:
- LLAvatarRenderInfoAccountant() {};
- ~LLAvatarRenderInfoAccountant() {};
+ private:
+ LOG_CLASS(LLAvatarRenderInfoAccountant);
- static void sendRenderInfoToRegion(LLViewerRegion * regionp);
- static void getRenderInfoFromRegion(LLViewerRegion * regionp);
+ public:
+ LLAvatarRenderInfoAccountant();
+ ~LLAvatarRenderInfoAccountant();
- static void expireRenderInfoReportTimer(const LLUUID& region_id);
+ void sendRenderInfoToRegion(LLViewerRegion * regionp);
+ void getRenderInfoFromRegion(LLViewerRegion * regionp);
- static void idle();
+ void idle(); // called once per frame
- static bool logRenderInfo();
+ void resetRenderInfoScanTimer();
+
+ static void scanNewRegion(const LLUUID& region_id);
-private:
- // Send data updates about once per minute, only need per-frame resolution
- static LLFrameTimer sRenderInfoReportTimer;
+ private:
+ // frequency of region scans,
+ // further limited by per region Request and Report timers
+ LLFrameTimer mRenderInfoScanTimer;
+
+ //
+ LLCore::HttpRequest* mHttpRequest;
+ LLCore::HttpHeaders* mHttpHeaders;
+ LLCore::HttpOptions* mHttpOptions;
};
#endif /* ! defined(LL_llavatarrenderinfoaccountant_H) */
diff --git a/indra/newview/llavatarrendernotifier.cpp b/indra/newview/llavatarrendernotifier.cpp
new file mode 100644
index 0000000000..d3bc135b4c
--- /dev/null
+++ b/indra/newview/llavatarrendernotifier.cpp
@@ -0,0 +1,258 @@
+/**
+ * @file llavatarrendernotifier.cpp
+ * @author andreykproductengine
+ * @date 2015-08-05
+ * @brief
+ *
+ * $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$
+ */
+
+// Pre-compiled headers
+#include "llviewerprecompiledheaders.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llagentwearables.h"
+#include "llappearancemgr.h"
+#include "llattachmentsmgr.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llnotificationtemplate.h"
+#include "lltimer.h"
+#include "llvoavatarself.h"
+#include "llviewercontrol.h"
+#include "lltrans.h"
+// associated header
+#include "llavatarrendernotifier.h"
+
+// when change exceeds this ration, notification is shown
+static const F32 RENDER_ALLOWED_CHANGE_PCT = 0.1;
+// wait seconds before processing over limit updates after last complexity change
+static const U32 OVER_LIMIT_UPDATE_DELAY = 70;
+
+
+LLAvatarRenderNotifier::LLAvatarRenderNotifier() :
+mAgentsCount(0),
+mOverLimitAgents(0),
+mAgentComplexity(0),
+mOverLimitPct(0.0f),
+mLatestAgentsCount(0),
+mLatestOverLimitAgents(0),
+mLatestAgentComplexity(0),
+mLatestOverLimitPct(0.0f),
+mShowOverLimitAgents(false),
+mNotifyOutfitLoading(false),
+mLastCofVersion(-1),
+mLastOutfitRezStatus(-1),
+mLastSkeletonSerialNum(-1)
+{
+ mPopUpDelayTimer.resetWithExpiry(OVER_LIMIT_UPDATE_DELAY);
+}
+
+std::string LLAvatarRenderNotifier::overLimitMessage()
+{
+ static const char* everyone_now = "av_render_everyone_now";
+ static const char* not_everyone = "av_render_not_everyone";
+ static const char* over_half = "av_render_over_half";
+ static const char* most = "av_render_most_of";
+ static const char* anyone = "av_render_anyone";
+
+ std::string message;
+ if ( mLatestOverLimitPct >= 99.0 )
+ {
+ message = anyone;
+ }
+ else if ( mLatestOverLimitPct >= 75.0 )
+ {
+ message = most;
+ }
+ else if ( mLatestOverLimitPct >= 50.0 )
+ {
+ message = over_half;
+ }
+ else if ( mLatestOverLimitPct > 10.0 )
+ {
+ message = not_everyone;
+ }
+ else
+ {
+ // Will be shown only after overlimit was > 0
+ message = everyone_now;
+ }
+ return LLTrans::getString(message);
+}
+
+void LLAvatarRenderNotifier::displayNotification(bool show_over_limit)
+{
+ mAgentComplexity = mLatestAgentComplexity;
+ mShowOverLimitAgents = show_over_limit;
+ static LLCachedControl<U32> expire_delay(gSavedSettings, "ShowMyComplexityChanges", 20);
+
+ LLDate expire_date(LLDate::now().secondsSinceEpoch() + expire_delay);
+ LLSD args;
+ args["AGENT_COMPLEXITY"] = LLSD::Integer(mLatestAgentComplexity);
+ std::string notification_name;
+ if (mShowOverLimitAgents)
+ {
+ mAgentsCount = mLatestAgentsCount;
+ mOverLimitAgents = mLatestOverLimitAgents;
+ mOverLimitPct = mLatestOverLimitPct;
+
+ std::string notification_message = overLimitMessage();
+ notification_name = "RegionAndAgentComplexity";
+ args["OVERLIMIT_MSG"] = notification_message;
+ }
+ else
+ {
+ notification_name = "AgentComplexity";
+ }
+
+ if (mNotificationPtr != NULL && mNotificationPtr->getName() != notification_name)
+ {
+ // since unique tag works only for same notification,
+ // old notification needs to be canceled manually
+ LLNotifications::instance().cancel(mNotificationPtr);
+ }
+
+ LL_INFOS("AvatarRenderInfo") << notification_name << " " << args << LL_ENDL;
+
+ mNotificationPtr = LLNotifications::instance().add(LLNotification::Params()
+ .name(notification_name)
+ .expiry(expire_date)
+ .substitutions(args));
+}
+
+bool LLAvatarRenderNotifier::isNotificationVisible()
+{
+ return mNotificationPtr != NULL && mNotificationPtr->isActive();
+}
+
+void LLAvatarRenderNotifier::updateNotificationRegion(U32 agentcount, U32 overLimit)
+{
+ if (agentcount == 0)
+ {
+ // Data not ready
+ return;
+ }
+
+ // save current values for later use
+ mLatestAgentsCount = agentcount > overLimit ? agentcount - 1 : agentcount; // subtract self
+ mLatestOverLimitAgents = overLimit;
+ mLatestOverLimitPct = mLatestAgentsCount != 0 ? ((F32)overLimit / (F32)mLatestAgentsCount) * 100.0 : 0;
+
+ if (mAgentsCount == mLatestAgentsCount
+ && mOverLimitAgents == mLatestOverLimitAgents)
+ {
+ // no changes since last notification
+ return;
+ }
+
+ if ((mPopUpDelayTimer.hasExpired() || (isNotificationVisible() && mShowOverLimitAgents))
+ && (mOverLimitPct > 0 || mLatestOverLimitPct > 0)
+ && std::abs(mOverLimitPct - mLatestOverLimitPct) > mLatestOverLimitPct * RENDER_ALLOWED_CHANGE_PCT
+ )
+ {
+ // display in case of drop to/from zero and in case of significant (RENDER_ALLOWED_CHANGE_PCT) changes
+ displayNotification(true);
+
+ // default timeout before next notification
+ static LLCachedControl<U32> pop_up_delay(gSavedSettings, "ComplexityChangesPopUpDelay", 300);
+ mPopUpDelayTimer.resetWithExpiry(pop_up_delay);
+ }
+}
+
+void LLAvatarRenderNotifier::updateNotificationState()
+{
+ if (!isAgentAvatarValid())
+ {
+ // data not ready, nothing to show.
+ return;
+ }
+
+ // Don't use first provided COF and Sceleton versions - let them load anf 'form' first
+ if (mLastCofVersion < 0
+ && gAgentWearables.areWearablesLoaded()
+ && LLAttachmentsMgr::getInstance()->isAttachmentStateComplete())
+ {
+ // cof formed
+ mLastCofVersion = LLAppearanceMgr::instance().getCOFVersion();
+ mLastSkeletonSerialNum = gAgentAvatarp->mLastSkeletonSerialNum;
+ }
+ else if (mLastCofVersion >= 0
+ && (mLastCofVersion != gAgentAvatarp->mLastUpdateRequestCOFVersion
+ || mLastSkeletonSerialNum != gAgentAvatarp->mLastSkeletonSerialNum))
+ {
+ // version mismatch in comparison to previous outfit - outfit changed
+ mNotifyOutfitLoading = true;
+ mLastCofVersion = LLAppearanceMgr::instance().getCOFVersion();
+ mLastSkeletonSerialNum = gAgentAvatarp->mLastSkeletonSerialNum;
+ }
+
+ if (gAgentAvatarp->mLastRezzedStatus < mLastOutfitRezStatus)
+ {
+ // rez status decreased - outfit related action was initiated
+ mNotifyOutfitLoading = true;
+ }
+
+ mLastOutfitRezStatus = gAgentAvatarp->mLastRezzedStatus;
+}
+void LLAvatarRenderNotifier::updateNotificationAgent(U32 agentComplexity)
+{
+ // save the value for use in following messages
+ mLatestAgentComplexity = agentComplexity;
+
+ if (!isAgentAvatarValid() || !gAgentWearables.areWearablesLoaded())
+ {
+ // data not ready, nothing to show.
+ return;
+ }
+
+ if (!mNotifyOutfitLoading)
+ {
+ // We should not notify about initial outfit and it's load process without reason
+ updateNotificationState();
+
+ if (mLatestOverLimitAgents > 0)
+ {
+ // Some users can't see agent already, notify user about complexity growth
+ mNotifyOutfitLoading = true;
+ }
+
+ if (!mNotifyOutfitLoading)
+ {
+ // avatar or outfit not ready
+ mAgentComplexity = mLatestAgentComplexity;
+ return;
+ }
+ }
+
+ if (mAgentComplexity != mLatestAgentComplexity)
+ {
+ // if we have an agent complexity change, we always display it and hide 'over limit'
+ displayNotification(false);
+
+ // next 'over limit' update should be displayed after delay to make sure information got updated at server side
+ mPopUpDelayTimer.resetWithExpiry(OVER_LIMIT_UPDATE_DELAY);
+ }
+}
+
diff --git a/indra/newview/llavatarrendernotifier.h b/indra/newview/llavatarrendernotifier.h
new file mode 100644
index 0000000000..2a2704de28
--- /dev/null
+++ b/indra/newview/llavatarrendernotifier.h
@@ -0,0 +1,84 @@
+/**
+ * @file llavatarrendernotifier.h
+ * @author andreykproductengine
+ * @date 2015-08-05
+ * @brief
+ *
+ * $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$
+ */
+
+#if ! defined(LL_llavatarrendernotifier_H)
+#define LL_llavatarrendernotifier_H
+
+#include "llnotificationptr.h"
+
+class LLViewerRegion;
+
+// Class to notify user about drastic changes in agent's render weights or if other agents
+// reported that user's agent is too 'heavy' for their settings
+class LLAvatarRenderNotifier : public LLSingleton<LLAvatarRenderNotifier>
+{
+public:
+ LLAvatarRenderNotifier();
+
+ void displayNotification(bool show_over_limit);
+ bool isNotificationVisible();
+
+ void updateNotificationRegion(U32 agentcount, U32 overLimit);
+ void updateNotificationState();
+ void updateNotificationAgent(U32 agentComplexity);
+
+private:
+
+ LLNotificationPtr mNotificationPtr;
+
+ // to prevent notification from popping up too often, show it only
+ // if certain amount of time passed since previous notification
+ LLFrameTimer mPopUpDelayTimer;
+
+ // values since last notification for comparison purposes
+ U32 mAgentsCount;
+ U32 mOverLimitAgents;
+ U32 mAgentComplexity;
+ F32 mOverLimitPct;
+
+ // last reported values
+ U32 mLatestAgentsCount;
+ U32 mLatestOverLimitAgents;
+ U32 mLatestAgentComplexity;
+ F32 mLatestOverLimitPct;
+
+ bool mShowOverLimitAgents;
+ std::string overLimitMessage();
+
+ // initial outfit related variables (state control)
+ bool mNotifyOutfitLoading;
+
+ // COF (inventory folder) and Skeleton (voavatar) are used to spot changes in outfit.
+ S32 mLastCofVersion;
+ S32 mLastSkeletonSerialNum;
+ // Used to detect changes in voavatar's rezzed status.
+ // If value decreases - there were changes in outfit.
+ S32 mLastOutfitRezStatus;
+};
+
+#endif /* ! defined(LL_llavatarrendernotifier_H) */
diff --git a/indra/newview/llcallbacklist.cpp b/indra/newview/llcallbacklist.cpp
index 59ecbdd0ea..59ecbdd0ea 100755..100644
--- a/indra/newview/llcallbacklist.cpp
+++ b/indra/newview/llcallbacklist.cpp
diff --git a/indra/newview/llcallbacklist.h b/indra/newview/llcallbacklist.h
deleted file mode 100755
index 0516c9cdb4..0000000000
--- a/indra/newview/llcallbacklist.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * @file llcallbacklist.h
- * @brief A simple list of callback functions to call.
- *
- * $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_LLCALLBACKLIST_H
-#define LL_LLCALLBACKLIST_H
-
-#include "llstl.h"
-
-class LLCallbackList
-{
-public:
- typedef void (*callback_t)(void*);
-
- LLCallbackList();
- ~LLCallbackList();
-
- void addFunction( callback_t func, void *data = NULL ); // register a callback, which will be called as func(data)
- BOOL containsFunction( callback_t func, void *data = NULL ); // true if list already contains the function/data pair
- BOOL deleteFunction( callback_t func, void *data = NULL ); // removes the first instance of this function/data pair from the list, false if not found
- void callFunctions(); // calls all functions
- void deleteAllFunctions();
-
- static void test();
-
-protected:
- // Use a list so that the callbacks are ordered in case that matters
- typedef std::pair<callback_t,void*> callback_pair_t;
- typedef std::list<callback_pair_t > callback_list_t;
- callback_list_t mCallbackList;
-};
-
-typedef boost::function<void ()> nullary_func_t;
-typedef boost::function<bool ()> bool_func_t;
-
-// Call a given callable once in idle loop.
-void doOnIdleOneTime(nullary_func_t callable);
-
-// Repeatedly call a callable in idle loop until it returns true.
-void doOnIdleRepeating(bool_func_t callable);
-
-// Call a given callable once after specified interval.
-void doAfterInterval(nullary_func_t callable, F32 seconds);
-
-// Call a given callable every specified number of seconds, until it returns true.
-void doPeriodically(bool_func_t callable, F32 seconds);
-
-extern LLCallbackList gIdleCallbacks;
-
-#endif
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index b6c5496c17..f79d1aa609 100755
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -97,7 +97,8 @@ static void on_avatar_name_cache_notify(const LLUUID& agent_id,
LLAvatarTracker::LLAvatarTracker() :
mTrackingData(NULL),
mTrackedAgentValid(false),
- mModifyMask(0x0)
+ mModifyMask(0x0),
+ mIsNotifyObservers(FALSE)
{
}
@@ -272,7 +273,7 @@ S32 LLAvatarTracker::addBuddyList(const LLAvatarTracker::buddy_map_t& buds)
<< "]" << LL_ENDL;
}
}
- notifyObservers();
+ // do not notify observers here - list can be large so let it be done on idle.
return new_buddy_count;
}
@@ -473,8 +474,25 @@ void LLAvatarTracker::removeObserver(LLFriendObserver* observer)
mObservers.end());
}
+void LLAvatarTracker::idleNotifyObservers()
+{
+ if (mModifyMask == LLFriendObserver::NONE && mChangedBuddyIDs.size() == 0)
+ {
+ return;
+ }
+ notifyObservers();
+}
+
void LLAvatarTracker::notifyObservers()
{
+ if (mIsNotifyObservers)
+ {
+ // Don't allow multiple calls.
+ // new masks and ids will be processed later from idle.
+ return;
+ }
+ mIsNotifyObservers = TRUE;
+
observer_list_t observers(mObservers);
observer_list_t::iterator it = observers.begin();
observer_list_t::iterator end = observers.end();
@@ -490,6 +508,7 @@ void LLAvatarTracker::notifyObservers()
mModifyMask = LLFriendObserver::NONE;
mChangedBuddyIDs.clear();
+ mIsNotifyObservers = FALSE;
}
void LLAvatarTracker::addParticularFriendObserver(const LLUUID& buddy_id, LLFriendObserver* observer)
@@ -531,7 +550,7 @@ void LLAvatarTracker::notifyParticularFriendObservers(const LLUUID& buddy_id)
// store flag for change
// and id of object change applies to
void LLAvatarTracker::addChangedMask(U32 mask, const LLUUID& referent)
-{
+{
mModifyMask |= mask;
if (referent.notNull())
{
diff --git a/indra/newview/llcallingcard.h b/indra/newview/llcallingcard.h
index 6e5fc01cd8..1f819a42fd 100755
--- a/indra/newview/llcallingcard.h
+++ b/indra/newview/llcallingcard.h
@@ -143,6 +143,7 @@ public:
// observers left behind.
void addObserver(LLFriendObserver* observer);
void removeObserver(LLFriendObserver* observer);
+ void idleNotifyObservers();
void notifyObservers();
// Observers interested in updates of a particular avatar.
@@ -209,6 +210,8 @@ private:
LLAvatarTracker(const LLAvatarTracker&);
bool operator==(const LLAvatarTracker&);
+ BOOL mIsNotifyObservers;
+
public:
// don't you dare create or delete this object
LLAvatarTracker();
diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp
index b0537a83f1..d6240838b6 100755
--- a/indra/newview/llchannelmanager.cpp
+++ b/indra/newview/llchannelmanager.cpp
@@ -35,6 +35,7 @@
#include "llviewerwindow.h"
#include "llrootview.h"
#include "llsyswellwindow.h"
+#include "llfloaternotificationstabbed.h"
#include "llfloaterreg.h"
#include <algorithm>
@@ -131,7 +132,7 @@ void LLChannelManager::onLoginCompleted()
S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound);
- mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4));
+ mStartUpChannel->setMouseDownCallback(boost::bind(&LLFloaterNotificationsTabbed::onStartUpToastClick, LLFloaterNotificationsTabbed::getInstance(), _2, _3, _4));
mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this));
mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime"));
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index f0bd63ba46..dc0835eb1c 100755
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -376,6 +376,10 @@ public:
|| mSourceType == CHAT_SOURCE_SYSTEM)
{
mFrom = LLTrans::getString("SECOND_LIFE");
+ if(!chat.mFromName.empty() && (mFrom != chat.mFromName))
+ {
+ mFrom += " (" + chat.mFromName + ")";
+ }
user_name->setValue(mFrom);
updateMinUserNameWidth();
}
@@ -934,7 +938,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
// compact mode: show a timestamp and name
if (use_plain_text_chat_history)
{
- square_brackets = chat.mFromName == SYSTEM_FROM;
+ square_brackets = chat.mSourceType == CHAT_SOURCE_SYSTEM;
LLStyle::Params timestamp_style(body_message_params);
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 46b7679915..dedb06c945 100755
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -35,6 +35,7 @@
#include "llscriptfloater.h"
#include "llsingleton.h"
#include "llsyswellwindow.h"
+#include "llfloaternotificationstabbed.h"
static LLDefaultChildRegistry::Register<LLChicletPanel> t1("chiclet_panel");
static LLDefaultChildRegistry::Register<LLNotificationChiclet> t2("chiclet_notification");
@@ -165,7 +166,7 @@ LLNotificationChiclet::LLNotificationChiclet(const Params& p)
mNotificationChannel.reset(new ChicletNotificationChannel(this));
// ensure that notification well window exists, to synchronously
// handle toast add/delete events.
- LLNotificationWellWindow::getInstance()->setSysWellChiclet(this);
+ LLFloaterNotificationsTabbed::getInstance()->setSysWellChiclet(this);
}
void LLNotificationChiclet::onMenuItemClicked(const LLSD& user_data)
@@ -173,7 +174,7 @@ void LLNotificationChiclet::onMenuItemClicked(const LLSD& user_data)
std::string action = user_data.asString();
if("close all" == action)
{
- LLNotificationWellWindow::getInstance()->closeAll();
+ LLFloaterNotificationsTabbed::getInstance()->closeAll();
LLIMWellWindow::getInstance()->closeAll();
}
}
@@ -224,7 +225,8 @@ bool LLNotificationChiclet::ChicletNotificationChannel::filterNotification( LLNo
bool displayNotification;
if ( (notification->getName() == "ScriptDialog") // special case for scripts
// if there is no toast window for the notification, filter it
- || (!LLNotificationWellWindow::getInstance()->findItemByID(notification->getID()))
+ //|| (!LLNotificationWellWindow::getInstance()->findItemByID(notification->getID()))
+ || (!LLFloaterNotificationsTabbed::getInstance()->findItemByID(notification->getID(), notification->getName()))
)
{
displayNotification = false;
diff --git a/indra/newview/llchicletbar.cpp b/indra/newview/llchicletbar.cpp
index d8b04f7004..254e3f61a8 100755
--- a/indra/newview/llchicletbar.cpp
+++ b/indra/newview/llchicletbar.cpp
@@ -31,6 +31,7 @@
#include "lllayoutstack.h"
#include "llpaneltopinfobar.h"
#include "llsyswellwindow.h"
+#include "llfloaternotificationstabbed.h"
namespace
{
@@ -49,7 +50,7 @@ BOOL LLChicletBar::postBuild()
mToolbarStack = getChild<LLLayoutStack>("toolbar_stack");
mChicletPanel = getChild<LLChicletPanel>("chiclet_list");
- showWellButton("notification_well", !LLNotificationWellWindow::getInstance()->isWindowEmpty());
+ showWellButton("notification_well", !LLFloaterNotificationsTabbed::getInstance()->isWindowEmpty());
LLPanelTopInfoBar::instance().setResizeCallback(boost::bind(&LLChicletBar::fitWithTopInfoBar, this));
LLPanelTopInfoBar::instance().setVisibleCallback(boost::bind(&LLChicletBar::fitWithTopInfoBar, this));
diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp
index 19dba3f917..5ea7efc045 100755
--- a/indra/newview/llcommandhandler.cpp
+++ b/indra/newview/llcommandhandler.cpp
@@ -30,6 +30,7 @@
#include "llcommandhandler.h"
#include "llnotificationsutil.h"
#include "llcommanddispatcherlistener.h"
+#include "llstartup.h"
#include "stringize.h"
// system includes
@@ -116,7 +117,11 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
LL_WARNS_ONCE("SLURL") << "Blocked SLURL command from untrusted browser" << LL_ENDL;
if (! slurl_blocked)
{
- LLNotificationsUtil::add("BlockedSLURL");
+ if (LLStartUp::getStartupState() >= STATE_BROWSER_INIT)
+ {
+ // Note: commands can arrive before we initialize everything we need for Notification.
+ LLNotificationsUtil::add("BlockedSLURL");
+ }
slurl_blocked = true;
}
return true;
@@ -138,7 +143,10 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
LL_WARNS_ONCE("SLURL") << "Throttled SLURL command from untrusted browser" << LL_ENDL;
if (! slurl_throttled)
{
- LLNotificationsUtil::add("ThrottledSLURL");
+ if (LLStartUp::getStartupState() >= STATE_BROWSER_INIT)
+ {
+ LLNotificationsUtil::add("ThrottledSLURL");
+ }
slurl_throttled = true;
}
return true;
diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp
index b0916d769a..d9fd4509a5 100755
--- a/indra/newview/llcompilequeue.cpp
+++ b/indra/newview/llcompilequeue.cpp
@@ -59,6 +59,8 @@
#include "lltrans.h"
#include "llselectmgr.h"
+#include "llexperienceassociationresponder.h"
+#include "llexperiencecache.h"
// *TODO: This should be separated into the script queue, and the floater views of that queue.
// There should only be one floater class that can view any queue type
@@ -70,11 +72,13 @@
struct LLScriptQueueData
{
LLUUID mQueueID;
- std::string mScriptName;
LLUUID mTaskId;
- LLUUID mItemId;
- LLScriptQueueData(const LLUUID& q_id, const std::string& name, const LLUUID& task_id, const LLUUID& item_id) :
- mQueueID(q_id), mScriptName(name), mTaskId(task_id), mItemId(item_id) {}
+ LLPointer<LLInventoryItem> mItem;
+ LLHost mHost;
+ LLUUID mExperienceId;
+ std::string mExperiencename;
+ LLScriptQueueData(const LLUUID& q_id, const LLUUID& task_id, LLInventoryItem* item) :
+ mQueueID(q_id), mTaskId(task_id), mItem(new LLInventoryItem(item)) {}
};
@@ -88,6 +92,7 @@ LLFloaterScriptQueue::LLFloaterScriptQueue(const LLSD& key) :
mDone(false),
mMono(false)
{
+
}
// Destroys the object
@@ -167,7 +172,7 @@ BOOL LLFloaterScriptQueue::start()
getChild<LLScrollListCtrl>("queue output")->addSimpleElement(buffer, ADD_BOTTOM);
- return nextObject();
+ return startQueue();
}
BOOL LLFloaterScriptQueue::isDone() const
@@ -232,6 +237,40 @@ BOOL LLFloaterScriptQueue::popNext()
return rv;
}
+BOOL LLFloaterScriptQueue::startQueue()
+{
+ return nextObject();
+}
+
+class CompileQueueExperienceResponder : public LLHTTPClient::Responder
+{
+public:
+ CompileQueueExperienceResponder(const LLUUID& parent):mParent(parent)
+ {
+ }
+
+ LLUUID mParent;
+
+ /*virtual*/ void httpSuccess()
+ {
+ sendResult(getContent());
+ }
+ /*virtual*/ void httpFailure()
+ {
+ sendResult(LLSD());
+ }
+ void sendResult(const LLSD& content)
+ {
+ LLFloaterCompileQueue* queue = LLFloaterReg::findTypedInstance<LLFloaterCompileQueue>("compile_queue", mParent);
+ if(!queue)
+ return;
+
+ queue->experienceIdsReceived(content["experience_ids"]);
+ }
+};
+
+
+
///----------------------------------------------------------------------------
/// Class LLFloaterCompileQueue
@@ -284,6 +323,21 @@ LLFloaterCompileQueue::~LLFloaterCompileQueue()
{
}
+void LLFloaterCompileQueue::experienceIdsReceived( const LLSD& content )
+{
+ for(LLSD::array_const_iterator it = content.beginArray(); it != content.endArray(); ++it)
+ {
+ mExperienceIds.insert(it->asUUID());
+ }
+ nextObject();
+}
+
+BOOL LLFloaterCompileQueue::hasExperience( const LLUUID& id ) const
+{
+ return mExperienceIds.find(id) != mExperienceIds.end();
+}
+
+
void LLFloaterCompileQueue::handleInventory(LLViewerObject *viewer_object,
LLInventoryObject::object_list_t* inv)
{
@@ -324,25 +378,52 @@ void LLFloaterCompileQueue::handleInventory(LLViewerObject *viewer_object,
{
LLInventoryItem *itemp = iter->second;
LLScriptQueueData* datap = new LLScriptQueueData(getKey().asUUID(),
- itemp->getName(),
- viewer_object->getID(),
- itemp->getUUID());
-
- //LL_INFOS() << "ITEM NAME 2: " << names.get(i) << LL_ENDL;
- gAssetStorage->getInvItemAsset(viewer_object->getRegion()->getHost(),
- gAgent.getID(),
- gAgent.getSessionID(),
- itemp->getPermissions().getOwner(),
- viewer_object->getID(),
- itemp->getUUID(),
- itemp->getAssetUUID(),
- itemp->getType(),
- LLFloaterCompileQueue::scriptArrived,
- (void*)datap);
+ viewer_object->getID(), itemp);
+
+ ExperienceAssociationResponder::fetchAssociatedExperience(itemp->getParentUUID(), itemp->getUUID(),
+ boost::bind(LLFloaterCompileQueue::requestAsset, datap, _1));
+ }
+ }
+}
+
+
+void LLFloaterCompileQueue::requestAsset( LLScriptQueueData* datap, const LLSD& experience )
+{
+ LLFloaterCompileQueue* queue = LLFloaterReg::findTypedInstance<LLFloaterCompileQueue>("compile_queue", datap->mQueueID);
+ if(!queue)
+ {
+ delete datap;
+ return;
+ }
+ if(experience.has(LLExperienceCache::EXPERIENCE_ID))
+ {
+ datap->mExperienceId=experience[LLExperienceCache::EXPERIENCE_ID].asUUID();
+ if(!queue->hasExperience(datap->mExperienceId))
+ {
+ std::string buffer = LLTrans::getString("CompileNoExperiencePerm", LLSD::emptyMap()
+ .with("SCRIPT", datap->mItem->getName())
+ .with("EXPERIENCE", experience[LLExperienceCache::NAME].asString()));
+
+ queue->getChild<LLScrollListCtrl>("queue output")->addSimpleElement(buffer, ADD_BOTTOM);
+ queue->removeItemByItemID(datap->mItem->getUUID());
+ delete datap;
+ return;
}
}
+ //LL_INFOS() << "ITEM NAME 2: " << names.get(i) << LL_ENDL;
+ gAssetStorage->getInvItemAsset(datap->mHost,
+ gAgent.getID(),
+ gAgent.getSessionID(),
+ datap->mItem->getPermissions().getOwner(),
+ datap->mTaskId,
+ datap->mItem->getUUID(),
+ datap->mItem->getAssetUUID(),
+ datap->mItem->getType(),
+ LLFloaterCompileQueue::scriptArrived,
+ (void*)datap);
}
+
// This is the callback for when each script arrives
// static
void LLFloaterCompileQueue::scriptArrived(LLVFS *vfs, const LLUUID& asset_id,
@@ -382,12 +463,12 @@ void LLFloaterCompileQueue::scriptArrived(LLVFS *vfs, const LLUUID& asset_id,
file.read(script_data, script_size);
queue->mUploadQueue->queue(filename, data->mTaskId,
- data->mItemId, is_running, queue->mMono, queue->getKey().asUUID(),
- script_data, script_size, data->mScriptName);
+ data->mItem->getUUID(), is_running, queue->mMono, queue->getKey().asUUID(),
+ script_data, script_size, data->mItem->getName(), data->mExperienceId);
}
else
{
- buffer = LLTrans::getString("CompileQueueServiceUnavailable") + (": ") + data->mScriptName;
+ buffer = LLTrans::getString("CompileQueueServiceUnavailable") + (": ") + data->mItem->getName();
}
}
}
@@ -399,7 +480,7 @@ void LLFloaterCompileQueue::scriptArrived(LLVFS *vfs, const LLUUID& asset_id,
args["MESSAGE"] = LLTrans::getString("CompileQueueScriptNotFound");
LLNotificationsUtil::add("SystemMessage", args);
- buffer = LLTrans::getString("CompileQueueProblemDownloading") + (": ") + data->mScriptName;
+ buffer = LLTrans::getString("CompileQueueProblemDownloading") + (": ") + data->mItem->getName();
}
else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)
{
@@ -407,15 +488,15 @@ void LLFloaterCompileQueue::scriptArrived(LLVFS *vfs, const LLUUID& asset_id,
args["MESSAGE"] = LLTrans::getString("CompileQueueInsufficientPermDownload");
LLNotificationsUtil::add("SystemMessage", args);
- buffer = LLTrans::getString("CompileQueueInsufficientPermFor") + (": ") + data->mScriptName;
+ buffer = LLTrans::getString("CompileQueueInsufficientPermFor") + (": ") + data->mItem->getName();
}
else
{
- buffer = LLTrans::getString("CompileQueueUnknownFailure") + (" ") + data->mScriptName;
+ buffer = LLTrans::getString("CompileQueueUnknownFailure") + (" ") + data->mItem->getName();
}
LL_WARNS() << "Problem downloading script asset." << LL_ENDL;
- if(queue) queue->removeItemByItemID(data->mItemId);
+ if(queue) queue->removeItemByItemID(data->mItem->getUUID());
}
if(queue && (buffer.size() > 0))
{
@@ -564,6 +645,23 @@ void LLFloaterCompileQueue::removeItemByItemID(const LLUUID& asset_id)
}
}
+BOOL LLFloaterCompileQueue::startQueue()
+{
+ LLViewerRegion* region = gAgent.getRegion();
+ if (region)
+ {
+ std::string lookup_url=region->getCapability("GetCreatorExperiences");
+ if(!lookup_url.empty())
+ {
+ LLHTTPClient::get(lookup_url, new CompileQueueExperienceResponder(getKey().asUUID()));
+ return TRUE;
+ }
+ }
+ return nextObject();
+}
+
+
+
void LLFloaterNotRunQueue::handleInventory(LLViewerObject* viewer_obj,
LLInventoryObject::object_list_t* inv)
{
diff --git a/indra/newview/llcompilequeue.h b/indra/newview/llcompilequeue.h
index 28f4625de8..54842bb302 100755
--- a/indra/newview/llcompilequeue.h
+++ b/indra/newview/llcompilequeue.h
@@ -81,13 +81,15 @@ protected:
// returns true if this is done
BOOL isDone() const;
+ virtual BOOL startQueue();
+
// go to the next object. If no objects left, it falls out
// silently and waits to be killed by the deleteIfDone() callback.
BOOL nextObject();
BOOL popNext();
void setStartString(const std::string& s) { mStartString = s; }
-
+
protected:
// UI
LLScrollListCtrl* mMessages;
@@ -131,6 +133,9 @@ public:
LLAssetUploadQueue* getUploadQueue() { return mUploadQueue; }
+ void experienceIdsReceived( const LLSD& content );
+ BOOL hasExperience(const LLUUID& id)const;
+
protected:
LLFloaterCompileQueue(const LLSD& key);
virtual ~LLFloaterCompileQueue();
@@ -139,16 +144,21 @@ protected:
virtual void handleInventory(LLViewerObject* viewer_obj,
LLInventoryObject::object_list_t* inv);
+ static void requestAsset(struct LLScriptQueueData* datap, const LLSD& experience);
+
+
// This is the callback for when each script arrives
static void scriptArrived(LLVFS *vfs, const LLUUID& asset_id,
LLAssetType::EType type,
void* user_data, S32 status, LLExtStat ext_status);
+ virtual BOOL startQueue();
protected:
LLViewerInventoryItem::item_array_t mCurrentScripts;
private:
LLAssetUploadQueue* mUploadQueue;
+ uuid_list_t mExperienceIds;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/indra/newview/llconversationlog.h b/indra/newview/llconversationlog.h
index b38d472156..62f08144b9 100755
--- a/indra/newview/llconversationlog.h
+++ b/indra/newview/llconversationlog.h
@@ -153,6 +153,7 @@ public:
* file name is conversation.log
*/
std::string getFileName();
+ LLConversation* findConversation(const LLIMModel::LLIMSession* session);
private:
@@ -184,7 +185,7 @@ private:
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;
diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp
index 6e32ce60ec..328a638f2f 100755
--- a/indra/newview/llconversationmodel.cpp
+++ b/indra/newview/llconversationmodel.cpp
@@ -136,7 +136,24 @@ void LLConversationItem::buildParticipantMenuOptions(menuentry_vec_t& items, U32
items.push_back(std::string("im"));
items.push_back(std::string("offer_teleport"));
items.push_back(std::string("request_teleport"));
- items.push_back(std::string("voice_call"));
+
+ if (getType() != CONV_SESSION_1_ON_1)
+ {
+ items.push_back(std::string("voice_call"));
+ }
+ else
+ {
+ LLVoiceChannel* voice_channel = LLIMModel::getInstance() ? LLIMModel::getInstance()->getVoiceChannel(this->getUUID()) : NULL;
+ if(voice_channel != LLVoiceChannel::getCurrentVoiceChannel())
+ {
+ items.push_back(std::string("voice_call"));
+ }
+ else
+ {
+ items.push_back(std::string("disconnect_from_voice"));
+ }
+ }
+
items.push_back(std::string("chat_history"));
items.push_back(std::string("separator_chat_history"));
items.push_back(std::string("add_friend"));
diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h
index deff94ea16..af7b50802c 100644
--- a/indra/newview/llconversationmodel.h
+++ b/indra/newview/llconversationmodel.h
@@ -86,7 +86,7 @@ public:
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 cutToClipboard() { return FALSE; }
virtual BOOL isClipboardPasteable() const { return FALSE; }
virtual void pasteFromClipboard() { }
virtual void pasteLinkFromClipboard() { }
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index e1d3d1a905..6693c5e033 100755
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -1281,13 +1281,6 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
return;
}
- llassert(LLPipeline::sImpostorRender || !avatarp->isVisuallyMuted());
-
- /*if (single_avatar && avatarp->mSpecialRenderMode >= 1) // 1=anim preview, 2=image preview, 3=morph view
- {
- gPipeline.enableLightsAvatarEdit(LLColor4(.5f, .5f, .5f, 1.f));
- }*/
-
if (pass == 1)
{
// render rigid meshes (eyeballs) first
@@ -1553,7 +1546,8 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
(drawable && drawable->isState(LLDrawable::REBUILD_ALL)))
{
if (drawable && drawable->isState(LLDrawable::REBUILD_ALL))
- { //rebuild EVERY face in the drawable, not just this one, to avoid missing drawable wide rebuild issues
+ {
+ //rebuild EVERY face in the drawable, not just this one, to avoid missing drawable wide rebuild issues
for (S32 i = 0; i < drawable->getNumFaces(); ++i)
{
LLFace* facep = drawable->getFace(i);
@@ -1570,13 +1564,15 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
buffer = face->getVertexBuffer();
}
else
- { //just rebuild this face
+ {
+ //just rebuild this face
getRiggedGeometry(face, buffer, data_mask, skin, volume, vol_face);
}
}
if (sShaderLevel <= 0 && face->mLastSkinTime < avatar->getLastSkinTime())
- { //perform software vertex skinning for this face
+ {
+ //perform software vertex skinning for this face
LLStrider<LLVector3> position;
LLStrider<LLVector3> normal;
@@ -1600,6 +1596,10 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
for (U32 j = 0; j < count; ++j)
{
LLJoint* joint = avatar->getJoint(skin->mJointNames[j]);
+ if (!joint)
+ {
+ joint = avatar->getJoint("mPelvis");
+ }
if (joint)
{
mat[j] = skin->mInvBindMatrix[j];
@@ -1624,12 +1624,13 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
{
F32 w = weight[j][k];
- idx[k] = llclamp((S32) floorf(w), 0, JOINT_COUNT-1);
+ idx[k] = llclamp((S32) floorf(w), (S32)0, (S32)JOINT_COUNT-1);
wght[k] = w - floorf(w);
scale += wght[k];
}
-
+ // This is enforced in unpackVolumeFaces()
+ llassert(scale>0.f);
wght *= 1.f/scale;
for (U32 k = 0; k < 4; k++)
@@ -1729,6 +1730,10 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
for (U32 i = 0; i < count; ++i)
{
LLJoint* joint = avatar->getJoint(skin->mJointNames[i]);
+ if (!joint)
+ {
+ joint = avatar->getJoint("mPelvis");
+ }
if (joint)
{
mat[i] = skin->mInvBindMatrix[i];
@@ -1797,9 +1802,12 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
if (mat)
{
- gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture(LLRender::DIFFUSE_MAP));
- gGL.getTexUnit(normal_channel)->bind(face->getTexture(LLRender::NORMAL_MAP));
+ //order is important here LLRender::DIFFUSE_MAP should be last, becouse it change
+ //(gGL).mCurrTextureUnitIndex
gGL.getTexUnit(specular_channel)->bind(face->getTexture(LLRender::SPECULAR_MAP));
+ gGL.getTexUnit(normal_channel)->bind(face->getTexture(LLRender::NORMAL_MAP));
+ gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture(LLRender::DIFFUSE_MAP), false, true);
+
LLColor4 col = mat->getSpecularLightColor();
F32 spec = mat->getSpecularLightExponent()/255.f;
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 33f7bc305c..7b9fd5c6c6 100755
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -864,6 +864,7 @@ void LLDrawPoolBump::renderDeferred(S32 pass)
{
LLDrawInfo& params = **i;
+ gDeferredBumpProgram.setMinimumAlpha(params.mAlphaMaskCutoff);
LLDrawPoolBump::bindBumpMap(params, bump_channel);
pushBatch(params, mask, TRUE);
}
diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index a50184460b..f2602c8c7d 100755
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -116,7 +116,7 @@ LLExpandableTextBox::LLTextBoxEx::LLTextBoxEx(const Params& p)
mExpanderVisible(false)
{
setIsChrome(TRUE);
-
+ setMaxTextLength(p.max_text_length);
}
void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL called_from_parent)
diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h
index 399e48bea2..5dea35bb82 100755
--- a/indra/newview/llexpandabletextbox.h
+++ b/indra/newview/llexpandabletextbox.h
@@ -103,7 +103,7 @@ public:
Optional<LLScrollContainer::Params> scroll;
Optional<S32> max_height;
-
+
Optional<bool> bg_visible,
expanded_bg_visible;
diff --git a/indra/newview/llexperienceassociationresponder.cpp b/indra/newview/llexperienceassociationresponder.cpp
new file mode 100644
index 0000000000..7f2363aadc
--- /dev/null
+++ b/indra/newview/llexperienceassociationresponder.cpp
@@ -0,0 +1,104 @@
+/**
+ * @file llexperienceassociationresponder.cpp
+ * @brief llexperienceassociationresponder implementation. This class combines
+ * a lookup for a script association and an experience details request. The first
+ * is always async, but the second may be cached locally.
+ *
+ * $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 "llexperienceassociationresponder.h"
+#include "llexperiencecache.h"
+#include "llviewerobjectlist.h"
+#include "llviewerregion.h"
+#include "llagent.h"
+
+ExperienceAssociationResponder::ExperienceAssociationResponder(ExperienceAssociationResponder::callback_t callback):mCallback(callback)
+{
+ ref();
+}
+
+void ExperienceAssociationResponder::fetchAssociatedExperience( const LLUUID& object_id, const LLUUID& item_id, callback_t callback )
+{
+ LLSD request;
+ request["object-id"]=object_id;
+ request["item-id"]=item_id;
+ fetchAssociatedExperience(request, callback);
+}
+
+void ExperienceAssociationResponder::fetchAssociatedExperience(LLSD& request, callback_t callback)
+{
+ LLViewerObject* object = gObjectList.findObject(request["object-id"]);
+ if (!object)
+ {
+ LL_WARNS() << "Failed to find object with ID " << request["object-id"] << " in fetchAssociatedExperience" << LL_ENDL;
+ return;
+ }
+ LLViewerRegion* region = object->getRegion();
+ if (region)
+ {
+ std::string lookup_url=region->getCapability("GetMetadata");
+ if(!lookup_url.empty())
+ {
+ LLSD fields;
+ fields.append("experience");
+ request["fields"] = fields;
+ LLHTTPClient::post(lookup_url, request, new ExperienceAssociationResponder(callback));
+ }
+ }
+}
+
+void ExperienceAssociationResponder::httpFailure()
+{
+ LLSD msg;
+ msg["error"]=(LLSD::Integer)getStatus();
+ msg["message"]=getReason();
+ LL_INFOS("ExperienceAssociation") << "Failed to look up associated experience: " << getStatus() << ": " << getReason() << LL_ENDL;
+
+ sendResult(msg);
+
+}
+void ExperienceAssociationResponder::httpSuccess()
+{
+ if(!getContent().has("experience"))
+ {
+
+ LLSD msg;
+ msg["message"]="no experience";
+ msg["error"]=-1;
+ sendResult(msg);
+ return;
+ }
+
+ LLExperienceCache::get(getContent()["experience"].asUUID(), boost::bind(&ExperienceAssociationResponder::sendResult, this, _1));
+
+}
+
+void ExperienceAssociationResponder::sendResult( const LLSD& experience )
+{
+ mCallback(experience);
+ unref();
+}
+
+
+
diff --git a/indra/newview/llexperienceassociationresponder.h b/indra/newview/llexperienceassociationresponder.h
new file mode 100644
index 0000000000..2bdc3d251b
--- /dev/null
+++ b/indra/newview/llexperienceassociationresponder.h
@@ -0,0 +1,58 @@
+#include "llhttpclient.h"
+#include "llsd.h"
+/**
+ * @file llexperienceassociationresponder.h
+ * @brief llexperienceassociationresponder and related class definitions
+ *
+ * $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_LLEXPERIENCEASSOCIATIONRESPONDER_H
+#define LL_LLEXPERIENCEASSOCIATIONRESPONDER_H
+
+#include "llhttpclient.h"
+#include "llsd.h"
+
+class ExperienceAssociationResponder : public LLHTTPClient::Responder
+{
+public:
+ typedef boost::function<void(const LLSD& experience)> callback_t;
+
+ ExperienceAssociationResponder(callback_t callback);
+
+ /*virtual*/ void httpSuccess();
+ /*virtual*/ void httpFailure();
+
+ static void fetchAssociatedExperience(const LLUUID& object_it, const LLUUID& item_id, callback_t callback);
+
+private:
+ static void fetchAssociatedExperience(LLSD& request, callback_t callback);
+
+ void sendResult(const LLSD& experience);
+
+ callback_t mCallback;
+
+};
+
+#endif // LL_LLEXPERIENCEASSOCIATIONRESPONDER_H
diff --git a/indra/newview/llexperiencelog.cpp b/indra/newview/llexperiencelog.cpp
new file mode 100644
index 0000000000..ec6134a4b3
--- /dev/null
+++ b/indra/newview/llexperiencelog.cpp
@@ -0,0 +1,273 @@
+/**
+ * @file llexperiencelog.cpp
+ * @brief llexperiencelog implementation
+ *
+ * $LicenseInfo:firstyear=2014&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2014, 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 "llexperiencelog.h"
+
+#include "lldispatcher.h"
+#include "llsdserialize.h"
+#include "llviewergenericmessage.h"
+#include "llnotificationsutil.h"
+#include "lltrans.h"
+#include "llerror.h"
+#include "lldate.h"
+
+
+class LLExperienceLogDispatchHandler : public LLDispatchHandler
+{
+public:
+ virtual bool operator()(
+ const LLDispatcher* dispatcher,
+ const std::string& key,
+ const LLUUID& invoice,
+ const sparam_t& strings)
+ {
+ LLSD message;
+
+ sparam_t::const_iterator it = strings.begin();
+ if(it != strings.end()){
+ const std::string& llsdRaw = *it++;
+ std::istringstream llsdData(llsdRaw);
+ if (!LLSDSerialize::deserialize(message, llsdData, llsdRaw.length()))
+ {
+ LL_WARNS() << "LLExperienceLogDispatchHandler: Attempted to read parameter data into LLSD but failed:" << llsdRaw << LL_ENDL;
+ }
+ }
+ message["public_id"] = invoice;
+
+ // Object Name
+ if(it != strings.end())
+ {
+ message["ObjectName"] = *it++;
+ }
+
+ // parcel Name
+ if(it != strings.end())
+ {
+ message["ParcelName"] = *it++;
+ }
+ message["Count"] = 1;
+
+ LLExperienceLog::instance().handleExperienceMessage(message);
+ return true;
+ }
+};
+
+static LLExperienceLogDispatchHandler experience_log_dispatch_handler;
+
+void LLExperienceLog::handleExperienceMessage(LLSD& message)
+{
+ time_t now;
+ time(&now);
+ char daybuf[16];/* Flawfinder: ignore */
+ char time_of_day[16];/* Flawfinder: ignore */
+ strftime(daybuf, 16, "%Y-%m-%d", localtime(&now));
+ strftime(time_of_day, 16, " %H:%M:%S", localtime(&now));
+ message["Time"] = time_of_day;
+
+ std::string day = daybuf;
+
+ if(!mEvents.has(day))
+ {
+ mEvents[day] = LLSD::emptyArray();
+ }
+ LLSD& dayEvents = mEvents[day];
+ if(dayEvents.size() > 0)
+ {
+ LLSD& last = *(dayEvents.rbeginArray());
+ if( last["public_id"].asUUID() == message["public_id"].asUUID()
+ && last["ObjectName"].asString() == message["ObjectName"].asString()
+ && last["OwnerID"].asUUID() == message["OwnerID"].asUUID()
+ && last["ParcelName"].asString() == message["ParcelName"].asString()
+ && last["Permission"].asInteger() == message["Permission"].asInteger())
+ {
+ last["Count"] = last["Count"].asInteger() + 1;
+ last["Time"] = time_of_day;
+ mSignals(last);
+ return;
+ }
+ }
+ message["Time"] = time_of_day;
+ mEvents[day].append(message);
+ mSignals(message);
+}
+
+LLExperienceLog::LLExperienceLog()
+ : mMaxDays(7)
+ , mPageSize(25)
+ , mNotifyNewEvent(false)
+{
+}
+
+void LLExperienceLog::initialize()
+{
+ loadEvents();
+ if(!gGenericDispatcher.isHandlerPresent("ExperienceEvent"))
+ {
+ gGenericDispatcher.addHandler("ExperienceEvent", &experience_log_dispatch_handler);
+ }
+}
+
+std::string LLExperienceLog::getFilename()
+{
+ return gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "experience_events.xml");
+}
+
+
+std::string LLExperienceLog::getPermissionString( const LLSD& message, const std::string& base )
+{
+ std::ostringstream buf;
+ if(message.has("Permission"))
+ {
+ buf << base << message["Permission"].asInteger();
+ std::string entry;
+ if(LLTrans::findString(entry, buf.str()))
+ {
+ buf.str(entry);
+ }
+ else
+ {
+ buf.str();
+ }
+ }
+
+ if(buf.str().empty())
+ {
+ buf << base << "Unknown";
+
+ buf.str(LLTrans::getString(buf.str(), message));
+ }
+
+ return buf.str();
+}
+
+void LLExperienceLog::notify( LLSD& message )
+{
+ message["EventType"] = getPermissionString(message, "ExperiencePermission");
+ if(message.has("IsAttachment") && message["IsAttachment"].asBoolean())
+ {
+ LLNotificationsUtil::add("ExperienceEventAttachment", message);
+ }
+ else
+ {
+ LLNotificationsUtil::add("ExperienceEvent", message);
+ }
+ message.erase("EventType");
+}
+
+void LLExperienceLog::saveEvents()
+{
+ eraseExpired();
+ std::string filename = getFilename();
+ LLSD settings = LLSD::emptyMap().with("Events", mEvents);
+
+ settings["MaxDays"] = (int)mMaxDays;
+ settings["Notify"] = mNotifyNewEvent;
+ settings["PageSize"] = (int)mPageSize;
+
+ llofstream stream(filename.c_str());
+ LLSDSerialize::toPrettyXML(settings, stream);
+}
+
+
+void LLExperienceLog::loadEvents()
+{
+ LLSD settings = LLSD::emptyMap();
+
+ std::string filename = getFilename();
+ llifstream stream(filename.c_str());
+ LLSDSerialize::fromXMLDocument(settings, stream);
+
+ if(settings.has("MaxDays"))
+ {
+ setMaxDays((U32)settings["MaxDays"].asInteger());
+ }
+ if(settings.has("Notify"))
+ {
+ setNotifyNewEvent(settings["Notify"].asBoolean());
+ }
+ if(settings.has("PageSize"))
+ {
+ setPageSize((U32)settings["PageSize"].asInteger());
+ }
+ mEvents.clear();
+ if(mMaxDays > 0 && settings.has("Events"))
+ {
+ mEvents = settings["Events"];
+ }
+
+ eraseExpired();
+}
+
+LLExperienceLog::~LLExperienceLog()
+{
+ saveEvents();
+}
+
+void LLExperienceLog::eraseExpired()
+{
+ while(mEvents.size() > mMaxDays && mMaxDays > 0)
+ {
+ mEvents.erase(mEvents.beginMap()->first);
+ }
+}
+
+const LLSD& LLExperienceLog::getEvents() const
+{
+ return mEvents;
+}
+
+void LLExperienceLog::clear()
+{
+ mEvents.clear();
+}
+
+void LLExperienceLog::setMaxDays( U32 val )
+{
+ mMaxDays = val;
+ if(mMaxDays > 0)
+ {
+ eraseExpired();
+ }
+}
+
+LLExperienceLog::callback_connection_t LLExperienceLog::addUpdateSignal( const callback_slot_t& cb )
+{
+ return mSignals.connect(cb);
+}
+
+void LLExperienceLog::setNotifyNewEvent( bool val )
+{
+ mNotifyNewEvent = val;
+ if(!val && mNotifyConnection.connected())
+ {
+ mNotifyConnection.disconnect();
+ }
+ else if( val && !mNotifyConnection.connected())
+ {
+ mNotifyConnection = addUpdateSignal(boost::function<void(LLSD&)>(LLExperienceLog::notify));
+ }
+}
diff --git a/indra/newview/llexperiencelog.h b/indra/newview/llexperiencelog.h
new file mode 100644
index 0000000000..1e473e27d5
--- /dev/null
+++ b/indra/newview/llexperiencelog.h
@@ -0,0 +1,85 @@
+/**
+ * @file llexperiencelog.h
+ * @brief llexperiencelog and related class definitions
+ *
+ * $LicenseInfo:firstyear=2014&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2014, 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_LLEXPERIENCELOG_H
+#define LL_LLEXPERIENCELOG_H
+
+#include "llsingleton.h"
+
+class LLExperienceLog : public LLSingleton<LLExperienceLog>
+{
+public:
+ typedef boost::signals2::signal<void(LLSD&)>
+ callback_signal_t;
+ typedef callback_signal_t::slot_type callback_slot_t;
+ typedef boost::signals2::connection callback_connection_t;
+ callback_connection_t addUpdateSignal(const callback_slot_t& cb);
+
+ void initialize();
+
+ U32 getMaxDays() const { return mMaxDays; }
+ void setMaxDays(U32 val);
+
+ bool getNotifyNewEvent() const { return mNotifyNewEvent; }
+ void setNotifyNewEvent(bool val);
+
+ U32 getPageSize() const { return mPageSize; }
+ void setPageSize(U32 val) { mPageSize = val; }
+
+ const LLSD& getEvents()const;
+ void clear();
+
+ virtual ~LLExperienceLog();
+
+ static void notify(LLSD& message);
+ static std::string getFilename();
+ static std::string getPermissionString(const LLSD& message, const std::string& base);
+protected:
+ LLExperienceLog();
+ void handleExperienceMessage(LLSD& message);
+
+
+ void loadEvents();
+ void saveEvents();
+ void eraseExpired();
+
+ LLSD mEvents;
+ callback_signal_t mSignals;
+ callback_connection_t mNotifyConnection;
+ U32 mMaxDays;
+ U32 mPageSize;
+ bool mNotifyNewEvent;
+
+ friend class LLExperienceLogDispatchHandler;
+ friend class LLSingleton<LLExperienceLog>;
+};
+
+
+
+
+#endif // LL_LLEXPERIENCELOG_H
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index fc9e85caf8..8f3eaaa207 100755
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -380,9 +380,11 @@ LLFavoritesBarCtrl::LLFavoritesBarCtrl(const LLFavoritesBarCtrl::Params& p)
mShowDragMarker(FALSE),
mLandingTab(NULL),
mLastTab(NULL),
- mTabsHighlightEnabled(TRUE)
- , mUpdateDropDownItems(true)
-, mRestoreOverflowMenu(false)
+ mTabsHighlightEnabled(TRUE),
+ mUpdateDropDownItems(true),
+ mRestoreOverflowMenu(false),
+ mGetPrevItems(true),
+ mItemsChangedTimer()
{
// Register callback for menus with current registrar (will be parent panel's registrar)
LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Favorites.DoToSelected",
@@ -659,6 +661,15 @@ void LLFavoritesBarCtrl::changed(U32 mask)
LLFavoritesOrderStorage::instance().getSLURL((*i)->getAssetUUID());
}
updateButtons();
+ if (!mItemsChangedTimer.getStarted())
+ {
+ mItemsChangedTimer.start();
+ }
+ else
+ {
+ mItemsChangedTimer.reset();
+ }
+
}
}
@@ -693,6 +704,21 @@ void LLFavoritesBarCtrl::draw()
// Once drawn, mark this false so we won't draw it again (unless we hit the favorite bar again)
mShowDragMarker = FALSE;
}
+ if (mItemsChangedTimer.getStarted())
+ {
+ if (mItemsChangedTimer.getElapsedTimeF32() > 1.f)
+ {
+ LLFavoritesOrderStorage::instance().saveFavoritesRecord();
+ mItemsChangedTimer.stop();
+ }
+ }
+
+ if(!mItemsChangedTimer.getStarted() && LLFavoritesOrderStorage::instance().mUpdateRequired)
+ {
+ LLFavoritesOrderStorage::instance().mUpdateRequired = false;
+ mItemsChangedTimer.start();
+ }
+
}
const LLButton::Params& LLFavoritesBarCtrl::getButtonParams()
@@ -723,6 +749,12 @@ void LLFavoritesBarCtrl::updateButtons()
return;
}
+ if(mGetPrevItems)
+ {
+ LLFavoritesOrderStorage::instance().mPrevFavorites = mItems;
+ mGetPrevItems = false;
+ }
+
const LLButton::Params& button_params = getButtonParams();
if(mItems.empty())
@@ -844,6 +876,7 @@ void LLFavoritesBarCtrl::updateButtons()
{
mUpdateDropDownItems = false;
}
+
}
LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem> item, const LLButton::Params& button_params, S32 x_offset)
@@ -912,9 +945,11 @@ BOOL LLFavoritesBarCtrl::postBuild()
BOOL LLFavoritesBarCtrl::collectFavoriteItems(LLInventoryModel::item_array_t &items)
{
+
if (mFavoriteFolderId.isNull())
return FALSE;
+
LLInventoryModel::cat_array_t cats;
LLIsType is_type(LLAssetType::AT_LANDMARK);
@@ -1411,6 +1446,7 @@ 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;
+bool LLFavoritesOrderStorage::mSaveOnExit = false;
void LLFavoritesOrderStorage::setSortIndex(const LLViewerInventoryItem* inv_item, S32 sort_index)
{
@@ -1447,6 +1483,7 @@ void LLFavoritesOrderStorage::getSLURL(const LLUUID& asset_id)
LL_DEBUGS("FavoritesBar") << "landmark for " << asset_id << " already loaded" << LL_ENDL;
onLandmarkLoaded(asset_id, lm);
}
+ return;
}
// static
@@ -1482,13 +1519,16 @@ void LLFavoritesOrderStorage::destroyClass()
LLFile::remove(old_filename);
}
- if (gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin"))
- {
- LLFavoritesOrderStorage::instance().saveFavoritesSLURLs();
- }
- else
+ std::string filename = getSavedOrderFileName();
+ file.open(filename.c_str());
+ if (file.is_open())
{
- LLFavoritesOrderStorage::instance().removeFavoritesRecordOfUser();
+ file.close();
+ LLFile::remove(filename);
+ if(mSaveOnExit)
+ {
+ LLFavoritesOrderStorage::instance().saveFavoritesRecord(true);
+ }
}
}
@@ -1503,108 +1543,57 @@ std::string LLFavoritesOrderStorage::getSavedOrderFileName()
void LLFavoritesOrderStorage::load()
{
- // load per-resident sorting information
std::string filename = getSavedOrderFileName();
-
LLSD settings_llsd;
llifstream file;
file.open(filename.c_str());
if (file.is_open())
{
LLSDSerialize::fromXML(settings_llsd, file);
- LL_INFOS("FavoritesBar") << "loaded favorites order from '" << filename << "' "
- << (settings_llsd.isMap() ? "" : "un") << "successfully"
- << LL_ENDL;
- file.close();
- }
- else
- {
- LL_WARNS("FavoritesBar") << "unable to open favorites order file at '" << filename << "'" << LL_ENDL;
- }
-
- 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()));
+ LL_INFOS("FavoritesBar") << "loaded favorites order from '" << filename << "' "
+ << (settings_llsd.isMap() ? "" : "un") << "successfully"
+ << LL_ENDL;
+ file.close();
+ mSaveOnExit = true;
+
+ 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())
+ else
{
- LL_WARNS("FavoritesBar") << "Cannot save favorites: not logged in" << LL_ENDL;
- return;
+ filename = getStoredFavoritesFilename();
+ if (!filename.empty())
+ {
+ llifstream in_file;
+ in_file.open(filename.c_str());
+ LLSD fav_llsd;
+ LLSD user_llsd;
+ if (in_file.is_open())
+ {
+ LLSDSerialize::fromXML(fav_llsd, in_file);
+ LL_INFOS("FavoritesBar") << "loaded favorites from '" << filename << "' "
+ << (fav_llsd.isMap() ? "" : "un") << "successfully"
+ << LL_ENDL;
+ in_file.close();
+ user_llsd = fav_llsd[gAgentUsername];
+
+ S32 index = 0;
+ for (LLSD::array_iterator iter = user_llsd.beginArray();
+ iter != user_llsd.endArray(); ++iter)
+ {
+ mSortIndexes.insert(std::make_pair(iter->get("id").asUUID(), index));
+ index++;
+ }
+ }
+ else
+ {
+ LL_WARNS("FavoritesBar") << "unable to open favorites from '" << filename << "'" << LL_ENDL;
+ }
+ }
}
-
- std::string filename = getStoredFavoritesFilename();
- if (!filename.empty())
- {
- llifstream in_file;
- in_file.open(filename.c_str());
- LLSD fav_llsd;
- if (in_file.is_open())
- {
- LLSDSerialize::fromXML(fav_llsd, in_file);
- LL_INFOS("FavoritesBar") << "loaded favorites from '" << filename << "' "
- << (fav_llsd.isMap() ? "" : "un") << "successfully"
- << LL_ENDL;
- in_file.close();
- }
- else
- {
- LL_WARNS("FavoritesBar") << "unable to open favorites from '" << filename << "'" << LL_ENDL;
- }
-
- 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())
- {
- LL_DEBUGS("FavoritesBar") << "Saving favorite: idx=" << LLFavoritesOrderStorage::instance().getSortIndex((*it)->getUUID()) << ", SLURL=" << slurl_iter->second << ", value=" << value << LL_ENDL;
- value["slurl"] = slurl_iter->second;
- user_llsd[LLFavoritesOrderStorage::instance().getSortIndex((*it)->getUUID())] = value;
- }
- else
- {
- LL_WARNS("FavoritesBar") << "Not saving favorite " << value["name"] << ": no matching SLURL" << LL_ENDL;
- }
- }
-
- 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.
- fav_llsd[av_name.getUserName()] = user_llsd;
-
- llofstream file;
- file.open(filename.c_str());
- if ( file.is_open() )
- {
- LLSDSerialize::toPrettyXML(fav_llsd, file);
- LL_INFOS("FavoritesBar") << "saved favorites for '" << av_name.getUserName()
- << "' to '" << filename << "' "
- << LL_ENDL;
- file.close();
- }
- else
- {
- LL_WARNS("FavoritesBar") << "unable to open favorites storage for '" << av_name.getUserName()
- << "' at '" << filename << "' "
- << LL_ENDL;
- }
- }
}
void LLFavoritesOrderStorage::removeFavoritesRecordOfUser()
@@ -1626,8 +1615,30 @@ void LLFavoritesOrderStorage::removeFavoritesRecordOfUser()
// See saveFavoritesSLURLs() here above for the reason why.
if (fav_llsd.has(av_name.getUserName()))
{
- LL_INFOS("FavoritesBar") << "Removed favorites for " << av_name.getUserName() << LL_ENDL;
- fav_llsd.erase(av_name.getUserName());
+ LLSD user_llsd = fav_llsd[av_name.getUserName()];
+
+ if (user_llsd.beginArray()->has("id"))
+ {
+ for (LLSD::array_iterator iter = user_llsd.beginArray();iter != user_llsd.endArray(); ++iter)
+ {
+ LLSD value;
+ value["id"]= iter->get("id").asUUID();
+ iter->assign(value);
+ }
+ fav_llsd[av_name.getUserName()] = user_llsd;
+ llofstream file;
+ file.open(filename.c_str());
+ if ( file.is_open() )
+ {
+ LLSDSerialize::toPrettyXML(fav_llsd, file);
+ file.close();
+ }
+ }
+ else
+ {
+ LL_INFOS("FavoritesBar") << "Removed favorites for " << av_name.getUserName() << LL_ENDL;
+ fav_llsd.erase(av_name.getUserName());
+ }
}
llofstream out_file;
@@ -1648,20 +1659,20 @@ void LLFavoritesOrderStorage::onLandmarkLoaded(const LLUUID& asset_id, LLLandmar
if (landmark)
{
LL_DEBUGS("FavoritesBar") << "landmark for " << asset_id << " loaded" << LL_ENDL;
- 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);
- }
+ 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())
- {
- LL_DEBUGS("FavoritesBar") << "requesting slurl for landmark " << asset_id << LL_ENDL;
- LLLandmarkActions::getSLURLfromPosGlobal(pos_global,
+ if (!pos_global.isExactlyZero())
+ {
+ LL_DEBUGS("FavoritesBar") << "requesting slurl for landmark " << asset_id << LL_ENDL;
+ LLLandmarkActions::getSLURLfromPosGlobal(pos_global,
boost::bind(&LLFavoritesOrderStorage::storeFavoriteSLURL, this, asset_id, _1));
- }
+ }
}
}
@@ -1671,41 +1682,6 @@ void LLFavoritesOrderStorage::storeFavoriteSLURL(const LLUUID& asset_id, std::st
mSLURLs[asset_id] = slurl;
}
-void LLFavoritesOrderStorage::save()
-{
- if (mIsDirty)
- {
- // something changed, so save it
- std::string filename = LLFavoritesOrderStorage::getInstance()->getSavedOrderFileName();
- if (!filename.empty())
- {
- 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.c_str());
- if ( file.is_open() )
- {
- LLSDSerialize::toPrettyXML(settings_llsd, file);
- LL_INFOS("FavoritesBar") << "saved favorites order to '" << filename << "' " << LL_ENDL;
- }
- else
- {
- LL_WARNS("FavoritesBar") << "failed to open favorites order file '" << filename << "' " << LL_ENDL;
- }
- }
- else
- {
- LL_DEBUGS("FavoritesBar") << "no user directory available to store favorites order file" << LL_ENDL;
- }
- }
-}
-
-
void LLFavoritesOrderStorage::cleanup()
{
// nothing to clean
@@ -1720,7 +1696,7 @@ void LLFavoritesOrderStorage::cleanup()
sort_index_map_t aTempMap;
//copy unremoved values from mSortIndexes to aTempMap
- std::remove_copy_if(mSortIndexes.begin(), mSortIndexes.end(),
+ std::remove_copy_if(mSortIndexes.begin(), mSortIndexes.end(),
inserter(aTempMap, aTempMap.begin()),
is_not_in_fav);
@@ -1728,6 +1704,17 @@ void LLFavoritesOrderStorage::cleanup()
mSortIndexes.swap(aTempMap);
}
+// 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());
+ }
+};
+
void LLFavoritesOrderStorage::saveOrder()
{
LLInventoryModel::cat_array_t cats;
@@ -1735,13 +1722,14 @@ void LLFavoritesOrderStorage::saveOrder()
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);
+ std::sort(items.begin(), items.end(), LLViewerInventoryItemSort());
saveItemsOrder(items);
}
void LLFavoritesOrderStorage::saveItemsOrder( const LLInventoryModel::item_array_t& items )
{
- int sortField = 0;
+ 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)
{
@@ -1760,16 +1748,7 @@ void LLFavoritesOrderStorage::saveItemsOrder( const LLInventoryModel::item_array
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.
@@ -1790,6 +1769,110 @@ void LLFavoritesOrderStorage::rearrangeFavoriteLandmarks(const LLUUID& source_it
saveItemsOrder(items);
}
+BOOL LLFavoritesOrderStorage::saveFavoritesRecord(bool pref_changed)
+{
+
+ LLUUID favorite_folder= gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
+ if (favorite_folder.isNull())
+ return FALSE;
+
+ LLInventoryModel::item_array_t items;
+ LLInventoryModel::cat_array_t cats;
+
+ LLIsType is_type(LLAssetType::AT_LANDMARK);
+ gInventory.collectDescendentsIf(favorite_folder, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type);
+
+ std::sort(items.begin(), items.end(), LLFavoritesSort());
+
+ if((items != mPrevFavorites) || pref_changed)
+ {
+ std::string filename = getStoredFavoritesFilename();
+ if (!filename.empty())
+ {
+ llifstream in_file;
+ in_file.open(filename.c_str());
+ LLSD fav_llsd;
+ if (in_file.is_open())
+ {
+ LLSDSerialize::fromXML(fav_llsd, in_file);
+ in_file.close();
+ }
+ else
+ {
+ LL_WARNS("FavoritesBar") << "unable to open favorites from '" << filename << "'" << LL_ENDL;
+ }
+
+ LLSD user_llsd;
+ S32 fav_iter = 0;
+ for (LLInventoryModel::item_array_t::iterator it = items.begin(); it != items.end(); it++)
+ {
+ LLSD value;
+ if (gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin"))
+ {
+ value["name"] = (*it)->getName();
+ value["asset_id"] = (*it)->getAssetUUID();
+ value["id"] = (*it)->getUUID();
+ slurls_map_t::iterator slurl_iter = mSLURLs.find(value["asset_id"]);
+ if (slurl_iter != mSLURLs.end())
+ {
+ value["slurl"] = slurl_iter->second;
+ user_llsd[fav_iter] = value;
+ }
+ else
+ {
+ getSLURL((*it)->getAssetUUID());
+ mUpdateRequired = true;
+ return FALSE;
+ }
+ }
+ else
+ {
+ value["id"] = (*it)->getUUID();
+ user_llsd[fav_iter] = value;
+ }
+
+ fav_iter ++;
+ }
+
+ 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.
+ fav_llsd[av_name.getUserName()] = user_llsd;
+ llofstream file;
+ file.open(filename.c_str());
+ if ( file.is_open() )
+ {
+ LLSDSerialize::toPrettyXML(fav_llsd, file);
+ file.close();
+ mSaveOnExit = false;
+ }
+ else
+ {
+ LL_WARNS("FavoritesBar") << "unable to open favorites storage for '" << av_name.getUserName()
+ << "' at '" << filename << "' " << LL_ENDL;
+ }
+ }
+
+ mPrevFavorites = items;
+ }
+
+ return TRUE;
+
+}
+
+void LLFavoritesOrderStorage::showFavoritesOnLoginChanged(BOOL show)
+{
+ if (show)
+ {
+ saveFavoritesRecord(true);
+ }
+ else
+ {
+ removeFavoritesRecordOfUser();
+ }
+}
+
void AddFavoriteLandmarkCallback::fire(const LLUUID& inv_item_id)
{
if (mTargetLandmarkId.isNull()) return;
diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h
index a370724947..66fc8b2ae7 100755
--- a/indra/newview/llfavoritesbar.h
+++ b/indra/newview/llfavoritesbar.h
@@ -105,8 +105,10 @@ protected:
bool mUpdateDropDownItems;
bool mRestoreOverflowMenu;
- LLUUID mSelectedItemID;
+ bool mGetPrevItems;
+ LLUUID mSelectedItemID;
+ LLFrameTimer mItemsChangedTimer;
LLUIImage* mImageDragIndication;
private:
@@ -204,12 +206,23 @@ public:
* @see cleanup()
*/
static void destroyClass();
+ static std::string getStoredFavoritesFilename();
+ static std::string getSavedOrderFileName();
+
+ BOOL saveFavoritesRecord(bool pref_changed = false);
+ void showFavoritesOnLoginChanged(BOOL show);
+
+ LLInventoryModel::item_array_t mPrevFavorites;
+
const static S32 NO_INDEX;
+ static bool mSaveOnExit;
+ bool mUpdateRequired;
+
private:
friend class LLSingleton<LLFavoritesOrderStorage>;
- LLFavoritesOrderStorage() : mIsDirty(false) { load(); }
- ~LLFavoritesOrderStorage() { save(); }
+ LLFavoritesOrderStorage() : mIsDirty(false), mUpdateRequired(false){ load(); }
+ ~LLFavoritesOrderStorage() {}
/**
* Removes sort indexes for items which are not in Favorites bar for now.
@@ -217,13 +230,8 @@ private:
void cleanup();
const static std::string SORTING_DATA_FILE_NAME;
- std::string getSavedOrderFileName();
- static std::string getStoredFavoritesFilename();
-
- void load();
- void save();
- void saveFavoritesSLURLs();
+ void load();
// Remove record of current user's favorites from file on disk.
void removeFavoritesRecordOfUser();
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index ea39f812fd..a70a33e8a4 100755
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -100,6 +100,10 @@ void LLFeatureList::addFeature(const std::string& name, const BOOL available, co
}
LLFeatureInfo fi(name, available, level);
+ LL_DEBUGS_ONCE("RenderInit") << "Feature '" << name << "' "
+ << (available ? "" : "not " ) << "available"
+ << " at " << level
+ << LL_ENDL;
mFeatures[name] = fi;
}
@@ -121,6 +125,7 @@ F32 LLFeatureList::getRecommendedValue(const std::string& name)
{
if (mFeatures.count(name) && isFeatureAvailable(name))
{
+ LL_DEBUGS_ONCE("RenderInit") << "Setting '" << name << "' to recommended value " << mFeatures[name].mRecommendedLevel << LL_ENDL;
return mFeatures[name].mRecommendedLevel;
}
@@ -130,7 +135,7 @@ F32 LLFeatureList::getRecommendedValue(const std::string& name)
BOOL LLFeatureList::maskList(LLFeatureList &mask)
{
- //LL_INFOS() << "Masking with " << mask.mName << LL_ENDL;
+ LL_DEBUGS_ONCE() << "Masking with " << mask.mName << LL_ENDL;
//
// Lookup the specified feature mask, and overlay it on top of the
// current feature mask.
@@ -296,7 +301,7 @@ bool LLFeatureManager::loadFeatureTables()
app_path += filename;
- // second table is downloaded with HTTP
+ // second table is downloaded with HTTP - note that this will only be used on the run _after_ it is downloaded
std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename);
// use HTTP table if it exists
@@ -380,11 +385,11 @@ bool LLFeatureManager::parseFeatureTable(std::string filename)
file >> name;
if (!mMaskList.count(name))
{
- flp = new LLFeatureList(name);
- mMaskList[name] = flp;
- }
- else
- {
+ flp = new LLFeatureList(name);
+ mMaskList[name] = flp;
+ }
+ else
+ {
LL_WARNS("RenderInit") << "Overriding mask " << name << ", this is invalid!" << LL_ENDL;
parse_ok = false;
}
@@ -393,11 +398,11 @@ bool LLFeatureManager::parseFeatureTable(std::string filename)
{
if (flp)
{
- S32 available;
- F32 recommended;
- file >> available >> recommended;
- flp->addFeature(name, available, recommended);
- }
+ S32 available;
+ F32 recommended;
+ file >> available >> recommended;
+ flp->addFeature(name, available, recommended);
+ }
else
{
LL_WARNS("RenderInit") << "Specified parameter before <list> keyword!" << LL_ENDL;
@@ -606,7 +611,7 @@ void LLFeatureManager::applyRecommendedSettings()
// cap the level at 2 (high)
U32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_5));
- LL_INFOS() << "Applying Recommended Features" << LL_ENDL;
+ LL_INFOS("RenderInit") << "Applying Recommended Features for level " << level << LL_ENDL;
setGraphicsLevel(level, false);
gSavedSettings.setU32("RenderQualityPerformance", level);
@@ -813,7 +818,7 @@ void LLFeatureManager::applyBaseMasks()
if (osInfo.mMajorVer == 10 && osInfo.mMinorVer < 7)
{
maskFeatures("OSX_10_6_8");
- }
+ }
#endif
// now mask by gpu string
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index b342d8fdf3..c5d637d1fc 100755
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -34,10 +34,12 @@
// Viewer includes
#include "llagent.h"
#include "llagentui.h"
-#include "llappviewer.h"
+#include "llappviewer.h"
+#include "llnotificationsutil.h"
#include "llslurl.h"
#include "llvoiceclient.h"
#include "lluictrlfactory.h"
+#include "llupdaterservice.h"
#include "llviewertexteditor.h"
#include "llviewercontrol.h"
#include "llviewerstats.h"
@@ -99,9 +101,23 @@ public:
/// separated so that we can programmatically access the same info.
static LLSD getInfo();
void onClickCopyToClipboard();
+ void onClickUpdateCheck();
+
+ // checks state of updater service and starts a check outside of schedule.
+ // subscribes callback for closest state update
+ static void setUpdateListener();
private:
void setSupportText(const std::string& server_release_notes_url);
+
+ // notifications for user requested checks
+ static void showCheckUpdateNotification(S32 state);
+
+ // callback method for manual checks
+ static bool callbackCheckUpdate(LLSD const & event);
+
+ // listener name for update checks
+ static const std::string sCheckUpdateListenerName;
};
@@ -132,6 +148,9 @@ BOOL LLFloaterAbout::postBuild()
getChild<LLUICtrl>("copy_btn")->setCommitCallback(
boost::bind(&LLFloaterAbout::onClickCopyToClipboard, this));
+ getChild<LLUICtrl>("update_btn")->setCommitCallback(
+ boost::bind(&LLFloaterAbout::onClickUpdateCheck, this));
+
static const LLUIColor about_color = LLUIColorTable::instance().getColor("TextFgReadOnlyColor");
if (gAgent.getRegion())
@@ -235,6 +254,11 @@ void LLFloaterAbout::onClickCopyToClipboard()
support_widget->deselect();
}
+void LLFloaterAbout::onClickUpdateCheck()
+{
+ setUpdateListener();
+}
+
void LLFloaterAbout::setSupportText(const std::string& server_release_notes_url)
{
#if LL_WINDOWS
@@ -256,6 +280,68 @@ void LLFloaterAbout::setSupportText(const std::string& server_release_notes_url)
}
///----------------------------------------------------------------------------
+/// Floater About Update-check related functions
+///----------------------------------------------------------------------------
+
+const std::string LLFloaterAbout::sCheckUpdateListenerName = "LLUpdateNotificationListener";
+
+void LLFloaterAbout::showCheckUpdateNotification(S32 state)
+{
+ switch (state)
+ {
+ case LLUpdaterService::UP_TO_DATE:
+ LLNotificationsUtil::add("UpdateViewerUpToDate");
+ break;
+ case LLUpdaterService::DOWNLOADING:
+ case LLUpdaterService::INSTALLING:
+ LLNotificationsUtil::add("UpdateDownloadInProgress");
+ break;
+ case LLUpdaterService::TERMINAL:
+ // download complete, user triggered check after download pop-up appeared
+ LLNotificationsUtil::add("UpdateDownloadComplete");
+ break;
+ default:
+ LLNotificationsUtil::add("UpdateCheckError");
+ break;
+ }
+}
+
+bool LLFloaterAbout::callbackCheckUpdate(LLSD const & event)
+{
+ if (!event.has("payload"))
+ {
+ return false;
+ }
+
+ LLSD payload = event["payload"];
+ if (payload.has("type") && payload["type"].asInteger() == LLUpdaterService::STATE_CHANGE)
+ {
+ LLEventPumps::instance().obtain("mainlooprepeater").stopListening(sCheckUpdateListenerName);
+ showCheckUpdateNotification(payload["state"].asInteger());
+ }
+ return false;
+}
+
+void LLFloaterAbout::setUpdateListener()
+{
+ LLUpdaterService update_service;
+ S32 service_state = update_service.getState();
+ // Note: Do not set state listener before forceCheck() since it set's new state
+ if (update_service.forceCheck() || service_state == LLUpdaterService::CHECKING_FOR_UPDATE)
+ {
+ LLEventPump& mainloop(LLEventPumps::instance().obtain("mainlooprepeater"));
+ if (mainloop.getListener(sCheckUpdateListenerName) == LLBoundListener()) // dummy listener
+ {
+ mainloop.listen(sCheckUpdateListenerName, boost::bind(&callbackCheckUpdate, _1));
+ }
+ }
+ else
+ {
+ showCheckUpdateNotification(service_state);
+ }
+}
+
+///----------------------------------------------------------------------------
/// LLFloaterAboutUtil
///----------------------------------------------------------------------------
void LLFloaterAboutUtil::registerFloater()
@@ -265,6 +351,11 @@ void LLFloaterAboutUtil::registerFloater()
}
+void LLFloaterAboutUtil::checkUpdatesAndNotify()
+{
+ LLFloaterAbout::setUpdateListener();
+}
+
///----------------------------------------------------------------------------
/// Class LLServerReleaseNotesURLFetcher implementation
///----------------------------------------------------------------------------
@@ -289,15 +380,11 @@ void LLServerReleaseNotesURLFetcher::httpCompleted()
LL_DEBUGS("ServerReleaseNotes") << dumpResponse()
<< " [headers:" << getResponseHeaders() << "]" << LL_ENDL;
- LLFloaterAbout* floater_about = LLFloaterReg::getTypedInstance<LLFloaterAbout>("sl_about");
- if (floater_about)
+ std::string location = getResponseHeader(HTTP_IN_HEADER_LOCATION);
+ if (location.empty())
{
- std::string location = getResponseHeader(HTTP_IN_HEADER_LOCATION);
- if (location.empty())
- {
- location = LLTrans::getString("ErrorFetchingServerReleaseNotesURL");
- }
- LLAppViewer::instance()->setServerReleaseNotesURL(location);
+ location = LLTrans::getString("ErrorFetchingServerReleaseNotesURL");
}
+ LLAppViewer::instance()->setServerReleaseNotesURL(location);
}
diff --git a/indra/newview/llfloaterabout.h b/indra/newview/llfloaterabout.h
index 8fc1aa4f29..be34b631cc 100755
--- a/indra/newview/llfloaterabout.h
+++ b/indra/newview/llfloaterabout.h
@@ -30,6 +30,9 @@
namespace LLFloaterAboutUtil
{
void registerFloater();
+
+ // Support for user initialized update/state checks
+ void checkUpdatesAndNotify();
}
#endif // LL_LLFLOATERABOUT_H
diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp
index 51b59a7a74..b661fed276 100755
--- a/indra/newview/llfloaterauction.cpp
+++ b/indra/newview/llfloaterauction.cpp
@@ -376,13 +376,16 @@ void LLFloaterAuction::doResetParcel()
msg->sendReliable(region->getHost());
// Clear the access lists
- clearParcelAccessLists(parcelp, region);
+ clearParcelAccessList(parcelp, region, AL_ACCESS);
+ clearParcelAccessList(parcelp, region, AL_BAN);
+ clearParcelAccessList(parcelp, region, AL_ALLOW_EXPERIENCE);
+ clearParcelAccessList(parcelp, region, AL_BLOCK_EXPERIENCE);
}
}
-void LLFloaterAuction::clearParcelAccessLists(LLParcel* parcel, LLViewerRegion* region)
+void LLFloaterAuction::clearParcelAccessList(LLParcel* parcel, LLViewerRegion* region, U32 list)
{
if (!region || !parcel) return;
@@ -391,15 +394,12 @@ void LLFloaterAuction::clearParcelAccessLists(LLParcel* parcel, LLViewerRegion*
LLMessageSystem* msg = gMessageSystem;
- // Clear access list
- // parcel->mAccessList.clear();
-
msg->newMessageFast(_PREHASH_ParcelAccessListUpdate);
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
msg->nextBlockFast(_PREHASH_Data);
- msg->addU32Fast(_PREHASH_Flags, AL_ACCESS);
+ msg->addU32Fast(_PREHASH_Flags, list);
msg->addS32(_PREHASH_LocalID, parcel->getLocalID() );
msg->addUUIDFast(_PREHASH_TransactionID, transactionUUID);
msg->addS32Fast(_PREHASH_SequenceID, 1); // sequence_id
@@ -412,27 +412,6 @@ void LLFloaterAuction::clearParcelAccessLists(LLParcel* parcel, LLViewerRegion*
msg->addU32Fast(_PREHASH_Flags, 0 );
msg->sendReliable( region->getHost() );
-
- // Send message for empty ban list
- //parcel->mBanList.clear();
- msg->newMessageFast(_PREHASH_ParcelAccessListUpdate);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
- msg->nextBlockFast(_PREHASH_Data);
- msg->addU32Fast(_PREHASH_Flags, AL_BAN);
- msg->addS32(_PREHASH_LocalID, parcel->getLocalID() );
- msg->addUUIDFast(_PREHASH_TransactionID, transactionUUID);
- msg->addS32Fast(_PREHASH_SequenceID, 1); // sequence_id
- msg->addS32Fast(_PREHASH_Sections, 0); // num_sections
-
- // pack an empty block since there will be no data
- msg->nextBlockFast(_PREHASH_List);
- msg->addUUIDFast(_PREHASH_ID, LLUUID::null );
- msg->addS32Fast(_PREHASH_Time, 0 );
- msg->addU32Fast(_PREHASH_Flags, 0 );
-
- msg->sendReliable( region->getHost() );
}
diff --git a/indra/newview/llfloaterauction.h b/indra/newview/llfloaterauction.h
index 9c0c0f7775..c83a11ba8b 100755
--- a/indra/newview/llfloaterauction.h
+++ b/indra/newview/llfloaterauction.h
@@ -67,7 +67,7 @@ private:
void doResetParcel();
void doSellToAnyone();
- void clearParcelAccessLists( LLParcel* parcel, LLViewerRegion* region );
+ void clearParcelAccessList( LLParcel* parcel, LLViewerRegion* region, U32 list);
void cleanupAndClose();
private:
diff --git a/indra/newview/llfloaterbump.cpp b/indra/newview/llfloaterbump.cpp
index 34904cf7ed..957c91b226 100755
--- a/indra/newview/llfloaterbump.cpp
+++ b/indra/newview/llfloaterbump.cpp
@@ -32,6 +32,7 @@
#include "llavataractions.h"
#include "llfloaterbump.h"
+#include "llfloaterreg.h"
#include "llfloaterreporter.h"
#include "llmutelist.h"
#include "llpanelblockedlist.h"
@@ -87,11 +88,11 @@ BOOL LLFloaterBump::postBuild()
// virtual
void LLFloaterBump::onOpen(const LLSD& key)
{
- mNames.clear();
- mList->deleteAllItems();
-
if (gMeanCollisionList.empty())
{
+ mNames.clear();
+ mList->deleteAllItems();
+
std::string none_detected = getString("none_detected");
LLSD row;
row["columns"][0]["value"] = none_detected;
@@ -100,12 +101,20 @@ void LLFloaterBump::onOpen(const LLSD& key)
}
else
{
- for (mean_collision_list_t::iterator iter = gMeanCollisionList.begin();
- iter != gMeanCollisionList.end(); ++iter)
- {
- LLMeanCollisionData *mcd = *iter;
- add(mList, mcd);
- }
+ populateCollisionList();
+ }
+}
+
+void LLFloaterBump::populateCollisionList()
+{
+ mNames.clear();
+ mList->deleteAllItems();
+
+ for (mean_collision_list_t::iterator iter = gMeanCollisionList.begin();
+ iter != gMeanCollisionList.end(); ++iter)
+ {
+ LLMeanCollisionData *mcd = *iter;
+ add(mList, mcd);
}
}
@@ -247,3 +256,8 @@ void LLFloaterBump::inviteToGroup()
{
LLAvatarActions::inviteToGroup(mItemUUID);
}
+
+LLFloaterBump* LLFloaterBump::getInstance()
+{
+ return LLFloaterReg::getTypedInstance<LLFloaterBump>("bumps");
+}
diff --git a/indra/newview/llfloaterbump.h b/indra/newview/llfloaterbump.h
index 11b7db9fee..ce52c75255 100755
--- a/indra/newview/llfloaterbump.h
+++ b/indra/newview/llfloaterbump.h
@@ -46,6 +46,10 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
+ static LLFloaterBump* getInstance();
+
+ void populateCollisionList();
+
void startIM();
void startCall();
void reportAbuse();
diff --git a/indra/newview/llfloaterdeleteprefpreset.cpp b/indra/newview/llfloaterdeleteprefpreset.cpp
new file mode 100644
index 0000000000..7dedbbf984
--- /dev/null
+++ b/indra/newview/llfloaterdeleteprefpreset.cpp
@@ -0,0 +1,101 @@
+/**
+ * @file llfloaterdeleteprefpreset.cpp
+ * @brief Floater to delete a graphics / camera preset
+ *
+ * $LicenseInfo:firstyear=2014&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2014, 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 "llfloaterdeleteprefpreset.h"
+
+#include "llbutton.h"
+#include "llcombobox.h"
+#include "llfloaterpreference.h"
+#include "llnotificationsutil.h"
+#include "llpresetsmanager.h"
+#include "llviewercontrol.h"
+#include "llfloaterreg.h"
+
+LLFloaterDeletePrefPreset::LLFloaterDeletePrefPreset(const LLSD &key)
+: LLFloater(key)
+{
+}
+
+// virtual
+BOOL LLFloaterDeletePrefPreset::postBuild()
+{
+ LLFloaterPreference* preferences = LLFloaterReg::getTypedInstance<LLFloaterPreference>("preferences");
+ if (preferences)
+ {
+ preferences->addDependentFloater(this);
+ }
+ getChild<LLButton>("delete")->setCommitCallback(boost::bind(&LLFloaterDeletePrefPreset::onBtnDelete, this));
+ getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterDeletePrefPreset::onBtnCancel, this));
+ LLPresetsManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterDeletePrefPreset::onPresetsListChange, this));
+
+ return TRUE;
+}
+
+void LLFloaterDeletePrefPreset::onOpen(const LLSD& key)
+{
+ mSubdirectory = key.asString();
+ std::string floater_title = getString(std::string("title_") + mSubdirectory);
+
+ setTitle(floater_title);
+
+ LLComboBox* combo = getChild<LLComboBox>("preset_combo");
+
+ EDefaultOptions option = DEFAULT_HIDE;
+ LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, combo, option);
+}
+
+void LLFloaterDeletePrefPreset::onBtnDelete()
+{
+ LLComboBox* combo = getChild<LLComboBox>("preset_combo");
+ std::string name = combo->getSimple();
+
+ if (!LLPresetsManager::getInstance()->deletePreset(mSubdirectory, name))
+ {
+ LLSD args;
+ args["NAME"] = name;
+ LLNotificationsUtil::add("PresetNotDeleted", args);
+ }
+
+ closeFloater();
+}
+
+void LLFloaterDeletePrefPreset::onPresetsListChange()
+{
+ LLComboBox* combo = getChild<LLComboBox>("preset_combo");
+ LLButton* delete_btn = getChild<LLButton>("delete");
+
+ EDefaultOptions option = DEFAULT_HIDE;
+ LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, combo, option);
+
+ delete_btn->setEnabled(0 != combo->getItemCount());
+}
+
+void LLFloaterDeletePrefPreset::onBtnCancel()
+{
+ closeFloater();
+}
diff --git a/indra/newview/llfloaterdeleteprefpreset.h b/indra/newview/llfloaterdeleteprefpreset.h
new file mode 100644
index 0000000000..0ab3da7139
--- /dev/null
+++ b/indra/newview/llfloaterdeleteprefpreset.h
@@ -0,0 +1,53 @@
+/**
+ * @file llfloaterdeleteprefpreset.h
+ * @brief Floater to delete a graphics / camera preset
+
+ *
+ * $LicenseInfo:firstyear=2014&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2014, 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_LLFLOATERDELETEPREFPRESET_H
+#define LL_LLFLOATERDELETEPREFPRESET_H
+
+#include "llfloater.h"
+
+class LLComboBox;
+
+class LLFloaterDeletePrefPreset : public LLFloater
+{
+
+public:
+ LLFloaterDeletePrefPreset(const LLSD &key);
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ void onBtnDelete();
+ void onBtnCancel();
+
+private:
+ void onPresetsListChange();
+
+ std::string mSubdirectory;
+};
+
+#endif // LL_LLFLOATERDELETEPREFPRESET_H
diff --git a/indra/newview/llfloaterexperiencepicker.cpp b/indra/newview/llfloaterexperiencepicker.cpp
new file mode 100644
index 0000000000..bb54c57baf
--- /dev/null
+++ b/indra/newview/llfloaterexperiencepicker.cpp
@@ -0,0 +1,162 @@
+/**
+* @file llfloaterexperiencepicker.cpp
+* @brief Implementation of llfloaterexperiencepicker
+* @author dolphin@lindenlab.com
+*
+* $LicenseInfo:firstyear=2014&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2014, 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 "llfloaterexperiencepicker.h"
+
+
+#include "lllineeditor.h"
+#include "llfloaterreg.h"
+#include "llscrolllistctrl.h"
+#include "llviewerregion.h"
+#include "llagent.h"
+#include "llexperiencecache.h"
+#include "llslurl.h"
+#include "llavatarnamecache.h"
+#include "llfloaterexperienceprofile.h"
+#include "llcombobox.h"
+#include "llviewercontrol.h"
+#include "lldraghandle.h"
+#include "llpanelexperiencepicker.h"
+
+LLFloaterExperiencePicker* LLFloaterExperiencePicker::show( select_callback_t callback, const LLUUID& key, BOOL allow_multiple, BOOL close_on_select, filter_list filters, LLView * frustumOrigin )
+{
+ LLFloaterExperiencePicker* floater =
+ LLFloaterReg::showTypedInstance<LLFloaterExperiencePicker>("experience_search", key);
+ if (!floater)
+ {
+ LL_WARNS() << "Cannot instantiate experience picker" << LL_ENDL;
+ return NULL;
+ }
+
+ if (floater->mSearchPanel)
+ {
+ floater->mSearchPanel->mSelectionCallback = callback;
+ floater->mSearchPanel->mCloseOnSelect = close_on_select;
+ floater->mSearchPanel->setAllowMultiple(allow_multiple);
+ floater->mSearchPanel->setDefaultFilters();
+ floater->mSearchPanel->addFilters(filters.begin(), filters.end());
+ floater->mSearchPanel->filterContent();
+ }
+
+ if(frustumOrigin)
+ {
+ floater->mFrustumOrigin = frustumOrigin->getHandle();
+ }
+
+ return floater;
+}
+
+void LLFloaterExperiencePicker::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 LLFloaterExperiencePicker::draw()
+{
+ drawFrustum();
+ LLFloater::draw();
+}
+
+LLFloaterExperiencePicker::LLFloaterExperiencePicker( const LLSD& key )
+ :LLFloater(key)
+ ,mSearchPanel(NULL)
+ ,mContextConeOpacity(0.f)
+ ,mContextConeInAlpha(0.f)
+ ,mContextConeOutAlpha(0.f)
+ ,mContextConeFadeTime(0.f)
+{
+ mContextConeInAlpha = gSavedSettings.getF32("ContextConeInAlpha");
+ mContextConeOutAlpha = gSavedSettings.getF32("ContextConeOutAlpha");
+ mContextConeFadeTime = gSavedSettings.getF32("ContextConeFadeTime");
+}
+
+LLFloaterExperiencePicker::~LLFloaterExperiencePicker()
+{
+ gFocusMgr.releaseFocusIfNeeded( this );
+}
+
+BOOL LLFloaterExperiencePicker::postBuild()
+{
+ mSearchPanel = new LLPanelExperiencePicker();
+ addChild(mSearchPanel);
+ mSearchPanel->setOrigin(0, 0);
+ return LLFloater::postBuild();
+}
diff --git a/indra/newview/llfloaterexperiencepicker.h b/indra/newview/llfloaterexperiencepicker.h
new file mode 100644
index 0000000000..29054a57db
--- /dev/null
+++ b/indra/newview/llfloaterexperiencepicker.h
@@ -0,0 +1,67 @@
+/**
+* @file llfloaterexperiencepicker.h
+* @brief Header file for llfloaterexperiencepicker
+* @author dolphin@lindenlab.com
+*
+* $LicenseInfo:firstyear=2014&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2014, 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_LLFLOATEREXPERIENCEPICKER_H
+#define LL_LLFLOATEREXPERIENCEPICKER_H
+
+#include "llfloater.h"
+
+class LLScrollListCtrl;
+class LLLineEditor;
+class LLPanelExperiencePicker;
+
+
+class LLFloaterExperiencePicker : public LLFloater
+{
+public:
+
+ typedef boost::function<void (const uuid_vec_t&)> select_callback_t;
+ // filter function for experiences, return true if the experience should be hidden.
+ typedef boost::function<bool (const LLSD&)> filter_function;
+ typedef std::vector<filter_function> filter_list;
+
+ static LLFloaterExperiencePicker* show( select_callback_t callback, const LLUUID& key, BOOL allow_multiple, BOOL close_on_select, filter_list filters, LLView * frustumOrigin);
+
+ LLFloaterExperiencePicker(const LLSD& key);
+ virtual ~LLFloaterExperiencePicker();
+
+ BOOL postBuild();
+
+ virtual void draw();
+private:
+
+ LLPanelExperiencePicker* mSearchPanel;
+
+ void drawFrustum();
+ LLHandle <LLView> mFrustumOrigin;
+ F32 mContextConeOpacity;
+ F32 mContextConeInAlpha;
+ F32 mContextConeOutAlpha;
+ F32 mContextConeFadeTime;
+};
+
+#endif // LL_LLFLOATEREXPERIENCEPICKER_H
+
diff --git a/indra/newview/llfloaterexperienceprofile.cpp b/indra/newview/llfloaterexperienceprofile.cpp
new file mode 100644
index 0000000000..197162487d
--- /dev/null
+++ b/indra/newview/llfloaterexperienceprofile.cpp
@@ -0,0 +1,1004 @@
+/**
+ * @file llfloaterexperienceprofile.cpp
+ * @brief llfloaterexperienceprofile and related class definitions
+ *
+ * $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 "llfloaterexperienceprofile.h"
+
+#include "llagent.h"
+#include "llappviewer.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
+#include "llcommandhandler.h"
+#include "llexpandabletextbox.h"
+#include "llexperiencecache.h"
+#include "llfloaterreg.h"
+#include "llhttpclient.h"
+#include "lllayoutstack.h"
+#include "lllineeditor.h"
+#include "llnotificationsutil.h"
+#include "llsdserialize.h"
+#include "llslurl.h"
+#include "lltabcontainer.h"
+#include "lltextbox.h"
+#include "lltexturectrl.h"
+#include "lltrans.h"
+#include "llviewerregion.h"
+#include "llevents.h"
+#include "llfloatergroups.h"
+#include "llnotifications.h"
+#include "llfloaterreporter.h"
+
+#define XML_PANEL_EXPERIENCE_PROFILE "floater_experienceprofile.xml"
+#define TF_NAME "experience_title"
+#define TF_DESC "experience_description"
+#define TF_SLURL "LocationTextText"
+#define TF_MRKT "marketplace"
+#define TF_MATURITY "ContentRatingText"
+#define TF_OWNER "OwnerText"
+#define TF_GROUP "GroupText"
+#define TF_GRID_WIDE "grid_wide"
+#define TF_PRIVILEGED "privileged"
+#define EDIT "edit_"
+
+#define IMG_LOGO "logo"
+
+#define PNL_TOP "top panel"
+#define PNL_IMAGE "image_panel"
+#define PNL_DESC "description panel"
+#define PNL_LOC "location panel"
+#define PNL_MRKT "marketplace panel"
+#define PNL_GROUP "group_panel"
+#define PNL_PERMS "perm panel"
+
+#define BTN_ALLOW "allow_btn"
+#define BTN_BLOCK "block_btn"
+#define BTN_CANCEL "cancel_btn"
+#define BTN_CLEAR_LOCATION "clear_btn"
+#define BTN_EDIT "edit_btn"
+#define BTN_ENABLE "enable_btn"
+#define BTN_FORGET "forget_btn"
+#define BTN_PRIVATE "private_btn"
+#define BTN_REPORT "report_btn"
+#define BTN_SAVE "save_btn"
+#define BTN_SET_GROUP "Group_btn"
+#define BTN_SET_LOCATION "location_btn"
+
+
+class LLExperienceHandler : public LLCommandHandler
+{
+public:
+ LLExperienceHandler() : LLCommandHandler("experience", UNTRUSTED_THROTTLE) { }
+
+ bool handle(const LLSD& params, const LLSD& query_map,
+ LLMediaCtrl* web)
+ {
+ if(params.size() != 2 || params[1].asString() != "profile")
+ return false;
+
+ LLExperienceCache::get(params[0].asUUID(), boost::bind(&LLExperienceHandler::experienceCallback, this, _1));
+ return true;
+ }
+
+ void experienceCallback(const LLSD& experienceDetails)
+ {
+ if(!experienceDetails.has(LLExperienceCache::MISSING))
+ {
+ LLFloaterReg::showInstance("experience_profile", experienceDetails[LLExperienceCache::EXPERIENCE_ID].asUUID(), true);
+ }
+ }
+};
+
+LLExperienceHandler gExperienceHandler;
+
+
+LLFloaterExperienceProfile::LLFloaterExperienceProfile(const LLSD& data)
+ : LLFloater(data)
+ , mExperienceId(data.asUUID())
+ , mSaveCompleteAction(NOTHING)
+ , mDirty(false)
+ , mForceClose(false)
+{
+
+}
+
+
+LLFloaterExperienceProfile::~LLFloaterExperienceProfile()
+{
+
+}
+
+template<class T>
+class HandleResponder : public LLHTTPClient::Responder
+{
+public:
+ HandleResponder(const LLHandle<T>& parent):mParent(parent){}
+ LLHandle<T> mParent;
+
+ virtual void httpFailure()
+ {
+ LL_WARNS() << "HandleResponder failed with code: " << getStatus() << ", reason: " << getReason() << LL_ENDL;
+ }
+};
+
+class ExperienceUpdateResponder : public HandleResponder<LLFloaterExperienceProfile>
+{
+public:
+ ExperienceUpdateResponder(const LLHandle<LLFloaterExperienceProfile>& parent):HandleResponder<LLFloaterExperienceProfile>(parent)
+ {
+ }
+
+ virtual void httpSuccess()
+ {
+ LLFloaterExperienceProfile* parent=mParent.get();
+ if(parent)
+ {
+ parent->onSaveComplete(getContent());
+ }
+ }
+};
+
+
+
+class ExperiencePreferencesResponder : public LLHTTPClient::Responder
+{
+public:
+ ExperiencePreferencesResponder(const LLUUID& single = LLUUID::null):mId(single)
+ {
+ }
+
+ bool sendSingle(const LLSD& content, const LLSD& permission, const char* name)
+ {
+ if(!content.has(name))
+ return false;
+
+ LLEventPump& pump = LLEventPumps::instance().obtain("experience_permission");
+ const LLSD& list = content[name];
+ LLSD::array_const_iterator it = list.beginArray();
+ while(it != list.endArray())
+ {
+ if(it->asUUID() == mId)
+ {
+ LLSD message;
+ message[it->asString()] = permission;
+ message["experience"] = mId;
+ pump.post(message);
+ return true;
+ }
+ ++it;
+ }
+ return false;
+ }
+
+ bool hasPermission(const LLSD& content, const char* name)
+ {
+ if(!content.has(name))
+ return false;
+
+ const LLSD& list = content[name];
+ LLSD::array_const_iterator it = list.beginArray();
+ while(it != list.endArray())
+ {
+ if(it->asUUID() == mId)
+ {
+ return true;
+ }
+ ++it;
+ }
+ return false;
+ }
+
+ const char* getPermission(const LLSD& content)
+ {
+ if(hasPermission(content, "experiences"))
+ {
+ return "Allow";
+ }
+ else if(hasPermission(content, "blocked"))
+ {
+ return "Block";
+ }
+ return "Forget";
+ }
+
+
+ virtual void httpSuccess()
+ {
+ if(mId.notNull())
+ {
+ post(getPermission(getContent()));
+ return;
+ }
+ LLEventPumps::instance().obtain("experience_permission").post(getContent());
+ }
+
+ void post( const char* perm )
+ {
+ LLSD experience;
+ LLSD message;
+ experience["permission"]=perm;
+ message["experience"] = mId;
+ message[mId.asString()] = experience;
+ LLEventPumps::instance().obtain("experience_permission").post(message);
+ }
+
+private:
+ LLUUID mId;
+};
+
+
+class IsAdminResponder : public HandleResponder<LLFloaterExperienceProfile>
+{
+public:
+ IsAdminResponder(const LLHandle<LLFloaterExperienceProfile>& parent):HandleResponder<LLFloaterExperienceProfile>(parent)
+ {
+ }
+
+ virtual void httpSuccess()
+ {
+ LLFloaterExperienceProfile* parent = mParent.get();
+ if(!parent)
+ return;
+
+ bool enabled = true;
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region)
+ {
+ enabled = false;
+ }
+ else
+ {
+ std::string url=region->getCapability("UpdateExperience");
+ if(url.empty())
+ enabled = false;
+ }
+ if(enabled && getContent()["status"].asBoolean())
+ {
+ parent->getChild<LLLayoutPanel>(PNL_TOP)->setVisible(TRUE);
+ parent->getChild<LLButton>(BTN_EDIT)->setVisible(TRUE);
+ }
+ }
+};
+
+BOOL LLFloaterExperienceProfile::postBuild()
+{
+
+ if (mExperienceId.notNull())
+ {
+ LLExperienceCache::fetch(mExperienceId, true);
+ LLExperienceCache::get(mExperienceId, boost::bind(&LLFloaterExperienceProfile::experienceCallback,
+ getDerivedHandle<LLFloaterExperienceProfile>(), _1));
+
+ LLViewerRegion* region = gAgent.getRegion();
+ if (region)
+ {
+ std::string lookup_url=region->getCapability("IsExperienceAdmin");
+ if(!lookup_url.empty())
+ {
+ LLHTTPClient::get(lookup_url+"?experience_id="+mExperienceId.asString(), new IsAdminResponder(getDerivedHandle<LLFloaterExperienceProfile>()));
+ }
+ }
+ }
+
+ childSetAction(BTN_EDIT, boost::bind(&LLFloaterExperienceProfile::onClickEdit, this));
+ childSetAction(BTN_ALLOW, boost::bind(&LLFloaterExperienceProfile::onClickPermission, this, "Allow"));
+ childSetAction(BTN_FORGET, boost::bind(&LLFloaterExperienceProfile::onClickForget, this));
+ childSetAction(BTN_BLOCK, boost::bind(&LLFloaterExperienceProfile::onClickPermission, this, "Block"));
+ childSetAction(BTN_CANCEL, boost::bind(&LLFloaterExperienceProfile::onClickCancel, this));
+ childSetAction(BTN_SAVE, boost::bind(&LLFloaterExperienceProfile::onClickSave, this));
+ childSetAction(BTN_SET_LOCATION, boost::bind(&LLFloaterExperienceProfile::onClickLocation, this));
+ childSetAction(BTN_CLEAR_LOCATION, boost::bind(&LLFloaterExperienceProfile::onClickClear, this));
+ childSetAction(BTN_SET_GROUP, boost::bind(&LLFloaterExperienceProfile::onPickGroup, this));
+ childSetAction(BTN_REPORT, boost::bind(&LLFloaterExperienceProfile::onReportExperience, this));
+
+ getChild<LLTextEditor>(EDIT TF_DESC)->setKeystrokeCallback(boost::bind(&LLFloaterExperienceProfile::onFieldChanged, this));
+ getChild<LLUICtrl>(EDIT TF_MATURITY)->setCommitCallback(boost::bind(&LLFloaterExperienceProfile::onFieldChanged, this));
+ getChild<LLLineEditor>(EDIT TF_MRKT)->setKeystrokeCallback(boost::bind(&LLFloaterExperienceProfile::onFieldChanged, this), NULL);
+ getChild<LLLineEditor>(EDIT TF_NAME)->setKeystrokeCallback(boost::bind(&LLFloaterExperienceProfile::onFieldChanged, this), NULL);
+
+ childSetCommitCallback(EDIT BTN_ENABLE, boost::bind(&LLFloaterExperienceProfile::onFieldChanged, this), NULL);
+ childSetCommitCallback(EDIT BTN_PRIVATE, boost::bind(&LLFloaterExperienceProfile::onFieldChanged, this), NULL);
+
+ childSetCommitCallback(EDIT IMG_LOGO, boost::bind(&LLFloaterExperienceProfile::onFieldChanged, this), NULL);
+
+ getChild<LLTextEditor>(EDIT TF_DESC)->setCommitOnFocusLost(TRUE);
+
+
+ LLEventPumps::instance().obtain("experience_permission").listen(mExperienceId.asString()+"-profile",
+ boost::bind(&LLFloaterExperienceProfile::experiencePermission, getDerivedHandle<LLFloaterExperienceProfile>(this), _1));
+
+ return TRUE;
+}
+
+void LLFloaterExperienceProfile::experienceCallback(LLHandle<LLFloaterExperienceProfile> handle, const LLSD& experience )
+{
+ LLFloaterExperienceProfile* pllpep = handle.get();
+ if(pllpep)
+ {
+ pllpep->refreshExperience(experience);
+ }
+}
+
+
+bool LLFloaterExperienceProfile::experiencePermission( LLHandle<LLFloaterExperienceProfile> handle, const LLSD& permission )
+{
+ LLFloaterExperienceProfile* pllpep = handle.get();
+ if(pllpep)
+ {
+ pllpep->updatePermission(permission);
+ }
+ return false;
+}
+
+
+void LLFloaterExperienceProfile::onClickEdit()
+{
+ LLTabContainer* tabs = getChild<LLTabContainer>("tab_container");
+
+ tabs->selectTabByName("edit_panel_experience_info");
+}
+
+
+void LLFloaterExperienceProfile::onClickCancel()
+{
+ changeToView();
+}
+
+void LLFloaterExperienceProfile::onClickSave()
+{
+ doSave(NOTHING);
+}
+
+
+void LLFloaterExperienceProfile::onClickPermission(const char* perm)
+{
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region)
+ return;
+
+ std::string lookup_url=region->getCapability("ExperiencePreferences");
+ if(lookup_url.empty())
+ return;
+ LLSD permission;
+ LLSD data;
+ permission["permission"]=perm;
+
+ data[mExperienceId.asString()]=permission;
+ LLHTTPClient::put(lookup_url, data, new ExperiencePreferencesResponder(mExperienceId));
+
+}
+
+
+void LLFloaterExperienceProfile::onClickForget()
+{
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region)
+ return;
+
+ std::string lookup_url=region->getCapability("ExperiencePreferences");
+ if(lookup_url.empty())
+ return;
+
+ LLHTTPClient::del(lookup_url+"?"+mExperienceId.asString(), new ExperiencePreferencesResponder(mExperienceId));
+}
+
+bool LLFloaterExperienceProfile::setMaturityString( U8 maturity, LLTextBox* child, LLComboBox* combo )
+{
+ LLStyle::Params style;
+ std::string access;
+ if(maturity <= SIM_ACCESS_PG)
+ {
+ style.image(LLUI::getUIImage(getString("maturity_icon_general")));
+ access = LLTrans::getString("SIM_ACCESS_PG");
+ combo->setCurrentByIndex(2);
+ }
+ else if(maturity <= SIM_ACCESS_MATURE)
+ {
+ style.image(LLUI::getUIImage(getString("maturity_icon_moderate")));
+ access = LLTrans::getString("SIM_ACCESS_MATURE");
+ combo->setCurrentByIndex(1);
+ }
+ else if(maturity <= SIM_ACCESS_ADULT)
+ {
+ style.image(LLUI::getUIImage(getString("maturity_icon_adult")));
+ access = LLTrans::getString("SIM_ACCESS_ADULT");
+ combo->setCurrentByIndex(0);
+ }
+ else
+ {
+ return false;
+ }
+
+ child->setText(LLStringUtil::null);
+
+ child->appendImageSegment(style);
+
+ child->appendText(access, false);
+
+ return true;
+}
+
+
+void LLFloaterExperienceProfile::refreshExperience( const LLSD& experience )
+{
+ mExperienceDetails = experience;
+ mPackage = experience;
+
+
+ LLLayoutPanel* imagePanel = getChild<LLLayoutPanel>(PNL_IMAGE);
+ LLLayoutPanel* descriptionPanel = getChild<LLLayoutPanel>(PNL_DESC);
+ LLLayoutPanel* locationPanel = getChild<LLLayoutPanel>(PNL_LOC);
+ LLLayoutPanel* marketplacePanel = getChild<LLLayoutPanel>(PNL_MRKT);
+ LLLayoutPanel* topPanel = getChild<LLLayoutPanel>(PNL_TOP);
+
+
+ imagePanel->setVisible(FALSE);
+ descriptionPanel->setVisible(FALSE);
+ locationPanel->setVisible(FALSE);
+ marketplacePanel->setVisible(FALSE);
+ topPanel->setVisible(FALSE);
+
+
+ LLTextBox* child = getChild<LLTextBox>(TF_NAME);
+ //child->setText(experience[LLExperienceCache::NAME].asString());
+ child->setText(LLSLURL("experience", experience[LLExperienceCache::EXPERIENCE_ID], "profile").getSLURLString());
+
+ LLLineEditor* linechild = getChild<LLLineEditor>(EDIT TF_NAME);
+ linechild->setText(experience[LLExperienceCache::NAME].asString());
+
+ std::string value = experience[LLExperienceCache::DESCRIPTION].asString();
+ LLExpandableTextBox* exchild = getChild<LLExpandableTextBox>(TF_DESC);
+ exchild->setText(value);
+ descriptionPanel->setVisible(value.length()>0);
+
+ LLTextEditor* edit_child = getChild<LLTextEditor>(EDIT TF_DESC);
+ edit_child->setText(value);
+
+ mLocationSLURL = experience[LLExperienceCache::SLURL].asString();
+ child = getChild<LLTextBox>(TF_SLURL);
+ bool has_slurl = mLocationSLURL.length()>0;
+ locationPanel->setVisible(has_slurl);
+ mLocationSLURL = LLSLURL(mLocationSLURL).getSLURLString();
+ child->setText(mLocationSLURL);
+
+
+ child = getChild<LLTextBox>(EDIT TF_SLURL);
+ if(has_slurl)
+ {
+ child->setText(mLocationSLURL);
+ }
+ else
+ {
+ child->setText(getString("empty_slurl"));
+ }
+
+ setMaturityString((U8)(experience[LLExperienceCache::MATURITY].asInteger()), getChild<LLTextBox>(TF_MATURITY), getChild<LLComboBox>(EDIT TF_MATURITY));
+
+ LLUUID id = experience[LLExperienceCache::AGENT_ID].asUUID();
+ child = getChild<LLTextBox>(TF_OWNER);
+ value = LLSLURL("agent", id, "inspect").getSLURLString();
+ child->setText(value);
+
+
+ id = experience[LLExperienceCache::GROUP_ID].asUUID();
+ bool id_null = id.isNull();
+ child = getChild<LLTextBox>(TF_GROUP);
+ value = LLSLURL("group", id, "inspect").getSLURLString();
+ child->setText(value);
+ getChild<LLLayoutPanel>(PNL_GROUP)->setVisible(!id_null);
+
+ setEditGroup(id);
+
+ getChild<LLButton>(BTN_SET_GROUP)->setEnabled(experience[LLExperienceCache::AGENT_ID].asUUID() == gAgent.getID());
+
+ LLCheckBoxCtrl* enable = getChild<LLCheckBoxCtrl>(EDIT BTN_ENABLE);
+ S32 properties = mExperienceDetails[LLExperienceCache::PROPERTIES].asInteger();
+ enable->set(!(properties & LLExperienceCache::PROPERTY_DISABLED));
+
+ enable = getChild<LLCheckBoxCtrl>(EDIT BTN_PRIVATE);
+ enable->set(properties & LLExperienceCache::PROPERTY_PRIVATE);
+
+ topPanel->setVisible(TRUE);
+ child=getChild<LLTextBox>(TF_GRID_WIDE);
+ child->setVisible(TRUE);
+
+ if(properties & LLExperienceCache::PROPERTY_GRID)
+ {
+ child->setText(LLTrans::getString("Grid-Scope"));
+ }
+ else
+ {
+ child->setText(LLTrans::getString("Land-Scope"));
+ }
+
+ if(getChild<LLButton>(BTN_EDIT)->getVisible())
+ {
+ topPanel->setVisible(TRUE);
+ }
+
+ if(properties & LLExperienceCache::PROPERTY_PRIVILEGED)
+ {
+ child = getChild<LLTextBox>(TF_PRIVILEGED);
+ child->setVisible(TRUE);
+ }
+ else
+ {
+ LLViewerRegion* region = gAgent.getRegion();
+ if (region)
+ {
+ std::string lookup_url=region->getCapability("ExperiencePreferences");
+ if(!lookup_url.empty())
+ {
+ LLHTTPClient::get(lookup_url+"?"+mExperienceId.asString(), new ExperiencePreferencesResponder(mExperienceId));
+ }
+ }
+ }
+
+ value=experience[LLExperienceCache::METADATA].asString();
+ if(value.empty())
+ return;
+
+ LLPointer<LLSDParser> parser = new LLSDXMLParser();
+
+ LLSD data;
+
+ std::istringstream is(value);
+ if(LLSDParser::PARSE_FAILURE != parser->parse(is, data, value.size()))
+ {
+ value="";
+ if(data.has(TF_MRKT))
+ {
+ value=data[TF_MRKT].asString();
+
+ child = getChild<LLTextBox>(TF_MRKT);
+ child->setText(value);
+ if(value.size())
+ {
+ marketplacePanel->setVisible(TRUE);
+ }
+ else
+ {
+ marketplacePanel->setVisible(FALSE);
+ }
+ }
+ else
+ {
+ marketplacePanel->setVisible(FALSE);
+ }
+
+ linechild = getChild<LLLineEditor>(EDIT TF_MRKT);
+ linechild->setText(value);
+
+ if(data.has(IMG_LOGO))
+ {
+ LLTextureCtrl* logo = getChild<LLTextureCtrl>(IMG_LOGO);
+
+ LLUUID id = data[IMG_LOGO].asUUID();
+ logo->setImageAssetID(id);
+ imagePanel->setVisible(TRUE);
+
+ logo = getChild<LLTextureCtrl>(EDIT IMG_LOGO);
+ logo->setImageAssetID(data[IMG_LOGO].asUUID());
+
+ imagePanel->setVisible(id.notNull());
+ }
+ }
+ else
+ {
+ marketplacePanel->setVisible(FALSE);
+ imagePanel->setVisible(FALSE);
+ }
+
+ mDirty=false;
+ mForceClose = false;
+ getChild<LLButton>(BTN_SAVE)->setEnabled(mDirty);
+}
+
+void LLFloaterExperienceProfile::setPreferences( const LLSD& content )
+{
+ S32 properties = mExperienceDetails[LLExperienceCache::PROPERTIES].asInteger();
+ if(properties & LLExperienceCache::PROPERTY_PRIVILEGED)
+ {
+ return;
+ }
+
+ const LLSD& experiences = content["experiences"];
+ const LLSD& blocked = content["blocked"];
+
+
+ for(LLSD::array_const_iterator it = experiences.beginArray(); it != experiences.endArray() ; ++it)
+ {
+ if(it->asUUID()==mExperienceId)
+ {
+ experienceAllowed();
+ return;
+ }
+ }
+
+ for(LLSD::array_const_iterator it = blocked.beginArray(); it != blocked.endArray() ; ++it)
+ {
+ if(it->asUUID()==mExperienceId)
+ {
+ experienceBlocked();
+ return;
+ }
+ }
+
+ experienceForgotten();
+}
+
+void LLFloaterExperienceProfile::onFieldChanged()
+{
+ updatePackage();
+
+ if(!getChild<LLButton>(BTN_EDIT)->getVisible())
+ {
+ return;
+ }
+ LLSD::map_const_iterator st = mExperienceDetails.beginMap();
+ LLSD::map_const_iterator dt = mPackage.beginMap();
+
+ mDirty = false;
+ while( !mDirty && st != mExperienceDetails.endMap() && dt != mPackage.endMap())
+ {
+ mDirty = st->first != dt->first || st->second.asString() != dt->second.asString();
+ ++st;++dt;
+ }
+
+ if(!mDirty && (st != mExperienceDetails.endMap() || dt != mPackage.endMap()))
+ {
+ mDirty = true;
+ }
+
+ getChild<LLButton>(BTN_SAVE)->setEnabled(mDirty);
+}
+
+
+BOOL LLFloaterExperienceProfile::canClose()
+{
+ if(mForceClose || !mDirty)
+ {
+ return TRUE;
+ }
+ else
+ {
+ // Bring up view-modal dialog: Save changes? Yes, No, Cancel
+ LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLFloaterExperienceProfile::handleSaveChangesDialog, this, _1, _2, CLOSE));
+ return FALSE;
+ }
+}
+
+bool LLFloaterExperienceProfile::handleSaveChangesDialog( const LLSD& notification, const LLSD& response, PostSaveAction action )
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ switch( option )
+ {
+ case 0: // "Yes"
+ // close after saving
+ doSave( action );
+ break;
+
+ case 1: // "No"
+ if(action != NOTHING)
+ {
+ mForceClose = TRUE;
+ if(action==CLOSE)
+ {
+ closeFloater();
+ }
+ else
+ {
+ changeToView();
+ }
+ }
+ break;
+
+ case 2: // "Cancel"
+ default:
+ // If we were quitting, we didn't really mean it.
+ LLAppViewer::instance()->abortQuit();
+ break;
+ }
+ return false;
+}
+
+void LLFloaterExperienceProfile::doSave( int success_action )
+{
+ mSaveCompleteAction=success_action;
+
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region)
+ return;
+
+ std::string url=region->getCapability("UpdateExperience");
+ if(url.empty())
+ return;
+
+ mPackage.erase(LLExperienceCache::QUOTA);
+ mPackage.erase(LLExperienceCache::EXPIRES);
+ mPackage.erase(LLExperienceCache::AGENT_ID);
+
+ LLHTTPClient::post(url, mPackage, new ExperienceUpdateResponder(getDerivedHandle<LLFloaterExperienceProfile>()));
+}
+
+void LLFloaterExperienceProfile::onSaveComplete( const LLSD& content )
+{
+ LLUUID id = getExperienceId();
+
+ if(content.has("removed"))
+ {
+ const LLSD& removed = content["removed"];
+ LLSD::map_const_iterator it = removed.beginMap();
+ for(/**/; it != removed.endMap(); ++it)
+ {
+ const std::string& field = it->first;
+ if(field == LLExperienceCache::EXPERIENCE_ID)
+ {
+ //this message should be removed by the experience api
+ continue;
+ }
+ const LLSD& data = it->second;
+ std::string error_tag = data["error_tag"].asString()+ "ExperienceProfileMessage";
+ LLSD fields;
+ if( LLNotifications::instance().getTemplate(error_tag))
+ {
+ fields["field"] = field;
+ fields["extra_info"] = data["extra_info"];
+ LLNotificationsUtil::add(error_tag, fields);
+ }
+ else
+ {
+ fields["MESSAGE"]=data["en"];
+ LLNotificationsUtil::add("GenericAlert", fields);
+ }
+ }
+ }
+
+ if(!content.has("experience_keys"))
+ {
+ LL_WARNS() << "LLFloaterExperienceProfile::onSaveComplete called with bad content" << LL_ENDL;
+ return;
+ }
+
+ const LLSD& experiences = content["experience_keys"];
+
+ LLSD::array_const_iterator it = experiences.beginArray();
+ if(it == experiences.endArray())
+ {
+ LL_WARNS() << "LLFloaterExperienceProfile::onSaveComplete called with empty content" << LL_ENDL;
+ return;
+ }
+
+ if(!it->has(LLExperienceCache::EXPERIENCE_ID) || ((*it)[LLExperienceCache::EXPERIENCE_ID].asUUID() != id))
+ {
+ LL_WARNS() << "LLFloaterExperienceProfile::onSaveComplete called with unexpected experience id" << LL_ENDL;
+ return;
+ }
+
+ refreshExperience(*it);
+ LLExperienceCache::insert(*it);
+ LLExperienceCache::fetch(id, true);
+
+ if(mSaveCompleteAction==VIEW)
+ {
+ LLTabContainer* tabs = getChild<LLTabContainer>("tab_container");
+ tabs->selectTabByName("panel_experience_info");
+ }
+ else if(mSaveCompleteAction == CLOSE)
+ {
+ closeFloater();
+ }
+}
+
+void LLFloaterExperienceProfile::changeToView()
+{
+ if(mForceClose || !mDirty)
+ {
+ refreshExperience(mExperienceDetails);
+ LLTabContainer* tabs = getChild<LLTabContainer>("tab_container");
+
+ tabs->selectTabByName("panel_experience_info");
+ }
+ else
+ {
+ // Bring up view-modal dialog: Save changes? Yes, No, Cancel
+ LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLFloaterExperienceProfile::handleSaveChangesDialog, this, _1, _2, VIEW));
+ }
+}
+
+void LLFloaterExperienceProfile::onClickLocation()
+{
+ LLViewerRegion* region = gAgent.getRegion();
+ if(region)
+ {
+ LLTextBox* child = getChild<LLTextBox>(EDIT TF_SLURL);
+ mLocationSLURL = LLSLURL(region->getName(), gAgent.getPositionGlobal()).getSLURLString();
+ child->setText(mLocationSLURL);
+ onFieldChanged();
+ }
+}
+
+void LLFloaterExperienceProfile::onClickClear()
+{
+ LLTextBox* child = getChild<LLTextBox>(EDIT TF_SLURL);
+ mLocationSLURL = "";
+ child->setText(getString("empty_slurl"));
+ onFieldChanged();
+}
+
+void LLFloaterExperienceProfile::updatePermission( const LLSD& permission )
+{
+ if(permission.has("experience"))
+ {
+ if(permission["experience"].asUUID() != mExperienceId)
+ {
+ return;
+ }
+
+ std::string str = permission[mExperienceId.asString()]["permission"].asString();
+ if(str == "Allow")
+ {
+ experienceAllowed();
+ }
+ else if(str == "Block")
+ {
+ experienceBlocked();
+ }
+ else if(str == "Forget")
+ {
+ experienceForgotten();
+ }
+ }
+ else
+ {
+ setPreferences(permission);
+ }
+}
+
+void LLFloaterExperienceProfile::experienceAllowed()
+{
+ LLButton* button=getChild<LLButton>(BTN_ALLOW);
+ button->setEnabled(FALSE);
+
+ button=getChild<LLButton>(BTN_FORGET);
+ button->setEnabled(TRUE);
+
+ button=getChild<LLButton>(BTN_BLOCK);
+ button->setEnabled(TRUE);
+}
+
+void LLFloaterExperienceProfile::experienceForgotten()
+{
+ LLButton* button=getChild<LLButton>(BTN_ALLOW);
+ button->setEnabled(TRUE);
+
+ button=getChild<LLButton>(BTN_FORGET);
+ button->setEnabled(FALSE);
+
+ button=getChild<LLButton>(BTN_BLOCK);
+ button->setEnabled(TRUE);
+}
+
+void LLFloaterExperienceProfile::experienceBlocked()
+{
+ LLButton* button=getChild<LLButton>(BTN_ALLOW);
+ button->setEnabled(TRUE);
+
+ button=getChild<LLButton>(BTN_FORGET);
+ button->setEnabled(TRUE);
+
+ button=getChild<LLButton>(BTN_BLOCK);
+ button->setEnabled(FALSE);
+}
+
+void LLFloaterExperienceProfile::onClose( bool app_quitting )
+{
+ LLEventPumps::instance().obtain("experience_permission").stopListening(mExperienceId.asString()+"-profile");
+ LLFloater::onClose(app_quitting);
+}
+
+void LLFloaterExperienceProfile::updatePackage()
+{
+ mPackage[LLExperienceCache::NAME] = getChild<LLLineEditor>(EDIT TF_NAME)->getText();
+ mPackage[LLExperienceCache::DESCRIPTION] = getChild<LLTextEditor>(EDIT TF_DESC)->getText();
+ if(mLocationSLURL.empty())
+ {
+ mPackage[LLExperienceCache::SLURL] = LLStringUtil::null;
+ }
+ else
+ {
+ mPackage[LLExperienceCache::SLURL] = mLocationSLURL;
+ }
+
+ mPackage[LLExperienceCache::MATURITY] = getChild<LLComboBox>(EDIT TF_MATURITY)->getSelectedValue().asInteger();
+
+ LLSD metadata;
+
+ metadata[TF_MRKT] = getChild<LLLineEditor>(EDIT TF_MRKT)->getText();
+ metadata[IMG_LOGO] = getChild<LLTextureCtrl>(EDIT IMG_LOGO)->getImageAssetID();
+
+ LLPointer<LLSDXMLFormatter> formatter = new LLSDXMLFormatter();
+
+ std::ostringstream os;
+ if(formatter->format(metadata, os))
+ {
+ mPackage[LLExperienceCache::METADATA]=os.str();
+ }
+
+ int properties = mPackage[LLExperienceCache::PROPERTIES].asInteger();
+ LLCheckBoxCtrl* enable = getChild<LLCheckBoxCtrl>(EDIT BTN_ENABLE);
+ if(enable->get())
+ {
+ properties &= ~LLExperienceCache::PROPERTY_DISABLED;
+ }
+ else
+ {
+ properties |= LLExperienceCache::PROPERTY_DISABLED;
+ }
+
+ enable = getChild<LLCheckBoxCtrl>(EDIT BTN_PRIVATE);
+ if(enable->get())
+ {
+ properties |= LLExperienceCache::PROPERTY_PRIVATE;
+ }
+ else
+ {
+ properties &= ~LLExperienceCache::PROPERTY_PRIVATE;
+ }
+
+ mPackage[LLExperienceCache::PROPERTIES] = properties;
+}
+
+void LLFloaterExperienceProfile::onPickGroup()
+{
+ LLFloater* parent_floater = gFloaterView->getParentFloater(this);
+
+ LLFloaterGroupPicker* widget = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(gAgent.getID()));
+ if (widget)
+ {
+ widget->setSelectGroupCallback(boost::bind(&LLFloaterExperienceProfile::setEditGroup, this, _1));
+ if (parent_floater)
+ {
+ LLRect new_rect = gFloaterView->findNeighboringPosition(parent_floater, widget);
+ widget->setOrigin(new_rect.mLeft, new_rect.mBottom);
+ parent_floater->addDependentFloater(widget);
+ }
+ }
+}
+
+void LLFloaterExperienceProfile::setEditGroup( LLUUID group_id )
+{
+ LLTextBox* child = getChild<LLTextBox>(EDIT TF_GROUP);
+ std::string value = LLSLURL("group", group_id, "inspect").getSLURLString();
+ child->setText(value);
+ mPackage[LLExperienceCache::GROUP_ID] = group_id;
+ onFieldChanged();
+}
+
+void LLFloaterExperienceProfile::onReportExperience()
+{
+ LLFloaterReporter::showFromExperience(mExperienceId);
+}
diff --git a/indra/newview/llfloaterexperienceprofile.h b/indra/newview/llfloaterexperienceprofile.h
new file mode 100644
index 0000000000..78d54eb447
--- /dev/null
+++ b/indra/newview/llfloaterexperienceprofile.h
@@ -0,0 +1,104 @@
+/**
+ * @file llfloaterexperienceprofile.h
+ * @brief llfloaterexperienceprofile and related class definitions
+ *
+ * $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_LLFLOATEREXPERIENCEPROFILE_H
+#define LL_LLFLOATEREXPERIENCEPROFILE_H
+
+#include "llfloater.h"
+#include "lluuid.h"
+#include "llsd.h"
+
+class LLLayoutPanel;
+class LLTextBox;
+class LLComboBox;
+
+class LLFloaterExperienceProfile : public LLFloater
+{
+ LOG_CLASS(LLFloaterExperienceProfile);
+public:
+ enum PostSaveAction
+ {
+ NOTHING,
+ CLOSE,
+ VIEW,
+ };
+
+
+ LLFloaterExperienceProfile(const LLSD& data);
+ virtual ~LLFloaterExperienceProfile();
+
+ LLUUID getExperienceId() const { return mExperienceId; }
+ void setPreferences( const LLSD& content );
+
+
+ void refreshExperience(const LLSD& experience);
+ void onSaveComplete( const LLSD& content );
+ virtual BOOL canClose();
+
+ virtual void onClose(bool app_quitting);
+protected:
+ void onClickEdit();
+ void onClickPermission(const char* permission);
+ void onClickForget();
+ void onClickCancel();
+ void onClickSave();
+ void onClickLocation();
+ void onClickClear();
+ void onPickGroup();
+ void onFieldChanged();
+ void onReportExperience();
+
+ void setEditGroup(LLUUID group_id);
+
+ void changeToView();
+
+ void experienceForgotten();
+ void experienceBlocked();
+ void experienceAllowed();
+
+ static void experienceCallback(LLHandle<LLFloaterExperienceProfile> handle, const LLSD& experience);
+ static bool experiencePermission(LLHandle<LLFloaterExperienceProfile> handle, const LLSD& permission);
+
+ BOOL postBuild();
+ bool setMaturityString(U8 maturity, LLTextBox* child, LLComboBox* combo);
+ bool handleSaveChangesDialog(const LLSD& notification, const LLSD& response, PostSaveAction action);
+ void doSave( int success_action );
+
+ void updatePackage();
+
+ void updatePermission( const LLSD& permission );
+ LLUUID mExperienceId;
+ LLSD mExperienceDetails;
+ LLSD mPackage;
+ std::string mLocationSLURL;
+ int mSaveCompleteAction;
+ bool mDirty;
+ bool mForceClose;
+};
+
+#endif // LL_LLFLOATEREXPERIENCEPROFILE_H
diff --git a/indra/newview/llfloaterexperiences.cpp b/indra/newview/llfloaterexperiences.cpp
new file mode 100644
index 0000000000..777dc382cd
--- /dev/null
+++ b/indra/newview/llfloaterexperiences.cpp
@@ -0,0 +1,340 @@
+/**
+ * @file llfloaterexperiences.cpp
+ * @brief LLFloaterExperiences class implementation
+ *
+ * $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 "llfloaterexperiences.h"
+#include "llfloaterreg.h"
+
+#include "llagent.h"
+#include "llevents.h"
+#include "llexperiencecache.h"
+#include "llfloaterregioninfo.h"
+#include "llhttpclient.h"
+#include "llnotificationsutil.h"
+#include "llpanelexperiencelog.h"
+#include "llpanelexperiencepicker.h"
+#include "llpanelexperiences.h"
+#include "lltabcontainer.h"
+#include "lltrans.h"
+#include "llviewerregion.h"
+
+
+#define SHOW_RECENT_TAB (0)
+
+class LLExperienceListResponder : public LLHTTPClient::Responder
+{
+public:
+ typedef std::map<std::string, std::string> NameMap;
+ typedef boost::function<void(LLPanelExperiences*, const LLSD&)> Callback;
+ LLExperienceListResponder(const LLHandle<LLFloaterExperiences>& parent, NameMap& nameMap, const std::string& errorMessage="ErrorMessage"):mParent(parent),mErrorMessage(errorMessage)
+ {
+ mNameMap.swap(nameMap);
+ }
+
+ Callback mCallback;
+ LLHandle<LLFloaterExperiences> mParent;
+ NameMap mNameMap;
+ const std::string mErrorMessage;
+ /*virtual*/ void httpSuccess()
+ {
+ if(mParent.isDead())
+ return;
+
+ LLFloaterExperiences* parent=mParent.get();
+ LLTabContainer* tabs = parent->getChild<LLTabContainer>("xp_tabs");
+
+ NameMap::iterator it = mNameMap.begin();
+ while(it != mNameMap.end())
+ {
+ if(getContent().has(it->first))
+ {
+ LLPanelExperiences* tab = (LLPanelExperiences*)tabs->getPanelByName(it->second);
+ if(tab)
+ {
+ const LLSD& ids = getContent()[it->first];
+ tab->setExperienceList(ids);
+ if(!mCallback.empty())
+ {
+ mCallback(tab, getContent());
+ }
+ }
+ }
+ ++it;
+ }
+ }
+
+ /*virtual*/ void httpFailure()
+ {
+ LLSD subs;
+ subs["ERROR_MESSAGE"] = getReason();
+ LLNotificationsUtil::add(mErrorMessage, subs);
+ }
+};
+
+
+
+LLFloaterExperiences::LLFloaterExperiences(const LLSD& data)
+ :LLFloater(data)
+{
+}
+
+LLPanelExperiences* LLFloaterExperiences::addTab(const std::string& name, bool select)
+{
+ LLPanelExperiences* newPanel = LLPanelExperiences::create(name);
+ getChild<LLTabContainer>("xp_tabs")->addTabPanel(LLTabContainer::TabPanelParams().
+ panel(newPanel).
+ label(LLTrans::getString(name)).
+ select_tab(select));
+
+ return newPanel;
+}
+
+BOOL LLFloaterExperiences::postBuild()
+{
+ getChild<LLTabContainer>("xp_tabs")->addTabPanel(new LLPanelExperiencePicker());
+ addTab("Allowed_Experiences_Tab", true);
+ addTab("Blocked_Experiences_Tab", false);
+ addTab("Admin_Experiences_Tab", false);
+ addTab("Contrib_Experiences_Tab", false);
+ LLPanelExperiences* owned = addTab("Owned_Experiences_Tab", false);
+ owned->setButtonAction("acquire", boost::bind(&LLFloaterExperiences::sendPurchaseRequest, this));
+ owned->enableButton(false);
+#if SHOW_RECENT_TAB
+ addTab("Recent_Experiences_Tab", false);
+#endif //SHOW_RECENT_TAB
+ getChild<LLTabContainer>("xp_tabs")->addTabPanel(new LLPanelExperienceLog());
+ resizeToTabs();
+
+
+ LLEventPumps::instance().obtain("experience_permission").listen("LLFloaterExperiences",
+ boost::bind(&LLFloaterExperiences::updatePermissions, this, _1));
+
+ return TRUE;
+}
+
+
+void LLFloaterExperiences::clearFromRecent(const LLSD& ids)
+{
+#if SHOW_RECENT_TAB
+ LLTabContainer* tabs = getChild<LLTabContainer>("xp_tabs");
+
+ LLPanelExperiences* tab = (LLPanelExperiences*)tabs->getPanelByName("Recent_Experiences_Tab");
+ if(!tab)
+ return;
+
+ tab->removeExperiences(ids);
+#endif // SHOW_RECENT_TAB
+}
+
+void LLFloaterExperiences::setupRecentTabs()
+{
+#if SHOW_RECENT_TAB
+ LLTabContainer* tabs = getChild<LLTabContainer>("xp_tabs");
+
+ LLPanelExperiences* tab = (LLPanelExperiences*)tabs->getPanelByName("Recent_Experiences_Tab");
+ if(!tab)
+ return;
+
+ LLSD recent;
+
+ const LLExperienceCache::cache_t& experiences = LLExperienceCache::getCached();
+
+ LLExperienceCache::cache_t::const_iterator it = experiences.begin();
+ while( it != experiences.end() )
+ {
+ if(!it->second.has(LLExperienceCache::MISSING))
+ {
+ recent.append(it->first);
+ }
+ ++it;
+ }
+
+ tab->setExperienceList(recent);
+#endif // SHOW_RECENT_TAB
+}
+
+
+void LLFloaterExperiences::resizeToTabs()
+{
+ const S32 TAB_WIDTH_PADDING = 16;
+
+ LLTabContainer* tabs = getChild<LLTabContainer>("xp_tabs");
+ LLRect rect = getRect();
+ if(rect.getWidth() < tabs->getTotalTabWidth() + TAB_WIDTH_PADDING)
+ {
+ rect.mRight = rect.mLeft + tabs->getTotalTabWidth() + TAB_WIDTH_PADDING;
+ }
+ reshape(rect.getWidth(), rect.getHeight(), FALSE);
+}
+
+void LLFloaterExperiences::refreshContents()
+{
+ setupRecentTabs();
+
+ LLViewerRegion* region = gAgent.getRegion();
+
+ if (region)
+ {
+ LLExperienceListResponder::NameMap nameMap;
+ std::string lookup_url=region->getCapability("GetExperiences");
+ if(!lookup_url.empty())
+ {
+ nameMap["experiences"]="Allowed_Experiences_Tab";
+ nameMap["blocked"]="Blocked_Experiences_Tab";
+ LLHTTPClient::get(lookup_url, new LLExperienceListResponder(getDerivedHandle<LLFloaterExperiences>(), nameMap));
+ }
+
+ updateInfo("GetAdminExperiences","Admin_Experiences_Tab");
+ updateInfo("GetCreatorExperiences","Contrib_Experiences_Tab");
+
+ lookup_url = region->getCapability("AgentExperiences");
+ if(!lookup_url.empty())
+ {
+ nameMap["experience_ids"]="Owned_Experiences_Tab";
+ LLExperienceListResponder* responder = new LLExperienceListResponder(getDerivedHandle<LLFloaterExperiences>(), nameMap, "ExperienceAcquireFailed");
+ responder->mCallback = boost::bind(&LLFloaterExperiences::checkPurchaseInfo, this, _1, _2);
+ LLHTTPClient::get(lookup_url, responder);
+ }
+ }
+}
+
+void LLFloaterExperiences::onOpen( const LLSD& key )
+{
+ LLViewerRegion* region = gAgent.getRegion();
+ if(region)
+ {
+ if(region->capabilitiesReceived())
+ {
+ refreshContents();
+ return;
+ }
+ region->setCapabilitiesReceivedCallback(boost::bind(&LLFloaterExperiences::refreshContents, this));
+ return;
+ }
+}
+
+bool LLFloaterExperiences::updatePermissions( const LLSD& permission )
+{
+ LLTabContainer* tabs = getChild<LLTabContainer>("xp_tabs");
+ LLUUID experience;
+ std::string permission_string;
+ if(permission.has("experience"))
+ {
+ experience = permission["experience"].asUUID();
+ permission_string = permission[experience.asString()]["permission"].asString();
+
+ }
+ LLPanelExperiences* tab = (LLPanelExperiences*)tabs->getPanelByName("Allowed_Experiences_Tab");
+ if(tab)
+ {
+ if(permission.has("experiences"))
+ {
+ tab->setExperienceList(permission["experiences"]);
+ }
+ else if(experience.notNull())
+ {
+ if(permission_string != "Allow")
+ {
+ tab->removeExperience(experience);
+ }
+ else
+ {
+ tab->addExperience(experience);
+ }
+ }
+ }
+
+ tab = (LLPanelExperiences*)tabs->getPanelByName("Blocked_Experiences_Tab");
+ if(tab)
+ {
+ if(permission.has("blocked"))
+ {
+ tab->setExperienceList(permission["blocked"]);
+ }
+ else if(experience.notNull())
+ {
+ if(permission_string != "Block")
+ {
+ tab->removeExperience(experience);
+ }
+ else
+ {
+ tab->addExperience(experience);
+ }
+ }
+ }
+ return false;
+}
+
+void LLFloaterExperiences::onClose( bool app_quitting )
+{
+ LLEventPumps::instance().obtain("experience_permission").stopListening("LLFloaterExperiences");
+ LLFloater::onClose(app_quitting);
+}
+
+void LLFloaterExperiences::checkPurchaseInfo(LLPanelExperiences* panel, const LLSD& content) const
+{
+ panel->enableButton(content.has("purchase"));
+
+ LLFloaterExperiences::findInstance()->updateInfo("GetAdminExperiences","Admin_Experiences_Tab");
+ LLFloaterExperiences::findInstance()->updateInfo("GetCreatorExperiences","Contrib_Experiences_Tab");
+}
+
+void LLFloaterExperiences::updateInfo(std::string experiences, std::string tab)
+{
+ LLViewerRegion* region = gAgent.getRegion();
+ if (region)
+ {
+ LLExperienceListResponder::NameMap nameMap;
+ std::string lookup_url = region->getCapability(experiences);
+ if(!lookup_url.empty())
+ {
+ nameMap["experience_ids"]=tab;
+ LLHTTPClient::get(lookup_url, new LLExperienceListResponder(getDerivedHandle<LLFloaterExperiences>(), nameMap));
+ }
+ }
+}
+
+void LLFloaterExperiences::sendPurchaseRequest() const
+{
+ LLViewerRegion* region = gAgent.getRegion();
+ std::string url = region->getCapability("AgentExperiences");
+ if(!url.empty())
+ {
+ LLSD content;
+
+ LLExperienceListResponder::NameMap nameMap;
+ nameMap["experience_ids"]="Owned_Experiences_Tab";
+ LLExperienceListResponder* responder = new LLExperienceListResponder(getDerivedHandle<LLFloaterExperiences>(), nameMap, "ExperienceAcquireFailed");
+ responder->mCallback = boost::bind(&LLFloaterExperiences::checkPurchaseInfo, this, _1, _2);
+ LLHTTPClient::post(url, content, responder);
+ }
+}
+
+LLFloaterExperiences* LLFloaterExperiences::findInstance()
+{
+ return LLFloaterReg::findTypedInstance<LLFloaterExperiences>("experiences");
+}
diff --git a/indra/newview/llfloaterexperiences.h b/indra/newview/llfloaterexperiences.h
new file mode 100644
index 0000000000..769283ff07
--- /dev/null
+++ b/indra/newview/llfloaterexperiences.h
@@ -0,0 +1,60 @@
+/**
+ * @file llfloaterexperiences.h
+ * @brief LLFloaterExperiences class definition
+ *
+ * $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_LLFLOATEREXPERIENCES_H
+#define LL_LLFLOATEREXPERIENCES_H
+
+#include "llfloater.h"
+
+class LLPanelExperiences;
+
+class LLFloaterExperiences :
+ public LLFloater
+{
+public:
+ LLFloaterExperiences(const LLSD& data);
+ virtual void onClose(bool app_quitting);
+
+ virtual void onOpen(const LLSD& key);
+ static LLFloaterExperiences* findInstance();
+protected:
+ void clearFromRecent(const LLSD& ids);
+ void resizeToTabs();
+ /*virtual*/ BOOL postBuild();
+ void refreshContents();
+ void setupRecentTabs();
+ LLPanelExperiences* addTab(const std::string& name, bool select);
+
+ bool updatePermissions(const LLSD& permission);
+ void sendPurchaseRequest() const;
+ void checkPurchaseInfo(LLPanelExperiences* panel, const LLSD& content)const;
+ void updateInfo(std::string experiences, std::string tab);
+
+private:
+
+};
+
+#endif //LL_LLFLOATEREXPERIENCES_H
diff --git a/indra/newview/llfloaterfacebook.cpp b/indra/newview/llfloaterfacebook.cpp
index 3a2047cfef..da85d378b2 100644
--- a/indra/newview/llfloaterfacebook.cpp
+++ b/indra/newview/llfloaterfacebook.cpp
@@ -64,9 +64,9 @@ const std::string DEFAULT_CHECKIN_ICON_URL = "http://map.secondlife.com.s3.amazo
const std::string DEFAULT_CHECKIN_QUERY_PARAMETERS = "?sourceid=slshare_checkin&utm_source=facebook&utm_medium=checkin&utm_campaign=slshare";
const std::string DEFAULT_PHOTO_QUERY_PARAMETERS = "?sourceid=slshare_photo&utm_source=facebook&utm_medium=photo&utm_campaign=slshare";
-const S32 MAX_QUALITY = 100; // Max quality value for jpeg images
-const S32 MIN_QUALITY = 0; // Min quality value for jpeg images
-const S32 TARGET_DATA_SIZE = 95000; // Size of the image (compressed) we're trying to send to Facebook
+const S32 MAX_QUALITY = 100; // Max quality value for jpeg images
+const S32 MIN_QUALITY = 0; // Min quality value for jpeg images
+const S32 TARGET_DATA_SIZE = 950000; // Size of the image (compressed) we're trying to send to Facebook
std::string get_map_url()
{
diff --git a/indra/newview/llfloaterhardwaresettings.cpp b/indra/newview/llfloaterhardwaresettings.cpp
deleted file mode 100755
index 035eb307c2..0000000000
--- a/indra/newview/llfloaterhardwaresettings.cpp
+++ /dev/null
@@ -1,201 +0,0 @@
-/**
- * @file llfloaterhardwaresettings.cpp
- * @brief Menu of all the different graphics hardware settings
- *
- * $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 "llfloaterhardwaresettings.h"
-
-// Viewer includes
-#include "llfloaterpreference.h"
-#include "llviewerwindow.h"
-#include "llviewercontrol.h"
-#include "llviewertexturelist.h"
-#include "llfeaturemanager.h"
-#include "llspinctrl.h"
-#include "llstartup.h"
-#include "lltextbox.h"
-#include "llcombobox.h"
-#include "pipeline.h"
-
-// Linden library includes
-#include "llradiogroup.h"
-#include "lluictrlfactory.h"
-#include "llwindow.h"
-#include "llsliderctrl.h"
-
-LLFloaterHardwareSettings::LLFloaterHardwareSettings(const LLSD& key)
- : LLFloater(key),
-
- // these should be set on imminent refresh() call,
- // but init them anyway
- mUseVBO(0),
- mUseAniso(0),
- mFSAASamples(0),
- mGamma(0.0),
- mVideoCardMem(0),
- mFogRatio(0.0),
- mProbeHardwareOnStartup(FALSE)
-{
-}
-
-LLFloaterHardwareSettings::~LLFloaterHardwareSettings()
-{
-}
-
-void LLFloaterHardwareSettings::initCallbacks(void)
-{
-}
-
-// menu maintenance functions
-
-void LLFloaterHardwareSettings::refresh()
-{
- LLPanel::refresh();
-
- mUseVBO = gSavedSettings.getBOOL("RenderVBOEnable");
- mUseAniso = gSavedSettings.getBOOL("RenderAnisotropic");
- mFSAASamples = gSavedSettings.getU32("RenderFSAASamples");
- mGamma = gSavedSettings.getF32("RenderGamma");
- mVideoCardMem = gSavedSettings.getS32("TextureMemory");
- mFogRatio = gSavedSettings.getF32("RenderFogRatio");
- mProbeHardwareOnStartup = gSavedSettings.getBOOL("ProbeHardwareOnStartup");
-
- getChild<LLUICtrl>("fsaa")->setValue((LLSD::Integer) mFSAASamples);
- refreshEnabledState();
-}
-
-void LLFloaterHardwareSettings::refreshEnabledState()
-{
- F32 mem_multiplier = gSavedSettings.getF32("RenderTextureMemoryMultiple");
- S32Megabytes min_tex_mem = LLViewerTextureList::getMinVideoRamSetting();
- S32Megabytes max_tex_mem = LLViewerTextureList::getMaxVideoRamSetting(false, mem_multiplier);
- getChild<LLSliderCtrl>("GraphicsCardTextureMemory")->setMinValue(min_tex_mem.value());
- getChild<LLSliderCtrl>("GraphicsCardTextureMemory")->setMaxValue(max_tex_mem.value());
-
- if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderVBOEnable") ||
- !gGLManager.mHasVertexBufferObject)
- {
- getChildView("vbo")->setEnabled(FALSE);
- }
-
- if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderCompressTextures") ||
- !gGLManager.mHasVertexBufferObject)
- {
- getChildView("texture compression")->setEnabled(FALSE);
- }
-
- // if no windlight shaders, turn off nighttime brightness, gamma, and fog distance
- LLSpinCtrl* gamma_ctrl = getChild<LLSpinCtrl>("gamma");
- gamma_ctrl->setEnabled(!gPipeline.canUseWindLightShaders());
- getChildView("(brightness, lower is brighter)")->setEnabled(!gPipeline.canUseWindLightShaders());
- getChildView("fog")->setEnabled(!gPipeline.canUseWindLightShaders());
-
- // anti-aliasing
- {
- LLUICtrl* fsaa_ctrl = getChild<LLUICtrl>("fsaa");
- LLTextBox* fsaa_text = getChild<LLTextBox>("antialiasing label");
- LLView* fsaa_restart = getChildView("antialiasing restart");
-
- // Enable or disable the control, the "Antialiasing:" label and the restart warning
- // based on code support for the feature on the current hardware.
-
- if (gPipeline.canUseAntiAliasing())
- {
- fsaa_ctrl->setEnabled(TRUE);
-
- // borrow the text color from the gamma control for consistency
- fsaa_text->setColor(gamma_ctrl->getEnabledTextColor());
-
- fsaa_restart->setVisible(!gSavedSettings.getBOOL("RenderDeferred"));
- }
- else
- {
- fsaa_ctrl->setEnabled(FALSE);
- fsaa_ctrl->setValue((LLSD::Integer) 0);
-
- // borrow the text color from the gamma control for consistency
- fsaa_text->setColor(gamma_ctrl->getDisabledTextColor());
-
- fsaa_restart->setVisible(FALSE);
- }
- }
-}
-
-//============================================================================
-
-BOOL LLFloaterHardwareSettings::postBuild()
-{
- childSetAction("OK", onBtnOK, this);
-
-// Don't do this on Mac as their braindead GL versioning
-// sets this when 8x and 16x are indeed available
-//
-#if !LL_DARWIN
- if (gGLManager.mIsIntel || gGLManager.mGLVersion < 3.f)
- { //remove FSAA settings above "4x"
- LLComboBox* combo = getChild<LLComboBox>("fsaa");
- combo->remove("8x");
- combo->remove("16x");
- }
-#endif
-
- refresh();
- center();
-
- // load it up
- initCallbacks();
- return TRUE;
-}
-
-
-void LLFloaterHardwareSettings::apply()
-{
- refresh();
-}
-
-
-void LLFloaterHardwareSettings::cancel()
-{
- gSavedSettings.setBOOL("RenderVBOEnable", mUseVBO);
- gSavedSettings.setBOOL("RenderAnisotropic", mUseAniso);
- gSavedSettings.setU32("RenderFSAASamples", mFSAASamples);
- gSavedSettings.setF32("RenderGamma", mGamma);
- gSavedSettings.setS32("TextureMemory", mVideoCardMem);
- gSavedSettings.setF32("RenderFogRatio", mFogRatio);
- gSavedSettings.setBOOL("ProbeHardwareOnStartup", mProbeHardwareOnStartup );
-
- closeFloater();
-}
-
-// static
-void LLFloaterHardwareSettings::onBtnOK( void* userdata )
-{
- LLFloaterHardwareSettings *fp =(LLFloaterHardwareSettings *)userdata;
- fp->apply();
- fp->closeFloater(false);
-}
-
-
diff --git a/indra/newview/llfloaterhardwaresettings.h b/indra/newview/llfloaterhardwaresettings.h
deleted file mode 100755
index 626771b1d2..0000000000
--- a/indra/newview/llfloaterhardwaresettings.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * @file llfloaterhardwaresettings.h
- * @brief Menu of all the different graphics hardware settings
- *
- * $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_LLFLOATER_HARDWARE_SETTINGS_H
-#define LL_LLFLOATER_HARDWARE_SETTINGS_H
-
-#include "llfloater.h"
-
-/// Menuing system for all of windlight's functionality
-class LLFloaterHardwareSettings : public LLFloater
-{
- friend class LLFloaterPreference;
-
-public:
-
- LLFloaterHardwareSettings(const LLSD& key);
- /*virtual*/ ~LLFloaterHardwareSettings();
-
- /*virtual*/ BOOL postBuild();
-
- /// initialize all the callbacks for the menu
- void initCallbacks(void);
-
- /// OK button
- static void onBtnOK( void* userdata );
-
- //// menu management
-
- /// show off our menu
- static void show();
-
- /// return if the menu exists or not
- static bool isOpen();
-
- /// sync up menu with parameters
- void refresh();
-
- /// Apply the changed values.
- void apply();
-
- /// don't apply the changed values
- void cancel();
-
- /// refresh the enabled values
- void refreshEnabledState();
-
-protected:
- BOOL mUseVBO;
- BOOL mUseAniso;
- BOOL mUseFBO;
- U32 mFSAASamples;
- F32 mGamma;
- S32 mVideoCardMem;
- F32 mFogRatio;
- BOOL mProbeHardwareOnStartup;
-
-private:
-};
-
-#endif
-
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index ab57e8c170..f1a6ef78a6 100755
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -261,6 +261,8 @@ BOOL LLFloaterIMContainer::postBuild()
mInitialized = true;
+ mIsFirstOpen = true;
+
// Add callbacks:
// We'll take care of view updates on idle
gIdleCallbacks.addFunction(idle, this);
@@ -636,14 +638,16 @@ void LLFloaterIMContainer::setVisible(BOOL 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 ((nearby_chat == NULL) || mIsFirstOpen)
{
+ mIsFirstOpen = false;
// 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);
selectConversationPair(LLUUID(NULL), false, false);
}
+
flashConversationItemWidget(mSelectedSession,false);
LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(mSelectedSession);
@@ -1216,7 +1220,22 @@ void LLFloaterIMContainer::doToSelectedConversation(const std::string& command,
{
if (selectedIDS.size() > 0)
{
- LLAvatarActions::viewChatHistory(selectedIDS.front());
+ if(conversationItem->getType() == LLConversationItem::CONV_SESSION_GROUP)
+ {
+ LLFloaterReg::showInstance("preview_conversation", conversationItem->getUUID(), true);
+ }
+ else if(conversationItem->getType() == LLConversationItem::CONV_SESSION_AD_HOC)
+ {
+ LLConversation* conv = LLConversationLog::instance().findConversation(LLIMModel::getInstance()->findIMSession(conversationItem->getUUID()));
+ if(conv)
+ {
+ LLFloaterReg::showInstance("preview_conversation", conv->getSessionID(), true);
+ }
+ }
+ else
+ {
+ LLAvatarActions::viewChatHistory(selectedIDS.front());
+ }
}
}
else
@@ -1316,6 +1335,15 @@ bool LLFloaterIMContainer::enableContextMenuItem(const LLSD& userdata)
{
return LLLogChat::isNearbyTranscriptExist();
}
+ else if (getCurSelectedViewModelItem()->getType() == LLConversationItem::CONV_SESSION_AD_HOC)
+ {
+ const LLConversation* conv = LLConversationLog::instance().findConversation(LLIMModel::getInstance()->findIMSession(uuids.front()));
+ if(conv)
+ {
+ return LLLogChat::isAdHocTranscriptExist(conv->getHistoryFileName());
+ }
+ return false;
+ }
else
{
bool is_group = (getCurSelectedViewModelItem()->getType() == LLConversationItem::CONV_SESSION_GROUP);
@@ -1881,22 +1909,28 @@ bool LLFloaterIMContainer::canBanSelectedMember(const LLUUID& participant_uuid)
return false;
}
- if (!gdatap->mMembers.size())
+ if (gdatap->mPendingBanRequest)
{
return false;
}
- LLGroupMgrGroupData::member_list_t::iterator mi = gdatap->mMembers.find((participant_uuid));
- if (mi == gdatap->mMembers.end())
+ if (gdatap->isRoleMemberDataComplete())
{
- return false;
- }
+ if (!gdatap->mMembers.size())
+ {
+ return false;
+ }
- LLGroupMemberData* member_data = (*mi).second;
- // Is the member an owner?
- if ( member_data && member_data->isInRole(gdatap->mOwnerRole) )
- {
- return false;
+ LLGroupMgrGroupData::member_list_t::iterator mi = gdatap->mMembers.find((participant_uuid));
+ if (mi != gdatap->mMembers.end())
+ {
+ LLGroupMemberData* member_data = (*mi).second;
+ // Is the member an owner?
+ if (member_data && member_data->isInRole(gdatap->mOwnerRole))
+ {
+ return false;
+ }
+ }
}
if( gAgent.hasPowerInGroup(group_uuid, GP_ROLE_REMOVE_MEMBER) &&
@@ -1924,20 +1958,8 @@ void LLFloaterIMContainer::banSelectedMember(const LLUUID& participant_uuid)
LL_WARNS("Groups") << "Unable to get group data for group " << group_uuid << LL_ENDL;
return;
}
- std::vector<LLUUID> ids;
- ids.push_back(participant_uuid);
-
- LLGroupBanData ban_data;
- gdatap->createBanEntry(participant_uuid, ban_data);
- LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_POST, group_uuid, LLGroupMgr::BAN_CREATE, ids);
- LLGroupMgr::getInstance()->sendGroupMemberEjects(group_uuid, ids);
- LLGroupMgr::getInstance()->sendGroupMembersRequest(group_uuid);
- LLSD args;
- std::string name;
- gCacheName->getFullName(participant_uuid, name);
- args["AVATAR_NAME"] = name;
- args["GROUP_NAME"] = gdatap->mName;
- LLNotifications::instance().add(LLNotification::Params("EjectAvatarFromGroup").substitutions(args));
+
+ gdatap->banMemberById(participant_uuid);
}
diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h
index f21c0b9947..60cef83d9a 100755
--- a/indra/newview/llfloaterimcontainer.h
+++ b/indra/newview/llfloaterimcontainer.h
@@ -193,6 +193,8 @@ private:
bool mInitialized;
bool mIsFirstLaunch;
+ bool mIsFirstOpen;
+
LLUUID mSelectedSession;
std::string mGeneralTitle;
diff --git a/indra/newview/llfloaterjoystick.cpp b/indra/newview/llfloaterjoystick.cpp
index b7fff6cae3..ee3d633dd0 100755
--- a/indra/newview/llfloaterjoystick.cpp
+++ b/indra/newview/llfloaterjoystick.cpp
@@ -326,7 +326,21 @@ void LLFloaterJoystick::onClickOK(void *joy_panel)
}
}
+void LLFloaterJoystick::onClickCloseBtn(bool app_quitting)
+{
+ cancel();
+ closeFloater(app_quitting);
+}
+
void LLFloaterJoystick::setSNDefaults()
{
LLViewerJoystick::getInstance()->setSNDefaults();
}
+
+void LLFloaterJoystick::onClose(bool app_quitting)
+{
+ if (app_quitting)
+ {
+ cancel();
+ }
+}
diff --git a/indra/newview/llfloaterjoystick.h b/indra/newview/llfloaterjoystick.h
index 9c3752540d..a1b5951389 100755
--- a/indra/newview/llfloaterjoystick.h
+++ b/indra/newview/llfloaterjoystick.h
@@ -45,6 +45,11 @@ public:
virtual void draw();
static void setSNDefaults();
+protected:
+
+ void onClose(bool app_quitting);
+ void onClickCloseBtn(bool app_quitting);
+
private:
LLFloaterJoystick(const LLSD& data);
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 5ebd25d228..f9fd5069af 100755
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -75,9 +75,14 @@
#include "llviewercontrol.h"
#include "roles_constants.h"
#include "lltrans.h"
+#include "llpanelexperiencelisteditor.h"
+#include "llpanelexperiencepicker.h"
+#include "llexperiencecache.h"
#include "llgroupactions.h"
+const F64 COVENANT_REFRESH_TIME_SEC = 60.0f;
+
static std::string OWNER_ONLINE = "0";
static std::string OWNER_OFFLINE = "1";
static std::string OWNER_GROUP = "2";
@@ -110,6 +115,28 @@ public:
}
};
+
+class LLPanelLandExperiences
+ : public LLPanel
+{
+public:
+ LLPanelLandExperiences(LLSafeHandle<LLParcelSelection>& parcelp);
+ virtual BOOL postBuild();
+ void refresh();
+
+ void experienceAdded(const LLUUID& id, U32 xp_type, U32 access_type);
+ void experienceRemoved(const LLUUID& id, U32 access_type);
+protected:
+ LLPanelExperienceListEditor* setupList( const char* control_name, U32 xp_type, U32 access_type );
+ void refreshPanel(LLPanelExperienceListEditor* panel, U32 xp_type);
+
+ LLSafeHandle<LLParcelSelection>& mParcel;
+
+
+ LLPanelExperienceListEditor* mAllowed;
+ LLPanelExperienceListEditor* mBlocked;
+};
+
// inserts maturity info(icon and text) into target textbox
// names_floater - pointer to floater which contains strings with maturity icons filenames
// str_to_parse is string in format "txt1[MATURITY]txt2" where maturity icon and text will be inserted instead of [MATURITY]
@@ -248,6 +275,7 @@ LLFloaterLand::LLFloaterLand(const LLSD& seed)
mFactoryMap["land_audio_panel"] = LLCallbackMap(createPanelLandAudio, this);
mFactoryMap["land_media_panel"] = LLCallbackMap(createPanelLandMedia, this);
mFactoryMap["land_access_panel"] = LLCallbackMap(createPanelLandAccess, this);
+ mFactoryMap["land_experiences_panel"] = LLCallbackMap(createPanelLandExperiences, this);
sObserver = new LLParcelSelectionObserver();
LLViewerParcelMgr::getInstance()->addObserver( sObserver );
@@ -288,6 +316,7 @@ void LLFloaterLand::refresh()
mPanelMedia->refresh();
mPanelAccess->refresh();
mPanelCovenant->refresh();
+ mPanelExperiences->refresh();
}
@@ -348,6 +377,15 @@ void* LLFloaterLand::createPanelLandAccess(void* data)
return self->mPanelAccess;
}
+// static
+void* LLFloaterLand::createPanelLandExperiences(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelExperiences = new LLPanelLandExperiences(self->mParcel);
+ return self->mPanelExperiences;
+}
+
+
//---------------------------------------------------------------------------
// LLPanelLandGeneral
//---------------------------------------------------------------------------
@@ -2401,40 +2439,42 @@ void LLPanelLandAccess::refresh()
mListAccess->clearSortOrder();
mListAccess->deleteAllItems();
S32 count = parcel->mAccessList.size();
+ getChild<LLUICtrl>("AllowedText")->setTextArg("[COUNT]", llformat("%d",count));
+
getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",count));
getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",PARCEL_MAX_ACCESS_LIST));
- for (access_map_const_iterator cit = parcel->mAccessList.begin();
+ for (LLAccessEntry::map::const_iterator cit = parcel->mAccessList.begin();
cit != parcel->mAccessList.end(); ++cit)
{
const LLAccessEntry& entry = (*cit).second;
- std::string suffix;
+ std::string prefix;
if (entry.mTime != 0)
{
LLStringUtil::format_map_t args;
S32 now = time(NULL);
S32 seconds = entry.mTime - now;
if (seconds < 0) seconds = 0;
- suffix.assign(" (");
+ prefix.assign(" (");
if (seconds >= 120)
{
args["[MINUTES]"] = llformat("%d", (seconds/60));
std::string buf = parent_floater->getString ("Minutes", args);
- suffix.append(buf);
+ prefix.append(buf);
}
else if (seconds >= 60)
{
- suffix.append("1 " + parent_floater->getString("Minute"));
+ prefix.append("1 " + parent_floater->getString("Minute"));
}
else
{
args["[SECONDS]"] = llformat("%d", seconds);
std::string buf = parent_floater->getString ("Seconds", args);
- suffix.append(buf);
+ prefix.append(buf);
}
- suffix.append(" " + parent_floater->getString("Remaining") + ")");
+ prefix.append(" " + parent_floater->getString("Remaining") + ") ");
}
- mListAccess->addNameItem(entry.mID, ADD_DEFAULT, TRUE, suffix);
+ mListAccess->addNameItem(entry.mID, ADD_DEFAULT, TRUE, "", prefix);
}
mListAccess->sortByName(TRUE);
}
@@ -2446,41 +2486,42 @@ void LLPanelLandAccess::refresh()
mListBanned->clearSortOrder();
mListBanned->deleteAllItems();
S32 count = parcel->mBanList.size();
+ getChild<LLUICtrl>("BanCheck")->setTextArg("[COUNT]", llformat("%d",count));
getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",count));
getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",PARCEL_MAX_ACCESS_LIST));
- for (access_map_const_iterator cit = parcel->mBanList.begin();
+ for (LLAccessEntry::map::const_iterator cit = parcel->mBanList.begin();
cit != parcel->mBanList.end(); ++cit)
{
const LLAccessEntry& entry = (*cit).second;
- std::string suffix;
+ std::string prefix;
if (entry.mTime != 0)
{
LLStringUtil::format_map_t args;
S32 now = time(NULL);
S32 seconds = entry.mTime - now;
if (seconds < 0) seconds = 0;
- suffix.assign(" (");
+ prefix.assign(" (");
if (seconds >= 120)
{
args["[MINUTES]"] = llformat("%d", (seconds/60));
std::string buf = parent_floater->getString ("Minutes", args);
- suffix.append(buf);
+ prefix.append(buf);
}
else if (seconds >= 60)
{
- suffix.append("1 " + parent_floater->getString("Minute"));
+ prefix.append("1 " + parent_floater->getString("Minute"));
}
else
{
args["[SECONDS]"] = llformat("%d", seconds);
std::string buf = parent_floater->getString ("Seconds", args);
- suffix.append(buf);
+ prefix.append(buf);
}
- suffix.append(" " + parent_floater->getString("Remaining") + ")");
+ prefix.append(" " + parent_floater->getString("Remaining") + ") ");
}
- mListBanned->addNameItem(entry.mID, ADD_DEFAULT, TRUE, suffix);
+ mListBanned->addNameItem(entry.mID, ADD_DEFAULT, TRUE, "", prefix);
}
mListBanned->sortByName(TRUE);
}
@@ -2883,14 +2924,23 @@ void LLPanelLandAccess::onClickRemoveBanned(void* data)
//---------------------------------------------------------------------------
LLPanelLandCovenant::LLPanelLandCovenant(LLParcelSelectionHandle& parcel)
: LLPanel(),
- mParcel(parcel)
-{
+ mParcel(parcel),
+ mNextUpdateTime(0)
+{
}
LLPanelLandCovenant::~LLPanelLandCovenant()
{
}
+BOOL LLPanelLandCovenant::postBuild()
+{
+ mLastRegionID = LLUUID::null;
+ mNextUpdateTime = 0;
+
+ return TRUE;
+}
+
// virtual
void LLPanelLandCovenant::refresh()
{
@@ -2937,14 +2987,23 @@ void LLPanelLandCovenant::refresh()
changeable_clause->setText(getString("can_not_change"));
}
}
-
- // send EstateCovenantInfo message
- LLMessageSystem *msg = gMessageSystem;
- msg->newMessage("EstateCovenantRequest");
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
- msg->sendReliable(region->getHost());
+
+ if (mLastRegionID != region->getRegionID()
+ || mNextUpdateTime < LLTimer::getElapsedSeconds())
+ {
+ // Request Covenant Info
+ // Note: LLPanelLandCovenant doesn't change Covenant's content and any
+ // changes made by Estate floater should be requested by Estate floater
+ LLMessageSystem *msg = gMessageSystem;
+ msg->newMessage("EstateCovenantRequest");
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
+ msg->sendReliable(region->getHost());
+
+ mLastRegionID = region->getRegionID();
+ mNextUpdateTime = LLTimer::getElapsedSeconds() + COVENANT_REFRESH_TIME_SEC;
+ }
}
// static
@@ -3039,3 +3098,103 @@ void insert_maturity_into_textbox(LLTextBox* target_textbox, LLFloater* names_fl
target_textbox->appendText(LLViewerParcelMgr::getInstance()->getSelectionRegion()->getSimAccessString(), false);
target_textbox->appendText(text_after_rating, false);
}
+
+LLPanelLandExperiences::LLPanelLandExperiences( LLSafeHandle<LLParcelSelection>& parcelp )
+ : mParcel(parcelp)
+{
+
+}
+
+
+BOOL LLPanelLandExperiences::postBuild()
+{
+ mAllowed = setupList("panel_allowed", EXPERIENCE_KEY_TYPE_ALLOWED, AL_ALLOW_EXPERIENCE);
+ mBlocked = setupList("panel_blocked", EXPERIENCE_KEY_TYPE_BLOCKED, AL_BLOCK_EXPERIENCE);
+
+ // only non-grid-wide experiences
+ mAllowed->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithProperty, _1, LLExperienceCache::PROPERTY_GRID));
+
+ // no privileged ones
+ mBlocked->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithoutProperties, _1, LLExperienceCache::PROPERTY_PRIVILEGED|LLExperienceCache::PROPERTY_GRID));
+
+ getChild<LLLayoutPanel>("trusted_layout_panel")->setVisible(FALSE);
+ getChild<LLTextBox>("experiences_help_text")->setVisible(FALSE);
+ getChild<LLTextBox>("allowed_text_help")->setText(getString("allowed_parcel_text"));
+ getChild<LLTextBox>("blocked_text_help")->setText(getString("blocked_parcel_text"));
+
+ return LLPanel::postBuild();
+}
+
+LLPanelExperienceListEditor* LLPanelLandExperiences::setupList( const char* control_name, U32 xp_type, U32 access_type )
+{
+ LLPanelExperienceListEditor* child = findChild<LLPanelExperienceListEditor>(control_name);
+ if(child)
+ {
+ child->getChild<LLTextBox>("text_name")->setText(child->getString(control_name));
+ child->setMaxExperienceIDs(PARCEL_MAX_EXPERIENCE_LIST);
+ child->setAddedCallback(boost::bind(&LLPanelLandExperiences::experienceAdded, this, _1, xp_type, access_type));
+ child->setRemovedCallback(boost::bind(&LLPanelLandExperiences::experienceRemoved, this, _1, access_type));
+ }
+
+ return child;
+}
+
+void LLPanelLandExperiences::experienceAdded( const LLUUID& id, U32 xp_type, U32 access_type )
+{
+ LLParcel* parcel = mParcel->getParcel();
+ if (parcel)
+ {
+ parcel->setExperienceKeyType(id, xp_type);
+ LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(access_type);
+ refresh();
+ }
+}
+
+void LLPanelLandExperiences::experienceRemoved( const LLUUID& id, U32 access_type )
+{
+ LLParcel* parcel = mParcel->getParcel();
+ if (parcel)
+ {
+ parcel->setExperienceKeyType(id, EXPERIENCE_KEY_TYPE_NONE);
+ LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(access_type);
+ refresh();
+ }
+}
+
+void LLPanelLandExperiences::refreshPanel(LLPanelExperienceListEditor* panel, U32 xp_type)
+{
+ LLParcel *parcel = mParcel->getParcel();
+
+ // Display options
+ if (panel == NULL)
+ {
+ return;
+ }
+ if (parcel == NULL)
+ {
+ // disable the panel
+ panel->setEnabled(FALSE);
+ panel->setExperienceIds(LLSD::emptyArray());
+ }
+ else
+ {
+ // enable the panel
+ panel->setEnabled(TRUE);
+ LLAccessEntry::map entries = parcel->getExperienceKeysByType(xp_type);
+ LLAccessEntry::map::iterator it = entries.begin();
+ LLSD ids = LLSD::emptyArray();
+ for (/**/; it != entries.end(); ++it)
+ {
+ ids.append(it->second.mID);
+ }
+ panel->setExperienceIds(ids);
+ panel->setReadonly(!LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_OPTIONS));
+ panel->refreshExperienceCounter();
+ }
+}
+
+void LLPanelLandExperiences::refresh()
+{
+ refreshPanel(mAllowed, EXPERIENCE_KEY_TYPE_ALLOWED);
+ refreshPanel(mBlocked, EXPERIENCE_KEY_TYPE_BLOCKED);
+}
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index 1d9bd33720..0540ddb880 100755
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -66,6 +66,7 @@ class LLPanelLandBan;
class LLPanelLandRenters;
class LLPanelLandCovenant;
class LLParcel;
+class LLPanelLandExperiences;
class LLFloaterLand
: public LLFloater
@@ -101,6 +102,7 @@ protected:
static void* createPanelLandAudio(void* data);
static void* createPanelLandMedia(void* data);
static void* createPanelLandAccess(void* data);
+ static void* createPanelLandExperiences(void* data);
static void* createPanelLandBan(void* data);
@@ -116,6 +118,7 @@ protected:
LLPanelLandMedia* mPanelMedia;
LLPanelLandAccess* mPanelAccess;
LLPanelLandCovenant* mPanelCovenant;
+ LLPanelLandExperiences* mPanelExperiences;
LLSafeHandle<LLParcelSelection> mParcel;
@@ -391,6 +394,7 @@ class LLPanelLandCovenant
public:
LLPanelLandCovenant(LLSafeHandle<LLParcelSelection>& parcelp);
virtual ~LLPanelLandCovenant();
+ virtual BOOL postBuild();
void refresh();
static void updateCovenantText(const std::string& string);
static void updateEstateName(const std::string& name);
@@ -399,6 +403,10 @@ public:
protected:
LLSafeHandle<LLParcelSelection>& mParcel;
+
+private:
+ LLUUID mLastRegionID;
+ F64 mNextUpdateTime; //seconds since client start
};
#endif
diff --git a/indra/newview/llfloaterloadprefpreset.cpp b/indra/newview/llfloaterloadprefpreset.cpp
new file mode 100644
index 0000000000..403db35cc0
--- /dev/null
+++ b/indra/newview/llfloaterloadprefpreset.cpp
@@ -0,0 +1,91 @@
+/**
+ * @file llfloateloadprefpreset.cpp
+ * @brief Floater to load a graphics / camera preset
+ *
+ * $LicenseInfo:firstyear=2015&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2015, 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 "llfloaterloadprefpreset.h"
+
+#include "llbutton.h"
+#include "llcombobox.h"
+#include "llfloaterpreference.h"
+#include "llfloaterreg.h"
+#include "llpresetsmanager.h"
+#include "llviewercontrol.h"
+
+LLFloaterLoadPrefPreset::LLFloaterLoadPrefPreset(const LLSD &key)
+: LLFloater(key)
+{
+}
+
+// virtual
+BOOL LLFloaterLoadPrefPreset::postBuild()
+{ LLFloaterPreference* preferences = LLFloaterReg::getTypedInstance<LLFloaterPreference>("preferences");
+ if (preferences)
+ {
+ preferences->addDependentFloater(this);
+ }
+ getChild<LLButton>("ok")->setCommitCallback(boost::bind(&LLFloaterLoadPrefPreset::onBtnOk, this));
+ getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterLoadPrefPreset::onBtnCancel, this));
+ LLPresetsManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterLoadPrefPreset::onPresetsListChange, this));
+
+ return TRUE;
+}
+
+void LLFloaterLoadPrefPreset::onOpen(const LLSD& key)
+{
+ mSubdirectory = key.asString();
+ std::string floater_title = getString(std::string("title_") + mSubdirectory);
+
+ setTitle(floater_title);
+
+ LLComboBox* combo = getChild<LLComboBox>("preset_combo");
+
+ EDefaultOptions option = DEFAULT_TOP;
+ LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, combo, option);
+}
+
+void LLFloaterLoadPrefPreset::onPresetsListChange()
+{
+ LLComboBox* combo = getChild<LLComboBox>("preset_combo");
+
+ EDefaultOptions option = DEFAULT_TOP;
+ LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, combo, option);
+}
+
+void LLFloaterLoadPrefPreset::onBtnCancel()
+{
+ closeFloater();
+}
+
+void LLFloaterLoadPrefPreset::onBtnOk()
+{
+ LLComboBox* combo = getChild<LLComboBox>("preset_combo");
+ std::string name = combo->getSimple();
+
+ LLPresetsManager::getInstance()->loadPreset(mSubdirectory, name);
+
+ closeFloater();
+}
diff --git a/indra/newview/llfloaterloadprefpreset.h b/indra/newview/llfloaterloadprefpreset.h
new file mode 100644
index 0000000000..9471f6f1e1
--- /dev/null
+++ b/indra/newview/llfloaterloadprefpreset.h
@@ -0,0 +1,53 @@
+/**
+ * @file llfloaterloadprefpreset.h
+ * @brief Floater to load a graphics / camera preset
+
+ *
+ * $LicenseInfo:firstyear=2015&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2015, 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_LLFLOATERLOADPREFPRESET_H
+#define LL_LLFLOATERLOADPREFPRESET_H
+
+#include "llfloater.h"
+
+class LLComboBox;
+
+class LLFloaterLoadPrefPreset : public LLFloater
+{
+
+public:
+ LLFloaterLoadPrefPreset(const LLSD &key);
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ void onBtnOk();
+ void onBtnCancel();
+
+private:
+ void onPresetsListChange();
+
+ std::string mSubdirectory;
+};
+
+#endif // LL_LLFLOATERLOADPREFPRESET_H
diff --git a/indra/newview/llfloatermarketplacelistings.cpp b/indra/newview/llfloatermarketplacelistings.cpp
new file mode 100755
index 0000000000..b2d36479cd
--- /dev/null
+++ b/indra/newview/llfloatermarketplacelistings.cpp
@@ -0,0 +1,949 @@
+/**
+ * @file llfloatermarketplacelistings.cpp
+ * @brief Implementation of the marketplace listings floater and panels
+ * @author merov@lindenlab.com
+ *
+ * $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 "llfloatermarketplacelistings.h"
+
+#include "llfloaterreg.h"
+#include "llfiltereditor.h"
+#include "llfolderview.h"
+#include "llinventorybridge.h"
+#include "llinventorymodelbackgroundfetch.h"
+#include "llinventoryobserver.h"
+#include "llinventoryfunctions.h"
+#include "llmarketplacefunctions.h"
+#include "llnotificationhandler.h"
+#include "llnotificationmanager.h"
+#include "llnotificationsutil.h"
+#include "llsidepaneliteminfo.h"
+#include "lltextbox.h"
+#include "lltrans.h"
+
+///----------------------------------------------------------------------------
+/// LLPanelMarketplaceListings
+///----------------------------------------------------------------------------
+
+static LLPanelInjector<LLPanelMarketplaceListings> t_panel_status("llpanelmarketplacelistings");
+
+LLPanelMarketplaceListings::LLPanelMarketplaceListings()
+: mRootFolder(NULL)
+, mSortOrder(LLInventoryFilter::SO_FOLDERS_BY_NAME)
+, mFilterListingFoldersOnly(false)
+{
+ mCommitCallbackRegistrar.add("Marketplace.ViewSort.Action", boost::bind(&LLPanelMarketplaceListings::onViewSortMenuItemClicked, this, _2));
+ mEnableCallbackRegistrar.add("Marketplace.ViewSort.CheckItem", boost::bind(&LLPanelMarketplaceListings::onViewSortMenuItemCheck, this, _2));
+}
+
+BOOL LLPanelMarketplaceListings::postBuild()
+{
+ childSetAction("add_btn", boost::bind(&LLPanelMarketplaceListings::onAddButtonClicked, this));
+ childSetAction("audit_btn", boost::bind(&LLPanelMarketplaceListings::onAuditButtonClicked, this));
+
+ mFilterEditor = getChild<LLFilterEditor>("filter_editor");
+ mFilterEditor->setCommitCallback(boost::bind(&LLPanelMarketplaceListings::onFilterEdit, this, _2));
+
+ mAuditBtn = getChild<LLButton>("audit_btn");
+ mAuditBtn->setEnabled(FALSE);
+
+ return LLPanel::postBuild();
+}
+
+BOOL LLPanelMarketplaceListings::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ LLView * handled_view = childrenHandleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ BOOL handled = (handled_view != NULL);
+ // Special case the drop zone
+ if (handled && (handled_view->getName() == "marketplace_drop_zone"))
+ {
+ LLFolderView* root_folder = getRootFolder();
+ handled = root_folder->handleDragAndDropToThisFolder(mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ }
+ return handled;
+}
+
+void LLPanelMarketplaceListings::buildAllPanels()
+{
+ // Build the All panel first
+ LLInventoryPanel* panel_all_items;
+ panel_all_items = buildInventoryPanel("All Items", "panel_marketplace_listings_inventory.xml");
+ panel_all_items->getFilter().setEmptyLookupMessage("MarketplaceNoMatchingItems");
+ panel_all_items->getFilter().markDefault();
+
+ // Build the other panels
+ LLInventoryPanel* panel;
+ panel = buildInventoryPanel("Active Items", "panel_marketplace_listings_listed.xml");
+ panel->getFilter().setFilterMarketplaceActiveFolders();
+ panel->getFilter().setEmptyLookupMessage("MarketplaceNoMatchingItems");
+ panel->getFilter().markDefault();
+ panel = buildInventoryPanel("Inactive Items", "panel_marketplace_listings_unlisted.xml");
+ panel->getFilter().setFilterMarketplaceInactiveFolders();
+ panel->getFilter().setEmptyLookupMessage("MarketplaceNoMatchingItems");
+ panel->getFilter().markDefault();
+ panel = buildInventoryPanel("Unassociated Items", "panel_marketplace_listings_unassociated.xml");
+ panel->getFilter().setFilterMarketplaceUnassociatedFolders();
+ panel->getFilter().setEmptyLookupMessage("MarketplaceNoMatchingItems");
+ panel->getFilter().markDefault();
+
+ // Set the tab panel
+ LLTabContainer* tabs_panel = getChild<LLTabContainer>("marketplace_filter_tabs");
+ tabs_panel->setCommitCallback(boost::bind(&LLPanelMarketplaceListings::onTabChange, this));
+ tabs_panel->selectTabPanel(panel_all_items); // All panel selected by default
+ mRootFolder = panel_all_items->getRootFolder(); // Keep the root of the all panel
+
+ // Set the default sort order
+ setSortOrder(gSavedSettings.getU32("MarketplaceListingsSortOrder"));
+}
+
+LLInventoryPanel* LLPanelMarketplaceListings::buildInventoryPanel(const std::string& childname, const std::string& filename)
+{
+ LLTabContainer* tabs_panel = getChild<LLTabContainer>("marketplace_filter_tabs");
+ LLInventoryPanel* panel = LLUICtrlFactory::createFromFile<LLInventoryPanel>(filename, tabs_panel, LLInventoryPanel::child_registry_t::instance());
+ llassert(panel != NULL);
+
+ // Set sort order and callbacks
+ panel = getChild<LLInventoryPanel>(childname);
+ panel->getFolderViewModel()->setSorter(LLInventoryFilter::SO_FOLDERS_BY_NAME);
+ panel->setSelectCallback(boost::bind(&LLPanelMarketplaceListings::onSelectionChange, this, panel, _1, _2));
+
+ return panel;
+}
+
+void LLPanelMarketplaceListings::setSortOrder(U32 sort_order)
+{
+ mSortOrder = sort_order;
+ gSavedSettings.setU32("MarketplaceListingsSortOrder", sort_order);
+
+ // Set each panel with that sort order
+ LLTabContainer* tabs_panel = getChild<LLTabContainer>("marketplace_filter_tabs");
+ LLInventoryPanel* panel = (LLInventoryPanel*)tabs_panel->getPanelByName("All Items");
+ panel->setSortOrder(mSortOrder);
+ panel = (LLInventoryPanel*)tabs_panel->getPanelByName("Active Items");
+ panel->setSortOrder(mSortOrder);
+ panel = (LLInventoryPanel*)tabs_panel->getPanelByName("Inactive Items");
+ panel->setSortOrder(mSortOrder);
+ panel = (LLInventoryPanel*)tabs_panel->getPanelByName("Unassociated Items");
+ panel->setSortOrder(mSortOrder);
+}
+
+void LLPanelMarketplaceListings::onFilterEdit(const std::string& search_string)
+{
+ // Find active panel
+ LLInventoryPanel* panel = (LLInventoryPanel*)getChild<LLTabContainer>("marketplace_filter_tabs")->getCurrentPanel();
+ if (panel)
+ {
+ // Save filter string (needed when switching tabs)
+ mFilterSubString = search_string;
+ // Set filter string on active panel
+ panel->setFilterSubString(mFilterSubString);
+ }
+}
+
+void LLPanelMarketplaceListings::draw()
+{
+ if (LLMarketplaceData::instance().checkDirtyCount())
+ {
+ update_all_marketplace_count();
+ }
+
+ // Get the audit button enabled only after the whole inventory is fetched
+ if (!mAuditBtn->getEnabled())
+ {
+ mAuditBtn->setEnabled(LLInventoryModelBackgroundFetch::instance().isEverythingFetched());
+ }
+
+ LLPanel::draw();
+}
+
+void LLPanelMarketplaceListings::onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action)
+{
+ panel->onSelectionChange(items, user_action);
+}
+
+bool LLPanelMarketplaceListings::allowDropOnRoot()
+{
+ LLInventoryPanel* panel = (LLInventoryPanel*)getChild<LLTabContainer>("marketplace_filter_tabs")->getCurrentPanel();
+ return (panel ? panel->getAllowDropOnRoot() : false);
+}
+
+void LLPanelMarketplaceListings::onTabChange()
+{
+ // Find active panel
+ LLInventoryPanel* panel = (LLInventoryPanel*)getChild<LLTabContainer>("marketplace_filter_tabs")->getCurrentPanel();
+ if (panel)
+ {
+ // If the panel doesn't allow drop on root, it doesn't allow the creation of new folder on root either
+ LLButton* add_btn = getChild<LLButton>("add_btn");
+ add_btn->setEnabled(panel->getAllowDropOnRoot());
+
+ // Set filter string on active panel
+ panel->setFilterSubString(mFilterSubString);
+
+ // Show/hide the drop zone and resize the inventory tabs panel accordingly
+ LLPanel* drop_zone = (LLPanel*)getChild<LLPanel>("marketplace_drop_zone");
+ bool drop_zone_visible = drop_zone->getVisible();
+ if (drop_zone_visible != panel->getAllowDropOnRoot())
+ {
+ LLPanel* tabs = (LLPanel*)getChild<LLPanel>("tab_container_panel");
+ S32 delta_height = drop_zone->getRect().getHeight();
+ delta_height = (drop_zone_visible ? delta_height : -delta_height);
+ tabs->reshape(tabs->getRect().getWidth(),tabs->getRect().getHeight() + delta_height);
+ tabs->translate(0,-delta_height);
+ }
+ drop_zone->setVisible(panel->getAllowDropOnRoot());
+ }
+}
+
+void LLPanelMarketplaceListings::onAddButtonClicked()
+{
+ // Find active panel
+ LLInventoryPanel* panel = (LLInventoryPanel*)getChild<LLTabContainer>("marketplace_filter_tabs")->getCurrentPanel();
+ if (panel)
+ {
+ LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ llassert(marketplacelistings_id.notNull());
+ LLFolderType::EType preferred_type = LLFolderType::lookup("category");
+ LLUUID category = gInventory.createNewCategory(marketplacelistings_id, preferred_type, LLStringUtil::null);
+ gInventory.notifyObservers();
+ panel->setSelectionByID(category, TRUE);
+ panel->getRootFolder()->setNeedsAutoRename(TRUE);
+ }
+}
+
+void LLPanelMarketplaceListings::onAuditButtonClicked()
+{
+ LLSD data(LLSD::emptyMap());
+ LLFloaterReg::showInstance("marketplace_validation", data);
+}
+
+void LLPanelMarketplaceListings::onViewSortMenuItemClicked(const LLSD& userdata)
+{
+ std::string chosen_item = userdata.asString();
+
+ // Sort options
+ if ((chosen_item == "sort_by_stock_amount") || (chosen_item == "sort_by_name") || (chosen_item == "sort_by_recent"))
+ {
+ // We're making sort options exclusive, default is SO_FOLDERS_BY_NAME
+ if (chosen_item == "sort_by_stock_amount")
+ {
+ setSortOrder(LLInventoryFilter::SO_FOLDERS_BY_WEIGHT);
+ }
+ else if (chosen_item == "sort_by_name")
+ {
+ setSortOrder(LLInventoryFilter::SO_FOLDERS_BY_NAME);
+ }
+ else if (chosen_item == "sort_by_recent")
+ {
+ setSortOrder(LLInventoryFilter::SO_DATE);
+ }
+ }
+ // Filter option
+ else if (chosen_item == "show_only_listing_folders")
+ {
+ mFilterListingFoldersOnly = !mFilterListingFoldersOnly;
+ // Set each panel with that filter flag
+ LLTabContainer* tabs_panel = getChild<LLTabContainer>("marketplace_filter_tabs");
+ LLInventoryPanel* panel = (LLInventoryPanel*)tabs_panel->getPanelByName("All Items");
+ panel->getFilter().setFilterMarketplaceListingFolders(mFilterListingFoldersOnly);
+ panel = (LLInventoryPanel*)tabs_panel->getPanelByName("Active Items");
+ panel->getFilter().setFilterMarketplaceListingFolders(mFilterListingFoldersOnly);
+ panel = (LLInventoryPanel*)tabs_panel->getPanelByName("Inactive Items");
+ panel->getFilter().setFilterMarketplaceListingFolders(mFilterListingFoldersOnly);
+ panel = (LLInventoryPanel*)tabs_panel->getPanelByName("Unassociated Items");
+ panel->getFilter().setFilterMarketplaceListingFolders(mFilterListingFoldersOnly);
+ }
+}
+
+bool LLPanelMarketplaceListings::onViewSortMenuItemCheck(const LLSD& userdata)
+{
+ std::string chosen_item = userdata.asString();
+
+ if ((chosen_item == "sort_by_stock_amount") || (chosen_item == "sort_by_name") || (chosen_item == "sort_by_recent"))
+ {
+ if (chosen_item == "sort_by_stock_amount")
+ {
+ return (mSortOrder & LLInventoryFilter::SO_FOLDERS_BY_WEIGHT);
+ }
+ else if (chosen_item == "sort_by_name")
+ {
+ return (mSortOrder & LLInventoryFilter::SO_FOLDERS_BY_NAME);
+ }
+ else if (chosen_item == "sort_by_recent")
+ {
+ return (mSortOrder & LLInventoryFilter::SO_DATE);
+ }
+ }
+ else if (chosen_item == "show_only_listing_folders")
+ {
+ return mFilterListingFoldersOnly;
+ }
+ return false;
+}
+
+///----------------------------------------------------------------------------
+/// LLMarketplaceListingsAddedObserver helper class
+///----------------------------------------------------------------------------
+
+class LLMarketplaceListingsAddedObserver : public LLInventoryCategoryAddedObserver
+{
+public:
+ LLMarketplaceListingsAddedObserver(LLFloaterMarketplaceListings * marketplace_listings_floater)
+ : LLInventoryCategoryAddedObserver()
+ , mMarketplaceListingsFloater(marketplace_listings_floater)
+ {
+ }
+
+ void done()
+ {
+ for (cat_vec_t::iterator it = mAddedCategories.begin(); it != mAddedCategories.end(); ++it)
+ {
+ LLViewerInventoryCategory* added_category = *it;
+
+ LLFolderType::EType added_category_type = added_category->getPreferredType();
+
+ if (added_category_type == LLFolderType::FT_MARKETPLACE_LISTINGS)
+ {
+ mMarketplaceListingsFloater->initializeMarketPlace();
+ }
+ }
+ }
+
+private:
+ LLFloaterMarketplaceListings * mMarketplaceListingsFloater;
+};
+
+///----------------------------------------------------------------------------
+/// LLFloaterMarketplaceListings
+///----------------------------------------------------------------------------
+
+LLFloaterMarketplaceListings::LLFloaterMarketplaceListings(const LLSD& key)
+: LLFloater(key)
+, mCategoriesObserver(NULL)
+, mCategoryAddedObserver(NULL)
+, mRootFolderId(LLUUID::null)
+, mInventoryStatus(NULL)
+, mInventoryInitializationInProgress(NULL)
+, mInventoryPlaceholder(NULL)
+, mInventoryText(NULL)
+, mInventoryTitle(NULL)
+, mPanelListings(NULL)
+, mPanelListingsSet(false)
+{
+}
+
+LLFloaterMarketplaceListings::~LLFloaterMarketplaceListings()
+{
+ if (mCategoriesObserver && gInventory.containsObserver(mCategoriesObserver))
+ {
+ gInventory.removeObserver(mCategoriesObserver);
+ }
+ delete mCategoriesObserver;
+
+ if (mCategoryAddedObserver && gInventory.containsObserver(mCategoryAddedObserver))
+ {
+ gInventory.removeObserver(mCategoryAddedObserver);
+ }
+ delete mCategoryAddedObserver;
+}
+
+BOOL LLFloaterMarketplaceListings::postBuild()
+{
+ mInventoryStatus = getChild<LLTextBox>("marketplace_status");
+ mInventoryInitializationInProgress = getChild<LLView>("initialization_progress_indicator");
+ mInventoryPlaceholder = getChild<LLView>("marketplace_listings_inventory_placeholder_panel");
+ mInventoryText = mInventoryPlaceholder->getChild<LLTextBox>("marketplace_listings_inventory_placeholder_text");
+ mInventoryTitle = mInventoryPlaceholder->getChild<LLTextBox>("marketplace_listings_inventory_placeholder_title");
+
+ mPanelListings = static_cast<LLPanelMarketplaceListings*>(getChild<LLUICtrl>("panel_marketplace_listing"));
+
+ LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLFloaterMarketplaceListings::onFocusReceived, this));
+
+ // Observe category creation to catch marketplace listings creation (moot if already existing)
+ mCategoryAddedObserver = new LLMarketplaceListingsAddedObserver(this);
+ gInventory.addObserver(mCategoryAddedObserver);
+
+ // Fetch aggressively so we can interact with listings right onOpen()
+ fetchContents();
+
+ return TRUE;
+}
+
+void LLFloaterMarketplaceListings::onClose(bool app_quitting)
+{
+}
+
+void LLFloaterMarketplaceListings::onOpen(const LLSD& key)
+{
+ //
+ // Initialize the Market Place or go update the marketplace listings
+ //
+ if (LLMarketplaceData::instance().getSLMStatus() <= MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE)
+ {
+ initializeMarketPlace();
+ }
+ else
+ {
+ updateView();
+ }
+}
+
+void LLFloaterMarketplaceListings::onFocusReceived()
+{
+ updateView();
+}
+
+void LLFloaterMarketplaceListings::fetchContents()
+{
+ if (mRootFolderId.notNull() &&
+ (LLMarketplaceData::instance().getSLMDataFetched() != MarketplaceFetchCodes::MARKET_FETCH_LOADING) &&
+ (LLMarketplaceData::instance().getSLMDataFetched() != MarketplaceFetchCodes::MARKET_FETCH_DONE))
+ {
+ LLMarketplaceData::instance().setDataFetchedSignal(boost::bind(&LLFloaterMarketplaceListings::updateView, this));
+ LLMarketplaceData::instance().setSLMDataFetched(MarketplaceFetchCodes::MARKET_FETCH_LOADING);
+ LLInventoryModelBackgroundFetch::instance().start(mRootFolderId);
+ LLMarketplaceData::instance().getSLMListings();
+ }
+}
+
+void LLFloaterMarketplaceListings::setRootFolder()
+{
+ if ((LLMarketplaceData::instance().getSLMStatus() != MarketplaceStatusCodes::MARKET_PLACE_MERCHANT) &&
+ (LLMarketplaceData::instance().getSLMStatus() != MarketplaceStatusCodes::MARKET_PLACE_MIGRATED_MERCHANT))
+ {
+ // If we are *not* a merchant or we have no market place connection established yet, do nothing
+ return;
+ }
+
+ // We are a merchant. Get the Marketplace listings folder, create it if needs be.
+ LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, true);
+ if (marketplacelistings_id.isNull())
+ {
+ // We should never get there unless the inventory fails badly
+ LL_ERRS("SLM") << "Inventory problem: failure to create the marketplace listings folder for a merchant!" << LL_ENDL;
+ return;
+ }
+
+ // No longer need to observe new category creation
+ if (mCategoryAddedObserver && gInventory.containsObserver(mCategoryAddedObserver))
+ {
+ gInventory.removeObserver(mCategoryAddedObserver);
+ delete mCategoryAddedObserver;
+ mCategoryAddedObserver = NULL;
+ }
+ llassert(!mCategoryAddedObserver);
+
+ if (marketplacelistings_id == mRootFolderId)
+ {
+ LL_WARNS("SLM") << "Inventory warning: Marketplace listings folder already set" << LL_ENDL;
+ return;
+ }
+
+ mRootFolderId = marketplacelistings_id;
+}
+
+void LLFloaterMarketplaceListings::setPanels()
+{
+ if (mRootFolderId.isNull())
+ {
+ return;
+ }
+
+ // Consolidate Marketplace listings
+ // We shouldn't have to do that but with a client/server system relying on a "well known folder" convention,
+ // things get messy and conventions get broken down eventually
+ gInventory.consolidateForType(mRootFolderId, LLFolderType::FT_MARKETPLACE_LISTINGS);
+
+ // Now that we do have a non NULL root, we can build the inventory panels
+ mPanelListings->buildAllPanels();
+
+ // Create observer for marketplace listings modifications
+ if (!mCategoriesObserver)
+ {
+ mCategoriesObserver = new LLInventoryCategoriesObserver();
+ llassert(mCategoriesObserver);
+ gInventory.addObserver(mCategoriesObserver);
+ mCategoriesObserver->addCategory(mRootFolderId, boost::bind(&LLFloaterMarketplaceListings::onChanged, this));
+ }
+
+ // Get the content of the marketplace listings folder
+ fetchContents();
+
+ // Flag that this is done
+ mPanelListingsSet = true;
+}
+
+void LLFloaterMarketplaceListings::initializeMarketPlace()
+{
+ LLMarketplaceData::instance().initializeSLM(boost::bind(&LLFloaterMarketplaceListings::updateView, this));
+}
+
+S32 LLFloaterMarketplaceListings::getFolderCount()
+{
+ if (mPanelListings && mRootFolderId.notNull())
+ {
+ LLInventoryModel::cat_array_t * cats;
+ LLInventoryModel::item_array_t * items;
+ gInventory.getDirectDescendentsOf(mRootFolderId, cats, items);
+
+ return (cats->size() + items->size());
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+void LLFloaterMarketplaceListings::setStatusString(const std::string& statusString)
+{
+ mInventoryStatus->setText(statusString);
+}
+
+void LLFloaterMarketplaceListings::updateView()
+{
+ U32 mkt_status = LLMarketplaceData::instance().getSLMStatus();
+ bool is_merchant = (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_MERCHANT) || (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_MIGRATED_MERCHANT);
+ U32 data_fetched = LLMarketplaceData::instance().getSLMDataFetched();
+
+ // Get or create the root folder if we are a merchant and it hasn't been done already
+ if (mRootFolderId.isNull() && is_merchant)
+ {
+ setRootFolder();
+ }
+
+ // Update the bottom initializing status and progress dial if we are initializing or if we're a merchant and still loading
+ if ((mkt_status <= MarketplaceStatusCodes::MARKET_PLACE_INITIALIZING) || (is_merchant && (data_fetched <= MarketplaceFetchCodes::MARKET_FETCH_LOADING)) )
+ {
+ // Just show the loading indicator in that case and fetch the data (fetch will be skipped if it's already loading)
+ mInventoryInitializationInProgress->setVisible(true);
+ mPanelListings->setVisible(FALSE);
+ fetchContents();
+ return;
+ }
+ else
+ {
+ mInventoryInitializationInProgress->setVisible(false);
+ }
+
+ // Update the middle portion : tabs or messages
+ if (getFolderCount() > 0)
+ {
+ if (!mPanelListingsSet)
+ {
+ // We need to rebuild the tabs cleanly the first time we make them visible
+ setPanels();
+ }
+ mPanelListings->setVisible(TRUE);
+ mInventoryPlaceholder->setVisible(FALSE);
+ }
+ else
+ {
+ mPanelListings->setVisible(FALSE);
+ mInventoryPlaceholder->setVisible(TRUE);
+
+ std::string text;
+ std::string title;
+ std::string tooltip;
+
+ const LLSD& subs = getMarketplaceStringSubstitutions();
+
+ // Update the top message or flip to the tabs and folders view
+ // *TODO : check those messages and create better appropriate ones in strings.xml
+ if (mRootFolderId.notNull())
+ {
+ // "Marketplace listings is empty!" message strings
+ text = LLTrans::getString("InventoryMarketplaceListingsNoItems", subs);
+ title = LLTrans::getString("InventoryMarketplaceListingsNoItemsTitle");
+ tooltip = LLTrans::getString("InventoryMarketplaceListingsNoItemsTooltip");
+ }
+ else if (mkt_status <= MarketplaceStatusCodes::MARKET_PLACE_INITIALIZING)
+ {
+ // "Initializing!" message strings
+ text = LLTrans::getString("InventoryOutboxInitializing", subs);
+ title = LLTrans::getString("InventoryOutboxInitializingTitle");
+ tooltip = LLTrans::getString("InventoryOutboxInitializingTooltip");
+ }
+ else if (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_NOT_MERCHANT)
+ {
+ // "Not a merchant!" message strings
+ text = LLTrans::getString("InventoryOutboxNotMerchant", subs);
+ title = LLTrans::getString("InventoryOutboxNotMerchantTitle");
+ tooltip = LLTrans::getString("InventoryOutboxNotMerchantTooltip");
+ }
+ else
+ {
+ // "Errors!" message strings
+ text = LLTrans::getString("InventoryMarketplaceError", subs);
+ title = LLTrans::getString("InventoryOutboxErrorTitle");
+ tooltip = LLTrans::getString("InventoryOutboxErrorTooltip");
+ }
+
+ mInventoryText->setValue(text);
+ mInventoryTitle->setValue(title);
+ mInventoryPlaceholder->getParent()->setToolTip(tooltip);
+ }
+}
+
+bool LLFloaterMarketplaceListings::isAccepted(EAcceptance accept)
+{
+ return (accept >= ACCEPT_YES_COPY_SINGLE);
+}
+
+BOOL LLFloaterMarketplaceListings::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ // If there's no panel to accept drops or no existing marketplace listings folder, we refuse all drop
+ if (!mPanelListings || mRootFolderId.isNull())
+ {
+ return FALSE;
+ }
+
+ tooltip_msg = "";
+
+ // Pass to the children
+ LLView * handled_view = childrenHandleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ BOOL handled = (handled_view != NULL);
+
+ // If no one handled it or it was not accepted and we drop on an empty panel, we try to accept it at the floater level
+ // as if it was dropped on the marketplace listings root folder
+ if ((!handled || !isAccepted(*accept)) && !mPanelListings->getVisible() && mRootFolderId.notNull())
+ {
+ if (!mPanelListingsSet)
+ {
+ setPanels();
+ }
+ LLFolderView* root_folder = mPanelListings->getRootFolder();
+ handled = root_folder->handleDragAndDropToThisFolder(mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ }
+
+ return handled;
+}
+
+BOOL LLFloaterMarketplaceListings::handleHover(S32 x, S32 y, MASK mask)
+{
+ return LLFloater::handleHover(x, y, mask);
+}
+
+void LLFloaterMarketplaceListings::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ LLFloater::onMouseLeave(x, y, mask);
+}
+
+void LLFloaterMarketplaceListings::onChanged()
+{
+ LLViewerInventoryCategory* category = gInventory.getCategory(mRootFolderId);
+ if (mRootFolderId.notNull() && category)
+ {
+ updateView();
+ }
+ else
+ {
+ // Invalidate the marketplace listings data
+ mRootFolderId.setNull();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// LLFloaterAssociateListing
+//-----------------------------------------------------------------------------
+
+// Tell if a listing has one only version folder
+bool hasUniqueVersionFolder(const LLUUID& folder_id)
+{
+ LLInventoryModel::cat_array_t* categories;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(folder_id, categories, items);
+ return (categories->size() == 1);
+}
+
+LLFloaterAssociateListing::LLFloaterAssociateListing(const LLSD& key)
+: LLFloater(key)
+, mUUID()
+{
+}
+
+LLFloaterAssociateListing::~LLFloaterAssociateListing()
+{
+ gFocusMgr.releaseFocusIfNeeded( this );
+}
+
+BOOL LLFloaterAssociateListing::postBuild()
+{
+ getChild<LLButton>("OK")->setCommitCallback(boost::bind(&LLFloaterAssociateListing::apply, this, TRUE));
+ getChild<LLButton>("Cancel")->setCommitCallback(boost::bind(&LLFloaterAssociateListing::cancel, this));
+ getChild<LLLineEditor>("listing_id")->setPrevalidate(&LLTextValidate::validateNonNegativeS32);
+ center();
+
+ return LLFloater::postBuild();
+}
+
+BOOL LLFloaterAssociateListing::handleKeyHere(KEY key, MASK mask)
+{
+ if (key == KEY_RETURN && mask == MASK_NONE)
+ {
+ apply();
+ return TRUE;
+ }
+ else if (key == KEY_ESCAPE && mask == MASK_NONE)
+ {
+ cancel();
+ return TRUE;
+ }
+
+ return LLFloater::handleKeyHere(key, mask);
+}
+
+// static
+LLFloaterAssociateListing* LLFloaterAssociateListing::show(const LLUUID& folder_id)
+{
+ LLFloaterAssociateListing* floater = LLFloaterReg::showTypedInstance<LLFloaterAssociateListing>("associate_listing");
+
+ floater->mUUID = folder_id;
+
+ return floater;
+}
+
+// Callback for apply if DAMA required...
+void LLFloaterAssociateListing::callback_apply(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0) // YES
+ {
+ apply(FALSE);
+ }
+}
+
+void LLFloaterAssociateListing::apply(BOOL user_confirm)
+{
+ if (mUUID.notNull())
+ {
+ S32 id = (S32)getChild<LLUICtrl>("listing_id")->getValue().asInteger();
+ if (id > 0)
+ {
+ // Check if the id exists in the merchant SLM DB: note that this record might exist in the LLMarketplaceData
+ // structure even if unseen in the UI, for instance, if its listing_uuid doesn't exist in the merchant inventory
+ LLUUID listing_uuid = LLMarketplaceData::instance().getListingFolder(id);
+ if (listing_uuid.notNull() && user_confirm && LLMarketplaceData::instance().getActivationState(listing_uuid) && !hasUniqueVersionFolder(mUUID))
+ {
+ // Look for user confirmation before unlisting
+ LLNotificationsUtil::add("ConfirmMerchantUnlist", LLSD(), LLSD(), boost::bind(&LLFloaterAssociateListing::callback_apply, this, _1, _2));
+ return;
+ }
+ // Associate the id with the user chosen folder
+ LLMarketplaceData::instance().associateListing(mUUID,listing_uuid,id);
+ }
+ else
+ {
+ LLNotificationsUtil::add("AlertMerchantListingInvalidID");
+ }
+ }
+ closeFloater();
+}
+
+void LLFloaterAssociateListing::cancel()
+{
+ closeFloater();
+}
+
+//-----------------------------------------------------------------------------
+// LLFloaterMarketplaceValidation
+//-----------------------------------------------------------------------------
+
+// Note: The key is the UUID of the folder to validate.
+// Validates the whole marketplace listings content if UUID is null.
+
+LLFloaterMarketplaceValidation::LLFloaterMarketplaceValidation(const LLSD& key)
+: LLFloater(key),
+mEditor(NULL)
+{
+}
+
+BOOL LLFloaterMarketplaceValidation::postBuild()
+{
+ childSetAction("OK", onOK, this);
+
+ // This widget displays the validation messages
+ mEditor = getChild<LLTextEditor>("validation_text");
+ mEditor->setEnabled(FALSE);
+ mEditor->setFocus(TRUE);
+ mEditor->setValue(LLSD());
+
+ return TRUE;
+}
+
+LLFloaterMarketplaceValidation::~LLFloaterMarketplaceValidation()
+{
+}
+
+// virtual
+void LLFloaterMarketplaceValidation::draw()
+{
+ // draw children
+ LLFloater::draw();
+}
+
+void LLFloaterMarketplaceValidation::onOpen(const LLSD& key)
+{
+ // Clear the messages
+ clearMessages();
+
+ // Get the folder UUID to validate. Use the whole marketplace listing if none provided.
+ LLUUID cat_id(key.asUUID());
+ if (cat_id.isNull())
+ {
+ cat_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ }
+
+ // Validates the folder
+ if (cat_id.notNull())
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
+ validate_marketplacelistings(cat, boost::bind(&LLFloaterMarketplaceValidation::appendMessage, this, _1, _2, _3), false);
+ }
+
+ // Handle the listing folder being processed
+ handleCurrentListing();
+
+ // Dump result to the editor panel
+ if (mEditor)
+ {
+ mEditor->setValue(LLSD());
+ if (mMessages.empty())
+ {
+ // Display a no error message
+ mEditor->appendText(LLTrans::getString("Marketplace Validation No Error"), false);
+ }
+ else
+ {
+ // Print out all the messages to the panel
+ message_list_t::iterator mCurrentLine = mMessages.begin();
+ bool new_line = false;
+ while (mCurrentLine != mMessages.end())
+ {
+ // Errors are printed in bold, other messages in normal font
+ LLStyle::Params style;
+ LLFontDescriptor new_desc(mEditor->getFont()->getFontDesc());
+ new_desc.setStyle(mCurrentLine->mErrorLevel == LLError::LEVEL_ERROR ? LLFontGL::BOLD : LLFontGL::NORMAL);
+ LLFontGL* new_font = LLFontGL::getFont(new_desc);
+ style.font = new_font;
+ mEditor->appendText(mCurrentLine->mMessage, new_line, style);
+ new_line = true;
+ mCurrentLine++;
+ }
+ }
+ }
+ // We don't need the messages anymore
+ clearMessages();
+}
+
+// static
+void LLFloaterMarketplaceValidation::onOK( void* userdata )
+{
+ // destroys this object
+ LLFloaterMarketplaceValidation* self = (LLFloaterMarketplaceValidation*) userdata;
+ self->clearMessages();
+ self->closeFloater();
+}
+
+void LLFloaterMarketplaceValidation::appendMessage(std::string& message, S32 depth, LLError::ELevel log_level)
+{
+ // Dump previous listing messages if we're starting a new listing
+ if (depth == 1)
+ {
+ handleCurrentListing();
+ }
+
+ // Store the message in the current listing message list
+ Message current_message;
+ current_message.mErrorLevel = log_level;
+ current_message.mMessage = message;
+ mCurrentListingMessages.push_back(current_message);
+ mCurrentListingErrorLevel = (mCurrentListingErrorLevel < log_level ? log_level : mCurrentListingErrorLevel);
+}
+
+// Move the current listing messages to the general list if needs be and reset the current listing data
+void LLFloaterMarketplaceValidation::handleCurrentListing()
+{
+ // Dump the current folder messages to the general message list if level warrants it
+ if (mCurrentListingErrorLevel > LLError::LEVEL_INFO)
+ {
+ message_list_t::iterator mCurrentLine = mCurrentListingMessages.begin();
+ while (mCurrentLine != mCurrentListingMessages.end())
+ {
+ mMessages.push_back(*mCurrentLine);
+ mCurrentLine++;
+ }
+ }
+
+ // Reset the current listing
+ mCurrentListingMessages.clear();
+ mCurrentListingErrorLevel = LLError::LEVEL_INFO;
+}
+
+void LLFloaterMarketplaceValidation::clearMessages()
+{
+ mMessages.clear();
+ mCurrentListingMessages.clear();
+ mCurrentListingErrorLevel = LLError::LEVEL_INFO;
+}
+
+//-----------------------------------------------------------------------------
+// LLFloaterItemProperties
+//-----------------------------------------------------------------------------
+
+LLFloaterItemProperties::LLFloaterItemProperties(const LLSD& key)
+: LLFloater(key)
+{
+}
+
+LLFloaterItemProperties::~LLFloaterItemProperties()
+{
+}
+
+BOOL LLFloaterItemProperties::postBuild()
+{
+ // On the standalone properties floater, we have no need for a back button...
+ LLSidepanelItemInfo* panel = getChild<LLSidepanelItemInfo>("item_panel");
+ LLButton* back_btn = panel->getChild<LLButton>("back_btn");
+ back_btn->setVisible(FALSE);
+
+ return LLFloater::postBuild();
+}
+
+void LLFloaterItemProperties::onOpen(const LLSD& key)
+{
+ // Tell the panel which item it needs to visualize
+ LLSidepanelItemInfo* panel = getChild<LLSidepanelItemInfo>("item_panel");
+ panel->setItemID(key["id"].asUUID());
+}
+
diff --git a/indra/newview/llfloatermarketplacelistings.h b/indra/newview/llfloatermarketplacelistings.h
new file mode 100755
index 0000000000..ffc098e28a
--- /dev/null
+++ b/indra/newview/llfloatermarketplacelistings.h
@@ -0,0 +1,226 @@
+/**
+ * @file llfloatermarketplacelistings.h
+ * @brief Implementation of the marketplace listings floater and panels
+ * @author merov@lindenlab.com
+ *
+ * $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
+ * ABILITY 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_LLFLOATERMARKETPLACELISTINGS_H
+#define LL_LLFLOATERMARKETPLACELISTINGS_H
+
+#include "llfloater.h"
+#include "llinventoryfilter.h"
+#include "llinventorypanel.h"
+#include "llnotificationptr.h"
+#include "llmodaldialog.h"
+#include "lltexteditor.h"
+
+class LLInventoryCategoriesObserver;
+class LLInventoryCategoryAddedObserver;
+class LLTextBox;
+class LLView;
+class LLFilterEditor;
+
+class LLFloaterMarketplaceListings;
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLPanelMarketplaceListings
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLPanelMarketplaceListings : public LLPanel
+{
+public:
+ LLPanelMarketplaceListings();
+ BOOL postBuild();
+ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
+ void draw();
+ LLFolderView* getRootFolder() { return mRootFolder; }
+ bool allowDropOnRoot();
+
+ void buildAllPanels();
+
+private:
+ LLInventoryPanel* buildInventoryPanel(const std::string& childname, const std::string& filename);
+
+ // UI callbacks
+ void onViewSortMenuItemClicked(const LLSD& userdata);
+ bool onViewSortMenuItemCheck(const LLSD& userdata);
+ void onAddButtonClicked();
+ void onAuditButtonClicked();
+ void onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action);
+ void onTabChange();
+ void onFilterEdit(const std::string& search_string);
+
+ void setSortOrder(U32 sort_order);
+
+ LLFolderView* mRootFolder;
+ LLButton* mAuditBtn;
+ LLFilterEditor* mFilterEditor;
+ std::string mFilterSubString;
+ bool mFilterListingFoldersOnly;
+ U32 mSortOrder;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLFloaterMarketplaceListings
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLFloaterMarketplaceListings : public LLFloater
+{
+public:
+ LLFloaterMarketplaceListings(const LLSD& key);
+ ~LLFloaterMarketplaceListings();
+
+ void initializeMarketPlace();
+
+ // virtuals
+ BOOL postBuild();
+ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
+
+ void showNotification(const LLNotificationPtr& notification);
+
+ BOOL handleHover(S32 x, S32 y, MASK mask);
+ void onMouseLeave(S32 x, S32 y, MASK mask);
+
+protected:
+ void setRootFolder();
+ void setPanels();
+ void fetchContents();
+
+ void setStatusString(const std::string& statusString);
+
+ void onClose(bool app_quitting);
+ void onOpen(const LLSD& key);
+ void onFocusReceived();
+ void onChanged();
+
+ bool isAccepted(EAcceptance accept);
+
+ void updateView();
+
+private:
+ S32 getFolderCount();
+
+ LLInventoryCategoriesObserver * mCategoriesObserver;
+ LLInventoryCategoryAddedObserver * mCategoryAddedObserver;
+
+ LLTextBox * mInventoryStatus;
+ LLView * mInventoryInitializationInProgress;
+ LLView * mInventoryPlaceholder;
+ LLTextBox * mInventoryText;
+ LLTextBox * mInventoryTitle;
+
+ LLUUID mRootFolderId;
+ LLPanelMarketplaceListings * mPanelListings;
+ bool mPanelListingsSet;
+};
+
+//-----------------------------------------------------------------------------
+// LLFloaterAssociateListing
+//-----------------------------------------------------------------------------
+class LLFloaterAssociateListing : public LLFloater
+{
+ friend class LLFloaterReg;
+public:
+ virtual BOOL postBuild();
+ virtual BOOL handleKeyHere(KEY key, MASK mask);
+
+ static LLFloaterAssociateListing* show(const LLUUID& folder_id);
+
+private:
+ LLFloaterAssociateListing(const LLSD& key);
+ virtual ~LLFloaterAssociateListing();
+
+ // UI Callbacks
+ void apply(BOOL user_confirm = TRUE);
+ void cancel();
+ void callback_apply(const LLSD& notification, const LLSD& response);
+
+ LLUUID mUUID;
+};
+
+//-----------------------------------------------------------------------------
+// LLFloaterMarketplaceValidation
+//-----------------------------------------------------------------------------
+// Note: The key is the UUID of the folder to validate. Validates the whole
+// marketplace listings content if UUID is null.
+// Note: For the moment, we just display the validation text. Eventually, we should
+// get the validation triggered on the server and display the html report.
+// *TODO : morph into an html/text window using the pattern in llfloatertos
+
+class LLFloaterMarketplaceValidation : public LLFloater
+{
+public:
+ LLFloaterMarketplaceValidation(const LLSD& key);
+ virtual ~LLFloaterMarketplaceValidation();
+
+ virtual BOOL postBuild();
+ virtual void draw();
+ virtual void onOpen(const LLSD& key);
+
+ void clearMessages();
+ void appendMessage(std::string& message, S32 depth, LLError::ELevel log_level);
+ static void onOK( void* userdata );
+
+private:
+ struct Message {
+ LLError::ELevel mErrorLevel;
+ std::string mMessage;
+ };
+ typedef std::vector<Message> message_list_t;
+
+ void handleCurrentListing();
+
+ message_list_t mCurrentListingMessages;
+ LLError::ELevel mCurrentListingErrorLevel;
+
+ message_list_t mMessages;
+
+ LLTextEditor* mEditor;
+};
+
+//-----------------------------------------------------------------------------
+// LLFloaterItemProperties
+//-----------------------------------------------------------------------------
+
+class LLFloaterItemProperties : public LLFloater
+{
+public:
+ LLFloaterItemProperties(const LLSD& key);
+ virtual ~LLFloaterItemProperties();
+
+ BOOL postBuild();
+ virtual void onOpen(const LLSD& key);
+
+private:
+};
+
+#endif // LL_LLFLOATERMARKETPLACELISTINGS_H
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 72c9170b06..41005144a7 100755
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -26,35 +26,8 @@
#include "llviewerprecompiledheaders.h"
-#if LL_MSVC
-#pragma warning (disable : 4263)
-#pragma warning (disable : 4264)
-#endif
-#include "dae.h"
-//#include "dom.h"
-#include "dom/domAsset.h"
-#include "dom/domBind_material.h"
-#include "dom/domCOLLADA.h"
-#include "dom/domConstants.h"
-#include "dom/domController.h"
-#include "dom/domEffect.h"
-#include "dom/domGeometry.h"
-#include "dom/domInstance_geometry.h"
-#include "dom/domInstance_material.h"
-#include "dom/domInstance_node.h"
-#include "dom/domInstance_effect.h"
-#include "dom/domMaterial.h"
-#include "dom/domMatrix.h"
-#include "dom/domNode.h"
-#include "dom/domProfile_COMMON.h"
-#include "dom/domRotate.h"
-#include "dom/domScale.h"
-#include "dom/domTranslate.h"
-#include "dom/domVisual_scene.h"
-#if LL_MSVC
-#pragma warning (default : 4263)
-#pragma warning (default : 4264)
-#endif
+#include "llmodelloader.h"
+#include "lldaeloader.h"
#include "llfloatermodelpreview.h"
@@ -112,14 +85,15 @@
#include "llanimationstates.h"
#include "llviewernetwork.h"
#include "llviewershadermgr.h"
-#include "glod/glod.h"
-const S32 SLM_SUPPORTED_VERSION = 3;
+#include "glod/glod.h"
+#include <boost/algorithm/string.hpp>
//static
S32 LLFloaterModelPreview::sUploadAmount = 10;
LLFloaterModelPreview* LLFloaterModelPreview::sInstance = NULL;
-std::list<LLModelLoader*> LLModelLoader::sActiveLoaderList;
+
+bool LLModelPreview::sIgnoreLoadedCallback = false;
// "Retain%" decomp parameter has values from 0.0 to 1.0 by 0.01
// But according to the UI spec for upload model floater, this parameter
@@ -199,190 +173,46 @@ std::string lod_label_name[NUM_LOD+1] =
"I went off the end of the lod_label_name array. Me so smart."
};
-std::string colladaVersion[VERSIONTYPE_COUNT+1] =
-{
- "1.4.0",
- "1.4.1",
- "Unsupported"
-};
-
-
-#define LL_DEGENERACY_TOLERANCE 1e-7f
-
-inline F32 dot3fpu(const LLVector4a& a, const LLVector4a& b)
-{
- volatile F32 p0 = a[0] * b[0];
- volatile F32 p1 = a[1] * b[1];
- volatile F32 p2 = a[2] * b[2];
- return p0 + p1 + p2;
-}
-
-bool ll_is_degenerate(const LLVector4a& a, const LLVector4a& b, const LLVector4a& c, F32 tolerance = LL_DEGENERACY_TOLERANCE)
-{
- // small area check
- {
- LLVector4a edge1; edge1.setSub( a, b );
- LLVector4a edge2; edge2.setSub( a, c );
- //////////////////////////////////////////////////////////////////////////
- /// Linden Modified
- //////////////////////////////////////////////////////////////////////////
-
- // If no one edge is more than 10x longer than any other edge, we weaken
- // the tolerance by a factor of 1e-4f.
-
- LLVector4a edge3; edge3.setSub( c, b );
- const F32 len1sq = edge1.dot3(edge1).getF32();
- const F32 len2sq = edge2.dot3(edge2).getF32();
- const F32 len3sq = edge3.dot3(edge3).getF32();
- bool abOK = (len1sq <= 100.f * len2sq) && (len1sq <= 100.f * len3sq);
- bool acOK = (len2sq <= 100.f * len1sq) && (len1sq <= 100.f * len3sq);
- bool cbOK = (len3sq <= 100.f * len1sq) && (len1sq <= 100.f * len2sq);
- if ( abOK && acOK && cbOK )
- {
- tolerance *= 1e-4f;
- }
-
- //////////////////////////////////////////////////////////////////////////
- /// End Modified
- //////////////////////////////////////////////////////////////////////////
-
- LLVector4a cross; cross.setCross3( edge1, edge2 );
-
- LLVector4a edge1b; edge1b.setSub( b, a );
- LLVector4a edge2b; edge2b.setSub( b, c );
- LLVector4a crossb; crossb.setCross3( edge1b, edge2b );
-
- if ( ( cross.dot3(cross).getF32() < tolerance ) || ( crossb.dot3(crossb).getF32() < tolerance ))
- {
- return true;
- }
- }
-
- // point triangle distance check
- {
- LLVector4a Q; Q.setSub(a, b);
- LLVector4a R; R.setSub(c, b);
-
- const F32 QQ = dot3fpu(Q, Q);
- const F32 RR = dot3fpu(R, R);
- const F32 QR = dot3fpu(R, Q);
-
- volatile F32 QQRR = QQ * RR;
- volatile F32 QRQR = QR * QR;
- F32 Det = (QQRR - QRQR);
-
- if( Det == 0.0f )
- {
- return true;
- }
- }
-
- return false;
-}
-
-bool validate_face(const LLVolumeFace& face)
+BOOL stop_gloderror()
{
+ GLuint error = glodGetError();
- for (U32 v = 0; v < face.mNumVertices; v++)
- {
- if(face.mPositions && !face.mPositions[v].isFinite3())
- {
- LL_WARNS() << "NaN position data in face found!" << LL_ENDL;
- return false;
- }
-
- if(face.mNormals && !face.mNormals[v].isFinite3())
- {
- LL_WARNS() << "NaN normal data in face found!" << LL_ENDL;
- return false;
- }
- }
-
- for (U32 i = 0; i < face.mNumIndices; ++i)
- {
- if (face.mIndices[i] >= face.mNumVertices)
- {
- LL_WARNS() << "Face has invalid index." << LL_ENDL;
- return false;
- }
- }
-
- if (face.mNumIndices % 3 != 0 || face.mNumIndices == 0)
+ if (error != GLOD_NO_ERROR)
{
- LL_WARNS() << "Face has invalid number of indices." << LL_ENDL;
- return false;
+ LL_WARNS() << "GLOD error detected, cannot generate LOD: " << std::hex << error << LL_ENDL;
+ return TRUE;
}
-
- /*const LLVector4a scale(0.5f);
-
-
- for (U32 i = 0; i < face.mNumIndices; i+=3)
- {
- U16 idx1 = face.mIndices[i];
- U16 idx2 = face.mIndices[i+1];
- U16 idx3 = face.mIndices[i+2];
-
- LLVector4a v1; v1.setMul(face.mPositions[idx1], scale);
- LLVector4a v2; v2.setMul(face.mPositions[idx2], scale);
- LLVector4a v3; v3.setMul(face.mPositions[idx3], scale);
-
- if (ll_is_degenerate(v1,v2,v3))
- {
- LL_WARNS() << "Degenerate face found!" << LL_ENDL;
- return false;
- }
- }*/
- return true;
+ return FALSE;
}
-bool validate_model(const LLModel* mdl)
+LLViewerFetchedTexture* bindMaterialDiffuseTexture(const LLImportMaterial& material)
{
- if (mdl->getNumVolumeFaces() == 0)
- {
- LL_WARNS() << "Model has no faces!" << LL_ENDL;
- return false;
- }
+ LLViewerFetchedTexture *texture = LLViewerTextureManager::getFetchedTexture(material.getDiffuseMap(), FTT_DEFAULT, TRUE, LLGLTexture::BOOST_PREVIEW);
- for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
+ if (texture)
{
- if (mdl->getVolumeFace(i).mNumVertices == 0)
- {
- LL_WARNS() << "Face has no vertices." << LL_ENDL;
- return false;
- }
-
- if (mdl->getVolumeFace(i).mNumIndices == 0)
+ if (texture->getDiscardLevel() > -1)
{
- LL_WARNS() << "Face has no indices." << LL_ENDL;
- return false;
- }
-
- if (!validate_face(mdl->getVolumeFace(i)))
- {
- return false;
+ gGL.getTexUnit(0)->bind(texture, true);
+ return texture;
}
}
- return true;
+ return NULL;
}
-BOOL stop_gloderror()
+std::string stripSuffix(std::string name)
{
- GLuint error = glodGetError();
-
- if (error != GLOD_NO_ERROR)
+ if ((name.find("_LOD") != -1) || (name.find("_PHYS") != -1))
{
- LL_WARNS() << "GLOD error detected, cannot generate LOD: " << std::hex << error << LL_ENDL;
- return TRUE;
+ return name.substr(0, name.rfind('_'));
}
-
- return FALSE;
+ return name;
}
-
LLMeshFilePicker::LLMeshFilePicker(LLModelPreview* mp, S32 lod)
- : LLFilePickerThread(LLFilePicker::FFLOAD_COLLADA)
+: LLFilePickerThread(LLFilePicker::FFLOAD_COLLADA)
{
mMP = mp;
mLOD = lod;
@@ -393,6 +223,29 @@ void LLMeshFilePicker::notify(const std::string& filename)
mMP->loadModel(mFile, mLOD);
}
+void FindModel(LLModelLoader::scene& scene, const std::string& name_to_match, LLModel*& baseModelOut, LLMatrix4& matOut)
+{
+ LLModelLoader::scene::iterator base_iter = scene.begin();
+ bool found = false;
+ while (!found && (base_iter != scene.end()))
+ {
+ matOut = base_iter->first;
+
+ LLModelLoader::model_instance_list::iterator base_instance_iter = base_iter->second.begin();
+ while (!found && (base_instance_iter != base_iter->second.end()))
+ {
+ LLModelInstance& base_instance = *base_instance_iter++;
+ LLModel* base_model = base_instance.mModel;
+
+ if (base_model && (base_model->mLabel == name_to_match))
+ {
+ baseModelOut = base_model;
+ return;
+ }
+ }
+ base_iter++;
+ }
+}
//-----------------------------------------------------------------------------
// LLFloaterModelPreview()
@@ -613,6 +466,11 @@ void LLFloaterModelPreview::disableViewOption(const std::string& option)
void LLFloaterModelPreview::loadModel(S32 lod)
{
mModelPreview->mLoading = true;
+ if (lod == LLModel::LOD_PHYSICS)
+ {
+ // loading physics from file
+ mModelPreview->mPhysicsSearchLOD = lod;
+ }
(new LLMeshFilePicker(mModelPreview, lod))->getFile();
}
@@ -791,9 +649,9 @@ void LLFloaterModelPreview::draw()
childSetTextArg("status", "[STATUS]", getString("status_material_mismatch"));
}
else
- if ( mModelPreview->getLoadState() > LLModelLoader::ERROR_PARSING )
- {
- childSetTextArg("status", "[STATUS]", getString(LLModel::getStatusString(mModelPreview->getLoadState() - LLModelLoader::ERROR_PARSING)));
+ if ( mModelPreview->getLoadState() > LLModelLoader::ERROR_MODEL )
+ {
+ childSetTextArg("status", "[STATUS]", getString(LLModel::getStatusString(mModelPreview->getLoadState() - LLModelLoader::ERROR_MODEL)));
}
else
if ( mModelPreview->getLoadState() == LLModelLoader::ERROR_PARSING )
@@ -945,9 +803,16 @@ BOOL LLFloaterModelPreview::handleScrollWheel(S32 x, S32 y, S32 clicks)
/*virtual*/
void LLFloaterModelPreview::onOpen(const LLSD& key)
{
+ LLModelPreview::sIgnoreLoadedCallback = false;
requestAgentUploadPermissions();
}
+/*virtual*/
+void LLFloaterModelPreview::onClose(bool app_quitting)
+{
+ LLModelPreview::sIgnoreLoadedCallback = true;
+}
+
//static
void LLFloaterModelPreview::onPhysicsParamCommit(LLUICtrl* ctrl, void* data)
{
@@ -1308,1815 +1173,6 @@ void LLFloaterModelPreview::onMouseCaptureLostModelPreview(LLMouseHandler* handl
}
//-----------------------------------------------------------------------------
-// LLModelLoader
-//-----------------------------------------------------------------------------
-LLModelLoader::LLModelLoader( std::string filename, S32 lod, LLModelPreview* preview, JointTransformMap& jointMap,
- std::deque<std::string>& jointsFromNodes )
-: mJointList( jointMap )
-, mJointsFromNode( jointsFromNodes )
-, LLThread("Model Loader"), mFilename(filename), mLod(lod), mPreview(preview), mFirstTransform(TRUE), mNumOfFetchingTextures(0)
-{
- mJointMap["mPelvis"] = "mPelvis";
- mJointMap["mTorso"] = "mTorso";
- mJointMap["mChest"] = "mChest";
- mJointMap["mNeck"] = "mNeck";
- mJointMap["mHead"] = "mHead";
- mJointMap["mSkull"] = "mSkull";
- mJointMap["mEyeRight"] = "mEyeRight";
- mJointMap["mEyeLeft"] = "mEyeLeft";
- mJointMap["mCollarLeft"] = "mCollarLeft";
- mJointMap["mShoulderLeft"] = "mShoulderLeft";
- mJointMap["mElbowLeft"] = "mElbowLeft";
- mJointMap["mWristLeft"] = "mWristLeft";
- mJointMap["mCollarRight"] = "mCollarRight";
- mJointMap["mShoulderRight"] = "mShoulderRight";
- mJointMap["mElbowRight"] = "mElbowRight";
- mJointMap["mWristRight"] = "mWristRight";
- mJointMap["mHipRight"] = "mHipRight";
- mJointMap["mKneeRight"] = "mKneeRight";
- mJointMap["mAnkleRight"] = "mAnkleRight";
- mJointMap["mFootRight"] = "mFootRight";
- mJointMap["mToeRight"] = "mToeRight";
- mJointMap["mHipLeft"] = "mHipLeft";
- mJointMap["mKneeLeft"] = "mKneeLeft";
- mJointMap["mAnkleLeft"] = "mAnkleLeft";
- mJointMap["mFootLeft"] = "mFootLeft";
- mJointMap["mToeLeft"] = "mToeLeft";
-
- mJointMap["avatar_mPelvis"] = "mPelvis";
- mJointMap["avatar_mTorso"] = "mTorso";
- mJointMap["avatar_mChest"] = "mChest";
- mJointMap["avatar_mNeck"] = "mNeck";
- mJointMap["avatar_mHead"] = "mHead";
- mJointMap["avatar_mSkull"] = "mSkull";
- mJointMap["avatar_mEyeRight"] = "mEyeRight";
- mJointMap["avatar_mEyeLeft"] = "mEyeLeft";
- mJointMap["avatar_mCollarLeft"] = "mCollarLeft";
- mJointMap["avatar_mShoulderLeft"] = "mShoulderLeft";
- mJointMap["avatar_mElbowLeft"] = "mElbowLeft";
- mJointMap["avatar_mWristLeft"] = "mWristLeft";
- mJointMap["avatar_mCollarRight"] = "mCollarRight";
- mJointMap["avatar_mShoulderRight"] = "mShoulderRight";
- mJointMap["avatar_mElbowRight"] = "mElbowRight";
- mJointMap["avatar_mWristRight"] = "mWristRight";
- mJointMap["avatar_mHipRight"] = "mHipRight";
- mJointMap["avatar_mKneeRight"] = "mKneeRight";
- mJointMap["avatar_mAnkleRight"] = "mAnkleRight";
- mJointMap["avatar_mFootRight"] = "mFootRight";
- mJointMap["avatar_mToeRight"] = "mToeRight";
- mJointMap["avatar_mHipLeft"] = "mHipLeft";
- mJointMap["avatar_mKneeLeft"] = "mKneeLeft";
- mJointMap["avatar_mAnkleLeft"] = "mAnkleLeft";
- mJointMap["avatar_mFootLeft"] = "mFootLeft";
- mJointMap["avatar_mToeLeft"] = "mToeLeft";
-
-
- mJointMap["hip"] = "mPelvis";
- mJointMap["abdomen"] = "mTorso";
- mJointMap["chest"] = "mChest";
- mJointMap["neck"] = "mNeck";
- mJointMap["head"] = "mHead";
- mJointMap["figureHair"] = "mSkull";
- mJointMap["lCollar"] = "mCollarLeft";
- mJointMap["lShldr"] = "mShoulderLeft";
- mJointMap["lForeArm"] = "mElbowLeft";
- mJointMap["lHand"] = "mWristLeft";
- mJointMap["rCollar"] = "mCollarRight";
- mJointMap["rShldr"] = "mShoulderRight";
- mJointMap["rForeArm"] = "mElbowRight";
- mJointMap["rHand"] = "mWristRight";
- mJointMap["rThigh"] = "mHipRight";
- mJointMap["rShin"] = "mKneeRight";
- mJointMap["rFoot"] = "mFootRight";
- mJointMap["lThigh"] = "mHipLeft";
- mJointMap["lShin"] = "mKneeLeft";
- mJointMap["lFoot"] = "mFootLeft";
-
- if (mPreview)
- {
- //only try to load from slm if viewer is configured to do so and this is the
- //initial model load (not an LoD or physics shape)
- mTrySLM = gSavedSettings.getBOOL("MeshImportUseSLM") && mPreview->mUploadData.empty();
- mPreview->setLoadState(STARTING);
- }
- else
- {
- mTrySLM = false;
- }
-
- assert_main_thread();
- sActiveLoaderList.push_back(this) ;
-}
-
-LLModelLoader::~LLModelLoader()
-{
- assert_main_thread();
- sActiveLoaderList.remove(this);
-}
-
-void stretch_extents(LLModel* model, LLMatrix4a& mat, LLVector4a& min, LLVector4a& max, BOOL& first_transform)
-{
- LLVector4a box[] =
- {
- LLVector4a(-1, 1,-1),
- LLVector4a(-1, 1, 1),
- LLVector4a(-1,-1,-1),
- LLVector4a(-1,-1, 1),
- LLVector4a( 1, 1,-1),
- LLVector4a( 1, 1, 1),
- LLVector4a( 1,-1,-1),
- LLVector4a( 1,-1, 1),
- };
-
- for (S32 j = 0; j < model->getNumVolumeFaces(); ++j)
- {
- const LLVolumeFace& face = model->getVolumeFace(j);
-
- LLVector4a center;
- center.setAdd(face.mExtents[0], face.mExtents[1]);
- center.mul(0.5f);
- LLVector4a size;
- size.setSub(face.mExtents[1],face.mExtents[0]);
- size.mul(0.5f);
-
- for (U32 i = 0; i < 8; i++)
- {
- LLVector4a t;
- t.setMul(size, box[i]);
- t.add(center);
-
- LLVector4a v;
-
- mat.affineTransform(t, v);
-
- if (first_transform)
- {
- first_transform = FALSE;
- min = max = v;
- }
- else
- {
- update_min_max(min, max, v);
- }
- }
- }
-}
-
-void stretch_extents(LLModel* model, LLMatrix4& mat, LLVector3& min, LLVector3& max, BOOL& first_transform)
-{
- LLVector4a mina, maxa;
- LLMatrix4a mata;
-
- mata.loadu(mat);
- mina.load3(min.mV);
- maxa.load3(max.mV);
-
- stretch_extents(model, mata, mina, maxa, first_transform);
-
- min.set(mina.getF32ptr());
- max.set(maxa.getF32ptr());
-}
-
-void LLModelLoader::run()
-{
- doLoadModel();
- doOnIdleOneTime(boost::bind(&LLModelLoader::loadModelCallback,this));
-}
-
-bool LLModelLoader::doLoadModel()
-{
- //first, look for a .slm file of the same name that was modified later
- //than the .dae
-
- if (mTrySLM)
- {
- std::string filename = mFilename;
-
- std::string::size_type i = filename.rfind(".");
- if (i != std::string::npos)
- {
- filename.replace(i, filename.size()-1, ".slm");
- llstat slm_status;
- if (LLFile::stat(filename, &slm_status) == 0)
- { //slm file exists
- llstat dae_status;
- if (LLFile::stat(mFilename, &dae_status) != 0 ||
- dae_status.st_mtime < slm_status.st_mtime)
- {
- if (loadFromSLM(filename))
- { //slm successfully loaded, if this fails, fall through and
- //try loading from dae
-
- mLod = -1; //successfully loading from an slm implicitly sets all
- //LoDs
- return true;
- }
- }
- }
- }
- }
-
- //no suitable slm exists, load from the .dae file
- DAE dae;
- domCOLLADA* dom = dae.open(mFilename);
-
- if (!dom)
- {
- LL_INFOS()<<" Error with dae - traditionally indicates a corrupt file."<<LL_ENDL;
- setLoadState( ERROR_PARSING );
- return false;
- }
- //Dom version
- daeString domVersion = dae.getDomVersion();
- std::string sldom(domVersion);
- LL_INFOS()<<"Collada Importer Version: "<<sldom<<LL_ENDL;
- //Dae version
- domVersionType docVersion = dom->getVersion();
- //0=1.4
- //1=1.4.1
- //2=Currently unsupported, however may work
- if (docVersion > 1 )
- {
- docVersion = VERSIONTYPE_COUNT;
- }
- LL_INFOS()<<"Dae version "<<colladaVersion[docVersion]<<LL_ENDL;
-
-
- daeDatabase* db = dae.getDatabase();
-
- daeInt count = db->getElementCount(NULL, COLLADA_TYPE_MESH);
-
- daeDocument* doc = dae.getDoc(mFilename);
- if (!doc)
- {
- LL_WARNS() << "can't find internal doc" << LL_ENDL;
- return false;
- }
-
- daeElement* root = doc->getDomRoot();
- if (!root)
- {
- LL_WARNS() << "document has no root" << LL_ENDL;
- return false;
- }
-
- //Verify some basic properties of the dae
- //1. Basic validity check on controller
- U32 controllerCount = (int) db->getElementCount( NULL, "controller" );
- bool result = false;
- for ( int i=0; i<controllerCount; ++i )
- {
- domController* pController = NULL;
- db->getElement( (daeElement**) &pController, i , NULL, "controller" );
- result = mPreview->verifyController( pController );
- if (!result)
- {
- setLoadState( ERROR_PARSING );
- return true;
- }
- }
-
-
- //get unit scale
- mTransform.setIdentity();
-
- domAsset::domUnit* unit = daeSafeCast<domAsset::domUnit>(root->getDescendant(daeElement::matchType(domAsset::domUnit::ID())));
-
- if (unit)
- {
- F32 meter = unit->getMeter();
- mTransform.mMatrix[0][0] = meter;
- mTransform.mMatrix[1][1] = meter;
- mTransform.mMatrix[2][2] = meter;
- }
-
- //get up axis rotation
- LLMatrix4 rotation;
-
- domUpAxisType up = UPAXISTYPE_Y_UP; // default is Y_UP
- domAsset::domUp_axis* up_axis =
- daeSafeCast<domAsset::domUp_axis>(root->getDescendant(daeElement::matchType(domAsset::domUp_axis::ID())));
-
- if (up_axis)
- {
- up = up_axis->getValue();
- }
-
- if (up == UPAXISTYPE_X_UP)
- {
- rotation.initRotation(0.0f, 90.0f * DEG_TO_RAD, 0.0f);
- }
- else if (up == UPAXISTYPE_Y_UP)
- {
- rotation.initRotation(90.0f * DEG_TO_RAD, 0.0f, 0.0f);
- }
-
- rotation *= mTransform;
- mTransform = rotation;
-
-
- for (daeInt idx = 0; idx < count; ++idx)
- { //build map of domEntities to LLModel
- domMesh* mesh = NULL;
- db->getElement((daeElement**) &mesh, idx, NULL, COLLADA_TYPE_MESH);
-
- if (mesh)
- {
- LLPointer<LLModel> model = LLModel::loadModelFromDomMesh(mesh);
-
- if(model->getStatus() != LLModel::NO_ERRORS)
- {
- setLoadState(ERROR_PARSING + model->getStatus()) ;
- return false; //abort
- }
-
- if (model.notNull() && validate_model(model))
- {
- mModelList.push_back(model);
- mModel[mesh] = model;
- }
- }
- }
-
- count = db->getElementCount(NULL, COLLADA_TYPE_SKIN);
- for (daeInt idx = 0; idx < count; ++idx)
- { //add skinned meshes as instances
- domSkin* skin = NULL;
- db->getElement((daeElement**) &skin, idx, NULL, COLLADA_TYPE_SKIN);
-
- if (skin)
- {
- domGeometry* geom = daeSafeCast<domGeometry>(skin->getSource().getElement());
-
- if (geom)
- {
- domMesh* mesh = geom->getMesh();
- if (mesh)
- {
- LLModel* model = mModel[mesh];
- if (model)
- {
- LLVector3 mesh_scale_vector;
- LLVector3 mesh_translation_vector;
- model->getNormalizedScaleTranslation(mesh_scale_vector, mesh_translation_vector);
-
- LLMatrix4 normalized_transformation;
- normalized_transformation.setTranslation(mesh_translation_vector);
-
- LLMatrix4 mesh_scale;
- mesh_scale.initScale(mesh_scale_vector);
- mesh_scale *= normalized_transformation;
- normalized_transformation = mesh_scale;
-
- glh::matrix4f inv_mat((F32*) normalized_transformation.mMatrix);
- inv_mat = inv_mat.inverse();
- LLMatrix4 inverse_normalized_transformation(inv_mat.m);
-
- domSkin::domBind_shape_matrix* bind_mat = skin->getBind_shape_matrix();
-
- if (bind_mat)
- { //get bind shape matrix
- domFloat4x4& dom_value = bind_mat->getValue();
-
- LLMeshSkinInfo& skin_info = model->mSkinInfo;
-
- for (int i = 0; i < 4; i++)
- {
- for(int j = 0; j < 4; j++)
- {
- skin_info.mBindShapeMatrix.mMatrix[i][j] = dom_value[i + j*4];
- }
- }
-
- LLMatrix4 trans = normalized_transformation;
- trans *= skin_info.mBindShapeMatrix;
- skin_info.mBindShapeMatrix = trans;
- }
-
-
- //Some collada setup for accessing the skeleton
- daeElement* pElement = 0;
- dae.getDatabase()->getElement( &pElement, 0, 0, "skeleton" );
-
- //Try to get at the skeletal instance controller
- domInstance_controller::domSkeleton* pSkeleton = daeSafeCast<domInstance_controller::domSkeleton>( pElement );
- bool missingSkeletonOrScene = false;
-
- //If no skeleton, do a breadth-first search to get at specific joints
- bool rootNode = false;
-
- //Need to test for a skeleton that does not have a root node
- //This occurs when your instance controller does not have an associated scene
- if ( pSkeleton )
- {
- daeElement* pSkeletonRootNode = pSkeleton->getValue().getElement();
- if ( pSkeletonRootNode )
- {
- rootNode = true;
- }
-
- }
- if ( !pSkeleton || !rootNode )
- {
- daeElement* pScene = root->getDescendant("visual_scene");
- if ( !pScene )
- {
- LL_WARNS()<<"No visual scene - unable to parse bone offsets "<<LL_ENDL;
- missingSkeletonOrScene = true;
- }
- else
- {
- //Get the children at this level
- daeTArray< daeSmartRef<daeElement> > children = pScene->getChildren();
- S32 childCount = children.getCount();
-
- //Process any children that are joints
- //Not all children are joints, some code be ambient lights, cameras, geometry etc..
- for (S32 i = 0; i < childCount; ++i)
- {
- domNode* pNode = daeSafeCast<domNode>(children[i]);
- if ( isNodeAJoint( pNode ) )
- {
- processJointNode( pNode, mJointList );
- }
- }
- }
- }
- else
- //Has Skeleton
- {
- //Get the root node of the skeleton
- daeElement* pSkeletonRootNode = pSkeleton->getValue().getElement();
- if ( pSkeletonRootNode )
- {
- //Once we have the root node - start acccessing it's joint components
- const int jointCnt = mJointMap.size();
- std::map<std::string, std::string> :: const_iterator jointIt = mJointMap.begin();
-
- //Loop over all the possible joints within the .dae - using the allowed joint list in the ctor.
- for ( int i=0; i<jointCnt; ++i, ++jointIt )
- {
- //Build a joint for the resolver to work with
- char str[64]={0};
- sprintf(str,"./%s",(*jointIt).first.c_str() );
- //LL_WARNS()<<"Joint "<< str <<LL_ENDL;
-
- //Setup the resolver
- daeSIDResolver resolver( pSkeletonRootNode, str );
-
- //Look for the joint
- domNode* pJoint = daeSafeCast<domNode>( resolver.getElement() );
- if ( pJoint )
- {
- //Pull out the translate id and store it in the jointTranslations map
- daeSIDResolver jointResolverA( pJoint, "./translate" );
- domTranslate* pTranslateA = daeSafeCast<domTranslate>( jointResolverA.getElement() );
- daeSIDResolver jointResolverB( pJoint, "./location" );
- domTranslate* pTranslateB = daeSafeCast<domTranslate>( jointResolverB.getElement() );
-
- LLMatrix4 workingTransform;
-
- //Translation via SID
- if ( pTranslateA )
- {
- extractTranslation( pTranslateA, workingTransform );
- }
- else
- if ( pTranslateB )
- {
- extractTranslation( pTranslateB, workingTransform );
- }
- else
- {
- //Translation via child from element
- daeElement* pTranslateElement = getChildFromElement( pJoint, "translate" );
- if ( pTranslateElement && pTranslateElement->typeID() != domTranslate::ID() )
- {
- LL_WARNS()<< "The found element is not a translate node" <<LL_ENDL;
- missingSkeletonOrScene = true;
- }
- else
- if ( pTranslateElement )
- {
- extractTranslationViaElement( pTranslateElement, workingTransform );
- }
- else
- {
- extractTranslationViaSID( pJoint, workingTransform );
- }
-
- }
-
- //Store the joint transform w/respect to it's name.
- mJointList[(*jointIt).second.c_str()] = workingTransform;
- }
- }
-
- //If anything failed in regards to extracting the skeleton, joints or translation id,
- //mention it
- if ( missingSkeletonOrScene )
- {
- LL_WARNS()<< "Partial jointmap found in asset - did you mean to just have a partial map?" << LL_ENDL;
- }
- }//got skeleton?
- }
-
-
- domSkin::domJoints* joints = skin->getJoints();
-
- domInputLocal_Array& joint_input = joints->getInput_array();
-
- for (size_t i = 0; i < joint_input.getCount(); ++i)
- {
- domInputLocal* input = joint_input.get(i);
- xsNMTOKEN semantic = input->getSemantic();
-
- if (strcmp(semantic, COMMON_PROFILE_INPUT_JOINT) == 0)
- { //found joint source, fill model->mJointMap and model->mSkinInfo.mJointNames
- daeElement* elem = input->getSource().getElement();
-
- domSource* source = daeSafeCast<domSource>(elem);
- if (source)
- {
-
-
- domName_array* names_source = source->getName_array();
-
- if (names_source)
- {
- domListOfNames &names = names_source->getValue();
-
- for (size_t j = 0; j < names.getCount(); ++j)
- {
- std::string name(names.get(j));
- if (mJointMap.find(name) != mJointMap.end())
- {
- name = mJointMap[name];
- }
- model->mSkinInfo.mJointNames.push_back(name);
- model->mSkinInfo.mJointMap[name] = j;
- }
- }
- else
- {
- domIDREF_array* names_source = source->getIDREF_array();
- if (names_source)
- {
- xsIDREFS& names = names_source->getValue();
-
- for (size_t j = 0; j < names.getCount(); ++j)
- {
- std::string name(names.get(j).getID());
- if (mJointMap.find(name) != mJointMap.end())
- {
- name = mJointMap[name];
- }
- model->mSkinInfo.mJointNames.push_back(name);
- model->mSkinInfo.mJointMap[name] = j;
- }
- }
- }
- }
- }
- else if (strcmp(semantic, COMMON_PROFILE_INPUT_INV_BIND_MATRIX) == 0)
- { //found inv_bind_matrix array, fill model->mInvBindMatrix
- domSource* source = daeSafeCast<domSource>(input->getSource().getElement());
- if (source)
- {
- domFloat_array* t = source->getFloat_array();
- if (t)
- {
- domListOfFloats& transform = t->getValue();
- S32 count = transform.getCount()/16;
-
- for (S32 k = 0; k < count; ++k)
- {
- LLMatrix4 mat;
-
- for (int i = 0; i < 4; i++)
- {
- for(int j = 0; j < 4; j++)
- {
- mat.mMatrix[i][j] = transform[k*16 + i + j*4];
- }
- }
-
- model->mSkinInfo.mInvBindMatrix.push_back(mat);
- }
- }
- }
- }
- }
-
- //Now that we've parsed the joint array, let's determine if we have a full rig
- //(which means we have all the joint sthat are required for an avatar versus
- //a skinned asset attached to a node in a file that contains an entire skeleton,
- //but does not use the skeleton).
- buildJointToNodeMappingFromScene( root );
- mPreview->critiqueRigForUploadApplicability( model->mSkinInfo.mJointNames );
-
- if ( !missingSkeletonOrScene )
- {
- //Set the joint translations on the avatar - if it's a full mapping
- //The joints are reset in the dtor
- if ( mPreview->getRigWithSceneParity() )
- {
- std::map<std::string, std::string> :: const_iterator masterJointIt = mJointMap.begin();
- std::map<std::string, std::string> :: const_iterator masterJointItEnd = mJointMap.end();
- for (;masterJointIt!=masterJointItEnd;++masterJointIt )
- {
- std::string lookingForJoint = (*masterJointIt).first.c_str();
-
- if ( mJointList.find( lookingForJoint ) != mJointList.end() )
- {
- //LL_INFOS()<<"joint "<<lookingForJoint.c_str()<<LL_ENDL;
- LLMatrix4 jointTransform = mJointList[lookingForJoint];
- LLJoint* pJoint = mPreview->getPreviewAvatar()->getJoint( lookingForJoint );
- if ( pJoint )
- {
- LLUUID fake_mesh_id;
- fake_mesh_id.generate();
- pJoint->addAttachmentPosOverride( jointTransform.getTranslation(), fake_mesh_id, gAgentAvatarp->avString());
- }
- else
- {
- //Most likely an error in the asset.
- LL_WARNS()<<"Tried to apply joint position from .dae, but it did not exist in the avatar rig." << LL_ENDL;
- }
- }
- }
- }
- } //missingSkeletonOrScene
-
-
- //We need to construct the alternate bind matrix (which contains the new joint positions)
- //in the same order as they were stored in the joint buffer. The joints associated
- //with the skeleton are not stored in the same order as they are in the exported joint buffer.
- //This remaps the skeletal joints to be in the same order as the joints stored in the model.
- std::vector<std::string> :: const_iterator jointIt = model->mSkinInfo.mJointNames.begin();
- const int jointCnt = model->mSkinInfo.mJointNames.size();
- for ( int i=0; i<jointCnt; ++i, ++jointIt )
- {
- std::string lookingForJoint = (*jointIt).c_str();
- //Look for the joint xform that we extracted from the skeleton, using the jointIt as the key
- //and store it in the alternate bind matrix
- if ( mJointList.find( lookingForJoint ) != mJointList.end() )
- {
- LLMatrix4 jointTransform = mJointList[lookingForJoint];
- LLMatrix4 newInverse = model->mSkinInfo.mInvBindMatrix[i];
- newInverse.setTranslation( mJointList[lookingForJoint].getTranslation() );
- model->mSkinInfo.mAlternateBindMatrix.push_back( newInverse );
- }
- else
- {
- LL_WARNS()<<"Possibly misnamed/missing joint [" <<lookingForJoint.c_str()<<" ] "<<LL_ENDL;
- }
- }
-
- //grab raw position array
-
- domVertices* verts = mesh->getVertices();
- if (verts)
- {
- domInputLocal_Array& inputs = verts->getInput_array();
- for (size_t i = 0; i < inputs.getCount() && model->mPosition.empty(); ++i)
- {
- if (strcmp(inputs[i]->getSemantic(), COMMON_PROFILE_INPUT_POSITION) == 0)
- {
- domSource* pos_source = daeSafeCast<domSource>(inputs[i]->getSource().getElement());
- if (pos_source)
- {
- domFloat_array* pos_array = pos_source->getFloat_array();
- if (pos_array)
- {
- domListOfFloats& pos = pos_array->getValue();
-
- for (size_t j = 0; j < pos.getCount(); j += 3)
- {
- if (pos.getCount() <= j+2)
- {
- LL_ERRS() << "Invalid position array size." << LL_ENDL;
- }
-
- LLVector3 v(pos[j], pos[j+1], pos[j+2]);
-
- //transform from COLLADA space to volume space
- v = v * inverse_normalized_transformation;
-
- model->mPosition.push_back(v);
- }
- }
- }
- }
- }
- }
-
- //grab skin weights array
- domSkin::domVertex_weights* weights = skin->getVertex_weights();
- if (weights)
- {
- domInputLocalOffset_Array& inputs = weights->getInput_array();
- domFloat_array* vertex_weights = NULL;
- for (size_t i = 0; i < inputs.getCount(); ++i)
- {
- if (strcmp(inputs[i]->getSemantic(), COMMON_PROFILE_INPUT_WEIGHT) == 0)
- {
- domSource* weight_source = daeSafeCast<domSource>(inputs[i]->getSource().getElement());
- if (weight_source)
- {
- vertex_weights = weight_source->getFloat_array();
- }
- }
- }
-
- if (vertex_weights)
- {
- domListOfFloats& w = vertex_weights->getValue();
- domListOfUInts& vcount = weights->getVcount()->getValue();
- domListOfInts& v = weights->getV()->getValue();
-
- U32 c_idx = 0;
- for (size_t vc_idx = 0; vc_idx < vcount.getCount(); ++vc_idx)
- { //for each vertex
- daeUInt count = vcount[vc_idx];
-
- //create list of weights that influence this vertex
- LLModel::weight_list weight_list;
-
- for (daeUInt i = 0; i < count; ++i)
- { //for each weight
- daeInt joint_idx = v[c_idx++];
- daeInt weight_idx = v[c_idx++];
-
- if (joint_idx == -1)
- {
- //ignore bindings to bind_shape_matrix
- continue;
- }
-
- F32 weight_value = w[weight_idx];
-
- weight_list.push_back(LLModel::JointWeight(joint_idx, weight_value));
- }
-
- //sort by joint weight
- std::sort(weight_list.begin(), weight_list.end(), LLModel::CompareWeightGreater());
-
- std::vector<LLModel::JointWeight> wght;
-
- F32 total = 0.f;
-
- for (U32 i = 0; i < llmin((U32) 4, (U32) weight_list.size()); ++i)
- { //take up to 4 most significant weights
- if (weight_list[i].mWeight > 0.f)
- {
- wght.push_back( weight_list[i] );
- total += weight_list[i].mWeight;
- }
- }
-
- F32 scale = 1.f/total;
- if (scale != 1.f)
- { //normalize weights
- for (U32 i = 0; i < wght.size(); ++i)
- {
- wght[i].mWeight *= scale;
- }
- }
-
- model->mSkinWeights[model->mPosition[vc_idx]] = wght;
- }
-
- //add instance to scene for this model
-
- LLMatrix4 transformation = mTransform;
- // adjust the transformation to compensate for mesh normalization
-
- LLMatrix4 mesh_translation;
- mesh_translation.setTranslation(mesh_translation_vector);
- mesh_translation *= transformation;
- transformation = mesh_translation;
-
- LLMatrix4 mesh_scale;
- mesh_scale.initScale(mesh_scale_vector);
- mesh_scale *= transformation;
- transformation = mesh_scale;
-
- std::map<std::string, LLImportMaterial> materials;
- for (U32 i = 0; i < model->mMaterialList.size(); ++i)
- {
- materials[model->mMaterialList[i]] = LLImportMaterial();
- }
- mScene[transformation].push_back(LLModelInstance(model, model->mLabel, transformation, materials));
- stretch_extents(model, transformation, mExtents[0], mExtents[1], mFirstTransform);
- }
- }
- }
- }
- }
- }
- }
-
- daeElement* scene = root->getDescendant("visual_scene");
-
- if (!scene)
- {
- LL_WARNS() << "document has no visual_scene" << LL_ENDL;
- setLoadState( ERROR_PARSING );
- return true;
- }
-
- setLoadState( DONE );
-
- bool badElement = false;
-
- processElement( scene, badElement );
-
- if ( badElement )
- {
- setLoadState( ERROR_PARSING );
- }
-
- return true;
-}
-
-void LLModelLoader::setLoadState(U32 state)
-{
- if (mPreview)
- {
- mPreview->setLoadState(state);
- }
-}
-
-bool LLModelLoader::loadFromSLM(const std::string& filename)
-{
- //only need to populate mScene with data from slm
- llstat stat;
-
- if (LLFile::stat(filename, &stat))
- { //file does not exist
- return false;
- }
-
- S32 file_size = (S32) stat.st_size;
-
- llifstream ifstream(filename.c_str(), std::ifstream::in | std::ifstream::binary);
- LLSD data;
- LLSDSerialize::fromBinary(data, ifstream, file_size);
- ifstream.close();
-
- //build model list for each LoD
- model_list model[LLModel::NUM_LODS];
-
- if (data["version"].asInteger() != SLM_SUPPORTED_VERSION)
- { //unsupported version
- return false;
- }
-
- LLSD& mesh = data["mesh"];
-
- LLVolumeParams volume_params;
- volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
-
- for (S32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
- {
- for (U32 i = 0; i < mesh.size(); ++i)
- {
- std::stringstream str(mesh[i].asString());
- LLPointer<LLModel> loaded_model = new LLModel(volume_params, (F32) lod);
- if (loaded_model->loadModel(str))
- {
- loaded_model->mLocalID = i;
- model[lod].push_back(loaded_model);
-
- if (lod == LLModel::LOD_HIGH && !loaded_model->mSkinInfo.mJointNames.empty())
- {
- //check to see if rig is valid
- mPreview->critiqueRigForUploadApplicability( loaded_model->mSkinInfo.mJointNames );
- }
- }
- }
- }
-
- if (model[LLModel::LOD_HIGH].empty())
- { //failed to load high lod
- return false;
- }
-
- // Set name.
- std::string name = data["name"];
- if (!name.empty())
- {
- model[LLModel::LOD_HIGH][0]->mLabel = name;
- }
-
-
- //load instance list
- model_instance_list instance_list;
-
- LLSD& instance = data["instance"];
-
- for (U32 i = 0; i < instance.size(); ++i)
- {
- //deserialize instance list
- instance_list.push_back(LLModelInstance(instance[i]));
-
- //match up model instance pointers
- S32 idx = instance_list[i].mLocalMeshID;
-
- for (U32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
- {
- if (!model[lod].empty())
- {
- instance_list[i].mLOD[lod] = model[lod][idx];
- }
- }
-
- instance_list[i].mModel = model[LLModel::LOD_HIGH][idx];
- }
-
-
- //convert instance_list to mScene
- mFirstTransform = TRUE;
- for (U32 i = 0; i < instance_list.size(); ++i)
- {
- LLModelInstance& cur_instance = instance_list[i];
- mScene[cur_instance.mTransform].push_back(cur_instance);
- stretch_extents(cur_instance.mModel, cur_instance.mTransform, mExtents[0], mExtents[1], mFirstTransform);
- }
-
- setLoadState( DONE );
-
- return true;
-}
-
-//static
-bool LLModelLoader::isAlive(LLModelLoader* loader)
-{
- if(!loader)
- {
- return false ;
- }
-
- std::list<LLModelLoader*>::iterator iter = sActiveLoaderList.begin() ;
- for(; iter != sActiveLoaderList.end() && (*iter) != loader; ++iter) ;
-
- return *iter == loader ;
-}
-
-void LLModelLoader::loadModelCallback()
-{
- assert_main_thread();
-
- if (mPreview)
- {
- mPreview->loadModelCallback(mLod);
- }
-
- while (!isStopped())
- { //wait until this thread is stopped before deleting self
- apr_sleep(100);
- }
-
- //doubel check if "this" is valid before deleting it, in case it is aborted during running.
- if(!isAlive(this))
- {
- return ;
- }
-
- //cleanup model loader
- if (mPreview)
- {
- mPreview->mModelLoader = NULL;
- }
-
- delete this;
-}
-//-----------------------------------------------------------------------------
-// buildJointToNodeMappingFromScene()
-//-----------------------------------------------------------------------------
-void LLModelLoader::buildJointToNodeMappingFromScene( daeElement* pRoot )
-{
- daeElement* pScene = pRoot->getDescendant("visual_scene");
- if ( pScene )
- {
- daeTArray< daeSmartRef<daeElement> > children = pScene->getChildren();
- S32 childCount = children.getCount();
- for (S32 i = 0; i < childCount; ++i)
- {
- domNode* pNode = daeSafeCast<domNode>(children[i]);
- processJointToNodeMapping( pNode );
- }
- }
-}
-//-----------------------------------------------------------------------------
-// processJointToNodeMapping()
-//-----------------------------------------------------------------------------
-void LLModelLoader::processJointToNodeMapping( domNode* pNode )
-{
- if ( isNodeAJoint( pNode ) )
- {
- //1.Store the parent
- std::string nodeName = pNode->getName();
- if ( !nodeName.empty() )
- {
- mJointsFromNode.push_front( pNode->getName() );
- }
- //2. Handle the kiddo's
- processChildJoints( pNode );
- }
- else
- {
- //Determine if the're any children wrt to this failed node.
- //This occurs when an armature is exported and ends up being what essentially amounts to
- //as the root for the visual_scene
- if ( pNode )
- {
- processChildJoints( pNode );
- }
- else
- {
- LL_INFOS()<<"Node is NULL"<<LL_ENDL;
- }
-
- }
-}
-//-----------------------------------------------------------------------------
-// processChildJoint()
-//-----------------------------------------------------------------------------
-void LLModelLoader::processChildJoints( domNode* pParentNode )
-{
- daeTArray< daeSmartRef<daeElement> > childOfChild = pParentNode->getChildren();
- S32 childOfChildCount = childOfChild.getCount();
- for (S32 i = 0; i < childOfChildCount; ++i)
- {
- domNode* pChildNode = daeSafeCast<domNode>( childOfChild[i] );
- if ( pChildNode )
- {
- processJointToNodeMapping( pChildNode );
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-// critiqueRigForUploadApplicability()
-//-----------------------------------------------------------------------------
-void LLModelPreview::critiqueRigForUploadApplicability( const std::vector<std::string> &jointListFromAsset )
-{
- critiqueJointToNodeMappingFromScene();
-
- //Determines the following use cases for a rig:
- //1. It is suitable for upload with skin weights & joint positions, or
- //2. It is suitable for upload as standard av with just skin weights
-
- bool isJointPositionUploadOK = isRigSuitableForJointPositionUpload( jointListFromAsset );
- bool isRigLegacyOK = isRigLegacy( jointListFromAsset );
-
- //It's OK that both could end up being true, both default to false
- if ( isJointPositionUploadOK )
- {
- setRigValidForJointPositionUpload( true );
- }
-
- if ( isRigLegacyOK)
- {
- setLegacyRigValid( true );
- }
-
-}
-//-----------------------------------------------------------------------------
-// critiqueJointToNodeMappingFromScene()
-//-----------------------------------------------------------------------------
-void LLModelPreview::critiqueJointToNodeMappingFromScene( void )
-{
- //Do the actual nodes back the joint listing from the dae?
- //if yes then this is a fully rigged asset, otherwise it's just a partial rig
-
- std::deque<std::string>::iterator jointsFromNodeIt = mJointsFromNode.begin();
- std::deque<std::string>::iterator jointsFromNodeEndIt = mJointsFromNode.end();
- bool result = true;
-
- if ( !mJointsFromNode.empty() )
- {
- for ( ;jointsFromNodeIt!=jointsFromNodeEndIt;++jointsFromNodeIt )
- {
- std::string name = *jointsFromNodeIt;
- if ( mJointTransformMap.find( name ) != mJointTransformMap.end() )
- {
- continue;
- }
- else
- {
- LL_INFOS()<<"critiqueJointToNodeMappingFromScene is missing a: "<<name<<LL_ENDL;
- result = false;
- }
- }
- }
- else
- {
- result = false;
- }
-
- //Determines the following use cases for a rig:
- //1. Full av rig w/1-1 mapping from the scene and joint array
- //2. Partial rig but w/o parity between the scene and joint array
- if ( result )
- {
- setRigWithSceneParity( true );
- }
-}
-//-----------------------------------------------------------------------------
-// isRigLegacy()
-//-----------------------------------------------------------------------------
-bool LLModelPreview::isRigLegacy( const std::vector<std::string> &jointListFromAsset )
-{
- //No joints in asset
- if ( jointListFromAsset.size() == 0 )
- {
- return false;
- }
-
- bool result = false;
-
- std::deque<std::string> :: const_iterator masterJointIt = mMasterLegacyJointList.begin();
- std::deque<std::string> :: const_iterator masterJointEndIt = mMasterLegacyJointList.end();
-
- std::vector<std::string> :: const_iterator modelJointIt = jointListFromAsset.begin();
- std::vector<std::string> :: const_iterator modelJointItEnd = jointListFromAsset.end();
-
- for ( ;masterJointIt!=masterJointEndIt;++masterJointIt )
- {
- result = false;
- modelJointIt = jointListFromAsset.begin();
-
- for ( ;modelJointIt!=modelJointItEnd; ++modelJointIt )
- {
- if ( *masterJointIt == *modelJointIt )
- {
- result = true;
- break;
- }
- }
- if ( !result )
- {
- LL_INFOS()<<" Asset did not contain the joint (if you're u/l a fully rigged asset w/joint positions - it is required)." << *masterJointIt<< LL_ENDL;
- break;
- }
- }
- return result;
-}
-//-----------------------------------------------------------------------------
-// isRigSuitableForJointPositionUpload()
-//-----------------------------------------------------------------------------
-bool LLModelPreview::isRigSuitableForJointPositionUpload( const std::vector<std::string> &jointListFromAsset )
-{
- bool result = false;
-
- std::deque<std::string> :: const_iterator masterJointIt = mMasterJointList.begin();
- std::deque<std::string> :: const_iterator masterJointEndIt = mMasterJointList.end();
-
- std::vector<std::string> :: const_iterator modelJointIt = jointListFromAsset.begin();
- std::vector<std::string> :: const_iterator modelJointItEnd = jointListFromAsset.end();
-
- for ( ;masterJointIt!=masterJointEndIt;++masterJointIt )
- {
- result = false;
- modelJointIt = jointListFromAsset.begin();
-
- for ( ;modelJointIt!=modelJointItEnd; ++modelJointIt )
- {
- if ( *masterJointIt == *modelJointIt )
- {
- result = true;
- break;
- }
- }
- if ( !result )
- {
- LL_INFOS()<<" Asset did not contain the joint (if you're u/l a fully rigged asset w/joint positions - it is required)." << *masterJointIt<< LL_ENDL;
- break;
- }
- }
- return result;
-}
-
-
-//called in the main thread
-void LLModelLoader::loadTextures()
-{
- BOOL is_paused = isPaused() ;
- pause() ; //pause the loader
-
- for(scene::iterator iter = mScene.begin(); iter != mScene.end(); ++iter)
- {
- for(U32 i = 0 ; i < iter->second.size(); i++)
- {
- for(std::map<std::string, LLImportMaterial>::iterator j = iter->second[i].mMaterial.begin();
- j != iter->second[i].mMaterial.end(); ++j)
- {
- LLImportMaterial& material = j->second;
-
- if(!material.mDiffuseMapFilename.empty())
- {
- material.mDiffuseMap =
- LLViewerTextureManager::getFetchedTextureFromUrl("file://" + material.mDiffuseMapFilename, FTT_LOCAL_FILE, TRUE, LLGLTexture::BOOST_PREVIEW);
- material.mDiffuseMap->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, TRUE, FALSE, mPreview, NULL, FALSE);
- material.mDiffuseMap->forceToSaveRawImage(0, F32_MAX);
- mNumOfFetchingTextures++ ;
- }
- }
- }
- }
-
- if(!is_paused)
- {
- unpause() ;
- }
-}
-
-//-----------------------------------------------------------------------------
-// isNodeAJoint()
-//-----------------------------------------------------------------------------
-bool LLModelLoader::isNodeAJoint( domNode* pNode )
-{
- if ( !pNode )
- {
- LL_INFOS()<<"Created node is NULL"<<LL_ENDL;
- return false;
- }
-
- if ( pNode->getName() == NULL )
- {
- LL_INFOS()<<"Parsed node has no name "<<LL_ENDL;
- //Attempt to write the node id, if possible (aids in debugging the visual scene)
- if ( pNode->getId() )
- {
- LL_INFOS()<<"Parsed node ID: "<<pNode->getId()<<LL_ENDL;
- }
- return false;
- }
-
- if ( mJointMap.find( pNode->getName() ) != mJointMap.end() )
- {
- return true;
- }
-
- return false;
-}
-//-----------------------------------------------------------------------------
-// verifyCount
-//-----------------------------------------------------------------------------
-bool LLModelPreview::verifyCount( int expected, int result )
-{
- if ( expected != result )
- {
- LL_INFOS()<< "Error: (expected/got)"<<expected<<"/"<<result<<"verts"<<LL_ENDL;
- return false;
- }
- return true;
-}
-//-----------------------------------------------------------------------------
-// verifyController
-//-----------------------------------------------------------------------------
-bool LLModelPreview::verifyController( domController* pController )
-{
-
- bool result = true;
-
- domSkin* pSkin = pController->getSkin();
-
- if ( pSkin )
- {
- xsAnyURI & uri = pSkin->getSource();
- domElement* pElement = uri.getElement();
-
- if ( !pElement )
- {
- LL_INFOS()<<"Can't resolve skin source"<<LL_ENDL;
- return false;
- }
-
- daeString type_str = pElement->getTypeName();
- if ( stricmp(type_str, "geometry") == 0 )
- {
- //Skin is reference directly by geometry and get the vertex count from skin
- domSkin::domVertex_weights* pVertexWeights = pSkin->getVertex_weights();
- U32 vertexWeightsCount = pVertexWeights->getCount();
- domGeometry* pGeometry = (domGeometry*) (domElement*) uri.getElement();
- domMesh* pMesh = pGeometry->getMesh();
-
- if ( pMesh )
- {
- //Get vertex count from geometry
- domVertices* pVertices = pMesh->getVertices();
- if ( !pVertices )
- {
- LL_INFOS()<<"No vertices!"<<LL_ENDL;
- return false;
- }
-
- if ( pVertices )
- {
- xsAnyURI src = pVertices->getInput_array()[0]->getSource();
- domSource* pSource = (domSource*) (domElement*) src.getElement();
- U32 verticesCount = pSource->getTechnique_common()->getAccessor()->getCount();
- result = verifyCount( verticesCount, vertexWeightsCount );
- if ( !result )
- {
- return result;
- }
- }
- }
-
- U32 vcountCount = (U32) pVertexWeights->getVcount()->getValue().getCount();
- result = verifyCount( vcountCount, vertexWeightsCount );
- if ( !result )
- {
- return result;
- }
-
- domInputLocalOffset_Array& inputs = pVertexWeights->getInput_array();
- U32 sum = 0;
- for (size_t i=0; i<vcountCount; i++)
- {
- sum += pVertexWeights->getVcount()->getValue()[i];
- }
- result = verifyCount( sum * inputs.getCount(), (domInt) pVertexWeights->getV()->getValue().getCount() );
- }
- }
-
- return result;
-}
-
-//-----------------------------------------------------------------------------
-// extractTranslation()
-//-----------------------------------------------------------------------------
-void LLModelLoader::extractTranslation( domTranslate* pTranslate, LLMatrix4& transform )
-{
- domFloat3 jointTrans = pTranslate->getValue();
- LLVector3 singleJointTranslation( jointTrans[0], jointTrans[1], jointTrans[2] );
- transform.setTranslation( singleJointTranslation );
-}
-//-----------------------------------------------------------------------------
-// extractTranslationViaElement()
-//-----------------------------------------------------------------------------
-void LLModelLoader::extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform )
-{
- if ( pTranslateElement )
- {
- domTranslate* pTranslateChild = dynamic_cast<domTranslate*>( pTranslateElement );
- domFloat3 translateChild = pTranslateChild->getValue();
- LLVector3 singleJointTranslation( translateChild[0], translateChild[1], translateChild[2] );
- transform.setTranslation( singleJointTranslation );
- }
-}
-//-----------------------------------------------------------------------------
-// extractTranslationViaSID()
-//-----------------------------------------------------------------------------
-void LLModelLoader::extractTranslationViaSID( daeElement* pElement, LLMatrix4& transform )
-{
- if ( pElement )
- {
- daeSIDResolver resolver( pElement, "./transform" );
- domMatrix* pMatrix = daeSafeCast<domMatrix>( resolver.getElement() );
- //We are only extracting out the translational component atm
- LLMatrix4 workingTransform;
- if ( pMatrix )
- {
- domFloat4x4 domArray = pMatrix->getValue();
- for ( int i = 0; i < 4; i++ )
- {
- for( int j = 0; j < 4; j++ )
- {
- workingTransform.mMatrix[i][j] = domArray[i + j*4];
- }
- }
- LLVector3 trans = workingTransform.getTranslation();
- transform.setTranslation( trans );
- }
- }
- else
- {
- LL_WARNS()<<"Element is nonexistent - empty/unsupported node."<<LL_ENDL;
- }
-}
-//-----------------------------------------------------------------------------
-// processJointNode()
-//-----------------------------------------------------------------------------
-void LLModelLoader::processJointNode( domNode* pNode, JointTransformMap& jointTransforms )
-{
- if (pNode->getName() == NULL)
- {
- LL_WARNS() << "nameless node, can't process" << LL_ENDL;
- return;
- }
-
- //LL_WARNS()<<"ProcessJointNode# Node:" <<pNode->getName()<<LL_ENDL;
-
- //1. handle the incoming node - extract out translation via SID or element
-
- LLMatrix4 workingTransform;
-
- //Pull out the translate id and store it in the jointTranslations map
- daeSIDResolver jointResolverA( pNode, "./translate" );
- domTranslate* pTranslateA = daeSafeCast<domTranslate>( jointResolverA.getElement() );
- daeSIDResolver jointResolverB( pNode, "./location" );
- domTranslate* pTranslateB = daeSafeCast<domTranslate>( jointResolverB.getElement() );
-
- //Translation via SID was successful
- if ( pTranslateA )
- {
- extractTranslation( pTranslateA, workingTransform );
- }
- else
- if ( pTranslateB )
- {
- extractTranslation( pTranslateB, workingTransform );
- }
- else
- {
- //Translation via child from element
- daeElement* pTranslateElement = getChildFromElement( pNode, "translate" );
- if ( !pTranslateElement || pTranslateElement->typeID() != domTranslate::ID() )
- {
- //LL_WARNS()<< "The found element is not a translate node" <<LL_ENDL;
- daeSIDResolver jointResolver( pNode, "./matrix" );
- domMatrix* pMatrix = daeSafeCast<domMatrix>( jointResolver.getElement() );
- if ( pMatrix )
- {
- //LL_INFOS()<<"A matrix SID was however found!"<<LL_ENDL;
- domFloat4x4 domArray = pMatrix->getValue();
- for ( int i = 0; i < 4; i++ )
- {
- for( int j = 0; j < 4; j++ )
- {
- workingTransform.mMatrix[i][j] = domArray[i + j*4];
- }
- }
- }
- else
- {
- LL_WARNS()<< "The found element is not translate or matrix node - most likely a corrupt export!" <<LL_ENDL;
- }
- }
- else
- {
- extractTranslationViaElement( pTranslateElement, workingTransform );
- }
- }
-
- //Store the working transform relative to the nodes name.
- jointTransforms[ pNode->getName() ] = workingTransform;
-
- //2. handle the nodes children
-
- //Gather and handle the incoming nodes children
- daeTArray< daeSmartRef<daeElement> > childOfChild = pNode->getChildren();
- S32 childOfChildCount = childOfChild.getCount();
-
- for (S32 i = 0; i < childOfChildCount; ++i)
- {
- domNode* pChildNode = daeSafeCast<domNode>( childOfChild[i] );
- if ( pChildNode )
- {
- processJointNode( pChildNode, jointTransforms );
- }
- }
-}
-//-----------------------------------------------------------------------------
-// getChildFromElement()
-//-----------------------------------------------------------------------------
-daeElement* LLModelLoader::getChildFromElement( daeElement* pElement, std::string const & name )
-{
- daeElement* pChildOfElement = pElement->getChild( name.c_str() );
- if ( pChildOfElement )
- {
- return pChildOfElement;
- }
- LL_WARNS()<< "Could not find a child [" << name << "] for the element: \"" << pElement->getAttribute("id") << "\"" << LL_ENDL;
- return NULL;
-}
-
-void LLModelLoader::processElement( daeElement* element, bool& badElement )
-{
- LLMatrix4 saved_transform = mTransform;
-
- domTranslate* translate = daeSafeCast<domTranslate>(element);
- if (translate)
- {
- domFloat3 dom_value = translate->getValue();
-
- LLMatrix4 translation;
- translation.setTranslation(LLVector3(dom_value[0], dom_value[1], dom_value[2]));
-
- translation *= mTransform;
- mTransform = translation;
- }
-
- domRotate* rotate = daeSafeCast<domRotate>(element);
- if (rotate)
- {
- domFloat4 dom_value = rotate->getValue();
-
- LLMatrix4 rotation;
- rotation.initRotTrans(dom_value[3] * DEG_TO_RAD, LLVector3(dom_value[0], dom_value[1], dom_value[2]), LLVector3(0, 0, 0));
-
- rotation *= mTransform;
- mTransform = rotation;
- }
-
- domScale* scale = daeSafeCast<domScale>(element);
- if (scale)
- {
- domFloat3 dom_value = scale->getValue();
-
-
- LLVector3 scale_vector = LLVector3(dom_value[0], dom_value[1], dom_value[2]);
- scale_vector.abs(); // Set all values positive, since we don't currently support mirrored meshes
- LLMatrix4 scaling;
- scaling.initScale(scale_vector);
-
- scaling *= mTransform;
- mTransform = scaling;
- }
-
- domMatrix* matrix = daeSafeCast<domMatrix>(element);
- if (matrix)
- {
- domFloat4x4 dom_value = matrix->getValue();
-
- LLMatrix4 matrix_transform;
-
- for (int i = 0; i < 4; i++)
- {
- for(int j = 0; j < 4; j++)
- {
- matrix_transform.mMatrix[i][j] = dom_value[i + j*4];
- }
- }
-
- matrix_transform *= mTransform;
- mTransform = matrix_transform;
- }
-
- domInstance_geometry* instance_geo = daeSafeCast<domInstance_geometry>(element);
- if (instance_geo)
- {
- domGeometry* geo = daeSafeCast<domGeometry>(instance_geo->getUrl().getElement());
- if (geo)
- {
- domMesh* mesh = daeSafeCast<domMesh>(geo->getDescendant(daeElement::matchType(domMesh::ID())));
- if (mesh)
- {
- LLModel* model = mModel[mesh];
- if (model)
- {
- LLMatrix4 transformation = mTransform;
-
- if (mTransform.determinant() < 0)
- { //negative scales are not supported
- LL_INFOS() << "Negative scale detected, unsupported transform. domInstance_geometry: " << LLModel::getElementLabel(instance_geo) << LL_ENDL;
- badElement = true;
- }
-
- std::map<std::string, LLImportMaterial> materials = getMaterials(model, instance_geo);
-
- // adjust the transformation to compensate for mesh normalization
- LLVector3 mesh_scale_vector;
- LLVector3 mesh_translation_vector;
- model->getNormalizedScaleTranslation(mesh_scale_vector, mesh_translation_vector);
-
- LLMatrix4 mesh_translation;
- mesh_translation.setTranslation(mesh_translation_vector);
- mesh_translation *= transformation;
- transformation = mesh_translation;
-
- LLMatrix4 mesh_scale;
- mesh_scale.initScale(mesh_scale_vector);
- mesh_scale *= transformation;
- transformation = mesh_scale;
-
- std::string label = getElementLabel(instance_geo);
- mScene[transformation].push_back(LLModelInstance(model, label, transformation, materials));
-
- stretch_extents(model, transformation, mExtents[0], mExtents[1], mFirstTransform);
- }
- }
- }
- else
- {
- LL_INFOS()<<"Unable to resolve geometry URL."<<LL_ENDL;
- badElement = true;
- }
-
- }
-
- domInstance_node* instance_node = daeSafeCast<domInstance_node>(element);
- if (instance_node)
- {
- daeElement* instance = instance_node->getUrl().getElement();
- if (instance)
- {
- processElement(instance,badElement);
- }
- }
-
- //process children
- daeTArray< daeSmartRef<daeElement> > children = element->getChildren();
- int childCount = children.getCount();
- for (S32 i = 0; i < childCount; i++)
- {
- processElement(children[i],badElement);
- }
-
- domNode* node = daeSafeCast<domNode>(element);
- if (node)
- { //this element was a node, restore transform before processiing siblings
- mTransform = saved_transform;
- }
-}
-
-std::map<std::string, LLImportMaterial> LLModelLoader::getMaterials(LLModel* model, domInstance_geometry* instance_geo)
-{
- std::map<std::string, LLImportMaterial> materials;
- for (int i = 0; i < model->mMaterialList.size(); i++)
- {
- LLImportMaterial import_material;
-
- domInstance_material* instance_mat = NULL;
-
- domBind_material::domTechnique_common* technique =
- daeSafeCast<domBind_material::domTechnique_common>(instance_geo->getDescendant(daeElement::matchType(domBind_material::domTechnique_common::ID())));
-
- if (technique)
- {
- daeTArray< daeSmartRef<domInstance_material> > inst_materials = technique->getChildrenByType<domInstance_material>();
- for (int j = 0; j < inst_materials.getCount(); j++)
- {
- std::string symbol(inst_materials[j]->getSymbol());
-
- if (symbol == model->mMaterialList[i]) // found the binding
- {
- instance_mat = inst_materials[j];
- }
- }
- }
-
- if (instance_mat)
- {
- domMaterial* material = daeSafeCast<domMaterial>(instance_mat->getTarget().getElement());
- if (material)
- {
- domInstance_effect* instance_effect =
- daeSafeCast<domInstance_effect>(material->getDescendant(daeElement::matchType(domInstance_effect::ID())));
- if (instance_effect)
- {
- domEffect* effect = daeSafeCast<domEffect>(instance_effect->getUrl().getElement());
- if (effect)
- {
- domProfile_COMMON* profile =
- daeSafeCast<domProfile_COMMON>(effect->getDescendant(daeElement::matchType(domProfile_COMMON::ID())));
- if (profile)
- {
- import_material = profileToMaterial(profile);
- }
- }
- }
- }
- }
-
- import_material.mBinding = model->mMaterialList[i];
- materials[model->mMaterialList[i]] = import_material;
- }
-
- return materials;
-}
-
-LLImportMaterial LLModelLoader::profileToMaterial(domProfile_COMMON* material)
-{
- LLImportMaterial mat;
- mat.mFullbright = FALSE;
-
- daeElement* diffuse = material->getDescendant("diffuse");
- if (diffuse)
- {
- domCommon_color_or_texture_type_complexType::domTexture* texture =
- daeSafeCast<domCommon_color_or_texture_type_complexType::domTexture>(diffuse->getDescendant("texture"));
- if (texture)
- {
- domCommon_newparam_type_Array newparams = material->getNewparam_array();
- for (S32 i = 0; i < newparams.getCount(); i++)
- {
- domFx_surface_common* surface = newparams[i]->getSurface();
- if (surface)
- {
- domFx_surface_init_common* init = surface->getFx_surface_init_common();
- if (init)
- {
- domFx_surface_init_from_common_Array init_from = init->getInit_from_array();
-
- if (init_from.getCount() > i)
- {
- domImage* image = daeSafeCast<domImage>(init_from[i]->getValue().getElement());
- if (image)
- {
- // we only support init_from now - embedded data will come later
- domImage::domInit_from* init = image->getInit_from();
- if (init)
- {
- mat.mDiffuseMapFilename = cdom::uriToNativePath(init->getValue().str());
- mat.mDiffuseMapLabel = getElementLabel(material);
- }
- }
- }
- }
- }
- }
- }
-
- domCommon_color_or_texture_type_complexType::domColor* color =
- daeSafeCast<domCommon_color_or_texture_type_complexType::domColor>(diffuse->getDescendant("color"));
- if (color)
- {
- domFx_color_common domfx_color = color->getValue();
- LLColor4 value = LLColor4(domfx_color[0], domfx_color[1], domfx_color[2], domfx_color[3]);
- mat.mDiffuseColor = value;
- }
- }
-
- daeElement* emission = material->getDescendant("emission");
- if (emission)
- {
- LLColor4 emission_color = getDaeColor(emission);
- if (((emission_color[0] + emission_color[1] + emission_color[2]) / 3.0) > 0.25)
- {
- mat.mFullbright = TRUE;
- }
- }
-
- return mat;
-}
-
-// try to get a decent label for this element
-std::string LLModelLoader::getElementLabel(daeElement *element)
-{
- // if we have a name attribute, use it
- std::string name = element->getAttribute("name");
- if (name.length())
- {
- return name;
- }
-
- // if we have an ID attribute, use it
- if (element->getID())
- {
- return std::string(element->getID());
- }
-
- // if we have a parent, use it
- daeElement* parent = element->getParent();
- if (parent)
- {
- // if parent has a name, use it
- std::string name = parent->getAttribute("name");
- if (name.length())
- {
- return name;
- }
-
- // if parent has an ID, use it
- if (parent->getID())
- {
- return std::string(parent->getID());
- }
- }
-
- // try to use our type
- daeString element_name = element->getElementName();
- if (element_name)
- {
- return std::string(element_name);
- }
-
- // if all else fails, use "object"
- return std::string("object");
-}
-
-LLColor4 LLModelLoader::getDaeColor(daeElement* element)
-{
- LLColor4 value;
- domCommon_color_or_texture_type_complexType::domColor* color =
- daeSafeCast<domCommon_color_or_texture_type_complexType::domColor>(element->getDescendant("color"));
- if (color)
- {
- domFx_color_common domfx_color = color->getValue();
- value = LLColor4(domfx_color[0], domfx_color[1], domfx_color[2], domfx_color[3]);
- }
-
- return value;
-}
-
-//-----------------------------------------------------------------------------
// LLModelPreview
//-----------------------------------------------------------------------------
@@ -3125,7 +1181,9 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
, mPelvisZOffset( 0.0f )
, mLegacyRigValid( false )
, mRigValidJointUpload( false )
+, mPhysicsSearchLOD( LLModel::LOD_PHYSICS )
, mResetJoints( false )
+, mModelNoErrors( true )
, mRigParityWithScene( false )
, mLastJointUpdate( false )
{
@@ -3170,51 +1228,20 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
glodInit();
- //move into joint mapper class
- //1. joints for joint offset verification
- mMasterJointList.push_front("mPelvis");
- mMasterJointList.push_front("mTorso");
- mMasterJointList.push_front("mChest");
- mMasterJointList.push_front("mNeck");
- mMasterJointList.push_front("mHead");
- mMasterJointList.push_front("mCollarLeft");
- mMasterJointList.push_front("mShoulderLeft");
- mMasterJointList.push_front("mElbowLeft");
- mMasterJointList.push_front("mWristLeft");
- mMasterJointList.push_front("mCollarRight");
- mMasterJointList.push_front("mShoulderRight");
- mMasterJointList.push_front("mElbowRight");
- mMasterJointList.push_front("mWristRight");
- mMasterJointList.push_front("mHipRight");
- mMasterJointList.push_front("mKneeRight");
- mMasterJointList.push_front("mFootRight");
- mMasterJointList.push_front("mHipLeft");
- mMasterJointList.push_front("mKneeLeft");
- mMasterJointList.push_front("mFootLeft");
- //2. legacy joint list - used to verify rigs that will not be using joint offsets
- mMasterLegacyJointList.push_front("mPelvis");
- mMasterLegacyJointList.push_front("mTorso");
- mMasterLegacyJointList.push_front("mChest");
- mMasterLegacyJointList.push_front("mNeck");
- mMasterLegacyJointList.push_front("mHead");
- mMasterLegacyJointList.push_front("mHipRight");
- mMasterLegacyJointList.push_front("mKneeRight");
- mMasterLegacyJointList.push_front("mFootRight");
- mMasterLegacyJointList.push_front("mHipLeft");
- mMasterLegacyJointList.push_front("mKneeLeft");
- mMasterLegacyJointList.push_front("mFootLeft");
-
createPreviewAvatar();
}
LLModelPreview::~LLModelPreview()
{
- if (mModelLoader)
- {
- mModelLoader->mPreview = NULL;
- mModelLoader = NULL;
- }
- //*HACK : *TODO : turn this back on when we understand why this crashes
+ // glod apparently has internal mem alignment issues that are angering
+ // the heap-check code in windows, these should be hunted down in that
+ // TP code, if possible
+ //
+ // kernel32.dll!HeapFree() + 0x14 bytes
+ // msvcr100.dll!free(void * pBlock) Line 51 C
+ // glod.dll!glodGetGroupParameteriv() + 0x119 bytes
+ // glod.dll!glodShutdown() + 0x77 bytes
+ //
//glodShutdown();
}
@@ -3284,7 +1311,9 @@ U32 LLModelPreview::calcResourceCost()
decomp,
mFMP->childGetValue("upload_skin").asBoolean(),
mFMP->childGetValue("upload_joints").asBoolean(),
- TRUE);
+ TRUE,
+ FALSE,
+ instance.mModel->mSubmodelID);
num_hulls += decomp.mHull.size();
for (U32 i = 0; i < decomp.mHull.size(); ++i)
@@ -3351,29 +1380,12 @@ void LLModelPreview::rebuildUploadData()
F32 max_scale = 0.f;
- //reorder materials to match mBaseModel
- for (U32 i = 0; i < LLModel::NUM_LODS-1; i++)
- {
- if (mBaseModel.size() == mModel[i].size())
- {
- for (U32 j = 0; j < mBaseModel.size(); ++j)
- {
-
- int refFaceCnt = 0;
- int modelFaceCnt = 0;
-
- if ( !mModel[i][j]->matchMaterialOrder(mBaseModel[j], refFaceCnt, modelFaceCnt ) )
- {
- setLoadState( LLModelLoader::ERROR_MATERIALS );
- mFMP->childDisable( "calculate_btn" );
- }
- }
- }
- }
+ BOOL importerDebug = gSavedSettings.getBOOL("ImporterDebug");
+ BOOL legacyMatching = gSavedSettings.getBOOL("ImporterLegacyMatching");
for (LLModelLoader::scene::iterator iter = mBaseScene.begin(); iter != mBaseScene.end(); ++iter)
{ //for each transform in scene
- LLMatrix4 mat = iter->first;
+ LLMatrix4 mat = iter->first;
// compute position
LLVector3 position = LLVector3(0, 0, 0) * mat;
@@ -3390,38 +1402,171 @@ void LLModelPreview::rebuildUploadData()
mat *= scale_mat;
- for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter)
- { //for each instance with said transform applied
- LLModelInstance instance = *model_iter;
+ for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end();)
+ { //for each instance with said transform applied
+ LLModelInstance instance = *model_iter++;
LLModel* base_model = instance.mModel;
- if (base_model)
+ if (base_model && !requested_name.empty())
{
base_model->mRequestedLabel = requested_name;
base_model->mMetric = metric;
}
- S32 idx = 0;
- for (idx = 0; idx < mBaseModel.size(); ++idx)
- { //find reference instance for this model
- if (mBaseModel[idx] == base_model)
+ for (int i = LLModel::NUM_LODS - 1; i >= LLModel::LOD_IMPOSTOR; i--)
+ {
+ LLModel* lod_model = NULL;
+ if (!legacyMatching)
{
- break;
+ // Fill LOD slots by finding matching meshes by label with name extensions
+ // in the appropriate scene for each LOD. This fixes all kinds of issues
+ // where the indexed method below fails in spectacular fashion.
+ // If you don't take the time to name your LOD and PHYS meshes
+ // with the name of their corresponding mesh in the HIGH LOD,
+ // then the indexed method will be attempted below.
+
+ LLMatrix4 transform;
+
+ std::string name_to_match = instance.mLabel;
+ llassert(!name_to_match.empty());
+
+ int extensionLOD;
+ if (i != LLModel::LOD_PHYSICS || mModel[LLModel::LOD_PHYSICS].empty())
+ {
+ extensionLOD = i;
+ }
+ else
+ {
+ //Physics can be inherited from other LODs or loaded, so we need to adjust what extension we are searching for
+ extensionLOD = mPhysicsSearchLOD;
+ }
+
+ std::string toAdd;
+ switch (extensionLOD)
+ {
+ case LLModel::LOD_IMPOSTOR: toAdd = "_LOD0"; break;
+ case LLModel::LOD_LOW: toAdd = "_LOD1"; break;
+ case LLModel::LOD_MEDIUM: toAdd = "_LOD2"; break;
+ case LLModel::LOD_PHYSICS: toAdd = "_PHYS"; break;
+ case LLModel::LOD_HIGH: break;
+ }
+
+ if (name_to_match.find(toAdd) == -1)
+ {
+ name_to_match += toAdd;
+ }
+
+ FindModel(mScene[i], name_to_match, lod_model, transform);
+
+ if (!lod_model && i != LLModel::LOD_PHYSICS)
+ {
+ if (importerDebug)
+ {
+ LL_INFOS() << "Search of" << name_to_match << " in LOD" << i << " list failed. Searching for alternative among LOD lists." << LL_ENDL;
+ }
+
+ int searchLOD = (i > LLModel::LOD_HIGH) ? LLModel::LOD_HIGH : i;
+ while ((searchLOD <= LLModel::LOD_HIGH) && !lod_model)
+ {
+ std::string name_to_match = instance.mLabel;
+ llassert(!name_to_match.empty());
+
+ std::string toAdd;
+ switch (searchLOD)
+ {
+ case LLModel::LOD_IMPOSTOR: toAdd = "_LOD0"; break;
+ case LLModel::LOD_LOW: toAdd = "_LOD1"; break;
+ case LLModel::LOD_MEDIUM: toAdd = "_LOD2"; break;
+ case LLModel::LOD_PHYSICS: toAdd = "_PHYS"; break;
+ case LLModel::LOD_HIGH: break;
+ }
+
+ if (name_to_match.find(toAdd) == -1)
+ {
+ name_to_match += toAdd;
+ }
+
+ // See if we can find an appropriately named model in LOD 'searchLOD'
+ //
+ FindModel(mScene[searchLOD], name_to_match, lod_model, transform);
+ searchLOD++;
+ }
+ }
}
- }
+ else
+ {
+ // Use old method of index-based association
+ U32 idx = 0;
+ for (idx = 0; idx < mBaseModel.size(); ++idx)
+ {
+ // find reference instance for this model
+ if (mBaseModel[idx] == base_model)
+ {
+ if (importerDebug)
+ {
+ LL_INFOS() << "Attempting to use model index " << idx << " for LOD " << i << " of " << instance.mLabel << LL_ENDL;
+ }
+ break;
+ }
+ }
- if(idx < mBaseModel.size())
- {
- for (U32 i = 0; i < LLModel::NUM_LODS; i++)
- { //fill LOD slots based on reference model index
+ // If the model list for the current LOD includes that index...
+ //
if (mModel[i].size() > idx)
{
- instance.mLOD[i] = mModel[i][idx];
+ // Assign that index from the model list for our LOD as the LOD model for this instance
+ //
+ lod_model = mModel[i][idx];
+ if (importerDebug)
+ {
+ LL_INFOS() << "Indexed match of model index " << idx << " at LOD " << i << " to model named " << lod_model->mLabel << LL_ENDL;
+ }
}
- else
+ else if (importerDebug)
{
- instance.mLOD[i] = NULL;
+ LL_INFOS() << "List of models does not include index " << idx << LL_ENDL;
+ }
+ }
+
+ if (lod_model)
+ {
+ if (importerDebug)
+ {
+ if (i == LLModel::LOD_PHYSICS)
+ {
+ LL_INFOS() << "Assigning collision for " << instance.mLabel << " to match " << lod_model->mLabel << LL_ENDL;
+ }
+ else
+ {
+ LL_INFOS() << "Assigning LOD" << i << " for " << instance.mLabel << " to found match " << lod_model->mLabel << LL_ENDL;
+ }
+ }
+ instance.mLOD[i] = lod_model;
+ }
+ else if (importerDebug)
+ {
+ LL_INFOS() << "List of models does not include " << instance.mLabel << LL_ENDL;
+ }
+ }
+
+ LLModel* high_lod_model = instance.mLOD[LLModel::LOD_HIGH];
+ if (!high_lod_model)
+ {
+ setLoadState( LLModelLoader::ERROR_MATERIALS );
+ mFMP->childDisable( "calculate_btn" );
+ }
+ else
+ {
+ for (U32 i = 0; i < LLModel::NUM_LODS-1; i++)
+ {
+ int refFaceCnt = 0;
+ int modelFaceCnt = 0;
+ llassert(instance.mLOD[i]);
+ if (instance.mLOD[i] && !instance.mLOD[i]->matchMaterialOrder(high_lod_model, refFaceCnt, modelFaceCnt ) )
+ {
+ setLoadState( LLModelLoader::ERROR_MATERIALS );
+ mFMP->childDisable( "calculate_btn" );
}
}
}
@@ -3430,6 +1575,34 @@ void LLModelPreview::rebuildUploadData()
}
}
+ for (U32 lod = 0; lod < LLModel::NUM_LODS-1; lod++)
+ {
+ // Search for models that are not included into upload data
+ // If we found any, that means something we loaded is not a sub-model.
+ for (U32 model_ind = 0; model_ind < mModel[lod].size(); ++model_ind)
+ {
+ bool found_model = false;
+ for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
+ {
+ LLModelInstance& instance = *iter;
+ if (instance.mLOD[lod] == mModel[lod][model_ind])
+ {
+ found_model = true;
+ break;
+ }
+ }
+ if (!found_model && mModel[lod][model_ind] && !mModel[lod][model_ind]->mSubmodelID)
+ {
+ if (importerDebug)
+ {
+ LL_INFOS() << "Model " << mModel[lod][model_ind]->mLabel << " was not used - mismatching lod models." << LL_ENDL;
+ }
+ setLoadState( LLModelLoader::ERROR_MATERIALS );
+ mFMP->childDisable( "calculate_btn" );
+ }
+ }
+ }
+
F32 max_import_scale = (DEFAULT_MAX_PRIM_SCALE-0.1f)/max_scale;
F32 max_axis = llmax(mPreviewScale.mV[0], mPreviewScale.mV[1]);
@@ -3496,7 +1669,6 @@ void LLModelPreview::saveUploadData(const std::string& filename, bool save_skinw
meshes.insert(instance.mModel);
std::stringstream str;
-
LLModel::Decomposition& decomp =
instance.mLOD[LLModel::LOD_PHYSICS].notNull() ?
instance.mLOD[LLModel::LOD_PHYSICS]->mPhysics :
@@ -3509,8 +1681,8 @@ void LLModelPreview::saveUploadData(const std::string& filename, bool save_skinw
instance.mLOD[LLModel::LOD_LOW],
instance.mLOD[LLModel::LOD_IMPOSTOR],
decomp,
- save_skinweights, save_joint_positions, FALSE, TRUE);
-
+ save_skinweights, save_joint_positions,
+ FALSE, TRUE, instance.mModel->mSubmodelID);
data["mesh"][instance.mModel->mLocalID] = str.str();
}
@@ -3578,13 +1750,28 @@ void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable
clearGLODGroup();
}
- mModelLoader = new LLModelLoader(filename, lod, this, mJointTransformMap, mJointsFromNode );
+ mModelLoader = new LLDAELoader(
+ filename,
+ lod,
+ &LLModelPreview::loadedCallback,
+ &LLModelPreview::lookupJointByName,
+ &LLModelPreview::loadTextures,
+ &LLModelPreview::stateChangedCallback,
+ this,
+ mJointTransformMap,
+ mJointsFromNode,
+ gSavedSettings.getU32("ImporterModelLimit"));
if (force_disable_slm)
{
mModelLoader->mTrySLM = false;
}
-
+ else
+ {
+ //only try to load from slm if viewer is configured to do so and this is the
+ //initial model load (not an LoD or physics shape)
+ mModelLoader->mTrySLM = gSavedSettings.getBOOL("MeshImportUseSLM") && mUploadData.empty();
+ }
mModelLoader->start();
mFMP->childSetTextArg("status", "[STATUS]", mFMP->getString("status_reading_file"));
@@ -3615,6 +1802,7 @@ void LLModelPreview::setPhysicsFromLOD(S32 lod)
if (lod >= 0 && lod <= 3)
{
+ mPhysicsSearchLOD = lod;
mModel[LLModel::LOD_PHYSICS] = mModel[lod];
mScene[LLModel::LOD_PHYSICS] = mScene[lod];
mLODFile[LLModel::LOD_PHYSICS].clear();
@@ -3634,11 +1822,14 @@ void LLModelPreview::clearIncompatible(S32 lod)
return;
}
+ // at this point we don't care about sub-models,
+ // different amount of sub-models means face count mismatch, not incompatibility
+ U32 lod_size = countRootModels(mModel[lod]);
for (U32 i = 0; i <= LLModel::LOD_HIGH; i++)
{ //clear out any entries that aren't compatible with this model
if (i != lod)
{
- if (mModel[i].size() != mModel[lod].size())
+ if (countRootModels(mModel[i]) != lod_size)
{
mModel[i].clear();
mScene[i].clear();
@@ -3673,7 +1864,7 @@ void LLModelPreview::clearGLODGroup()
}
}
-void LLModelPreview::loadModelCallback(S32 lod)
+void LLModelPreview::loadModelCallback(S32 loaded_lod)
{
assert_main_thread();
@@ -3686,12 +1877,18 @@ void LLModelPreview::loadModelCallback(S32 lod)
if(getLoadState() >= LLModelLoader::ERROR_PARSING)
{
mLoading = false ;
+ mModelLoader = NULL;
return ;
}
+ // Copy determinations about rig so UI will reflect them
+ //
+ setRigValidForJointPositionUpload(mModelLoader->isRigValidForJointPositionUpload());
+ setLegacyRigValid(mModelLoader->isLegacyRigValid());
+
mModelLoader->loadTextures() ;
- if (lod == -1)
+ if (loaded_lod == -1)
{ //populate all LoDs from model loader scene
mBaseModel.clear();
mBaseScene.clear();
@@ -3723,6 +1920,11 @@ void LLModelPreview::loadModelCallback(S32 lod)
//override displayed model with current LoD
list_iter->mModel = list_iter->mLOD[lod];
+ if (!list_iter->mModel)
+ {
+ continue;
+ }
+
//add current model to current LoD's model list (LLModel::mLocalID makes a good vector index)
S32 idx = list_iter->mModel->mLocalID;
@@ -3731,7 +1933,7 @@ void LLModelPreview::loadModelCallback(S32 lod)
mModel[lod].resize(idx+1);
}
- mModel[lod][idx] = list_iter->mModel;
+ mModel[lod][idx] = list_iter->mModel;
if (!list_iter->mModel->mSkinWeights.empty())
{
skin_weights = true;
@@ -3774,31 +1976,108 @@ void LLModelPreview::loadModelCallback(S32 lod)
}
else
{ //only replace given LoD
- mModel[lod] = mModelLoader->mModelList;
- mScene[lod] = mModelLoader->mScene;
- mVertexBuffer[lod].clear();
+ mModel[loaded_lod] = mModelLoader->mModelList;
+ mScene[loaded_lod] = mModelLoader->mScene;
+ mVertexBuffer[loaded_lod].clear();
- setPreviewLOD(lod);
+ setPreviewLOD(loaded_lod);
- if (lod == LLModel::LOD_HIGH)
+ if (loaded_lod == LLModel::LOD_HIGH)
{ //save a copy of the highest LOD for automatic LOD manipulation
if (mBaseModel.empty())
{ //first time we've loaded a model, auto-gen LoD
mGenLOD = true;
}
- mBaseModel = mModel[lod];
+ mBaseModel = mModel[loaded_lod];
clearGLODGroup();
- mBaseScene = mScene[lod];
+ mBaseScene = mScene[loaded_lod];
mVertexBuffer[5].clear();
}
+ else
+ {
+ BOOL importerDebug = gSavedSettings.getBOOL("ImporterDebug");
+ BOOL legacyMatching = gSavedSettings.getBOOL("ImporterLegacyMatching");
+ if (!legacyMatching)
+ {
+ if (!mBaseModel.empty())
+ {
+ BOOL name_based = FALSE;
+ BOOL has_submodels = FALSE;
+ for (U32 idx = 0; idx < mBaseModel.size(); ++idx)
+ {
+ if (mBaseModel[idx]->mSubmodelID)
+ { // don't do index-based renaming when the base model has submodels
+ has_submodels = TRUE;
+ if (importerDebug)
+ {
+ LL_INFOS() << "High LOD has submodels" << LL_ENDL;
+ }
+ break;
+ }
+ }
- clearIncompatible(lod);
+ for (U32 idx = 0; idx < mModel[loaded_lod].size(); ++idx)
+ {
+ std::string loaded_name = stripSuffix(mModel[loaded_lod][idx]->mLabel);
+
+ LLModel* found_model = NULL;
+ LLMatrix4 transform;
+ FindModel(mBaseScene, loaded_name, found_model, transform);
+ if (found_model)
+ { // don't rename correctly named models (even if they are placed in a wrong order)
+ name_based = TRUE;
+ }
+
+ if (mModel[loaded_lod][idx]->mSubmodelID)
+ { // don't rename the models when loaded LOD model has submodels
+ has_submodels = TRUE;
+ }
+ }
+
+ if (importerDebug)
+ {
+ LL_INFOS() << "Loaded LOD " << loaded_lod << ": correct names" << (name_based ? "" : "NOT ") << "found; submodels " << (has_submodels ? "" : "NOT ") << "found" << LL_ENDL;
+ }
+
+ if (!name_based && !has_submodels)
+ { // replace the name of the model loaded for any non-HIGH LOD to match the others (MAINT-5601)
+ // this actually works like "ImporterLegacyMatching" for this particular LOD
+ for (U32 idx = 0; idx < mModel[loaded_lod].size() && idx < mBaseModel.size(); ++idx)
+ {
+ std::string name = mBaseModel[idx]->mLabel;
+ std::string loaded_name = stripSuffix(mModel[loaded_lod][idx]->mLabel);
+
+ if (loaded_name != name)
+ {
+ switch (loaded_lod)
+ {
+ case LLModel::LOD_IMPOSTOR: name += "_LOD0"; break;
+ case LLModel::LOD_LOW: name += "_LOD1"; break;
+ case LLModel::LOD_MEDIUM: name += "_LOD2"; break;
+ case LLModel::LOD_PHYSICS: name += "_PHYS"; break;
+ case LLModel::LOD_HIGH: break;
+ }
+
+ if (importerDebug)
+ {
+ LL_WARNS() << "Loded model name " << mModel[loaded_lod][idx]->mLabel << " for LOD " << loaded_lod << " doesn't match the base model. Renaming to " << name << LL_ENDL;
+ }
+
+ mModel[loaded_lod][idx]->mLabel = name;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ clearIncompatible(loaded_lod);
mDirty = true;
- if (lod == LLModel::LOD_HIGH)
+ if (loaded_lod == LLModel::LOD_HIGH)
{
resetPreviewTarget();
}
@@ -3810,16 +2089,15 @@ void LLModelPreview::loadModelCallback(S32 lod)
mFMP->getChild<LLCheckBoxCtrl>("confirm_checkbox")->set(FALSE);
if (!mBaseModel.empty())
{
- if (mFMP->getChild<LLUICtrl>("description_form")->getValue().asString().empty())
- {
- const std::string& model_name = mBaseModel[0]->getName();
- mFMP->getChild<LLUICtrl>("description_form")->setValue(model_name);
- }
+ const std::string& model_name = mBaseModel[0]->getName();
+ mFMP->getChild<LLUICtrl>("description_form")->setValue(model_name);
}
}
refresh();
mModelLoadedSignal();
+
+ mModelLoader = NULL;
}
void LLModelPreview::resetPreviewTarget()
@@ -4168,6 +2446,20 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
mModel[lod][mdl_idx] = new LLModel(volume_params, 0.f);
+ std::string name = base->mLabel;
+
+ switch (lod)
+ {
+ case LLModel::LOD_IMPOSTOR: name += "_LOD0"; break;
+ case LLModel::LOD_LOW: name += "_LOD1"; break;
+ case LLModel::LOD_MEDIUM: name += "_LOD2"; break;
+ case LLModel::LOD_PHYSICS: name += "_PHYS"; break;
+ case LLModel::LOD_HIGH: break;
+ }
+
+ mModel[lod][mdl_idx]->mLabel = name;
+ mModel[lod][mdl_idx]->mSubmodelID = base->mSubmodelID;
+
GLint* sizes = new GLint[patch_count*2];
glodGetObjectParameteriv(mObject[base], GLOD_PATCH_SIZES, sizes);
stop_gloderror();
@@ -4280,17 +2572,6 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
{
shader->bind();
}
-
- /*if (which_lod == -1 && mScene[LLModel::LOD_PHYSICS].empty())
- { //build physics scene
- mScene[LLModel::LOD_PHYSICS] = mScene[LLModel::LOD_LOW];
- mModel[LLModel::LOD_PHYSICS] = mModel[LLModel::LOD_LOW];
-
- for (U32 i = 1; i < mModel[LLModel::LOD_PHYSICS].size(); ++i)
- {
- mPhysicsQ.push(mModel[LLModel::LOD_PHYSICS][i]);
- }
- }*/
}
void LLModelPreview::updateStatusMessages()
@@ -4307,43 +2588,89 @@ void LLModelPreview::updateStatusMessages()
S32 total_verts[LLModel::NUM_LODS];
S32 total_submeshes[LLModel::NUM_LODS];
- for (S32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
+ for (U32 i = 0; i < LLModel::NUM_LODS-1; i++)
+ {
+ total_tris[i] = 0;
+ total_verts[i] = 0;
+ total_submeshes[i] = 0;
+ }
+
+ for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
{
- //initialize total for this lod to 0
- total_tris[lod] = total_verts[lod] = total_submeshes[lod] = 0;
+ LLModelInstance& instance = *iter;
- for (LLModelLoader::scene::iterator iter = mScene[lod].begin(), endIter = mScene[lod].end(); iter != endIter; ++iter)
+ LLModel* model_high_lod = instance.mLOD[LLModel::LOD_HIGH];
+ if (!model_high_lod)
{
- 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();
+ setLoadState( LLModelLoader::ERROR_MATERIALS );
+ mFMP->childDisable( "calculate_btn" );
+ continue;
+ }
- 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;
- }
+ for (U32 i = 0; i < LLModel::NUM_LODS-1; i++)
+ {
+ LLModel* lod_model = instance.mLOD[i];
+ if (!lod_model)
+ {
+ setLoadState( LLModelLoader::ERROR_MATERIALS );
+ mFMP->childDisable( "calculate_btn" );
+ }
+
+ int refFaceCnt = 0;
+ int modelFaceCnt = 0;
- //add this model to the lod total
- total_tris[lod] += cur_tris;
- total_verts[lod] += cur_verts;
- total_submeshes[lod] += cur_submeshes;
+ if (!lod_model->matchMaterialOrder(model_high_lod, refFaceCnt, modelFaceCnt ) )
+ {
+ setLoadState( LLModelLoader::ERROR_MATERIALS );
+ mFMP->childDisable( "calculate_btn" );
+ }
+
+ if (lod_model)
+ {
+ //for each model in the lod
+ S32 cur_tris = 0;
+ S32 cur_verts = 0;
+ S32 cur_submeshes = lod_model->getNumVolumeFaces();
- //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);
+ for (S32 j = 0; j < cur_submeshes; ++j)
+ { //for each submesh (face), add triangles and vertices to current total
+ const LLVolumeFace& face = lod_model->getVolumeFace(j);
+ cur_tris += face.mNumIndices/3;
+ cur_verts += face.mNumVertices;
}
+
+ std::string instance_name = instance.mLabel;
+
+ BOOL importerDebug = gSavedSettings.getBOOL("ImporterDebug");
+ if (importerDebug)
+ {
+ // Useful for debugging generalized complaints below about total submeshes which don't have enough
+ // context to address exactly what needs to be fixed to move towards compliance with the rules.
+ //
+ LL_INFOS() << "Instance " << lod_model->mLabel << " LOD " << i << " Verts: " << cur_verts << LL_ENDL;
+ LL_INFOS() << "Instance " << lod_model->mLabel << " LOD " << i << " Tris: " << cur_tris << LL_ENDL;
+ LL_INFOS() << "Instance " << lod_model->mLabel << " LOD " << i << " Faces: " << cur_submeshes << LL_ENDL;
+
+ LLModel::material_list::iterator mat_iter = lod_model->mMaterialList.begin();
+ while (mat_iter != lod_model->mMaterialList.end())
+ {
+ LL_INFOS() << "Instance " << lod_model->mLabel << " LOD " << i << " Material " << *(mat_iter) << LL_ENDL;
+ mat_iter++;
+ }
+ }
+
+ //add this model to the lod total
+ total_tris[i] += cur_tris;
+ total_verts[i] += cur_verts;
+ total_submeshes[i] += cur_submeshes;
+
+ //store this model's counts to asset data
+ tris[i].push_back(cur_tris);
+ verts[i].push_back(cur_verts);
+ submeshes[i].push_back(cur_submeshes);
}
}
- }
+ }
if (mMaxTriangleLimit == 0)
{
@@ -4357,37 +2684,48 @@ void LLModelPreview::updateStatusMessages()
const LLVector4a scale(0.5f);
for (U32 i = 0; i < mModel[lod].size() && !has_degenerate; ++i)
{ //for each model in the lod
- if (mModel[lod][i]->mPhysics.mHull.empty())
+ if (mModel[lod][i] && mModel[lod][i]->mPhysics.mHull.empty())
{ //no decomp exists
S32 cur_submeshes = mModel[lod][i]->getNumVolumeFaces();
for (S32 j = 0; j < cur_submeshes && !has_degenerate; ++j)
{ //for each submesh (face), add triangles and vertices to current total
- const LLVolumeFace& face = mModel[lod][i]->getVolumeFace(j);
- for (S32 k = 0; k < face.mNumIndices && !has_degenerate; )
+ LLVolumeFace& face = mModel[lod][i]->getVolumeFace(j);
+ for (S32 k = 0; (k < face.mNumIndices) && !has_degenerate; )
{
- LLVector4a v1; v1.setMul(face.mPositions[face.mIndices[k++]], scale);
- LLVector4a v2; v2.setMul(face.mPositions[face.mIndices[k++]], scale);
- LLVector4a v3; v3.setMul(face.mPositions[face.mIndices[k++]], scale);
+ U16 index_a = face.mIndices[k+0];
+ U16 index_b = face.mIndices[k+1];
+ U16 index_c = face.mIndices[k+2];
+
+ LLVector4a v1; v1.setMul(face.mPositions[index_a], scale);
+ LLVector4a v2; v2.setMul(face.mPositions[index_b], scale);
+ LLVector4a v3; v3.setMul(face.mPositions[index_c], scale);
if (ll_is_degenerate(v1,v2,v3))
{
has_degenerate = true;
}
+ else
+ {
+ k += 3;
+ }
}
}
}
}
}
-
+
mFMP->childSetTextArg("submeshes_info", "[SUBMESHES]", llformat("%d", total_submeshes[LLModel::LOD_HIGH]));
std::string mesh_status_na = mFMP->getString("mesh_status_na");
S32 upload_status[LLModel::LOD_HIGH+1];
- bool upload_ok = true;
+ mModelNoErrors = true;
- for (S32 lod = 0; lod <= LLModel::LOD_HIGH; ++lod)
+ const U32 lod_high = LLModel::LOD_HIGH;
+ U32 high_submodel_count = mModel[lod_high].size() - countRootModels(mModel[lod_high]);
+
+ for (S32 lod = 0; lod <= lod_high; ++lod)
{
upload_status[lod] = 0;
@@ -4400,7 +2738,7 @@ void LLModelPreview::updateStatusMessages()
}
else
{
- if (lod == LLModel::LOD_HIGH)
+ if (lod == lod_high)
{
upload_status[lod] = 2;
message = "mesh_status_missing_lod";
@@ -4421,8 +2759,6 @@ void LLModelPreview::updateStatusMessages()
mFMP->childSetValue(lod_vertices_name[lod], mesh_status_na);
}
- const U32 lod_high = LLModel::LOD_HIGH;
-
if (lod != lod_high)
{
if (total_submeshes[lod] && total_submeshes[lod] != total_submeshes[lod_high])
@@ -4430,6 +2766,13 @@ void LLModelPreview::updateStatusMessages()
message = "mesh_status_submesh_mismatch";
upload_status[lod] = 2;
}
+ else if (mModel[lod].size() - countRootModels(mModel[lod]) != high_submodel_count)
+ {//number of submodels is different, not all faces are matched correctly.
+ message = "mesh_status_submesh_mismatch";
+ upload_status[lod] = 2;
+ // Note: Submodels in instance were loaded from higher LOD and as result face count
+ // returns same value and total_submeshes[lod] is identical to high_lod one.
+ }
else if (!tris[lod].empty() && tris[lod].size() != tris[lod_high].size())
{ //number of meshes is different
message = "mesh_status_mesh_mismatch";
@@ -4450,7 +2793,7 @@ void LLModelPreview::updateStatusMessages()
{
//too many vertices in this lod
message = "mesh_status_too_many_vertices";
- upload_status[lod] = 2;
+ upload_status[lod] = 1;
}
}
}
@@ -4462,7 +2805,7 @@ void LLModelPreview::updateStatusMessages()
if (upload_status[lod] >= 2)
{
- upload_ok = false;
+ mModelNoErrors = false;
}
if (lod == mPreviewLOD)
@@ -4476,23 +2819,41 @@ void LLModelPreview::updateStatusMessages()
}
- //make sure no hulls have more than 256 points in them
- for (U32 i = 0; upload_ok && i < mModel[LLModel::LOD_PHYSICS].size(); ++i)
+ //warn if hulls have more than 256 points in them
+ BOOL physExceededVertexLimit = FALSE;
+ for (U32 i = 0; mModelNoErrors && i < mModel[LLModel::LOD_PHYSICS].size(); ++i)
{
LLModel* mdl = mModel[LLModel::LOD_PHYSICS][i];
- for (U32 j = 0; upload_ok && j < mdl->mPhysics.mHull.size(); ++j)
+ if (mdl)
{
- if (mdl->mPhysics.mHull[j].size() > 256)
+ for (U32 j = 0; j < mdl->mPhysics.mHull.size(); ++j)
{
- upload_ok = false;
+ if (mdl->mPhysics.mHull[j].size() > 256)
+ {
+ physExceededVertexLimit = TRUE;
+ LL_INFOS() << "Physical model " << mdl->mLabel << " exceeds vertex per hull limitations." << LL_ENDL;
+ break;
+ }
}
}
}
+ mFMP->childSetVisible("physics_status_message_text", physExceededVertexLimit);
+ LLIconCtrl* physStatusIcon = mFMP->getChild<LLIconCtrl>("physics_status_message_icon");
+ physStatusIcon->setVisible(physExceededVertexLimit);
+ if (physExceededVertexLimit)
+ {
+ mFMP->childSetValue("physics_status_message_text", mFMP->getString("phys_status_vertex_limit_exceeded"));
+ LLUIImagePtr img = LLUI::getUIImage("ModelImport_Status_Warning");
+ physStatusIcon->setImage(img);
+ }
- bool errorStateFromLoader = getLoadState() >= LLModelLoader::ERROR_PARSING ? true : false;
+ if (getLoadState() >= LLModelLoader::ERROR_PARSING)
+ {
+ mModelNoErrors = false;
+ LL_INFOS() << "Loader returned errors, model can't be uploaded" << LL_ENDL;
+ }
- bool skinAndRigOk = true;
bool uploadingSkin = mFMP->childGetValue("upload_skin").asBoolean();
bool uploadingJointPositions = mFMP->childGetValue("upload_joints").asBoolean();
@@ -4500,19 +2861,23 @@ void LLModelPreview::updateStatusMessages()
{
if ( uploadingJointPositions && !isRigValidForJointPositionUpload() )
{
- skinAndRigOk = false;
- }
+ mModelNoErrors = false;
+ LL_INFOS() << "Invalid rig, there might be issues with uploading Joint positions" << LL_ENDL;
+ }
}
-
- if(upload_ok && mModelLoader)
+
+ if(mModelNoErrors && mModelLoader)
{
if(!mModelLoader->areTexturesReady() && mFMP->childGetValue("upload_textures").asBoolean())
{
- upload_ok = false ;
+ // Some textures are still loading, prevent upload until they are done
+ mModelNoErrors = false;
}
}
- if (!upload_ok || errorStateFromLoader || !skinAndRigOk || has_degenerate)
+ // Todo: investigate use of has_degenerate and include into mModelNoErrors upload blocking mechanics
+ // current use of has_degenerate won't block upload permanently - later checks will restore the button
+ if (!mModelNoErrors || has_degenerate)
{
mFMP->childDisable("ok_btn");
}
@@ -4854,7 +3219,8 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
LLModel* base_mdl = *base_iter;
base_iter++;
- for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
+ S32 num_faces = mdl->getNumVolumeFaces();
+ for (S32 i = 0; i < num_faces; ++i)
{
const LLVolumeFace &vf = mdl->getVolumeFace(i);
U32 num_vertices = vf.mNumVertices;
@@ -4949,23 +3315,23 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
void LLModelPreview::update()
{
- if (mDirty)
+ if (mGenLOD)
{
- mDirty = false;
- mResourceCost = calcResourceCost();
+ mGenLOD = false;
+ genLODs();
refresh();
updateStatusMessages();
}
- if (mGenLOD)
+ if (mDirty)
{
- mGenLOD = false;
- genLODs();
+ mDirty = false;
+ mResourceCost = calcResourceCost();
refresh();
updateStatusMessages();
}
-
}
+
//-----------------------------------------------------------------------------
// getTranslationForJointOffset()
//-----------------------------------------------------------------------------
@@ -4999,10 +3365,79 @@ void LLModelPreview::createPreviewAvatar( void )
}
else
{
- LL_INFOS()<<"Failed to create preview avatar for upload model window"<<LL_ENDL;
+ LL_INFOS() << "Failed to create preview avatar for upload model window" << LL_ENDL;
}
}
+//static
+U32 LLModelPreview::countRootModels(LLModelLoader::model_list models)
+{
+ U32 root_models = 0;
+ model_list::iterator model_iter = models.begin();
+ while (model_iter != models.end())
+ {
+ LLModel* mdl = *model_iter;
+ if (mdl && mdl->mSubmodelID == 0)
+ {
+ root_models++;
+ }
+ model_iter++;
+ }
+ return root_models;
+}
+
+void LLModelPreview::loadedCallback(
+ LLModelLoader::scene& scene,
+ LLModelLoader::model_list& model_list,
+ S32 lod,
+ void* opaque)
+{
+ LLModelPreview* pPreview = static_cast< LLModelPreview* >(opaque);
+ if (pPreview && !LLModelPreview::sIgnoreLoadedCallback)
+ {
+ pPreview->loadModelCallback(lod);
+ }
+}
+
+void LLModelPreview::stateChangedCallback(U32 state,void* opaque)
+{
+ LLModelPreview* pPreview = static_cast< LLModelPreview* >(opaque);
+ if (pPreview)
+ {
+ pPreview->setLoadState(state);
+ }
+}
+
+LLJoint* LLModelPreview::lookupJointByName(const std::string& str, void* opaque)
+{
+ LLModelPreview* pPreview = static_cast< LLModelPreview* >(opaque);
+ if (pPreview)
+ {
+ return pPreview->getPreviewAvatar()->getJoint(str);
+ }
+ return NULL;
+}
+
+U32 LLModelPreview::loadTextures(LLImportMaterial& material,void* opaque)
+{
+ (void)opaque;
+
+ if (material.mDiffuseMapFilename.size())
+ {
+ material.mOpaqueData = new LLPointer< LLViewerFetchedTexture >;
+ LLPointer< LLViewerFetchedTexture >& tex = (*reinterpret_cast< LLPointer< LLViewerFetchedTexture > * >(material.mOpaqueData));
+
+ tex = LLViewerTextureManager::getFetchedTextureFromUrl("file://" + material.mDiffuseMapFilename, FTT_LOCAL_FILE, TRUE, LLGLTexture::BOOST_PREVIEW);
+ tex->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, TRUE, FALSE, opaque, NULL, FALSE);
+ tex->forceToSaveRawImage(0, F32_MAX);
+ material.setDiffuseMap(tex->getID()); // record tex ID
+ return 1;
+ }
+
+ material.mOpaqueData = NULL;
+ return 0;
+}
+
void LLModelPreview::addEmptyFace( LLModel* pTarget )
{
U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
@@ -5138,8 +3573,11 @@ BOOL LLModelPreview::render()
mViewOption["show_skin_weight"] = false;
fmp->disableViewOption("show_skin_weight");
fmp->disableViewOption("show_joint_positions");
+
+ skin_weight = false;
+ mFMP->childSetValue("show_skin_weight", false);
+ fmp->setViewOptionEnabled("show_skin_weight", skin_weight);
}
- skin_weight = false;
}
if (upload_skin && !has_skin_weights)
@@ -5243,29 +3681,20 @@ BOOL LLModelPreview::render()
const LLVertexBuffer* buff = vb_vec[0];
regen = buff->hasDataType(LLVertexBuffer::TYPE_WEIGHT4) != skin_weight;
}
- }
-
- //make sure material lists all match
- for (U32 i = 0; i < LLModel::NUM_LODS-1; i++)
- {
- if (mBaseModel.size() == mModel[i].size())
+ else
{
- for (U32 j = 0; j < mBaseModel.size(); ++j)
- {
- int refFaceCnt = 0;
- int modelFaceCnt = 0;
-
- if ( !mModel[i][j]->matchMaterialOrder(mBaseModel[j], refFaceCnt, modelFaceCnt ) )
- {
- mFMP->childDisable( "calculate_btn" );
- }
- }
+ LL_INFOS(" ") << "Vertex Buffer[" << mPreviewLOD << "]" << " is EMPTY!!!" << LL_ENDL;
+ regen = TRUE;
}
}
if (regen)
{
genBuffers(mPreviewLOD, skin_weight);
+ {
+ LL_INFOS() << "Vertex Buffer[" << mPreviewLOD << "]" << " is EMPTY!!!" << LL_ENDL;
+ regen = TRUE;
+ }
}
if (!skin_weight)
@@ -5276,62 +3705,63 @@ BOOL LLModelPreview::render()
LLModel* model = instance.mLOD[mPreviewLOD];
- if (!model)
- {
- continue;
- }
+ if (!model)
+ {
+ continue;
+ }
- gGL.pushMatrix();
- LLMatrix4 mat = instance.mTransform;
+ gGL.pushMatrix();
+ LLMatrix4 mat = instance.mTransform;
- gGL.multMatrix((GLfloat*) mat.mMatrix);
+ gGL.multMatrix((GLfloat*) mat.mMatrix);
- for (U32 i = 0; i < mVertexBuffer[mPreviewLOD][model].size(); ++i)
- {
- LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i];
-
- buffer->setBuffer(type_mask & buffer->getTypeMask());
- if (textures)
+ U32 num_models = mVertexBuffer[mPreviewLOD][model].size();
+ for (U32 i = 0; i < num_models; ++i)
{
- int materialCnt = instance.mModel->mMaterialList.size();
- if ( i < materialCnt )
+ LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i];
+
+ buffer->setBuffer(type_mask & buffer->getTypeMask());
+
+ if (textures)
{
- const std::string& binding = instance.mModel->mMaterialList[i];
- const LLImportMaterial& material = instance.mMaterial[binding];
+ int materialCnt = instance.mModel->mMaterialList.size();
+ if ( i < materialCnt )
+ {
+ const std::string& binding = instance.mModel->mMaterialList[i];
+ const LLImportMaterial& material = instance.mMaterial[binding];
- gGL.diffuseColor4fv(material.mDiffuseColor.mV);
+ gGL.diffuseColor4fv(material.mDiffuseColor.mV);
- if (material.mDiffuseMap.notNull())
- {
- if (material.mDiffuseMap->getDiscardLevel() > -1)
+ // Find the tex for this material, bind it, and add it to our set
+ //
+ LLViewerFetchedTexture* tex = bindMaterialDiffuseTexture(material);
+ if (tex)
{
- gGL.getTexUnit(0)->bind(material.mDiffuseMap, true);
- mTextureSet.insert(material.mDiffuseMap.get());
+ mTextureSet.insert(tex);
}
}
}
- }
- else
- {
- gGL.diffuseColor4f(1,1,1,1);
- }
-
- buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
+ else
+ {
+ gGL.diffuseColor4f(1,1,1,1);
+ }
- if (edges)
- {
- glLineWidth(3.f);
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- glLineWidth(1.f);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
+
+ if (edges)
+ {
+ glLineWidth(3.f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glLineWidth(1.f);
+ }
}
+ gGL.popMatrix();
}
- gGL.popMatrix();
- }
if (physics)
{
@@ -5359,97 +3789,99 @@ BOOL LLModelPreview::render()
LLModel* model = instance.mLOD[LLModel::LOD_PHYSICS];
- if (!model)
- {
- continue;
- }
+ if (!model)
+ {
+ continue;
+ }
- gGL.pushMatrix();
- LLMatrix4 mat = instance.mTransform;
+ gGL.pushMatrix();
+ LLMatrix4 mat = instance.mTransform;
gGL.multMatrix((GLfloat*) mat.mMatrix);
- bool render_mesh = true;
+ bool render_mesh = true;
- LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread;
- if (decomp)
- {
- LLMutexLock(decomp->mMutex);
+ LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread;
+ if (decomp)
+ {
+ LLMutexLock(decomp->mMutex);
- LLModel::Decomposition& physics = model->mPhysics;
+ LLModel::Decomposition& physics = model->mPhysics;
- if (!physics.mHull.empty())
- {
- render_mesh = false;
+ if (!physics.mHull.empty())
+ {
+ render_mesh = false;
- if (physics.mMesh.empty())
- { //build vertex buffer for physics mesh
- gMeshRepo.buildPhysicsMesh(physics);
- }
+ if (physics.mMesh.empty())
+ { //build vertex buffer for physics mesh
+ gMeshRepo.buildPhysicsMesh(physics);
+ }
- if (!physics.mMesh.empty())
- { //render hull instead of mesh
- for (U32 i = 0; i < physics.mMesh.size(); ++i)
- {
- if (explode > 0.f)
+ if (!physics.mMesh.empty())
+ { //render hull instead of mesh
+ for (U32 i = 0; i < physics.mMesh.size(); ++i)
{
- gGL.pushMatrix();
+ if (explode > 0.f)
+ {
+ gGL.pushMatrix();
- LLVector3 offset = model->mHullCenter[i]-model->mCenterOfHullCenters;
- offset *= explode;
+ LLVector3 offset = model->mHullCenter[i]-model->mCenterOfHullCenters;
+ offset *= explode;
- gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]);
- }
+ gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]);
+ }
- static std::vector<LLColor4U> hull_colors;
+ static std::vector<LLColor4U> hull_colors;
- if (i+1 >= hull_colors.size())
- {
- hull_colors.push_back(LLColor4U(rand()%128+127, rand()%128+127, rand()%128+127, 128));
- }
+ if (i+1 >= hull_colors.size())
+ {
+ hull_colors.push_back(LLColor4U(rand()%128+127, rand()%128+127, rand()%128+127, 128));
+ }
- gGL.diffuseColor4ubv(hull_colors[i].mV);
- LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals);
+ gGL.diffuseColor4ubv(hull_colors[i].mV);
+ LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals);
- if (explode > 0.f)
- {
- gGL.popMatrix();
+ if (explode > 0.f)
+ {
+ gGL.popMatrix();
+ }
}
}
}
}
- }
-
- if (render_mesh)
- {
- if (mVertexBuffer[LLModel::LOD_PHYSICS].empty())
- {
- genBuffers(LLModel::LOD_PHYSICS, false);
- }
- for (U32 i = 0; i < mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); ++i)
+
+ if (render_mesh)
{
- LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i];
+ if (mVertexBuffer[LLModel::LOD_PHYSICS].empty())
+ {
+ genBuffers(LLModel::LOD_PHYSICS, false);
+ }
+
+ U32 num_models = mVertexBuffer[LLModel::LOD_PHYSICS][model].size();
+ for (U32 i = 0; i < num_models; ++i)
+ {
+ LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i];
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.diffuseColor4f(0.4f, 0.4f, 0.0f, 0.4f);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.diffuseColor4f(0.4f, 0.4f, 0.0f, 0.4f);
- buffer->setBuffer(type_mask & buffer->getTypeMask());
- buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
+ buffer->setBuffer(type_mask & buffer->getTypeMask());
+ buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
- gGL.diffuseColor3f(1.f, 1.f, 0.f);
+ gGL.diffuseColor3f(1.f, 1.f, 0.f);
- glLineWidth(2.f);
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
+ glLineWidth(2.f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- glLineWidth(1.f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glLineWidth(1.f);
+ }
}
- }
- gGL.popMatrix();
- }
+ gGL.popMatrix();
+ }
glLineWidth(3.f);
glPointSize(8.f);
@@ -5561,7 +3993,7 @@ BOOL LLModelPreview::render()
if (!model->mSkinWeights.empty())
{
- for (U32 i = 0; i < mVertexBuffer[mPreviewLOD][model].size(); ++i)
+ for (U32 i = 0, e = mVertexBuffer[mPreviewLOD][model].size(); i < e; ++i)
{
LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i];
@@ -5630,19 +4062,20 @@ BOOL LLModelPreview::render()
position[j] = v;
}
+ llassert(model->mMaterialList.size() > i);
const std::string& binding = instance.mModel->mMaterialList[i];
const LLImportMaterial& material = instance.mMaterial[binding];
buffer->setBuffer(type_mask & buffer->getTypeMask());
gGL.diffuseColor4fv(material.mDiffuseColor.mV);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- if (material.mDiffuseMap.notNull())
+
+ // Find the tex for this material, bind it, and add it to our set
+ //
+ LLViewerFetchedTexture* tex = bindMaterialDiffuseTexture(material);
+ if (tex)
{
- if (material.mDiffuseMap->getDiscardLevel() > -1)
- {
- gGL.getTexUnit(0)->bind(material.mDiffuseMap, true);
- mTextureSet.insert(material.mDiffuseMap.get());
- }
+ mTextureSet.insert(tex);
}
buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);
@@ -5757,14 +4190,14 @@ void LLFloaterModelPreview::onReset(void* user_data)
LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) user_data;
fmp->childDisable("reset_btn");
LLModelPreview* mp = fmp->mModelPreview;
- std::string filename = mp->mLODFile[3];
+ std::string filename = mp->mLODFile[LLModel::LOD_HIGH];
fmp->resetDisplayOptions();
//reset model preview
fmp->initModelPreview();
mp = fmp->mModelPreview;
- mp->loadModel(filename,3,true);
+ mp->loadModel(filename,LLModel::LOD_HIGH,true);
}
//static
@@ -5858,7 +4291,7 @@ void LLFloaterModelPreview::toggleCalculateButton(bool visible)
}
mUploadBtn->setVisible(!visible);
- mUploadBtn->setEnabled(mHasUploadPerm && !mUploadModelUrl.empty());
+ mUploadBtn->setEnabled(isModelUploadAllowed());
if (visible)
{
@@ -5924,7 +4357,7 @@ void LLFloaterModelPreview::handleModelPhysicsFeeReceived()
childSetTextArg("price_breakdown", "[MODEL]", llformat("%d", result["upload_price_breakdown"]["model"].asInteger()));
childSetVisible("upload_fee", true);
childSetVisible("price_breakdown", true);
- mUploadBtn->setEnabled(mHasUploadPerm && !mUploadModelUrl.empty());
+ mUploadBtn->setEnabled(isModelUploadAllowed());
}
void LLFloaterModelPreview::setModelPhysicsFeeErrorStatus(S32 status, const std::string& reason)
@@ -5948,6 +4381,16 @@ void LLFloaterModelPreview::onModelUploadFailure()
mUploadBtn->setEnabled(true);
}
+bool LLFloaterModelPreview::isModelUploadAllowed()
+{
+ bool allow_upload = mHasUploadPerm && !mUploadModelUrl.empty();
+ if (mModelPreview)
+ {
+ allow_upload &= mModelPreview->mModelNoErrors;
+ }
+ return allow_upload;
+}
+
S32 LLFloaterModelPreview::DecompRequest::statusCallback(const char* status, S32 p1, S32 p2)
{
if (mContinue)
@@ -5997,8 +4440,8 @@ void LLFloaterModelPreview::onPermissionsReceived(const LLSD& result)
// BAP HACK: handle "" for case that MeshUploadFlag cap is broken.
mHasUploadPerm = (("" == upload_status) || ("valid" == upload_status));
- //mUploadBtn->setEnabled(mHasUploadPerm);
- mUploadBtn->setEnabled(mHasUploadPerm && !mUploadModelUrl.empty());
+ // isModelUploadAllowed() includes mHasUploadPerm
+ mUploadBtn->setEnabled(isModelUploadAllowed());
getChild<LLTextBox>("warning_title")->setVisible(!mHasUploadPerm);
getChild<LLTextBox>("warning_message")->setVisible(!mHasUploadPerm);
}
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index 618748bd4e..7a518c798b 100755
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -37,6 +37,8 @@
#include "llviewermenufile.h"
#include "llfloatermodeluploadbase.h"
+#include "lldaeloader.h"
+
class LLComboBox;
class LLJoint;
class LLViewerJointMesh;
@@ -45,103 +47,18 @@ class LLTextBox;
class LLVertexBuffer;
class LLModelPreview;
class LLFloaterModelPreview;
+class DAE;
class daeElement;
class domProfile_COMMON;
class domInstance_geometry;
class domNode;
class domTranslate;
class domController;
+class domSkin;
+class domMesh;
class LLMenuButton;
class LLToggleableMenu;
-typedef std::map<std::string, LLMatrix4> JointTransformMap;
-typedef std::map<std::string, LLMatrix4>:: iterator JointTransformMapIt;
-
-const S32 NUM_LOD = 4;
-
-class LLModelLoader : public LLThread
-{
-public:
- typedef enum
- {
- STARTING = 0,
- READING_FILE,
- CREATING_FACES,
- GENERATING_VERTEX_BUFFERS,
- GENERATING_LOD,
- DONE,
- ERROR_PARSING, //basically loading failed
- ERROR_MATERIALS,
- } eLoadState;
-
- U32 mState;
- std::string mFilename;
- S32 mLod;
- LLModelPreview* mPreview;
- LLMatrix4 mTransform;
- BOOL mFirstTransform;
- LLVector3 mExtents[2];
- bool mTrySLM;
-
- std::map<daeElement*, LLPointer<LLModel> > mModel;
-
- typedef std::vector<LLPointer<LLModel> > model_list;
- model_list mModelList;
-
- typedef std::vector<LLModelInstance> model_instance_list;
-
- typedef std::map<LLMatrix4, model_instance_list > scene;
-
- scene mScene;
-
- typedef std::queue<LLPointer<LLModel> > model_queue;
-
- //queue of models that need a physics rep
- model_queue mPhysicsQ;
-
- LLModelLoader( std::string filename, S32 lod, LLModelPreview* preview, JointTransformMap& jointMap,
- std::deque<std::string>& jointsFromNodes );
- ~LLModelLoader() ;
-
- virtual void run();
- bool doLoadModel();
- bool loadFromSLM(const std::string& filename);
- void loadModelCallback();
-
- void loadTextures() ; //called in the main thread.
- void processElement(daeElement* element, bool& badElement);
- std::map<std::string, LLImportMaterial> getMaterials(LLModel* model, domInstance_geometry* instance_geo);
- LLImportMaterial profileToMaterial(domProfile_COMMON* material);
- std::string getElementLabel(daeElement *element);
- LLColor4 getDaeColor(daeElement* element);
-
- daeElement* getChildFromElement( daeElement* pElement, std::string const & name );
-
- bool isNodeAJoint( domNode* pNode );
- void processJointNode( domNode* pNode, std::map<std::string,LLMatrix4>& jointTransforms );
- void extractTranslation( domTranslate* pTranslate, LLMatrix4& transform );
- void extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform );
- void extractTranslationViaSID( daeElement* pElement, LLMatrix4& transform );
-
- void setLoadState(U32 state);
-
- void buildJointToNodeMappingFromScene( daeElement* pRoot );
- void processJointToNodeMapping( domNode* pNode );
- void processChildJoints( domNode* pParentNode );
-
- //map of avatar joints as named in COLLADA assets to internal joint names
- std::map<std::string, std::string> mJointMap;
- JointTransformMap& mJointList;
- std::deque<std::string>& mJointsFromNode;
-
- S32 mNumOfFetchingTextures ; //updated in the main thread
- bool areTexturesReady() { return !mNumOfFetchingTextures; } //called in the main thread.
-
-private:
- static std::list<LLModelLoader*> sActiveLoaderList;
- static bool isAlive(LLModelLoader* loader) ;
-};
-
class LLFloaterModelPreview : public LLFloaterModelUploadBase
{
public:
@@ -172,6 +89,7 @@ public:
BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
/*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
static void onMouseCaptureLostModelPreview(LLMouseHandler*);
static void setUploadAmount(S32 amount) { sUploadAmount = amount; }
@@ -210,6 +128,8 @@ public:
/*virtual*/ void onModelUploadFailure();
+ bool isModelUploadAllowed();
+
protected:
friend class LLModelPreview;
friend class LLMeshFilePicker;
@@ -359,21 +279,14 @@ public:
void setHasPivot( bool val ) { mHasPivot = val; }
void setModelPivot( const LLVector3& pivot ) { mModelPivot = pivot; }
- //Determines the viability of an asset to be used as an avatar rig (w or w/o joint upload caps)
- void critiqueRigForUploadApplicability( const std::vector<std::string> &jointListFromAsset );
- void critiqueJointToNodeMappingFromScene( void );
//Is a rig valid so that it can be used as a criteria for allowing for uploading of joint positions
//Accessors for joint position upload friendly rigs
const bool isRigValidForJointPositionUpload( void ) const { return mRigValidJointUpload; }
void setRigValidForJointPositionUpload( bool rigValid ) { mRigValidJointUpload = rigValid; }
- bool isRigSuitableForJointPositionUpload( const std::vector<std::string> &jointListFromAsset );
- //Determines if a rig is a legacy from the joint list
- bool isRigLegacy( const std::vector<std::string> &jointListFromAsset );
+
//Accessors for the legacy rigs
const bool isLegacyRigValid( void ) const { return mLegacyRigValid; }
- void setLegacyRigValid( bool rigValid ) { mLegacyRigValid = rigValid; }
- //Verify that a controller matches vertex counts
- bool verifyController( domController* pController );
+ void setLegacyRigValid( bool rigValid ) { mLegacyRigValid = rigValid; }
static void textureLoadedCallback( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
@@ -388,6 +301,16 @@ public:
LLVector3 getTranslationForJointOffset( std::string joint );
+ static bool sIgnoreLoadedCallback;
+
+protected:
+
+ static void loadedCallback(LLModelLoader::scene& scene,LLModelLoader::model_list& model_list, S32 lod, void* opaque);
+ static void stateChangedCallback(U32 state, void* opaque);
+
+ static LLJoint* lookupJointByName(const std::string&, void* opaque);
+ static U32 loadTextures(LLImportMaterial& material, void* opaque);
+
private:
//Utility function for controller vertex compare
bool verifyCount( int expected, int result );
@@ -395,6 +318,8 @@ private:
void createPreviewAvatar( void );
//Accessor for the dummy avatar
LLVOAvatar* getPreviewAvatar( void ) { return mPreviewAvatar; }
+ // Count amount of original models, excluding sub-models
+ static U32 countRootModels(LLModelLoader::model_list models);
protected:
friend class LLModelLoader;
@@ -416,13 +341,15 @@ private:
LLVector3 mPreviewTarget;
LLVector3 mPreviewScale;
S32 mPreviewLOD;
+ S32 mPhysicsSearchLOD;
U32 mResourceCost;
std::string mLODFile[LLModel::NUM_LODS];
bool mLoading;
U32 mLoadState;
bool mResetJoints;
bool mRigParityWithScene;
-
+ bool mModelNoErrors;
+
std::map<std::string, bool> mViewOption;
//GLOD object parameters (must rebuild object if these change)
@@ -459,7 +386,7 @@ private:
U32 mMaxTriangleLimit;
LLMeshUploadThread::instance_list mUploadData;
- std::set<LLViewerFetchedTexture* > mTextureSet;
+ std::set<LLViewerFetchedTexture * > mTextureSet;
//map of vertex buffers to models (one vertex buffer in vector per face in model
std::map<LLModel*, std::vector<LLPointer<LLVertexBuffer> > > mVertexBuffer[LLModel::NUM_LODS+1];
@@ -478,10 +405,9 @@ private:
bool mLastJointUpdate;
- std::deque<std::string> mMasterJointList;
- std::deque<std::string> mMasterLegacyJointList;
- std::deque<std::string> mJointsFromNode;
- JointTransformMap mJointTransformMap;
+ JointSet mJointsFromNode;
+ JointTransformMap mJointTransformMap;
+
LLPointer<LLVOAvatar> mPreviewAvatar;
};
diff --git a/indra/newview/llfloaternotificationstabbed.cpp b/indra/newview/llfloaternotificationstabbed.cpp
new file mode 100644
index 0000000000..4b5fe4989a
--- /dev/null
+++ b/indra/newview/llfloaternotificationstabbed.cpp
@@ -0,0 +1,575 @@
+/**
+ * @file llfloaternotificationstabbed.cpp
+ * @brief
+ * $LicenseInfo:firstyear=2015&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2015, 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 "llfloaternotificationstabbed.h"
+
+#include "llchiclet.h"
+#include "llchicletbar.h"
+#include "llflatlistview.h"
+#include "llfloaterreg.h"
+#include "llnotificationmanager.h"
+#include "llnotificationsutil.h"
+#include "llscriptfloater.h"
+#include "llspeakers.h"
+#include "lltoastpanel.h"
+#include "lltoastnotifypanel.h"
+
+//---------------------------------------------------------------------------------
+LLFloaterNotificationsTabbed::LLFloaterNotificationsTabbed(const LLSD& key) : LLTransientDockableFloater(NULL, true, key),
+ mChannel(NULL),
+ mSysWellChiclet(NULL),
+ mGroupInviteMessageList(NULL),
+ mGroupNoticeMessageList(NULL),
+ mTransactionMessageList(NULL),
+ mSystemMessageList(NULL),
+ mNotificationsSeparator(NULL),
+ mNotificationsTabContainer(NULL),
+ NOTIFICATION_TABBED_ANCHOR_NAME("notification_well_panel"),
+ IM_WELL_ANCHOR_NAME("im_well_panel"),
+ mIsReshapedByUser(false)
+
+{
+ setOverlapsScreenChannel(true);
+ mNotificationUpdates.reset(new NotificationTabbedChannel(this));
+ mNotificationsSeparator = new LLNotificationSeparator();
+}
+
+//---------------------------------------------------------------------------------
+BOOL LLFloaterNotificationsTabbed::postBuild()
+{
+ mGroupInviteMessageList = getChild<LLNotificationListView>("group_invite_notification_list");
+ mGroupNoticeMessageList = getChild<LLNotificationListView>("group_notice_notification_list");
+ mTransactionMessageList = getChild<LLNotificationListView>("transaction_notification_list");
+ mSystemMessageList = getChild<LLNotificationListView>("system_notification_list");
+ mNotificationsSeparator->initTaggedList(LLNotificationListItem::getGroupInviteTypes(), mGroupInviteMessageList);
+ mNotificationsSeparator->initTaggedList(LLNotificationListItem::getGroupNoticeTypes(), mGroupNoticeMessageList);
+ mNotificationsSeparator->initTaggedList(LLNotificationListItem::getTransactionTypes(), mTransactionMessageList);
+ mNotificationsSeparator->initUnTaggedList(mSystemMessageList);
+ mNotificationsTabContainer = getChild<LLTabContainer>("notifications_tab_container");
+
+ mDeleteAllBtn = getChild<LLButton>("delete_all_button");
+ mDeleteAllBtn->setClickedCallback(boost::bind(&LLFloaterNotificationsTabbed::onClickDeleteAllBtn,this));
+
+ mCollapseAllBtn = getChild<LLButton>("collapse_all_button");
+ mCollapseAllBtn->setClickedCallback(boost::bind(&LLFloaterNotificationsTabbed::onClickCollapseAllBtn,this));
+
+ // get a corresponding channel
+ initChannel();
+ BOOL rv = LLTransientDockableFloater::postBuild();
+
+ setTitle(getString("title_notification_tabbed_window"));
+ return rv;
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::setMinimized(BOOL minimize)
+{
+ LLTransientDockableFloater::setMinimized(minimize);
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::handleReshape(const LLRect& rect, bool by_user)
+{
+ mIsReshapedByUser |= by_user; // mark floater that it is reshaped by user
+ LLTransientDockableFloater::handleReshape(rect, by_user);
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::onStartUpToastClick(S32 x, S32 y, MASK mask)
+{
+ // just set floater visible. Screen channels will be cleared.
+ setVisible(TRUE);
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::setSysWellChiclet(LLSysWellChiclet* chiclet)
+{
+ mSysWellChiclet = chiclet;
+ if(NULL != mSysWellChiclet)
+ {
+ mSysWellChiclet->updateWidget(isWindowEmpty());
+ }
+}
+
+//---------------------------------------------------------------------------------
+LLFloaterNotificationsTabbed::~LLFloaterNotificationsTabbed()
+{
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::removeItemByID(const LLUUID& id, std::string type)
+{
+ if(mNotificationsSeparator->removeItemByID(type, id))
+ {
+ if (NULL != mSysWellChiclet)
+ {
+ mSysWellChiclet->updateWidget(isWindowEmpty());
+ }
+ reshapeWindow();
+ updateNotificationCounters();
+ }
+ else
+ {
+ LL_WARNS() << "Unable to remove notification from the list, ID: " << id
+ << LL_ENDL;
+ }
+
+ // hide chiclet window if there are no items left
+ if(isWindowEmpty())
+ {
+ setVisible(FALSE);
+ }
+}
+
+//---------------------------------------------------------------------------------
+LLPanel * LLFloaterNotificationsTabbed::findItemByID(const LLUUID& id, std::string type)
+{
+ return mNotificationsSeparator->findItemByID(type, id);
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::initChannel()
+{
+ LLNotificationsUI::LLScreenChannelBase* channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(
+ LLUUID(gSavedSettings.getString("NotificationChannelUUID")));
+ mChannel = dynamic_cast<LLNotificationsUI::LLScreenChannel*>(channel);
+ if(NULL == mChannel)
+ {
+ LL_WARNS() << "LLSysWellWindow::initChannel() - could not get a requested screen channel" << LL_ENDL;
+ }
+
+ if(mChannel)
+ {
+ mChannel->addOnStoreToastCallback(boost::bind(&LLFloaterNotificationsTabbed::onStoreToast, this, _1, _2));
+ }
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::setVisible(BOOL visible)
+{
+ if (visible)
+ {
+ // when Notification channel is cleared, storable toasts will be added into the list.
+ clearScreenChannels();
+ }
+ if (visible)
+ {
+ if (NULL == getDockControl() && getDockTongue().notNull())
+ {
+ setDockControl(new LLDockControl(
+ LLChicletBar::getInstance()->getChild<LLView>(getAnchorViewName()), this,
+ getDockTongue(), LLDockControl::BOTTOM));
+ }
+ }
+
+ // do not show empty window
+ if (NULL == mNotificationsSeparator || isWindowEmpty()) visible = FALSE;
+
+ LLTransientDockableFloater::setVisible(visible);
+
+ // update notification channel state
+ initChannel(); // make sure the channel still exists
+ if(mChannel)
+ {
+ mChannel->updateShowToastsState();
+ mChannel->redrawToasts();
+ }
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::setDocked(bool docked, bool pop_on_undock)
+{
+ LLTransientDockableFloater::setDocked(docked, pop_on_undock);
+
+ // update notification channel state
+ if(mChannel)
+ {
+ mChannel->updateShowToastsState();
+ mChannel->redrawToasts();
+ }
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::reshapeWindow()
+{
+ // update notification channel state
+ // update on a window reshape is important only when a window is visible and docked
+ if(mChannel && getVisible() && isDocked())
+ {
+ mChannel->updateShowToastsState();
+ }
+}
+
+//---------------------------------------------------------------------------------
+bool LLFloaterNotificationsTabbed::isWindowEmpty()
+{
+ return mNotificationsSeparator->size() == 0;
+}
+
+//---------------------------------------------------------------------------------
+LLFloaterNotificationsTabbed::NotificationTabbedChannel::NotificationTabbedChannel(LLFloaterNotificationsTabbed* notifications_tabbed_window)
+ : LLNotificationChannel(LLNotificationChannel::Params().name(notifications_tabbed_window->getPathname())),
+ mNotificationsTabbedWindow(notifications_tabbed_window)
+{
+ connectToChannel("Notifications");
+ connectToChannel("Group Notifications");
+ connectToChannel("Offer");
+}
+
+// static
+//---------------------------------------------------------------------------------
+LLFloaterNotificationsTabbed* LLFloaterNotificationsTabbed::getInstance(const LLSD& key /*= LLSD()*/)
+{
+ return LLFloaterReg::getTypedInstance<LLFloaterNotificationsTabbed>("notification_well_window", key);
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::updateNotificationCounter(S32 panelIndex, S32 counterValue, std::string stringName)
+{
+ LLStringUtil::format_map_t string_args;
+ string_args["[COUNT]"] = llformat("%d", counterValue);
+ std::string label = getString(stringName, string_args);
+ mNotificationsTabContainer->setPanelTitle(panelIndex, label);
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::updateNotificationCounters()
+{
+ updateNotificationCounter(0, mSystemMessageList->size(), "system_tab_title");
+ updateNotificationCounter(1, mTransactionMessageList->size(), "transactions_tab_title");
+ updateNotificationCounter(2, mGroupInviteMessageList->size(), "group_invitations_tab_title");
+ updateNotificationCounter(3, mGroupNoticeMessageList->size(), "group_notices_tab_title");
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::addItem(LLNotificationListItem::Params p)
+{
+ // do not add clones
+ if (mNotificationsSeparator->findItemByID(p.notification_name, p.notification_id))
+ return;
+ LLNotificationListItem* new_item = LLNotificationListItem::create(p);
+ if (new_item == NULL)
+ {
+ return;
+ }
+ if (mNotificationsSeparator->addItem(new_item->getNotificationName(), new_item))
+ {
+ mSysWellChiclet->updateWidget(isWindowEmpty());
+ reshapeWindow();
+ updateNotificationCounters();
+ new_item->setOnItemCloseCallback(boost::bind(&LLFloaterNotificationsTabbed::onItemClose, this, _1));
+ new_item->setOnItemClickCallback(boost::bind(&LLFloaterNotificationsTabbed::onItemClick, this, _1));
+ }
+ else
+ {
+ LL_WARNS() << "Unable to add Notification into the list, notification ID: " << p.notification_id
+ << ", title: " << new_item->getTitle()
+ << LL_ENDL;
+
+ new_item->die();
+ }
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::closeAll()
+{
+ // Need to clear notification channel, to add storable toasts into the list.
+ clearScreenChannels();
+
+ std::vector<LLNotificationListItem*> items;
+ mNotificationsSeparator->getItems(items);
+ std::vector<LLNotificationListItem*>::iterator iter = items.begin();
+ for (; iter != items.end(); ++iter)
+ {
+ onItemClose(*iter);
+ }
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::getAllItemsOnCurrentTab(std::vector<LLPanel*>& items) const
+{
+ switch (mNotificationsTabContainer->getCurrentPanelIndex())
+ {
+ case 0:
+ mSystemMessageList->getItems(items);
+ break;
+ case 1:
+ mTransactionMessageList->getItems(items);
+ break;
+ case 2:
+ mGroupInviteMessageList->getItems(items);
+ break;
+ case 3:
+ mGroupNoticeMessageList->getItems(items);
+ break;
+ default:
+ break;
+ }
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::closeAllOnCurrentTab()
+{
+ // Need to clear notification channel, to add storable toasts into the list.
+ clearScreenChannels();
+ std::vector<LLPanel*> items;
+ getAllItemsOnCurrentTab(items);
+ std::vector<LLPanel*>::iterator iter = items.begin();
+ for (; iter != items.end(); ++iter)
+ {
+ LLNotificationListItem* notify_item = dynamic_cast<LLNotificationListItem*>(*iter);
+ if (notify_item)
+ onItemClose(notify_item);
+ }
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::collapseAllOnCurrentTab()
+{
+ std::vector<LLPanel*> items;
+ getAllItemsOnCurrentTab(items);
+ std::vector<LLPanel*>::iterator iter = items.begin();
+ for (; iter != items.end(); ++iter)
+ {
+ LLNotificationListItem* notify_item = dynamic_cast<LLNotificationListItem*>(*iter);
+ if (notify_item)
+ notify_item->setExpanded(FALSE);
+ }
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::clearScreenChannels()
+{
+ // 1 - remove StartUp toast and channel if present
+ if(!LLNotificationsUI::LLScreenChannel::getStartUpToastShown())
+ {
+ LLNotificationsUI::LLChannelManager::getInstance()->onStartUpToastClose();
+ }
+
+ // 2 - remove toasts in Notification channel
+ if(mChannel)
+ {
+ mChannel->removeAndStoreAllStorableToasts();
+ }
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::onStoreToast(LLPanel* info_panel, LLUUID id)
+{
+ LLNotificationListItem::Params p;
+ p.notification_id = id;
+ p.title = static_cast<LLToastPanel*>(info_panel)->getTitle();
+ LLNotificationPtr notify = mChannel->getToastByNotificationID(id)->getNotification();
+ LLSD payload = notify->getPayload();
+ p.notification_name = notify->getName();
+ p.transaction_id = payload["transaction_id"];
+ p.group_id = payload["group_id"];
+ p.fee = payload["fee"];
+ p.subject = payload["subject"].asString();
+ p.message = payload["message"].asString();
+ p.sender = payload["sender_name"].asString();
+ p.time_stamp = notify->getDate();
+ p.received_time = payload["received_time"].asDate();
+ p.paid_from_id = payload["from_id"];
+ p.paid_to_id = payload["dest_id"];
+ p.inventory_offer = payload["inventory_offer"];
+ p.notification_priority = notify->getPriority();
+ addItem(p);
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::onItemClick(LLNotificationListItem* item)
+{
+ LLUUID id = item->getID();
+ if (item->showPopup())
+ {
+ LLFloaterReg::showInstance("inspect_toast", id);
+ }
+ else
+ {
+ item->setExpanded(TRUE);
+ }
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::onItemClose(LLNotificationListItem* item)
+{
+ LLUUID id = item->getID();
+
+ if(mChannel)
+ {
+ // removeItemByID() is invoked from killToastByNotificationID() and item will removed;
+ mChannel->killToastByNotificationID(id);
+ }
+ else
+ {
+ // removeItemByID() should be called one time for each item to remove it from notification well
+ removeItemByID(id, item->getNotificationName());
+ }
+
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::onAdd( LLNotificationPtr notify )
+{
+ removeItemByID(notify->getID(), notify->getName());
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::onClickDeleteAllBtn()
+{
+ closeAllOnCurrentTab();
+}
+
+//---------------------------------------------------------------------------------
+void LLFloaterNotificationsTabbed::onClickCollapseAllBtn()
+{
+ collapseAllOnCurrentTab();
+}
+
+//---------------------------------------------------------------------------------
+void LLNotificationSeparator::initTaggedList(const std::string& tag, LLNotificationListView* list)
+{
+ mNotificationListMap.insert(notification_list_map_t::value_type(tag, list));
+ mNotificationLists.push_back(list);
+}
+
+//---------------------------------------------------------------------------------
+void LLNotificationSeparator::initTaggedList(const std::set<std::string>& tags, LLNotificationListView* list)
+{
+ std::set<std::string>::const_iterator it = tags.begin();
+ for(;it != tags.end();it++)
+ {
+ initTaggedList(*it, list);
+ }
+}
+
+//---------------------------------------------------------------------------------
+void LLNotificationSeparator::initUnTaggedList(LLNotificationListView* list)
+{
+ mUnTaggedList = list;
+}
+
+//---------------------------------------------------------------------------------
+bool LLNotificationSeparator::addItem(std::string& tag, LLNotificationListItem* item)
+{
+ notification_list_map_t::iterator it = mNotificationListMap.find(tag);
+ if (it != mNotificationListMap.end())
+ {
+ return it->second->addNotification(item);
+ }
+ else if (mUnTaggedList != NULL)
+ {
+ return mUnTaggedList->addNotification(item);
+ }
+ return false;
+}
+
+//---------------------------------------------------------------------------------
+bool LLNotificationSeparator::removeItemByID(std::string& tag, const LLUUID& id)
+{
+ notification_list_map_t::iterator it = mNotificationListMap.find(tag);
+ if (it != mNotificationListMap.end())
+ {
+ return it->second->removeItemByValue(id);
+ }
+ else if (mUnTaggedList != NULL)
+ {
+ return mUnTaggedList->removeItemByValue(id);
+ }
+ return false;
+}
+
+//---------------------------------------------------------------------------------
+U32 LLNotificationSeparator::size() const
+{
+ U32 size = 0;
+ notification_list_list_t::const_iterator it = mNotificationLists.begin();
+ for (; it != mNotificationLists.end(); it++)
+ {
+ size = size + (*it)->size();
+ }
+ if (mUnTaggedList != NULL)
+ {
+ size = size + mUnTaggedList->size();
+ }
+ return size;
+}
+
+//---------------------------------------------------------------------------------
+LLPanel* LLNotificationSeparator::findItemByID(std::string& tag, const LLUUID& id)
+{
+ notification_list_map_t::iterator it = mNotificationListMap.find(tag);
+ if (it != mNotificationListMap.end())
+ {
+ return it->second->getItemByValue(id);
+ }
+ else if (mUnTaggedList != NULL)
+ {
+ return mUnTaggedList->getItemByValue(id);
+ }
+
+ return NULL;
+}
+
+//static
+//---------------------------------------------------------------------------------
+void LLNotificationSeparator::getItemsFromList(std::vector<LLNotificationListItem*>& items, LLNotificationListView* list)
+{
+ std::vector<LLPanel*> list_items;
+ list->getItems(list_items);
+ std::vector<LLPanel*>::iterator it = list_items.begin();
+ for (; it != list_items.end(); ++it)
+ {
+ LLNotificationListItem* notify_item = dynamic_cast<LLNotificationListItem*>(*it);
+ if (notify_item)
+ items.push_back(notify_item);
+ }
+}
+
+//---------------------------------------------------------------------------------
+void LLNotificationSeparator::getItems(std::vector<LLNotificationListItem*>& items) const
+{
+ items.clear();
+ notification_list_list_t::const_iterator lists_it = mNotificationLists.begin();
+ for (; lists_it != mNotificationLists.end(); lists_it++)
+ {
+ getItemsFromList(items, *lists_it);
+ }
+ if (mUnTaggedList != NULL)
+ {
+ getItemsFromList(items, mUnTaggedList);
+ }
+}
+
+//---------------------------------------------------------------------------------
+LLNotificationSeparator::LLNotificationSeparator()
+ : mUnTaggedList(NULL)
+{}
+
+//---------------------------------------------------------------------------------
+LLNotificationSeparator::~LLNotificationSeparator()
+{}
diff --git a/indra/newview/llfloaternotificationstabbed.h b/indra/newview/llfloaternotificationstabbed.h
new file mode 100644
index 0000000000..8dd20b18c4
--- /dev/null
+++ b/indra/newview/llfloaternotificationstabbed.h
@@ -0,0 +1,174 @@
+/**
+ * @file llfloaternotificationstabbed.h
+ * @brief
+ *
+ * $LicenseInfo:firstyear=2015&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2015, 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_FLOATERNOTIFICATIONSTABBED_H
+#define LL_FLOATERNOTIFICATIONSTABBED_H
+
+#include "llimview.h"
+#include "llnotifications.h"
+#include "llscreenchannel.h"
+#include "llsyswellitem.h"
+#include "lltransientdockablefloater.h"
+#include "llnotificationlistview.h"
+#include "lltabcontainer.h"
+
+class LLAvatarName;
+class LLChiclet;
+class LLFlatListView;
+class LLIMChiclet;
+class LLScriptChiclet;
+class LLSysWellChiclet;
+
+class LLNotificationSeparator
+{
+public:
+ LLNotificationSeparator();
+ ~LLNotificationSeparator();
+ void initTaggedList(const std::string& tag, LLNotificationListView* list);
+ void initTaggedList(const std::set<std::string>& tags, LLNotificationListView* list);
+ void initUnTaggedList(LLNotificationListView* list);
+ bool addItem(std::string& tag, LLNotificationListItem* item);
+ LLPanel* findItemByID(std::string& tag, const LLUUID& id);
+ bool removeItemByID(std::string& tag, const LLUUID& id);
+ void getItems(std::vector<LLNotificationListItem*>& items) const;
+ U32 size() const;
+private:
+ static void getItemsFromList(std::vector<LLNotificationListItem*>& items, LLNotificationListView* list);
+
+ typedef std::map<std::string, LLNotificationListView*> notification_list_map_t;
+ notification_list_map_t mNotificationListMap;
+ typedef std::list<LLNotificationListView*> notification_list_list_t;
+ notification_list_list_t mNotificationLists;
+ LLNotificationListView* mUnTaggedList;
+};
+
+class LLFloaterNotificationsTabbed : public LLTransientDockableFloater
+{
+public:
+ LOG_CLASS(LLFloaterNotificationsTabbed);
+
+ LLFloaterNotificationsTabbed(const LLSD& key);
+ virtual ~LLFloaterNotificationsTabbed();
+ BOOL postBuild();
+
+ // other interface functions
+ // check is window empty
+ bool isWindowEmpty();
+
+ // Operating with items
+ void removeItemByID(const LLUUID& id, std::string type);
+ LLPanel * findItemByID(const LLUUID& id, std::string type);
+ void updateNotificationCounters();
+ void updateNotificationCounter(S32 panelIndex, S32 counterValue, std::string stringName);
+
+ // Operating with outfit
+ virtual void setVisible(BOOL visible);
+
+ /*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
+ // override LLFloater's minimization according to EXT-1216
+ /*virtual*/ void setMinimized(BOOL minimize);
+ /*virtual*/ void handleReshape(const LLRect& rect, bool by_user);
+
+ void onStartUpToastClick(S32 x, S32 y, MASK mask);
+ /*virtual*/ void onAdd(LLNotificationPtr notify);
+
+ void setSysWellChiclet(LLSysWellChiclet* chiclet);
+ void closeAll();
+
+ static LLFloaterNotificationsTabbed* getInstance(const LLSD& key = LLSD());
+
+ // size constants for the window and for its elements
+ static const S32 MAX_WINDOW_HEIGHT = 200;
+ static const S32 MIN_WINDOW_WIDTH = 318;
+
+private:
+ // init Window's channel
+ virtual void initChannel();
+
+ const std::string NOTIFICATION_TABBED_ANCHOR_NAME;
+ const std::string IM_WELL_ANCHOR_NAME;
+ //virtual const std::string& getAnchorViewName() = 0;
+
+ void reshapeWindow();
+
+ // pointer to a corresponding channel's instance
+ LLNotificationsUI::LLScreenChannel* mChannel;
+
+ /**
+ * Reference to an appropriate Well chiclet to release "new message" state. EXT-3147
+ */
+ LLSysWellChiclet* mSysWellChiclet;
+
+ bool mIsReshapedByUser;
+
+ struct NotificationTabbedChannel : public LLNotificationChannel
+ {
+ NotificationTabbedChannel(LLFloaterNotificationsTabbed*);
+ void onDelete(LLNotificationPtr notify)
+ {
+ mNotificationsTabbedWindow->removeItemByID(notify->getID(), notify->getName());
+ }
+
+ LLFloaterNotificationsTabbed* mNotificationsTabbedWindow;
+ };
+
+ LLNotificationChannelPtr mNotificationUpdates;
+ virtual const std::string& getAnchorViewName() { return NOTIFICATION_TABBED_ANCHOR_NAME; }
+
+ // init Window's channel
+ // void initChannel();
+ void clearScreenChannels();
+ // Operating with items
+ void addItem(LLNotificationListItem::Params p);
+ void getAllItemsOnCurrentTab(std::vector<LLPanel*>& items) const;
+
+ // Closes all notifications and removes them from the Notification Well
+ void closeAllOnCurrentTab();
+ void collapseAllOnCurrentTab();
+
+ void onStoreToast(LLPanel* info_panel, LLUUID id);
+ void onClickDeleteAllBtn();
+ void onClickCollapseAllBtn();
+ // Handlers
+ void onItemClick(LLNotificationListItem* item);
+ void onItemClose(LLNotificationListItem* item);
+ // ID of a toast loaded by user (by clicking notification well item)
+ LLUUID mLoadedToastId;
+
+ LLNotificationListView* mGroupInviteMessageList;
+ LLNotificationListView* mGroupNoticeMessageList;
+ LLNotificationListView* mTransactionMessageList;
+ LLNotificationListView* mSystemMessageList;
+ LLNotificationSeparator* mNotificationsSeparator;
+ LLTabContainer* mNotificationsTabContainer;
+ LLButton* mDeleteAllBtn;
+ LLButton* mCollapseAllBtn;
+};
+
+#endif // LL_FLOATERNOTIFICATIONSTABBED_H
+
+
+
diff --git a/indra/newview/llfloateroutbox.cpp b/indra/newview/llfloateroutbox.cpp
index e5efca1102..b7b1634a5f 100755
--- a/indra/newview/llfloateroutbox.cpp
+++ b/indra/newview/llfloateroutbox.cpp
@@ -160,6 +160,12 @@ BOOL LLFloaterOutbox::postBuild()
mCategoryAddedObserver = new LLOutboxAddedObserver(this);
gInventory.addObserver(mCategoryAddedObserver);
+ // Setup callbacks for importer
+ LLMarketplaceInventoryImporter& importer = LLMarketplaceInventoryImporter::instance();
+ importer.setInitializationErrorCallback(boost::bind(&LLFloaterOutbox::initializationReportError, this, _1, _2));
+ importer.setStatusChangedCallback(boost::bind(&LLFloaterOutbox::importStatusChanged, this, _1));
+ importer.setStatusReportCallback(boost::bind(&LLFloaterOutbox::importReportResults, this, _1, _2));
+
return TRUE;
}
@@ -298,12 +304,8 @@ void LLFloaterOutbox::initializeMarketPlace()
// Initialize the marketplace import API
//
LLMarketplaceInventoryImporter& importer = LLMarketplaceInventoryImporter::instance();
-
if (!importer.isInitialized())
{
- importer.setInitializationErrorCallback(boost::bind(&LLFloaterOutbox::initializationReportError, this, _1, _2));
- importer.setStatusChangedCallback(boost::bind(&LLFloaterOutbox::importStatusChanged, this, _1));
- importer.setStatusReportCallback(boost::bind(&LLFloaterOutbox::importReportResults, this, _1, _2));
importer.initialize();
}
}
@@ -516,7 +518,7 @@ void LLFloaterOutbox::onImportButtonClicked()
{
mOutboxInventoryPanel.get()->clearSelection();
}
-
+
mImportBusy = LLMarketplaceInventoryImporter::instance().triggerImport();
}
@@ -617,3 +619,5 @@ void LLFloaterOutbox::showNotification(const LLNotificationPtr& notification)
notification_handler->processNotification(notification);
}
+
+
diff --git a/indra/newview/llfloateroutbox.h b/indra/newview/llfloateroutbox.h
index 40519c8fd2..2cf69fc3cc 100755
--- a/indra/newview/llfloateroutbox.h
+++ b/indra/newview/llfloateroutbox.h
@@ -1,7 +1,6 @@
/**
* @file llfloateroutbox.h
- * @brief LLFloaterOutbox
- * class definition
+ * @brief Implementation of the merchant outbox window
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -30,6 +29,7 @@
#include "llfloater.h"
#include "llfoldertype.h"
+#include "llinventoryfilter.h"
#include "llnotificationptr.h"
diff --git a/indra/newview/llfloaterperms.cpp b/indra/newview/llfloaterperms.cpp
index 042cf47070..04a818c2c0 100755
--- a/indra/newview/llfloaterperms.cpp
+++ b/indra/newview/llfloaterperms.cpp
@@ -166,15 +166,59 @@ void LLFloaterPermsDefault::onCommitCopy(const LLSD& user_data)
xfer->setEnabled(copyable);
}
-class LLFloaterPermsResponder : public LLHTTPClient::Responder
+const int MAX_HTTP_RETRIES = 5;
+LLFloaterPermsRequester* LLFloaterPermsRequester::sPermsRequester = NULL;
+
+LLFloaterPermsRequester::LLFloaterPermsRequester(const std::string url, const LLSD report,
+ int maxRetries)
+ : mRetriesCount(0), mMaxRetries(maxRetries), mUrl(url), mReport(report)
+{}
+
+//static
+void LLFloaterPermsRequester::init(const std::string url, const LLSD report, int maxRetries)
+{
+ if (sPermsRequester == NULL) {
+ sPermsRequester = new LLFloaterPermsRequester(url, report, maxRetries);
+ }
+}
+
+//static
+void LLFloaterPermsRequester::finalize()
+{
+ if (sPermsRequester != NULL)
+ {
+ delete sPermsRequester;
+ sPermsRequester = NULL;
+ }
+}
+
+//static
+LLFloaterPermsRequester* LLFloaterPermsRequester::instance()
+{
+ return sPermsRequester;
+}
+
+void LLFloaterPermsRequester::start()
{
-public:
- LLFloaterPermsResponder(): LLHTTPClient::Responder() {}
-private:
- static std::string sPreviousReason;
+ ++mRetriesCount;
+ LLHTTPClient::post(mUrl, mReport, new LLFloaterPermsResponder());
+}
+
+bool LLFloaterPermsRequester::retry()
+{
+ if (++mRetriesCount < mMaxRetries)
+ {
+ LLHTTPClient::post(mUrl, mReport, new LLFloaterPermsResponder());
+ return true;
+ }
+ return false;
+}
- void httpFailure()
+void LLFloaterPermsResponder::httpFailure()
+{
+ if (!LLFloaterPermsRequester::instance() || !LLFloaterPermsRequester::instance()->retry())
{
+ LLFloaterPermsRequester::finalize();
const std::string& reason = getReason();
// Do not display the same error more than once in a row
if (reason != sPreviousReason)
@@ -185,27 +229,27 @@ private:
LLNotificationsUtil::add("DefaultObjectPermissions", args);
}
}
+}
- void httpSuccess()
- {
- //const LLSD& content = getContent();
- //dump_sequential_xml("perms_responder_result.xml", content);
-
- // Since we have had a successful POST call be sure to display the next error message
- // even if it is the same as a previous one.
- sPreviousReason = "";
- LLFloaterPermsDefault::setCapSent(true);
- LL_INFOS("ObjectPermissionsFloater") << "Default permissions successfully sent to simulator" << LL_ENDL;
- }
-};
+void LLFloaterPermsResponder::httpSuccess()
+{
+ //const LLSD& content = getContent();
+ //dump_sequential_xml("perms_responder_result.xml", content);
- std::string LLFloaterPermsResponder::sPreviousReason;
+ // Since we have had a successful POST call be sure to display the next error message
+ // even if it is the same as a previous one.
+ sPreviousReason = "";
+ LL_INFOS("ObjectPermissionsFloater") << "Default permissions successfully sent to simulator" << LL_ENDL;
+}
+
+std::string LLFloaterPermsResponder::sPreviousReason;
void LLFloaterPermsDefault::sendInitialPerms()
{
if(!mCapSent)
{
updateCap();
+ setCapSent(true);
}
}
@@ -230,8 +274,8 @@ void LLFloaterPermsDefault::updateCap()
LLSDSerialize::toPrettyXML(report, sent_perms_log);
LL_CONT << sent_perms_log.str() << LL_ENDL;
}
-
- LLHTTPClient::post(object_url, report, new LLFloaterPermsResponder());
+ LLFloaterPermsRequester::init(object_url, report, MAX_HTTP_RETRIES);
+ LLFloaterPermsRequester::instance()->start();
}
else
{
diff --git a/indra/newview/llfloaterperms.h b/indra/newview/llfloaterperms.h
index 2bb0a19dc1..d3b52c1fe5 100755
--- a/indra/newview/llfloaterperms.h
+++ b/indra/newview/llfloaterperms.h
@@ -29,6 +29,7 @@
#define LL_LLFLOATERPERMPREFS_H
#include "llfloater.h"
+#include "llhttpclient.h"
class LLFloaterPerms : public LLFloater
{
@@ -89,4 +90,36 @@ private:
bool mNextOwnerTransfer[CAT_LAST];
};
+class LLFloaterPermsRequester
+{
+public:
+ LLFloaterPermsRequester(const std::string url, const LLSD report, int maxRetries);
+
+ static void init(const std::string url, const LLSD report, int maxRetries);
+ static void finalize();
+ static LLFloaterPermsRequester* instance();
+
+ void start();
+ bool retry();
+
+private:
+ int mRetriesCount;
+ int mMaxRetries;
+ const std::string mUrl;
+ const LLSD mReport;
+public:
+ static LLFloaterPermsRequester* sPermsRequester;
+};
+
+class LLFloaterPermsResponder : public LLHTTPClient::Responder
+{
+public:
+ LLFloaterPermsResponder() : LLHTTPClient::Responder() {}
+private:
+ static std::string sPreviousReason;
+
+ void httpFailure();
+ void httpSuccess();
+};
+
#endif
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index ee4396758e..b572e1935f 100755
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -49,7 +49,7 @@
//#include "llfirstuse.h"
#include "llfloaterreg.h"
#include "llfloaterabout.h"
-#include "llfloaterhardwaresettings.h"
+#include "llfavoritesbar.h"
#include "llfloatersidepanelcontainer.h"
#include "llfloaterimsession.h"
#include "llkeyboard.h"
@@ -110,6 +110,11 @@
#include "lllogininstance.h" // to check if logged in yet
#include "llsdserialize.h"
+#include "llpresetsmanager.h"
+#include "llviewercontrol.h"
+#include "llpresetsmanager.h"
+#include "llfeaturemanager.h"
+#include "llviewertexturelist.h"
const F32 BANDWIDTH_UPDATER_TIMEOUT = 0.5f;
char const* const VISIBILITY_DEFAULT = "default";
@@ -118,6 +123,18 @@ char const* const VISIBILITY_HIDDEN = "hidden";
//control value for middle mouse as talk2push button
const static std::string MIDDLE_MOUSE_CV = "MiddleMouse";
+/// This must equal the maximum value set for the IndirectMaxComplexity slider in panel_preferences_graphics1.xml
+static const U32 INDIRECT_MAX_ARC_OFF = 101; // all the way to the right == disabled
+static const U32 MIN_INDIRECT_ARC_LIMIT = 1; // must match minimum of IndirectMaxComplexity in panel_preferences_graphics1.xml
+static const U32 MAX_INDIRECT_ARC_LIMIT = INDIRECT_MAX_ARC_OFF-1; // one short of all the way to the right...
+
+/// These are the effective range of values for RenderAvatarMaxComplexity
+static const F32 MIN_ARC_LIMIT = 20000.0f;
+static const F32 MAX_ARC_LIMIT = 300000.0f;
+static const F32 MIN_ARC_LOG = log(MIN_ARC_LIMIT);
+static const F32 MAX_ARC_LOG = log(MAX_ARC_LIMIT);
+static const F32 ARC_LIMIT_MAP_SCALE = (MAX_ARC_LOG - MIN_ARC_LOG) / (MAX_INDIRECT_ARC_LIMIT - MIN_INDIRECT_ARC_LIMIT);
+
class LLVoiceSetKeyDialog : public LLModalDialog
{
public:
@@ -327,9 +344,8 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
registered_dialog = true;
}
- mCommitCallbackRegistrar.add("Pref.Apply", boost::bind(&LLFloaterPreference::onBtnApply, this));
- mCommitCallbackRegistrar.add("Pref.Cancel", boost::bind(&LLFloaterPreference::onBtnCancel, this));
- mCommitCallbackRegistrar.add("Pref.OK", boost::bind(&LLFloaterPreference::onBtnOK, this));
+ mCommitCallbackRegistrar.add("Pref.Cancel", boost::bind(&LLFloaterPreference::onBtnCancel, this, _2));
+ mCommitCallbackRegistrar.add("Pref.OK", boost::bind(&LLFloaterPreference::onBtnOK, this, _2));
mCommitCallbackRegistrar.add("Pref.ClearCache", boost::bind(&LLFloaterPreference::onClickClearCache, this));
mCommitCallbackRegistrar.add("Pref.WebClearCache", boost::bind(&LLFloaterPreference::onClickBrowserClearCache, this));
@@ -343,8 +359,8 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.ClickEnablePopup", boost::bind(&LLFloaterPreference::onClickEnablePopup, this));
mCommitCallbackRegistrar.add("Pref.ClickDisablePopup", boost::bind(&LLFloaterPreference::onClickDisablePopup, this));
mCommitCallbackRegistrar.add("Pref.LogPath", boost::bind(&LLFloaterPreference::onClickLogPath, this));
- mCommitCallbackRegistrar.add("Pref.HardwareSettings", boost::bind(&LLFloaterPreference::onOpenHardwareSettings, this));
mCommitCallbackRegistrar.add("Pref.HardwareDefaults", boost::bind(&LLFloaterPreference::setHardwareDefaults, this));
+ mCommitCallbackRegistrar.add("Pref.AvatarImpostorsEnable", boost::bind(&LLFloaterPreference::onAvatarImpostorsEnable, this));
mCommitCallbackRegistrar.add("Pref.VertexShaderEnable", boost::bind(&LLFloaterPreference::onVertexShaderEnable, this));
mCommitCallbackRegistrar.add("Pref.WindowedMod", boost::bind(&LLFloaterPreference::onCommitWindowedMode, this));
mCommitCallbackRegistrar.add("Pref.UpdateSliderText", boost::bind(&LLFloaterPreference::refreshUI,this));
@@ -358,6 +374,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.AutoReplace", boost::bind(&LLFloaterPreference::onClickAutoReplace, this));
mCommitCallbackRegistrar.add("Pref.PermsDefault", boost::bind(&LLFloaterPreference::onClickPermsDefault, this));
mCommitCallbackRegistrar.add("Pref.SpellChecker", boost::bind(&LLFloaterPreference::onClickSpellChecker, this));
+ mCommitCallbackRegistrar.add("Pref.Advanced", boost::bind(&LLFloaterPreference::onClickAdvanced, this));
sSkin = gSavedSettings.getString("SkinCurrent");
@@ -554,12 +571,6 @@ void LLFloaterPreference::apply()
if (panel)
panel->apply();
}
- // hardware menu apply
- LLFloaterHardwareSettings* hardware_settings = LLFloaterReg::getTypedInstance<LLFloaterHardwareSettings>("prefs_hardware_settings");
- if (hardware_settings)
- {
- hardware_settings->apply();
- }
gViewerWindow->requestResolutionUpdate(); // for UIScaleFactor
@@ -636,13 +647,9 @@ void LLFloaterPreference::cancel()
// hide spellchecker settings folder
LLFloaterReg::hideInstance("prefs_spellchecker");
-
- // cancel hardware menu
- LLFloaterHardwareSettings* hardware_settings = LLFloaterReg::getTypedInstance<LLFloaterHardwareSettings>("prefs_hardware_settings");
- if (hardware_settings)
- {
- hardware_settings->cancel();
- }
+
+ // hide advancede floater
+ LLFloaterReg::hideInstance("prefs_graphics_advanced");
// reverts any changes to current skin
gSavedSettings.setString("SkinCurrent", sSkin);
@@ -669,7 +676,7 @@ void LLFloaterPreference::cancel()
void LLFloaterPreference::onOpen(const LLSD& key)
{
-
+
// 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 do not disturb mode response yet, do it
@@ -747,6 +754,19 @@ void LLFloaterPreference::onOpen(const LLSD& key)
// when the floater is opened. That will make cancel do its
// job
saveSettings();
+
+ // Make sure there is a default preference file
+ LLPresetsManager::getInstance()->createMissingDefault();
+
+ bool started = (LLStartUp::getStartupState() == STATE_STARTED);
+
+ LLButton* load_btn = findChild<LLButton>("PrefLoadButton");
+ LLButton* save_btn = findChild<LLButton>("PrefSaveButton");
+ LLButton* delete_btn = findChild<LLButton>("PrefDeleteButton");
+
+ load_btn->setEnabled(started);
+ save_btn->setEnabled(started);
+ delete_btn->setEnabled(started);
}
void LLFloaterPreference::onVertexShaderEnable()
@@ -754,6 +774,27 @@ void LLFloaterPreference::onVertexShaderEnable()
refreshEnabledGraphics();
}
+void LLFloaterPreferenceGraphicsAdvanced::onVertexShaderEnable()
+{
+ LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
+ if (instance)
+ {
+ instance->refresh();
+ }
+
+ refreshEnabledGraphics();
+}
+
+void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledGraphics()
+{
+ refreshEnabledState();
+}
+
+void LLFloaterPreference::onAvatarImpostorsEnable()
+{
+ refreshEnabledGraphics();
+}
+
//static
void LLFloaterPreference::initDoNotDisturbResponse()
{
@@ -777,7 +818,14 @@ void LLFloaterPreference::updateShowFavoritesCheckbox(bool val)
void LLFloaterPreference::setHardwareDefaults()
{
LLFeatureManager::getInstance()->applyRecommendedSettings();
+
+ // reset indirects before refresh because we may have changed what they control
+ LLFloaterPreferenceGraphicsAdvanced::setIndirectControls();
+
refreshEnabledGraphics();
+ gSavedSettings.setString("PresetGraphicActive", "");
+ LLPresetsManager::getInstance()->triggerChangeSignal();
+
LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
child_list_t::const_iterator iter = tabcontainer->getChildList()->begin();
child_list_t::const_iterator end = tabcontainer->getChildList()->end();
@@ -786,7 +834,47 @@ void LLFloaterPreference::setHardwareDefaults()
LLView* view = *iter;
LLPanelPreference* panel = dynamic_cast<LLPanelPreference*>(view);
if (panel)
+ {
panel->setHardwareDefaults();
+ }
+ }
+}
+
+void LLFloaterPreference::getControlNames(std::vector<std::string>& names)
+{
+ LLView* view = findChild<LLView>("display");
+ LLFloater* advanced = LLFloaterReg::findTypedInstance<LLFloater>("prefs_graphics_advanced");
+ if (view && advanced)
+ {
+ std::list<LLView*> stack;
+ stack.push_back(view);
+ stack.push_back(advanced);
+ while(!stack.empty())
+ {
+ // Process view on top of the stack
+ LLView* curview = stack.front();
+ stack.pop_front();
+
+ LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview);
+ if (ctrl)
+ {
+ LLControlVariable* control = ctrl->getControlVariable();
+ if (control)
+ {
+ std::string control_name = control->getName();
+ if (std::find(names.begin(), names.end(), control_name) == names.end())
+ {
+ names.push_back(control_name);
+ }
+ }
+ }
+
+ for (child_list_t::const_iterator iter = curview->getChildList()->begin();
+ iter != curview->getChildList()->end(); ++iter)
+ {
+ stack.push_back(*iter);
+ }
+ }
}
}
@@ -801,13 +889,8 @@ void LLFloaterPreference::onClose(bool app_quitting)
}
}
-void LLFloaterPreference::onOpenHardwareSettings()
-{
- LLFloater* floater = LLFloaterReg::showInstance("prefs_hardware_settings");
- addDependentFloater(floater, FALSE);
-}
// static
-void LLFloaterPreference::onBtnOK()
+void LLFloaterPreference::onBtnOK(const LLSD& userdata)
{
// commit any outstanding text entry
if (hasFocus())
@@ -823,7 +906,15 @@ void LLFloaterPreference::onBtnOK()
{
saveSettings();
apply();
- closeFloater(false);
+
+ if (userdata.asString() == "closeadvanced")
+ {
+ LLFloaterReg::hideInstance("prefs_graphics_advanced");
+ }
+ else
+ {
+ closeFloater(false);
+ }
//Conversation transcript and log path changed so reload conversations based on new location
if(mPriorInstantMessageLogPath.length())
@@ -865,11 +956,10 @@ void LLFloaterPreference::onBtnOK()
LLFloaterPathfindingConsole* pPathfindingConsole = pathfindingConsoleHandle.get();
pPathfindingConsole->onRegionBoundaryCross();
}
-
}
// static
-void LLFloaterPreference::onBtnApply( )
+void LLFloaterPreference::onBtnCancel(const LLSD& userdata)
{
if (hasFocus())
{
@@ -878,27 +968,18 @@ void LLFloaterPreference::onBtnApply( )
{
cur_focus->onCommit();
}
+ refresh();
}
- apply();
- saveSettings();
-
- LLPanelLogin::updateLocationSelectorsVisibility();
-}
+ cancel();
-// static
-void LLFloaterPreference::onBtnCancel()
-{
- if (hasFocus())
+ if (userdata.asString() == "closeadvanced")
{
- LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
- if (cur_focus && cur_focus->acceptsTextInput())
- {
- cur_focus->onCommit();
- }
- refresh();
+ LLFloaterReg::hideInstance("prefs_graphics_advanced");
+ }
+ else
+ {
+ closeFloater();
}
- cancel();
- closeFloater();
}
// static
@@ -911,19 +992,18 @@ void LLFloaterPreference::updateUserInfo(const std::string& visibility, bool im_
}
}
-
void LLFloaterPreference::refreshEnabledGraphics()
{
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
if (instance)
{
instance->refresh();
- //instance->refreshEnabledState();
}
- LLFloaterHardwareSettings* hardware_settings = LLFloaterReg::getTypedInstance<LLFloaterHardwareSettings>("prefs_hardware_settings");
- if (hardware_settings)
+
+ LLFloater* advanced = LLFloaterReg::findTypedInstance<LLFloater>("prefs_graphics_advanced");
+ if (advanced)
{
- hardware_settings->refreshEnabledState();
+ advanced->refresh();
}
}
@@ -1106,23 +1186,52 @@ void LLFloaterPreference::buildPopupLists()
}
void LLFloaterPreference::refreshEnabledState()
-{
+{
+ LLCheckBoxCtrl* ctrl_wind_light = getChild<LLCheckBoxCtrl>("WindLightUseAtmosShaders");
+ LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders");
+
+ // if vertex shaders off, disable all shader related products
+ if (!LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable") ||
+ !LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders"))
+ {
+ ctrl_wind_light->setEnabled(FALSE);
+ ctrl_wind_light->setValue(FALSE);
+ }
+ else
+ {
+ ctrl_wind_light->setEnabled(gSavedSettings.getBOOL("VertexShaderEnable"));
+ }
+
+ //Deferred/SSAO/Shadows
+ BOOL bumpshiny = gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps && LLFeatureManager::getInstance()->isFeatureAvailable("RenderObjectBump") && gSavedSettings.getBOOL("RenderObjectBump");
+ BOOL shaders = gSavedSettings.getBOOL("WindLightUseAtmosShaders") && gSavedSettings.getBOOL("VertexShaderEnable");
+ BOOL enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
+ bumpshiny &&
+ shaders &&
+ gGLManager.mHasFramebufferObject &&
+ gSavedSettings.getBOOL("RenderAvatarVP") &&
+ (ctrl_wind_light->get()) ? TRUE : FALSE;
+
+ ctrl_deferred->setEnabled(enabled);
+}
+
+void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState()
+{
LLComboBox* ctrl_reflections = getChild<LLComboBox>("Reflections");
- LLRadioGroup* radio_reflection_detail = getChild<LLRadioGroup>("ReflectionDetailRadio");
-
+ LLTextBox* reflections_text = getChild<LLTextBox>("ReflectionsText");
+
// Reflections
BOOL reflections = gSavedSettings.getBOOL("VertexShaderEnable")
&& gGLManager.mHasCubeMap
&& LLCubeMap::sUseCubeMaps;
ctrl_reflections->setEnabled(reflections);
+ reflections_text->setEnabled(reflections);
// Bump & Shiny
LLCheckBoxCtrl* bumpshiny_ctrl = getChild<LLCheckBoxCtrl>("BumpShiny");
bool bumpshiny = gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps && LLFeatureManager::getInstance()->isFeatureAvailable("RenderObjectBump");
bumpshiny_ctrl->setEnabled(bumpshiny ? TRUE : FALSE);
- radio_reflection_detail->setEnabled(reflections);
-
// Avatar Mode
// Enable Avatar Shaders
LLCheckBoxCtrl* ctrl_avatar_vp = getChild<LLCheckBoxCtrl>("AvatarVertexProgram");
@@ -1141,43 +1250,48 @@ void LLFloaterPreference::refreshEnabledState()
if (gSavedSettings.getBOOL("VertexShaderEnable") == FALSE ||
gSavedSettings.getBOOL("RenderAvatarVP") == FALSE)
{
- ctrl_avatar_cloth->setEnabled(false);
+ ctrl_avatar_cloth->setEnabled(FALSE);
}
else
{
- ctrl_avatar_cloth->setEnabled(true);
+ ctrl_avatar_cloth->setEnabled(TRUE);
}
// Vertex Shaders
// Global Shader Enable
LLCheckBoxCtrl* ctrl_shader_enable = getChild<LLCheckBoxCtrl>("BasicShaders");
- // radio set for terrain detail mode
- LLRadioGroup* mRadioTerrainDetail = getChild<LLRadioGroup>("TerrainDetailRadio"); // can be linked with control var
-
+ LLSliderCtrl* terrain_detail = getChild<LLSliderCtrl>("TerrainDetail"); // can be linked with control var
+ LLTextBox* terrain_text = getChild<LLTextBox>("TerrainDetailText");
+
ctrl_shader_enable->setEnabled(LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable"));
BOOL shaders = ctrl_shader_enable->get();
if (shaders)
{
- mRadioTerrainDetail->setValue(1);
- mRadioTerrainDetail->setEnabled(FALSE);
+ terrain_detail->setValue(1);
+ terrain_detail->setEnabled(FALSE);
+ terrain_text->setEnabled(FALSE);
}
else
{
- mRadioTerrainDetail->setEnabled(TRUE);
+ terrain_detail->setEnabled(TRUE);
+ terrain_text->setEnabled(TRUE);
}
// WindLight
LLCheckBoxCtrl* ctrl_wind_light = getChild<LLCheckBoxCtrl>("WindLightUseAtmosShaders");
-
+ LLSliderCtrl* sky = getChild<LLSliderCtrl>("SkyMeshDetail");
+ LLTextBox* sky_text = getChild<LLTextBox>("SkyMeshDetailText");
+
// *HACK just checks to see if we can use shaders...
// maybe some cards that use shaders, but don't support windlight
ctrl_wind_light->setEnabled(ctrl_shader_enable->getEnabled() && shaders);
+ sky->setEnabled(ctrl_wind_light->get() && shaders);
+ sky_text->setEnabled(ctrl_wind_light->get() && shaders);
+
//Deferred/SSAO/Shadows
LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders");
- LLCheckBoxCtrl* ctrl_deferred2 = getChild<LLCheckBoxCtrl>("UseLightShaders2");
-
BOOL enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
((bumpshiny_ctrl && bumpshiny_ctrl->get()) ? TRUE : FALSE) &&
@@ -1187,11 +1301,11 @@ void LLFloaterPreference::refreshEnabledState()
(ctrl_wind_light->get()) ? TRUE : FALSE;
ctrl_deferred->setEnabled(enabled);
- ctrl_deferred2->setEnabled(enabled);
LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");
LLComboBox* ctrl_shadow = getChild<LLComboBox>("ShadowDetail");
+ LLTextBox* shadow_text = getChild<LLTextBox>("RenderShadowDetailText");
// note, okay here to get from ctrl_deferred as it's twin, ctrl_deferred2 will alway match it
enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO") && (ctrl_deferred->get() ? TRUE : FALSE);
@@ -1204,7 +1318,33 @@ void LLFloaterPreference::refreshEnabledState()
enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail");
ctrl_shadow->setEnabled(enabled);
-
+ shadow_text->setEnabled(enabled);
+
+ // Hardware settings
+ F32 mem_multiplier = gSavedSettings.getF32("RenderTextureMemoryMultiple");
+ S32Megabytes min_tex_mem = LLViewerTextureList::getMinVideoRamSetting();
+ S32Megabytes max_tex_mem = LLViewerTextureList::getMaxVideoRamSetting(false, mem_multiplier);
+ getChild<LLSliderCtrl>("GraphicsCardTextureMemory")->setMinValue(min_tex_mem.value());
+ getChild<LLSliderCtrl>("GraphicsCardTextureMemory")->setMaxValue(max_tex_mem.value());
+
+ if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderVBOEnable") ||
+ !gGLManager.mHasVertexBufferObject)
+ {
+ getChildView("vbo")->setEnabled(FALSE);
+ }
+
+ if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderCompressTextures") ||
+ !gGLManager.mHasVertexBufferObject)
+ {
+ getChildView("texture compression")->setEnabled(FALSE);
+ }
+
+ // if no windlight shaders, turn off nighttime brightness, gamma, and fog distance
+ LLUICtrl* gamma_ctrl = getChild<LLUICtrl>("gamma");
+ gamma_ctrl->setEnabled(!gPipeline.canUseWindLightShaders());
+ getChildView("(brightness, lower is brighter)")->setEnabled(!gPipeline.canUseWindLightShaders());
+ getChildView("fog")->setEnabled(!gPipeline.canUseWindLightShaders());
+ getChildView("antialiasing restart")->setVisible(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred"));
// now turn off any features that are unavailable
disableUnavailableSettings();
@@ -1215,19 +1355,63 @@ void LLFloaterPreference::refreshEnabledState()
getChild<LLButton>("default_creation_permissions")->setEnabled(LLStartUp::getStartupState() < STATE_STARTED ? false : true);
}
-void LLFloaterPreference::disableUnavailableSettings()
+// static
+void LLFloaterPreferenceGraphicsAdvanced::setIndirectControls()
+{
+ /*
+ * We have controls that have an indirect relationship between the control
+ * values and adjacent text and the underlying setting they influence.
+ * In each case, the control and its associated setting are named Indirect<something>
+ * This method interrogates the controlled setting and establishes the
+ * appropriate value for the indirect control. It must be called whenever the
+ * underlying setting may have changed other than through the indirect control,
+ * such as when the 'Reset all to recommended settings' button is used...
+ */
+ setIndirectMaxNonImpostors();
+ setIndirectMaxArc();
+}
+
+// static
+void LLFloaterPreferenceGraphicsAdvanced::setIndirectMaxNonImpostors()
+{
+ U32 max_non_impostors = gSavedSettings.getU32("RenderAvatarMaxNonImpostors");
+ // for this one, we just need to make zero, which means off, the max value of the slider
+ U32 indirect_max_non_impostors = (0 == max_non_impostors) ? LLVOAvatar::IMPOSTORS_OFF : max_non_impostors;
+ gSavedSettings.setU32("IndirectMaxNonImpostors", indirect_max_non_impostors);
+}
+
+void LLFloaterPreferenceGraphicsAdvanced::setIndirectMaxArc()
+{
+ U32 max_arc = gSavedSettings.getU32("RenderAvatarMaxComplexity");
+ U32 indirect_max_arc;
+ if (0 == max_arc)
+ {
+ // the off position is all the way to the right, so set to control max
+ indirect_max_arc = INDIRECT_MAX_ARC_OFF;
+ }
+ else
+ {
+ // This is the inverse of the calculation in updateMaxComplexity
+ indirect_max_arc = (U32)((log(max_arc) - MIN_ARC_LOG) / ARC_LIMIT_MAP_SCALE) + MIN_INDIRECT_ARC_LIMIT;
+ }
+ gSavedSettings.setU32("IndirectMaxComplexity", indirect_max_arc);
+}
+
+void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()
{
LLComboBox* ctrl_reflections = getChild<LLComboBox>("Reflections");
+ LLTextBox* reflections_text = getChild<LLTextBox>("ReflectionsText");
LLCheckBoxCtrl* ctrl_avatar_vp = getChild<LLCheckBoxCtrl>("AvatarVertexProgram");
LLCheckBoxCtrl* ctrl_avatar_cloth = getChild<LLCheckBoxCtrl>("AvatarCloth");
LLCheckBoxCtrl* ctrl_shader_enable = getChild<LLCheckBoxCtrl>("BasicShaders");
LLCheckBoxCtrl* ctrl_wind_light = getChild<LLCheckBoxCtrl>("WindLightUseAtmosShaders");
- LLCheckBoxCtrl* ctrl_avatar_impostors = getChild<LLCheckBoxCtrl>("AvatarImpostors");
LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders");
- LLCheckBoxCtrl* ctrl_deferred2 = getChild<LLCheckBoxCtrl>("UseLightShaders2");
LLComboBox* ctrl_shadows = getChild<LLComboBox>("ShadowDetail");
+ LLTextBox* shadows_text = getChild<LLTextBox>("RenderShadowDetailText");
LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");
+ LLSliderCtrl* sky = getChild<LLSliderCtrl>("SkyMeshDetail");
+ LLTextBox* sky_text = getChild<LLTextBox>("SkyMeshDetailText");
// if vertex shaders off, disable all shader related products
if (!LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable"))
@@ -1237,9 +1421,13 @@ void LLFloaterPreference::disableUnavailableSettings()
ctrl_wind_light->setEnabled(FALSE);
ctrl_wind_light->setValue(FALSE);
-
+
+ sky->setEnabled(FALSE);
+ sky_text->setEnabled(FALSE);
+
ctrl_reflections->setEnabled(FALSE);
ctrl_reflections->setValue(0);
+ reflections_text->setEnabled(FALSE);
ctrl_avatar_vp->setEnabled(FALSE);
ctrl_avatar_vp->setValue(FALSE);
@@ -1249,6 +1437,7 @@ void LLFloaterPreference::disableUnavailableSettings()
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
+ shadows_text->setEnabled(FALSE);
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
@@ -1258,8 +1447,6 @@ void LLFloaterPreference::disableUnavailableSettings()
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
- ctrl_deferred2->setEnabled(FALSE);
- ctrl_deferred2->setValue(FALSE);
}
// disabled windlight
@@ -1268,9 +1455,13 @@ void LLFloaterPreference::disableUnavailableSettings()
ctrl_wind_light->setEnabled(FALSE);
ctrl_wind_light->setValue(FALSE);
+ sky->setEnabled(FALSE);
+ sky_text->setEnabled(FALSE);
+
//deferred needs windlight, disable deferred
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
+ shadows_text->setEnabled(FALSE);
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
@@ -1280,8 +1471,6 @@ void LLFloaterPreference::disableUnavailableSettings()
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
- ctrl_deferred2->setEnabled(FALSE);
- ctrl_deferred2->setValue(FALSE);
}
// disabled deferred
@@ -1290,6 +1479,7 @@ void LLFloaterPreference::disableUnavailableSettings()
{
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
+ shadows_text->setEnabled(FALSE);
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
@@ -1299,8 +1489,6 @@ void LLFloaterPreference::disableUnavailableSettings()
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
- ctrl_deferred2->setEnabled(FALSE);
- ctrl_deferred2->setValue(FALSE);
}
// disabled deferred SSAO
@@ -1315,6 +1503,7 @@ void LLFloaterPreference::disableUnavailableSettings()
{
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
+ shadows_text->setEnabled(FALSE);
}
// disabled reflections
@@ -1322,6 +1511,7 @@ void LLFloaterPreference::disableUnavailableSettings()
{
ctrl_reflections->setEnabled(FALSE);
ctrl_reflections->setValue(FALSE);
+ reflections_text->setEnabled(FALSE);
}
// disabled av
@@ -1336,6 +1526,7 @@ void LLFloaterPreference::disableUnavailableSettings()
//deferred needs AvatarVP, disable deferred
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
+ shadows_text->setEnabled(FALSE);
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
@@ -1345,8 +1536,6 @@ void LLFloaterPreference::disableUnavailableSettings()
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
- ctrl_deferred2->setEnabled(FALSE);
- ctrl_deferred2->setValue(FALSE);
}
// disabled cloth
@@ -1355,18 +1544,22 @@ void LLFloaterPreference::disableUnavailableSettings()
ctrl_avatar_cloth->setEnabled(FALSE);
ctrl_avatar_cloth->setValue(FALSE);
}
+}
- // disabled impostors
- if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderUseImpostors"))
+void LLFloaterPreference::refresh()
+{
+ LLPanel::refresh();
+ refreshEnabledState();
+ LLFloater* advanced = LLFloaterReg::findTypedInstance<LLFloater>("prefs_graphics_advanced");
+ if (advanced)
{
- ctrl_avatar_impostors->setEnabled(FALSE);
- ctrl_avatar_impostors->setValue(FALSE);
+ advanced->refresh();
}
}
-void LLFloaterPreference::refresh()
+void LLFloaterPreferenceGraphicsAdvanced::refresh()
{
- LLPanel::refresh();
+ getChild<LLUICtrl>("fsaa")->setValue((LLSD::Integer) gSavedSettings.getU32("RenderFSAASamples"));
// sliders and their text boxes
// mPostProcess = gSavedSettings.getS32("RenderGlowResolutionPow");
@@ -1375,12 +1568,14 @@ void LLFloaterPreference::refresh()
updateSliderText(getChild<LLSliderCtrl>("FlexibleMeshDetail", true), getChild<LLTextBox>("FlexibleMeshDetailText", true));
updateSliderText(getChild<LLSliderCtrl>("TreeMeshDetail", true), getChild<LLTextBox>("TreeMeshDetailText", true));
updateSliderText(getChild<LLSliderCtrl>("AvatarMeshDetail", true), getChild<LLTextBox>("AvatarMeshDetailText", true));
- updateSliderText(getChild<LLSliderCtrl>("AvatarMeshDetail2", true), getChild<LLTextBox>("AvatarMeshDetailText2", true));
updateSliderText(getChild<LLSliderCtrl>("AvatarPhysicsDetail", true), getChild<LLTextBox>("AvatarPhysicsDetailText", true));
updateSliderText(getChild<LLSliderCtrl>("TerrainMeshDetail", true), getChild<LLTextBox>("TerrainMeshDetailText", true));
updateSliderText(getChild<LLSliderCtrl>("RenderPostProcess", true), getChild<LLTextBox>("PostProcessText", true));
updateSliderText(getChild<LLSliderCtrl>("SkyMeshDetail", true), getChild<LLTextBox>("SkyMeshDetailText", true));
-
+ updateSliderText(getChild<LLSliderCtrl>("TerrainDetail", true), getChild<LLTextBox>("TerrainDetailText", true));
+ setIndirectControls();
+ setMaxNonImpostorsText(gSavedSettings.getU32("RenderAvatarMaxNonImpostors"),getChild<LLTextBox>("IndirectMaxNonImpostorsText", true));
+ setMaxComplexityText(gSavedSettings.getU32("RenderAvatarMaxComplexity"),getChild<LLTextBox>("IndirectMaxComplexityText", true));
refreshEnabledState();
}
@@ -1625,6 +1820,7 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
getChildView("favorites_on_login_check")->setEnabled(TRUE);
getChildView("log_path_button")->setEnabled(TRUE);
getChildView("chat_font_size")->setEnabled(TRUE);
+ getChildView("conversation_log_combo")->setEnabled(TRUE);
}
@@ -1633,11 +1829,11 @@ void LLFloaterPreference::refreshUI()
refresh();
}
-void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box)
+void LLFloaterPreferenceGraphicsAdvanced::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box)
{
if (text_box == NULL || ctrl== NULL)
return;
-
+
// get range and points when text should change
F32 value = (F32)ctrl->getValue().asReal();
F32 min = ctrl->getMinValue();
@@ -1646,7 +1842,7 @@ void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_b
llassert(range > 0);
F32 midPoint = min + range / 3.0f;
F32 highPoint = min + (2.0f * range / 3.0f);
-
+
// choose the right text
if (value < midPoint)
{
@@ -1662,6 +1858,72 @@ void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_b
}
}
+void LLFloaterPreferenceGraphicsAdvanced::updateMaxNonImpostors()
+{
+ // Called when the IndirectMaxNonImpostors control changes
+ // Responsible for fixing the slider label (IndirectMaxNonImpostorsText) and setting RenderAvatarMaxNonImpostors
+ LLSliderCtrl* ctrl = getChild<LLSliderCtrl>("IndirectMaxNonImpostors",true);
+ U32 value = ctrl->getValue().asInteger();
+
+ if (0 == value || LLVOAvatar::IMPOSTORS_OFF <= value)
+ {
+ value=0;
+ }
+ gSavedSettings.setU32("RenderAvatarMaxNonImpostors", value);
+ LLVOAvatar::updateImpostorRendering(value); // make it effective immediately
+ setMaxNonImpostorsText(value, getChild<LLTextBox>("IndirectMaxNonImpostorsText"));
+}
+
+void LLFloaterPreferenceGraphicsAdvanced::setMaxNonImpostorsText(U32 value, LLTextBox* text_box)
+{
+ if (0 == value)
+ {
+ text_box->setText(LLTrans::getString("no_limit"));
+ }
+ else
+ {
+ text_box->setText(llformat("%d", value));
+ }
+}
+
+void LLFloaterPreferenceGraphicsAdvanced::updateMaxComplexity()
+{
+ // Called when the IndirectMaxComplexity control changes
+ // Responsible for fixing the slider label (IndirectMaxComplexityText) and setting RenderAvatarMaxComplexity
+ LLSliderCtrl* ctrl = getChild<LLSliderCtrl>("IndirectMaxComplexity");
+ U32 indirect_value = ctrl->getValue().asInteger();
+ U32 max_arc;
+
+ if (INDIRECT_MAX_ARC_OFF == indirect_value)
+ {
+ // The 'off' position is when the slider is all the way to the right,
+ // which is a value of INDIRECT_MAX_ARC_OFF,
+ // so it is necessary to set max_arc to 0 disable muted avatars.
+ max_arc = 0;
+ }
+ else
+ {
+ // if this is changed, the inverse calculation in setIndirectMaxArc
+ // must be changed to match
+ max_arc = (U32)exp(MIN_ARC_LOG + (ARC_LIMIT_MAP_SCALE * (indirect_value - MIN_INDIRECT_ARC_LIMIT)));
+ }
+
+ gSavedSettings.setU32("RenderAvatarMaxComplexity", (U32)max_arc);
+ setMaxComplexityText(max_arc, getChild<LLTextBox>("IndirectMaxComplexityText"));
+}
+
+void LLFloaterPreferenceGraphicsAdvanced::setMaxComplexityText(U32 value, LLTextBox* text_box)
+{
+ if (0 == value)
+ {
+ text_box->setText(LLTrans::getString("no_limit"));
+ }
+ else
+ {
+ text_box->setText(llformat("%d", value));
+ }
+}
+
void LLFloaterPreference::onChangeMaturity()
{
U8 sim_access = gSavedSettings.getU32("PreferredMaturity");
@@ -1704,6 +1966,11 @@ void LLFloaterPreference::onClickSpellChecker()
LLFloaterReg::showInstance("prefs_spellchecker");
}
+void LLFloaterPreference::onClickAdvanced()
+{
+ LLFloaterReg::showInstance("prefs_graphics_advanced");
+}
+
void LLFloaterPreference::onClickActionChange()
{
mClickActionDirty = true;
@@ -1861,6 +2128,9 @@ LLPanelPreference::LLPanelPreference()
{
mCommitCallbackRegistrar.add("Pref.setControlFalse", boost::bind(&LLPanelPreference::setControlFalse,this, _2));
mCommitCallbackRegistrar.add("Pref.updateMediaAutoPlayCheckbox", boost::bind(&LLPanelPreference::updateMediaAutoPlayCheckbox, this, _1));
+ mCommitCallbackRegistrar.add("Pref.PrefDelete", boost::bind(&LLPanelPreference::deletePreset, this, _2));
+ mCommitCallbackRegistrar.add("Pref.PrefSave", boost::bind(&LLPanelPreference::savePreset, this, _2));
+ mCommitCallbackRegistrar.add("Pref.PrefLoad", boost::bind(&LLPanelPreference::loadPreset, this, _2));
}
//virtual
@@ -1919,7 +2189,7 @@ BOOL LLPanelPreference::postBuild()
}
if (hasChild("favorites_on_login_check", TRUE))
{
- getChild<LLCheckBoxCtrl>("favorites_on_login_check")->setCommitCallback(boost::bind(&showFavoritesOnLoginWarning, _1, _2));
+ getChild<LLCheckBoxCtrl>("favorites_on_login_check")->setCommitCallback(boost::bind(&handleFavoritesOnLoginChanged, _1, _2));
bool show_favorites_at_login = LLPanelLogin::getShowFavorites();
getChild<LLCheckBoxCtrl>("favorites_on_login_check")->setValue(show_favorites_at_login);
}
@@ -1959,10 +2229,16 @@ void LLPanelPreference::apply()
void LLPanelPreference::saveSettings()
{
+ LLFloater* advanced = LLFloaterReg::findTypedInstance<LLFloater>("prefs_graphics_advanced");
+
// Save the value of all controls in the hierarchy
mSavedValues.clear();
std::list<LLView*> view_stack;
view_stack.push_back(this);
+ if (advanced)
+ {
+ view_stack.push_back(advanced);
+ }
while(!view_stack.empty())
{
// Process view on top of the stack
@@ -2004,11 +2280,15 @@ void LLPanelPreference::showFriendsOnlyWarning(LLUICtrl* checkbox, const LLSD& v
}
}
-void LLPanelPreference::showFavoritesOnLoginWarning(LLUICtrl* checkbox, const LLSD& value)
+void LLPanelPreference::handleFavoritesOnLoginChanged(LLUICtrl* checkbox, const LLSD& value)
{
- if (checkbox && checkbox->getValue())
+ if (checkbox)
{
- LLNotificationsUtil::add("FavoritesOnLogin");
+ LLFavoritesOrderStorage::instance().showFavoritesOnLoginChanged(checkbox->getValue().asBoolean());
+ if(checkbox->getValue())
+ {
+ LLNotificationsUtil::add("FavoritesOnLogin");
+ }
}
}
@@ -2064,6 +2344,28 @@ void LLPanelPreference::updateMediaAutoPlayCheckbox(LLUICtrl* ctrl)
}
}
+void LLPanelPreference::deletePreset(const LLSD& user_data)
+{
+ std::string subdirectory = user_data.asString();
+ LLFloaterReg::showInstance("delete_pref_preset", subdirectory);
+}
+
+void LLPanelPreference::savePreset(const LLSD& user_data)
+{
+ std::string subdirectory = user_data.asString();
+ LLFloaterReg::showInstance("save_pref_preset", subdirectory);
+}
+
+void LLPanelPreference::loadPreset(const LLSD& user_data)
+{
+ std::string subdirectory = user_data.asString();
+ LLFloaterReg::showInstance("load_pref_preset", subdirectory);
+}
+
+void LLPanelPreference::setHardwareDefaults()
+{
+}
+
class LLPanelPreferencePrivacy : public LLPanelPreference
{
public:
@@ -2107,25 +2409,79 @@ static LLPanelInjector<LLPanelPreferencePrivacy> t_pref_privacy("panel_preferenc
BOOL LLPanelPreferenceGraphics::postBuild()
{
+ LLFloaterReg::showInstance("prefs_graphics_advanced");
+ LLFloaterReg::hideInstance("prefs_graphics_advanced");
+
+// Don't do this on Mac as their braindead GL versioning
+// sets this when 8x and 16x are indeed available
+//
+#if !LL_DARWIN
+ if (gGLManager.mIsIntel || gGLManager.mGLVersion < 3.f)
+ { //remove FSAA settings above "4x"
+ LLComboBox* combo = getChild<LLComboBox>("fsaa");
+ combo->remove("8x");
+ combo->remove("16x");
+ }
+#endif
+
+ resetDirtyChilds();
+ setPresetText();
+
+ LLPresetsManager* presetsMgr = LLPresetsManager::getInstance();
+ presetsMgr->setPresetListChangeCallback(boost::bind(&LLPanelPreferenceGraphics::onPresetsListChange, this));
+ presetsMgr->createMissingDefault(); // a no-op after the first time, but that's ok
+
return LLPanelPreference::postBuild();
}
+
void LLPanelPreferenceGraphics::draw()
{
+ setPresetText();
LLPanelPreference::draw();
-
- LLButton* button_apply = findChild<LLButton>("Apply");
-
- if (button_apply && button_apply->getVisible())
+}
+
+void LLPanelPreferenceGraphics::onPresetsListChange()
+{
+ resetDirtyChilds();
+ setPresetText();
+}
+
+void LLPanelPreferenceGraphics::setPresetText()
+{
+ LLTextBox* preset_text = getChild<LLTextBox>("preset_text");
+
+ std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive");
+
+ if (hasDirtyChilds() && !preset_graphic_active.empty())
{
- bool enable = hasDirtyChilds();
+ gSavedSettings.setString("PresetGraphicActive", "");
+ preset_graphic_active.clear();
+ // This doesn't seem to cause an infinite recursion. This trigger is needed to cause the pulldown
+ // panel to update.
+ LLPresetsManager::getInstance()->triggerChangeSignal();
+ }
- button_apply->setEnabled(enable);
+ if (!preset_graphic_active.empty())
+ {
+ preset_text->setText(preset_graphic_active);
}
+ else
+ {
+ preset_text->setText(LLTrans::getString("none_paren_cap"));
+ }
+
+ preset_text->resetDirty();
}
+
bool LLPanelPreferenceGraphics::hasDirtyChilds()
{
+ LLFloater* advanced = LLFloaterReg::findTypedInstance<LLFloater>("prefs_graphics_advanced");
std::list<LLView*> view_stack;
view_stack.push_back(this);
+ if (advanced)
+ {
+ view_stack.push_back(advanced);
+ }
while(!view_stack.empty())
{
// Process view on top of the stack
@@ -2136,7 +2492,17 @@ bool LLPanelPreferenceGraphics::hasDirtyChilds()
if (ctrl)
{
if (ctrl->isDirty())
- return true;
+ {
+ LLControlVariable* control = ctrl->getControlVariable();
+ if (control)
+ {
+ std::string control_name = control->getName();
+ if (!control_name.empty())
+ {
+ return true;
+ }
+ }
+ }
}
// Push children onto the end of the work stack
for (child_list_t::const_iterator iter = curview->getChildList()->begin();
@@ -2144,14 +2510,20 @@ bool LLPanelPreferenceGraphics::hasDirtyChilds()
{
view_stack.push_back(*iter);
}
- }
+ }
+
return false;
}
void LLPanelPreferenceGraphics::resetDirtyChilds()
{
+ LLFloater* advanced = LLFloaterReg::findTypedInstance<LLFloater>("prefs_graphics_advanced");
std::list<LLView*> view_stack;
view_stack.push_back(this);
+ if (advanced)
+ {
+ view_stack.push_back(advanced);
+ }
while(!view_stack.empty())
{
// Process view on top of the stack
@@ -2171,14 +2543,9 @@ void LLPanelPreferenceGraphics::resetDirtyChilds()
}
}
}
-void LLPanelPreferenceGraphics::apply()
-{
- resetDirtyChilds();
- LLPanelPreference::apply();
-}
+
void LLPanelPreferenceGraphics::cancel()
{
- resetDirtyChilds();
LLPanelPreference::cancel();
}
void LLPanelPreferenceGraphics::saveSettings()
@@ -2189,7 +2556,18 @@ void LLPanelPreferenceGraphics::saveSettings()
void LLPanelPreferenceGraphics::setHardwareDefaults()
{
resetDirtyChilds();
- LLPanelPreference::setHardwareDefaults();
+}
+
+LLFloaterPreferenceGraphicsAdvanced::LLFloaterPreferenceGraphicsAdvanced(const LLSD& key)
+ : LLFloater(key)
+{
+ mCommitCallbackRegistrar.add("Pref.VertexShaderEnable", boost::bind(&LLFloaterPreferenceGraphicsAdvanced::onVertexShaderEnable, this));
+ mCommitCallbackRegistrar.add("Pref.UpdateIndirectMaxNonImpostors", boost::bind(&LLFloaterPreferenceGraphicsAdvanced::updateMaxNonImpostors,this));
+ mCommitCallbackRegistrar.add("Pref.UpdateIndirectMaxComplexity", boost::bind(&LLFloaterPreferenceGraphicsAdvanced::updateMaxComplexity,this));
+}
+
+LLFloaterPreferenceGraphicsAdvanced::~LLFloaterPreferenceGraphicsAdvanced()
+{
}
LLFloaterPreferenceProxy::LLFloaterPreferenceProxy(const LLSD& key)
@@ -2201,6 +2579,11 @@ LLFloaterPreferenceProxy::LLFloaterPreferenceProxy(const LLSD& key)
mCommitCallbackRegistrar.add("Proxy.Change", boost::bind(&LLFloaterPreferenceProxy::onChangeSocksSettings, this));
}
+void LLFloaterPreferenceGraphicsAdvanced::onOpen(const LLSD& key)
+{
+ refresh();
+}
+
LLFloaterPreferenceProxy::~LLFloaterPreferenceProxy()
{
}
@@ -2235,6 +2618,11 @@ void LLFloaterPreferenceProxy::onOpen(const LLSD& key)
void LLFloaterPreferenceProxy::onClose(bool app_quitting)
{
+ if(app_quitting)
+ {
+ cancel();
+ }
+
if (mSocksSettingsDirty)
{
@@ -2334,6 +2722,11 @@ void LLFloaterPreferenceProxy::onBtnCancel()
cancel();
}
+void LLFloaterPreferenceProxy::onClickCloseBtn(bool app_quitting)
+{
+ cancel();
+}
+
void LLFloaterPreferenceProxy::cancel()
{
@@ -2344,7 +2737,7 @@ void LLFloaterPreferenceProxy::cancel()
LLSD ctrl_value = iter->second;
control->set(ctrl_value);
}
-
+ mSocksSettingsDirty = false;
closeFloater();
}
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 7bf6ae7d79..03dab13689 100755
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -58,7 +58,6 @@ typedef enum
} EGraphicsSettings;
-
// Floater to control preferences (display, audio, bandwidth, general.
class LLFloaterPreference : public LLFloater, public LLAvatarPropertiesObserver, public LLConversationLogObserver
{
@@ -93,11 +92,11 @@ public:
void saveAvatarProperties( void );
void selectPrivacyPanel();
void selectChatPanel();
+ void getControlNames(std::vector<std::string>& names);
protected:
- void onBtnOK();
- void onBtnCancel();
- void onBtnApply();
+ void onBtnOK(const LLSD& userdata);
+ void onBtnCancel(const LLSD& userdata);
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
@@ -111,11 +110,13 @@ protected:
// if the custom settings box is clicked
void onChangeCustom();
void updateMeterText(LLUICtrl* ctrl);
- void onOpenHardwareSettings();
// callback for defaults
void setHardwareDefaults();
+ void setRecommended();
// callback for when client turns on shaders
void onVertexShaderEnable();
+ // callback for when client turns on impostors
+ void onAvatarImpostorsEnable();
// callback for commit in the "Single click on land" and "Double click on land" comboboxes.
void onClickActionChange();
@@ -123,7 +124,7 @@ protected:
void updateClickActionSettings();
// updates click/double-click action controls depending on values from settings.xml
void updateClickActionControls();
-
+
// This function squirrels away the current values of the controls so that
// cancel() can restore them.
void saveSettings();
@@ -150,13 +151,11 @@ public:
void enableHistory();
void setPersonalInfo(const std::string& visibility, bool im_via_email);
void refreshEnabledState();
- void disableUnavailableSettings();
void onCommitWindowedMode();
void refresh(); // Refresh enable/disable
// if the quality radio buttons are changed
void onChangeQuality(const LLSD& data);
- void updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box);
void refreshUI();
void onCommitParcelMediaAutoPlayEnable();
@@ -170,6 +169,7 @@ public:
void onClickPermsDefault();
void onClickAutoReplace();
void onClickSpellChecker();
+ void onClickAdvanced();
void applyUIColor(LLUICtrl* ctrl, const LLSD& param);
void getUIColor(LLUICtrl* ctrl, const LLSD& param);
void onLogChatHistorySaved();
@@ -196,6 +196,7 @@ private:
std::string mDirectoryVisibility;
LLAvatarData mAvatarProperties;
+ LOG_CLASS(LLFloaterPreference);
};
class LLPanelPreference : public LLPanel
@@ -209,7 +210,7 @@ public:
virtual void apply();
virtual void cancel();
void setControlFalse(const LLSD& user_data);
- virtual void setHardwareDefaults(){};
+ virtual void setHardwareDefaults();
// Disables "Allow Media to auto play" check box only when both
// "Streaming Music" and "Media" are unchecked. Otherwise enables it.
@@ -218,7 +219,11 @@ public:
// This function squirrels away the current values of the controls so that
// cancel() can restore them.
virtual void saveSettings();
-
+
+ void deletePreset(const LLSD& user_data);
+ void savePreset(const LLSD& user_data);
+ void loadPreset(const LLSD& user_data);
+
class Updater;
protected:
@@ -229,12 +234,13 @@ private:
//for "Only friends and groups can call or IM me"
static void showFriendsOnlyWarning(LLUICtrl*, const LLSD&);
//for "Show my Favorite Landmarks at Login"
- static void showFavoritesOnLoginWarning(LLUICtrl* checkbox, const LLSD& value);
+ static void handleFavoritesOnLoginChanged(LLUICtrl* checkbox, const LLSD& value);
typedef std::map<std::string, LLColor4> string_color_map_t;
string_color_map_t mSavedColors;
Updater* mBandWidthUpdater;
+ LOG_CLASS(LLPanelPreference);
};
class LLPanelPreferenceGraphics : public LLPanelPreference
@@ -242,14 +248,44 @@ class LLPanelPreferenceGraphics : public LLPanelPreference
public:
BOOL postBuild();
void draw();
- void apply();
void cancel();
void saveSettings();
+ void resetDirtyChilds();
void setHardwareDefaults();
+ void setPresetText();
+
+ static const std::string getPresetsPath();
+
protected:
bool hasDirtyChilds();
- void resetDirtyChilds();
-
+
+private:
+
+ void onPresetsListChange();
+ LOG_CLASS(LLPanelPreferenceGraphics);
+};
+
+class LLFloaterPreferenceGraphicsAdvanced : public LLFloater
+{
+public:
+ LLFloaterPreferenceGraphicsAdvanced(const LLSD& key);
+ ~LLFloaterPreferenceGraphicsAdvanced();
+ void onOpen(const LLSD& key);
+ void disableUnavailableSettings();
+ void refreshEnabledGraphics();
+ void refreshEnabledState();
+ void updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box);
+ void updateMaxNonImpostors();
+ void setMaxNonImpostorsText(U32 value, LLTextBox* text_box);
+ void updateMaxComplexity();
+ void setMaxComplexityText(U32 value, LLTextBox* text_box);
+ static void setIndirectControls();
+ static void setIndirectMaxNonImpostors();
+ static void setIndirectMaxArc();
+ void refresh();
+ // callback for when client turns on shaders
+ void onVertexShaderEnable();
+ LOG_CLASS(LLFloaterPreferenceGraphicsAdvanced);
};
class LLFloaterPreferenceProxy : public LLFloater
@@ -269,6 +305,7 @@ protected:
void saveSettings();
void onBtnOk();
void onBtnCancel();
+ void onClickCloseBtn(bool app_quitting = false);
void onChangeSocksSettings();
@@ -277,7 +314,7 @@ private:
bool mSocksSettingsDirty;
typedef std::map<LLControlVariable*, LLSD> control_values_map_t;
control_values_map_t mSavedValues;
-
+ LOG_CLASS(LLFloaterPreferenceProxy);
};
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index a2af9da670..5d1e01c1f7 100755
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -92,6 +92,11 @@
#include "llagentui.h"
#include "llmeshrepository.h"
#include "llfloaterregionrestarting.h"
+#include "llpanelexperiencelisteditor.h"
+#include <boost/function.hpp>
+#include "llpanelexperiencepicker.h"
+#include "llexperiencecache.h"
+#include "llpanelexperiences.h"
const S32 TERRAIN_TEXTURE_COUNT = 4;
const S32 CORNER_COUNT = 4;
@@ -126,6 +131,18 @@ public:
const sparam_t& strings);
};
+class LLDispatchSetEstateExperience : public LLDispatchHandler
+{
+public:
+ virtual bool operator()(
+ const LLDispatcher* dispatcher,
+ const std::string& key,
+ const LLUUID& invoice,
+ const sparam_t& strings);
+
+ LLSD getIDs( sparam_t::const_iterator it, sparam_t::const_iterator end, S32 count );
+};
+
/*
void unpack_request_params(
@@ -215,6 +232,14 @@ BOOL LLFloaterRegionInfo::postBuild()
panel->buildFromFile("panel_region_debug.xml");
mTab->addTabPanel(panel);
+ if(!gAgent.getRegion()->getCapability("RegionExperiences").empty())
+ {
+ panel = new LLPanelRegionExperiences;
+ mInfoPanels.push_back(panel);
+ panel->buildFromFile("panel_region_experiences.xml");
+ mTab->addTabPanel(panel);
+ }
+
gMessageSystem->setHandlerFunc(
"EstateOwnerMessage",
&processEstateOwnerRequest);
@@ -445,6 +470,16 @@ LLPanelRegionTerrainInfo* LLFloaterRegionInfo::getPanelRegionTerrain()
return panel;
}
+LLPanelRegionExperiences* LLFloaterRegionInfo::getPanelExperiences()
+{
+ LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
+ if (!floater) return NULL;
+ LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels");
+ return (LLPanelRegionExperiences*)tab->getChild<LLPanel>("Experiences");
+}
+
+
+
void LLFloaterRegionInfo::onTabSelected(const LLSD& param)
{
LLPanel* active_panel = getChild<LLPanel>(param.asString());
@@ -1394,6 +1429,11 @@ void LLPanelEstateInfo::initDispatch(LLDispatcher& dispatch)
static LLDispatchSetEstateAccess set_access;
dispatch.addHandler(name, &set_access);
+
+ name.assign("setexperience");
+ static LLDispatchSetEstateExperience set_experience;
+ dispatch.addHandler(name, &set_experience);
+
estate_dispatch_initialized = true;
}
@@ -2903,6 +2943,56 @@ bool LLDispatchSetEstateAccess::operator()(
return true;
}
+LLSD LLDispatchSetEstateExperience::getIDs( sparam_t::const_iterator it, sparam_t::const_iterator end, S32 count )
+{
+ LLSD idList = LLSD::emptyArray();
+ LLUUID id;
+ while(count--> 0)
+ {
+ memcpy(id.mData, (*(it++)).data(), UUID_BYTES);
+ idList.append(id);
+ }
+ return idList;
+}
+
+// key = "setexperience"
+// strings[0] = str(estate_id)
+// strings[1] = str(send_to_agent_only)
+// strings[2] = str(num blocked)
+// strings[3] = str(num trusted)
+// strings[4] = str(num allowed)
+// strings[8] = bin(uuid) ...
+// ...
+bool LLDispatchSetEstateExperience::operator()(
+ const LLDispatcher* dispatcher,
+ const std::string& key,
+ const LLUUID& invoice,
+ const sparam_t& strings)
+{
+ LLPanelRegionExperiences* panel = LLFloaterRegionInfo::getPanelExperiences();
+ if (!panel) return true;
+
+ sparam_t::const_iterator it = strings.begin();
+ ++it; // U32 estate_id = strtol((*it).c_str(), NULL, 10);
+ ++it; // U32 send_to_agent_only = strtoul((*(++it)).c_str(), NULL, 10);
+
+ LLUUID id;
+ S32 num_blocked = strtol((*(it++)).c_str(), NULL, 10);
+ S32 num_trusted = strtol((*(it++)).c_str(), NULL, 10);
+ S32 num_allowed = strtol((*(it++)).c_str(), NULL, 10);
+
+ LLSD ids = LLSD::emptyMap()
+ .with("blocked", getIDs(it, strings.end(), num_blocked))
+ .with("trusted", getIDs(it + (num_blocked), strings.end(), num_trusted))
+ .with("allowed", getIDs(it + (num_blocked+num_trusted), strings.end(), num_allowed));
+
+ panel->processResponse(ids);
+
+ return true;
+}
+
+
+
LLPanelEnvironmentInfo::LLPanelEnvironmentInfo()
: mEnableEditing(false),
mRegionSettingsRadioGroup(NULL),
@@ -3494,3 +3584,284 @@ void LLPanelEnvironmentInfo::onRegionSettingsApplied(bool ok)
LLEnvManagerNew::instance().requestRegionSettings();
}
}
+
+BOOL LLPanelRegionExperiences::postBuild()
+{
+ mAllowed = setupList("panel_allowed", ESTATE_EXPERIENCE_ALLOWED_ADD, ESTATE_EXPERIENCE_ALLOWED_REMOVE);
+ mTrusted = setupList("panel_trusted", ESTATE_EXPERIENCE_TRUSTED_ADD, ESTATE_EXPERIENCE_TRUSTED_REMOVE);
+ mBlocked = setupList("panel_blocked", ESTATE_EXPERIENCE_BLOCKED_ADD, ESTATE_EXPERIENCE_BLOCKED_REMOVE);
+
+ getChild<LLLayoutPanel>("trusted_layout_panel")->setVisible(TRUE);
+ getChild<LLTextBox>("experiences_help_text")->setText(getString("estate_caption"));
+ getChild<LLTextBox>("trusted_text_help")->setText(getString("trusted_estate_text"));
+ getChild<LLTextBox>("allowed_text_help")->setText(getString("allowed_estate_text"));
+ getChild<LLTextBox>("blocked_text_help")->setText(getString("blocked_estate_text"));
+
+ return LLPanelRegionInfo::postBuild();
+}
+
+LLPanelExperienceListEditor* LLPanelRegionExperiences::setupList( const char* control_name, U32 add_id, U32 remove_id )
+{
+ LLPanelExperienceListEditor* child = findChild<LLPanelExperienceListEditor>(control_name);
+ if(child)
+ {
+ child->getChild<LLTextBox>("text_name")->setText(child->getString(control_name));
+ child->setMaxExperienceIDs(ESTATE_MAX_EXPERIENCE_IDS);
+ child->setAddedCallback( boost::bind(&LLPanelRegionExperiences::itemChanged, this, add_id, _1));
+ child->setRemovedCallback(boost::bind(&LLPanelRegionExperiences::itemChanged, this, remove_id, _1));
+ }
+
+ return child;
+}
+
+
+void LLPanelRegionExperiences::processResponse( const LLSD& content )
+{
+ if(content.has("default"))
+ {
+ mDefaultExperience = content["default"].asUUID();
+ }
+
+ mAllowed->setExperienceIds(content["allowed"]);
+ mBlocked->setExperienceIds(content["blocked"]);
+
+ LLSD trusted = content["trusted"];
+ if(mDefaultExperience.notNull())
+ {
+ mTrusted->setStickyFunction(boost::bind(LLPanelExperiencePicker::FilterMatching, _1, mDefaultExperience));
+ trusted.append(mDefaultExperience);
+ }
+
+ mTrusted->setExperienceIds(trusted);
+
+ mAllowed->refreshExperienceCounter();
+ mBlocked->refreshExperienceCounter();
+ mTrusted->refreshExperienceCounter();
+
+}
+
+
+class LLRegionExperienceResponder : public LLHTTPClient::Responder
+{
+public:
+ typedef boost::function<void (const LLSD&)> callback_t;
+
+ callback_t mCallback;
+
+ LLRegionExperienceResponder(callback_t callback) : mCallback(callback) { }
+
+protected:
+ /*virtual*/ void httpSuccess()
+ {
+ mCallback(getContent());
+ }
+
+ /*virtual*/ void httpFailure()
+ {
+ LL_WARNS() << "experience responder failed [status:" << getStatus() << "]: " << getContent() << LL_ENDL;
+ }
+};
+
+
+// Used for both access add and remove operations, depending on the flag
+// passed in (ESTATE_EXPERIENCE_ALLOWED_ADD, ESTATE_EXPERIENCE_ALLOWED_REMOVE, etc.)
+// static
+bool LLPanelRegionExperiences::experienceCoreConfirm(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ const U32 originalFlags = (U32)notification["payload"]["operation"].asInteger();
+
+ LLViewerRegion* region = gAgent.getRegion();
+
+ LLSD::array_const_iterator end_it = notification["payload"]["allowed_ids"].endArray();
+
+ for (LLSD::array_const_iterator iter = notification["payload"]["allowed_ids"].beginArray();
+ iter != end_it;
+ iter++)
+ {
+ U32 flags = originalFlags;
+ if (iter + 1 != end_it)
+ flags |= ESTATE_ACCESS_NO_REPLY;
+
+ const LLUUID id = iter->asUUID();
+ switch(option)
+ {
+ case 0:
+ // This estate
+ sendEstateExperienceDelta(flags, id);
+ break;
+ case 1:
+ {
+ // All estates, either than I own or manage for this owner.
+ // This will be verified on simulator. JC
+ if (!region) break;
+ if (region->getOwner() == gAgent.getID()
+ || gAgent.isGodlike())
+ {
+ flags |= ESTATE_ACCESS_APPLY_TO_ALL_ESTATES;
+ sendEstateExperienceDelta(flags, id);
+ }
+ else if (region->isEstateManager())
+ {
+ flags |= ESTATE_ACCESS_APPLY_TO_MANAGED_ESTATES;
+ sendEstateExperienceDelta(flags, id);
+ }
+ break;
+ }
+ case 2:
+ default:
+ break;
+ }
+ }
+ return false;
+}
+
+
+// Send the actual "estateexperiencedelta" message
+void LLPanelRegionExperiences::sendEstateExperienceDelta(U32 flags, const LLUUID& experience_id)
+{
+ strings_t str(3, std::string());
+ gAgent.getID().toString(str[0]);
+ str[1] = llformat("%u", flags);
+ experience_id.toString(str[2]);
+
+ LLPanelRegionExperiences* panel = LLFloaterRegionInfo::getPanelExperiences();
+ if (panel)
+ {
+ panel->sendEstateOwnerMessage(gMessageSystem, "estateexperiencedelta", LLFloaterRegionInfo::getLastInvoice(), str);
+ }
+}
+
+
+void LLPanelRegionExperiences::infoCallback(LLHandle<LLPanelRegionExperiences> handle, const LLSD& content)
+{
+ if(handle.isDead())
+ return;
+
+ LLPanelRegionExperiences* floater = handle.get();
+ if (floater)
+ {
+ floater->processResponse(content);
+ }
+}
+
+
+bool LLPanelRegionExperiences::refreshFromRegion(LLViewerRegion* region)
+{
+ BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate());
+
+ mAllowed->loading();
+ mAllowed->setReadonly(!allow_modify);
+ // remove grid-wide experiences
+ mAllowed->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithProperty, _1, LLExperienceCache::PROPERTY_GRID));
+ // remove default experience
+ mAllowed->addFilter(boost::bind(LLPanelExperiencePicker::FilterMatching, _1, mDefaultExperience));
+
+ mBlocked->loading();
+ mBlocked->setReadonly(!allow_modify);
+ // only grid-wide experiences
+ mBlocked->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithoutProperty, _1, LLExperienceCache::PROPERTY_GRID));
+ // but not privileged ones
+ mBlocked->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithProperty, _1, LLExperienceCache::PROPERTY_PRIVILEGED));
+ // remove default experience
+ mBlocked->addFilter(boost::bind(LLPanelExperiencePicker::FilterMatching, _1, mDefaultExperience));
+
+ mTrusted->loading();
+ mTrusted->setReadonly(!allow_modify);
+
+ std::string url = region->getCapability("RegionExperiences");
+ if (!url.empty())
+ {
+ LLHTTPClient::get(url, new LLRegionExperienceResponder(boost::bind(&LLPanelRegionExperiences::infoCallback,
+ getDerivedHandle<LLPanelRegionExperiences>(), _1)));
+ }
+ return LLPanelRegionInfo::refreshFromRegion(region);
+}
+
+LLSD LLPanelRegionExperiences::addIds(LLPanelExperienceListEditor* panel)
+{
+ LLSD ids;
+ const uuid_list_t& id_list = panel->getExperienceIds();
+ for(uuid_list_t::const_iterator it = id_list.begin(); it != id_list.end(); ++it)
+ {
+ ids.append(*it);
+ }
+ return ids;
+}
+
+
+BOOL LLPanelRegionExperiences::sendUpdate()
+{
+ LLViewerRegion* region = gAgent.getRegion();
+ std::string url = region->getCapability("RegionExperiences");
+ if (!url.empty())
+ {
+ LLSD content;
+
+ content["allowed"]=addIds(mAllowed);
+ content["blocked"]=addIds(mBlocked);
+ content["trusted"]=addIds(mTrusted);
+
+ LLHTTPClient::post(url, content, new LLRegionExperienceResponder(boost::bind(&LLPanelRegionExperiences::infoCallback,
+ getDerivedHandle<LLPanelRegionExperiences>(), _1)));
+ }
+
+ return TRUE;
+}
+
+void LLPanelRegionExperiences::itemChanged( U32 event_type, const LLUUID& id )
+{
+ std::string dialog_name;
+ switch (event_type)
+ {
+ case ESTATE_EXPERIENCE_ALLOWED_ADD:
+ dialog_name = "EstateAllowedExperienceAdd";
+ break;
+
+ case ESTATE_EXPERIENCE_ALLOWED_REMOVE:
+ dialog_name = "EstateAllowedExperienceRemove";
+ break;
+
+ case ESTATE_EXPERIENCE_TRUSTED_ADD:
+ dialog_name = "EstateTrustedExperienceAdd";
+ break;
+
+ case ESTATE_EXPERIENCE_TRUSTED_REMOVE:
+ dialog_name = "EstateTrustedExperienceRemove";
+ break;
+
+ case ESTATE_EXPERIENCE_BLOCKED_ADD:
+ dialog_name = "EstateBlockedExperienceAdd";
+ break;
+
+ case ESTATE_EXPERIENCE_BLOCKED_REMOVE:
+ dialog_name = "EstateBlockedExperienceRemove";
+ break;
+
+ default:
+ return;
+ }
+
+ LLSD payload;
+ payload["operation"] = (S32)event_type;
+ payload["dialog_name"] = dialog_name;
+ payload["allowed_ids"].append(id);
+
+ LLSD args;
+ args["ALL_ESTATES"] = all_estates_text();
+
+ LLNotification::Params params(dialog_name);
+ params.payload(payload)
+ .substitutions(args)
+ .functor.function(LLPanelRegionExperiences::experienceCoreConfirm);
+ if (LLPanelEstateInfo::isLindenEstate())
+ {
+ LLNotifications::instance().forceResponse(params, 0);
+ }
+ else
+ {
+ LLNotifications::instance().add(params);
+ }
+
+ onChangeAnything();
+}
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index 792f60ebc8..e7b49d8553 100755
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -60,6 +60,9 @@ class LLPanelRegionDebugInfo;
class LLPanelRegionTerrainInfo;
class LLPanelEstateInfo;
class LLPanelEstateCovenant;
+class LLPanelExperienceListEditor;
+class LLPanelExperiences;
+class LLPanelRegionExperiences;
class LLEventTimer;
class LLEnvironmentSettings;
@@ -90,6 +93,7 @@ public:
static LLPanelEstateInfo* getPanelEstate();
static LLPanelEstateCovenant* getPanelCovenant();
static LLPanelRegionTerrainInfo* getPanelRegionTerrain();
+ static LLPanelRegionExperiences* getPanelExperiences();
// from LLPanel
virtual void refresh();
@@ -453,4 +457,34 @@ private:
LLComboBox* mDayCyclePresetCombo;
};
+class LLPanelRegionExperiences : public LLPanelRegionInfo
+{
+ LOG_CLASS(LLPanelEnvironmentInfo);
+
+public:
+ LLPanelRegionExperiences(){}
+ /*virtual*/ BOOL postBuild();
+ virtual BOOL sendUpdate();
+
+ static bool experienceCoreConfirm(const LLSD& notification, const LLSD& response);
+ static void sendEstateExperienceDelta(U32 flags, const LLUUID& agent_id);
+
+ static void infoCallback(LLHandle<LLPanelRegionExperiences> handle, const LLSD& content);
+ bool refreshFromRegion(LLViewerRegion* region);
+ void sendPurchaseRequest()const;
+ void processResponse( const LLSD& content );
+private:
+ void refreshRegionExperiences();
+
+ LLPanelExperienceListEditor* setupList(const char* control_name, U32 add_id, U32 remove_id);
+ static LLSD addIds( LLPanelExperienceListEditor* panel );
+
+ void itemChanged(U32 event_type, const LLUUID& id);
+
+ LLPanelExperienceListEditor* mTrusted;
+ LLPanelExperienceListEditor* mAllowed;
+ LLPanelExperienceListEditor* mBlocked;
+ LLUUID mDefaultExperience;
+};
+
#endif
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index ae330211db..99a5cf8002 100755
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -35,6 +35,7 @@
#include "llassetstorage.h"
#include "llavatarnamecache.h"
#include "llcachename.h"
+#include "llcheckboxctrl.h"
#include "llfontgl.h"
#include "llimagej2c.h"
#include "llinventory.h"
@@ -81,6 +82,7 @@
#include "llagentui.h"
#include "lltrans.h"
+#include "llexperiencecache.h"
//-----------------------------------------------------------------------------
// Globals
@@ -106,14 +108,6 @@ LLFloaterReporter::LLFloaterReporter(const LLSD& key)
{
}
-// static
-void LLFloaterReporter::processRegionInfo(LLMessageSystem* msg)
-{
- if ( LLFloaterReg::instanceVisible("reporter") )
- {
- LLNotificationsUtil::add("HelpReportAbuseEmailLL");
- };
-}
// virtual
BOOL LLFloaterReporter::postBuild()
{
@@ -144,19 +138,10 @@ BOOL LLFloaterReporter::postBuild()
mOwnerName = LLStringUtil::null;
getChild<LLUICtrl>("summary_edit")->setFocus(TRUE);
+ getChild<LLCheckBoxCtrl>("screen_check")->set(TRUE);
mDefaultSummary = getChild<LLUICtrl>("details_edit")->getValue().asString();
- // send a message and ask for information about this region -
- // result comes back in processRegionInfo(..)
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessage("RequestRegionInfo");
- msg->nextBlock("AgentData");
- msg->addUUID("AgentID", gAgent.getID());
- msg->addUUID("SessionID", gAgent.getSessionID());
- gAgent.sendReliableMessage();
-
-
// abuser name is selected from a list
LLUICtrl* le = getChild<LLUICtrl>("abuser_name_edit");
le->setEnabled( false );
@@ -225,6 +210,30 @@ void LLFloaterReporter::enableControls(BOOL enable)
getChildView("cancel_btn")->setEnabled(enable);
}
+void LLFloaterReporter::getExperienceInfo(const LLUUID& experience_id)
+{
+ mExperienceID = experience_id;
+
+ if (LLUUID::null != mExperienceID)
+ {
+ const LLSD& experience = LLExperienceCache::get(mExperienceID);
+ std::stringstream desc;
+
+ if(experience.isDefined())
+ {
+ setFromAvatarID(experience[LLExperienceCache::AGENT_ID]);
+ desc << "Experience id: " << mExperienceID;
+ }
+ else
+ {
+ desc << "Unable to retrieve details for id: "<< mExperienceID;
+ }
+
+ LLUICtrl* details = getChild<LLUICtrl>("details_edit");
+ details->setValue(desc.str());
+ }
+}
+
void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)
{
// TODO --
@@ -470,7 +479,7 @@ void LLFloaterReporter::showFromMenu(EReportType report_type)
}
// static
-void LLFloaterReporter::show(const LLUUID& object_id, const std::string& avatar_name)
+void LLFloaterReporter::show(const LLUUID& object_id, const std::string& avatar_name, const LLUUID& experience_id)
{
LLFloaterReporter* f = LLFloaterReg::showTypedInstance<LLFloaterReporter>("reporter");
@@ -483,6 +492,23 @@ void LLFloaterReporter::show(const LLUUID& object_id, const std::string& avatar_
{
f->setFromAvatarID(object_id);
}
+ if(experience_id.notNull())
+ {
+ f->getExperienceInfo(experience_id);
+ }
+
+ // Need to deselect on close
+ f->mDeselectOnClose = TRUE;
+
+ f->openFloater();
+}
+
+
+
+void LLFloaterReporter::showFromExperience( const LLUUID& experience_id )
+{
+ LLFloaterReporter* f = LLFloaterReg::showTypedInstance<LLFloaterReporter>("reporter");
+ f->getExperienceInfo(experience_id);
// Need to deselect on close
f->mDeselectOnClose = TRUE;
@@ -492,9 +518,9 @@ void LLFloaterReporter::show(const LLUUID& object_id, const std::string& avatar_
// static
-void LLFloaterReporter::showFromObject(const LLUUID& object_id)
+void LLFloaterReporter::showFromObject(const LLUUID& object_id, const LLUUID& experience_id)
{
- show(object_id);
+ show(object_id, LLStringUtil::null, experience_id);
}
// static
@@ -854,6 +880,7 @@ void LLFloaterReporter::setPosBox(const LLVector3d &pos)
getChild<LLUICtrl>("pos_field")->setValue(pos_string);
}
+
// void LLFloaterReporter::setDescription(const std::string& description, LLMeanCollisionData *mcd)
// {
// LLFloaterReporter *self = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter");
diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h
index d54e7f6ab0..d857528f10 100755
--- a/indra/newview/llfloaterreporter.h
+++ b/indra/newview/llfloaterreporter.h
@@ -88,8 +88,9 @@ public:
// Enables all buttons
static void showFromMenu(EReportType report_type);
- static void showFromObject(const LLUUID& object_id);
+ static void showFromObject(const LLUUID& object_id, const LLUUID& experience_id = LLUUID::null);
static void showFromAvatar(const LLUUID& avatar_id, const std::string avatar_name);
+ static void showFromExperience(const LLUUID& experience_id);
static void onClickSend (void *userdata);
static void onClickCancel (void *userdata);
@@ -99,14 +100,11 @@ public:
static void uploadDoneCallback(const LLUUID &uuid, void* user_data, S32 result, LLExtStat ext_status);
static void addDescription(const std::string& description, LLMeanCollisionData *mcd = NULL);
static void setDescription(const std::string& description, LLMeanCollisionData *mcd = NULL);
-
- // static
- static void processRegionInfo(LLMessageSystem* msg);
-
+
void setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id);
private:
- static void show(const LLUUID& object_id, const std::string& avatar_name = LLStringUtil::null);
+ static void show(const LLUUID& object_id, const std::string& avatar_name = LLStringUtil::null, const LLUUID& experience_id = LLUUID::null);
void takeScreenshot();
void sendReportViaCaps(std::string url);
@@ -118,6 +116,7 @@ private:
void sendReportViaCaps(std::string url, std::string sshot_url, const LLSD & report);
void setPosBox(const LLVector3d &pos);
void enableControls(BOOL own_avatar);
+ void getExperienceInfo(const LLUUID& object_id);
void getObjectInfo(const LLUUID& object_id);
void callbackAvatarID(const uuid_vec_t& ids, const std::vector<LLAvatarName> names);
void setFromAvatarID(const LLUUID& avatar_id);
@@ -128,6 +127,7 @@ private:
LLUUID mObjectID;
LLUUID mScreenID;
LLUUID mAbuserID;
+ LLUUID mExperienceID;
// Store the real name, not the link, for upstream reporting
std::string mOwnerName;
BOOL mDeselectOnClose;
diff --git a/indra/newview/llfloatersaveprefpreset.cpp b/indra/newview/llfloatersaveprefpreset.cpp
new file mode 100644
index 0000000000..bdef718d0e
--- /dev/null
+++ b/indra/newview/llfloatersaveprefpreset.cpp
@@ -0,0 +1,108 @@
+/**
+ * @file llfloatersaveprefpreset.cpp
+ * @brief Floater to save a graphics / camera preset
+ *
+ * $LicenseInfo:firstyear=2014&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2014, 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 "llfloatersaveprefpreset.h"
+
+#include "llbutton.h"
+#include "llcombobox.h"
+#include "llfloaterpreference.h"
+#include "llfloaterreg.h"
+#include "llnotificationsutil.h"
+#include "llpresetsmanager.h"
+
+LLFloaterSavePrefPreset::LLFloaterSavePrefPreset(const LLSD &key)
+: LLFloater(key)
+{
+}
+
+// virtual
+BOOL LLFloaterSavePrefPreset::postBuild()
+{ LLFloaterPreference* preferences = LLFloaterReg::getTypedInstance<LLFloaterPreference>("preferences");
+ if (preferences)
+ {
+ preferences->addDependentFloater(this);
+ }
+ getChild<LLComboBox>("preset_combo")->setTextEntryCallback(boost::bind(&LLFloaterSavePrefPreset::onPresetNameEdited, this));
+ getChild<LLComboBox>("preset_combo")->setCommitCallback(boost::bind(&LLFloaterSavePrefPreset::onPresetNameEdited, this));
+ getChild<LLButton>("save")->setCommitCallback(boost::bind(&LLFloaterSavePrefPreset::onBtnSave, this));
+ getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterSavePrefPreset::onBtnCancel, this));
+
+ LLPresetsManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterSavePrefPreset::onPresetsListChange, this));
+
+ mSaveButton = getChild<LLButton>("save");
+ mPresetCombo = getChild<LLComboBox>("preset_combo");
+
+ return TRUE;
+}
+
+void LLFloaterSavePrefPreset::onPresetNameEdited()
+{
+ // Disable saving a preset having empty name.
+ std::string name = mPresetCombo->getSimple();
+
+ mSaveButton->setEnabled(!name.empty());
+}
+
+void LLFloaterSavePrefPreset::onOpen(const LLSD& key)
+{
+ mSubdirectory = key.asString();
+
+ std::string floater_title = getString(std::string("title_") + mSubdirectory);
+
+ setTitle(floater_title);
+
+ EDefaultOptions option = DEFAULT_TOP;
+ LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, mPresetCombo, option);
+
+ onPresetNameEdited();
+}
+
+void LLFloaterSavePrefPreset::onBtnSave()
+{
+ std::string name = mPresetCombo->getSimple();
+
+ if (!LLPresetsManager::getInstance()->savePreset(mSubdirectory, name))
+ {
+ LLSD args;
+ args["NAME"] = name;
+ LLNotificationsUtil::add("PresetNotSaved", args);
+ }
+
+ closeFloater();
+}
+
+void LLFloaterSavePrefPreset::onPresetsListChange()
+{
+ EDefaultOptions option = DEFAULT_TOP;
+ LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, mPresetCombo, option);
+}
+
+void LLFloaterSavePrefPreset::onBtnCancel()
+{
+ closeFloater();
+}
diff --git a/indra/newview/llfloatersaveprefpreset.h b/indra/newview/llfloatersaveprefpreset.h
new file mode 100644
index 0000000000..09a87b8c62
--- /dev/null
+++ b/indra/newview/llfloatersaveprefpreset.h
@@ -0,0 +1,57 @@
+/**
+ * @file llfloatersaveprefpreset.h
+ * @brief Floater to save a graphics / camera preset
+
+ *
+ * $LicenseInfo:firstyear=2014&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2014, 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_LLFLOATERSAVEPREFPRESET_H
+#define LL_LLFLOATERSAVEPREFPRESET_H
+
+#include "llfloater.h"
+
+class LLComboBox;
+
+class LLFloaterSavePrefPreset : public LLFloater
+{
+
+public:
+ LLFloaterSavePrefPreset(const LLSD &key);
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ void onBtnSave();
+ void onBtnCancel();
+
+private:
+ LLComboBox* mPresetCombo;
+ LLButton* mSaveButton;
+
+ void onPresetsListChange();
+ void onPresetNameEdited();
+
+ std::string mSubdirectory;
+};
+
+#endif // LL_LLFLOATERSAVEPREFPRESET_H
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index b27a42cb8e..afec981d56 100755
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -448,9 +448,9 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
floater->getChild<LLUICtrl>("file_size_label")->setTextArg("[SIZE]", got_snap ? bytes_string : floater->getString("unknown"));
floater->getChild<LLUICtrl>("file_size_label")->setColor(
- shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD
- && got_bytes
- && previewp->getDataSize() > MAX_POSTCARD_DATASIZE ? LLUIColor(LLColor4::red) : LLUIColorTable::instance().getColor( "LabelTextColor" ));
+ shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD
+ && got_bytes
+ && previewp->getDataSize() > MAX_POSTCARD_DATASIZE ? LLUIColor(LLColor4::red) : LLUIColorTable::instance().getColor( "LabelTextColor" ));
// Update the width and height spinners based on the corresponding resolution combos. (?)
switch(shot_type)
@@ -600,7 +600,11 @@ void LLFloaterSnapshot::Impl::onClickUICheck(LLUICtrl *ctrl, void* data)
LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
if (view)
{
- checkAutoSnapshot(getPreviewView(view), TRUE);
+ LLSnapshotLivePreview* previewp = getPreviewView(view);
+ if(previewp)
+ {
+ previewp->updateSnapshot(TRUE, TRUE);
+ }
updateControls(view);
}
}
@@ -614,7 +618,11 @@ void LLFloaterSnapshot::Impl::onClickHUDCheck(LLUICtrl *ctrl, void* data)
LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
if (view)
{
- checkAutoSnapshot(getPreviewView(view), TRUE);
+ LLSnapshotLivePreview* previewp = getPreviewView(view);
+ if(previewp)
+ {
+ previewp->updateSnapshot(TRUE, TRUE);
+ }
updateControls(view);
}
}
@@ -655,14 +663,20 @@ void LLFloaterSnapshot::Impl::onCommitFreezeFrame(LLUICtrl* ctrl, void* data)
{
LLCheckBoxCtrl* check_box = (LLCheckBoxCtrl*)ctrl;
LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
+ LLSnapshotLivePreview* previewp = getPreviewView(view);
- if (!view || !check_box)
+ if (!view || !check_box || !previewp)
{
return;
}
gSavedSettings.setBOOL("UseFreezeFrame", check_box->get());
+ if (check_box->get())
+ {
+ previewp->prepareFreezeFrame();
+ }
+
updateLayout(view);
}
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 7477b02867..6dbb202c9d 100755
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -92,6 +92,7 @@
// Globals
LLFloaterTools *gFloaterTools = NULL;
bool LLFloaterTools::sShowObjectCost = true;
+bool LLFloaterTools::sPreviousFocusOnAvatar = false;
const std::string PANEL_NAMES[LLFloaterTools::PANEL_COUNT] =
{
@@ -891,6 +892,12 @@ void LLFloaterTools::onClose(bool app_quitting)
// prepare content for next call
mPanelContents->clearContents();
+
+ if(sPreviousFocusOnAvatar)
+ {
+ sPreviousFocusOnAvatar = false;
+ gAgentCamera.setAllowChangeToFollow(TRUE);
+ }
}
void click_popup_info(void*)
diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h
index 189bae46c2..df481b8d4c 100755
--- a/indra/newview/llfloatertools.h
+++ b/indra/newview/llfloatertools.h
@@ -201,11 +201,13 @@ private:
std::map<std::string, std::string> mStatusText;
+
protected:
LLSD mMediaSettings;
public:
static bool sShowObjectCost;
+ static bool sPreviousFocusOnAvatar;
};
diff --git a/indra/newview/llfloatertos.cpp b/indra/newview/llfloatertos.cpp
index c1c21c593e..ae33acb842 100755
--- a/indra/newview/llfloatertos.cpp
+++ b/indra/newview/llfloatertos.cpp
@@ -141,6 +141,12 @@ BOOL LLFloaterTOS::postBuild()
// Don't use the start_url parameter for this browser instance -- it may finish loading before we get to add our observer.
// Store the URL separately and navigate here instead.
web_browser->navigateTo( getString( "loading_url" ) );
+ LLPluginClassMedia* media_plugin = web_browser->getMediaPlugin();
+ if (media_plugin)
+ {
+ // All links from tos_html should be opened in external browser
+ media_plugin->setOverrideClickTarget("_external");
+ }
}
return TRUE;
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index 1b1c24b19a..ece3e10faa 100755
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -284,12 +284,12 @@ BOOL LLFloaterWorldMap::postBuild()
LLComboBox *avatar_combo = getChild<LLComboBox>("friend combo");
avatar_combo->selectFirstItem();
avatar_combo->setPrearrangeCallback( boost::bind(&LLFloaterWorldMap::onAvatarComboPrearrange, this) );
- avatar_combo->setTextEntryCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) );
+ avatar_combo->setTextChangedCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) );
mListFriendCombo = dynamic_cast<LLCtrlListInterface *>(avatar_combo);
LLSearchEditor *location_editor = getChild<LLSearchEditor>("location");
location_editor->setFocusChangedCallback(boost::bind(&LLFloaterWorldMap::onLocationFocusChanged, this, _1));
- location_editor->setKeystrokeCallback( boost::bind(&LLFloaterWorldMap::onSearchTextEntry, this));
+ location_editor->setTextChangedCallback( boost::bind(&LLFloaterWorldMap::onSearchTextEntry, this));
getChild<LLScrollListCtrl>("search_results")->setDoubleClickCallback( boost::bind(&LLFloaterWorldMap::onClickTeleportBtn, this));
mListSearchResults = childGetListInterface("search_results");
@@ -297,7 +297,7 @@ BOOL LLFloaterWorldMap::postBuild()
LLComboBox *landmark_combo = getChild<LLComboBox>( "landmark combo");
landmark_combo->selectFirstItem();
landmark_combo->setPrearrangeCallback( boost::bind(&LLFloaterWorldMap::onLandmarkComboPrearrange, this) );
- landmark_combo->setTextEntryCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) );
+ landmark_combo->setTextChangedCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) );
mListLandmarkCombo = dynamic_cast<LLCtrlListInterface *>(landmark_combo);
mCurZoomVal = log(LLWorldMapView::sMapScale)/log(2.f);
diff --git a/indra/newview/llfolderviewmodelinventory.cpp b/indra/newview/llfolderviewmodelinventory.cpp
index 3271a40ea0..e9f80b795a 100755
--- a/indra/newview/llfolderviewmodelinventory.cpp
+++ b/indra/newview/llfolderviewmodelinventory.cpp
@@ -27,6 +27,7 @@
#include "llviewerprecompiledheaders.h"
#include "llfolderviewmodelinventory.h"
#include "llinventorymodelbackgroundfetch.h"
+#include "llinventoryfunctions.h"
#include "llinventorypanel.h"
#include "lltooldraganddrop.h"
#include "llfavoritesbar.h"
@@ -108,6 +109,29 @@ bool LLFolderViewModelInventory::contentsReady()
return !LLInventoryModelBackgroundFetch::instance().folderFetchActive();
}
+bool LLFolderViewModelInventory::isFolderComplete(LLFolderViewFolder* folder)
+{
+ LLFolderViewModelItemInventory* modelp = static_cast<LLFolderViewModelItemInventory*>(folder->getViewModelItem());
+ LLUUID cat_id = modelp->getUUID();
+ if (cat_id.isNull())
+ {
+ return false;
+ }
+ LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
+ if (cat)
+ {
+ // don't need to check version - descendents_server == -1 if we have no data
+ S32 descendents_server = cat->getDescendentCount();
+ S32 descendents_actual = cat->getViewerDescendentCount();
+ if (descendents_server == descendents_actual
+ || (descendents_actual > 0 && descendents_server == -1)) // content was loaded in previous session
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
void LLFolderViewModelItemInventory::requestSort()
{
LLFolderViewModelItemCommon::requestSort();
@@ -277,7 +301,7 @@ bool LLInventorySort::operator()(const LLFolderViewModelItemInventory* const& a,
// 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)));
+ bool by_name = ((!mByDate || (mFoldersByName && (a->getSortGroup() != SG_ITEM))) && !mFoldersByWeight);
if (a->getSortGroup() != b->getSortGroup())
{
@@ -309,6 +333,31 @@ bool LLInventorySort::operator()(const LLFolderViewModelItemInventory* const& a,
return (compare < 0);
}
}
+ else if (mFoldersByWeight)
+ {
+ S32 weight_a = compute_stock_count(a->getUUID());
+ S32 weight_b = compute_stock_count(b->getUUID());
+ if (weight_a == weight_b)
+ {
+ // Equal weight -> use alphabetical order
+ return (LLStringUtil::compareDict(a->getDisplayName(), b->getDisplayName()) < 0);
+ }
+ else if (weight_a == COMPUTE_STOCK_INFINITE)
+ {
+ // No stock -> move a at the end of the list
+ return false;
+ }
+ else if (weight_b == COMPUTE_STOCK_INFINITE)
+ {
+ // No stock -> move b at the end of the list
+ return true;
+ }
+ else
+ {
+ // Lighter is first (sorted in increasing order of weight)
+ return (weight_a < weight_b);
+ }
+ }
else
{
time_t first_create = a->getCreationDate();
diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h
index 8772185ad0..dea54cbe57 100755
--- a/indra/newview/llfolderviewmodelinventory.h
+++ b/indra/newview/llfolderviewmodelinventory.h
@@ -89,6 +89,7 @@ public:
mByDate = (mSortOrder & LLInventoryFilter::SO_DATE);
mSystemToTop = (mSortOrder & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP);
mFoldersByName = (mSortOrder & LLInventoryFilter::SO_FOLDERS_BY_NAME);
+ mFoldersByWeight = (mSortOrder & LLInventoryFilter::SO_FOLDERS_BY_WEIGHT);
}
bool operator()(const LLFolderViewModelItemInventory* const& a, const LLFolderViewModelItemInventory* const& b) const;
@@ -97,6 +98,7 @@ private:
bool mByDate;
bool mSystemToTop;
bool mFoldersByName;
+ bool mFoldersByWeight;
};
class LLFolderViewModelInventory
@@ -113,6 +115,7 @@ public:
void sort(LLFolderViewFolder* folder);
bool contentsReady();
+ bool isFolderComplete(LLFolderViewFolder* folder);
bool startDrag(std::vector<LLFolderViewModelItem*>& items);
private:
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 119872ec29..950a6cfaef 100755
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -59,10 +59,6 @@
// Longest time, in seconds, to wait for all animations to stop playing
const F32 MAX_WAIT_ANIM_SECS = 30.f;
-// If this gesture is a link, get the base gesture that this link points to,
-// otherwise just return this id.
-static const LLUUID& get_linked_uuid(const LLUUID& item_id);
-
// Lightweight constructor.
// init() does the heavy lifting.
LLGestureMgr::LLGestureMgr()
@@ -253,7 +249,7 @@ void LLGestureMgr::activateGestureWithAsset(const LLUUID& item_id,
BOOL inform_server,
BOOL deactivate_similar)
{
- const LLUUID& base_item_id = get_linked_uuid(item_id);
+ const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id);
if( !gAssetStorage )
{
@@ -307,7 +303,7 @@ void notify_update_label(const LLUUID& base_item_id)
void LLGestureMgr::deactivateGesture(const LLUUID& item_id)
{
- const LLUUID& base_item_id = get_linked_uuid(item_id);
+ const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id);
item_map_t::iterator it = mActive.find(base_item_id);
if (it == mActive.end())
{
@@ -353,7 +349,7 @@ void LLGestureMgr::deactivateGesture(const LLUUID& item_id)
void LLGestureMgr::deactivateSimilarGestures(LLMultiGesture* in, const LLUUID& in_item_id)
{
- const LLUUID& base_in_item_id = get_linked_uuid(in_item_id);
+ const LLUUID& base_in_item_id = gInventory.getLinkedItemID(in_item_id);
uuid_vec_t gest_item_ids;
// Deactivate all gestures that match
@@ -440,7 +436,7 @@ void LLGestureMgr::deactivateSimilarGestures(LLMultiGesture* in, const LLUUID& i
BOOL LLGestureMgr::isGestureActive(const LLUUID& item_id)
{
- const LLUUID& base_item_id = get_linked_uuid(item_id);
+ const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id);
item_map_t::iterator it = mActive.find(base_item_id);
return (it != mActive.end());
}
@@ -448,7 +444,7 @@ BOOL LLGestureMgr::isGestureActive(const LLUUID& item_id)
BOOL LLGestureMgr::isGesturePlaying(const LLUUID& item_id)
{
- const LLUUID& base_item_id = get_linked_uuid(item_id);
+ const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id);
item_map_t::iterator it = mActive.find(base_item_id);
if (it == mActive.end()) return FALSE;
@@ -471,7 +467,7 @@ BOOL LLGestureMgr::isGesturePlaying(LLMultiGesture* gesture)
void LLGestureMgr::replaceGesture(const LLUUID& item_id, LLMultiGesture* new_gesture, const LLUUID& asset_id)
{
- const LLUUID& base_item_id = get_linked_uuid(item_id);
+ const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id);
item_map_t::iterator it = mActive.find(base_item_id);
if (it == mActive.end())
@@ -513,7 +509,7 @@ void LLGestureMgr::replaceGesture(const LLUUID& item_id, LLMultiGesture* new_ges
void LLGestureMgr::replaceGesture(const LLUUID& item_id, const LLUUID& new_asset_id)
{
- const LLUUID& base_item_id = get_linked_uuid(item_id);
+ const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id);
item_map_t::iterator it = LLGestureMgr::instance().mActive.find(base_item_id);
if (it == mActive.end())
@@ -608,7 +604,7 @@ void LLGestureMgr::playGesture(LLMultiGesture* gesture)
// Convenience function that looks up the item_id for you.
void LLGestureMgr::playGesture(const LLUUID& item_id)
{
- const LLUUID& base_item_id = get_linked_uuid(item_id);
+ const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id);
item_map_t::iterator it = mActive.find(base_item_id);
if (it == mActive.end()) return;
@@ -1297,7 +1293,7 @@ void LLGestureMgr::stopGesture(LLMultiGesture* gesture)
void LLGestureMgr::stopGesture(const LLUUID& item_id)
{
- const LLUUID& base_item_id = get_linked_uuid(item_id);
+ const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id);
item_map_t::iterator it = mActive.find(base_item_id);
if (it == mActive.end()) return;
@@ -1457,14 +1453,4 @@ void LLGestureMgr::done()
}
}
-// static
-const LLUUID& get_linked_uuid(const LLUUID &item_id)
-{
- LLViewerInventoryItem* item = gInventory.getItem(item_id);
- if (item && item->getIsLinkType())
- {
- return item->getLinkedUUID();
- }
- return item_id;
-}
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 56e671d902..4d92fee04f 100755
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -239,7 +239,8 @@ LLGroupMgrGroupData::LLGroupMgrGroupData(const LLUUID& id) :
mRoleMemberDataComplete(false),
mGroupPropertiesDataComplete(false),
mPendingRoleMemberRequest(false),
- mAccessTime(0.0f)
+ mAccessTime(0.0f),
+ mPendingBanRequest(false)
{
mMemberVersion.generate();
}
@@ -761,8 +762,69 @@ void LLGroupMgrGroupData::removeBanEntry(const LLUUID& ban_id)
mBanList.erase(ban_id);
}
+void LLGroupMgrGroupData::banMemberById(const LLUUID& participant_uuid)
+{
+ if (!mMemberDataComplete ||
+ !mRoleDataComplete ||
+ !(mRoleMemberDataComplete && mMembers.size()))
+ {
+ LL_WARNS() << "No Role-Member data yet, setting ban request to pending." << LL_ENDL;
+ mPendingBanRequest = true;
+ mPendingBanMemberID = participant_uuid;
+
+ if (!mMemberDataComplete)
+ {
+ LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mID);
+ }
+ if (!mRoleDataComplete)
+ {
+ LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mID);
+ }
+ return;
+ }
+
+ LLGroupMgrGroupData::member_list_t::iterator mi = mMembers.find((participant_uuid));
+ if (mi == mMembers.end())
+ {
+ if (!mPendingBanRequest)
+ {
+ mPendingBanRequest = true;
+ mPendingBanMemberID = participant_uuid;
+ LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mID); // member isn't in members list, request reloading
+ }
+ else
+ {
+ mPendingBanRequest = false;
+ }
+
+ return;
+ }
+
+ mPendingBanRequest = false;
+
+ LLGroupMemberData* member_data = (*mi).second;
+ if (member_data && member_data->isInRole(mOwnerRole))
+ {
+ return; // can't ban group owner
+ }
+
+ std::vector<LLUUID> ids;
+ ids.push_back(participant_uuid);
+
+ LLGroupBanData ban_data;
+ createBanEntry(participant_uuid, ban_data);
+ LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_POST, mID, LLGroupMgr::BAN_CREATE, ids);
+ LLGroupMgr::getInstance()->sendGroupMemberEjects(mID, ids);
+ LLGroupMgr::getInstance()->sendGroupMembersRequest(mID);
+ LLSD args;
+ std::string name;
+ gCacheName->getFullName(participant_uuid, name);
+ args["AVATAR_NAME"] = name;
+ args["GROUP_NAME"] = mName;
+ LLNotifications::instance().add(LLNotification::Params("EjectAvatarFromGroup").substitutions(args));
+}
//
// LLGroupMgr
@@ -1245,6 +1307,11 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
group_datap->mChanged = TRUE;
LLGroupMgr::getInstance()->notifyObservers(GC_ROLE_MEMBER_DATA);
+
+ if (group_datap->mPendingBanRequest)
+ {
+ group_datap->banMemberById(group_datap->mPendingBanMemberID);
+ }
}
// static
@@ -1970,7 +2037,8 @@ void LLGroupMgr::processGroupBanRequest(const LLSD& content)
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_id);
if (!gdatap)
return;
-
+
+ gdatap->clearBanList();
LLSD::map_const_iterator i = content["ban_list"].beginMap();
LLSD::map_const_iterator iEnd = content["ban_list"].endMap();
for(;i != iEnd; ++i)
@@ -1992,8 +2060,6 @@ void LLGroupMgr::processGroupBanRequest(const LLSD& content)
LLGroupMgr::getInstance()->notifyObservers(GC_BANLIST);
}
-
-
// Responder class for capability group management
class GroupMemberDataResponder : public LLHTTPClient::Responder
{
@@ -2082,11 +2148,6 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
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);
@@ -2096,6 +2157,18 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
return;
}
+ // If we have no members, there's no reason to do anything else
+ S32 num_members = content["member_count"];
+ if (num_members < 1)
+ {
+ LL_INFOS("GrpMgr") << "Received empty group members list for group id: " << group_id.asString() << LL_ENDL;
+ // Set mMemberDataComplete for correct handling of empty responses. See MAINT-5237
+ group_datap->mMemberDataComplete = true;
+ group_datap->mChanged = TRUE;
+ LLGroupMgr::getInstance()->notifyObservers(GC_MEMBER_DATA);
+ return;
+ }
+
group_datap->mMemberCount = num_members;
LLSD member_list = content["members"];
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index 2e94e8d9a0..5307c4de92 100755
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -149,7 +149,7 @@ public:
const uuid_vec_t& getRoleMembers() const { return mMemberIDs; }
S32 getMembersInRole(uuid_vec_t members, BOOL needs_sort = TRUE);
- S32 getTotalMembersInRole() { return mMemberIDs.size(); }
+ S32 getTotalMembersInRole() { return mMemberCount ? mMemberCount : mMemberIDs.size(); } //FIXME: Returns 0 for Everyone role when Member list isn't yet loaded, see MAINT-5225
LLRoleData getRoleData() const { return mRoleData; }
void setRoleData(LLRoleData data) { mRoleData = data; }
@@ -269,8 +269,8 @@ public:
void createBanEntry(const LLUUID& ban_id, const LLGroupBanData& ban_data = LLGroupBanData());
void removeBanEntry(const LLUUID& ban_id);
+ void banMemberById(const LLUUID& participant_uuid);
-
public:
typedef std::map<LLUUID,LLGroupMemberData*> member_list_t;
typedef std::map<LLUUID,LLGroupRoleData*> role_list_t;
@@ -302,6 +302,9 @@ public:
S32 mMemberCount;
S32 mRoleCount;
+ bool mPendingBanRequest;
+ LLUUID mPendingBanMemberID;
+
protected:
void sendRoleChanges();
void cancelRoleChanges();
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 5d3a11e245..b8b6bdaa11 100755
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1295,8 +1295,15 @@ void LLIMModel::sendMessage(const std::string& utf8_text,
gAgent.sendReliableMessage();
}
+ bool is_group_chat = false;
+ LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(im_session_id);
+ if(session)
+ {
+ is_group_chat = session->isGroupSessionType();
+ }
+
// If there is a mute list and this is not a group chat...
- if ( LLMuteList::getInstance() )
+ if ( LLMuteList::getInstance() && !is_group_chat)
{
// ... the target should not be in our mute list for some message types.
// Auto-remove them if present.
@@ -1345,7 +1352,6 @@ void LLIMModel::sendMessage(const std::string& utf8_text,
if (is_not_group_id)
{
- LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(im_session_id);
if( session == 0)//??? shouldn't really happen
{
LLRecentPeople::instance().add(other_participant_id);
diff --git a/indra/newview/llinspecttoast.cpp b/indra/newview/llinspecttoast.cpp
index d04378daaf..47560341e7 100755
--- a/indra/newview/llinspecttoast.cpp
+++ b/indra/newview/llinspecttoast.cpp
@@ -47,6 +47,7 @@ public:
/*virtual*/ void onOpen(const LLSD& notification_id);
/*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
+ /*virtual*/ void removeChild(LLView* child);
private:
void onToastDestroy(LLToast * toast);
@@ -98,7 +99,7 @@ void LLInspectToast::onOpen(const LLSD& notification_id)
panel->setMouseOpaque(FALSE);
if(mPanel != NULL && mPanel->getParent() == this)
{
- removeChild(mPanel);
+ LLInspect::removeChild(mPanel);
}
addChild(panel);
panel->setFocus(TRUE);
@@ -121,6 +122,16 @@ BOOL LLInspectToast::handleToolTip(S32 x, S32 y, MASK mask)
return LLFloater::handleToolTip(x, y, mask);
}
+// virtual
+void LLInspectToast::removeChild(LLView* child)
+{
+ if (mPanel == child)
+ {
+ mPanel = NULL;
+ }
+ LLInspect::removeChild(child);
+}
+
void LLInspectToast::onToastDestroy(LLToast * toast)
{
closeFloater(false);
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 1dc5558555..c990eda074 100755
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -40,6 +40,7 @@
#include "llfavoritesbar.h" // management of favorites folder
#include "llfloateropenobject.h"
#include "llfloaterreg.h"
+#include "llfloatermarketplacelistings.h"
#include "llfloatersidepanelcontainer.h"
#include "llfloaterworldmap.h"
#include "llfolderview.h"
@@ -65,6 +66,7 @@
#include "llsidepanelappearance.h"
#include "lltooldraganddrop.h"
#include "lltrans.h"
+#include "llurlaction.h"
#include "llviewerassettype.h"
#include "llviewerfoldertype.h"
#include "llviewermenu.h"
@@ -74,16 +76,12 @@
#include "llviewerwindow.h"
#include "llvoavatarself.h"
#include "llwearablelist.h"
+#include "llwearableitemslist.h"
#include "lllandmarkactions.h"
#include "llpanellandmarks.h"
void copy_slurl_to_clipboard_callback_inv(const std::string& slurl);
-// Marketplace outbox current disabled
-#define ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU 1
-#define ENABLE_MERCHANT_SEND_TO_MARKETPLACE_CONTEXT_MENU 0
-#define BLOCK_WORN_ITEMS_IN_OUTBOX 1
-
typedef std::pair<LLUUID, LLUUID> two_uuids_t;
typedef std::list<two_uuids_t> two_uuids_list_t;
@@ -123,7 +121,7 @@ bool isAddAction(const std::string& action)
bool isRemoveAction(const std::string& action)
{
- return ("take_off" == action || "detach" == action || "deactivate" == action);
+ return ("take_off" == action || "detach" == action);
}
bool isMarketplaceCopyAction(const std::string& action)
@@ -205,7 +203,6 @@ const std::string& LLInvFVBridge::getDisplayName() const
{
buildDisplayName();
}
-
return mDisplayName;
}
@@ -269,13 +266,49 @@ BOOL LLInvFVBridge::isLibraryItem() const
/**
* @brief Adds this item into clipboard storage
*/
-BOOL LLInvFVBridge::cutToClipboard() const
+BOOL LLInvFVBridge::cutToClipboard()
+{
+ const LLInventoryObject* obj = gInventory.getObject(mUUID);
+ if (obj && isItemMovable() && isItemRemovable())
+ {
+ const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const BOOL cut_from_marketplacelistings = gInventory.isObjectDescendentOf(mUUID, marketplacelistings_id);
+
+ if (cut_from_marketplacelistings && (LLMarketplaceData::instance().isInActiveFolder(mUUID) ||
+ LLMarketplaceData::instance().isListedAndActive(mUUID)))
+ {
+ // Prompt the user if cutting from a marketplace active listing
+ LLNotificationsUtil::add("ConfirmMerchantActiveChange", LLSD(), LLSD(), boost::bind(&LLInvFVBridge::callback_cutToClipboard, this, _1, _2));
+ }
+ else
+ {
+ // Otherwise just perform the cut
+ return perform_cutToClipboard();
+ }
+ }
+ return FALSE;
+}
+
+// Callback for cutToClipboard if DAMA required...
+BOOL LLInvFVBridge::callback_cutToClipboard(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0) // YES
+ {
+ return perform_cutToClipboard();
+ }
+ return FALSE;
+}
+
+BOOL LLInvFVBridge::perform_cutToClipboard()
{
const LLInventoryObject* obj = gInventory.getObject(mUUID);
if (obj && isItemMovable() && isItemRemovable())
{
LLClipboard::instance().setCutMode(true);
- return LLClipboard::instance().addToClipboard(mUUID);
+ BOOL added_to_clipboard = LLClipboard::instance().addToClipboard(mUUID);
+ removeObject(&gInventory, mUUID); // Always perform the remove even if the object couldn't make it to the clipboard
+ return added_to_clipboard;
}
return FALSE;
}
@@ -290,15 +323,22 @@ BOOL LLInvFVBridge::copyToClipboard() const
return FALSE;
}
-// *TODO: make sure this does the right thing
void LLInvFVBridge::showProperties()
{
- show_item_profile(mUUID);
-
- // Disable old properties floater; this is replaced by the sidepanel.
- /*
- LLFloaterReg::showInstance("properties", mUUID);
- */
+ if (isMarketplaceListingsFolder())
+ {
+ LLFloaterReg::showInstance("item_properties", LLSD().with("id",mUUID),TRUE);
+ // Force it to show on top as this floater has a tendency to hide when confirmation dialog shows up
+ LLFloater* floater_properties = LLFloaterReg::findInstance("item_properties", LLSD().with("id",mUUID));
+ if (floater_properties)
+ {
+ floater_properties->setVisibleAndFrontmost();
+ }
+ }
+ else
+ {
+ show_item_profile(mUUID);
+ }
}
void LLInvFVBridge::removeBatch(std::vector<LLFolderViewModelItem*>& batch)
@@ -557,6 +597,46 @@ BOOL LLInvFVBridge::isClipboardPasteableAsLink() const
return TRUE;
}
+void disable_context_entries_if_present(LLMenuGL& menu,
+ const menuentry_vec_t &disabled_entries)
+{
+ 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);
+ std::string name = menu_item->getName();
+
+ // descend into split menus:
+ LLMenuItemBranchGL* branchp = dynamic_cast<LLMenuItemBranchGL*>(menu_item);
+ if ((name == "More") && branchp)
+ {
+ disable_context_entries_if_present(*branchp->getBranch(), disabled_entries);
+ }
+
+ bool found = false;
+ menuentry_vec_t::const_iterator itor2;
+ for (itor2 = disabled_entries.begin(); itor2 != disabled_entries.end(); ++itor2)
+ {
+ if (*itor2 == name)
+ {
+ found = true;
+ break;
+ }
+ }
+
+ if (found)
+ {
+ menu_item->setVisible(TRUE);
+ // A bit of a hack so we can remember that some UI element explicitly set this to be visible
+ // so that some other UI element from multi-select doesn't later set this invisible.
+ menu_item->pushVisible(TRUE);
+
+ menu_item->setEnabled(FALSE);
+ }
+ }
+}
void hide_context_entries(LLMenuGL& menu,
const menuentry_vec_t &entries_to_show,
const menuentry_vec_t &disabled_entries)
@@ -655,7 +735,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
if (!isInboxFolder())
{
items.push_back(std::string("Rename"));
- if (!isItemRenameable() || (flags & FIRST_SELECTED_ITEM) == 0)
+ if (!isItemRenameable() || ((flags & FIRST_SELECTED_ITEM) == 0))
{
disabled_items.push_back(std::string("Rename"));
}
@@ -693,15 +773,20 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
disabled_items.push_back(std::string("Cut"));
}
- if (canListOnMarketplace())
+ if (canListOnMarketplace() && !isMarketplaceListingsFolder() && !isInboxFolder())
{
items.push_back(std::string("Marketplace Separator"));
- items.push_back(std::string("Merchant Copy"));
- if (!canListOnMarketplaceNow())
- {
- disabled_items.push_back(std::string("Merchant Copy"));
- }
+ if (gMenuHolder->getChild<LLView>("MarketplaceListings")->getVisible())
+ {
+ items.push_back(std::string("Marketplace Copy"));
+ items.push_back(std::string("Marketplace Move"));
+ if (!canListOnMarketplaceNow())
+ {
+ disabled_items.push_back(std::string("Marketplace Copy"));
+ disabled_items.push_back(std::string("Marketplace Move"));
+ }
+ }
}
}
}
@@ -765,6 +850,31 @@ void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
hide_context_entries(menu, items, disabled_items);
}
+bool get_selection_item_uuids(LLFolderView::selected_items_t& selected_items, uuid_vec_t& ids)
+{
+ uuid_vec_t results;
+ S32 non_item = 0;
+ for(LLFolderView::selected_items_t::iterator it = selected_items.begin(); it != selected_items.end(); ++it)
+ {
+ LLItemBridge *view_model = dynamic_cast<LLItemBridge *>((*it)->getViewModelItem());
+
+ if(view_model && view_model->getUUID().notNull())
+ {
+ results.push_back(view_model->getUUID());
+ }
+ else
+ {
+ non_item++;
+ }
+ }
+ if (non_item == 0)
+ {
+ ids = results;
+ return true;
+ }
+ return false;
+}
+
void LLInvFVBridge::addTrashContextMenuOptions(menuentry_vec_t &items,
menuentry_vec_t &disabled_items)
{
@@ -797,15 +907,7 @@ void LLInvFVBridge::addDeleteContextMenuOptions(menuentry_vec_t &items,
return;
}
- // "Remove link" and "Delete" are the same operation.
- if (obj && obj->getIsLinkType() && !get_is_item_worn(mUUID))
- {
- items.push_back(std::string("Remove Link"));
- }
- else
- {
- items.push_back(std::string("Delete"));
- }
+ items.push_back(std::string("Delete"));
if (!isItemRemovable())
{
@@ -835,21 +937,130 @@ void LLInvFVBridge::addOutboxContextMenuOptions(U32 flags,
{
disabled_items.push_back(std::string("Rename"));
}
-
-#if ENABLE_MERCHANT_SEND_TO_MARKETPLACE_CONTEXT_MENU
- if (isOutboxFolderDirectParent())
- {
- items.push_back(std::string("Marketplace Separator"));
- items.push_back(std::string("Marketplace Send"));
-
- if ((flags & FIRST_SELECTED_ITEM) == 0)
- {
- disabled_items.push_back(std::string("Marketplace Send"));
- }
- }
-#endif // ENABLE_MERCHANT_SEND_TO_MARKETPLACE_CONTEXT_MENU
}
+void LLInvFVBridge::addMarketplaceContextMenuOptions(U32 flags,
+ menuentry_vec_t &items,
+ menuentry_vec_t &disabled_items)
+{
+ S32 depth = depth_nesting_in_marketplace(mUUID);
+ if (depth == 1)
+ {
+ // Options available at the Listing Folder level
+ items.push_back(std::string("Marketplace Create Listing"));
+ items.push_back(std::string("Marketplace Associate Listing"));
+ items.push_back(std::string("Marketplace Check Listing"));
+ items.push_back(std::string("Marketplace List"));
+ items.push_back(std::string("Marketplace Unlist"));
+ if (LLMarketplaceData::instance().isUpdating(mUUID,depth) || ((flags & FIRST_SELECTED_ITEM) == 0))
+ {
+ // During SLM update, disable all marketplace related options
+ // Also disable all if multiple selected items
+ disabled_items.push_back(std::string("Marketplace Create Listing"));
+ disabled_items.push_back(std::string("Marketplace Associate Listing"));
+ disabled_items.push_back(std::string("Marketplace Check Listing"));
+ disabled_items.push_back(std::string("Marketplace List"));
+ disabled_items.push_back(std::string("Marketplace Unlist"));
+ }
+ else
+ {
+ if (gSavedSettings.getBOOL("MarketplaceListingsLogging"))
+ {
+ items.push_back(std::string("Marketplace Get Listing"));
+ }
+ if (LLMarketplaceData::instance().isListed(mUUID))
+ {
+ disabled_items.push_back(std::string("Marketplace Create Listing"));
+ disabled_items.push_back(std::string("Marketplace Associate Listing"));
+ if (LLMarketplaceData::instance().getVersionFolder(mUUID).isNull())
+ {
+ disabled_items.push_back(std::string("Marketplace List"));
+ disabled_items.push_back(std::string("Marketplace Unlist"));
+ }
+ else
+ {
+ if (LLMarketplaceData::instance().getActivationState(mUUID))
+ {
+ disabled_items.push_back(std::string("Marketplace List"));
+ }
+ else
+ {
+ disabled_items.push_back(std::string("Marketplace Unlist"));
+ }
+ }
+ }
+ else
+ {
+ disabled_items.push_back(std::string("Marketplace List"));
+ disabled_items.push_back(std::string("Marketplace Unlist"));
+ if (gSavedSettings.getBOOL("MarketplaceListingsLogging"))
+ {
+ disabled_items.push_back(std::string("Marketplace Get Listing"));
+ }
+ }
+ }
+ }
+ if (depth == 2)
+ {
+ // Options available at the Version Folder levels and only for folders
+ LLInventoryCategory* cat = gInventory.getCategory(mUUID);
+ if (cat && LLMarketplaceData::instance().isListed(cat->getParentUUID()))
+ {
+ items.push_back(std::string("Marketplace Activate"));
+ items.push_back(std::string("Marketplace Deactivate"));
+ if (LLMarketplaceData::instance().isUpdating(mUUID,depth) || ((flags & FIRST_SELECTED_ITEM) == 0))
+ {
+ // During SLM update, disable all marketplace related options
+ // Also disable all if multiple selected items
+ disabled_items.push_back(std::string("Marketplace Activate"));
+ disabled_items.push_back(std::string("Marketplace Deactivate"));
+ }
+ else
+ {
+ if (LLMarketplaceData::instance().isVersionFolder(mUUID))
+ {
+ disabled_items.push_back(std::string("Marketplace Activate"));
+ if (LLMarketplaceData::instance().getActivationState(mUUID))
+ {
+ disabled_items.push_back(std::string("Marketplace Deactivate"));
+ }
+ }
+ else
+ {
+ disabled_items.push_back(std::string("Marketplace Deactivate"));
+ }
+ }
+ }
+ }
+
+ items.push_back(std::string("Marketplace Edit Listing"));
+ LLUUID listing_folder_id = nested_parent_id(mUUID,depth);
+ LLUUID version_folder_id = LLMarketplaceData::instance().getVersionFolder(listing_folder_id);
+
+ if (depth >= 2)
+ {
+ // Prevent creation of new folders if the max count has been reached on this version folder (active or not)
+ LLUUID local_version_folder_id = nested_parent_id(mUUID,depth-1);
+ LLInventoryModel::cat_array_t categories;
+ LLInventoryModel::item_array_t items;
+ gInventory.collectDescendents(local_version_folder_id, categories, items, FALSE);
+ if (categories.size() >= gSavedSettings.getU32("InventoryOutboxMaxFolderCount"))
+ {
+ disabled_items.push_back(std::string("New Folder"));
+ }
+ }
+
+ // Options available at all levels on items and categories
+ if (!LLMarketplaceData::instance().isListed(listing_folder_id) || version_folder_id.isNull())
+ {
+ disabled_items.push_back(std::string("Marketplace Edit Listing"));
+ }
+
+ // Separator
+ items.push_back(std::string("Marketplace Listings Separator"));
+}
+
+
// *TODO: remove this
BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
{
@@ -952,6 +1163,7 @@ BOOL LLInvFVBridge::isCOFFolder() const
return LLAppearanceMgr::instance().getIsInCOF(mUUID);
}
+// *TODO : Suppress isInboxFolder() once Merchant Outbox is fully deprecated
BOOL LLInvFVBridge::isInboxFolder() const
{
const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false);
@@ -964,6 +1176,18 @@ BOOL LLInvFVBridge::isInboxFolder() const
return gInventory.isObjectDescendentOf(mUUID, inbox_id);
}
+BOOL LLInvFVBridge::isMarketplaceListingsFolder() const
+{
+ const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+
+ if (folder_id.isNull())
+ {
+ return FALSE;
+ }
+
+ return gInventory.isObjectDescendentOf(mUUID, folder_id);
+}
+
BOOL LLInvFVBridge::isOutboxFolder() const
{
const LLUUID outbox_id = getOutboxFolder();
@@ -1120,16 +1344,23 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
{
LL_WARNS() << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << LL_ENDL;
}
- new_listener = new LLWearableBridge(inventory, root, uuid, asset_type, inv_type, (LLWearableType::EType)flags);
+ new_listener = new LLWearableBridge(inventory, root, uuid, asset_type, inv_type, LLWearableType::inventoryFlagsToWearableType(flags));
break;
case LLAssetType::AT_CATEGORY:
if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)
{
- // Create a link folder handler instead.
+ // Create a link folder handler instead
new_listener = new LLLinkFolderBridge(inventory, root, uuid);
- break;
}
- new_listener = new LLFolderBridge(inventory, root, uuid);
+ else if (actual_asset_type == LLAssetType::AT_MARKETPLACE_FOLDER)
+ {
+ // Create a marketplace folder handler
+ new_listener = new LLMarketplaceFolderBridge(inventory, root, uuid);
+ }
+ else
+ {
+ new_listener = new LLFolderBridge(inventory, root, uuid);
+ }
break;
case LLAssetType::AT_LINK:
case LLAssetType::AT_LINK_FOLDER:
@@ -1172,6 +1403,22 @@ void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid)
}
}
+void LLInvFVBridge::removeObject(LLInventoryModel *model, const LLUUID &uuid)
+{
+ // Keep track of the parent
+ LLInventoryItem* itemp = model->getItem(uuid);
+ LLUUID parent_id = (itemp ? itemp->getParentUUID() : LLUUID::null);
+ // Remove the object
+ model->removeObject(uuid);
+ // Get the parent updated
+ if (parent_id.notNull())
+ {
+ LLViewerInventoryCategory* parent_cat = model->getCategory(parent_id);
+ model->updateCategory(parent_cat);
+ model->notifyObservers();
+ }
+}
+
bool LLInvFVBridge::canShare() const
{
bool can_share = false;
@@ -1202,11 +1449,9 @@ bool LLInvFVBridge::canShare() const
bool LLInvFVBridge::canListOnMarketplace() const
{
-#if ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU
-
LLInventoryModel * model = getInventoryModel();
- const LLViewerInventoryCategory * cat = model->getCategory(mUUID);
+ LLViewerInventoryCategory * cat = model->getCategory(mUUID);
if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
{
return false;
@@ -1217,16 +1462,6 @@ bool LLInvFVBridge::canListOnMarketplace() const
return false;
}
- if (getOutboxFolder().isNull())
- {
- return false;
- }
-
- if (isInboxFolder() || isOutboxFolder())
- {
- return false;
- }
-
LLViewerInventoryItem * item = model->getItem(mUUID);
if (item)
{
@@ -1242,16 +1477,11 @@ bool LLInvFVBridge::canListOnMarketplace() const
}
return true;
-
-#else
- return false;
-#endif
}
-bool LLInvFVBridge::canListOnMarketplaceNow() const
+// *TODO : Suppress canListOnOutboxNow() once we deprecate Merchant Outbox completely
+bool LLInvFVBridge::canListOnOutboxNow() const
{
-#if ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU
-
bool can_list = true;
// Do not allow listing while import is in progress
@@ -1297,10 +1527,56 @@ bool LLInvFVBridge::canListOnMarketplaceNow() const
}
return can_list;
+}
-#else
- return false;
-#endif
+bool LLInvFVBridge::canListOnMarketplaceNow() const
+{
+ bool can_list = true;
+
+ const LLInventoryObject* obj = getInventoryObject();
+ can_list &= (obj != NULL);
+
+ if (can_list)
+ {
+ const LLUUID& object_id = obj->getLinkedUUID();
+ can_list = object_id.notNull();
+
+ if (can_list)
+ {
+ LLFolderViewFolder * object_folderp = mInventoryPanel.get() ? mInventoryPanel.get()->getFolderByID(object_id) : NULL;
+ if (object_folderp)
+ {
+ can_list = !static_cast<LLFolderBridge*>(object_folderp->getViewModelItem())->isLoading();
+ }
+ }
+
+ if (can_list)
+ {
+ std::string error_msg;
+ LLInventoryModel* model = getInventoryModel();
+ const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ if (marketplacelistings_id.notNull())
+ {
+ LLViewerInventoryCategory * master_folder = model->getCategory(marketplacelistings_id);
+ LLInventoryCategory *cat = model->getCategory(mUUID);
+ if (cat)
+ {
+ can_list = can_move_folder_to_marketplace(master_folder, master_folder, cat, error_msg);
+ }
+ else
+ {
+ LLInventoryItem *item = model->getItem(mUUID);
+ can_list = (item ? can_move_item_to_marketplace(master_folder, master_folder, item, error_msg) : false);
+ }
+ }
+ else
+ {
+ can_list = false;
+ }
+ }
+ }
+
+ return can_list;
}
LLToolDragAndDrop::ESource LLInvFVBridge::getDragSource() const
@@ -1392,7 +1668,6 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
else if ("cut" == action)
{
cutToClipboard();
- gInventory.removeObject(mUUID);
return;
}
else if ("copy" == action)
@@ -1423,16 +1698,14 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
folder_view_itemp->getViewModelItem()->pasteLinkFromClipboard();
return;
}
- else if (isMarketplaceCopyAction(action))
+ else if (("move_to_marketplace_listings" == action) || ("copy_to_marketplace_listings" == action) || ("copy_or_move_to_marketplace_listings" == action))
{
- LL_INFOS() << "Copy item to marketplace action!" << LL_ENDL;
-
LLInventoryItem* itemp = model->getItem(mUUID);
if (!itemp) return;
-
- const LLUUID outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
- copy_item_to_outbox(itemp, outbox_id, LLUUID::null, LLToolDragAndDrop::getOperationId());
- }
+ const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ // Note: For a single item, if it's not a copy, then it's a move
+ move_item_to_marketplacelistings(itemp, marketplacelistings_id, ("copy_to_marketplace_listings" == action));
+ }
else if ("copy_slurl" == action)
{
LLViewerInventoryItem* item = static_cast<LLViewerInventoryItem*>(getItem());
@@ -1452,6 +1725,11 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
{
doActionOnCurSelectedLandmark(boost::bind(&LLItemBridge::doShowOnMap, this, _1));
}
+ else if ("marketplace_edit_listing" == action)
+ {
+ std::string url = LLMarketplaceData::instance().getListingURL(mUUID);
+ LLUrlAction::openURL(url);
+ }
}
void LLItemBridge::doActionOnCurSelectedLandmark(LLLandmarkList::loaded_callback_t cb)
@@ -1506,7 +1784,9 @@ void LLItemBridge::restoreItem()
if(item)
{
LLInventoryModel* model = getInventoryModel();
- const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(item->getType()));
+ bool is_snapshot = (item->getInventoryType() == LLInventoryType::IT_SNAPSHOT);
+
+ const LLUUID new_parent = model->findCategoryUUIDForType(is_snapshot? LLFolderType::FT_SNAPSHOT_CATEGORY : LLFolderType::assetTypeToFolderType(item->getType()));
// do not restamp on restore.
LLInvFVBridge::changeItemParent(model, item, new_parent, FALSE);
}
@@ -1917,6 +2197,22 @@ void LLFolderBridge::buildDisplayName() const
}
}
+std::string LLFolderBridge::getLabelSuffix() const
+{
+ static LLCachedControl<F32> folder_loading_message_delay(gSavedSettings, "FolderLoadingMessageWaitTime", 0.5f);
+
+ if (mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= folder_loading_message_delay())
+ {
+ return llformat(" ( %s ) ", LLTrans::getString("LoadingData").c_str());
+ }
+
+ return LLInvFVBridge::getLabelSuffix();
+}
+
+LLFontGL::StyleFlags LLFolderBridge::getLabelStyle() const
+{
+ return LLFontGL::NORMAL;
+}
void LLFolderBridge::update()
{
@@ -1973,6 +2269,11 @@ BOOL LLFolderBridge::isItemRemovable() const
return FALSE;
}
}
+
+ if (isMarketplaceListingsFolder() && LLMarketplaceData::instance().getActivationState(mUUID))
+ {
+ return FALSE;
+ }
return TRUE;
}
@@ -2108,88 +2409,12 @@ BOOL LLFolderBridge::isClipboardPasteableAsLink() const
}
-static BOOL can_move_to_outbox(LLInventoryItem* inv_item, std::string& tooltip_msg)
-{
- // Collapse links directly to items/folders
- LLViewerInventoryItem * viewer_inv_item = (LLViewerInventoryItem *) inv_item;
- LLViewerInventoryItem * linked_item = viewer_inv_item->getLinkedItem();
- if (linked_item != NULL)
- {
- inv_item = linked_item;
- }
-
- bool allow_transfer = inv_item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID());
- if (!allow_transfer)
- {
- tooltip_msg = LLTrans::getString("TooltipOutboxNoTransfer");
- return false;
- }
-
-#if BLOCK_WORN_ITEMS_IN_OUTBOX
- bool worn = get_is_item_worn(inv_item->getUUID());
- if (worn)
- {
- tooltip_msg = LLTrans::getString("TooltipOutboxWorn");
- return false;
- }
-#endif
-
- bool calling_card = (LLAssetType::AT_CALLINGCARD == inv_item->getType());
- if (calling_card)
- {
- tooltip_msg = LLTrans::getString("TooltipOutboxCallingCard");
- return false;
- }
-
- return true;
-}
-
-
-int get_folder_levels(LLInventoryCategory* inv_cat)
-{
- LLInventoryModel::cat_array_t* cats;
- LLInventoryModel::item_array_t* items;
- gInventory.getDirectDescendentsOf(inv_cat->getUUID(), cats, items);
-
- int max_child_levels = 0;
-
- for (S32 i=0; i < cats->size(); ++i)
- {
- LLInventoryCategory* category = cats->at(i);
- max_child_levels = llmax(max_child_levels, get_folder_levels(category));
- }
-
- return 1 + max_child_levels;
-}
-
-int get_folder_path_length(const LLUUID& ancestor_id, const LLUUID& descendant_id)
-{
- int depth = 0;
-
- if (ancestor_id == descendant_id) return depth;
-
- const LLInventoryCategory* category = gInventory.getCategory(descendant_id);
-
- while(category)
- {
- LLUUID parent_id = category->getParentUUID();
-
- if (parent_id.isNull()) break;
-
- depth++;
-
- if (parent_id == ancestor_id) return depth;
-
- category = gInventory.getCategory(parent_id);
- }
-
- LL_WARNS() << "get_folder_path_length() couldn't trace a path from the descendant to the ancestor" << LL_ENDL;
- return -1;
-}
BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
BOOL drop,
- std::string& tooltip_msg)
+ std::string& tooltip_msg,
+ BOOL is_link,
+ BOOL user_confirm)
{
LLInventoryModel* model = getInventoryModel();
@@ -2208,10 +2433,14 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
const LLUUID &cat_id = inv_cat->getUUID();
const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);
const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
+ const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID from_folder_uuid = inv_cat->getParentUUID();
const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id);
const BOOL move_is_from_outbox = model->isObjectDescendentOf(cat_id, outbox_id);
+ const BOOL move_is_into_marketplacelistings = model->isObjectDescendentOf(mUUID, marketplacelistings_id);
+ const BOOL move_is_from_marketplacelistings = model->isObjectDescendentOf(cat_id, marketplacelistings_id);
// check to make sure source is agent inventory, and is represented there.
LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();
@@ -2231,6 +2460,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);
const BOOL move_is_into_my_outfits = (mUUID == my_outifts_id) || model->isObjectDescendentOf(mUUID, my_outifts_id);
const BOOL move_is_into_outfit = move_is_into_my_outfits || (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
+ const BOOL move_is_into_current_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_CURRENT_OUTFIT);
const BOOL move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id);
//--------------------------------------------------------------------------------
@@ -2239,6 +2469,18 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
BOOL is_movable = TRUE;
+ if (is_movable && (marketplacelistings_id == cat_id))
+ {
+ is_movable = FALSE;
+ tooltip_msg = LLTrans::getString("TooltipOutboxCannotMoveRoot");
+ }
+ if (is_movable && move_is_from_marketplacelistings && LLMarketplaceData::instance().getActivationState(cat_id))
+ {
+ // If the incoming folder is listed and active (and is therefore either the listing or the version folder),
+ // then moving is *not* allowed
+ is_movable = FALSE;
+ tooltip_msg = LLTrans::getString("TooltipOutboxDragActive");
+ }
if (is_movable && (mUUID == cat_id))
{
is_movable = FALSE;
@@ -2256,14 +2498,30 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
}
if (is_movable && move_is_into_outfit)
{
+ if((mUUID == my_outifts_id) || (getCategory() && getCategory()->getPreferredType() == LLFolderType::FT_NONE))
+ {
+ is_movable = ((inv_cat->getPreferredType() == LLFolderType::FT_NONE) || (inv_cat->getPreferredType() == LLFolderType::FT_OUTFIT));
+ }
+ else
+ {
+ is_movable = false;
+ }
+ }
+ if(is_movable && move_is_into_current_outfit && is_link)
+ {
is_movable = FALSE;
- // tooltip?
}
if (is_movable && (mUUID == model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE)))
{
is_movable = FALSE;
// tooltip?
}
+ if (is_movable && (getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK))
+ {
+ // One cannot move a folder into a stock folder
+ is_movable = FALSE;
+ // tooltip?
+ }
LLInventoryModel::cat_array_t descendent_categories;
LLInventoryModel::item_array_t descendent_items;
@@ -2331,93 +2589,13 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
}
}
}
- if (is_movable && move_is_into_outbox)
+
+ if (is_movable && (move_is_into_outbox || move_is_into_marketplacelistings))
{
- const int nested_folder_levels = get_folder_path_length(outbox_id, mUUID) + get_folder_levels(inv_cat);
-
- if (nested_folder_levels > gSavedSettings.getU32("InventoryOutboxMaxFolderDepth"))
- {
- tooltip_msg = LLTrans::getString("TooltipOutboxFolderLevels");
- is_movable = FALSE;
- }
- else
- {
- int dragged_folder_count = descendent_categories.size();
- int existing_item_count = 0;
- int existing_folder_count = 0;
-
- const LLViewerInventoryCategory * master_folder = model->getFirstDescendantOf(outbox_id, mUUID);
-
- if (master_folder != NULL)
- {
- if (model->isObjectDescendentOf(cat_id, master_folder->getUUID()))
- {
- // Don't use count because we're already inside the same category anyway
- dragged_folder_count = 0;
- }
- else
- {
- existing_folder_count = 1; // Include the master folder in the count!
-
- // If we're in the drop operation as opposed to the drag without drop, we are doing a
- // single category at a time so don't block based on the total amount of cargo data items
- if (drop)
- {
- dragged_folder_count += 1;
- }
- else
- {
- // NOTE: The cargo id's count is a total of categories AND items but we err on the side of
- // prevention rather than letting too many folders into the hierarchy of the outbox,
- // when we're dragging the item to a new parent
- dragged_folder_count += LLToolDragAndDrop::instance().getCargoCount();
- }
- }
-
- // Tally the total number of categories and items inside the master folder
-
- LLInventoryModel::cat_array_t existing_categories;
- LLInventoryModel::item_array_t existing_items;
-
- model->collectDescendents(master_folder->getUUID(), existing_categories, existing_items, FALSE);
-
- existing_folder_count += existing_categories.size();
- existing_item_count += existing_items.size();
- }
- else
- {
- // Assume a single category is being dragged to the outbox since we evaluate one at a time
- // when not putting them under a parent item.
- dragged_folder_count += 1;
- }
-
- const int nested_folder_count = existing_folder_count + dragged_folder_count;
- const int nested_item_count = existing_item_count + descendent_items.size();
-
- if (nested_folder_count > gSavedSettings.getU32("InventoryOutboxMaxFolderCount"))
- {
- tooltip_msg = LLTrans::getString("TooltipOutboxTooManyFolders");
- is_movable = FALSE;
- }
- else if (nested_item_count > gSavedSettings.getU32("InventoryOutboxMaxItemCount"))
- {
- tooltip_msg = LLTrans::getString("TooltipOutboxTooManyObjects");
- is_movable = FALSE;
- }
-
- if (is_movable == TRUE)
- {
- for (S32 i=0; i < descendent_items.size(); ++i)
- {
- LLInventoryItem* item = descendent_items[i];
- if (!can_move_to_outbox(item, tooltip_msg))
- {
- is_movable = FALSE;
- break;
- }
- }
- }
- }
+ const LLViewerInventoryCategory * master_folder = (move_is_into_outbox ? model->getFirstDescendantOf(outbox_id, mUUID) : model->getFirstDescendantOf(marketplacelistings_id, mUUID));
+ LLViewerInventoryCategory * dest_folder = getCategory();
+ S32 bundle_size = (drop ? 1 : LLToolDragAndDrop::instance().getCargoCount());
+ is_movable = can_move_folder_to_marketplace(master_folder, dest_folder, inv_cat, tooltip_msg, bundle_size);
}
if (is_movable)
@@ -2460,6 +2638,48 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
if (accept && drop)
{
+ // Dropping in or out of marketplace needs (sometimes) confirmation
+ if (user_confirm && (move_is_from_marketplacelistings || move_is_into_marketplacelistings))
+ {
+ if (move_is_from_marketplacelistings && (LLMarketplaceData::instance().isInActiveFolder(cat_id) ||
+ LLMarketplaceData::instance().isListedAndActive(cat_id)))
+ {
+ if (LLMarketplaceData::instance().isListed(cat_id) || LLMarketplaceData::instance().isVersionFolder(cat_id))
+ {
+ // Move the active version folder or listing folder itself outside marketplace listings will unlist the listing so ask that question specifically
+ LLNotificationsUtil::add("ConfirmMerchantUnlist", LLSD(), LLSD(), boost::bind(&LLFolderBridge::callback_dropCategoryIntoFolder, this, _1, _2, inv_cat));
+ }
+ else
+ {
+ // Any other case will simply modify but not unlist an active listed listing
+ LLNotificationsUtil::add("ConfirmMerchantActiveChange", LLSD(), LLSD(), boost::bind(&LLFolderBridge::callback_dropCategoryIntoFolder, this, _1, _2, inv_cat));
+ }
+ return true;
+ }
+ if (move_is_from_marketplacelistings && LLMarketplaceData::instance().isVersionFolder(cat_id))
+ {
+ // Moving the version folder from its location will deactivate it. Ask confirmation.
+ LLNotificationsUtil::add("ConfirmMerchantClearVersion", LLSD(), LLSD(), boost::bind(&LLFolderBridge::callback_dropCategoryIntoFolder, this, _1, _2, inv_cat));
+ return true;
+ }
+ if (move_is_into_marketplacelistings && LLMarketplaceData::instance().isInActiveFolder(mUUID))
+ {
+ // Moving something in an active listed listing will modify it. Ask confirmation.
+ LLNotificationsUtil::add("ConfirmMerchantActiveChange", LLSD(), LLSD(), boost::bind(&LLFolderBridge::callback_dropCategoryIntoFolder, this, _1, _2, inv_cat));
+ return true;
+ }
+ if (move_is_from_marketplacelistings && LLMarketplaceData::instance().isListed(cat_id))
+ {
+ // Moving a whole listing folder will result in archival of SLM data. Ask confirmation.
+ LLNotificationsUtil::add("ConfirmListingCutOrDelete", LLSD(), LLSD(), boost::bind(&LLFolderBridge::callback_dropCategoryIntoFolder, this, _1, _2, inv_cat));
+ return true;
+ }
+ if (move_is_into_marketplacelistings && !move_is_from_marketplacelistings)
+ {
+ LLNotificationsUtil::add("ConfirmMerchantMoveInventory", LLSD(), LLSD(), boost::bind(&LLFolderBridge::callback_dropCategoryIntoFolder, this, _1, _2, inv_cat));
+ return true;
+ }
+ }
// Look for any gestures and deactivate them
if (move_is_into_trash)
{
@@ -2473,9 +2693,11 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
}
}
}
+
// if target is current outfit folder we use link
if (move_is_into_current_outfit &&
- inv_cat->getPreferredType() == LLFolderType::FT_NONE)
+ (inv_cat->getPreferredType() == LLFolderType::FT_NONE ||
+ inv_cat->getPreferredType() == LLFolderType::FT_OUTFIT))
{
// traverse category and add all contents to currently worn.
BOOL append = true;
@@ -2485,6 +2707,10 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
{
copy_folder_to_outbox(inv_cat, mUUID, cat_id, LLToolDragAndDrop::getOperationId());
}
+ else if (move_is_into_marketplacelistings)
+ {
+ move_folder_to_marketplacelistings(inv_cat, mUUID);
+ }
else
{
if (model->isObjectDescendentOf(cat_id, model->findCategoryUUIDForType(LLFolderType::FT_INBOX, false)))
@@ -2500,11 +2726,38 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
mUUID,
move_is_into_trash);
}
+ if (move_is_from_marketplacelistings)
+ {
+ // If we are moving a folder at the listing folder level (i.e. its parent is the marketplace listings folder)
+ if (from_folder_uuid == marketplacelistings_id)
+ {
+ // Clear the folder from the marketplace in case it is a listing folder
+ if (LLMarketplaceData::instance().isListed(cat_id))
+ {
+ LLMarketplaceData::instance().clearListing(cat_id);
+ }
+ }
+ else
+ {
+ // If we move from within an active (listed) listing, checks that it's still valid, if not, unlist
+ LLUUID version_folder_id = LLMarketplaceData::instance().getActiveFolder(from_folder_uuid);
+ if (version_folder_id.notNull())
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(version_folder_id);
+ if (!validate_marketplacelistings(cat,NULL))
+ {
+ LLMarketplaceData::instance().activateListing(version_folder_id,false);
+ }
+ }
+ // In all cases, update the listing we moved from so suffix are updated
+ update_marketplace_category(from_folder_uuid);
+ }
+ }
}
}
else if (LLToolDragAndDrop::SOURCE_WORLD == source)
{
- if (move_is_into_outbox)
+ if (move_is_into_outbox || move_is_into_marketplacelistings)
{
tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
accept = FALSE;
@@ -2516,7 +2769,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
}
else if (LLToolDragAndDrop::SOURCE_LIBRARY == source)
{
- if (move_is_into_outbox)
+ if (move_is_into_outbox || move_is_into_marketplacelistings)
{
tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
accept = FALSE;
@@ -2886,7 +3139,6 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
else if ("cut" == action)
{
cutToClipboard();
- gInventory.removeObject(mUUID);
return;
}
else if ("copy" == action)
@@ -2914,33 +3166,151 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
restoreItem();
return;
}
+ else if ("marketplace_list" == action)
+ {
+ if (depth_nesting_in_marketplace(mUUID) == 1)
+ {
+ LLUUID version_folder_id = LLMarketplaceData::instance().getVersionFolder(mUUID);
+ LLViewerInventoryCategory* cat = gInventory.getCategory(version_folder_id);
+ mMessage = "";
+ if (!validate_marketplacelistings(cat,boost::bind(&LLFolderBridge::gatherMessage, this, _1, _2, _3)))
+ {
+ LLSD subs;
+ subs["[ERROR_CODE]"] = mMessage;
+ LLNotificationsUtil::add("MerchantListingFailed", subs);
+ }
+ else
+ {
+ LLMarketplaceData::instance().activateListing(mUUID,true);
+ }
+ }
+ return;
+ }
+ else if ("marketplace_activate" == action)
+ {
+ if (depth_nesting_in_marketplace(mUUID) == 2)
+ {
+ LLInventoryCategory* category = gInventory.getCategory(mUUID);
+ mMessage = "";
+ if (!validate_marketplacelistings(category,boost::bind(&LLFolderBridge::gatherMessage, this, _1, _2, _3),false,2))
+ {
+ LLSD subs;
+ subs["[ERROR_CODE]"] = mMessage;
+ LLNotificationsUtil::add("MerchantFolderActivationFailed", subs);
+ }
+ else
+ {
+ LLMarketplaceData::instance().setVersionFolder(category->getParentUUID(), mUUID);
+ }
+ }
+ return;
+ }
+ else if ("marketplace_unlist" == action)
+ {
+ if (depth_nesting_in_marketplace(mUUID) == 1)
+ {
+ LLMarketplaceData::instance().activateListing(mUUID,false,1);
+ }
+ return;
+ }
+ else if ("marketplace_deactivate" == action)
+ {
+ if (depth_nesting_in_marketplace(mUUID) == 2)
+ {
+ LLInventoryCategory* category = gInventory.getCategory(mUUID);
+ LLMarketplaceData::instance().setVersionFolder(category->getParentUUID(), LLUUID::null, 1);
+ }
+ return;
+ }
+ else if ("marketplace_create_listing" == action)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(mUUID);
+ mMessage = "";
+ bool validates = validate_marketplacelistings(cat,boost::bind(&LLFolderBridge::gatherMessage, this, _1, _2, _3),false);
+ if (!validates)
+ {
+ mMessage = "";
+ validates = validate_marketplacelistings(cat,boost::bind(&LLFolderBridge::gatherMessage, this, _1, _2, _3),true);
+ if (validates)
+ {
+ LLNotificationsUtil::add("MerchantForceValidateListing");
+ }
+ }
+
+ if (!validates)
+ {
+ LLSD subs;
+ subs["[ERROR_CODE]"] = mMessage;
+ LLNotificationsUtil::add("MerchantListingFailed", subs);
+ }
+ else
+ {
+ LLMarketplaceData::instance().createListing(mUUID);
+ }
+ return;
+ }
+ else if ("marketplace_disassociate_listing" == action)
+ {
+ LLMarketplaceData::instance().clearListing(mUUID);
+ return;
+ }
+ else if ("marketplace_get_listing" == action)
+ {
+ // This is used only to exercise the SLM API but won't be shown to end users
+ LLMarketplaceData::instance().getListing(mUUID);
+ return;
+ }
+ else if ("marketplace_associate_listing" == action)
+ {
+ LLFloaterAssociateListing::show(mUUID);
+ return;
+ }
+ else if ("marketplace_check_listing" == action)
+ {
+ LLSD data(mUUID);
+ LLFloaterReg::showInstance("marketplace_validation", data);
+ return;
+ }
+ else if ("marketplace_edit_listing" == action)
+ {
+ std::string url = LLMarketplaceData::instance().getListingURL(mUUID);
+ if (!url.empty())
+ {
+ LLUrlAction::openURL(url);
+ }
+ return;
+ }
#ifndef LL_RELEASE_FOR_DOWNLOAD
else if ("delete_system_folder" == action)
{
removeSystemFolder();
}
#endif
- else if (isMarketplaceCopyAction(action))
+ else if (("move_to_marketplace_listings" == action) || ("copy_to_marketplace_listings" == action) || ("copy_or_move_to_marketplace_listings" == action))
{
- LL_INFOS() << "Copy folder to marketplace action!" << LL_ENDL;
-
LLInventoryCategory * cat = gInventory.getCategory(mUUID);
if (!cat) return;
+ const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ move_folder_to_marketplacelistings(cat, marketplacelistings_id, ("move_to_marketplace_listings" != action), (("copy_or_move_to_marketplace_listings" == action)));
+ }
+}
- 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
- else if (isMarketplaceSendAction(action))
- {
- LL_INFOS() << "Send to marketplace action!" << LL_ENDL;
-
- LLInventoryCategory * cat = gInventory.getCategory(mUUID);
- if (!cat) return;
-
- send_to_marketplace(cat);
- }
-#endif // ENABLE_MERCHANT_SEND_TO_MARKETPLACE_CONTEXT_MENU
+void LLFolderBridge::gatherMessage(std::string& message, S32 depth, LLError::ELevel log_level)
+{
+ if (log_level >= LLError::LEVEL_ERROR)
+ {
+ if (!mMessage.empty())
+ {
+ // Currently, we do not gather all messages as it creates very long alerts
+ // Users can get to the whole list of errors on a listing using the "Check for Errors" audit button or "Check listing" right click menu
+ //mMessage += "\n";
+ return;
+ }
+ // Take the leading spaces out...
+ std::string::size_type start = message.find_first_not_of(" ");
+ // Append the message
+ mMessage += message.substr(start, message.length() - start);
+ }
}
void LLFolderBridge::openItem()
@@ -3010,25 +3380,24 @@ LLFolderType::EType LLFolderBridge::getPreferredType() const
// Icons for folders are based on the preferred type
LLUIImagePtr LLFolderBridge::getIcon() const
{
- LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
- LLViewerInventoryCategory* cat = getCategory();
- if(cat)
- {
- preferred_type = cat->getPreferredType();
- }
- return getIcon(preferred_type);
+ return getFolderIcon(FALSE);
}
-// static
-LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type)
+LLUIImagePtr LLFolderBridge::getIconOpen() const
{
- return LLUI::getUIImage(LLViewerFolderType::lookupIconName(preferred_type, FALSE));
+ return getFolderIcon(TRUE);
}
-LLUIImagePtr LLFolderBridge::getIconOpen() const
+LLUIImagePtr LLFolderBridge::getFolderIcon(BOOL is_open) const
{
- return LLUI::getUIImage(LLViewerFolderType::lookupIconName(getPreferredType(), TRUE));
+ LLFolderType::EType preferred_type = getPreferredType();
+ return LLUI::getUIImage(LLViewerFolderType::lookupIconName(preferred_type, is_open));
+}
+// static : use by LLLinkFolderBridge to get the closed type icons
+LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type)
+{
+ return LLUI::getUIImage(LLViewerFolderType::lookupIconName(preferred_type, FALSE));
}
LLUIImagePtr LLFolderBridge::getIconOverlay() const
@@ -3040,14 +3409,6 @@ LLUIImagePtr LLFolderBridge::getIconOverlay() const
return NULL;
}
-std::string LLFolderBridge::getLabelSuffix() const
-{
- static LLCachedControl<F32> folder_loading_message_delay(gSavedSettings, "FolderLoadingMessageWaitTime", 0.5f);
- return mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= folder_loading_message_delay()
- ? llformat(" ( %s ) ", LLTrans::getString("LoadingData").c_str())
- : LLStringUtil::null;
-}
-
BOOL LLFolderBridge::renameItem(const std::string& new_name)
{
@@ -3131,10 +3492,42 @@ void LLFolderBridge::updateHierarchyCreationDate(time_t date)
void LLFolderBridge::pasteFromClipboard()
{
LLInventoryModel* model = getInventoryModel();
- if(model && isClipboardPasteable())
+ if (model && isClipboardPasteable())
{
- const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);
+ const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const BOOL paste_into_marketplacelistings = model->isObjectDescendentOf(mUUID, marketplacelistings_id);
+
+ if (paste_into_marketplacelistings && !LLMarketplaceData::instance().isListed(mUUID) && LLMarketplaceData::instance().isInActiveFolder(mUUID))
+ {
+ // Prompt the user if pasting in a marketplace active version listing (note that pasting right under the listing folder root doesn't need a prompt)
+ LLNotificationsUtil::add("ConfirmMerchantActiveChange", LLSD(), LLSD(), boost::bind(&LLFolderBridge::callback_pasteFromClipboard, this, _1, _2));
+ }
+ else
+ {
+ // Otherwise just do the paste
+ perform_pasteFromClipboard();
+ }
+ }
+}
+
+// Callback for pasteFromClipboard if DAMA required...
+void LLFolderBridge::callback_pasteFromClipboard(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0) // YES
+ {
+ perform_pasteFromClipboard();
+ }
+}
+
+void LLFolderBridge::perform_pasteFromClipboard()
+{
+ LLInventoryModel* model = getInventoryModel();
+ if (model && isClipboardPasteable())
+ {
+ const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);
const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
+ const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE, false);
const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false);
@@ -3142,58 +3535,70 @@ void LLFolderBridge::pasteFromClipboard()
const BOOL move_is_into_my_outfits = (mUUID == my_outifts_id) || model->isObjectDescendentOf(mUUID, my_outifts_id);
const BOOL move_is_into_outfit = move_is_into_my_outfits || (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id);
+ const BOOL move_is_into_marketplacelistings = model->isObjectDescendentOf(mUUID, marketplacelistings_id);
const BOOL move_is_into_favorites = (mUUID == favorites_id);
std::vector<LLUUID> objects;
LLClipboard::instance().pasteFromClipboard(objects);
-
- if (move_is_into_outbox)
- {
- LLFolderViewItem * outbox_itemp = mInventoryPanel.get()->getItemByID(mUUID);
-
- if (outbox_itemp)
- {
- LLToolDragAndDrop::instance().setCargoCount(objects.size());
-
- BOOL can_list = TRUE;
-
- for (std::vector<LLUUID>::const_iterator iter = objects.begin();
- (iter != objects.end()) && (can_list == TRUE);
- ++iter)
- {
- const LLUUID& item_id = (*iter);
- LLInventoryItem *item = model->getItem(item_id);
-
- if (item)
- {
- MASK mask = 0x0;
- BOOL drop = FALSE;
- EDragAndDropType cargo_type = LLViewerAssetType::lookupDragAndDropType(item->getActualType());
- void * cargo_data = (void *) item;
- std::string tooltip_msg;
-
- can_list = outbox_itemp->getViewModelItem()->dragOrDrop(mask, drop, cargo_type, cargo_data, tooltip_msg);
- }
- }
-
- LLToolDragAndDrop::instance().resetCargoCount();
-
- if (can_list == FALSE)
- {
- // Notify user of failure somehow -- play error sound? modal dialog?
- return;
- }
+
+ LLViewerInventoryCategory * dest_folder = getCategory();
+ if (move_is_into_outbox || move_is_into_marketplacelistings)
+ {
+ std::string error_msg;
+ const LLViewerInventoryCategory * master_folder = (move_is_into_outbox ? model->getFirstDescendantOf(outbox_id, mUUID) : model->getFirstDescendantOf(marketplacelistings_id, mUUID));
+ int index = 0;
+ for (std::vector<LLUUID>::const_iterator iter = objects.begin(); iter != objects.end(); ++iter)
+ {
+ const LLUUID& item_id = (*iter);
+ LLInventoryItem *item = model->getItem(item_id);
+ LLInventoryCategory *cat = model->getCategory(item_id);
+
+ if (item && !can_move_item_to_marketplace(master_folder, dest_folder, item, error_msg, objects.size() - index, true))
+ {
+ break;
+ }
+ if (cat && !can_move_folder_to_marketplace(master_folder, dest_folder, cat, error_msg, objects.size() - index, true, true))
+ {
+ break;
+ }
+ ++index;
}
- }
-
+ if (!error_msg.empty())
+ {
+ LLSD subs;
+ subs["[ERROR_CODE]"] = error_msg;
+ LLNotificationsUtil::add("MerchantPasteFailed", subs);
+ return;
+ }
+ }
+ else
+ {
+ // Check that all items can be moved into that folder : for the moment, only stock folder mismatch is checked
+ for (std::vector<LLUUID>::const_iterator iter = objects.begin(); iter != objects.end(); ++iter)
+ {
+ const LLUUID& item_id = (*iter);
+ LLInventoryItem *item = model->getItem(item_id);
+ LLInventoryCategory *cat = model->getCategory(item_id);
+
+ if ((item && !dest_folder->acceptItem(item)) || (cat && (dest_folder->getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK)))
+ {
+ std::string error_msg = LLTrans::getString("TooltipOutboxMixedStock");
+ LLSD subs;
+ subs["[ERROR_CODE]"] = error_msg;
+ LLNotificationsUtil::add("StockPasteFailed", subs);
+ return;
+ }
+ }
+ }
+
const LLUUID parent_id(mUUID);
-
+
for (std::vector<LLUUID>::const_iterator iter = objects.begin();
iter != objects.end();
++iter)
{
const LLUUID& item_id = (*iter);
-
+
LLInventoryItem *item = model->getItem(item_id);
LLInventoryObject *obj = model->getObject(item_id);
if (obj)
@@ -3221,21 +3626,44 @@ void LLFolderBridge::pasteFromClipboard()
LLViewerInventoryCategory* vicat = (LLViewerInventoryCategory *) model->getCategory(item_id);
llassert(vicat);
if (vicat)
- {
- //changeCategoryParent() implicity calls dirtyFilter
- changeCategoryParent(model, vicat, parent_id, FALSE);
+ {
+ // Clear the cut folder from the marketplace if it is a listing folder
+ if (LLMarketplaceData::instance().isListed(item_id))
+ {
+ LLMarketplaceData::instance().clearListing(item_id);
+ }
+ if (move_is_into_marketplacelistings)
+ {
+ move_folder_to_marketplacelistings(vicat, parent_id);
+ }
+ else
+ {
+ //changeCategoryParent() implicity calls dirtyFilter
+ changeCategoryParent(model, vicat, parent_id, FALSE);
+ }
}
}
else
- {
- LLViewerInventoryItem* viitem = dynamic_cast<LLViewerInventoryItem*>(item);
- llassert(viitem);
- if (viitem)
- {
- //changeItemParent() implicity calls dirtyFilter
- changeItemParent(model, viitem, parent_id, FALSE);
- }
- }
+ {
+ LLViewerInventoryItem* viitem = dynamic_cast<LLViewerInventoryItem*>(item);
+ llassert(viitem);
+ if (viitem)
+ {
+ if (move_is_into_marketplacelistings)
+ {
+ if (!move_item_to_marketplacelistings(viitem, parent_id))
+ {
+ // Stop pasting into the marketplace as soon as we get an error
+ break;
+ }
+ }
+ else
+ {
+ //changeItemParent() implicity calls dirtyFilter
+ changeItemParent(model, viitem, parent_id, FALSE);
+ }
+ }
+ }
}
else
{
@@ -3246,22 +3674,45 @@ void LLFolderBridge::pasteFromClipboard()
llassert(vicat);
if (vicat)
{
- copy_inventory_category(model, vicat, parent_id);
+ if (move_is_into_marketplacelistings)
+ {
+ move_folder_to_marketplacelistings(vicat, parent_id, true);
+ }
+ else
+ {
+ copy_inventory_category(model, vicat, parent_id);
+ }
}
}
- else
- {
- copy_inventory_item(
- gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- parent_id,
- std::string(),
- LLPointer<LLInventoryCallback>(NULL));
- }
- }
- }
- }
+ else
+ {
+ LLViewerInventoryItem* viitem = dynamic_cast<LLViewerInventoryItem*>(item);
+ llassert(viitem);
+ if (viitem)
+ {
+ if (move_is_into_marketplacelistings)
+ {
+ if (!move_item_to_marketplacelistings(viitem, parent_id, true))
+ {
+ // Stop pasting into the marketplace as soon as we get an error
+ break;
+ }
+ }
+ else
+ {
+ copy_inventory_item(
+ gAgent.getID(),
+ item->getPermissions().getOwner(),
+ item->getUUID(),
+ parent_id,
+ std::string(),
+ LLPointer<LLInventoryCallback>(NULL));
+ }
+ }
+ }
+ }
+ }
+ }
// Change mode to paste for next paste
LLClipboard::instance().setCutMode(false);
}
@@ -3274,14 +3725,16 @@ void LLFolderBridge::pasteLinkFromClipboard()
{
const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);
const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
+ const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false);
const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
const BOOL move_is_into_my_outfits = (mUUID == my_outifts_id) || model->isObjectDescendentOf(mUUID, my_outifts_id);
const BOOL move_is_into_outfit = move_is_into_my_outfits || (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id);
+ const BOOL move_is_into_marketplacelistings = model->isObjectDescendentOf(mUUID, marketplacelistings_id);
- if (move_is_into_outbox)
+ if (move_is_into_outbox || move_is_into_marketplacelistings)
{
// Notify user of failure somehow -- play error sound? modal dialog?
return;
@@ -3341,9 +3794,10 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& 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);
+ 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);
+ const LLUUID &marketplace_listings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
if (lost_and_found_id == mUUID)
{
@@ -3361,6 +3815,35 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
{
disabled_items.push_back(std::string("New Folder"));
}
+ if (isMarketplaceListingsFolder())
+ {
+ addMarketplaceContextMenuOptions(flags, items, disabled_items);
+ if (LLMarketplaceData::instance().isUpdating(mUUID))
+ {
+ disabled_items.push_back(std::string("New Folder"));
+ disabled_items.push_back(std::string("Rename"));
+ disabled_items.push_back(std::string("Cut"));
+ disabled_items.push_back(std::string("Copy"));
+ disabled_items.push_back(std::string("Paste"));
+ disabled_items.push_back(std::string("Delete"));
+ }
+ }
+ if (getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK)
+ {
+ 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 (marketplace_listings_id == mUUID)
+ {
+ disabled_items.push_back(std::string("New Folder"));
+ disabled_items.push_back(std::string("Rename"));
+ disabled_items.push_back(std::string("Cut"));
+ disabled_items.push_back(std::string("Delete"));
+ }
if(trash_id == mUUID)
{
// This is the trash.
@@ -3390,12 +3873,14 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
{
items.push_back(std::string("New Folder"));
}
-
- 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 (!isMarketplaceListingsFolder())
+ {
+ 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"));
+ }
}
getClipboardEntries(false, items, disabled_items, flags);
}
@@ -3429,9 +3914,9 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
LLIsType is_object( LLAssetType::AT_OBJECT );
LLIsType is_gesture( LLAssetType::AT_GESTURE );
- if (checkFolderForContentsOfType(model, is_wearable) ||
- checkFolderForContentsOfType(model, is_object) ||
- checkFolderForContentsOfType(model, is_gesture) )
+ if (checkFolderForContentsOfType(model, is_wearable) ||
+ checkFolderForContentsOfType(model, is_object) ||
+ checkFolderForContentsOfType(model, is_gesture) )
{
mWearables=TRUE;
}
@@ -3443,7 +3928,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
disabled_items.push_back(std::string("Delete System Folder"));
}
- if (!isOutboxFolder())
+ if (!isOutboxFolder() && !isMarketplaceListingsFolder())
{
items.push_back(std::string("Share"));
if (!canShare())
@@ -3453,7 +3938,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
}
// Add menu items that are dependent on the contents of the folder.
LLViewerInventoryCategory* category = (LLViewerInventoryCategory *) model->getCategory(mUUID);
- if (category)
+ if (category && (marketplace_listings_id != mUUID))
{
uuid_vec_t folders;
folders.push_back(category->getUUID());
@@ -3472,8 +3957,8 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
{
// 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, menuentry_vec_t& items, menuentry_vec_t& disabled_items)
@@ -3490,6 +3975,12 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags, menuentry_vec_t&
if (isItemInTrash()) return;
if (!isAgentInventory()) return;
if (isOutboxFolder()) return;
+
+ if (!isItemRemovable())
+ {
+ disabled_items.push_back(std::string("Delete"));
+ }
+ if (isMarketplaceListingsFolder()) return;
LLFolderType::EType type = category->getPreferredType();
const bool is_system_folder = LLFolderType::lookupIsProtectedType(type);
@@ -3509,11 +4000,6 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags, menuentry_vec_t&
}
}
- if (!isItemRemovable())
- {
- disabled_items.push_back(std::string("Delete"));
- }
-
#ifndef LL_RELEASE_FOR_DOWNLOAD
if (LLFolderType::lookupIsProtectedType(type))
{
@@ -3585,7 +4071,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
if(!model) return;
buildContextMenuOptions(flags, items, disabled_items);
- hide_context_entries(menu, 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();
@@ -3635,7 +4121,7 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,
LLInventoryCategory* linked_category = gInventory.getCategory(inv_item->getLinkedUUID());
if (linked_category)
{
- accept = dragCategoryIntoFolder((LLInventoryCategory*)linked_category, drop, tooltip_msg);
+ accept = dragCategoryIntoFolder((LLInventoryCategory*)linked_category, drop, tooltip_msg, TRUE);
}
}
else
@@ -3802,6 +4288,121 @@ void LLFolderBridge::modifyOutfit(BOOL append)
LLAppearanceMgr::instance().wearInventoryCategory( cat, FALSE, append );
}
+// +=================================================+
+// | LLMarketplaceFolderBridge |
+// +=================================================+
+
+// LLMarketplaceFolderBridge is a specialized LLFolderBridge for use in Marketplace Inventory panels
+LLMarketplaceFolderBridge::LLMarketplaceFolderBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid) :
+LLFolderBridge(inventory, root, uuid)
+{
+ m_depth = depth_nesting_in_marketplace(mUUID);
+ m_stockCountCache = COMPUTE_STOCK_NOT_EVALUATED;
+}
+
+LLUIImagePtr LLMarketplaceFolderBridge::getIcon() const
+{
+ return getMarketplaceFolderIcon(FALSE);
+}
+
+LLUIImagePtr LLMarketplaceFolderBridge::getIconOpen() const
+{
+ return getMarketplaceFolderIcon(TRUE);
+}
+
+LLUIImagePtr LLMarketplaceFolderBridge::getMarketplaceFolderIcon(BOOL is_open) const
+{
+ LLFolderType::EType preferred_type = getPreferredType();
+ if (!LLMarketplaceData::instance().isUpdating(getUUID()))
+ {
+ // Skip computation (expensive) if we're waiting for updates. Use the old value in that case.
+ m_depth = depth_nesting_in_marketplace(mUUID);
+ }
+ if ((preferred_type == LLFolderType::FT_NONE) && (m_depth == 2))
+ {
+ // We override the type when in the marketplace listings folder and only for version folder
+ preferred_type = LLFolderType::FT_MARKETPLACE_VERSION;
+ }
+ return LLUI::getUIImage(LLViewerFolderType::lookupIconName(preferred_type, is_open));
+}
+
+std::string LLMarketplaceFolderBridge::getLabelSuffix() const
+{
+ static LLCachedControl<F32> folder_loading_message_delay(gSavedSettings, "FolderLoadingMessageWaitTime", 0.5f);
+
+ if (mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= folder_loading_message_delay())
+ {
+ return llformat(" ( %s ) ", LLTrans::getString("LoadingData").c_str());
+ }
+
+ std::string suffix = "";
+ // Listing folder case
+ if (LLMarketplaceData::instance().isListed(getUUID()))
+ {
+ suffix = llformat("%d",LLMarketplaceData::instance().getListingID(getUUID()));
+ if (suffix.empty())
+ {
+ suffix = LLTrans::getString("MarketplaceNoID");
+ }
+ suffix = " (" + suffix + ")";
+ if (LLMarketplaceData::instance().getActivationState(getUUID()))
+ {
+ suffix += " (" + LLTrans::getString("MarketplaceLive") + ")";
+ }
+ }
+ // Version folder case
+ else if (LLMarketplaceData::instance().isVersionFolder(getUUID()))
+ {
+ suffix += " (" + LLTrans::getString("MarketplaceActive") + ")";
+ }
+ // Add stock amount
+ bool updating = LLMarketplaceData::instance().isUpdating(getUUID());
+ if (!updating)
+ {
+ // Skip computation (expensive) if we're waiting for update anyway. Use the old value in that case.
+ m_stockCountCache = compute_stock_count(getUUID());
+ }
+ if (m_stockCountCache == 0)
+ {
+ suffix += " (" + LLTrans::getString("MarketplaceNoStock") + ")";
+ }
+ else if (m_stockCountCache != COMPUTE_STOCK_INFINITE)
+ {
+ if (getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK)
+ {
+ suffix += " (" + LLTrans::getString("MarketplaceStock");
+ }
+ else
+ {
+ suffix += " (" + LLTrans::getString("MarketplaceMax");
+ }
+ if (m_stockCountCache == COMPUTE_STOCK_NOT_EVALUATED)
+ {
+ suffix += "=" + LLTrans::getString("MarketplaceUpdating") + ")";
+ }
+ else
+ {
+ suffix += "=" + llformat("%d", m_stockCountCache) + ")";
+ }
+ }
+ // Add updating suffix
+ if (updating)
+ {
+ suffix += " (" + LLTrans::getString("MarketplaceUpdating") + ")";
+ }
+ return LLInvFVBridge::getLabelSuffix() + suffix;
+}
+
+LLFontGL::StyleFlags LLMarketplaceFolderBridge::getLabelStyle() const
+{
+ return (LLMarketplaceData::instance().getActivationState(getUUID()) ? LLFontGL::BOLD : LLFontGL::NORMAL);
+}
+
+
+
+
// helper stuff
bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv* move_inv)
{
@@ -3922,12 +4523,35 @@ void LLFolderBridge::dropToOutfit(LLInventoryItem* inv_item, BOOL move_is_into_c
}
}
+// Callback for drop item if DAMA required...
+void LLFolderBridge::callback_dropItemIntoFolder(const LLSD& notification, const LLSD& response, LLInventoryItem* inv_item)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0) // YES
+ {
+ std::string tooltip_msg;
+ dragItemIntoFolder(inv_item, TRUE, tooltip_msg, FALSE);
+ }
+}
+
+// Callback for drop category if DAMA required...
+void LLFolderBridge::callback_dropCategoryIntoFolder(const LLSD& notification, const LLSD& response, LLInventoryCategory* inv_category)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0) // YES
+ {
+ std::string tooltip_msg;
+ dragCategoryIntoFolder(inv_category, TRUE, tooltip_msg, FALSE, FALSE);
+ }
+}
+
// This is used both for testing whether an item can be dropped
// into the folder, as well as performing the actual drop, depending
// if drop == TRUE.
BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
BOOL drop,
- std::string& tooltip_msg)
+ std::string& tooltip_msg,
+ BOOL user_confirm)
{
LLInventoryModel* model = getInventoryModel();
@@ -3945,7 +4569,9 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE, false);
const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false);
const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
+ const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false);
+ const LLUUID from_folder_uuid = inv_item->getParentUUID();
const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
const BOOL move_is_into_favorites = (mUUID == favorites_id);
@@ -3954,6 +4580,8 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
const BOOL move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id);
const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id);
const BOOL move_is_from_outbox = model->isObjectDescendentOf(inv_item->getUUID(), outbox_id);
+ const BOOL move_is_into_marketplacelistings = model->isObjectDescendentOf(mUUID, marketplacelistings_id);
+ const BOOL move_is_from_marketplacelistings = model->isObjectDescendentOf(inv_item->getUUID(), marketplacelistings_id);
LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();
BOOL accept = FALSE;
@@ -4007,59 +4635,45 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
//--------------------------------------------------------------------------------
// Determine if item can be moved & dropped
- //
+ // Note: if user_confirm is false, we already went through those accept logic test and can skip them
accept = TRUE;
- if (!is_movable)
+ if (user_confirm && !is_movable)
{
accept = FALSE;
}
- else if ((mUUID == inv_item->getParentUUID()) && !move_is_into_favorites)
+ else if (user_confirm && (mUUID == inv_item->getParentUUID()) && !move_is_into_favorites)
{
accept = FALSE;
}
- else if (move_is_into_current_outfit || move_is_into_outfit)
+ else if (user_confirm && (move_is_into_current_outfit || move_is_into_outfit))
{
accept = can_move_to_outfit(inv_item, move_is_into_current_outfit);
}
- else if (move_is_into_favorites || move_is_into_landmarks)
+ else if (user_confirm && (move_is_into_favorites || move_is_into_landmarks))
{
accept = can_move_to_landmarks(inv_item);
}
- else if (move_is_into_outbox)
+ else if (user_confirm && (move_is_into_outbox || move_is_into_marketplacelistings))
{
- accept = can_move_to_outbox(inv_item, tooltip_msg);
-
- if (accept)
- {
- const LLViewerInventoryCategory * master_folder = model->getFirstDescendantOf(outbox_id, mUUID);
-
- int existing_item_count = LLToolDragAndDrop::instance().getCargoCount();
-
- if (master_folder != NULL)
- {
- LLInventoryModel::cat_array_t existing_categories;
- LLInventoryModel::item_array_t existing_items;
-
- gInventory.collectDescendents(master_folder->getUUID(), existing_categories, existing_items, FALSE);
-
- existing_item_count += existing_items.size();
- }
-
- if (existing_item_count > gSavedSettings.getU32("InventoryOutboxMaxItemCount"))
- {
- tooltip_msg = LLTrans::getString("TooltipOutboxTooManyObjects");
- accept = FALSE;
- }
- }
+ const LLViewerInventoryCategory * master_folder = (move_is_into_outbox ? model->getFirstDescendantOf(outbox_id, mUUID) : model->getFirstDescendantOf(marketplacelistings_id, mUUID));
+ LLViewerInventoryCategory * dest_folder = getCategory();
+ accept = can_move_item_to_marketplace(master_folder, dest_folder, inv_item, tooltip_msg, LLToolDragAndDrop::instance().getCargoCount() - LLToolDragAndDrop::instance().getCargoIndex());
}
+ // Check that the folder can accept this item based on folder/item type compatibility (e.g. stock folder compatibility)
+ if (user_confirm && accept)
+ {
+ LLViewerInventoryCategory * dest_folder = getCategory();
+ accept = dest_folder->acceptItem(inv_item);
+ }
+
LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
// Check whether the item being dragged from active inventory panel
// passes the filter of the destination panel.
- if (accept && active_panel && use_filter)
+ if (user_confirm && accept && active_panel && use_filter)
{
LLFolderViewItem* fv_item = active_panel->getItemByID(inv_item->getUUID());
if (!fv_item) return false;
@@ -4079,9 +4693,25 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
// 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();
- }
+ {
+ active_panel->unSelectAll();
+ }
+ // Dropping in or out of marketplace needs (sometimes) confirmation
+ if (user_confirm && (move_is_from_marketplacelistings || move_is_into_marketplacelistings))
+ {
+ if ((move_is_from_marketplacelistings && (LLMarketplaceData::instance().isInActiveFolder(inv_item->getUUID())
+ || LLMarketplaceData::instance().isListedAndActive(inv_item->getUUID()))) ||
+ (move_is_into_marketplacelistings && LLMarketplaceData::instance().isInActiveFolder(mUUID)))
+ {
+ LLNotificationsUtil::add("ConfirmMerchantActiveChange", LLSD(), LLSD(), boost::bind(&LLFolderBridge::callback_dropItemIntoFolder, this, _1, _2, inv_item));
+ return true;
+ }
+ if (move_is_into_marketplacelistings && !move_is_from_marketplacelistings)
+ {
+ LLNotificationsUtil::add("ConfirmMerchantMoveInventory", LLSD(), LLSD(), boost::bind(&LLFolderBridge::callback_dropItemIntoFolder, this, _1, _2, inv_item));
+ return true;
+ }
+ }
//--------------------------------------------------------------------------------
// Destination folder logic
@@ -4094,7 +4724,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
LLFolderViewItem* itemp = destination_panel->getRootFolder()->getDraggingOverItem();
if (itemp)
{
- LLUUID srcItemId = inv_item->getUUID();
+ LLUUID srcItemId = inv_item->getUUID();
LLUUID destItemId = static_cast<LLFolderViewModelItemInventory*>(itemp->getViewModelItem())->getUUID();
LLFavoritesOrderStorage::instance().rearrangeFavoriteLandmarks(srcItemId, destItemId);
}
@@ -4112,6 +4742,8 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
{
dropToOutfit(inv_item, move_is_into_current_outfit);
}
+ // MERCHANT OUTBOX folder
+ // Move the item
else if (move_is_into_outbox)
{
if (move_is_from_outbox)
@@ -4123,6 +4755,12 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
copy_item_to_outbox(inv_item, mUUID, LLUUID::null, LLToolDragAndDrop::getOperationId());
}
}
+ // MARKETPLACE LISTINGS folder
+ // Move the item
+ else if (move_is_into_marketplacelistings)
+ {
+ move_item_to_marketplacelistings(inv_item, mUUID);
+ }
// NORMAL or TRASH folder
// (move the item, restamp if into trash)
else
@@ -4139,8 +4777,22 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
mUUID,
move_is_into_trash);
}
-
- //
+
+ if (move_is_from_marketplacelistings)
+ {
+ // If we move from an active (listed) listing, checks that it's still valid, if not, unlist
+ LLUUID version_folder_id = LLMarketplaceData::instance().getActiveFolder(from_folder_uuid);
+ if (version_folder_id.notNull())
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(version_folder_id);
+ if (!validate_marketplacelistings(cat,NULL))
+ {
+ LLMarketplaceData::instance().activateListing(version_folder_id,false);
+ }
+ }
+ }
+
+ //
//--------------------------------------------------------------------------------
}
}
@@ -4189,7 +4841,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
{
accept = FALSE;
}
- else if (move_is_into_outbox)
+ else if (move_is_into_outbox || move_is_into_marketplacelistings)
{
tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
accept = FALSE;
@@ -4227,7 +4879,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
}
else if(LLToolDragAndDrop::SOURCE_NOTECARD == source)
{
- if (move_is_into_outbox)
+ if (move_is_into_outbox || move_is_into_marketplacelistings)
{
tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
accept = FALSE;
@@ -4261,7 +4913,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
{
accept = TRUE;
- if (move_is_into_outbox)
+ if (move_is_into_outbox || move_is_into_marketplacelistings)
{
tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
accept = FALSE;
@@ -4434,6 +5086,12 @@ void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
addOutboxContextMenuOptions(flags, items, disabled_items);
}
+ else if (isMarketplaceListingsFolder())
+ {
+ addMarketplaceContextMenuOptions(flags, items, disabled_items);
+ items.push_back(std::string("Properties"));
+ getClipboardEntries(false, items, disabled_items, flags);
+ }
else
{
items.push_back(std::string("Share"));
@@ -4501,6 +5159,12 @@ void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
addOutboxContextMenuOptions(flags, items, disabled_items);
}
+ else if (isMarketplaceListingsFolder())
+ {
+ addMarketplaceContextMenuOptions(flags, items, disabled_items);
+ items.push_back(std::string("Properties"));
+ getClipboardEntries(false, items, disabled_items, flags);
+ }
else
{
if (isItemInTrash())
@@ -4576,6 +5240,12 @@ void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
addOutboxContextMenuOptions(flags, items, disabled_items);
}
+ else if (isMarketplaceListingsFolder())
+ {
+ addMarketplaceContextMenuOptions(flags, items, disabled_items);
+ items.push_back(std::string("Properties"));
+ getClipboardEntries(false, items, disabled_items, flags);
+ }
else
{
if(isItemInTrash())
@@ -4868,6 +5538,12 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
items.push_back(std::string("Delete"));
}
+ else if (isMarketplaceListingsFolder())
+ {
+ addMarketplaceContextMenuOptions(flags, items, disabled_items);
+ items.push_back(std::string("Properties"));
+ getClipboardEntries(false, items, disabled_items, flags);
+ }
else
{
items.push_back(std::string("Share"));
@@ -5000,6 +5676,25 @@ void LLNotecardBridge::openItem()
}
}
+void LLNotecardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+ LL_DEBUGS() << "LLNotecardBridge::buildContextMenu()" << LL_ENDL;
+
+ if (isMarketplaceListingsFolder())
+ {
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
+ addMarketplaceContextMenuOptions(flags, items, disabled_items);
+ items.push_back(std::string("Properties"));
+ getClipboardEntries(false, items, disabled_items, flags);
+ hide_context_entries(menu, items, disabled_items);
+ }
+ else
+ {
+ LLItemBridge::buildContextMenu(menu, flags);
+ }
+}
+
// +=================================================+
// | LLGestureBridge |
// +=================================================+
@@ -5045,7 +5740,7 @@ void LLGestureBridge::performAction(LLInventoryModel* model, std::string action)
gInventory.updateItem(item);
gInventory.notifyObservers();
}
- else if (isRemoveAction(action))
+ else if ("deactivate" == action || isRemoveAction(action))
{
LLGestureMgr::instance().deactivateGesture(mUUID);
@@ -5135,6 +5830,12 @@ void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
items.push_back(std::string("Delete"));
}
+ else if (isMarketplaceListingsFolder())
+ {
+ addMarketplaceContextMenuOptions(flags, items, disabled_items);
+ items.push_back(std::string("Properties"));
+ getClipboardEntries(false, items, disabled_items, flags);
+ }
else
{
items.push_back(std::string("Share"));
@@ -5189,6 +5890,12 @@ void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
items.push_back(std::string("Delete"));
}
+ else if (isMarketplaceListingsFolder())
+ {
+ addMarketplaceContextMenuOptions(flags, items, disabled_items);
+ items.push_back(std::string("Properties"));
+ getClipboardEntries(false, items, disabled_items, flags);
+ }
else
{
if(isItemInTrash())
@@ -5368,13 +6075,11 @@ void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attach
// Check for duplicate request.
if (isAgentAvatarValid() &&
- (gAgentAvatarp->attachmentWasRequested(item_id) ||
- gAgentAvatarp->isWearingAttachment(item_id)))
+ gAgentAvatarp->isWearingAttachment(item_id))
{
- LL_WARNS() << "duplicate attachment request, ignoring" << LL_ENDL;
+ LL_WARNS() << "ATT duplicate attachment request, ignoring" << LL_ENDL;
return;
}
- gAgentAvatarp->addAttachmentRequest(item_id);
S32 attach_pt = 0;
if (isAgentAvatarValid() && attachment)
@@ -5424,36 +6129,14 @@ bool confirm_attachment_rez(const LLSD& notification, const LLSD& response)
if (itemp)
{
- /*
- {
- U8 attachment_pt = notification["payload"]["attachment_point"].asInteger();
-
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessageFast(_PREHASH_RezSingleAttachmentFromInv);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_ObjectData);
- msg->addUUIDFast(_PREHASH_ItemID, itemp->getUUID());
- msg->addUUIDFast(_PREHASH_OwnerID, itemp->getPermissions().getOwner());
- msg->addU8Fast(_PREHASH_AttachmentPt, attachment_pt);
- pack_permissions_slam(msg, itemp->getFlags(), itemp->getPermissions());
- msg->addStringFast(_PREHASH_Name, itemp->getName());
- msg->addStringFast(_PREHASH_Description, itemp->getDescription());
- msg->sendReliable(gAgent.getRegion()->getHost());
- return false;
- }
- */
-
// Queue up attachments to be sent in next idle tick, this way the
// attachments are batched up all into one message versus each attachment
// being sent in its own separate attachments message.
U8 attachment_pt = notification["payload"]["attachment_point"].asInteger();
BOOL is_add = notification["payload"]["is_add"].asBoolean();
- LLAttachmentsMgr::instance().addAttachment(item_id,
- attachment_pt,
- is_add);
+ LL_DEBUGS("Avatar") << "ATT calling addAttachmentRequest " << (itemp ? itemp->getName() : "UNKNOWN") << " id " << item_id << LL_ENDL;
+ LLAttachmentsMgr::instance().addAttachmentRequest(item_id, attachment_pt, is_add);
}
}
return false;
@@ -5472,6 +6155,12 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
items.push_back(std::string("Delete"));
}
+ else if (isMarketplaceListingsFolder())
+ {
+ addMarketplaceContextMenuOptions(flags, items, disabled_items);
+ items.push_back(std::string("Properties"));
+ getClipboardEntries(false, items, disabled_items, flags);
+ }
else
{
items.push_back(std::string("Share"));
@@ -5673,12 +6362,8 @@ void LLWearableBridge::performAction(LLInventoryModel* model, std::string action
void LLWearableBridge::openItem()
{
- LLViewerInventoryItem* item = getItem();
-
- if (item)
- {
- LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
- }
+ performAction(getInventoryModel(),
+ get_is_item_worn(mUUID) ? "take_off" : "wear");
}
void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
@@ -5694,6 +6379,12 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
items.push_back(std::string("Delete"));
}
+ else if (isMarketplaceListingsFolder())
+ {
+ addMarketplaceContextMenuOptions(flags, items, disabled_items);
+ items.push_back(std::string("Properties"));
+ getClipboardEntries(false, items, disabled_items, flags);
+ }
else
{ // FWIW, it looks like SUPPRESS_OPEN_ITEM is not set anywhere
BOOL can_open = ((flags & SUPPRESS_OPEN_ITEM) != SUPPRESS_OPEN_ITEM);
@@ -5770,7 +6461,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
if (LLWearableType::getAllowMultiwear(mWearableType))
{
items.push_back(std::string("Wearable Add"));
- if (gAgentWearables.getWearableCount(mWearableType) >= LLAgentWearables::MAX_CLOTHING_PER_TYPE)
+ if (!gAgentWearables.canAddWearable(mWearableType))
{
disabled_items.push_back(std::string("Wearable Add"));
}
@@ -5994,6 +6685,12 @@ void LLMeshBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
addOutboxContextMenuOptions(flags, items, disabled_items);
}
+ else if (isMarketplaceListingsFolder())
+ {
+ addMarketplaceContextMenuOptions(flags, items, disabled_items);
+ items.push_back(std::string("Properties"));
+ getClipboardEntries(false, items, disabled_items, flags);
+ }
else
{
items.push_back(std::string("Properties"));
@@ -6439,4 +7136,22 @@ LLInvFVBridge* LLRecentInventoryBridgeBuilder::createBridge(
return new_listener;
}
+LLFolderViewGroupedItemBridge::LLFolderViewGroupedItemBridge()
+{
+}
+
+void LLFolderViewGroupedItemBridge::groupFilterContextMenu(folder_view_item_deque& selected_items, LLMenuGL& menu)
+{
+ uuid_vec_t ids;
+ menuentry_vec_t disabled_items;
+ if (get_selection_item_uuids(selected_items, ids))
+ {
+ if (!LLAppearanceMgr::instance().canAddWearables(ids))
+ {
+ disabled_items.push_back(std::string("Wearable Add"));
+ }
+ }
+ disable_context_entries_if_present(menu, disabled_items);
+}
+
// EOF
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index f8ef15991d..03e19cc4da 100755
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -37,6 +37,7 @@
#include "llviewerwearable.h"
#include "lltooldraganddrop.h"
#include "lllandmarklist.h"
+#include "llfolderviewitem.h"
class LLInventoryFilter;
class LLInventoryPanel;
@@ -76,6 +77,7 @@ public:
bool canShare() const;
bool canListOnMarketplace() const;
+ bool canListOnOutboxNow() const;
bool canListOnMarketplaceNow() const;
//--------------------------------------------------------------------
@@ -114,7 +116,7 @@ public:
virtual void move(LLFolderViewModelItem* new_parent_bridge) {}
virtual BOOL isItemCopyable() const { return FALSE; }
virtual BOOL copyToClipboard() const;
- virtual BOOL cutToClipboard() const;
+ virtual BOOL cutToClipboard();
virtual BOOL isClipboardPasteable() const;
virtual BOOL isClipboardPasteableAsLink() const;
virtual void pasteFromClipboard() {}
@@ -146,6 +148,9 @@ protected:
virtual void addOutboxContextMenuOptions(U32 flags,
menuentry_vec_t &items,
menuentry_vec_t &disabled_items);
+ virtual void addMarketplaceContextMenuOptions(U32 flags,
+ menuentry_vec_t &items,
+ menuentry_vec_t &disabled_items);
protected:
LLInvFVBridge(LLInventoryPanel* inventory, LLFolderView* root, const LLUUID& uuid);
@@ -160,6 +165,7 @@ protected:
BOOL isInboxFolder() const; // true if COF or descendant of marketplace inbox
BOOL isOutboxFolderDirectParent() const;
+ BOOL isMarketplaceListingsFolder() const; // true if descendant of Marketplace listings folder
const LLUUID getOutboxFolder() const;
virtual BOOL isItemPermissive() const;
@@ -172,6 +178,9 @@ protected:
const LLUUID& new_parent,
BOOL restamp);
void removeBatchNoCheck(std::vector<LLFolderViewModelItem*>& batch);
+
+ BOOL callback_cutToClipboard(const LLSD& notification, const LLSD& response);
+ BOOL perform_cutToClipboard();
public:
BOOL isOutboxFolder() const; // true if COF or descendant of marketplace outbox
@@ -187,6 +196,7 @@ protected:
mutable std::string mSearchableName;
void purgeItem(LLInventoryModel *model, const LLUUID &uuid);
+ void removeObject(LLInventoryModel *model, const LLUUID &uuid);
virtual void buildDisplayName() const {}
};
@@ -263,8 +273,10 @@ public:
mIsLoading(false)
{}
- BOOL dragItemIntoFolder(LLInventoryItem* inv_item, BOOL drop, std::string& tooltip_msg);
- BOOL dragCategoryIntoFolder(LLInventoryCategory* inv_category, BOOL drop, std::string& tooltip_msg);
+ BOOL dragItemIntoFolder(LLInventoryItem* inv_item, BOOL drop, std::string& tooltip_msg, BOOL user_confirm = TRUE);
+ BOOL dragCategoryIntoFolder(LLInventoryCategory* inv_category, BOOL drop, std::string& tooltip_msg, BOOL is_link = FALSE, BOOL user_confirm = TRUE);
+ void callback_dropItemIntoFolder(const LLSD& notification, const LLSD& response, LLInventoryItem* inv_item);
+ void callback_dropCategoryIntoFolder(const LLSD& notification, const LLSD& response, LLInventoryCategory* inv_category);
virtual void buildDisplayName() const;
@@ -279,10 +291,9 @@ public:
virtual LLUIImagePtr getIcon() const;
virtual LLUIImagePtr getIconOpen() const;
virtual LLUIImagePtr getIconOverlay() const;
-
static LLUIImagePtr getIcon(LLFolderType::EType preferred_type);
-
virtual std::string getLabelSuffix() const;
+ virtual LLFontGL::StyleFlags getLabelStyle() const;
virtual BOOL renameItem(const std::string& new_name);
@@ -354,12 +365,17 @@ public:
static LLHandle<LLFolderBridge> sSelf;
static void staticFolderOptionsMenu();
-private:
+protected:
+ void callback_pasteFromClipboard(const LLSD& notification, const LLSD& response);
+ void perform_pasteFromClipboard();
+ void gatherMessage(std::string& message, S32 depth, LLError::ELevel log_level);
+ LLUIImagePtr getFolderIcon(BOOL is_open) const;
bool mCallingCards;
bool mWearables;
bool mIsLoading;
LLTimer mTimeSinceRequestStart;
+ std::string mMessage;
LLRootHandle<LLFolderBridge> mHandle;
};
@@ -440,6 +456,7 @@ public:
const LLUUID& uuid) :
LLItemBridge(inventory, root, uuid) {}
virtual void openItem();
+ virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
};
class LLGestureBridge : public LLItemBridge
@@ -483,6 +500,7 @@ public:
virtual LLUIImagePtr getIcon() const;
virtual void performAction(LLInventoryModel* model, std::string action);
virtual void openItem();
+ virtual BOOL isItemWearable() const { return TRUE; }
virtual std::string getLabelSuffix() const;
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
virtual BOOL renameItem(const std::string& new_name);
@@ -515,6 +533,7 @@ public:
virtual LLUIImagePtr getIcon() const;
virtual void performAction(LLInventoryModel* model, std::string action);
virtual void openItem();
+ virtual BOOL isItemWearable() const { return TRUE; }
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
virtual std::string getLabelSuffix() const;
virtual BOOL renameItem(const std::string& new_name);
@@ -668,6 +687,31 @@ public:
U32 flags = 0x00) const;
};
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Marketplace Inventory Panel related classes
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLMarketplaceFolderBridge : public LLFolderBridge
+{
+public:
+ // Overloads some display related methods specific to folders in a marketplace floater context
+ LLMarketplaceFolderBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid);
+
+ virtual LLUIImagePtr getIcon() const;
+ virtual LLUIImagePtr getIconOpen() const;
+ virtual std::string getLabelSuffix() const;
+ virtual LLFontGL::StyleFlags getLabelStyle() const;
+
+private:
+ LLUIImagePtr getMarketplaceFolderIcon(BOOL is_open) const;
+ // Those members are mutable because they are cached variablse to speed up display, not a state variables
+ mutable S32 m_depth;
+ mutable S32 m_stockCountCache;
+};
+
+
void rez_attachment(LLViewerInventoryItem* item,
LLViewerJointAttachment* attachment,
bool replace = false);
@@ -689,4 +733,17 @@ void hide_context_entries(LLMenuGL& menu,
const menuentry_vec_t &entries_to_show,
const menuentry_vec_t &disabled_entries);
+// Helper functions to classify actions.
+bool isAddAction(const std::string& action);
+bool isRemoveAction(const std::string& action);
+bool isMarketplaceCopyAction(const std::string& action);
+bool isMarketplaceSendAction(const std::string& action);
+
+class LLFolderViewGroupedItemBridge: public LLFolderViewGroupedItemModel
+{
+public:
+ LLFolderViewGroupedItemBridge();
+ virtual void groupFilterContextMenu(folder_view_item_deque& selected_items, LLMenuGL& menu);
+};
+
#endif // LL_LLINVENTORYBRIDGE_H
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index c66e9da4a9..003bbcafed 100755
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -33,6 +33,8 @@
#include "llfolderviewitem.h"
#include "llinventorymodel.h"
#include "llinventorymodelbackgroundfetch.h"
+#include "llinventoryfunctions.h"
+#include "llmarketplacefunctions.h"
#include "llviewercontrol.h"
#include "llfolderview.h"
#include "llinventorybridge.h"
@@ -68,7 +70,8 @@ LLInventoryFilter::LLInventoryFilter(const Params& p)
: mName(p.name),
mFilterModified(FILTER_NONE),
mEmptyLookupMessage("InventoryNoMatchingItems"),
- mFilterOps(p.filter_ops),
+ mFilterOps(p.filter_ops),
+ mBackupFilterOps(mFilterOps),
mFilterSubString(p.substring),
mCurrentGeneration(0),
mFirstRequiredGeneration(0),
@@ -136,12 +139,64 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const
}
// when applying a filter, matching folders get their contents downloaded first
- if (mFilterSubString.size()
+ if (isNotDefault()
&& !gInventory.isCategoryComplete(folder_id))
{
LLInventoryModelBackgroundFetch::instance().start(folder_id);
}
+ // Marketplace folder filtering
+ const U32 filterTypes = mFilterOps.mFilterTypes;
+ const U32 marketplace_filter = FILTERTYPE_MARKETPLACE_ACTIVE | FILTERTYPE_MARKETPLACE_INACTIVE |
+ FILTERTYPE_MARKETPLACE_UNASSOCIATED | FILTERTYPE_MARKETPLACE_LISTING_FOLDER |
+ FILTERTYPE_NO_MARKETPLACE_ITEMS;
+ if (filterTypes & marketplace_filter)
+ {
+ S32 depth = depth_nesting_in_marketplace(folder_id);
+
+ if (filterTypes & FILTERTYPE_NO_MARKETPLACE_ITEMS)
+ {
+ if (depth >= 0)
+ {
+ return false;
+ }
+ }
+
+ if (filterTypes & FILTERTYPE_MARKETPLACE_LISTING_FOLDER)
+ {
+ if (depth > 1)
+ {
+ return false;
+ }
+ }
+
+ if (depth > 0)
+ {
+ LLUUID listing_uuid = nested_parent_id(folder_id, depth);
+ if (filterTypes & FILTERTYPE_MARKETPLACE_ACTIVE)
+ {
+ if (!LLMarketplaceData::instance().getActivationState(listing_uuid))
+ {
+ return false;
+ }
+ }
+ else if (filterTypes & FILTERTYPE_MARKETPLACE_INACTIVE)
+ {
+ if (!LLMarketplaceData::instance().isListed(listing_uuid) || LLMarketplaceData::instance().getActivationState(listing_uuid))
+ {
+ return false;
+ }
+ }
+ else if (filterTypes & FILTERTYPE_MARKETPLACE_UNASSOCIATED)
+ {
+ if (LLMarketplaceData::instance().isListed(listing_uuid))
+ {
+ return false;
+ }
+ }
+ }
+ }
+
// show folder links
LLViewerInventoryItem* item = gInventory.getItem(folder_id);
if (item && item->getActualType() == LLAssetType::AT_LINK_FOLDER)
@@ -501,6 +556,40 @@ void LLInventoryFilter::setFilterEmptySystemFolders()
mFilterOps.mFilterTypes |= FILTERTYPE_EMPTYFOLDERS;
}
+void LLInventoryFilter::setFilterMarketplaceActiveFolders()
+{
+ mFilterOps.mFilterTypes |= FILTERTYPE_MARKETPLACE_ACTIVE;
+}
+
+void LLInventoryFilter::setFilterMarketplaceInactiveFolders()
+{
+ mFilterOps.mFilterTypes |= FILTERTYPE_MARKETPLACE_INACTIVE;
+}
+
+void LLInventoryFilter::setFilterMarketplaceUnassociatedFolders()
+{
+ mFilterOps.mFilterTypes |= FILTERTYPE_MARKETPLACE_UNASSOCIATED;
+}
+
+void LLInventoryFilter::setFilterMarketplaceListingFolders(bool select_only_listing_folders)
+{
+ if (select_only_listing_folders)
+ {
+ mFilterOps.mFilterTypes |= FILTERTYPE_MARKETPLACE_LISTING_FOLDER;
+ setModified(FILTER_MORE_RESTRICTIVE);
+ }
+ else
+ {
+ mFilterOps.mFilterTypes &= ~FILTERTYPE_MARKETPLACE_LISTING_FOLDER;
+ setModified(FILTER_LESS_RESTRICTIVE);
+ }
+}
+
+void LLInventoryFilter::setFilterNoMarketplaceFolder()
+{
+ mFilterOps.mFilterTypes |= FILTERTYPE_NO_MARKETPLACE_ITEMS;
+}
+
void LLInventoryFilter::setFilterUUID(const LLUUID& object_id)
{
if (mFilterOps.mFilterUUID == LLUUID::null)
@@ -546,6 +635,21 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)
setModified(FILTER_RESTART);
}
+ // Cancel out filter links once the search string is modified
+ if (mFilterOps.mFilterLinks == FILTERLINK_ONLY_LINKS)
+ {
+ if (mBackupFilterOps.mFilterLinks == FILTERLINK_ONLY_LINKS)
+ {
+ // we started viewer/floater in 'only links' mode
+ mFilterOps.mFilterLinks = FILTERLINK_INCLUDE_LINKS;
+ }
+ else
+ {
+ mFilterOps = mBackupFilterOps;
+ setModified(FILTER_RESTART);
+ }
+ }
+
// Cancel out UUID once the search string is modified
if (mFilterOps.mFilterTypes == FILTERTYPE_UUID)
{
@@ -553,11 +657,6 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)
mFilterOps.mFilterUUID = LLUUID::null;
setModified(FILTER_RESTART);
}
-
- // Cancel out filter links once the search string is modified
- {
- mFilterOps.mFilterLinks = FILTERLINK_INCLUDE_LINKS;
- }
}
}
@@ -748,6 +847,22 @@ void LLInventoryFilter::setShowFolderState(EFolderShow state)
}
}
+void LLInventoryFilter::setFindAllLinksMode(const std::string &search_name, const LLUUID& search_id)
+{
+ // Save a copy of settings so that we will be able to restore it later
+ // but make sure we are not searching for links already
+ if(mFilterOps.mFilterLinks != FILTERLINK_ONLY_LINKS)
+ {
+ mBackupFilterOps = mFilterOps;
+ }
+
+ // set search options
+ setFilterSubString(search_name);
+ setFilterUUID(search_id);
+ setShowFolderState(SHOW_NON_EMPTY_FOLDERS);
+ setFilterLinks(FILTERLINK_ONLY_LINKS);
+}
+
void LLInventoryFilter::markDefault()
{
mDefaultFilterOps = mFilterOps;
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index 5e18ad4d20..eee36b7e40 100755
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -52,7 +52,12 @@ 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
+ FILTERTYPE_EMPTYFOLDERS = 0x1 << 5, // pass if folder is not a system folder to be hidden if empty
+ FILTERTYPE_MARKETPLACE_ACTIVE = 0x1 << 6, // pass if folder is a marketplace active folder
+ FILTERTYPE_MARKETPLACE_INACTIVE = 0x1 << 7, // pass if folder is a marketplace inactive folder
+ FILTERTYPE_MARKETPLACE_UNASSOCIATED = 0x1 << 8, // pass if folder is a marketplace non associated (no market ID) folder
+ FILTERTYPE_MARKETPLACE_LISTING_FOLDER = 0x1 << 9, // pass iff folder is a listing folder
+ FILTERTYPE_NO_MARKETPLACE_ITEMS = 0x1 << 10 // pass iff folder is not under the marketplace
};
enum EFilterDateDirection
@@ -73,7 +78,8 @@ public:
SO_NAME = 0, // Sort inventory by name
SO_DATE = 0x1, // Sort inventory by date
SO_FOLDERS_BY_NAME = 0x1 << 1, // Force folder sort by name
- SO_SYSTEM_FOLDERS_TO_TOP = 0x1 << 2 // Force system folders to be on top
+ SO_SYSTEM_FOLDERS_TO_TOP = 0x1 << 2,// Force system folders to be on top
+ SO_FOLDERS_BY_WEIGHT = 0x1 << 3, // Force folder sort by weight, usually, amount of some elements in their descendents
};
struct FilterOps
@@ -170,6 +176,11 @@ public:
void setFilterUUID(const LLUUID &object_id);
void setFilterWearableTypes(U64 types);
void setFilterEmptySystemFolders();
+ void setFilterMarketplaceActiveFolders();
+ void setFilterMarketplaceInactiveFolders();
+ void setFilterMarketplaceUnassociatedFolders();
+ void setFilterMarketplaceListingFolders(bool select_only_listing_folders);
+ void setFilterNoMarketplaceFolder();
void updateFilterTypes(U64 types, U64& current_types);
void setFilterSubString(const std::string& string);
@@ -193,6 +204,9 @@ public:
void setFilterLinks(U64 filter_link);
U64 getFilterLinks() const;
+ // sets params for Link-only search and backs up search settings for future restoration
+ void setFindAllLinksMode(const std::string &search_name, const LLUUID& search_id);
+
// +-------------------------------------------------------------------+
// + Execution And Results
// +-------------------------------------------------------------------+
@@ -267,6 +281,7 @@ private:
FilterOps mFilterOps;
FilterOps mDefaultFilterOps;
+ FilterOps mBackupFilterOps; // for backup purposes when leaving 'search link' mode
std::string mFilterSubString;
std::string mFilterSubStringOrig;
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 1abc09bf3b..bb1d026d9c 100755
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -45,6 +45,7 @@
// newview includes
#include "llappearancemgr.h"
#include "llappviewer.h"
+#include "llavataractions.h"
#include "llclipboard.h"
#include "lldonotdisturbnotificationstorage.h"
#include "llfloaterinventory.h"
@@ -59,6 +60,7 @@
#include "llinventorypanel.h"
#include "lllineeditor.h"
#include "llmarketplacenotifications.h"
+#include "llmarketplacefunctions.h"
#include "llmenugl.h"
#include "llnotificationsutil.h"
#include "llpanelmaininventory.h"
@@ -89,6 +91,126 @@
BOOL LLInventoryState::sWearNewClothing = FALSE;
LLUUID LLInventoryState::sWearNewClothingTransactionID;
+std::list<LLUUID> LLInventoryAction::sMarketplaceFolders;
+
+// Helper function : callback to update a folder after inventory action happened in the background
+void update_folder_cb(const LLUUID& dest_folder)
+{
+ LLViewerInventoryCategory* dest_cat = gInventory.getCategory(dest_folder);
+ gInventory.updateCategory(dest_cat);
+ gInventory.notifyObservers();
+}
+
+// Helper function : Count only the copyable items, i.e. skip the stock items (which are no copy)
+S32 count_copyable_items(LLInventoryModel::item_array_t& items)
+{
+ S32 count = 0;
+ for (LLInventoryModel::item_array_t::const_iterator it = items.begin(); it != items.end(); ++it)
+ {
+ LLViewerInventoryItem* item = *it;
+ if (item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()))
+ {
+ count++;
+ }
+ }
+ return count;
+}
+
+// Helper function : Count only the non-copyable items, i.e. the stock items, skip the others
+S32 count_stock_items(LLInventoryModel::item_array_t& items)
+{
+ S32 count = 0;
+ for (LLInventoryModel::item_array_t::const_iterator it = items.begin(); it != items.end(); ++it)
+ {
+ LLViewerInventoryItem* item = *it;
+ if (!item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()))
+ {
+ count++;
+ }
+ }
+ return count;
+}
+
+// Helper function : Count the number of stock folders
+S32 count_stock_folders(LLInventoryModel::cat_array_t& categories)
+{
+ S32 count = 0;
+ for (LLInventoryModel::cat_array_t::const_iterator it = categories.begin(); it != categories.end(); ++it)
+ {
+ LLInventoryCategory* cat = *it;
+ if (cat->getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK)
+ {
+ count++;
+ }
+ }
+ return count;
+}
+
+// Helper funtion : Count the number of items (not folders) in the descending hierarchy
+S32 count_descendants_items(const LLUUID& cat_id)
+{
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(cat_id,cat_array,item_array);
+
+ S32 count = item_array->size();
+
+ LLInventoryModel::cat_array_t cat_array_copy = *cat_array;
+ for (LLInventoryModel::cat_array_t::iterator iter = cat_array_copy.begin(); iter != cat_array_copy.end(); iter++)
+ {
+ LLViewerInventoryCategory* category = *iter;
+ count += count_descendants_items(category->getUUID());
+ }
+
+ return count;
+}
+
+// Helper function : Returns true if the hierarchy contains nocopy items
+bool contains_nocopy_items(const LLUUID& id)
+{
+ LLInventoryCategory* cat = gInventory.getCategory(id);
+
+ if (cat)
+ {
+ // Get the content
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(id,cat_array,item_array);
+
+ // Check all the items: returns true upon encountering a nocopy item
+ for (LLInventoryModel::item_array_t::iterator iter = item_array->begin(); iter != item_array->end(); iter++)
+ {
+ LLInventoryItem* item = *iter;
+ LLViewerInventoryItem * inv_item = (LLViewerInventoryItem *) item;
+ if (!inv_item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()))
+ {
+ return true;
+ }
+ }
+
+ // Check all the sub folders recursively
+ for (LLInventoryModel::cat_array_t::iterator iter = cat_array->begin(); iter != cat_array->end(); iter++)
+ {
+ LLViewerInventoryCategory* cat = *iter;
+ if (contains_nocopy_items(cat->getUUID()))
+ {
+ return true;
+ }
+ }
+ }
+ else
+ {
+ LLInventoryItem* item = gInventory.getItem(id);
+ LLViewerInventoryItem * inv_item = (LLViewerInventoryItem *) item;
+ if (!inv_item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()))
+ {
+ return true;
+ }
+ }
+
+ // Exit without meeting a nocopy item
+ return false;
+}
// Generates a string containing the path to the item specified by
// item_id.
@@ -111,6 +233,139 @@ void append_path(const LLUUID& id, std::string& path)
path.append(temp);
}
+void update_marketplace_folder_hierarchy(const LLUUID cat_id)
+{
+ // When changing the marketplace status of a folder, the only thing that needs to happen is
+ // for all observers of the folder to, possibly, change the display label of the folder
+ // so that's the only thing we change on the update mask.
+ gInventory.addChangedMask(LLInventoryObserver::LABEL, cat_id);
+
+ // Update all descendent folders down
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(cat_id,cat_array,item_array);
+
+ LLInventoryModel::cat_array_t cat_array_copy = *cat_array;
+ for (LLInventoryModel::cat_array_t::iterator iter = cat_array_copy.begin(); iter != cat_array_copy.end(); iter++)
+ {
+ LLInventoryCategory* category = *iter;
+ update_marketplace_folder_hierarchy(category->getUUID());
+ }
+ return;
+}
+
+void update_marketplace_category(const LLUUID& cur_uuid, bool perform_consistency_enforcement)
+{
+ // When changing the marketplace status of an item, we usually have to change the status of all
+ // folders in the same listing. This is because the display of each folder is affected by the
+ // overall status of the whole listing.
+ // Consequently, the only way to correctly update an item anywhere in the marketplace is to
+ // update the whole listing from its listing root.
+ // This is not as bad as it seems as we only update folders, not items, and the folder nesting depth
+ // is limited to 4.
+ // We also take care of degenerated cases so we don't update all folders in the inventory by mistake.
+
+ if (cur_uuid.isNull())
+ {
+ return;
+ }
+
+ // Grab marketplace listing data for this item
+ S32 depth = depth_nesting_in_marketplace(cur_uuid);
+ if (depth > 0)
+ {
+ // Retrieve the listing uuid this object is in
+ LLUUID listing_uuid = nested_parent_id(cur_uuid, depth);
+
+ // Verify marketplace data consistency for this listing
+ if (perform_consistency_enforcement && LLMarketplaceData::instance().isListed(listing_uuid))
+ {
+ LLUUID version_folder_uuid = LLMarketplaceData::instance().getVersionFolder(listing_uuid);
+ S32 version_depth = depth_nesting_in_marketplace(version_folder_uuid);
+ if (version_folder_uuid.notNull() && (!gInventory.isObjectDescendentOf(version_folder_uuid, listing_uuid) || (version_depth != 2)))
+ {
+ LL_INFOS("SLM") << "Unlist and clear version folder as the version folder is not at the right place anymore!!" << LL_ENDL;
+ LLMarketplaceData::instance().setVersionFolder(listing_uuid, LLUUID::null,1);
+ }
+ else if (version_folder_uuid.notNull() && LLMarketplaceData::instance().getActivationState(version_folder_uuid) && (count_descendants_items(version_folder_uuid) == 0) && !LLMarketplaceData::instance().isUpdating(version_folder_uuid,version_depth))
+ {
+ LL_INFOS("SLM") << "Unlist as the version folder is empty of any item!!" << LL_ENDL;
+ LLNotificationsUtil::add("AlertMerchantVersionFolderEmpty");
+ LLMarketplaceData::instance().activateListing(listing_uuid, false,1);
+ }
+ }
+
+ // Check if the count on hand needs to be updated on SLM
+ if (perform_consistency_enforcement && (compute_stock_count(listing_uuid) != LLMarketplaceData::instance().getCountOnHand(listing_uuid)))
+ {
+ LLMarketplaceData::instance().updateCountOnHand(listing_uuid,1);
+ }
+ // Update all descendents starting from the listing root
+ update_marketplace_folder_hierarchy(listing_uuid);
+ }
+ else if (depth == 0)
+ {
+ // If this is the marketplace listings root itself, update all descendents
+ if (gInventory.getCategory(cur_uuid))
+ {
+ update_marketplace_folder_hierarchy(cur_uuid);
+ }
+ }
+ else
+ {
+ // If the folder is outside the marketplace listings root, clear its SLM data if needs be
+ if (perform_consistency_enforcement && LLMarketplaceData::instance().isListed(cur_uuid))
+ {
+ LL_INFOS("SLM") << "Disassociate as the listing folder is not under the marketplace folder anymore!!" << LL_ENDL;
+ LLMarketplaceData::instance().clearListing(cur_uuid);
+ }
+ // Update all descendents if this is a category
+ if (gInventory.getCategory(cur_uuid))
+ {
+ update_marketplace_folder_hierarchy(cur_uuid);
+ }
+ }
+
+ return;
+}
+
+// Iterate through the marketplace and flag for label change all categories that countain a stock folder (i.e. stock folders and embedding folders up the hierarchy)
+void update_all_marketplace_count(const LLUUID& cat_id)
+{
+ // Get all descendent folders down
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(cat_id,cat_array,item_array);
+
+ LLInventoryModel::cat_array_t cat_array_copy = *cat_array;
+ for (LLInventoryModel::cat_array_t::iterator iter = cat_array_copy.begin(); iter != cat_array_copy.end(); iter++)
+ {
+ LLInventoryCategory* category = *iter;
+ if (category->getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK)
+ {
+ // Listing containing stock folders needs to be updated but not others
+ // Note: we take advantage of the fact that stock folder *do not* contain sub folders to avoid a recursive call here
+ update_marketplace_category(category->getUUID());
+ }
+ else
+ {
+ // Explore the contained folders recursively
+ update_all_marketplace_count(category->getUUID());
+ }
+ }
+}
+
+void update_all_marketplace_count()
+{
+ // Get the marketplace root and launch the recursive exploration
+ const LLUUID marketplace_listings_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ if (!marketplace_listings_uuid.isNull())
+ {
+ update_all_marketplace_count(marketplace_listings_uuid);
+ }
+ return;
+}
+
void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::string& new_name)
{
LLViewerInventoryCategory* cat;
@@ -131,7 +386,8 @@ void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::s
void copy_inventory_category(LLInventoryModel* model,
LLViewerInventoryCategory* cat,
const LLUUID& parent_id,
- const LLUUID& root_copy_id)
+ const LLUUID& root_copy_id,
+ bool move_no_copy_items )
{
// Create the initial folder
LLUUID new_cat_uuid = gInventory.createNewCategory(parent_id, LLFolderType::FT_NONE, cat->getName());
@@ -144,19 +400,42 @@ void copy_inventory_category(LLInventoryModel* model,
LLInventoryModel::cat_array_t* cat_array;
LLInventoryModel::item_array_t* item_array;
gInventory.getDirectDescendentsOf(cat->getUUID(),cat_array,item_array);
+
+ // If root_copy_id is null, tell the marketplace model we'll be waiting for new items to be copied over for this folder
+ if (root_copy_id.isNull())
+ {
+ LLMarketplaceData::instance().setValidationWaiting(root_id,count_descendants_items(cat->getUUID()));
+ }
// Copy all the items
LLInventoryModel::item_array_t item_array_copy = *item_array;
for (LLInventoryModel::item_array_t::iterator iter = item_array_copy.begin(); iter != item_array_copy.end(); iter++)
{
LLInventoryItem* item = *iter;
- copy_inventory_item(
- gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- new_cat_uuid,
- std::string(),
- LLPointer<LLInventoryCallback>(NULL));
+ LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(update_folder_cb, new_cat_uuid));
+
+ if (!item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()))
+ {
+ // If the item is nocopy, we do nothing or, optionally, move it
+ if (move_no_copy_items)
+ {
+ // Reparent the item
+ LLViewerInventoryItem * viewer_inv_item = (LLViewerInventoryItem *) item;
+ gInventory.changeItemParent(viewer_inv_item, new_cat_uuid, true);
+ }
+ // Decrement the count in root_id since that one item won't be copied over
+ LLMarketplaceData::instance().decrementValidationWaiting(root_id);
+ }
+ else
+ {
+ copy_inventory_item(
+ gAgent.getID(),
+ item->getPermissions().getOwner(),
+ item->getUUID(),
+ new_cat_uuid,
+ std::string(),
+ cb);
+ }
}
// Copy all the folders
@@ -166,7 +445,7 @@ void copy_inventory_category(LLInventoryModel* model,
LLViewerInventoryCategory* category = *iter;
if (category->getUUID() != root_id)
{
- copy_inventory_category(model, category, new_cat_uuid, root_id);
+ copy_inventory_category(model, category, new_cat_uuid, root_id, move_no_copy_items);
}
}
}
@@ -230,7 +509,7 @@ BOOL get_is_item_worn(const LLUUID& id)
return FALSE;
// Consider the item as worn if it has links in COF.
- if (LLAppearanceMgr::instance().isLinkInCOF(id))
+ if (LLAppearanceMgr::instance().isLinkedInCOF(id))
{
return TRUE;
}
@@ -264,7 +543,7 @@ BOOL get_can_item_be_worn(const LLUUID& id)
if (!item)
return FALSE;
- if (LLAppearanceMgr::isLinkInCOF(item->getLinkedUUID()))
+ if (LLAppearanceMgr::instance().isLinkedInCOF(item->getLinkedUUID()))
{
// an item having links in COF (i.e. a worn item)
return FALSE;
@@ -458,7 +737,7 @@ void show_item_original(const LLUUID& item_uuid)
{
return;
}
- active_panel->setSelection(gInventory.getLinkedItemID(item_uuid), TAKE_FOCUS_NO);
+ active_panel->setSelection(gInventory.getLinkedItemID(item_uuid), TAKE_FOCUS_YES);
if(do_reset_inventory_filter)
{
@@ -508,14 +787,22 @@ void open_outbox()
LLFloaterReg::showInstance("outbox");
}
-LLUUID create_folder_in_outbox_for_item(LLInventoryItem* item, const LLUUID& destFolderId, S32 operation_id)
+void open_marketplace_listings()
+{
+ LLFloaterReg::showInstance("marketplace_listings");
+}
+
+// Create a new folder in destFolderId with the same name as the item name and return the uuid of the new folder
+// Note: this is used locally in various situation where we need to wrap an item into a special folder
+LLUUID create_folder_for_item(LLInventoryItem* item, const LLUUID& destFolderId)
{
llassert(item);
llassert(destFolderId.notNull());
LLUUID created_folder_id = gInventory.createNewCategory(destFolderId, LLFolderType::FT_NONE, item->getName());
gInventory.notifyObservers();
-
+
+ // *TODO : Create different notifications for the various cases
LLNotificationsUtil::add("OutboxFolderCreated");
return created_folder_id;
@@ -531,8 +818,7 @@ void move_to_outbox_cb_action(const LLSD& payload)
// when moving item directly into outbox create folder with that name
if (dest_folder_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false))
{
- S32 operation_id = payload["operation_id"].asInteger();
- dest_folder_id = create_folder_in_outbox_for_item(viitem, dest_folder_id, operation_id);
+ dest_folder_id = create_folder_for_item(viitem, dest_folder_id);
}
LLUUID parent = viitem->getParentUUID();
@@ -603,7 +889,7 @@ void copy_item_to_outbox(LLInventoryItem* inv_item, LLUUID dest_folder, const LL
// when moving item directly into outbox create folder with that name
if (dest_folder == gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false))
{
- dest_folder = create_folder_in_outbox_for_item(inv_item, dest_folder, operation_id);
+ dest_folder = create_folder_for_item(inv_item, dest_folder);
}
copy_inventory_item(gAgent.getID(),
@@ -633,7 +919,7 @@ void move_item_within_outbox(LLInventoryItem* inv_item, LLUUID dest_folder, S32
// when moving item directly into outbox create folder with that name
if (dest_folder == gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false))
{
- dest_folder = create_folder_in_outbox_for_item(inv_item, dest_folder, operation_id);
+ dest_folder = create_folder_for_item(inv_item, dest_folder);
}
LLViewerInventoryItem * viewer_inv_item = (LLViewerInventoryItem *) inv_item;
@@ -674,6 +960,1003 @@ void copy_folder_to_outbox(LLInventoryCategory* inv_cat, const LLUUID& dest_fold
}
///----------------------------------------------------------------------------
+// Marketplace functions
+//
+// Handles Copy and Move to or within the Marketplace listings folder.
+// Handles creation of stock folders, nesting of listings and version folders,
+// permission checking and listings validation.
+///----------------------------------------------------------------------------
+
+S32 depth_nesting_in_marketplace(LLUUID cur_uuid)
+{
+ // Get the marketplace listings root, exit with -1 (i.e. not under the marketplace listings root) if none
+ const LLUUID marketplace_listings_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ if (marketplace_listings_uuid.isNull())
+ {
+ return -1;
+ }
+ // If not a descendent of the marketplace listings root, then the nesting depth is -1 by definition
+ if (!gInventory.isObjectDescendentOf(cur_uuid, marketplace_listings_uuid))
+ {
+ return -1;
+ }
+
+ // Iterate through the parents till we hit the marketplace listings root
+ // Note that the marketplace listings root itself will return 0
+ S32 depth = 0;
+ LLInventoryObject* cur_object = gInventory.getObject(cur_uuid);
+ while (cur_uuid != marketplace_listings_uuid)
+ {
+ depth++;
+ cur_uuid = cur_object->getParentUUID();
+ cur_object = gInventory.getCategory(cur_uuid);
+ }
+ return depth;
+}
+
+// Returns the UUID of the marketplace listing this object is in
+LLUUID nested_parent_id(LLUUID cur_uuid, S32 depth)
+{
+ if (depth < 1)
+ {
+ // For objects outside the marketplace listings root (or root itself), we return a NULL UUID
+ return LLUUID::null;
+ }
+ else if (depth == 1)
+ {
+ // Just under the root, we return the passed UUID itself if it's a folder, NULL otherwise (not a listing)
+ LLViewerInventoryCategory* cat = gInventory.getCategory(cur_uuid);
+ return (cat ? cur_uuid : LLUUID::null);
+ }
+
+ // depth > 1
+ LLInventoryObject* cur_object = gInventory.getObject(cur_uuid);
+ while (depth > 1)
+ {
+ depth--;
+ cur_uuid = cur_object->getParentUUID();
+ cur_object = gInventory.getCategory(cur_uuid);
+ }
+ return cur_uuid;
+}
+
+S32 compute_stock_count(LLUUID cat_uuid, bool force_count /* false */)
+{
+ // Handle the case of the folder being a stock folder immediately
+ LLViewerInventoryCategory* cat = gInventory.getCategory(cat_uuid);
+ if (!cat)
+ {
+ // Not a category so no stock count to speak of
+ return COMPUTE_STOCK_INFINITE;
+ }
+ if (cat->getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK)
+ {
+ if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)
+ {
+ // If the folder is not completely fetched, we do not want to return any confusing value that could lead to unlisting
+ // "COMPUTE_STOCK_NOT_EVALUATED" denotes that a stock folder has a count that cannot be evaluated at this time (folder not up to date)
+ return COMPUTE_STOCK_NOT_EVALUATED;
+ }
+ // Note: stock folders are *not* supposed to have nested subfolders so we stop recursion here but we count only items (subfolders will be ignored)
+ // Note: we *always* give a stock count for stock folders, it's useful even if the listing is unassociated
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(cat_uuid,cat_array,item_array);
+ return item_array->size();
+ }
+
+ // When force_count is true, we do not do any verification of the marketplace status and simply compute
+ // the stock amount based on the descendent hierarchy. This is used specifically when creating a listing.
+ if (!force_count)
+ {
+ // Grab marketplace data for this folder
+ S32 depth = depth_nesting_in_marketplace(cat_uuid);
+ LLUUID listing_uuid = nested_parent_id(cat_uuid, depth);
+ if (!LLMarketplaceData::instance().isListed(listing_uuid))
+ {
+ // If not listed, the notion of stock is meaningless so it won't be computed for any level
+ return COMPUTE_STOCK_INFINITE;
+ }
+
+ LLUUID version_folder_uuid = LLMarketplaceData::instance().getVersionFolder(listing_uuid);
+ // Handle the case of the first 2 levels : listing and version folders
+ if (depth == 1)
+ {
+ if (version_folder_uuid.notNull())
+ {
+ // If there is a version folder, the stock value for the listing is the version folder stock
+ return compute_stock_count(version_folder_uuid, true);
+ }
+ else
+ {
+ // If there's no version folder associated, the notion of stock count has no meaning
+ return COMPUTE_STOCK_INFINITE;
+ }
+ }
+ else if (depth == 2)
+ {
+ if (version_folder_uuid.notNull() && (version_folder_uuid != cat_uuid))
+ {
+ // If there is a version folder but we're not it, our stock count is meaningless
+ return COMPUTE_STOCK_INFINITE;
+ }
+ }
+ }
+
+ // In all other cases, the stock count is the min of stock folders count found in the descendents
+ // "COMPUTE_STOCK_NOT_EVALUATED" denotes that a stock folder in the hierarchy has a count that cannot be evaluated at this time (folder not up to date)
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(cat_uuid,cat_array,item_array);
+
+ // "COMPUTE_STOCK_INFINITE" denotes a folder that doesn't countain any stock folders in its descendents
+ S32 curr_count = COMPUTE_STOCK_INFINITE;
+
+ // Note: marketplace listings have a maximum depth nesting of 4
+ LLInventoryModel::cat_array_t cat_array_copy = *cat_array;
+ for (LLInventoryModel::cat_array_t::iterator iter = cat_array_copy.begin(); iter != cat_array_copy.end(); iter++)
+ {
+ LLInventoryCategory* category = *iter;
+ S32 count = compute_stock_count(category->getUUID(), true);
+ if ((curr_count == COMPUTE_STOCK_INFINITE) || ((count != COMPUTE_STOCK_INFINITE) && (count < curr_count)))
+ {
+ curr_count = count;
+ }
+ }
+
+ return curr_count;
+}
+
+// local helper
+bool can_move_to_marketplace(LLInventoryItem* inv_item, std::string& tooltip_msg, bool resolve_links)
+{
+ // Collapse links directly to items/folders
+ LLViewerInventoryItem * viewer_inv_item = (LLViewerInventoryItem *) inv_item;
+ LLViewerInventoryItem * linked_item = viewer_inv_item->getLinkedItem();
+ LLViewerInventoryCategory * linked_category = viewer_inv_item->getLinkedCategory();
+
+ // Linked items and folders cannot be put for sale
+ if (linked_category || linked_item)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxLinked");
+ return false;
+ }
+
+ // A category is always considered as passing...
+ if (linked_category != NULL)
+ {
+ return true;
+ }
+
+ // Take the linked item if necessary
+ if (linked_item != NULL)
+ {
+ inv_item = linked_item;
+ }
+
+ // Check that the agent has transfer permission on the item: this is required as a resident cannot
+ // put on sale items she cannot transfer. Proceed with move if we have permission.
+ bool allow_transfer = inv_item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID());
+ if (!allow_transfer)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxNoTransfer");
+ return false;
+ }
+
+ // Check worn/not worn status: worn items cannot be put on the marketplace
+ bool worn = get_is_item_worn(inv_item->getUUID());
+ if (worn)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxWorn");
+ return false;
+ }
+
+ // Check library status: library items cannot be put on the marketplace
+ if (!gInventory.isObjectDescendentOf(inv_item->getUUID(), gInventory.getRootFolderID()))
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
+ return false;
+ }
+
+ // Check type: for the moment, calling cards cannot be put on the marketplace
+ bool calling_card = (LLAssetType::AT_CALLINGCARD == inv_item->getType());
+ if (calling_card)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxCallingCard");
+ return false;
+ }
+
+ return true;
+}
+
+// local helper
+// Returns the max tree length (in folder nodes) down from the argument folder
+int get_folder_levels(LLInventoryCategory* inv_cat)
+{
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(inv_cat->getUUID(), cats, items);
+
+ int max_child_levels = 0;
+
+ for (S32 i=0; i < cats->size(); ++i)
+ {
+ LLInventoryCategory* category = cats->at(i);
+ max_child_levels = llmax(max_child_levels, get_folder_levels(category));
+ }
+
+ return 1 + max_child_levels;
+}
+
+// local helper
+// Returns the distance (in folder nodes) between the ancestor and its descendant. Returns -1 if not related.
+int get_folder_path_length(const LLUUID& ancestor_id, const LLUUID& descendant_id)
+{
+ int depth = 0;
+
+ if (ancestor_id == descendant_id) return depth;
+
+ const LLInventoryCategory* category = gInventory.getCategory(descendant_id);
+
+ while (category)
+ {
+ LLUUID parent_id = category->getParentUUID();
+
+ if (parent_id.isNull()) break;
+
+ depth++;
+
+ if (parent_id == ancestor_id) return depth;
+
+ category = gInventory.getCategory(parent_id);
+ }
+
+ LL_WARNS("SLM") << "get_folder_path_length() couldn't trace a path from the descendant to the ancestor" << LL_ENDL;
+ return -1;
+}
+
+// local helper
+// Returns true if all items within the argument folder are fit for sale, false otherwise
+bool has_correct_permissions_for_sale(LLInventoryCategory* cat, std::string& error_msg)
+{
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(cat->getUUID(),cat_array,item_array);
+
+ LLInventoryModel::item_array_t item_array_copy = *item_array;
+
+ for (LLInventoryModel::item_array_t::iterator iter = item_array_copy.begin(); iter != item_array_copy.end(); iter++)
+ {
+ LLInventoryItem* item = *iter;
+ if (!can_move_to_marketplace(item, error_msg, false))
+ {
+ return false;
+ }
+ }
+
+ LLInventoryModel::cat_array_t cat_array_copy = *cat_array;
+
+ for (LLInventoryModel::cat_array_t::iterator iter = cat_array_copy.begin(); iter != cat_array_copy.end(); iter++)
+ {
+ LLInventoryCategory* category = *iter;
+ if (!has_correct_permissions_for_sale(category, error_msg))
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
+// Returns true if inv_item can be dropped in dest_folder, a folder nested in marketplace listings (or merchant inventory) under the root_folder root
+// If returns is false, tooltip_msg contains an error message to display to the user (localized and all).
+// bundle_size is the amount of sibling items that are getting moved to the marketplace at the same time.
+bool can_move_item_to_marketplace(const LLInventoryCategory* root_folder, LLInventoryCategory* dest_folder, LLInventoryItem* inv_item, std::string& tooltip_msg, S32 bundle_size, bool from_paste)
+{
+ // Check stock folder type matches item type in marketplace listings or merchant outbox (even if of no use there for the moment)
+ LLViewerInventoryCategory* view_folder = dynamic_cast<LLViewerInventoryCategory*>(dest_folder);
+ bool move_in_stock = (view_folder && (view_folder->getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK));
+ bool accept = (view_folder && view_folder->acceptItem(inv_item));
+ if (!accept)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxMixedStock");
+ }
+
+ // Check that the item has the right type and permissions to be sold on the marketplace
+ if (accept)
+ {
+ accept = can_move_to_marketplace(inv_item, tooltip_msg, true);
+ }
+
+ // Check that the total amount of items won't violate the max limit on the marketplace
+ if (accept)
+ {
+ // If the dest folder is a stock folder, we do not count the incoming items toward the total (stock items are seen as one)
+ int existing_item_count = (move_in_stock ? 0 : bundle_size);
+
+ // If the dest folder is a stock folder, we do assume that the incoming items are also stock items (they should anyway)
+ int existing_stock_count = (move_in_stock ? bundle_size : 0);
+
+ int existing_folder_count = 0;
+
+ // Get the version folder: that's where the counts start from
+ const LLViewerInventoryCategory * version_folder = ((root_folder && (root_folder != dest_folder)) ? gInventory.getFirstDescendantOf(root_folder->getUUID(), dest_folder->getUUID()) : NULL);
+
+ if (version_folder)
+ {
+ if (!from_paste && gInventory.isObjectDescendentOf(inv_item->getUUID(), version_folder->getUUID()))
+ {
+ // Clear those counts or they will be counted twice because we're already inside the version category
+ existing_item_count = 0;
+ }
+
+ LLInventoryModel::cat_array_t existing_categories;
+ LLInventoryModel::item_array_t existing_items;
+
+ gInventory.collectDescendents(version_folder->getUUID(), existing_categories, existing_items, FALSE);
+
+ existing_item_count += count_copyable_items(existing_items) + count_stock_folders(existing_categories);
+ existing_stock_count += count_stock_items(existing_items);
+ existing_folder_count += existing_categories.size();
+
+ // If the incoming item is a nocopy (stock) item, we need to consider that it will create a stock folder
+ if (!inv_item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()) && !move_in_stock)
+ {
+ // Note : we do not assume that all incoming items are nocopy of different kinds...
+ existing_folder_count += 1;
+ }
+ }
+
+ if (existing_item_count > gSavedSettings.getU32("InventoryOutboxMaxItemCount"))
+ {
+ LLStringUtil::format_map_t args;
+ U32 amount = gSavedSettings.getU32("InventoryOutboxMaxItemCount");
+ args["[AMOUNT]"] = llformat("%d",amount);
+ tooltip_msg = LLTrans::getString("TooltipOutboxTooManyObjects", args);
+ accept = false;
+ }
+ else if (existing_stock_count > gSavedSettings.getU32("InventoryOutboxMaxStockItemCount"))
+ {
+ LLStringUtil::format_map_t args;
+ U32 amount = gSavedSettings.getU32("InventoryOutboxMaxStockItemCount");
+ args["[AMOUNT]"] = llformat("%d",amount);
+ tooltip_msg = LLTrans::getString("TooltipOutboxTooManyStockItems", args);
+ accept = false;
+ }
+ else if (existing_folder_count > gSavedSettings.getU32("InventoryOutboxMaxFolderCount"))
+ {
+ LLStringUtil::format_map_t args;
+ U32 amount = gSavedSettings.getU32("InventoryOutboxMaxFolderCount");
+ args["[AMOUNT]"] = llformat("%d",amount);
+ tooltip_msg = LLTrans::getString("TooltipOutboxTooManyFolders", args);
+ accept = false;
+ }
+ }
+
+ return accept;
+}
+
+// Returns true if inv_cat can be dropped in dest_folder, a folder nested in marketplace listings (or merchant inventory) under the root_folder root
+// If returns is false, tooltip_msg contains an error message to display to the user (localized and all).
+// bundle_size is the amount of sibling items that are getting moved to the marketplace at the same time.
+bool can_move_folder_to_marketplace(const LLInventoryCategory* root_folder, LLInventoryCategory* dest_folder, LLInventoryCategory* inv_cat, std::string& tooltip_msg, S32 bundle_size, bool check_items, bool from_paste)
+{
+ bool accept = true;
+
+ // Compute the nested folders level we'll add into with that incoming folder
+ int incoming_folder_depth = get_folder_levels(inv_cat);
+ // Compute the nested folders level we're inserting ourselves in
+ // Note: add 1 when inserting under a listing folder as we need to take the root listing folder in the count
+ int insertion_point_folder_depth = (root_folder ? get_folder_path_length(root_folder->getUUID(), dest_folder->getUUID()) + 1 : 0);
+
+ // Get the version folder: that's where the folders and items counts start from
+ const LLViewerInventoryCategory * version_folder = (insertion_point_folder_depth >= 2 ? gInventory.getFirstDescendantOf(root_folder->getUUID(), dest_folder->getUUID()) : NULL);
+
+ // Compare the whole with the nested folders depth limit
+ // Note: substract 2 as we leave root and version folder out of the count threshold
+ if ((incoming_folder_depth + insertion_point_folder_depth - 2) > (S32)(gSavedSettings.getU32("InventoryOutboxMaxFolderDepth")))
+ {
+ LLStringUtil::format_map_t args;
+ U32 amount = gSavedSettings.getU32("InventoryOutboxMaxFolderDepth");
+ args["[AMOUNT]"] = llformat("%d",amount);
+ tooltip_msg = LLTrans::getString("TooltipOutboxFolderLevels", args);
+ accept = false;
+ }
+
+ if (accept)
+ {
+ LLInventoryModel::cat_array_t descendent_categories;
+ LLInventoryModel::item_array_t descendent_items;
+ gInventory.collectDescendents(inv_cat->getUUID(), descendent_categories, descendent_items, FALSE);
+
+ int dragged_folder_count = descendent_categories.size() + bundle_size; // Note: We assume that we're moving a bunch of folders in. That might be wrong...
+ int dragged_item_count = count_copyable_items(descendent_items) + count_stock_folders(descendent_categories);
+ int dragged_stock_count = count_stock_items(descendent_items);
+ int existing_item_count = 0;
+ int existing_stock_count = 0;
+ int existing_folder_count = 0;
+
+ if (version_folder)
+ {
+ if (!from_paste && gInventory.isObjectDescendentOf(inv_cat->getUUID(), version_folder->getUUID()))
+ {
+ // Clear those counts or they will be counted twice because we're already inside the version category
+ dragged_folder_count = 0;
+ dragged_item_count = 0;
+ dragged_stock_count = 0;
+ }
+
+ // Tally the total number of categories and items inside the root folder
+ LLInventoryModel::cat_array_t existing_categories;
+ LLInventoryModel::item_array_t existing_items;
+ gInventory.collectDescendents(version_folder->getUUID(), existing_categories, existing_items, FALSE);
+
+ existing_folder_count += existing_categories.size();
+ existing_item_count += count_copyable_items(existing_items) + count_stock_folders(existing_categories);
+ existing_stock_count += count_stock_items(existing_items);
+ }
+
+ const int total_folder_count = existing_folder_count + dragged_folder_count;
+ const int total_item_count = existing_item_count + dragged_item_count;
+ const int total_stock_count = existing_stock_count + dragged_stock_count;
+
+ if (total_folder_count > gSavedSettings.getU32("InventoryOutboxMaxFolderCount"))
+ {
+ LLStringUtil::format_map_t args;
+ U32 amount = gSavedSettings.getU32("InventoryOutboxMaxFolderCount");
+ args["[AMOUNT]"] = llformat("%d",amount);
+ tooltip_msg = LLTrans::getString("TooltipOutboxTooManyFolders", args);
+ accept = false;
+ }
+ else if (total_item_count > gSavedSettings.getU32("InventoryOutboxMaxItemCount"))
+ {
+ LLStringUtil::format_map_t args;
+ U32 amount = gSavedSettings.getU32("InventoryOutboxMaxItemCount");
+ args["[AMOUNT]"] = llformat("%d",amount);
+ tooltip_msg = LLTrans::getString("TooltipOutboxTooManyObjects", args);
+ accept = false;
+ }
+ else if (total_stock_count > gSavedSettings.getU32("InventoryOutboxMaxStockItemCount"))
+ {
+ LLStringUtil::format_map_t args;
+ U32 amount = gSavedSettings.getU32("InventoryOutboxMaxStockItemCount");
+ args["[AMOUNT]"] = llformat("%d",amount);
+ tooltip_msg = LLTrans::getString("TooltipOutboxTooManyStockItems", args);
+ accept = false;
+ }
+
+ // Now check that each item in the folder can be moved in the marketplace
+ if (accept && check_items)
+ {
+ for (S32 i=0; i < descendent_items.size(); ++i)
+ {
+ LLInventoryItem* item = descendent_items[i];
+ if (!can_move_to_marketplace(item, tooltip_msg, false))
+ {
+ accept = false;
+ break;
+ }
+ }
+ }
+ }
+
+ return accept;
+}
+
+bool move_item_to_marketplacelistings(LLInventoryItem* inv_item, LLUUID dest_folder, bool copy)
+{
+ // Get the marketplace listings depth of the destination folder, exit with error if not under marketplace
+ S32 depth = depth_nesting_in_marketplace(dest_folder);
+ if (depth < 0)
+ {
+ LLSD subs;
+ subs["[ERROR_CODE]"] = LLTrans::getString("Marketplace Error Prefix") + LLTrans::getString("Marketplace Error Not Merchant");
+ LLNotificationsUtil::add("MerchantPasteFailed", subs);
+ return false;
+ }
+
+ // We will collapse links into items/folders
+ LLViewerInventoryItem * viewer_inv_item = (LLViewerInventoryItem *) inv_item;
+ LLViewerInventoryCategory * linked_category = viewer_inv_item->getLinkedCategory();
+
+ if (linked_category != NULL)
+ {
+ // Move the linked folder directly
+ return move_folder_to_marketplacelistings(linked_category, dest_folder, copy);
+ }
+ else
+ {
+ // Grab the linked item if any
+ LLViewerInventoryItem * linked_item = viewer_inv_item->getLinkedItem();
+ viewer_inv_item = (linked_item != NULL ? linked_item : viewer_inv_item);
+
+ // If we want to copy but the item is no copy, fail silently (this is a common case that doesn't warrant notification)
+ if (copy && !viewer_inv_item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()))
+ {
+ return false;
+ }
+
+ // Check that the agent has transfer permission on the item: this is required as a resident cannot
+ // put on sale items she cannot transfer. Proceed with move if we have permission.
+ std::string error_msg;
+ if (can_move_to_marketplace(inv_item, error_msg, true))
+ {
+ // When moving an isolated item, we might need to create the folder structure to support it
+ if (depth == 0)
+ {
+ // We need a listing folder
+ dest_folder = gInventory.createNewCategory(dest_folder, LLFolderType::FT_NONE, viewer_inv_item->getName());
+ depth++;
+ }
+ if (depth == 1)
+ {
+ // We need a version folder
+ dest_folder = gInventory.createNewCategory(dest_folder, LLFolderType::FT_NONE, viewer_inv_item->getName());
+ depth++;
+ }
+ LLViewerInventoryCategory* dest_cat = gInventory.getCategory(dest_folder);
+ if (!viewer_inv_item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()) &&
+ (dest_cat->getPreferredType() != LLFolderType::FT_MARKETPLACE_STOCK))
+ {
+ // We need to create a stock folder to move a no copy item
+ dest_folder = gInventory.createNewCategory(dest_folder, LLFolderType::FT_MARKETPLACE_STOCK, viewer_inv_item->getName());
+ dest_cat = gInventory.getCategory(dest_folder);
+ depth++;
+ }
+
+ // Verify we can have this item in that destination category
+ if (!dest_cat->acceptItem(viewer_inv_item))
+ {
+ LLSD subs;
+ subs["[ERROR_CODE]"] = LLTrans::getString("Marketplace Error Prefix") + LLTrans::getString("Marketplace Error Not Accepted");
+ LLNotificationsUtil::add("MerchantPasteFailed", subs);
+ return false;
+ }
+
+ // Get the parent folder of the moved item : we may have to update it
+ LLUUID src_folder = viewer_inv_item->getParentUUID();
+
+ if (copy)
+ {
+ // Copy the item
+ LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(update_folder_cb, dest_folder));
+ copy_inventory_item(
+ gAgent.getID(),
+ viewer_inv_item->getPermissions().getOwner(),
+ viewer_inv_item->getUUID(),
+ dest_folder,
+ std::string(),
+ cb);
+ }
+ else
+ {
+ // Reparent the item
+ gInventory.changeItemParent(viewer_inv_item, dest_folder, true);
+ }
+ }
+ else
+ {
+ LLSD subs;
+ subs["[ERROR_CODE]"] = LLTrans::getString("Marketplace Error Prefix") + error_msg;
+ LLNotificationsUtil::add("MerchantPasteFailed", subs);
+ return false;
+ }
+ }
+
+ open_marketplace_listings();
+ return true;
+}
+
+bool move_folder_to_marketplacelistings(LLInventoryCategory* inv_cat, const LLUUID& dest_folder, bool copy, bool move_no_copy_items)
+{
+ // Check that we have adequate permission on all items being moved. Proceed if we do.
+ std::string error_msg;
+ if (has_correct_permissions_for_sale(inv_cat, error_msg))
+ {
+ // Get the destination folder
+ LLViewerInventoryCategory* dest_cat = gInventory.getCategory(dest_folder);
+
+ // Check it's not a stock folder
+ if (dest_cat->getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK)
+ {
+ LLSD subs;
+ subs["[ERROR_CODE]"] = LLTrans::getString("Marketplace Error Prefix") + LLTrans::getString("Marketplace Error Not Accepted");
+ LLNotificationsUtil::add("MerchantPasteFailed", subs);
+ return false;
+ }
+
+ // Get the parent folder of the moved item : we may have to update it
+ LLUUID src_folder = inv_cat->getParentUUID();
+
+ LLViewerInventoryCategory * viewer_inv_cat = (LLViewerInventoryCategory *) inv_cat;
+ if (copy)
+ {
+ // Copy the folder
+ copy_inventory_category(&gInventory, viewer_inv_cat, dest_folder, LLUUID::null, move_no_copy_items);
+ }
+ else
+ {
+ // Reparent the folder
+ gInventory.changeCategoryParent(viewer_inv_cat, dest_folder, false);
+ // Check the destination folder recursively for no copy items and promote the including folders if any
+ validate_marketplacelistings(dest_cat);
+ }
+
+ // Update the modified folders
+ update_marketplace_category(src_folder);
+ update_marketplace_category(dest_folder);
+ gInventory.notifyObservers();
+ }
+ else
+ {
+ LLSD subs;
+ subs["[ERROR_CODE]"] = LLTrans::getString("Marketplace Error Prefix") + error_msg;
+ LLNotificationsUtil::add("MerchantPasteFailed", subs);
+ return false;
+ }
+
+ open_marketplace_listings();
+ return true;
+}
+
+bool sort_alpha(const LLViewerInventoryCategory* cat1, const LLViewerInventoryCategory* cat2)
+{
+ return cat1->getName().compare(cat2->getName()) < 0;
+}
+
+void dump_trace(std::string& message, S32 depth, LLError::ELevel log_level)
+{
+ LL_INFOS("SLM") << "validate_marketplacelistings : error = "<< log_level << ", depth = " << depth << ", message = " << message << LL_ENDL;
+}
+
+// Make all relevant business logic checks on the marketplace listings starting with the folder as argument.
+// This function does no deletion of listings but a mere audit and raises issues to the user (through the
+// optional callback cb). It also returns a boolean, true if things validate, false if issues are raised.
+// The only inventory changes that are done is to move and sort folders containing no-copy items to stock folders.
+bool validate_marketplacelistings(LLInventoryCategory* cat, validation_callback_t cb, bool fix_hierarchy, S32 depth)
+{
+#if 0
+ // Used only for debug
+ if (!cb)
+ {
+ cb = boost::bind(&dump_trace, _1, _2, _3);
+ }
+#endif
+ // Folder is valid unless issue is raised
+ bool result = true;
+
+ // Get the type and the depth of the folder
+ LLViewerInventoryCategory * viewer_cat = (LLViewerInventoryCategory *) (cat);
+ const LLFolderType::EType folder_type = cat->getPreferredType();
+ if (depth < 0)
+ {
+ // If the depth argument was not provided, evaluate the depth directly
+ depth = depth_nesting_in_marketplace(cat->getUUID());
+ }
+ if (depth < 0)
+ {
+ // If the folder is not under the marketplace listings root, we run validation as if it was a listing folder and prevent any hierarchy fix
+ // This allows the function to be used to pre-validate a folder anywhere in the inventory
+ depth = 1;
+ fix_hierarchy = false;
+ }
+
+ // Set the indentation for print output (typically, audit button in marketplace folder floater)
+ std::string indent;
+ for (int i = 1; i < depth; i++)
+ {
+ indent += " ";
+ }
+
+ // Check out that version folders are marketplace ready
+ if (depth == 2)
+ {
+ std::string message;
+ // Note: if we fix the hierarchy, we want to check the items individually, hence the last argument here
+ if (!can_move_folder_to_marketplace(cat, cat, cat, message, 0, fix_hierarchy))
+ {
+ result = false;
+ if (cb)
+ {
+ message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Error") + " " + message;
+ cb(message,depth,LLError::LEVEL_ERROR);
+ }
+ }
+ }
+
+ // Check out that stock folders are at the right level
+ if ((folder_type == LLFolderType::FT_MARKETPLACE_STOCK) && (depth <= 2))
+ {
+ if (fix_hierarchy)
+ {
+ if (cb)
+ {
+ std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Warning") + " " + LLTrans::getString("Marketplace Validation Warning Stock");
+ cb(message,depth,LLError::LEVEL_WARN);
+ }
+ // Nest the stock folder one level deeper in a normal folder and restart from there
+ LLUUID parent_uuid = cat->getParentUUID();
+ LLUUID folder_uuid = gInventory.createNewCategory(parent_uuid, LLFolderType::FT_NONE, cat->getName());
+ LLInventoryCategory* new_cat = gInventory.getCategory(folder_uuid);
+ gInventory.changeCategoryParent(viewer_cat, folder_uuid, false);
+ result &= validate_marketplacelistings(new_cat, cb, fix_hierarchy, depth + 1);
+ return result;
+ }
+ else
+ {
+ result = false;
+ if (cb)
+ {
+ std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Error") + " " + LLTrans::getString("Marketplace Validation Warning Stock");
+ cb(message,depth,LLError::LEVEL_ERROR);
+ }
+ }
+ }
+
+ // Item sorting and validation : sorting and moving the various stock items is complicated as the set of constraints is high
+ // We need to:
+ // * separate non stock items, stock items per types in different folders
+ // * have stock items nested at depth 2 at least
+ // * never ever move the non-stock items
+
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(cat->getUUID(),cat_array,item_array);
+
+ // We use a composite (type,permission) key on that map to store UUIDs of items of same (type,permissions)
+ std::map<U32, std::vector<LLUUID> > items_vector;
+
+ // Parse the items and create vectors of item UUIDs sorting copyable items and stock items of various types
+ bool has_bad_items = false;
+ LLInventoryModel::item_array_t item_array_copy = *item_array;
+ for (LLInventoryModel::item_array_t::iterator iter = item_array_copy.begin(); iter != item_array_copy.end(); iter++)
+ {
+ LLInventoryItem* item = *iter;
+ LLViewerInventoryItem * viewer_inv_item = (LLViewerInventoryItem *) item;
+
+ // Test but skip items that shouldn't be there to start with, raise an error message for those
+ std::string error_msg;
+ if (!can_move_to_marketplace(item, error_msg, false))
+ {
+ has_bad_items = true;
+ if (cb && fix_hierarchy)
+ {
+ std::string message = indent + viewer_inv_item->getName() + LLTrans::getString("Marketplace Validation Error") + " " + error_msg;
+ cb(message,depth,LLError::LEVEL_ERROR);
+ }
+ continue;
+ }
+ // Update the appropriate vector item for that type
+ LLInventoryType::EType type = LLInventoryType::IT_COUNT; // Default value for non stock items
+ U32 perms = 0;
+ if (!viewer_inv_item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()))
+ {
+ // Get the item type for stock items
+ type = viewer_inv_item->getInventoryType();
+ perms = viewer_inv_item->getPermissions().getMaskNextOwner();
+ }
+ U32 key = (((U32)(type) & 0xFF) << 24) | (perms & 0xFFFFFF);
+ items_vector[key].push_back(viewer_inv_item->getUUID());
+ }
+
+ // How many types of items? Which type is it if only one?
+ S32 count = items_vector.size();
+ U32 default_key = (U32)(LLInventoryType::IT_COUNT) << 24; // This is the key for any normal copyable item
+ U32 unique_key = (count == 1 ? items_vector.begin()->first : default_key); // The key in the case of one item type only
+
+ // If we have no items in there (only folders or empty), analyze a bit further
+ if ((count == 0) && !has_bad_items)
+ {
+ if (cat_array->size() == 0)
+ {
+ // So we have no item and no folder. That's at least a warning.
+ if (depth == 2)
+ {
+ // If this is an empty version folder, warn only (listing won't be delivered by AIS, but only AIS should unlist)
+ if (cb)
+ {
+ std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Error Empty Version");
+ cb(message,depth,LLError::LEVEL_WARN);
+ }
+ }
+ else if ((folder_type == LLFolderType::FT_MARKETPLACE_STOCK) && (depth > 2))
+ {
+ // If this is a legit but empty stock folder, warn only (listing must stay searchable when out of stock)
+ if (cb)
+ {
+ std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Error Empty Stock");
+ cb(message,depth,LLError::LEVEL_WARN);
+ }
+ }
+ else if (cb)
+ {
+ // We warn if there's nothing in a regular folder (may be it's an under construction listing)
+ std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Warning Empty");
+ cb(message,depth,LLError::LEVEL_WARN);
+ }
+ }
+ else
+ {
+ // Done with that folder : Print out the folder name unless we already found an error here
+ if (cb && result && (depth >= 1))
+ {
+ std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Log");
+ cb(message,depth,LLError::LEVEL_INFO);
+ }
+ }
+ }
+ // If we have a single type of items of the right type in the right place, we're done
+ else if ((count == 1) && !has_bad_items && (((unique_key == default_key) && (depth > 1)) || ((folder_type == LLFolderType::FT_MARKETPLACE_STOCK) && (depth > 2) && (cat_array->size() == 0))))
+ {
+ // Done with that folder : Print out the folder name unless we already found an error here
+ if (cb && result && (depth >= 1))
+ {
+ std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Log");
+ cb(message,depth,LLError::LEVEL_INFO);
+ }
+ }
+ else
+ {
+ if (fix_hierarchy && !has_bad_items)
+ {
+ // Alert the user when an existing stock folder has to be split
+ if ((folder_type == LLFolderType::FT_MARKETPLACE_STOCK) && ((count >= 2) || (cat_array->size() > 0)))
+ {
+ LLNotificationsUtil::add("AlertMerchantStockFolderSplit");
+ }
+ // If we have more than 1 type of items or we are at the listing level or we have stock/no stock type mismatch, wrap the items in subfolders
+ if ((count > 1) || (depth == 1) ||
+ ((folder_type == LLFolderType::FT_MARKETPLACE_STOCK) && (unique_key == default_key)) ||
+ ((folder_type != LLFolderType::FT_MARKETPLACE_STOCK) && (unique_key != default_key)))
+ {
+ // Create one folder per vector at the right depth and of the right type
+ std::map<U32, std::vector<LLUUID> >::iterator items_vector_it = items_vector.begin();
+ while (items_vector_it != items_vector.end())
+ {
+ // Create a new folder
+ LLUUID parent_uuid = (depth > 2 ? viewer_cat->getParentUUID() : viewer_cat->getUUID());
+ LLViewerInventoryItem* viewer_inv_item = gInventory.getItem(items_vector_it->second.back());
+ std::string folder_name = (depth >= 1 ? viewer_cat->getName() : viewer_inv_item->getName());
+ LLFolderType::EType new_folder_type = (items_vector_it->first == default_key ? LLFolderType::FT_NONE : LLFolderType::FT_MARKETPLACE_STOCK);
+ if (cb)
+ {
+ std::string message = "";
+ if (new_folder_type == LLFolderType::FT_MARKETPLACE_STOCK)
+ {
+ message = indent + folder_name + LLTrans::getString("Marketplace Validation Warning Create Stock");
+ }
+ else
+ {
+ message = indent + folder_name + LLTrans::getString("Marketplace Validation Warning Create Version");
+ }
+ cb(message,depth,LLError::LEVEL_WARN);
+ }
+ LLUUID folder_uuid = gInventory.createNewCategory(parent_uuid, new_folder_type, folder_name);
+
+ // Move each item to the new folder
+ while (!items_vector_it->second.empty())
+ {
+ LLViewerInventoryItem* viewer_inv_item = gInventory.getItem(items_vector_it->second.back());
+ if (cb)
+ {
+ std::string message = indent + viewer_inv_item->getName() + LLTrans::getString("Marketplace Validation Warning Move");
+ cb(message,depth,LLError::LEVEL_WARN);
+ }
+ gInventory.changeItemParent(viewer_inv_item, folder_uuid, true);
+ items_vector_it->second.pop_back();
+ }
+
+ // Next type
+ update_marketplace_category(parent_uuid);
+ update_marketplace_category(folder_uuid);
+ gInventory.notifyObservers();
+ items_vector_it++;
+ }
+ }
+ // Stock folder should have no sub folder so reparent those up
+ if (folder_type == LLFolderType::FT_MARKETPLACE_STOCK)
+ {
+ LLUUID parent_uuid = cat->getParentUUID();
+ gInventory.getDirectDescendentsOf(cat->getUUID(),cat_array,item_array);
+ LLInventoryModel::cat_array_t cat_array_copy = *cat_array;
+ for (LLInventoryModel::cat_array_t::iterator iter = cat_array_copy.begin(); iter != cat_array_copy.end(); iter++)
+ {
+ LLViewerInventoryCategory * viewer_cat = (LLViewerInventoryCategory *) (*iter);
+ gInventory.changeCategoryParent(viewer_cat, parent_uuid, false);
+ result &= validate_marketplacelistings(viewer_cat, cb, fix_hierarchy, depth);
+ }
+ }
+ }
+ else if (cb)
+ {
+ // We are not fixing the hierarchy but reporting problems, report everything we can find
+ // Print the folder name
+ if (result && (depth >= 1))
+ {
+ if ((folder_type == LLFolderType::FT_MARKETPLACE_STOCK) && (count >= 2))
+ {
+ // Report if a stock folder contains a mix of items
+ result = false;
+ std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Error Mixed Stock");
+ cb(message,depth,LLError::LEVEL_ERROR);
+ }
+ else if ((folder_type == LLFolderType::FT_MARKETPLACE_STOCK) && (cat_array->size() != 0))
+ {
+ // Report if a stock folder contains subfolders
+ result = false;
+ std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Error Subfolder In Stock");
+ cb(message,depth,LLError::LEVEL_ERROR);
+ }
+ else
+ {
+ // Simply print the folder name
+ std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Log");
+ cb(message,depth,LLError::LEVEL_INFO);
+ }
+ }
+ // Scan each item and report if there's a problem
+ LLInventoryModel::item_array_t item_array_copy = *item_array;
+ for (LLInventoryModel::item_array_t::iterator iter = item_array_copy.begin(); iter != item_array_copy.end(); iter++)
+ {
+ LLInventoryItem* item = *iter;
+ LLViewerInventoryItem * viewer_inv_item = (LLViewerInventoryItem *) item;
+ std::string error_msg;
+ if (!can_move_to_marketplace(item, error_msg, false))
+ {
+ // Report items that shouldn't be there to start with
+ result = false;
+ std::string message = indent + " " + viewer_inv_item->getName() + LLTrans::getString("Marketplace Validation Error") + " " + error_msg;
+ cb(message,depth,LLError::LEVEL_ERROR);
+ }
+ else if ((!viewer_inv_item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID())) && (folder_type != LLFolderType::FT_MARKETPLACE_STOCK))
+ {
+ // Report stock items that are misplaced
+ result = false;
+ std::string message = indent + " " + viewer_inv_item->getName() + LLTrans::getString("Marketplace Validation Error Stock Item");
+ cb(message,depth,LLError::LEVEL_ERROR);
+ }
+ else if (depth == 1)
+ {
+ // Report items not wrapped in version folder
+ result = false;
+ std::string message = indent + " " + viewer_inv_item->getName() + LLTrans::getString("Marketplace Validation Warning Unwrapped Item");
+ cb(message,depth,LLError::LEVEL_ERROR);
+ }
+ }
+ }
+
+ // Clean up
+ if (viewer_cat->getDescendentCount() == 0)
+ {
+ // Remove the current folder if it ends up empty
+ if (cb)
+ {
+ std::string message = indent + viewer_cat->getName() + LLTrans::getString("Marketplace Validation Warning Delete");
+ cb(message,depth,LLError::LEVEL_WARN);
+ }
+ gInventory.removeCategory(cat->getUUID());
+ gInventory.notifyObservers();
+ return result && !has_bad_items;
+ }
+ }
+
+ // Recursion : Perform the same validation on each nested folder
+ gInventory.getDirectDescendentsOf(cat->getUUID(),cat_array,item_array);
+ LLInventoryModel::cat_array_t cat_array_copy = *cat_array;
+ // Sort the folders in alphabetical order first
+ std::sort(cat_array_copy.begin(), cat_array_copy.end(), sort_alpha);
+
+ for (LLInventoryModel::cat_array_t::iterator iter = cat_array_copy.begin(); iter != cat_array_copy.end(); iter++)
+ {
+ LLInventoryCategory* category = *iter;
+ result &= validate_marketplacelistings(category, cb, fix_hierarchy, depth + 1);
+ }
+
+ update_marketplace_category(cat->getUUID());
+ gInventory.notifyObservers();
+ return result && !has_bad_items;
+}
+
+///----------------------------------------------------------------------------
/// LLInventoryCollectFunctor implementations
///----------------------------------------------------------------------------
@@ -1060,18 +2343,138 @@ void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder)
}
}
-void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root, const std::string& action)
+// Callback for doToSelected if DAMA required...
+void LLInventoryAction::callback_doToSelected(const LLSD& notification, const LLSD& response, class LLInventoryModel* model, class LLFolderView* root, const std::string& action)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0) // YES
+ {
+ doToSelected(model, root, action, FALSE);
+ }
+}
+
+void LLInventoryAction::callback_copySelected(const LLSD& notification, const LLSD& response, class LLInventoryModel* model, class LLFolderView* root, const std::string& action)
{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0) // YES, Move no copy item(s)
+ {
+ doToSelected(model, root, "copy_or_move_to_marketplace_listings", FALSE);
+ }
+ else if (option == 1) // NO, Don't move no copy item(s) (leave them behind)
+ {
+ doToSelected(model, root, "copy_to_marketplace_listings", FALSE);
+ }
+}
+
+// Succeeds iff all selected items are bridges to objects, in which
+// case returns their corresponding uuids.
+bool get_selection_object_uuids(LLFolderView *root, uuid_vec_t& ids)
+{
+ uuid_vec_t results;
+ S32 non_object = 0;
+ LLFolderView::selected_items_t selectedItems = root->getSelectedItems();
+ for(LLFolderView::selected_items_t::iterator it = selectedItems.begin(); it != selectedItems.end(); ++it)
+ {
+ LLObjectBridge *view_model = dynamic_cast<LLObjectBridge *>((*it)->getViewModelItem());
+
+ if(view_model && view_model->getUUID().notNull())
+ {
+ results.push_back(view_model->getUUID());
+ }
+ else
+ {
+ non_object++;
+ }
+ }
+ if (non_object == 0)
+ {
+ ids = results;
+ return true;
+ }
+ return false;
+}
+
+
+void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root, const std::string& action, BOOL user_confirm)
+{
+ std::set<LLFolderViewItem*> selected_items = root->getSelectionList();
+
+ // Prompt the user and check for authorization for some marketplace active listing edits
+ if (user_confirm && (("delete" == action) || ("cut" == action) || ("rename" == action) || ("properties" == action) || ("task_properties" == action) || ("open" == action)))
+ {
+ std::set<LLFolderViewItem*>::iterator set_iter = selected_items.begin();
+ LLFolderViewModelItemInventory * viewModel = NULL;
+ for (; set_iter != selected_items.end(); ++set_iter)
+ {
+ viewModel = dynamic_cast<LLFolderViewModelItemInventory *>((*set_iter)->getViewModelItem());
+ if (viewModel && (depth_nesting_in_marketplace(viewModel->getUUID()) >= 0))
+ {
+ break;
+ }
+ }
+ if (set_iter != selected_items.end())
+ {
+ if ("open" == action)
+ {
+ if (get_can_item_be_worn(viewModel->getUUID()))
+ {
+ // Wearing an object from any listing, active or not, is verbotten
+ LLNotificationsUtil::add("AlertMerchantListingCannotWear");
+ return;
+ }
+ // Note: we do not prompt for change when opening items (e.g. textures or note cards) on the marketplace...
+ }
+ else if (LLMarketplaceData::instance().isInActiveFolder(viewModel->getUUID()) ||
+ LLMarketplaceData::instance().isListedAndActive(viewModel->getUUID()))
+ {
+ // If item is in active listing, further confirmation is required
+ if ((("cut" == action) || ("delete" == action)) && (LLMarketplaceData::instance().isListed(viewModel->getUUID()) || LLMarketplaceData::instance().isVersionFolder(viewModel->getUUID())))
+ {
+ // Cut or delete of the active version folder or listing folder itself will unlist the listing so ask that question specifically
+ LLNotificationsUtil::add("ConfirmMerchantUnlist", LLSD(), LLSD(), boost::bind(&LLInventoryAction::callback_doToSelected, _1, _2, model, root, action));
+ return;
+ }
+ // Any other case will simply modify but not unlist a listing
+ LLNotificationsUtil::add("ConfirmMerchantActiveChange", LLSD(), LLSD(), boost::bind(&LLInventoryAction::callback_doToSelected, _1, _2, model, root, action));
+ return;
+ }
+ // Cutting or deleting a whole listing needs confirmation as SLM will be archived and inaccessible to the user
+ else if (LLMarketplaceData::instance().isListed(viewModel->getUUID()) && (("cut" == action) || ("delete" == action)))
+ {
+ LLNotificationsUtil::add("ConfirmListingCutOrDelete", LLSD(), LLSD(), boost::bind(&LLInventoryAction::callback_doToSelected, _1, _2, model, root, action));
+ return;
+ }
+ }
+ }
+ // Copying to the marketplace needs confirmation if nocopy items are involved
+ if (user_confirm && ("copy_to_marketplace_listings" == action))
+ {
+ std::set<LLFolderViewItem*>::iterator set_iter = selected_items.begin();
+ LLFolderViewModelItemInventory * viewModel = dynamic_cast<LLFolderViewModelItemInventory *>((*set_iter)->getViewModelItem());
+ if (contains_nocopy_items(viewModel->getUUID()))
+ {
+ LLNotificationsUtil::add("ConfirmCopyToMarketplace", LLSD(), LLSD(), boost::bind(&LLInventoryAction::callback_copySelected, _1, _2, model, root, action));
+ return;
+ }
+ }
+
+ // Keep track of the marketplace folders that will need update of their status/name after the operation is performed
+ buildMarketplaceFolders(root);
+
if ("rename" == action)
{
root->startRenamingSelectedItem();
+ // Update the marketplace listings that have been affected by the operation
+ updateMarketplaceFolders();
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));
+ LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&LLInventoryAction::onItemsRemovalConfirmation, _1, _2, root->getHandle()));
+ // Note: marketplace listings will be updated in the callback if delete confirmed
return;
}
if (("copy" == action) || ("cut" == action))
@@ -1089,12 +2492,12 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
LLViewerInventoryCategory *cat = model->getCategory(inventory_item->getUUID());
if (!cat) return;
cat->changeType(new_folder_type);
+ // Update the marketplace listings that have been affected by the operation
+ updateMarketplaceFolders();
return;
}
- std::set<LLFolderViewItem*> selected_items = root->getSelectionList();
-
LLMultiPreview* multi_previewp = NULL;
LLMultiProperties* multi_propertiesp = NULL;
@@ -1114,17 +2517,38 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
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);
- }
+ std::set<LLUUID> selected_uuid_set = LLAvatarActions::getInventorySelectedUUIDs();
+ uuid_vec_t ids;
+ std::copy(selected_uuid_set.begin(), selected_uuid_set.end(), std::back_inserter(ids));
+ // Check for actions that get handled in bulk
+ if (action == "wear")
+ {
+ wear_multiple(ids, true);
+ }
+ else if (action == "wear_add")
+ {
+ wear_multiple(ids, false);
+ }
+ else if (isRemoveAction(action))
+ {
+ LLAppearanceMgr::instance().removeItemsFromAvatar(ids);
+ }
+ else
+ {
+ 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);
+ }
+ }
+ // Update the marketplace listings that have been affected by the operation
+ updateMarketplaceFolders();
+
LLFloater::setFloaterHost(NULL);
if (multi_previewp)
{
@@ -1159,14 +2583,71 @@ void LLInventoryAction::removeItemFromDND(LLFolderView* root)
}
}
-void LLInventoryAction::onItemsRemovalConfirmation( const LLSD& notification, const LLSD& response, LLFolderView* root )
+void LLInventoryAction::onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLHandle<LLFolderView> root)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if (option == 0)
+ if (option == 0 && !root.isDead() && !root.get()->isDead())
{
- //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();
+ LLFolderView* folder_root = root.get();
+ //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(folder_root);
+ folder_root->removeSelectedItems();
+
+ // Update the marketplace listings that have been affected by the operation
+ updateMarketplaceFolders();
}
}
+
+void LLInventoryAction::buildMarketplaceFolders(LLFolderView* root)
+{
+ // Make a list of all marketplace folders containing the elements in the selected list
+ // as well as the elements themselves.
+ // Once those elements are updated (cut, delete in particular but potentially any action), their
+ // containing folder will need to be updated as well as their initially containing folder. For
+ // instance, moving a stock folder from a listed folder to another will require an update of the
+ // target listing *and* the original listing. So we need to keep track of both.
+ // Note: do not however put the marketplace listings root itself in this list or the whole marketplace data will be rebuilt.
+ sMarketplaceFolders.clear();
+ const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ if (marketplacelistings_id.isNull())
+ {
+ return;
+ }
+
+ std::set<LLFolderViewItem*> selected_items = root->getSelectionList();
+ std::set<LLFolderViewItem*>::iterator set_iter = selected_items.begin();
+ LLFolderViewModelItemInventory * viewModel = NULL;
+ for (; set_iter != selected_items.end(); ++set_iter)
+ {
+ viewModel = dynamic_cast<LLFolderViewModelItemInventory *>((*set_iter)->getViewModelItem());
+ if (!viewModel || !viewModel->getInventoryObject()) continue;
+ if (gInventory.isObjectDescendentOf(viewModel->getInventoryObject()->getParentUUID(), marketplacelistings_id))
+ {
+ const LLUUID &parent_id = viewModel->getInventoryObject()->getParentUUID();
+ if (parent_id != marketplacelistings_id)
+ {
+ sMarketplaceFolders.push_back(parent_id);
+ }
+ const LLUUID &curr_id = viewModel->getInventoryObject()->getUUID();
+ if (curr_id != marketplacelistings_id)
+ {
+ sMarketplaceFolders.push_back(curr_id);
+ }
+ }
+ }
+ // Suppress dupes in the list so we won't update listings twice
+ sMarketplaceFolders.sort();
+ sMarketplaceFolders.unique();
+}
+
+void LLInventoryAction::updateMarketplaceFolders()
+{
+ while (!sMarketplaceFolders.empty())
+ {
+ update_marketplace_category(sMarketplaceFolders.back());
+ sMarketplaceFolders.pop_back();
+ }
+}
+
+
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index 6b3861aa79..b93bf9a163 100755
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -30,8 +30,13 @@
#include "llinventorymodel.h"
#include "llinventory.h"
+#include "llhandle.h"
#include "llwearabletype.h"
+// compute_stock_count() return error code
+const S32 COMPUTE_STOCK_INFINITE = -1;
+const S32 COMPUTE_STOCK_NOT_EVALUATED = -2;
+
/********************************************************************************
** **
** MISCELLANEOUS GLOBAL FUNCTIONS
@@ -58,18 +63,33 @@ void show_task_item_profile(const LLUUID& item_uuid, const LLUUID& object_id);
void show_item_original(const LLUUID& item_uuid);
void reset_inventory_filter();
+// Nudge the listing categories in the inventory to signal that their marketplace status changed
+void update_marketplace_category(const LLUUID& cat_id, bool perform_consistency_enforcement = true);
+// Nudge all listing categories to signal that their marketplace status changed
+void update_all_marketplace_count();
+
void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::string& new_name);
-void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id = LLUUID::null);
+void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id = LLUUID::null, bool move_no_copy_items = false);
// Generates a string containing the path to the item specified by item_id.
void append_path(const LLUUID& id, std::string& path);
void copy_item_to_outbox(LLInventoryItem* inv_item, LLUUID dest_folder, const LLUUID& top_level_folder, S32 operation_id);
void move_item_within_outbox(LLInventoryItem* inv_item, LLUUID dest_folder, S32 operation_id);
-
void copy_folder_to_outbox(LLInventoryCategory* inv_cat, const LLUUID& dest_folder, const LLUUID& top_level_folder, S32 operation_id);
+typedef boost::function<void(std::string& validation_message, S32 depth, LLError::ELevel log_level)> validation_callback_t;
+
+bool can_move_item_to_marketplace(const LLInventoryCategory* root_folder, LLInventoryCategory* dest_folder, LLInventoryItem* inv_item, std::string& tooltip_msg, S32 bundle_size = 1, bool from_paste = false);
+bool can_move_folder_to_marketplace(const LLInventoryCategory* root_folder, LLInventoryCategory* dest_folder, LLInventoryCategory* inv_cat, std::string& tooltip_msg, S32 bundle_size = 1, bool check_items = true, bool from_paste = false);
+bool move_item_to_marketplacelistings(LLInventoryItem* inv_item, LLUUID dest_folder, bool copy = false);
+bool move_folder_to_marketplacelistings(LLInventoryCategory* inv_cat, const LLUUID& dest_folder, bool copy = false, bool move_no_copy_items = false);
+bool validate_marketplacelistings(LLInventoryCategory* inv_cat, validation_callback_t cb = NULL, bool fix_hierarchy = true, S32 depth = -1);
+S32 depth_nesting_in_marketplace(LLUUID cur_uuid);
+LLUUID nested_parent_id(LLUUID cur_uuid, S32 depth);
+S32 compute_stock_count(LLUUID cat_uuid, bool force_count = false);
+
/** Miscellaneous global functions
** **
*******************************************************************************/
@@ -425,7 +445,8 @@ public:
*******************************************************************************/
class LLFolderViewItem;
class LLFolderViewFolder;
-
+class LLInventoryModel;
+class LLFolderView;
class LLInventoryState
{
@@ -437,10 +458,16 @@ public:
struct LLInventoryAction
{
- static void doToSelected(class LLInventoryModel* model, class LLFolderView* root, const std::string& action);
+ static void doToSelected(LLInventoryModel* model, LLFolderView* root, const std::string& action, BOOL user_confirm = TRUE);
+ static void callback_doToSelected(const LLSD& notification, const LLSD& response, class LLInventoryModel* model, class LLFolderView* root, const std::string& action);
+ static void callback_copySelected(const LLSD& notification, const LLSD& response, class LLInventoryModel* model, class LLFolderView* root, const std::string& action);
+ static void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLHandle<LLFolderView> root);
+ static void removeItemFromDND(LLFolderView* root);
- static void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLFolderView* root);
- static void removeItemFromDND(LLFolderView* root);
+private:
+ static void buildMarketplaceFolders(LLFolderView* root);
+ static void updateMarketplaceFolders();
+ static std::list<LLUUID> sMarketplaceFolders; // Marketplace folders that will need update once the action is completed
};
diff --git a/indra/newview/llinventoryicon.cpp b/indra/newview/llinventoryicon.cpp
index b7c4ec6f8b..013a5a7629 100755
--- a/indra/newview/llinventoryicon.cpp
+++ b/indra/newview/llinventoryicon.cpp
@@ -183,6 +183,6 @@ const std::string& LLInventoryIcon::getIconName(LLInventoryType::EIconName idx)
LLInventoryType::EIconName LLInventoryIcon::assignWearableIcon(U32 misc_flag)
{
- const LLWearableType::EType wearable_type = LLWearableType::EType(LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK & misc_flag);
+ const LLWearableType::EType wearable_type = LLWearableType::inventoryFlagsToWearableType(misc_flag);
return LLWearableType::getIconName(wearable_type);
}
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index f92332dea5..0bad4702e0 100755
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -41,6 +41,7 @@
#include "llinventoryobserver.h"
#include "llinventorypanel.h"
#include "llnotificationsutil.h"
+#include "llmarketplacefunctions.h"
#include "llwindow.h"
#include "llviewercontrol.h"
#include "llpreview.h"
@@ -1023,7 +1024,7 @@ LLInventoryModel::item_array_t* LLInventoryModel::getUnlockedItemArray(const LLU
// an existing item with the matching id, or it will add the category.
void LLInventoryModel::updateCategory(const LLViewerInventoryCategory* cat, U32 mask)
{
- if(cat->getUUID().isNull())
+ if(!cat || cat->getUUID().isNull())
{
return;
}
@@ -1037,7 +1038,8 @@ void LLInventoryModel::updateCategory(const LLViewerInventoryCategory* cat, U32
LLPointer<LLViewerInventoryCategory> old_cat = getCategory(cat->getUUID());
if(old_cat)
{
- // We already have an old category, modify it's values
+ // We already have an old category, modify its values
+ U32 mask = LLInventoryObserver::NONE;
LLUUID old_parent_id = old_cat->getParentUUID();
LLUUID new_parent_id = cat->getParentUUID();
if(old_parent_id != new_parent_id)
@@ -1061,7 +1063,13 @@ void LLInventoryModel::updateCategory(const LLViewerInventoryCategory* cat, U32
{
mask |= LLInventoryObserver::LABEL;
}
- old_cat->copyViewerCategory(cat);
+ // Under marketplace, category labels are quite complex and need extra upate
+ const LLUUID marketplace_id = findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ if (marketplace_id.notNull() && isObjectDescendentOf(cat->getUUID(), marketplace_id))
+ {
+ mask |= LLInventoryObserver::LABEL;
+ }
+ old_cat->copyViewerCategory(cat);
addChangedMask(mask, cat->getUUID());
}
else
@@ -1411,6 +1419,11 @@ void LLInventoryModel::deleteObject(const LLUUID& id, bool fix_broken_links, boo
LLPointer<LLViewerInventoryCategory> cat = (LLViewerInventoryCategory*)((LLInventoryObject*)obj);
vector_replace_with_last(*cat_list, cat);
}
+
+ // Note : We need to tell the inventory observers that those things are going to be deleted *before* the tree is cleared or they won't know what to delete (in views and view models)
+ addChangedMask(LLInventoryObserver::REMOVE, id);
+ gInventory.notifyObservers();
+
item_list = getUnlockedItemArray(id);
if(item_list)
{
@@ -1558,10 +1571,11 @@ void LLInventoryModel::addChangedMask(U32 mask, const LLUUID& referent)
}
}
- mModifyMask |= mask;
- if (referent.notNull())
+ mModifyMask |= mask;
+ if (referent.notNull() && (mChangedItemIDs.find(referent) == mChangedItemIDs.end()))
{
mChangedItemIDs.insert(referent);
+ update_marketplace_category(referent, false);
if (mask & LLInventoryObserver::ADD)
{
@@ -1981,17 +1995,22 @@ bool LLInventoryModel::loadSkeleton(
// we can safely ignore anything loaded from file, but
// not sent down in the skeleton. Must have been removed from inventory.
- if(cit == not_cached)
+ if (cit == not_cached)
{
continue;
}
- if(cat->getVersion() != tcat->getVersion())
+ else if (cat->getVersion() != tcat->getVersion())
{
// if the cached version does not match the server version,
// throw away the version we have so we can fetch the
// correct contents the next time the viewer opens the folder.
tcat->setVersion(NO_VERSION);
}
+ else if (tcat->getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK)
+ {
+ // Do not trust stock folders being updated
+ tcat->setVersion(NO_VERSION);
+ }
else
{
cached_ids.insert(tcat->getUUID());
@@ -3046,7 +3065,18 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
LL_DEBUGS("Inventory") << "unpacked folder '" << tfolder->getName() << "' ("
<< tfolder->getUUID() << ") in " << tfolder->getParentUUID()
<< LL_ENDL;
- if(tfolder->getUUID().notNull())
+
+ // If the folder is a listing or a version folder, all we need to do is update the SLM data
+ int depth_folder = depth_nesting_in_marketplace(tfolder->getUUID());
+ if ((depth_folder == 1) || (depth_folder == 2))
+ {
+ // Trigger an SLM listing update
+ LLUUID listing_uuid = (depth_folder == 1 ? tfolder->getUUID() : tfolder->getParentUUID());
+ S32 listing_id = LLMarketplaceData::instance().getListingID(listing_uuid);
+ LLMarketplaceData::instance().getListing(listing_id);
+ // In that case, there is no item to update so no callback -> we skip the rest of the update
+ }
+ else if(tfolder->getUUID().notNull())
{
folders.push_back(tfolder);
LLViewerInventoryCategory* folderp = gInventory.getCategory(tfolder->getUUID());
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 3546317471..5194cba891 100755
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -146,7 +146,8 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
mShowEmptyMessage(p.show_empty_message),
mViewsInitialized(false),
mInvFVBridgeBuilder(NULL),
- mInventoryViewModel(p.name)
+ mInventoryViewModel(p.name),
+ mGroupedItemBridge(new LLFolderViewGroupedItemBridge)
{
mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER;
@@ -186,11 +187,13 @@ LLFolderView * LLInventoryPanel::createFolderRoot(LLUUID root_id )
NULL,
root_id);
p.view_model = &mInventoryViewModel;
+ p.grouped_item_model = mGroupedItemBridge;
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.allow_drop = mParams.allow_drop_on_root;
p.options_menu = "menu_inventory.xml";
return LLUICtrlFactory::create<LLFolderView>(p);
@@ -290,7 +293,12 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_INBOX));
getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_OUTBOX));
}
-
+ // hide marketplace listing box, unless we are a marketplace panel
+ if (!gSavedSettings.getBOOL("InventoryOutboxMakeVisible") && !mParams.use_marketplace_folders)
+ {
+ getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_MARKETPLACE_LISTINGS));
+ }
+
// set the filter for the empty folder if the debug setting is on
if (gSavedSettings.getBOOL("DebugHideEmptySystemFolders"))
{
@@ -599,13 +607,13 @@ void LLInventoryPanel::modelChanged(U32 mask)
LLUUID LLInventoryPanel::getRootFolderID()
{
+ LLUUID root_id;
if (mFolderRoot.get() && mFolderRoot.get()->getViewModelItem())
{
- return static_cast<LLFolderViewModelItemInventory*>(mFolderRoot.get()->getViewModelItem())->getUUID();
+ root_id = static_cast<LLFolderViewModelItemInventory*>(mFolderRoot.get()->getViewModelItem())->getUUID();
}
else
{
- LLUUID root_id;
if (mParams.start_folder.id.isChosen())
{
root_id = mParams.start_folder.id;
@@ -633,8 +641,8 @@ LLUUID LLInventoryPanel::getRootFolderID()
}
}
}
- return root_id;
}
+ return root_id;
}
// static
@@ -756,7 +764,7 @@ void LLInventoryPanel::initializeViews()
}
-LLFolderViewFolder * LLInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge)
+LLFolderViewFolder * LLInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge, bool allow_drop)
{
LLFolderViewFolder::Params params(mParams.folder);
@@ -764,6 +772,7 @@ LLFolderViewFolder * LLInventoryPanel::createFolderViewFolder(LLInvFVBridge * br
params.root = mFolderRoot.get();
params.listener = bridge;
params.tool_tip = params.name;
+ params.allow_drop = allow_drop;
params.font_color = (bridge->isLibraryItem() ? sLibraryColor : (bridge->isLink() ? sLinkColor : sDefaultColor));
params.font_highlight_color = (bridge->isLibraryItem() ? sLibraryColor : (bridge->isLink() ? sLinkColor : sDefaultHighlightColor));
@@ -792,37 +801,56 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
{
LLInventoryObject const* objectp = gInventory.getObject(id);
- if (!objectp) return NULL;
+ if (!objectp)
+ {
+ return NULL;
+ }
LLFolderViewItem* folder_view_item = getItemByID(id);
- const LLUUID &parent_id = objectp->getParentUUID();
+ const LLUUID &parent_id = objectp->getParentUUID();
LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)getItemByID(parent_id);
+ // Force the creation of an extra root level folder item if required by the inventory panel (default is "false")
+ bool allow_drop = true;
+ bool create_root = false;
+ if (mParams.show_root_folder)
+ {
+ LLUUID root_id = getRootFolderID();
+ if (root_id == id)
+ {
+ // We insert an extra level that's seen by the UI but has no influence on the model
+ parent_folder = dynamic_cast<LLFolderViewFolder*>(folder_view_item);
+ folder_view_item = NULL;
+ allow_drop = mParams.allow_drop_on_root;
+ create_root = true;
+ }
+ }
+
if (!folder_view_item && parent_folder)
{
if (objectp->getType() <= LLAssetType::AT_NONE ||
objectp->getType() >= LLAssetType::AT_COUNT)
{
LL_WARNS() << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : "
- << ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID()
- << LL_ENDL;
+ << ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID()
+ << LL_ENDL;
return NULL;
}
if ((objectp->getType() == LLAssetType::AT_CATEGORY) &&
(objectp->getActualType() != LLAssetType::AT_LINK_FOLDER))
{
- LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(),
- objectp->getType(),
+ LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_CATEGORY,
+ (mParams.use_marketplace_folders ? LLAssetType::AT_MARKETPLACE_FOLDER : LLAssetType::AT_CATEGORY),
LLInventoryType::IT_CATEGORY,
this,
- &mInventoryViewModel,
+ &mInventoryViewModel,
mFolderRoot.get(),
objectp->getUUID());
if (new_listener)
{
- folder_view_item = createFolderViewFolder(new_listener);
+ folder_view_item = createFolderViewFolder(new_listener,allow_drop);
}
}
else
@@ -845,11 +873,16 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
}
if (folder_view_item)
- {
+ {
llassert(parent_folder != NULL);
folder_view_item->addToFolder(parent_folder);
addItemID(id, folder_view_item);
- }
+ // In the case of the root folder been shown, open that folder by default once the widget is created
+ if (create_root)
+ {
+ folder_view_item->setOpen(TRUE);
+ }
+ }
}
// If this is a folder, add the children of the folder and recursively add any
@@ -958,7 +991,7 @@ BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
// If folder view is empty the (x, y) point won't be in its rect
// so the handler must be called explicitly.
// but only if was not handled before. See EXT-6746.
- if (!handled && !mFolderRoot.get()->hasVisibleChildren())
+ if (!handled && mParams.allow_drop_on_root && !mFolderRoot.get()->hasVisibleChildren())
{
handled = mFolderRoot.get()->handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
}
@@ -1480,6 +1513,8 @@ public:
LLInventoryPanel::initFromParams(p);
// turn on inbox for recent items
getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() | (1ULL << LLFolderType::FT_INBOX));
+ // turn off marketplace for recent items
+ getFilter().setFilterNoMarketplaceFolder();
}
protected:
@@ -1523,5 +1558,8 @@ namespace LLInitParam
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);
+ declare(LLFolderType::lookup(LLFolderType::FT_MARKETPLACE_LISTINGS) , LLFolderType::FT_MARKETPLACE_LISTINGS);
+ declare(LLFolderType::lookup(LLFolderType::FT_MARKETPLACE_STOCK), LLFolderType::FT_MARKETPLACE_STOCK);
+ declare(LLFolderType::lookup(LLFolderType::FT_MARKETPLACE_VERSION), LLFolderType::FT_MARKETPLACE_VERSION);
}
}
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index a490dfce5d..b69edd8b93 100755
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -43,6 +43,7 @@ class LLInvFVBridge;
class LLInventoryFolderViewModelBuilder;
class LLInvPanelComplObserver;
class LLFolderViewModelInventory;
+class LLFolderViewGroupedItemBridge;
namespace LLInitParam
{
@@ -96,6 +97,9 @@ public:
Optional<StartFolder> start_folder;
Optional<bool> use_label_suffix;
Optional<bool> show_empty_message;
+ Optional<bool> show_root_folder;
+ Optional<bool> allow_drop_on_root;
+ Optional<bool> use_marketplace_folders;
Optional<LLScrollContainer::Params> scroll;
Optional<bool> accepts_drag_and_drop;
Optional<LLFolderView::Params> folder_view;
@@ -110,7 +114,10 @@ public:
filter("filter"),
start_folder("start_folder"),
use_label_suffix("use_label_suffix", true),
- show_empty_message("show_empty_message", true),
+ show_empty_message("show_empty_message", true),
+ show_root_folder("show_root_folder", false),
+ allow_drop_on_root("allow_drop_on_root", true),
+ use_marketplace_folders("use_marketplace_folders", false),
scroll("scroll"),
accepts_drag_and_drop("accepts_drag_and_drop"),
folder_view("folder_view"),
@@ -184,6 +191,7 @@ public:
LLFolderView* getRootFolder() { return mFolderRoot.get(); }
LLUUID getRootFolderID();
LLScrollContainer* getScrollableContainer() { return mScroller; }
+ bool getAllowDropOnRoot() { return mParams.allow_drop_on_root; }
void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
@@ -240,6 +248,7 @@ protected:
LLScrollContainer* mScroller;
LLFolderViewModelInventory mInventoryViewModel;
+ LLPointer<LLFolderViewGroupedItemBridge> mGroupedItemBridge;
Params mParams; // stored copy of parameter block
std::map<LLUUID, LLFolderViewItem*> mItemMap;
@@ -291,7 +300,7 @@ protected:
BOOL getIsHiddenFolderType(LLFolderType::EType folder_type) const;
virtual LLFolderView * createFolderRoot(LLUUID root_id );
- virtual LLFolderViewFolder* createFolderViewFolder(LLInvFVBridge * bridge);
+ virtual LLFolderViewFolder* createFolderViewFolder(LLInvFVBridge * bridge, bool allow_drop);
virtual LLFolderViewItem* createFolderViewItem(LLInvFVBridge * bridge);
private:
bool mBuildDefaultHierarchy; // default inventory hierarchy should be created in postBuild()
diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp
index 8fb7550169..46c1ffa789 100755
--- a/indra/newview/lllocalbitmaps.cpp
+++ b/indra/newview/lllocalbitmaps.cpp
@@ -128,7 +128,7 @@ LLLocalBitmap::LLLocalBitmap(std::string filename)
LLLocalBitmap::~LLLocalBitmap()
{
// replace IDs with defaults, if set to do so.
- if(LL_LOCAL_REPLACE_ON_DEL && mValid) // fix for STORM-1837
+ if(LL_LOCAL_REPLACE_ON_DEL && mValid && gAgentAvatarp) // fix for STORM-1837
{
replaceIDs(mWorldID, IMG_DEFAULT);
LLLocalBitmapMgr::doRebake();
@@ -515,7 +515,7 @@ void LLLocalBitmap::updateUserSculpts(LLUUID old_id, LLUUID new_id)
{
LLSculptParams* old_params = (LLSculptParams*)object->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
LLSculptParams new_params(*old_params);
- new_params.setSculptTexture(new_id);
+ new_params.setSculptTexture(new_id, (*old_params).getSculptType());
object->setParameterEntry(LLNetworkData::PARAMS_SCULPT, new_params, TRUE);
}
}
@@ -545,12 +545,14 @@ void LLLocalBitmap::updateUserLayers(LLUUID old_id, LLUUID new_id, LLWearableTyp
LLAvatarAppearanceDefines::ETextureIndex reg_texind = getTexIndex(type, baked_texind);
if (reg_texind != LLAvatarAppearanceDefines::TEX_NUM_INDICES)
{
- U32 index = gAgentWearables.getWearableIndex(wearable);
- gAgentAvatarp->setLocalTexture(reg_texind, gTextureList.getImage(new_id), FALSE, index);
- gAgentAvatarp->wearableUpdated(type);
-
- /* telling the manager to rebake once update cycle is fully done */
- LLLocalBitmapMgr::setNeedsRebake();
+ U32 index;
+ if (gAgentWearables.getWearableIndex(wearable,index))
+ {
+ gAgentAvatarp->setLocalTexture(reg_texind, gTextureList.getImage(new_id), FALSE, index);
+ gAgentAvatarp->wearableUpdated(type);
+ /* telling the manager to rebake once update cycle is fully done */
+ LLLocalBitmapMgr::setNeedsRebake();
+ }
}
}
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 7ddacf3033..4116e38f11 100755
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -804,6 +804,22 @@ bool LLLogChat::isNearbyTranscriptExist()
return false;
}
+bool LLLogChat::isAdHocTranscriptExist(std::string file_name)
+{
+ std::vector<std::string> list_of_transcriptions;
+ LLLogChat::getListOfTranscriptFiles(list_of_transcriptions);
+
+ file_name = makeLogFileName(file_name);
+ BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions)
+ {
+ if (transcript_file_name == file_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 written like "Object <actual_object's_name>"
diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h
index ca597599dd..6022e539a9 100755
--- a/indra/newview/lllogchat.h
+++ b/indra/newview/lllogchat.h
@@ -120,6 +120,7 @@ public:
static void deleteTranscripts();
static bool isTranscriptExist(const LLUUID& avatar_id, bool is_group=false);
static bool isNearbyTranscriptExist();
+ static bool isAdHocTranscriptExist(std::string file_name);
static bool historyThreadsFinished(LLUUID session_id);
static LLLoadHistoryThread* getLoadHistoryThread(LLUUID session_id);
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index 407613d32c..85faa70552 100755
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -1677,12 +1677,12 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
F32 alpha = (1.f - (1.f * ((F32)llabs(i) / (F32)num_ticks_per_side1)));
LLVector3 tick_pos = mScaleCenter + (mScaleDir * (grid_multiple1 + i) * smallest_subdivision1);
- F32 cur_subdivisions = llclamp(getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit1, mTickPixelSpacing1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
-
- if (fmodf((F32)(i + sub_div_offset_1), (sGridMaxSubdivisionLevel / cur_subdivisions)) != 0.f)
+ //No need check this condition to prevent tick position scaling (FIX MAINT-5207/5208)
+ //F32 cur_subdivisions = llclamp(getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit1, mTickPixelSpacing1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
+ /*if (fmodf((F32)(i + sub_div_offset_1), (sGridMaxSubdivisionLevel / cur_subdivisions)) != 0.f)
{
continue;
- }
+ }*/
F32 tick_scale = 1.f;
for (F32 division_level = sGridMaxSubdivisionLevel; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f)
@@ -1710,12 +1710,12 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
F32 alpha = (1.f - (1.f * ((F32)llabs(i) / (F32)num_ticks_per_side2)));
LLVector3 tick_pos = mScaleCenter + (mScaleDir * (grid_multiple2 + i) * smallest_subdivision2);
- F32 cur_subdivisions = llclamp(getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit2, mTickPixelSpacing2), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
-
- if (fmodf((F32)(i + sub_div_offset_2), (sGridMaxSubdivisionLevel / cur_subdivisions)) != 0.f)
+ //No need check this condition to prevent tick position scaling (FIX MAINT-5207/5208)
+ //F32 cur_subdivisions = llclamp(getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit2, mTickPixelSpacing2), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
+ /*if (fmodf((F32)(i + sub_div_offset_2), (sGridMaxSubdivisionLevel / cur_subdivisions)) != 0.f)
{
continue;
- }
+ }*/
F32 tick_scale = 1.f;
for (F32 division_level = sGridMaxSubdivisionLevel; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f)
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index 394db71fb9..b4259a456c 100755
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -1285,12 +1285,12 @@ void LLManipTranslate::renderSnapGuides()
{
tick_start = selection_center + (translate_axis * (smallest_grid_unit_scale * (F32)i - offset_nearest_grid_unit));
- F32 cur_subdivisions = getSubdivisionLevel(tick_start, translate_axis, getMinGridScale());
-
- if (fmodf((F32)(i + sub_div_offset), (max_subdivisions / cur_subdivisions)) != 0.f)
+ //No need check this condition to prevent tick position scaling (FIX MAINT-5207/5208)
+ //F32 cur_subdivisions = getSubdivisionLevel(tick_start, translate_axis, getMinGridScale());
+ /*if (fmodf((F32)(i + sub_div_offset), (max_subdivisions / cur_subdivisions)) != 0.f)
{
continue;
- }
+ }*/
// add in off-axis offset
tick_start += (mSnapOffsetAxis * mSnapOffsetMeters);
diff --git a/indra/newview/llmarketplacefunctions.cpp b/indra/newview/llmarketplacefunctions.cpp
index 4a7a4e268d..d5bfe1df4a 100755
--- a/indra/newview/llmarketplacefunctions.cpp
+++ b/indra/newview/llmarketplacefunctions.cpp
@@ -29,14 +29,22 @@
#include "llmarketplacefunctions.h"
#include "llagent.h"
+#include "llbufferstream.h"
#include "llhttpclient.h"
+#include "llinventoryfunctions.h"
+#include "llinventoryobserver.h"
+#include "llnotificationsutil.h"
#include "llsdserialize.h"
#include "lltimer.h"
#include "lltrans.h"
#include "llviewercontrol.h"
+#include "llviewerinventory.h"
#include "llviewermedia.h"
#include "llviewernetwork.h"
+#include "llviewerregion.h"
+#include "reader.h" // JSON
+#include "writer.h" // JSON
//
// Helpers
@@ -93,6 +101,550 @@ LLSD getMarketplaceStringSubstitutions()
return marketplace_sub_map;
}
+// Get the version folder: if there is only one subfolder, we will use it as a version folder
+LLUUID getVersionFolderIfUnique(const LLUUID& folder_id)
+{
+ LLUUID version_id = LLUUID::null;
+ LLInventoryModel::cat_array_t* categories;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(folder_id, categories, items);
+ if (categories->size() == 1)
+ {
+ version_id = categories->begin()->get()->getUUID();
+ }
+ else
+ {
+ LLNotificationsUtil::add("AlertMerchantListingActivateRequired");
+ }
+ return version_id;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// SLM Responders
+void log_SLM_warning(const std::string& request, U32 status, const std::string& reason, const std::string& code, const std::string& description)
+{
+ LL_WARNS("SLM") << "SLM API : Responder to " << request << ". status : " << status << ", reason : " << reason << ", code : " << code << ", description : " << description << LL_ENDL;
+ if ((status == 422) && (description == "[\"You must have an English description to list the product\", \"You must choose a category for your product before it can be listed\", \"Listing could not change state.\", \"Price can't be blank\"]"))
+ {
+ // Unprocessable Entity : Special case that error as it is a frequent answer when trying to list an incomplete listing
+ LLNotificationsUtil::add("MerchantUnprocessableEntity");
+ }
+ else
+ {
+ // Prompt the user with the warning (so they know why things are failing)
+ LLSD subs;
+ subs["[ERROR_REASON]"] = reason;
+ // We do show long descriptions in the alert (unlikely to be readable). The description string will be in the log though.
+ subs["[ERROR_DESCRIPTION]"] = (description.length() <= 512 ? description : "");
+ LLNotificationsUtil::add("MerchantTransactionFailed", subs);
+ }
+}
+void log_SLM_infos(const std::string& request, U32 status, const std::string& body)
+{
+ if (gSavedSettings.getBOOL("MarketplaceListingsLogging"))
+ {
+ LL_INFOS("SLM") << "SLM API : Responder to " << request << ". status : " << status << ", body or description : " << body << LL_ENDL;
+ }
+}
+void log_SLM_infos(const std::string& request, const std::string& url, const std::string& body)
+{
+ if (gSavedSettings.getBOOL("MarketplaceListingsLogging"))
+ {
+ LL_INFOS("SLM") << "SLM API : Sending " << request << ". url : " << url << ", body : " << body << LL_ENDL;
+ }
+}
+
+class LLSLMGetMerchantResponder : public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLSLMGetMerchantResponder);
+public:
+
+ LLSLMGetMerchantResponder() {}
+
+protected:
+ virtual void httpFailure()
+ {
+ if (HTTP_NOT_FOUND == getStatus())
+ {
+ log_SLM_infos("Get /merchant", getStatus(), "User is not a merchant");
+ LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_MERCHANT);
+ }
+ else if (HTTP_SERVICE_UNAVAILABLE == getStatus())
+ {
+ log_SLM_infos("Get /merchant", getStatus(), "Merchant is not migrated");
+ LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT);
+ }
+ else
+ {
+ log_SLM_warning("Get /merchant", getStatus(), getReason(), getContent().get("error_code"), getContent().get("error_description"));
+ LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE);
+ }
+ }
+
+ virtual void httpSuccess()
+ {
+ log_SLM_infos("Get /merchant", getStatus(), "User is a merchant");
+ LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_MERCHANT);
+ }
+
+};
+
+class LLSLMGetListingsResponder : public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLSLMGetListingsResponder);
+public:
+
+ LLSLMGetListingsResponder(const LLUUID& folder_id)
+ {
+ mExpectedFolderId = folder_id;
+ }
+
+ virtual void completedRaw(const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ LLMarketplaceData::instance().setUpdating(mExpectedFolderId,false);
+
+ LLBufferStream istr(channels, buffer.get());
+ std::stringstream strstrm;
+ strstrm << istr.rdbuf();
+ const std::string body = strstrm.str();
+
+ if (!isGoodStatus())
+ {
+ log_SLM_warning("Get /listings", getStatus(), getReason(), "", body);
+ LLMarketplaceData::instance().setSLMDataFetched(MarketplaceFetchCodes::MARKET_FETCH_FAILED);
+ update_marketplace_category(mExpectedFolderId, false);
+ gInventory.notifyObservers();
+ return;
+ }
+
+ Json::Value root;
+ Json::Reader reader;
+ if (!reader.parse(body,root))
+ {
+ log_SLM_warning("Get /listings", getStatus(), "Json parsing failed", reader.getFormatedErrorMessages(), body);
+ LLMarketplaceData::instance().setSLMDataFetched(MarketplaceFetchCodes::MARKET_FETCH_FAILED);
+ update_marketplace_category(mExpectedFolderId, false);
+ gInventory.notifyObservers();
+ return;
+ }
+
+ log_SLM_infos("Get /listings", getStatus(), body);
+
+ // Extract the info from the Json string
+ Json::ValueIterator it = root["listings"].begin();
+
+ while (it != root["listings"].end())
+ {
+ Json::Value listing = *it;
+
+ int listing_id = listing["id"].asInt();
+ bool is_listed = listing["is_listed"].asBool();
+ std::string edit_url = listing["edit_url"].asString();
+ std::string folder_uuid_string = listing["inventory_info"]["listing_folder_id"].asString();
+ std::string version_uuid_string = listing["inventory_info"]["version_folder_id"].asString();
+ int count = listing["inventory_info"]["count_on_hand"].asInt();
+
+ LLUUID folder_id(folder_uuid_string);
+ LLUUID version_id(version_uuid_string);
+ if (folder_id.notNull())
+ {
+ LLMarketplaceData::instance().addListing(folder_id,listing_id,version_id,is_listed,edit_url,count);
+ }
+ it++;
+ }
+
+ // Update all folders under the root
+ LLMarketplaceData::instance().setSLMDataFetched(MarketplaceFetchCodes::MARKET_FETCH_DONE);
+ update_marketplace_category(mExpectedFolderId, false);
+ gInventory.notifyObservers();
+ }
+private:
+ LLUUID mExpectedFolderId;
+};
+
+class LLSLMCreateListingsResponder : public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLSLMCreateListingsResponder);
+public:
+
+ LLSLMCreateListingsResponder(const LLUUID& folder_id)
+ {
+ mExpectedFolderId = folder_id;
+ }
+
+ virtual void completedRaw(const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ LLMarketplaceData::instance().setUpdating(mExpectedFolderId,false);
+
+ LLBufferStream istr(channels, buffer.get());
+ std::stringstream strstrm;
+ strstrm << istr.rdbuf();
+ const std::string body = strstrm.str();
+
+ if (!isGoodStatus())
+ {
+ log_SLM_warning("Post /listings", getStatus(), getReason(), "", body);
+ update_marketplace_category(mExpectedFolderId, false);
+ gInventory.notifyObservers();
+ return;
+ }
+
+ Json::Value root;
+ Json::Reader reader;
+ if (!reader.parse(body,root))
+ {
+ log_SLM_warning("Post /listings", getStatus(), "Json parsing failed", reader.getFormatedErrorMessages(), body);
+ update_marketplace_category(mExpectedFolderId, false);
+ gInventory.notifyObservers();
+ return;
+ }
+
+ log_SLM_infos("Post /listings", getStatus(), body);
+
+ // Extract the info from the Json string
+ Json::ValueIterator it = root["listings"].begin();
+
+ while (it != root["listings"].end())
+ {
+ Json::Value listing = *it;
+
+ int listing_id = listing["id"].asInt();
+ bool is_listed = listing["is_listed"].asBool();
+ std::string edit_url = listing["edit_url"].asString();
+ std::string folder_uuid_string = listing["inventory_info"]["listing_folder_id"].asString();
+ std::string version_uuid_string = listing["inventory_info"]["version_folder_id"].asString();
+ int count = listing["inventory_info"]["count_on_hand"].asInt();
+
+ LLUUID folder_id(folder_uuid_string);
+ LLUUID version_id(version_uuid_string);
+ LLMarketplaceData::instance().addListing(folder_id,listing_id,version_id,is_listed,edit_url,count);
+ update_marketplace_category(folder_id, false);
+ gInventory.notifyObservers();
+ it++;
+ }
+ }
+private:
+ LLUUID mExpectedFolderId;
+};
+
+class LLSLMGetListingResponder : public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLSLMGetListingResponder);
+public:
+
+ LLSLMGetListingResponder(const LLUUID& folder_id)
+ {
+ mExpectedFolderId = folder_id;
+ }
+
+ virtual void completedRaw(const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ LLMarketplaceData::instance().setUpdating(mExpectedFolderId,false);
+
+ LLBufferStream istr(channels, buffer.get());
+ std::stringstream strstrm;
+ strstrm << istr.rdbuf();
+ const std::string body = strstrm.str();
+
+ if (!isGoodStatus())
+ {
+ if (getStatus() == 404)
+ {
+ // That listing does not exist -> delete its record from the local SLM data store
+ LLMarketplaceData::instance().deleteListing(mExpectedFolderId, false);
+ }
+ else
+ {
+ log_SLM_warning("Get /listing", getStatus(), getReason(), "", body);
+ }
+ update_marketplace_category(mExpectedFolderId, false);
+ gInventory.notifyObservers();
+ return;
+ }
+
+ Json::Value root;
+ Json::Reader reader;
+ if (!reader.parse(body,root))
+ {
+ log_SLM_warning("Get /listing", getStatus(), "Json parsing failed", reader.getFormatedErrorMessages(), body);
+ update_marketplace_category(mExpectedFolderId, false);
+ gInventory.notifyObservers();
+ return;
+ }
+
+ log_SLM_infos("Get /listing", getStatus(), body);
+
+ // Extract the info from the Json string
+ Json::ValueIterator it = root["listings"].begin();
+
+ while (it != root["listings"].end())
+ {
+ Json::Value listing = *it;
+
+ int listing_id = listing["id"].asInt();
+ bool is_listed = listing["is_listed"].asBool();
+ std::string edit_url = listing["edit_url"].asString();
+ std::string folder_uuid_string = listing["inventory_info"]["listing_folder_id"].asString();
+ std::string version_uuid_string = listing["inventory_info"]["version_folder_id"].asString();
+ int count = listing["inventory_info"]["count_on_hand"].asInt();
+
+ LLUUID folder_id(folder_uuid_string);
+ LLUUID version_id(version_uuid_string);
+
+ // Update that listing
+ LLMarketplaceData::instance().setListingID(folder_id, listing_id, false);
+ LLMarketplaceData::instance().setVersionFolderID(folder_id, version_id, false);
+ LLMarketplaceData::instance().setActivationState(folder_id, is_listed, false);
+ LLMarketplaceData::instance().setListingURL(folder_id, edit_url, false);
+ LLMarketplaceData::instance().setCountOnHand(folder_id,count,false);
+ update_marketplace_category(folder_id, false);
+ gInventory.notifyObservers();
+
+ it++;
+ }
+ }
+private:
+ LLUUID mExpectedFolderId;
+};
+
+class LLSLMUpdateListingsResponder : public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLSLMUpdateListingsResponder);
+public:
+
+ LLSLMUpdateListingsResponder(const LLUUID& folder_id, bool expected_listed_state, const LLUUID& expected_version_id)
+ {
+ mExpectedFolderId = folder_id;
+ mExpectedListedState = expected_listed_state;
+ mExpectedVersionUUID = expected_version_id;
+ }
+
+ virtual void completedRaw(const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ LLMarketplaceData::instance().setUpdating(mExpectedFolderId,false);
+
+ LLBufferStream istr(channels, buffer.get());
+ std::stringstream strstrm;
+ strstrm << istr.rdbuf();
+ const std::string body = strstrm.str();
+
+ if (!isGoodStatus())
+ {
+ log_SLM_warning("Put /listing", getStatus(), getReason(), "", body);
+ update_marketplace_category(mExpectedFolderId, false);
+ gInventory.notifyObservers();
+ return;
+ }
+
+ Json::Value root;
+ Json::Reader reader;
+ if (!reader.parse(body,root))
+ {
+ log_SLM_warning("Put /listing", getStatus(), "Json parsing failed", reader.getFormatedErrorMessages(), body);
+ update_marketplace_category(mExpectedFolderId, false);
+ gInventory.notifyObservers();
+ return;
+ }
+
+ log_SLM_infos("Put /listing", getStatus(), body);
+
+ // Extract the info from the Json string
+ Json::ValueIterator it = root["listings"].begin();
+
+ while (it != root["listings"].end())
+ {
+ Json::Value listing = *it;
+
+ int listing_id = listing["id"].asInt();
+ bool is_listed = listing["is_listed"].asBool();
+ std::string edit_url = listing["edit_url"].asString();
+ std::string folder_uuid_string = listing["inventory_info"]["listing_folder_id"].asString();
+ std::string version_uuid_string = listing["inventory_info"]["version_folder_id"].asString();
+ int count = listing["inventory_info"]["count_on_hand"].asInt();
+
+ LLUUID folder_id(folder_uuid_string);
+ LLUUID version_id(version_uuid_string);
+
+ // Update that listing
+ LLMarketplaceData::instance().setListingID(folder_id, listing_id, false);
+ LLMarketplaceData::instance().setVersionFolderID(folder_id, version_id, false);
+ LLMarketplaceData::instance().setActivationState(folder_id, is_listed, false);
+ LLMarketplaceData::instance().setListingURL(folder_id, edit_url, false);
+ LLMarketplaceData::instance().setCountOnHand(folder_id,count,false);
+ update_marketplace_category(folder_id, false);
+ gInventory.notifyObservers();
+
+ // Show a notification alert if what we got is not what we expected
+ // (this actually doesn't result in an error status from the SLM API protocol)
+ if ((mExpectedListedState != is_listed) || (mExpectedVersionUUID != version_id))
+ {
+ LLSD subs;
+ subs["[URL]"] = edit_url;
+ LLNotificationsUtil::add("AlertMerchantListingNotUpdated", subs);
+ }
+
+ it++;
+ }
+ }
+private:
+ LLUUID mExpectedFolderId;
+ bool mExpectedListedState;
+ LLUUID mExpectedVersionUUID;
+};
+
+class LLSLMAssociateListingsResponder : public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLSLMAssociateListingsResponder);
+public:
+
+ LLSLMAssociateListingsResponder(const LLUUID& folder_id, const LLUUID& source_folder_id)
+ {
+ mExpectedFolderId = folder_id;
+ mSourceFolderId = source_folder_id;
+ }
+
+ virtual void completedRaw(const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ LLMarketplaceData::instance().setUpdating(mExpectedFolderId,false);
+ LLMarketplaceData::instance().setUpdating(mSourceFolderId,false);
+
+ LLBufferStream istr(channels, buffer.get());
+ std::stringstream strstrm;
+ strstrm << istr.rdbuf();
+ const std::string body = strstrm.str();
+
+ if (!isGoodStatus())
+ {
+ log_SLM_warning("Put /associate_inventory", getStatus(), getReason(), "", body);
+ update_marketplace_category(mExpectedFolderId, false);
+ update_marketplace_category(mSourceFolderId, false);
+ gInventory.notifyObservers();
+ return;
+ }
+
+ Json::Value root;
+ Json::Reader reader;
+ if (!reader.parse(body,root))
+ {
+ log_SLM_warning("Put /associate_inventory", getStatus(), "Json parsing failed", reader.getFormatedErrorMessages(), body);
+ update_marketplace_category(mExpectedFolderId, false);
+ update_marketplace_category(mSourceFolderId, false);
+ gInventory.notifyObservers();
+ return;
+ }
+
+ log_SLM_infos("Put /associate_inventory", getStatus(), body);
+
+ // Extract the info from the Json string
+ Json::ValueIterator it = root["listings"].begin();
+
+ while (it != root["listings"].end())
+ {
+ Json::Value listing = *it;
+
+ int listing_id = listing["id"].asInt();
+ bool is_listed = listing["is_listed"].asBool();
+ std::string edit_url = listing["edit_url"].asString();
+ std::string folder_uuid_string = listing["inventory_info"]["listing_folder_id"].asString();
+ std::string version_uuid_string = listing["inventory_info"]["version_folder_id"].asString();
+ int count = listing["inventory_info"]["count_on_hand"].asInt();
+
+ LLUUID folder_id(folder_uuid_string);
+ LLUUID version_id(version_uuid_string);
+
+ // Check that the listing ID is not already associated to some other record
+ LLUUID old_listing = LLMarketplaceData::instance().getListingFolder(listing_id);
+ if (old_listing.notNull())
+ {
+ // If it is already used, unlist the old record (we can't have 2 listings with the same listing ID)
+ LLMarketplaceData::instance().deleteListing(old_listing);
+ }
+
+ // Add the new association
+ LLMarketplaceData::instance().addListing(folder_id,listing_id,version_id,is_listed,edit_url,count);
+ update_marketplace_category(folder_id, false);
+ gInventory.notifyObservers();
+
+ // The stock count needs to be updated with the new local count now
+ LLMarketplaceData::instance().updateCountOnHand(folder_id,1);
+
+ it++;
+ }
+
+ // Always update the source folder so its widget updates
+ update_marketplace_category(mSourceFolderId, false);
+ }
+private:
+ LLUUID mExpectedFolderId; // This is the folder now associated with the id.
+ LLUUID mSourceFolderId; // This is the folder initially associated with the id. Can be LLUUI::null
+};
+
+class LLSLMDeleteListingsResponder : public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLSLMDeleteListingsResponder);
+public:
+
+ LLSLMDeleteListingsResponder(const LLUUID& folder_id)
+ {
+ mExpectedFolderId = folder_id;
+ }
+
+ virtual void completedRaw(const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ LLMarketplaceData::instance().setUpdating(mExpectedFolderId,false);
+
+ LLBufferStream istr(channels, buffer.get());
+ std::stringstream strstrm;
+ strstrm << istr.rdbuf();
+ const std::string body = strstrm.str();
+
+ if (!isGoodStatus())
+ {
+ log_SLM_warning("Delete /listing", getStatus(), getReason(), "", body);
+ update_marketplace_category(mExpectedFolderId, false);
+ gInventory.notifyObservers();
+ return;
+ }
+
+ Json::Value root;
+ Json::Reader reader;
+ if (!reader.parse(body,root))
+ {
+ log_SLM_warning("Delete /listing", getStatus(), "Json parsing failed", reader.getFormatedErrorMessages(), body);
+ update_marketplace_category(mExpectedFolderId, false);
+ gInventory.notifyObservers();
+ return;
+ }
+
+ log_SLM_infos("Delete /listing", getStatus(), body);
+
+ // Extract the info from the Json string
+ Json::ValueIterator it = root["listings"].begin();
+
+ while (it != root["listings"].end())
+ {
+ Json::Value listing = *it;
+
+ int listing_id = listing["id"].asInt();
+ LLUUID folder_id = LLMarketplaceData::instance().getListingFolder(listing_id);
+ LLMarketplaceData::instance().deleteListing(folder_id);
+
+ it++;
+ }
+ }
+private:
+ LLUUID mExpectedFolderId;
+};
+
+// SLM Responders End
+///////////////////////////////////////////////////////////////////////////////
+
namespace LLMarketplaceImport
{
// Basic interface for this namespace
@@ -156,7 +708,7 @@ namespace LLMarketplaceImport
{
if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
{
- LL_INFOS() << " SLM POST clearing marketplace cookie due to client or server error" << LL_ENDL;
+ LL_INFOS() << " SLM POST : Clearing marketplace cookie due to client or server error" << LL_ENDL;
}
sMarketplaceCookie.clear();
}
@@ -236,7 +788,7 @@ namespace LLMarketplaceImport
S32 getResultStatus()
{
- return sImportResultStatus;
+ return sImportResultStatus;
}
const LLSD& getResults()
@@ -427,15 +979,15 @@ void LLMarketplaceInventoryImporter::initialize()
return;
}
- if (!LLMarketplaceImport::hasSessionCookie())
- {
- mMarketPlaceStatus = MarketplaceStatusCodes::MARKET_PLACE_INITIALIZING;
- LLMarketplaceImport::establishMarketplaceSessionCookie();
- }
- else
- {
- mMarketPlaceStatus = MarketplaceStatusCodes::MARKET_PLACE_MERCHANT;
- }
+ if (!LLMarketplaceImport::hasSessionCookie())
+ {
+ mMarketPlaceStatus = MarketplaceStatusCodes::MARKET_PLACE_INITIALIZING;
+ LLMarketplaceImport::establishMarketplaceSessionCookie();
+ }
+ else
+ {
+ mMarketPlaceStatus = MarketplaceStatusCodes::MARKET_PLACE_MERCHANT;
+ }
}
void LLMarketplaceInventoryImporter::reinitializeAndTriggerImport()
@@ -479,54 +1031,957 @@ void LLMarketplaceInventoryImporter::updateImport()
// If we are no longer in progress
if (!mImportInProgress)
{
- if (mInitialized)
- {
- // Report results
- if (mStatusReportSignal)
- {
- (*mStatusReportSignal)(LLMarketplaceImport::getResultStatus(), LLMarketplaceImport::getResults());
- }
- }
- else
- {
- // Look for results success
- mInitialized = LLMarketplaceImport::hasSessionCookie();
-
- if (mInitialized)
- {
- mMarketPlaceStatus = MarketplaceStatusCodes::MARKET_PLACE_MERCHANT;
- // Follow up with auto trigger of import
- if (mAutoTriggerImport)
- {
- mAutoTriggerImport = false;
- mImportInProgress = triggerImport();
- }
- }
- else
- {
- U32 status = LLMarketplaceImport::getResultStatus();
- if ((status == MarketplaceErrorCodes::IMPORT_FORBIDDEN) ||
- (status == MarketplaceErrorCodes::IMPORT_AUTHENTICATION_ERROR))
- {
- mMarketPlaceStatus = MarketplaceStatusCodes::MARKET_PLACE_NOT_MERCHANT;
- }
- else
- {
- mMarketPlaceStatus = MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE;
- }
- if (mErrorInitSignal && (mMarketPlaceStatus == MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE))
- {
- (*mErrorInitSignal)(LLMarketplaceImport::getResultStatus(), LLMarketplaceImport::getResults());
- }
- }
- }
- }
+ // Look for results success
+ mInitialized = LLMarketplaceImport::hasSessionCookie();
- // Make sure we trigger the status change with the final state (in case of auto trigger after initialize)
- if (mStatusChangedSignal)
- {
- (*mStatusChangedSignal)(mImportInProgress);
+ // Report results
+ if (mStatusReportSignal)
+ {
+ (*mStatusReportSignal)(LLMarketplaceImport::getResultStatus(), LLMarketplaceImport::getResults());
+ }
+
+ if (mInitialized)
+ {
+ mMarketPlaceStatus = MarketplaceStatusCodes::MARKET_PLACE_MERCHANT;
+ // Follow up with auto trigger of import
+ if (mAutoTriggerImport)
+ {
+ mAutoTriggerImport = false;
+ mImportInProgress = triggerImport();
+ }
+ }
+ else
+ {
+ U32 status = LLMarketplaceImport::getResultStatus();
+ if ((status == MarketplaceErrorCodes::IMPORT_FORBIDDEN) ||
+ (status == MarketplaceErrorCodes::IMPORT_AUTHENTICATION_ERROR))
+ {
+ mMarketPlaceStatus = MarketplaceStatusCodes::MARKET_PLACE_NOT_MERCHANT;
+ }
+ else if (status == MarketplaceErrorCodes::IMPORT_SERVER_API_DISABLED)
+ {
+ mMarketPlaceStatus = MarketplaceStatusCodes::MARKET_PLACE_MIGRATED_MERCHANT;
+ }
+ else
+ {
+ mMarketPlaceStatus = MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE;
+ }
+ if (mErrorInitSignal && (mMarketPlaceStatus == MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE))
+ {
+ (*mErrorInitSignal)(LLMarketplaceImport::getResultStatus(), LLMarketplaceImport::getResults());
+ }
+ }
}
}
+
+ // Make sure we trigger the status change with the final state (in case of auto trigger after initialize)
+ if (mStatusChangedSignal)
+ {
+ (*mStatusChangedSignal)(mImportInProgress);
+ }
+}
+
+//
+// Direct Delivery : Marketplace tuples and data
+//
+class LLMarketplaceInventoryObserver : public LLInventoryObserver
+{
+public:
+ LLMarketplaceInventoryObserver() {}
+ virtual ~LLMarketplaceInventoryObserver() {}
+ virtual void changed(U32 mask);
+};
+
+void LLMarketplaceInventoryObserver::changed(U32 mask)
+{
+ // When things are added to the marketplace, we might need to re-validate and fix the containing listings
+ if (mask & LLInventoryObserver::ADD)
+ {
+ const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
+
+ std::set<LLUUID>::const_iterator id_it = changed_items.begin();
+ std::set<LLUUID>::const_iterator id_end = changed_items.end();
+ // First, count the number of items in this list...
+ S32 count = 0;
+ for (;id_it != id_end; ++id_it)
+ {
+ LLInventoryObject* obj = gInventory.getObject(*id_it);
+ if (obj && (LLAssetType::AT_CATEGORY != obj->getType()))
+ {
+ count++;
+ }
+ }
+ // Then, decrement the folders of that amount
+ // Note that of all of those, only one folder will be a listing folder (if at all).
+ // The other will be ignored by the decrement method.
+ id_it = changed_items.begin();
+ for (;id_it != id_end; ++id_it)
+ {
+ LLInventoryObject* obj = gInventory.getObject(*id_it);
+ if (obj && (LLAssetType::AT_CATEGORY == obj->getType()))
+ {
+ LLMarketplaceData::instance().decrementValidationWaiting(obj->getUUID(),count);
+ }
+ }
+ }
+
+ // When things are changed in the inventory, this can trigger a host of changes in the marketplace listings folder:
+ // * stock counts changing : no copy items coming in and out will change the stock count on folders
+ // * version and listing folders : moving those might invalidate the marketplace data itself
+ // Since we should cannot raise inventory change while the observer is called (the list will be cleared
+ // once observers are called) we need to raise a flag in the inventory to signal that things have been dirtied.
+
+ if (mask & (LLInventoryObserver::INTERNAL | LLInventoryObserver::STRUCTURE))
+ {
+ const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
+
+ std::set<LLUUID>::const_iterator id_it = changed_items.begin();
+ std::set<LLUUID>::const_iterator id_end = changed_items.end();
+ for (;id_it != id_end; ++id_it)
+ {
+ LLInventoryObject* obj = gInventory.getObject(*id_it);
+ if (obj)
+ {
+ if (LLAssetType::AT_CATEGORY == obj->getType())
+ {
+ // If it's a folder known to the marketplace, let's check it's in proper shape
+ if (LLMarketplaceData::instance().isListed(*id_it) || LLMarketplaceData::instance().isVersionFolder(*id_it))
+ {
+ LLInventoryCategory* cat = (LLInventoryCategory*)(obj);
+ validate_marketplacelistings(cat);
+ }
+ }
+ else
+ {
+ // If it's not a category, it's an item...
+ LLInventoryItem* item = (LLInventoryItem*)(obj);
+ // If it's a no copy item, we may need to update the label count of marketplace listings
+ if (!item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()))
+ {
+ LLMarketplaceData::instance().setDirtyCount();
+ }
+ }
+ }
+ }
+ }
+}
+
+// Tuple == Item
+LLMarketplaceTuple::LLMarketplaceTuple() :
+ mListingFolderId(),
+ mListingId(0),
+ mVersionFolderId(),
+ mIsActive(false),
+ mEditURL("")
+{
+}
+
+LLMarketplaceTuple::LLMarketplaceTuple(const LLUUID& folder_id) :
+ mListingFolderId(folder_id),
+ mListingId(0),
+ mVersionFolderId(),
+ mIsActive(false),
+ mEditURL("")
+{
+}
+
+LLMarketplaceTuple::LLMarketplaceTuple(const LLUUID& folder_id, S32 listing_id, const LLUUID& version_id, bool is_listed) :
+ mListingFolderId(folder_id),
+ mListingId(listing_id),
+ mVersionFolderId(version_id),
+ mIsActive(is_listed),
+ mEditURL("")
+{
+}
+
+
+// Data map
+LLMarketplaceData::LLMarketplaceData() :
+ mMarketPlaceStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED),
+ mMarketPlaceDataFetched(MarketplaceFetchCodes::MARKET_FETCH_NOT_DONE),
+ mStatusUpdatedSignal(NULL),
+ mDataFetchedSignal(NULL),
+ mDirtyCount(false)
+{
+ mInventoryObserver = new LLMarketplaceInventoryObserver;
+ gInventory.addObserver(mInventoryObserver);
+}
+
+LLMarketplaceData::~LLMarketplaceData()
+{
+ gInventory.removeObserver(mInventoryObserver);
+}
+
+void LLMarketplaceData::initializeSLM(const status_updated_signal_t::slot_type& cb)
+{
+ if (mStatusUpdatedSignal == NULL)
+ {
+ mStatusUpdatedSignal = new status_updated_signal_t();
+ }
+ mStatusUpdatedSignal->connect(cb);
+
+ if (mMarketPlaceStatus != MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED)
+ {
+ // If already initialized, just confirm the status so the callback gets called
+ setSLMStatus(mMarketPlaceStatus);
+ }
+ else
+ {
+ // Initiate SLM connection and set responder
+ std::string url = getSLMConnectURL("/merchant");
+ if (url != "")
+ {
+ mMarketPlaceStatus = MarketplaceStatusCodes::MARKET_PLACE_INITIALIZING;
+ log_SLM_infos("LLHTTPClient::get", url, "");
+ LLHTTPClient::get(url, new LLSLMGetMerchantResponder(), LLSD());
+ }
+ }
+}
+
+void LLMarketplaceData::setDataFetchedSignal(const status_updated_signal_t::slot_type& cb)
+{
+ if (mDataFetchedSignal == NULL)
+ {
+ mDataFetchedSignal = new status_updated_signal_t();
+ }
+ mDataFetchedSignal->connect(cb);
+}
+
+// Get/Post/Put requests to the SLM Server using the SLM API
+void LLMarketplaceData::getSLMListings()
+{
+ LLSD headers = LLSD::emptyMap();
+ headers["Accept"] = "application/json";
+ headers["Content-Type"] = "application/json";
+
+ // Send request
+ std::string url = getSLMConnectURL("/listings");
+ log_SLM_infos("LLHTTPClient::get", url, "");
+ const LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ setUpdating(marketplacelistings_id,true);
+ LLHTTPClient::get(url, new LLSLMGetListingsResponder(marketplacelistings_id), headers);
+}
+
+void LLMarketplaceData::getSLMListing(S32 listing_id)
+{
+ LLSD headers = LLSD::emptyMap();
+ headers["Accept"] = "application/json";
+ headers["Content-Type"] = "application/json";
+
+ // Send request
+ std::string url = getSLMConnectURL("/listing/") + llformat("%d",listing_id);
+ log_SLM_infos("LLHTTPClient::get", url, "");
+ LLUUID folder_id = LLMarketplaceData::instance().getListingFolder(listing_id);
+ setUpdating(folder_id,true);
+ LLHTTPClient::get(url, new LLSLMGetListingResponder(folder_id), headers);
+}
+
+void LLMarketplaceData::createSLMListing(const LLUUID& folder_id, const LLUUID& version_id, S32 count)
+{
+ LLSD headers = LLSD::emptyMap();
+ headers["Accept"] = "application/json";
+ headers["Content-Type"] = "application/json";
+
+ // Build the json message
+ Json::Value root;
+ Json::FastWriter writer;
+
+ LLViewerInventoryCategory* category = gInventory.getCategory(folder_id);
+ root["listing"]["name"] = category->getName();
+ root["listing"]["inventory_info"]["listing_folder_id"] = folder_id.asString();
+ root["listing"]["inventory_info"]["version_folder_id"] = version_id.asString();
+ root["listing"]["inventory_info"]["count_on_hand"] = count;
+
+ std::string json_str = writer.write(root);
+
+ // postRaw() takes ownership of the buffer and releases it later.
+ size_t size = json_str.size();
+ U8 *data = new U8[size];
+ memcpy(data, (U8*)(json_str.c_str()), size);
+
+ // Send request
+ std::string url = getSLMConnectURL("/listings");
+ log_SLM_infos("LLHTTPClient::postRaw", url, json_str);
+ setUpdating(folder_id,true);
+ LLHTTPClient::postRaw(url, data, size, new LLSLMCreateListingsResponder(folder_id), headers);
+}
+
+void LLMarketplaceData::updateSLMListing(const LLUUID& folder_id, S32 listing_id, const LLUUID& version_id, bool is_listed, S32 count)
+{
+ LLSD headers = LLSD::emptyMap();
+ headers["Accept"] = "application/json";
+ headers["Content-Type"] = "application/json";
+
+ Json::Value root;
+ Json::FastWriter writer;
+
+ // Note : auto unlist if the count is 0 (out of stock)
+ if (is_listed && (count == 0))
+ {
+ is_listed = false;
+ LLNotificationsUtil::add("AlertMerchantStockFolderEmpty");
+ }
+
+ // Note : we're assuming that sending unchanged info won't break anything server side...
+ root["listing"]["id"] = listing_id;
+ root["listing"]["is_listed"] = is_listed;
+ root["listing"]["inventory_info"]["listing_folder_id"] = folder_id.asString();
+ root["listing"]["inventory_info"]["version_folder_id"] = version_id.asString();
+ root["listing"]["inventory_info"]["count_on_hand"] = count;
+
+ std::string json_str = writer.write(root);
+
+ // postRaw() takes ownership of the buffer and releases it later.
+ size_t size = json_str.size();
+ U8 *data = new U8[size];
+ memcpy(data, (U8*)(json_str.c_str()), size);
+
+ // Send request
+ std::string url = getSLMConnectURL("/listing/") + llformat("%d",listing_id);
+ log_SLM_infos("LLHTTPClient::putRaw", url, json_str);
+ setUpdating(folder_id,true);
+ LLHTTPClient::putRaw(url, data, size, new LLSLMUpdateListingsResponder(folder_id, is_listed, version_id), headers);
+}
+
+void LLMarketplaceData::associateSLMListing(const LLUUID& folder_id, S32 listing_id, const LLUUID& version_id, const LLUUID& source_folder_id)
+{
+ LLSD headers = LLSD::emptyMap();
+ headers["Accept"] = "application/json";
+ headers["Content-Type"] = "application/json";
+
+ Json::Value root;
+ Json::FastWriter writer;
+
+ // Note : we're assuming that sending unchanged info won't break anything server side...
+ root["listing"]["id"] = listing_id;
+ root["listing"]["inventory_info"]["listing_folder_id"] = folder_id.asString();
+ root["listing"]["inventory_info"]["version_folder_id"] = version_id.asString();
+
+ std::string json_str = writer.write(root);
+
+ // postRaw() takes ownership of the buffer and releases it later.
+ size_t size = json_str.size();
+ U8 *data = new U8[size];
+ memcpy(data, (U8*)(json_str.c_str()), size);
+
+ // Send request
+ std::string url = getSLMConnectURL("/associate_inventory/") + llformat("%d",listing_id);
+ log_SLM_infos("LLHTTPClient::putRaw", url, json_str);
+ setUpdating(folder_id,true);
+ setUpdating(source_folder_id,true);
+ LLHTTPClient::putRaw(url, data, size, new LLSLMAssociateListingsResponder(folder_id,source_folder_id), headers);
+}
+
+void LLMarketplaceData::deleteSLMListing(S32 listing_id)
+{
+ LLSD headers = LLSD::emptyMap();
+ headers["Accept"] = "application/json";
+ headers["Content-Type"] = "application/json";
+
+ // Send request
+ std::string url = getSLMConnectURL("/listing/") + llformat("%d",listing_id);
+ log_SLM_infos("LLHTTPClient::del", url, "");
+ LLUUID folder_id = LLMarketplaceData::instance().getListingFolder(listing_id);
+ setUpdating(folder_id,true);
+ LLHTTPClient::del(url, new LLSLMDeleteListingsResponder(folder_id), headers);
+}
+
+std::string LLMarketplaceData::getSLMConnectURL(const std::string& route)
+{
+ std::string url("");
+ LLViewerRegion *regionp = gAgent.getRegion();
+ if (regionp)
+ {
+ // Get DirectDelivery cap
+ url = regionp->getCapability("DirectDelivery");
+ if (url != "")
+ {
+ url += route;
+ }
+ }
+ return url;
+}
+
+void LLMarketplaceData::setSLMStatus(U32 status)
+{
+ mMarketPlaceStatus = status;
+ if (mStatusUpdatedSignal)
+ {
+ (*mStatusUpdatedSignal)();
+ }
+}
+
+void LLMarketplaceData::setSLMDataFetched(U32 status)
+{
+ mMarketPlaceDataFetched = status;
+ if (mDataFetchedSignal)
+ {
+ (*mDataFetchedSignal)();
+ }
+}
+
+// Creation / Deletion / Update
+// Methods publicly called
+bool LLMarketplaceData::createListing(const LLUUID& folder_id)
+{
+ if (isListed(folder_id))
+ {
+ // Listing already exists -> exit with error
+ return false;
+ }
+
+ // Get the version folder: if there is only one subfolder, we will set it as a version folder immediately
+ S32 count = -1;
+ LLUUID version_id = getVersionFolderIfUnique(folder_id);
+ if (version_id.notNull())
+ {
+ count = compute_stock_count(version_id, true);
+ }
+
+ // Validate the count on hand
+ if (count == COMPUTE_STOCK_NOT_EVALUATED)
+ {
+ // If the count on hand cannot be evaluated, we will consider it empty (out of stock) at creation time
+ // It will get reevaluated and updated once the items are fetched
+ count = 0;
+ }
+
+ // Post the listing creation request to SLM
+ createSLMListing(folder_id, version_id, count);
+
+ return true;
+}
+
+bool LLMarketplaceData::clearListing(const LLUUID& folder_id, S32 depth)
+{
+ if (folder_id.isNull())
+ {
+ // Folder doesn't exists -> exit with error
+ return false;
+ }
+
+ // Evaluate the depth if it wasn't passed as a parameter
+ if (depth < 0)
+ {
+ depth = depth_nesting_in_marketplace(folder_id);
+
+ }
+ // Folder id can be the root of the listing or not so we need to retrieve the root first
+ LLUUID listing_uuid = (isListed(folder_id) ? folder_id : nested_parent_id(folder_id, depth));
+ S32 listing_id = getListingID(listing_uuid);
+
+ if (listing_id == 0)
+ {
+ // Listing doesn't exists -> exit with error
+ return false;
+ }
+
+ // Update the SLM Server so that this listing is deleted (actually, archived...)
+ deleteSLMListing(listing_id);
+
+ return true;
+}
+
+bool LLMarketplaceData::getListing(const LLUUID& folder_id, S32 depth)
+{
+ if (folder_id.isNull())
+ {
+ // Folder doesn't exists -> exit with error
+ return false;
+ }
+
+ // Evaluate the depth if it wasn't passed as a parameter
+ if (depth < 0)
+ {
+ depth = depth_nesting_in_marketplace(folder_id);
+
+ }
+ // Folder id can be the root of the listing or not so we need to retrieve the root first
+ LLUUID listing_uuid = (isListed(folder_id) ? folder_id : nested_parent_id(folder_id, depth));
+ S32 listing_id = getListingID(listing_uuid);
+
+ if (listing_id == 0)
+ {
+ // Listing doesn't exists -> exit with error
+ return false;
+ }
+
+ // Get listing data from SLM
+ getSLMListing(listing_id);
+
+ return true;
+}
+
+bool LLMarketplaceData::getListing(S32 listing_id)
+{
+ if (listing_id == 0)
+ {
+ return false;
+ }
+
+ // Get listing data from SLM
+ getSLMListing(listing_id);
+ return true;
+}
+
+bool LLMarketplaceData::activateListing(const LLUUID& folder_id, bool activate, S32 depth)
+{
+ // Evaluate the depth if it wasn't passed as a parameter
+ if (depth < 0)
+ {
+ depth = depth_nesting_in_marketplace(folder_id);
+
+ }
+ // Folder id can be the root of the listing or not so we need to retrieve the root first
+ LLUUID listing_uuid = nested_parent_id(folder_id, depth);
+ S32 listing_id = getListingID(listing_uuid);
+ if (listing_id == 0)
+ {
+ // Listing doesn't exists -> exit with error
+ return false;
+ }
+
+ if (getActivationState(listing_uuid) == activate)
+ {
+ // If activation state is unchanged, no point spamming SLM with an update
+ return true;
+ }
+
+ LLUUID version_uuid = getVersionFolder(listing_uuid);
+
+ // Also update the count on hand
+ S32 count = compute_stock_count(folder_id);
+ if (count == COMPUTE_STOCK_NOT_EVALUATED)
+ {
+ // If the count on hand cannot be evaluated locally, we should not change that SLM value
+ // We are assuming that this issue is local and should not modify server side values
+ count = getCountOnHand(listing_uuid);
+ }
+
+ // Post the listing update request to SLM
+ updateSLMListing(listing_uuid, listing_id, version_uuid, activate, count);
+
+ return true;
+}
+
+bool LLMarketplaceData::setVersionFolder(const LLUUID& folder_id, const LLUUID& version_id, S32 depth)
+{
+ // Evaluate the depth if it wasn't passed as a parameter
+ if (depth < 0)
+ {
+ depth = depth_nesting_in_marketplace(folder_id);
+
+ }
+ // Folder id can be the root of the listing or not so we need to retrieve the root first
+ LLUUID listing_uuid = nested_parent_id(folder_id, depth);
+ S32 listing_id = getListingID(listing_uuid);
+ if (listing_id == 0)
+ {
+ // Listing doesn't exists -> exit with error
+ return false;
+ }
+
+ if (getVersionFolder(listing_uuid) == version_id)
+ {
+ // If version folder is unchanged, no point spamming SLM with an update
+ return true;
+ }
+
+ // Note: if the version_id is cleared, we need to unlist the listing, otherwise, state unchanged
+ bool is_listed = (version_id.isNull() ? false : getActivationState(listing_uuid));
+
+ // Also update the count on hand
+ S32 count = compute_stock_count(version_id);
+ if (count == COMPUTE_STOCK_NOT_EVALUATED)
+ {
+ // If the count on hand cannot be evaluated, we will consider it empty (out of stock) when resetting the version folder
+ // It will get reevaluated and updated once the items are fetched
+ count = 0;
+ }
+
+ // Post the listing update request to SLM
+ updateSLMListing(listing_uuid, listing_id, version_id, is_listed, count);
+
+ return true;
+}
+
+bool LLMarketplaceData::updateCountOnHand(const LLUUID& folder_id, S32 depth)
+{
+ // Evaluate the depth if it wasn't passed as a parameter
+ if (depth < 0)
+ {
+ depth = depth_nesting_in_marketplace(folder_id);
+
+ }
+ // Folder id can be the root of the listing or not so we need to retrieve the root first
+ LLUUID listing_uuid = nested_parent_id(folder_id, depth);
+ S32 listing_id = getListingID(listing_uuid);
+ if (listing_id == 0)
+ {
+ // Listing doesn't exists -> exit with error
+ return false;
+ }
+
+ // Compute the new count on hand
+ S32 count = compute_stock_count(folder_id);
+
+ if (count == getCountOnHand(listing_uuid))
+ {
+ // If count on hand is unchanged, no point spamming SLM with an update
+ return true;
+ }
+ else if (count == COMPUTE_STOCK_NOT_EVALUATED)
+ {
+ // If local count on hand is not known at that point, do *not* force an update to SLM
+ return false;
+ }
+
+ // Get the unchanged values
+ bool is_listed = getActivationState(listing_uuid);
+ LLUUID version_uuid = getVersionFolder(listing_uuid);
+
+
+ // Post the listing update request to SLM
+ updateSLMListing(listing_uuid, listing_id, version_uuid, is_listed, count);
+
+ // Force the local value as it prevents spamming (count update may occur in burst when restocking)
+ // Note that if SLM has a good reason to return a different value, it'll be updated by the responder
+ setCountOnHand(listing_uuid, count, false);
+
+ return true;
+}
+
+bool LLMarketplaceData::associateListing(const LLUUID& folder_id, const LLUUID& source_folder_id, S32 listing_id)
+{
+ if (isListed(folder_id))
+ {
+ // Listing already exists -> exit with error
+ return false;
+ }
+
+ // Get the version folder: if there is only one subfolder, we will set it as a version folder immediately
+ LLUUID version_id = getVersionFolderIfUnique(folder_id);
+
+ // Post the listing associate request to SLM
+ associateSLMListing(folder_id, listing_id, version_id, source_folder_id);
+
+ return true;
+}
+
+// Methods privately called or called by SLM responders to perform changes
+bool LLMarketplaceData::addListing(const LLUUID& folder_id, S32 listing_id, const LLUUID& version_id, bool is_listed, const std::string& edit_url, S32 count)
+{
+ mMarketplaceItems[folder_id] = LLMarketplaceTuple(folder_id, listing_id, version_id, is_listed);
+ mMarketplaceItems[folder_id].mEditURL = edit_url;
+ mMarketplaceItems[folder_id].mCountOnHand = count;
+ if (version_id.notNull())
+ {
+ mVersionFolders[version_id] = folder_id;
+ }
+ return true;
+}
+
+bool LLMarketplaceData::deleteListing(const LLUUID& folder_id, bool update)
+{
+ LLUUID version_folder = getVersionFolder(folder_id);
+
+ if (mMarketplaceItems.erase(folder_id) != 1)
+ {
+ return false;
+ }
+ mVersionFolders.erase(version_folder);
+
+ if (update)
+ {
+ update_marketplace_category(folder_id, false);
+ gInventory.notifyObservers();
+ }
+ return true;
+}
+
+bool LLMarketplaceData::deleteListing(S32 listing_id, bool update)
+{
+ if (listing_id == 0)
+ {
+ return false;
+ }
+
+ LLUUID folder_id = getListingFolder(listing_id);
+ return deleteListing(folder_id, update);
+}
+
+// Accessors
+bool LLMarketplaceData::getActivationState(const LLUUID& folder_id)
+{
+ // Listing folder case
+ marketplace_items_list_t::iterator it = mMarketplaceItems.find(folder_id);
+ if (it != mMarketplaceItems.end())
+ {
+ return (it->second).mIsActive;
+ }
+ // Version folder case
+ version_folders_list_t::iterator it_version = mVersionFolders.find(folder_id);
+ if (it_version != mVersionFolders.end())
+ {
+ marketplace_items_list_t::iterator it = mMarketplaceItems.find(it_version->second);
+ if (it != mMarketplaceItems.end())
+ {
+ return (it->second).mIsActive;
+ }
+ }
+ return false;
+}
+
+S32 LLMarketplaceData::getListingID(const LLUUID& folder_id)
+{
+ marketplace_items_list_t::iterator it = mMarketplaceItems.find(folder_id);
+ return (it == mMarketplaceItems.end() ? 0 : (it->second).mListingId);
+}
+
+S32 LLMarketplaceData::getCountOnHand(const LLUUID& folder_id)
+{
+ marketplace_items_list_t::iterator it = mMarketplaceItems.find(folder_id);
+ return (it == mMarketplaceItems.end() ? -1 : (it->second).mCountOnHand);
+}
+
+LLUUID LLMarketplaceData::getVersionFolder(const LLUUID& folder_id)
+{
+ marketplace_items_list_t::iterator it = mMarketplaceItems.find(folder_id);
+ return (it == mMarketplaceItems.end() ? LLUUID::null : (it->second).mVersionFolderId);
}
+// Reverse lookup : find the listing folder id from the listing id
+LLUUID LLMarketplaceData::getListingFolder(S32 listing_id)
+{
+ marketplace_items_list_t::iterator it = mMarketplaceItems.begin();
+ while (it != mMarketplaceItems.end())
+ {
+ if ((it->second).mListingId == listing_id)
+ {
+ return (it->second).mListingFolderId;
+ }
+ it++;
+ }
+ return LLUUID::null;
+}
+
+std::string LLMarketplaceData::getListingURL(const LLUUID& folder_id, S32 depth)
+{
+ // Evaluate the depth if it wasn't passed as a parameter
+ if (depth < 0)
+ {
+ depth = depth_nesting_in_marketplace(folder_id);
+
+ }
+
+ LLUUID listing_uuid = nested_parent_id(folder_id, depth);
+
+ marketplace_items_list_t::iterator it = mMarketplaceItems.find(listing_uuid);
+ return (it == mMarketplaceItems.end() ? "" : (it->second).mEditURL);
+}
+
+bool LLMarketplaceData::isListed(const LLUUID& folder_id)
+{
+ marketplace_items_list_t::iterator it = mMarketplaceItems.find(folder_id);
+ return (it != mMarketplaceItems.end());
+}
+
+bool LLMarketplaceData::isListedAndActive(const LLUUID& folder_id)
+{
+ return (isListed(folder_id) && getActivationState(folder_id));
+}
+
+bool LLMarketplaceData::isVersionFolder(const LLUUID& folder_id)
+{
+ version_folders_list_t::iterator it = mVersionFolders.find(folder_id);
+ return (it != mVersionFolders.end());
+}
+
+bool LLMarketplaceData::isInActiveFolder(const LLUUID& obj_id, S32 depth)
+{
+ // Evaluate the depth if it wasn't passed as a parameter
+ if (depth < 0)
+ {
+ depth = depth_nesting_in_marketplace(obj_id);
+
+ }
+
+ LLUUID listing_uuid = nested_parent_id(obj_id, depth);
+ bool active = getActivationState(listing_uuid);
+ LLUUID version_uuid = getVersionFolder(listing_uuid);
+ return (active && ((obj_id == version_uuid) || gInventory.isObjectDescendentOf(obj_id, version_uuid)));
+}
+
+LLUUID LLMarketplaceData::getActiveFolder(const LLUUID& obj_id, S32 depth)
+{
+ // Evaluate the depth if it wasn't passed as a parameter
+ if (depth < 0)
+ {
+ depth = depth_nesting_in_marketplace(obj_id);
+
+ }
+
+ LLUUID listing_uuid = nested_parent_id(obj_id, depth);
+ return (getActivationState(listing_uuid) ? getVersionFolder(listing_uuid) : LLUUID::null);
+}
+
+bool LLMarketplaceData::isUpdating(const LLUUID& folder_id, S32 depth)
+{
+ // Evaluate the depth if it wasn't passed as a parameter
+ if (depth < 0)
+ {
+ depth = depth_nesting_in_marketplace(folder_id);
+ }
+ if ((depth <= 0) || (depth > 2))
+ {
+ // Only listing and version folders though are concerned by that status
+ return false;
+ }
+ else
+ {
+ const LLUUID marketplace_listings_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ std::set<LLUUID>::iterator it = mPendingUpdateSet.find(marketplace_listings_uuid);
+ if (it != mPendingUpdateSet.end())
+ {
+ // If we're waiting for data for the marketplace listings root, we are in the updating process for all
+ return true;
+ }
+ else
+ {
+ // Check if the listing folder is waiting or data
+ LLUUID listing_uuid = nested_parent_id(folder_id, depth);
+ it = mPendingUpdateSet.find(listing_uuid);
+ return (it != mPendingUpdateSet.end());
+ }
+ }
+}
+
+void LLMarketplaceData::setUpdating(const LLUUID& folder_id, bool isUpdating)
+{
+ std::set<LLUUID>::iterator it = mPendingUpdateSet.find(folder_id);
+ if (it != mPendingUpdateSet.end())
+ {
+ mPendingUpdateSet.erase(it);
+ }
+ if (isUpdating)
+ {
+ mPendingUpdateSet.insert(folder_id);
+ }
+}
+
+void LLMarketplaceData::setValidationWaiting(const LLUUID& folder_id, S32 count)
+{
+ mValidationWaitingList[folder_id] = count;
+}
+
+void LLMarketplaceData::decrementValidationWaiting(const LLUUID& folder_id, S32 count)
+{
+ waiting_list_t::iterator found = mValidationWaitingList.find(folder_id);
+ if (found != mValidationWaitingList.end())
+ {
+ found->second -= count;
+ if (found->second <= 0)
+ {
+ mValidationWaitingList.erase(found);
+ LLInventoryCategory *cat = gInventory.getCategory(folder_id);
+ validate_marketplacelistings(cat);
+ update_marketplace_category(folder_id);
+ gInventory.notifyObservers();
+ }
+ }
+}
+
+// Private Modifiers
+bool LLMarketplaceData::setListingID(const LLUUID& folder_id, S32 listing_id, bool update)
+{
+ marketplace_items_list_t::iterator it = mMarketplaceItems.find(folder_id);
+ if (it == mMarketplaceItems.end())
+ {
+ return false;
+ }
+
+ (it->second).mListingId = listing_id;
+
+ if (update)
+ {
+ update_marketplace_category(folder_id, false);
+ gInventory.notifyObservers();
+ }
+ return true;
+}
+
+bool LLMarketplaceData::setCountOnHand(const LLUUID& folder_id, S32 count, bool update)
+{
+ marketplace_items_list_t::iterator it = mMarketplaceItems.find(folder_id);
+ if (it == mMarketplaceItems.end())
+ {
+ return false;
+ }
+
+ (it->second).mCountOnHand = count;
+
+ return true;
+}
+
+bool LLMarketplaceData::setVersionFolderID(const LLUUID& folder_id, const LLUUID& version_id, bool update)
+{
+ marketplace_items_list_t::iterator it = mMarketplaceItems.find(folder_id);
+ if (it == mMarketplaceItems.end())
+ {
+ return false;
+ }
+
+ LLUUID old_version_id = (it->second).mVersionFolderId;
+ if (old_version_id == version_id)
+ {
+ return false;
+ }
+
+ (it->second).mVersionFolderId = version_id;
+ mVersionFolders.erase(old_version_id);
+ if (version_id.notNull())
+ {
+ mVersionFolders[version_id] = folder_id;
+ }
+
+ if (update)
+ {
+ update_marketplace_category(old_version_id, false);
+ update_marketplace_category(version_id, false);
+ gInventory.notifyObservers();
+ }
+ return true;
+}
+
+bool LLMarketplaceData::setActivationState(const LLUUID& folder_id, bool activate, bool update)
+{
+ marketplace_items_list_t::iterator it = mMarketplaceItems.find(folder_id);
+ if (it == mMarketplaceItems.end())
+ {
+ return false;
+ }
+
+ (it->second).mIsActive = activate;
+
+ if (update)
+ {
+ update_marketplace_category((it->second).mListingFolderId, false);
+ gInventory.notifyObservers();
+ }
+ return true;
+}
+
+bool LLMarketplaceData::setListingURL(const LLUUID& folder_id, const std::string& edit_url, bool update)
+{
+ marketplace_items_list_t::iterator it = mMarketplaceItems.find(folder_id);
+ if (it == mMarketplaceItems.end())
+ {
+ return false;
+ }
+
+ (it->second).mEditURL = edit_url;
+ return true;
+}
+
+
+
diff --git a/indra/newview/llmarketplacefunctions.h b/indra/newview/llmarketplacefunctions.h
index abe60890a3..f8e7ed4364 100755
--- a/indra/newview/llmarketplacefunctions.h
+++ b/indra/newview/llmarketplacefunctions.h
@@ -66,8 +66,21 @@ namespace MarketplaceStatusCodes
MARKET_PLACE_NOT_INITIALIZED = 0,
MARKET_PLACE_INITIALIZING = 1,
MARKET_PLACE_CONNECTION_FAILURE = 2,
- MARKET_PLACE_MERCHANT = 3,
- MARKET_PLACE_NOT_MERCHANT = 4,
+ MARKET_PLACE_NOT_MERCHANT = 3,
+ MARKET_PLACE_MERCHANT = 4,
+ MARKET_PLACE_NOT_MIGRATED_MERCHANT = 5,
+ MARKET_PLACE_MIGRATED_MERCHANT = 6
+ };
+}
+
+namespace MarketplaceFetchCodes
+{
+ enum sCode
+ {
+ MARKET_FETCH_NOT_DONE = 0,
+ MARKET_FETCH_LOADING = 1,
+ MARKET_FETCH_FAILED = 2,
+ MARKET_FETCH_DONE = 3
};
}
@@ -109,6 +122,166 @@ private:
};
+// Classes handling the data coming from and going to the Marketplace SLM Server DB:
+// * implement the Marketplace API
+// * cache the current Marketplace data (tuples)
+// * provide methods to get Marketplace data on any inventory item
+// * set Marketplace data
+// * signal Marketplace updates to inventory
+namespace SLMErrorCodes
+{
+ enum eCode
+ {
+ SLM_SUCCESS = 200,
+ SLM_RECORD_CREATED = 201,
+ SLM_MALFORMED_PAYLOAD = 400,
+ SLM_NOT_FOUND = 404,
+ };
+}
+
+class LLMarketplaceData;
+class LLInventoryObserver;
+
+// A Marketplace item is known by its tuple
+class LLMarketplaceTuple
+{
+public:
+ friend class LLMarketplaceData;
+
+ LLMarketplaceTuple();
+ LLMarketplaceTuple(const LLUUID& folder_id);
+ LLMarketplaceTuple(const LLUUID& folder_id, S32 listing_id, const LLUUID& version_id, bool is_listed = false);
+
+private:
+ // Representation of a marketplace item in the Marketplace DB (well, what we know of it...)
+ LLUUID mListingFolderId;
+ S32 mListingId;
+ LLUUID mVersionFolderId;
+ bool mIsActive;
+ S32 mCountOnHand;
+ std::string mEditURL;
+};
+// Notes:
+// * The mListingFolderId is used as a key to this map. It could therefore be taken off the LLMarketplaceTuple objects themselves.
+// * The SLM DB however uses mListingId as its primary key and it shows in its API. In the viewer though, the mListingFolderId is what we use to grab an inventory record.
+typedef std::map<LLUUID, LLMarketplaceTuple> marketplace_items_list_t;
+typedef std::map<LLUUID, LLUUID> version_folders_list_t;
+
+// Session cache of all Marketplace tuples
+// Notes:
+// * There's one and only one possible set of Marketplace dataset per agent and per session thus making it an LLSingleton
+// * Some of those records might correspond to folders that do not exist in the inventory anymore. We do not clear them out though. They just won't show up in the UI.
+
+class LLSLMGetMerchantResponder;
+class LLSLMGetListingsResponder;
+class LLSLMCreateListingsResponder;
+class LLSLMGetListingResponder;
+class LLSLMUpdateListingsResponder;
+class LLSLMAssociateListingsResponder;
+class LLSLMDeleteListingsResponder;
+
+class LLMarketplaceData
+ : public LLSingleton<LLMarketplaceData>
+{
+public:
+ friend class LLSLMGetMerchantResponder;
+ friend class LLSLMGetListingsResponder;
+ friend class LLSLMCreateListingsResponder;
+ friend class LLSLMGetListingResponder;
+ friend class LLSLMUpdateListingsResponder;
+ friend class LLSLMAssociateListingsResponder;
+ friend class LLSLMDeleteListingsResponder;
+
+ LLMarketplaceData();
+ virtual ~LLMarketplaceData();
+
+ // Public SLM API : Initialization and status
+ typedef boost::signals2::signal<void ()> status_updated_signal_t;
+ void initializeSLM(const status_updated_signal_t::slot_type& cb);
+ U32 getSLMStatus() const { return mMarketPlaceStatus; }
+ void setSLMStatus(U32 status);
+ void getSLMListings();
+ bool isEmpty() { return (mMarketplaceItems.size() == 0); }
+ void setDataFetchedSignal(const status_updated_signal_t::slot_type& cb);
+ void setSLMDataFetched(U32 status);
+ U32 getSLMDataFetched() { return mMarketPlaceDataFetched; }
+
+ // High level create/delete/set Marketplace data: each method returns true if the function succeeds, false if error
+ bool createListing(const LLUUID& folder_id);
+ bool activateListing(const LLUUID& folder_id, bool activate, S32 depth = -1);
+ bool clearListing(const LLUUID& folder_id, S32 depth = -1);
+ bool setVersionFolder(const LLUUID& folder_id, const LLUUID& version_id, S32 depth = -1);
+ bool associateListing(const LLUUID& folder_id, const LLUUID& source_folder_id, S32 listing_id);
+ bool updateCountOnHand(const LLUUID& folder_id, S32 depth = -1);
+ bool getListing(const LLUUID& folder_id, S32 depth = -1);
+ bool getListing(S32 listing_id);
+ bool deleteListing(S32 listing_id, bool update = true);
+
+ // Probe the Marketplace data set to identify folders
+ bool isListed(const LLUUID& folder_id); // returns true if folder_id is a Listing folder
+ bool isListedAndActive(const LLUUID& folder_id); // returns true if folder_id is an active (listed) Listing folder
+ bool isVersionFolder(const LLUUID& folder_id); // returns true if folder_id is a Version folder
+ bool isInActiveFolder(const LLUUID& obj_id, S32 depth = -1); // returns true if the obj_id is buried in an active version folder
+ LLUUID getActiveFolder(const LLUUID& obj_id, S32 depth = -1); // returns the UUID of the active version folder obj_id is in
+ bool isUpdating(const LLUUID& folder_id, S32 depth = -1); // returns true if we're waiting from SLM incoming data for folder_id
+
+ // Access Marketplace data set : each method returns a default value if the argument can't be found
+ bool getActivationState(const LLUUID& folder_id);
+ S32 getListingID(const LLUUID& folder_id);
+ LLUUID getVersionFolder(const LLUUID& folder_id);
+ std::string getListingURL(const LLUUID& folder_id, S32 depth = -1);
+ LLUUID getListingFolder(S32 listing_id);
+ S32 getCountOnHand(const LLUUID& folder_id);
+
+ // Used to flag if stock count values for Marketplace have to be updated
+ bool checkDirtyCount() { if (mDirtyCount) { mDirtyCount = false; return true; } else { return false; } }
+ void setDirtyCount() { mDirtyCount = true; }
+ void setUpdating(const LLUUID& folder_id, bool isUpdating);
+
+ // Used to decide when to run a validation on listing folders
+ void setValidationWaiting(const LLUUID& folder_id, S32 count);
+ void decrementValidationWaiting(const LLUUID& folder_id, S32 count = 1);
+
+private:
+ // Modify Marketplace data set : each method returns true if the function succeeds, false if error
+ // Used internally only by SLM Responders when data are received from the SLM Server
+ bool addListing(const LLUUID& folder_id, S32 listing_id, const LLUUID& version_id, bool is_listed, const std::string& edit_url, S32 count);
+ bool deleteListing(const LLUUID& folder_id, bool update = true);
+ bool setListingID(const LLUUID& folder_id, S32 listing_id, bool update = true);
+ bool setVersionFolderID(const LLUUID& folder_id, const LLUUID& version_id, bool update = true);
+ bool setActivationState(const LLUUID& folder_id, bool activate, bool update = true);
+ bool setListingURL(const LLUUID& folder_id, const std::string& edit_url, bool update = true);
+ bool setCountOnHand(const LLUUID& folder_id, S32 count, bool update = true);
+
+ // Private SLM API : package data and get/post/put requests to the SLM Server through the SLM API
+ void createSLMListing(const LLUUID& folder_id, const LLUUID& version_id, S32 count);
+ void getSLMListing(S32 listing_id);
+ void updateSLMListing(const LLUUID& folder_id, S32 listing_id, const LLUUID& version_id, bool is_listed, S32 count);
+ void associateSLMListing(const LLUUID& folder_id, S32 listing_id, const LLUUID& version_id, const LLUUID& source_folder_id);
+ void deleteSLMListing(S32 listing_id);
+ std::string getSLMConnectURL(const std::string& route);
+
+ // Handling Marketplace connection and inventory connection
+ U32 mMarketPlaceStatus;
+ status_updated_signal_t* mStatusUpdatedSignal;
+ LLInventoryObserver* mInventoryObserver;
+ bool mDirtyCount; // If true, stock count value need to be updated at the next check
+
+ // Update data
+ U32 mMarketPlaceDataFetched;
+ status_updated_signal_t* mDataFetchedSignal;
+ std::set<LLUUID> mPendingUpdateSet;
+
+ // Listing folders waiting for validation
+ typedef std::map<LLUUID,S32> waiting_list_t;
+ waiting_list_t mValidationWaitingList;
+
+ // The cache of SLM data (at last...)
+ marketplace_items_list_t mMarketplaceItems;
+ // We need a list (version folder -> listing folder) because such reverse lookups are frequent
+ version_folders_list_t mVersionFolders;
+};
+
#endif // LL_LLMARKETPLACEFUNCTIONS_H
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index b96bdd73ff..73faed7ef5 100755
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -95,6 +95,7 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
mStretchToFill( true ),
mMaintainAspectRatio ( true ),
mDecoupleTextureSize ( false ),
+ mUpdateScrolls( false ),
mTextureWidth ( 1024 ),
mTextureHeight ( 1024 ),
mClearCache(false),
@@ -682,7 +683,13 @@ bool LLMediaCtrl::ensureMediaSourceExists()
mMediaSource->addObserver( this );
mMediaSource->setBackgroundColor( getBackgroundColor() );
mMediaSource->setTrustedBrowser(mTrusted);
- mMediaSource->setPageZoomFactor( LLUI::getScaleFactor().mV[ VX ] );
+
+ F32 scale_factor = LLUI::getScaleFactor().mV[ VX ];
+ if (scale_factor != mMediaSource->getPageZoomFactor())
+ {
+ mMediaSource->setPageZoomFactor( scale_factor );
+ mUpdateScrolls = true;
+ }
if(mClearCache)
{
@@ -720,10 +727,11 @@ void LLMediaCtrl::draw()
{
F32 alpha = getDrawContext().mAlpha;
- if ( gRestoreGL == 1 )
+ if ( gRestoreGL == 1 || mUpdateScrolls)
{
LLRect r = getRect();
reshape( r.getWidth(), r.getHeight(), FALSE );
+ mUpdateScrolls = false;
return;
}
@@ -765,7 +773,12 @@ void LLMediaCtrl::draw()
{
gGL.pushUIMatrix();
{
- mMediaSource->setPageZoomFactor( LLUI::getScaleFactor().mV[ VX ] );
+ F32 scale_factor = LLUI::getScaleFactor().mV[ VX ];
+ if (scale_factor != mMediaSource->getPageZoomFactor())
+ {
+ mMediaSource->setPageZoomFactor( scale_factor );
+ mUpdateScrolls = true;
+ }
// scale texture to fit the space using texture coords
gGL.getTexUnit(0)->bind(media_texture);
@@ -970,11 +983,11 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
case MEDIA_EVENT_CLICK_LINK_HREF:
{
- LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << self->getClickTarget() << "\", uri is " << self->getClickURL() << LL_ENDL;
// retrieve the event parameters
std::string url = self->getClickURL();
- std::string target = self->getClickTarget();
+ std::string target = self->isOverrideClickTarget() ? self->getOverrideClickTarget() : self->getClickTarget();
std::string uuid = self->getClickUUID();
+ LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << target << "\", uri is " << url << LL_ENDL;
LLNotification::Params notify_params;
notify_params.name = "PopupAttempt";
diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h
index 785c57b78a..988733b85a 100755
--- a/indra/newview/llmediactrl.h
+++ b/indra/newview/llmediactrl.h
@@ -192,7 +192,8 @@ public:
mHidingInitialLoad,
mClearCache,
mHoverTextChanged,
- mDecoupleTextureSize;
+ mDecoupleTextureSize,
+ mUpdateScrolls;
std::string mHomePageUrl,
mHomePageMimeType,
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 648056484e..1841d066a2 100755
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -72,6 +72,7 @@
#include "bufferstream.h"
#include "llfasttimer.h"
#include "llcorehttputil.h"
+#include "lltrans.h"
#include "boost/lexical_cast.hpp"
@@ -492,6 +493,12 @@ void get_vertex_buffer_from_mesh(LLCDMeshData& mesh, LLModel::PhysicsMesh& res,
}
}
+LLViewerFetchedTexture* LLMeshUploadThread::FindViewerTexture(const LLImportMaterial& material)
+{
+ LLPointer< LLViewerFetchedTexture > * ppTex = static_cast< LLPointer< LLViewerFetchedTexture > * >(material.mOpaqueData);
+ return ppTex ? (*ppTex).get() : NULL;
+}
+
volatile S32 LLMeshRepoThread::sActiveHeaderRequests = 0;
volatile S32 LLMeshRepoThread::sActiveLODRequests = 0;
U32 LLMeshRepoThread::sMaxConcurrentRequests = 1;
@@ -586,16 +593,16 @@ public:
LLMeshLODHandler(const LLVolumeParams & mesh_params, S32 lod, U32 offset, U32 requested_bytes)
: LLMeshHandlerBase(offset, requested_bytes),
mLOD(lod)
- {
+ {
mMeshParams = mesh_params;
LLMeshRepoThread::incActiveLODRequests();
}
virtual ~LLMeshLODHandler();
-
+
protected:
LLMeshLODHandler(const LLMeshLODHandler &); // Not defined
void operator=(const LLMeshLODHandler &); // Not defined
-
+
public:
virtual void processData(LLCore::BufferArray * body, S32 body_offset, U8 * data, S32 data_size);
virtual void processFailure(LLCore::HttpStatus status);
@@ -693,12 +700,16 @@ void log_upload_error(LLCore::HttpStatus status, const LLSD& content,
args["MESSAGE"] = message;
args["IDENTIFIER"] = identifier;
args["LABEL"] = model_name;
- gMeshRepo.uploadError(args);
// Log details.
LL_WARNS(LOG_MESH) << "Error in stage: " << stage
<< ", Reason: " << status.toString()
<< " (" << status.toTerseString() << ")" << LL_ENDL;
+
+ std::ostringstream details;
+ typedef std::set<std::string> mav_errors_set_t;
+ mav_errors_set_t mav_errors;
+
if (content.has("error"))
{
const LLSD& err = content["error"];
@@ -708,8 +719,11 @@ void log_upload_error(LLCore::HttpStatus status, const LLSD& content,
<< "', message '" << err["message"].asString()
<< "', id '" << err["identifier"].asString()
<< "'" << LL_ENDL;
+
if (err.has("errors"))
{
+ details << std::endl << std::endl;
+
S32 error_num = 0;
const LLSD& err_list = err["errors"];
for (LLSD::array_const_iterator it = err_list.beginArray();
@@ -717,6 +731,13 @@ void log_upload_error(LLCore::HttpStatus status, const LLSD& content,
++it)
{
const LLSD& err_entry = *it;
+ std::string message = err_entry["message"];
+
+ if (message.length() > 0)
+ {
+ mav_errors.insert(message);
+ }
+
LL_WARNS(LOG_MESH) << " error[" << error_num << "]:" << LL_ENDL;
for (LLSD::map_const_iterator map_it = err_entry.beginMap();
map_it != err_entry.endMap();
@@ -733,6 +754,21 @@ void log_upload_error(LLCore::HttpStatus status, const LLSD& content,
{
LL_WARNS(LOG_MESH) << "Bad response to mesh request, no additional error information available." << LL_ENDL;
}
+
+ mav_errors_set_t::iterator mav_errors_it = mav_errors.begin();
+ for (; mav_errors_it != mav_errors.end(); ++mav_errors_it)
+ {
+ std::string mav_details = "Mav_Details_" + *mav_errors_it;
+ details << "Message: '" << *mav_errors_it << "': " << LLTrans::getString(mav_details) << std::endl << std::endl;
+ }
+
+ std::string details_str = details.str();
+ if (details_str.length() > 0)
+ {
+ args["DETAILS"] = details_str;
+ }
+
+ gMeshRepo.uploadError(args);
}
LLMeshRepoThread::LLMeshRepoThread()
@@ -766,7 +802,7 @@ LLMeshRepoThread::LLMeshRepoThread()
mHttpLargePolicyClass = app_core_http.getPolicy(LLAppCoreHttp::AP_LARGE_MESH);
}
-
+
LLMeshRepoThread::~LLMeshRepoThread()
{
LL_INFOS(LOG_MESH) << "Small GETs issued: " << LLMeshRepository::sHTTPRequestCount
@@ -835,16 +871,16 @@ void LLMeshRepoThread::run()
{
break;
}
-
+
if (! mHttpRequestSet.empty())
{
// Dispatch all HttpHandler notifications
mHttpRequest->update(0L);
}
sRequestWaterLevel = mHttpRequestSet.size(); // Stats data update
-
- // NOTE: order of queue processing intentionally favors LOD requests over header requests
+ // NOTE: order of queue processing intentionally favors LOD requests over header requests
+
while (!mLODReqQ.empty() && mHttpRequestSet.size() < sRequestHighWater)
{
if (! mMutex)
@@ -908,7 +944,7 @@ void LLMeshRepoThread::run()
mSkinRequests.erase(iter);
mMutex->unlock();
- if (!fetchMeshSkinInfo(mesh_id))
+ if (! fetchMeshSkinInfo(mesh_id))
{
incomplete.insert(mesh_id);
}
@@ -937,7 +973,7 @@ void LLMeshRepoThread::run()
mDecompositionRequests.erase(iter);
mMutex->unlock();
- if (!fetchMeshDecomposition(mesh_id))
+ if (! fetchMeshDecomposition(mesh_id))
{
incomplete.insert(mesh_id);
}
@@ -963,7 +999,7 @@ void LLMeshRepoThread::run()
mPhysicsShapeRequests.erase(iter);
mMutex->unlock();
- if (!fetchMeshPhysicsShape(mesh_id))
+ if (! fetchMeshPhysicsShape(mesh_id))
{
incomplete.insert(mesh_id);
}
@@ -1189,7 +1225,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
}
++LLMeshRepository::sMeshRequestCount;
- bool ret = true ;
+ bool ret = true;
U32 header_size = mMeshHeaderSize[mesh_id];
if (header_size > 0)
@@ -1237,7 +1273,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
constructUrl(mesh_id, &http_url, &cap_version);
if (!http_url.empty())
- {
+ {
LLMeshSkinInfoHandler * handler = new LLMeshSkinInfoHandler(mesh_id, offset, size);
LLCore::HttpHandle handle = getByteRange(http_url, cap_version, offset, size, handler);
if (LLCORE_HTTP_HANDLE_INVALID == handle)
@@ -1283,7 +1319,7 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
++LLMeshRepository::sMeshRequestCount;
U32 header_size = mMeshHeaderSize[mesh_id];
- bool ret = true ;
+ bool ret = true;
if (header_size > 0)
{
@@ -1329,9 +1365,9 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
int cap_version(2);
std::string http_url;
constructUrl(mesh_id, &http_url, &cap_version);
-
+
if (!http_url.empty())
- {
+ {
LLMeshDecompositionHandler * handler = new LLMeshDecompositionHandler(mesh_id, offset, size);
LLCore::HttpHandle handle = getByteRange(http_url, cap_version, offset, size, handler);
if (LLCORE_HTTP_HANDLE_INVALID == handle)
@@ -1377,7 +1413,7 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
++LLMeshRepository::sMeshRequestCount;
U32 header_size = mMeshHeaderSize[mesh_id];
- bool ret = true ;
+ bool ret = true;
if (header_size > 0)
{
@@ -1422,9 +1458,9 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
int cap_version(2);
std::string http_url;
constructUrl(mesh_id, &http_url, &cap_version);
-
+
if (!http_url.empty())
- {
+ {
LLMeshPhysicsShapeHandler * handler = new LLMeshPhysicsShapeHandler(mesh_id, offset, size);
LLCore::HttpHandle handle = getByteRange(http_url, cap_version, offset, size, handler);
if (LLCORE_HTTP_HANDLE_INVALID == handle)
@@ -1513,11 +1549,11 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params)
}
//either cache entry doesn't exist or is corrupt, request header from simulator
- bool retval = true ;
+ bool retval = true;
int cap_version(2);
std::string http_url;
constructUrl(mesh_params.getSculptID(), &http_url, &cap_version);
-
+
if (!http_url.empty())
{
//grab first 4KB if we're going to bother with a fetch. Cache will prevent future fetches if a full mesh fits
@@ -1605,9 +1641,9 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
int cap_version(2);
std::string http_url;
constructUrl(mesh_id, &http_url, &cap_version);
-
+
if (!http_url.empty())
- {
+ {
LLMeshLODHandler * handler = new LLMeshLODHandler(mesh_params, lod, offset, size);
LLCore::HttpHandle handle = getByteRange(http_url, cap_version, offset, size, handler);
if (LLCORE_HTTP_HANDLE_INVALID == handle)
@@ -1879,7 +1915,7 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data,
mOrigin += gAgent.getAtAxis() * scale.magVec();
- mMeshUploadTimeOut = gSavedSettings.getS32("MeshUploadTimeOut") ;
+ mMeshUploadTimeOut = gSavedSettings.getS32("MeshUploadTimeOut");
mHttpRequest = new LLCore::HttpRequest;
mHttpOptions = new LLCore::HttpOptions;
@@ -1947,14 +1983,14 @@ void LLMeshUploadThread::preStart()
void LLMeshUploadThread::discard()
{
- LLMutexLock lock(mMutex) ;
+ LLMutexLock lock(mMutex);
mDiscarded = true;
}
bool LLMeshUploadThread::isDiscarded() const
{
- LLMutexLock lock(mMutex) ;
- return mDiscarded ;
+ LLMutexLock lock(mMutex);
+ return mDiscarded;
}
void LLMeshUploadThread::run()
@@ -2019,6 +2055,14 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
{
LLMeshUploadData data;
data.mBaseModel = iter->first;
+
+ if (data.mBaseModel->mSubmodelID)
+ {
+ // These are handled below to insure correct parenting order on creation
+ // due to map walking being based on model address (aka random)
+ continue;
+ }
+
LLModelInstance& first_instance = *(iter->second.begin());
for (S32 i = 0; i < 5; i++)
{
@@ -2056,7 +2100,10 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
data.mModel[LLModel::LOD_IMPOSTOR],
decomp,
mUploadSkin,
- mUploadJoints);
+ mUploadJoints,
+ FALSE,
+ FALSE,
+ data.mBaseModel->mSubmodelID);
data.mAssetData = ostr.str();
std::string str = ostr.str();
@@ -2090,17 +2137,26 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
instance_entry["scale"] = ll_sd_from_vector3(scale);
instance_entry["material"] = LL_MCODE_WOOD;
- instance_entry["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
+ instance_entry["physics_shape_type"] = data.mModel[LLModel::LOD_PHYSICS].notNull() ? (U8)(LLViewerObject::PHYSICS_SHAPE_PRIM) : (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
instance_entry["mesh"] = mesh_index[data.mBaseModel];
instance_entry["face_list"] = LLSD::emptyArray();
- S32 end = llmin((S32)data.mBaseModel->mMaterialList.size(), data.mBaseModel->getNumVolumeFaces()) ;
+ // We want to be able to allow more than 8 materials...
+ //
+ S32 end = llmin((S32)instance.mMaterial.size(), instance.mModel->getNumVolumeFaces()) ;
+
for (S32 face_num = 0; face_num < end; face_num++)
{
LLImportMaterial& material = instance.mMaterial[data.mBaseModel->mMaterialList[face_num]];
LLSD face_entry = LLSD::emptyMap();
- LLViewerFetchedTexture *texture = material.mDiffuseMap.get();
+
+ LLViewerFetchedTexture *texture = NULL;
+
+ if (material.mDiffuseMapFilename.size())
+ {
+ texture = FindViewerTexture(material);
+ }
if ((texture != NULL) &&
(textures.find(texture) == textures.end()))
@@ -2115,9 +2171,171 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
{
LLPointer<LLImageJ2C> upload_file =
LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage());
+
+ if (!upload_file.isNull() && upload_file->getDataSize())
+ {
texture_str.write((const char*) upload_file->getData(), upload_file->getDataSize());
}
}
+ }
+
+ if (texture != NULL &&
+ mUploadTextures &&
+ texture_index.find(texture) == texture_index.end())
+ {
+ texture_index[texture] = texture_num;
+ std::string str = texture_str.str();
+ res["texture_list"][texture_num] = LLSD::Binary(str.begin(),str.end());
+ texture_num++;
+ }
+
+ // Subset of TextureEntry fields.
+ if (texture != NULL && mUploadTextures)
+ {
+ face_entry["image"] = texture_index[texture];
+ face_entry["scales"] = 1.0;
+ face_entry["scalet"] = 1.0;
+ face_entry["offsets"] = 0.0;
+ face_entry["offsett"] = 0.0;
+ face_entry["imagerot"] = 0.0;
+ }
+ face_entry["diffuse_color"] = ll_sd_from_color4(material.mDiffuseColor);
+ face_entry["fullbright"] = material.mFullbright;
+ instance_entry["face_list"][face_num] = face_entry;
+ }
+
+ res["instance_list"][instance_num] = instance_entry;
+ instance_num++;
+ }
+ }
+
+ for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
+ {
+ LLMeshUploadData data;
+ data.mBaseModel = iter->first;
+
+ if (!data.mBaseModel->mSubmodelID)
+ {
+ // These were handled above already...
+ //
+ continue;
+ }
+
+ LLModelInstance& first_instance = *(iter->second.begin());
+ for (S32 i = 0; i < 5; i++)
+ {
+ data.mModel[i] = first_instance.mLOD[i];
+ }
+
+ if (mesh_index.find(data.mBaseModel) == mesh_index.end())
+ {
+ // Have not seen this model before - create a new mesh_list entry for it.
+ if (model_name.empty())
+ {
+ model_name = data.mBaseModel->getName();
+ }
+
+ if (model_metric.empty())
+ {
+ model_metric = data.mBaseModel->getMetric();
+ }
+
+ std::stringstream ostr;
+
+ LLModel::Decomposition& decomp =
+ data.mModel[LLModel::LOD_PHYSICS].notNull() ?
+ data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
+ data.mBaseModel->mPhysics;
+
+ decomp.mBaseHull = mHullMap[data.mBaseModel];
+
+ LLSD mesh_header = LLModel::writeModel(
+ ostr,
+ data.mModel[LLModel::LOD_PHYSICS],
+ data.mModel[LLModel::LOD_HIGH],
+ data.mModel[LLModel::LOD_MEDIUM],
+ data.mModel[LLModel::LOD_LOW],
+ data.mModel[LLModel::LOD_IMPOSTOR],
+ decomp,
+ mUploadSkin,
+ mUploadJoints,
+ FALSE,
+ FALSE,
+ data.mBaseModel->mSubmodelID);
+
+ data.mAssetData = ostr.str();
+ std::string str = ostr.str();
+
+ res["mesh_list"][mesh_num] = LLSD::Binary(str.begin(),str.end());
+ mesh_index[data.mBaseModel] = mesh_num;
+ mesh_num++;
+ }
+
+ // For all instances that use this model
+ for (instance_list::iterator instance_iter = iter->second.begin();
+ instance_iter != iter->second.end();
+ ++instance_iter)
+ {
+
+ LLModelInstance& instance = *instance_iter;
+
+ LLSD instance_entry;
+
+ for (S32 i = 0; i < 5; i++)
+ {
+ data.mModel[i] = instance.mLOD[i];
+ }
+
+ LLVector3 pos, scale;
+ LLQuaternion rot;
+ LLMatrix4 transformation = instance.mTransform;
+ decomposeMeshMatrix(transformation,pos,rot,scale);
+ instance_entry["position"] = ll_sd_from_vector3(pos);
+ instance_entry["rotation"] = ll_sd_from_quaternion(rot);
+ instance_entry["scale"] = ll_sd_from_vector3(scale);
+
+ instance_entry["material"] = LL_MCODE_WOOD;
+ instance_entry["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_NONE);
+ instance_entry["mesh"] = mesh_index[data.mBaseModel];
+
+ instance_entry["face_list"] = LLSD::emptyArray();
+
+ // We want to be able to allow more than 8 materials...
+ //
+ S32 end = llmin((S32)instance.mMaterial.size(), instance.mModel->getNumVolumeFaces()) ;
+
+ for (S32 face_num = 0; face_num < end; face_num++)
+ {
+ LLImportMaterial& material = instance.mMaterial[data.mBaseModel->mMaterialList[face_num]];
+ LLSD face_entry = LLSD::emptyMap();
+
+ LLViewerFetchedTexture *texture = NULL;
+
+ if (material.mDiffuseMapFilename.size())
+ {
+ texture = FindViewerTexture(material);
+ }
+
+ if ((texture != NULL) &&
+ (textures.find(texture) == textures.end()))
+ {
+ textures.insert(texture);
+ }
+
+ std::stringstream texture_str;
+ if (texture != NULL && include_textures && mUploadTextures)
+ {
+ if(texture->hasSavedRawImage())
+ {
+ LLPointer<LLImageJ2C> upload_file =
+ LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage());
+
+ if (!upload_file.isNull() && upload_file->getDataSize())
+ {
+ texture_str.write((const char*) upload_file->getData(), upload_file->getDataSize());
+ }
+ }
+ }
if (texture != NULL &&
mUploadTextures &&
@@ -2205,7 +2423,7 @@ void LLMeshUploadThread::generateHulls()
}
}
- if(has_valid_requests)
+ if (has_valid_requests)
{
// *NOTE: Interesting livelock condition on shutdown. If there
// is an upload request in generateHulls() when shutdown starts,
@@ -2310,7 +2528,7 @@ void LLMeshUploadThread::requestWholeModelFee()
else
{
U32 sleep_time(10);
-
+
mHttpRequest->update(0);
while (! LLApp::isQuitting() && ! finished() && ! isDiscarded())
{
@@ -2405,7 +2623,7 @@ void LLMeshUploadThread::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResp
// model fee case
LLWholeModelFeeObserver* observer(mFeeObserverHandle.get());
mWholeModelUploadURL.clear();
-
+
if (! status)
{
LL_WARNS(LOG_MESH) << "Fee request failed. Reason: " << reason
@@ -2435,7 +2653,7 @@ void LLMeshUploadThread::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResp
LLCoreHttpUtil::responseToLLSD(response, true, body);
}
dump_llsd_to_file(body, make_dump_name("whole_model_fee_response_", dump_num));
-
+
if (body["state"].asString() == "upload")
{
mWholeModelUploadURL = body["uploader"].asString();
@@ -2506,7 +2724,7 @@ void LLMeshRepoThread::notifyLoadedMeshes()
LODRequest req = mUnavailableQ.front();
mUnavailableQ.pop();
mMutex->unlock();
-
+
update_metrics = true;
gMeshRepo.notifyMeshUnavailable(req.mMeshParams, req.mLOD);
}
@@ -2642,7 +2860,7 @@ void LLMeshRepository::cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header)
void LLMeshHandlerBase::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response)
{
mProcessed = true;
-
+
unsigned int retries(0U);
response->getRetries(NULL, &retries);
LLMeshRepository::sHTTPRetryCount += retries;
@@ -2698,7 +2916,7 @@ void LLMeshHandlerBase::onCompleted(LLCore::HttpHandle handle, LLCore::HttpRespo
// 200 case, typically
offset = 0;
}
-
+
// *DEBUG: To test validation below
// offset += 1;
@@ -2814,7 +3032,7 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
const std::string & lod_name = header_lod[i];
lod_bytes = llmax(lod_bytes, header[lod_name]["offset"].asInteger()+header[lod_name]["size"].asInteger());
}
-
+
// just in case skin info or decomposition is at the end of the file (which it shouldn't be)
lod_bytes = llmax(lod_bytes, header["skin"]["offset"].asInteger() + header["skin"]["size"].asInteger());
lod_bytes = llmax(lod_bytes, header["physics_convex"]["offset"].asInteger() + header["physics_convex"]["size"].asInteger());
@@ -2822,7 +3040,7 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
S32 header_bytes = (S32) gMeshRepo.mThread->mMeshHeaderSize[mesh_id];
S32 bytes = lod_bytes + header_bytes;
-
+
// It's possible for the remote asset to have more data than is needed for the local cache
// only allocate as much space in the VFS as is needed for the local cache
data_size = llmin(data_size, bytes);
@@ -2834,11 +3052,11 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
++LLMeshRepository::sCacheWrites;
file.write(data, data_size);
-
+
// zero out the rest of the file
U8 block[MESH_HEADER_SIZE];
memset(block, 0, sizeof(block));
-
+
while (bytes-file.tell() > sizeof(block))
{
file.write(block, sizeof(block));
@@ -2864,8 +3082,8 @@ LLMeshLODHandler::~LLMeshLODHandler()
gMeshRepo.mThread->lockAndLoadMeshLOD(mMeshParams, mLOD);
}
LLMeshRepoThread::decActiveLODRequests();
- }
}
+}
void LLMeshLODHandler::processFailure(LLCore::HttpStatus status)
{
@@ -2883,7 +3101,7 @@ void LLMeshLODHandler::processData(LLCore::BufferArray * /* body */, S32 /* body
{
if ((! MESH_LOD_PROCESS_FAILED) && gMeshRepo.mThread->lodReceived(mMeshParams, mLOD, data, data_size))
{
- //good fetch from sim, write to VFS for caching
+ // good fetch from sim, write to VFS for caching
LLVFile file(gVFS, mMeshParams.getSculptID(), LLAssetType::AT_MESH, LLVFile::WRITE);
S32 offset = mOffset;
@@ -2909,7 +3127,10 @@ void LLMeshLODHandler::processData(LLCore::BufferArray * /* body */, S32 /* body
LLMeshSkinInfoHandler::~LLMeshSkinInfoHandler()
{
- llassert(mProcessed);
+ if (!mProcessed)
+ {
+ LL_WARNS(LOG_MESH) << "deleting unprocessed request handler (may be ok on exit)" << LL_ENDL;
+ }
}
void LLMeshSkinInfoHandler::processFailure(LLCore::HttpStatus status)
@@ -2928,7 +3149,7 @@ void LLMeshSkinInfoHandler::processData(LLCore::BufferArray * /* body */, S32 /*
{
if ((! MESH_SKIN_INFO_PROCESS_FAILED) && gMeshRepo.mThread->skinInfoReceived(mMeshID, data, data_size))
{
- //good fetch from sim, write to VFS for caching
+ // good fetch from sim, write to VFS for caching
LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
S32 offset = mOffset;
@@ -2953,7 +3174,10 @@ void LLMeshSkinInfoHandler::processData(LLCore::BufferArray * /* body */, S32 /*
LLMeshDecompositionHandler::~LLMeshDecompositionHandler()
{
- llassert(mProcessed);
+ if (!mProcessed)
+ {
+ LL_WARNS(LOG_MESH) << "deleting unprocessed request handler (may be ok on exit)" << LL_ENDL;
+ }
}
void LLMeshDecompositionHandler::processFailure(LLCore::HttpStatus status)
@@ -2996,7 +3220,10 @@ void LLMeshDecompositionHandler::processData(LLCore::BufferArray * /* body */, S
LLMeshPhysicsShapeHandler::~LLMeshPhysicsShapeHandler()
{
- llassert(mProcessed);
+ if (!mProcessed)
+ {
+ LL_WARNS(LOG_MESH) << "deleting unprocessed request handler (may be ok on exit)" << LL_ENDL;
+ }
}
void LLMeshPhysicsShapeHandler::processFailure(LLCore::HttpStatus status)
@@ -3252,7 +3479,7 @@ void LLMeshRepository::notifyLoadedMeshes()
REQUEST2_LOW_WATER_MIN,
REQUEST2_LOW_WATER_MAX);
}
-
+
//clean up completed upload threads
for (std::vector<LLMeshUploadThread*>::iterator iter = mUploads.begin(); iter != mUploads.end(); )
{
@@ -3329,7 +3556,7 @@ void LLMeshRepository::notifyLoadedMeshes()
//call completed callbacks on finished decompositions
mDecompThread->notifyCompleted();
-
+
// For major operations, attempt to get the required locks
// without blocking and punt if they're not available. The
// longest run of holdoffs is kept in sMaxLockHoldoffs just
@@ -3348,12 +3575,12 @@ void LLMeshRepository::notifyLoadedMeshes()
return;
}
hold_offs = 0;
-
+
if (gAgent.getRegion())
{
// Update capability urls
static std::string region_name("never name a region this");
-
+
if (gAgent.getRegion()->getName() != region_name && gAgent.getRegion()->capabilitiesReceived())
{
region_name = gAgent.getRegion()->getName();
@@ -3369,7 +3596,7 @@ void LLMeshRepository::notifyLoadedMeshes()
<< LL_ENDL;
}
}
-
+
//popup queued error messages from background threads
while (!mUploadErrorQ.empty())
{
@@ -3724,7 +3951,7 @@ LLSD& LLMeshRepoThread::getMeshHeader(const LLUUID& mesh_id)
void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
- bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload,
+ bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload,
LLHandle<LLWholeModelFeeObserver> fee_observer, LLHandle<LLWholeModelUploadObserver> upload_observer)
{
LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures, upload_skin, upload_joints, upload_url,
@@ -3795,37 +4022,6 @@ void LLMeshUploadThread::decomposeMeshMatrix(LLMatrix4& transformation,
result_rot = quat_rotation;
}
-bool LLImportMaterial::operator<(const LLImportMaterial &rhs) const
-{
- if (mDiffuseMap != rhs.mDiffuseMap)
- {
- return mDiffuseMap < rhs.mDiffuseMap;
- }
-
- if (mDiffuseMapFilename != rhs.mDiffuseMapFilename)
- {
- return mDiffuseMapFilename < rhs.mDiffuseMapFilename;
- }
-
- if (mDiffuseMapLabel != rhs.mDiffuseMapLabel)
- {
- return mDiffuseMapLabel < rhs.mDiffuseMapLabel;
- }
-
- if (mDiffuseColor != rhs.mDiffuseColor)
- {
- return mDiffuseColor < rhs.mDiffuseColor;
- }
-
- if (mBinding != rhs.mBinding)
- {
- return mBinding < rhs.mBinding;
- }
-
- return mFullbright < rhs.mFullbright;
-}
-
-
void LLMeshRepository::updateInventory(inventory_data data)
{
LLMutexLock lock(mMeshMutex);
@@ -4223,7 +4419,7 @@ void LLPhysicsDecomp::doDecompositionSingleHull()
setMeshData(mesh, true);
LLCDResult ret = decomp->buildSingleHull() ;
- if(ret)
+ if (ret)
{
LL_WARNS(LOG_MESH) << "Could not execute decomposition stage when attempting to create single hull." << LL_ENDL;
make_box(mCurRequest);
@@ -4411,60 +4607,6 @@ void LLPhysicsDecomp::Request::setStatusMessage(const std::string& msg)
mStatusMessage = msg;
}
-LLModelInstance::LLModelInstance(LLSD& data)
-{
- mLocalMeshID = data["mesh_id"].asInteger();
- mLabel = data["label"].asString();
- mTransform.setValue(data["transform"]);
-
- for (U32 i = 0; i < data["material"].size(); ++i)
- {
- LLImportMaterial mat(data["material"][i]);
- mMaterial[mat.mBinding] = mat;
- }
-}
-
-
-LLSD LLModelInstance::asLLSD()
-{
- LLSD ret;
-
- ret["mesh_id"] = mModel->mLocalID;
- ret["label"] = mLabel;
- ret["transform"] = mTransform.getValue();
-
- U32 i = 0;
- for (std::map<std::string, LLImportMaterial>::iterator iter = mMaterial.begin(); iter != mMaterial.end(); ++iter)
- {
- ret["material"][i++] = iter->second.asLLSD();
- }
-
- return ret;
-}
-
-LLImportMaterial::LLImportMaterial(LLSD& data)
-{
- mDiffuseMapFilename = data["diffuse"]["filename"].asString();
- mDiffuseMapLabel = data["diffuse"]["label"].asString();
- mDiffuseColor.setValue(data["diffuse"]["color"]);
- mFullbright = data["fullbright"].asBoolean();
- mBinding = data["binding"].asString();
-}
-
-
-LLSD LLImportMaterial::asLLSD()
-{
- LLSD ret;
-
- ret["diffuse"]["filename"] = mDiffuseMapFilename;
- ret["diffuse"]["label"] = mDiffuseMapLabel;
- ret["diffuse"]["color"] = mDiffuseColor.getValue();
- ret["fullbright"] = mFullbright;
- ret["binding"] = mBinding;
-
- return ret;
-}
-
void LLMeshRepository::buildPhysicsMesh(LLModel::Decomposition& decomp)
{
decomp.mMesh.resize(decomp.mHull.size());
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index 39280bea3a..688cd01a87 100755
--- a/indra/newview/llmeshrepository.h
+++ b/indra/newview/llmeshrepository.h
@@ -90,54 +90,6 @@ public:
}
};
-class LLImportMaterial
-{
-public:
- LLPointer<LLViewerFetchedTexture> mDiffuseMap;
- std::string mDiffuseMapFilename;
- std::string mDiffuseMapLabel;
- std::string mBinding;
- LLColor4 mDiffuseColor;
- bool mFullbright;
-
- bool operator<(const LLImportMaterial &params) const;
-
- LLImportMaterial()
- : mFullbright(false)
- {
- mDiffuseColor.set(1,1,1,1);
- }
-
- LLImportMaterial(LLSD& data);
-
- LLSD asLLSD();
-};
-
-class LLModelInstance
-{
-public:
- LLPointer<LLModel> mModel;
- LLPointer<LLModel> mLOD[5];
-
- std::string mLabel;
-
- LLUUID mMeshID;
- S32 mLocalMeshID;
-
- LLMatrix4 mTransform;
- std::map<std::string, LLImportMaterial> mMaterial;
-
- LLModelInstance(LLModel* model, const std::string& label, LLMatrix4& transform, std::map<std::string, LLImportMaterial>& materials)
- : mModel(model), mLabel(label), mTransform(transform), mMaterial(materials)
- {
- mLocalMeshID = -1;
- }
-
- LLModelInstance(LLSD& data);
-
- LLSD asLLSD();
-};
-
class LLPhysicsDecomp : public LLThread
{
public:
@@ -483,6 +435,8 @@ public:
// Inherited from LLCore::HttpHandler
virtual void onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response);
+ LLViewerFetchedTexture* FindViewerTexture(const LLImportMaterial& material);
+
private:
LLHandle<LLWholeModelFeeObserver> mFeeObserverHandle;
LLHandle<LLWholeModelUploadObserver> mUploadObserverHandle;
diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index fe562baf96..70035bcc74 100755
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -303,7 +303,15 @@ void LLFloaterMove::onFlyButtonClick()
void LLFloaterMove::setMovementMode(const EMovementMode mode)
{
mCurrentMode = mode;
- gAgent.setFlying(MM_FLY == mode);
+
+ if(MM_FLY == mode)
+ {
+ LLAgent::toggleFlying();
+ }
+ else
+ {
+ gAgent.setFlying(FALSE);
+ }
// attempts to set avatar flying can not set it real flying in some cases.
// For ex. when avatar fell down & is standing up.
diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp
index 65ac11092c..1616660af0 100755
--- a/indra/newview/llmutelist.cpp
+++ b/indra/newview/llmutelist.cpp
@@ -218,6 +218,7 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)
if ((mute.mType == LLMute::AGENT)
&& isLinden(mute.mName) && (flags & LLMute::flagTextChat || flags == 0))
{
+ LL_WARNS() << "Trying to mute a Linden; ignored" << LL_ENDL;
LLNotifications::instance().add("MuteLinden", LLSD(), LLSD());
return FALSE;
}
@@ -226,6 +227,7 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)
if (mute.mType == LLMute::AGENT
&& mute.mID == gAgent.getID())
{
+ LL_WARNS() << "Trying to self; ignored" << LL_ENDL;
return FALSE;
}
@@ -256,6 +258,7 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)
}
else
{
+ LL_INFOS() << "duplicate mute ignored" << LL_ENDL;
// was duplicate
return FALSE;
}
@@ -646,6 +649,22 @@ BOOL LLMuteList::isMuted(const LLUUID& id, const std::string& name, U32 flags) c
return legacy_it != mLegacyMutes.end();
}
+BOOL LLMuteList::isMuted(const std::string& username, U32 flags) const
+{
+ mute_set_t::const_iterator mute_iter = mMutes.begin();
+ while(mute_iter != mMutes.end())
+ {
+ // can't convert "leha.test" into "LeHa TesT" so username comparison is more reliable
+ if (mute_iter->mType == LLMute::AGENT
+ && LLCacheName::buildUsername(mute_iter->mName) == username)
+ {
+ return TRUE;
+ }
+ mute_iter++;
+ }
+ return FALSE;
+}
+
//-----------------------------------------------------------------------------
// requestFromServer()
//-----------------------------------------------------------------------------
diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h
index 3e998b4f0e..4e7b6ee880 100755
--- a/indra/newview/llmutelist.h
+++ b/indra/newview/llmutelist.h
@@ -101,7 +101,10 @@ public:
// Name is required to test against legacy text-only mutes.
BOOL isMuted(const LLUUID& id, const std::string& name = LLStringUtil::null, U32 flags = 0) const;
-
+
+ // Workaround for username-based mute search, a lot of string conversions so use cautiously
+ BOOL isMuted(const std::string& username, U32 flags = 0) const;
+
// Alternate (convenience) form for places we don't need to pass the name, but do need flags
BOOL isMuted(const LLUUID& id, U32 flags) const { return isMuted(id, LLStringUtil::null, flags); };
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 54e4c6c1da..5510598ae7 100755
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -70,7 +70,7 @@ LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p)
// public
LLScrollListItem* LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos,
- BOOL enabled, const std::string& suffix)
+ BOOL enabled, const std::string& suffix, const std::string& prefix)
{
//LL_INFOS() << "LLNameListCtrl::addNameItem " << agent_id << LL_ENDL;
@@ -79,7 +79,7 @@ LLScrollListItem* LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPositi
item.enabled = enabled;
item.target = INDIVIDUAL;
- return addNameItemRow(item, pos, suffix);
+ return addNameItemRow(item, pos, suffix, prefix);
}
// virtual, public
@@ -130,8 +130,14 @@ BOOL LLNameListCtrl::handleDragAndDrop(
return handled;
}
-void LLNameListCtrl::showInspector(const LLUUID& avatar_id, bool is_group)
+void LLNameListCtrl::showInspector(const LLUUID& avatar_id, bool is_group, bool is_experience)
{
+ if(is_experience)
+ {
+ LLFloaterReg::showInstance("experience_profile", avatar_id, true);
+ return;
+ }
+
if (is_group)
LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", avatar_id));
else
@@ -230,10 +236,11 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
// Should we show a group or an avatar inspector?
bool is_group = hit_item->isGroup();
+ bool is_experience = hit_item->isExperience();
LLToolTip::Params params;
params.background_visible( false );
- params.click_callback( boost::bind(&LLNameListCtrl::showInspector, this, avatar_id, is_group) );
+ params.click_callback( boost::bind(&LLNameListCtrl::showInspector, this, avatar_id, is_group, is_experience) );
params.delay_time(0.0f); // spawn instantly on hover
params.image( icon );
params.message("");
@@ -291,10 +298,11 @@ LLScrollListItem* LLNameListCtrl::addElement(const LLSD& element, EAddPosition p
LLScrollListItem* LLNameListCtrl::addNameItemRow(
const LLNameListCtrl::NameItem& name_item,
EAddPosition pos,
- const std::string& suffix)
+ const std::string& suffix,
+ const std::string& prefix)
{
LLUUID id = name_item.value().asUUID();
- LLNameListItem* item = new LLNameListItem(name_item,name_item.target() == GROUP);
+ LLNameListItem* item = new LLNameListItem(name_item,name_item.target() == GROUP, name_item.target() == EXPERIENCE);
if (!item) return NULL;
@@ -352,6 +360,8 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(
}
break;
}
+ case EXPERIENCE:
+ // just use supplied name
default:
break;
}
@@ -365,7 +375,7 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(
LLScrollListCell* cell = item->getColumn(mNameColumnIndex);
if (cell)
{
- cell->setValue(fullname);
+ cell->setValue(prefix + fullname);
}
dirtyColumns();
diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h
index 2c40eeaaca..19ce3c7aed 100755
--- a/indra/newview/llnamelistctrl.h
+++ b/indra/newview/llnamelistctrl.h
@@ -44,22 +44,30 @@ class LLNameListItem : public LLScrollListItem, public LLHandleProvider<LLNameLi
public:
bool isGroup() const { return mIsGroup; }
void setIsGroup(bool is_group) { mIsGroup = is_group; }
+ bool isExperience() const { return mIsExperience; }
+ void setIsExperience(bool is_experience) { mIsExperience = is_experience; }
protected:
friend class LLNameListCtrl;
LLNameListItem( const LLScrollListItem::Params& p )
- : LLScrollListItem(p), mIsGroup(false)
+ : LLScrollListItem(p), mIsGroup(false), mIsExperience(false)
{
}
LLNameListItem( const LLScrollListItem::Params& p, bool is_group )
- : LLScrollListItem(p), mIsGroup(is_group)
+ : LLScrollListItem(p), mIsGroup(is_group), mIsExperience(false)
+ {
+ }
+
+ LLNameListItem( const LLScrollListItem::Params& p, bool is_group, bool is_experience )
+ : LLScrollListItem(p), mIsGroup(is_group), mIsExperience(is_experience)
{
}
private:
bool mIsGroup;
+ bool mIsExperience;
};
@@ -73,7 +81,8 @@ public:
{
INDIVIDUAL,
GROUP,
- SPECIAL
+ SPECIAL,
+ EXPERIENCE
} ENameType;
// provide names for enums
@@ -129,11 +138,12 @@ public:
// Add a user to the list by name. It will be added, the name
// requested from the cache, and updated as necessary.
LLScrollListItem* addNameItem(const LLUUID& agent_id, EAddPosition pos = ADD_BOTTOM,
- BOOL enabled = TRUE, const std::string& suffix = LLStringUtil::null);
+ BOOL enabled = TRUE, const std::string& suffix = LLStringUtil::null, const std::string& prefix = LLStringUtil::null);
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);
+ LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, const std::string& suffix = LLStringUtil::null,
+ const std::string& prefix = LLStringUtil::null);
// Add a user to the list by name. It will be added, the name
// requested from the cache, and updated as necessary.
@@ -159,7 +169,7 @@ public:
/*virtual*/ void mouseOverHighlightNthItem( S32 index );
private:
- void showInspector(const LLUUID& avatar_id, bool is_group);
+ void showInspector(const LLUUID& avatar_id, bool is_group, bool is_experience = false);
void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, std::string suffix, LLHandle<LLNameListItem> item);
private:
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index d7e7f13e87..5fc73c67d1 100755
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -96,13 +96,13 @@ LLNetMap::LLNetMap (const Params & p)
mToolTipMsg(),
mPopupMenu(NULL)
{
+ mScale = gSavedSettings.getF32("MiniMapScale");
+ mPixelsPerMeter = mScale / REGION_WIDTH_METERS;
mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS);
- setScale(gSavedSettings.getF32("MiniMapScale"));
}
LLNetMap::~LLNetMap()
{
- gSavedSettings.setF32("MiniMapScale", mScale);
}
BOOL LLNetMap::postBuild()
@@ -137,6 +137,8 @@ void LLNetMap::setScale( F32 scale )
mPixelsPerMeter = mScale / REGION_WIDTH_METERS;
mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS);
+ gSavedSettings.setF32("MiniMapScale", mScale);
+
mUpdateNow = true;
}
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index bff4efa9ea..3e7f05b5e1 100755
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -169,7 +169,9 @@ public:
virtual ~LLScriptHandler();
virtual void onDelete(LLNotificationPtr p);
+ virtual void onChange(LLNotificationPtr p);
virtual bool processNotification(const LLNotificationPtr& p);
+ virtual void addToastWithNotification(const LLNotificationPtr& p);
protected:
virtual void onDeleteToast(LLToast* toast);
diff --git a/indra/newview/llnotificationlistitem.cpp b/indra/newview/llnotificationlistitem.cpp
new file mode 100644
index 0000000000..8cdc2d7c0b
--- /dev/null
+++ b/indra/newview/llnotificationlistitem.cpp
@@ -0,0 +1,645 @@
+/**
+ * @file llnotificationlistitem.cpp
+ * @brief
+ *
+ * $LicenseInfo:firstyear=2015&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2015, 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 "llnotificationlistitem.h"
+
+#include "llagent.h"
+#include "llgroupactions.h"
+#include "llinventoryicon.h"
+#include "llwindow.h"
+#include "v4color.h"
+#include "lltrans.h"
+#include "lluicolortable.h"
+#include "message.h"
+#include "llnotificationsutil.h"
+#include <boost/regex.hpp>
+
+LLNotificationListItem::LLNotificationListItem(const Params& p) : LLPanel(p),
+ mParams(p),
+ mTitleBox(NULL),
+ mExpandBtn(NULL),
+ mCondenseBtn(NULL),
+ mCloseBtn(NULL),
+ mCondensedViewPanel(NULL),
+ mExpandedViewPanel(NULL),
+ mCondensedHeight(0),
+ mExpandedHeight(0),
+ mExpandedHeightResize(0),
+ mExpanded(false)
+{
+ mNotificationName = p.notification_name;
+}
+
+BOOL LLNotificationListItem::postBuild()
+{
+ BOOL rv = LLPanel::postBuild();
+ mTitleBox = getChild<LLTextBox>("notification_title");
+ mTitleBoxExp = getChild<LLTextBox>("notification_title_exp");
+ mNoticeTextExp = getChild<LLChatEntry>("notification_text_exp");
+
+ mTimeBox = getChild<LLTextBox>("notification_time");
+ mTimeBoxExp = getChild<LLTextBox>("notification_time_exp");
+ mExpandBtn = getChild<LLButton>("expand_btn");
+ mCondenseBtn = getChild<LLButton>("condense_btn");
+ mCloseBtn = getChild<LLButton>("close_btn");
+ mCloseBtnExp = getChild<LLButton>("close_expanded_btn");
+
+ mTitleBox->setValue(mParams.title);
+ mTitleBoxExp->setValue(mParams.title);
+ mNoticeTextExp->setValue(mParams.title);
+ mNoticeTextExp->setEnabled(FALSE);
+ mNoticeTextExp->setTextExpandedCallback(boost::bind(&LLNotificationListItem::reshapeNotification, this));
+
+ mTitleBox->setContentTrusted(false);
+ mTitleBoxExp->setContentTrusted(false);
+ mNoticeTextExp->setContentTrusted(false);
+
+ mTimeBox->setValue(buildNotificationDate(mParams.time_stamp));
+ mTimeBoxExp->setValue(buildNotificationDate(mParams.time_stamp));
+
+ mExpandBtn->setClickedCallback(boost::bind(&LLNotificationListItem::onClickExpandBtn,this));
+ mCondenseBtn->setClickedCallback(boost::bind(&LLNotificationListItem::onClickCondenseBtn,this));
+
+ //mCloseBtn and mCloseExpandedBtn share the same callback
+ mCloseBtn->setClickedCallback(boost::bind(&LLNotificationListItem::onClickCloseBtn,this));
+ mCloseBtnExp->setClickedCallback(boost::bind(&LLNotificationListItem::onClickCloseBtn,this));
+
+ mCondensedViewPanel = getChild<LLPanel>("layout_panel_condensed_view");
+ mExpandedViewPanel = getChild<LLPanel>("layout_panel_expanded_view");
+
+ std::string expanded_height_str = getString("item_expanded_height");
+ std::string condensed_height_str = getString("item_condensed_height");
+
+ mExpandedHeight = (S32)atoi(expanded_height_str.c_str());
+ mCondensedHeight = (S32)atoi(condensed_height_str.c_str());
+
+ setExpanded(FALSE);
+
+ return rv;
+}
+
+LLNotificationListItem::~LLNotificationListItem()
+{
+}
+
+//static
+std::string LLNotificationListItem::buildNotificationDate(const LLDate& time_stamp, ETimeType time_type)
+{
+ std::string timeStr;
+ switch(time_type)
+ {
+ case Local:
+ timeStr = "[" + LLTrans::getString("LTimeMthNum") + "]/["
+ +LLTrans::getString("LTimeDay")+"]/["
+ +LLTrans::getString("LTimeYear")+"] ["
+ +LLTrans::getString("LTimeHour")+"]:["
+ +LLTrans::getString("LTimeMin")+ "]";
+ break;
+ case UTC:
+ timeStr = "[" + LLTrans::getString("UTCTimeMth") + "]/["
+ +LLTrans::getString("UTCTimeDay")+"]/["
+ +LLTrans::getString("UTCTimeYr")+"] ["
+ +LLTrans::getString("UTCTimeHr")+"]:["
+ +LLTrans::getString("UTCTimeMin")+"] ["
+ +LLTrans::getString("UTCTimeTimezone")+"]";
+ break;
+ case SLT:
+ default:
+ timeStr = "[" + LLTrans::getString("TimeMonth") + "]/["
+ +LLTrans::getString("TimeDay")+"]/["
+ +LLTrans::getString("TimeYear")+"] ["
+ +LLTrans::getString("TimeHour")+"]:["
+ +LLTrans::getString("TimeMin")+"]";
+ break;
+ }
+ LLSD substitution;
+ substitution["datetime"] = time_stamp;
+ LLStringUtil::format(timeStr, substitution);
+ return timeStr;
+}
+
+void LLNotificationListItem::onClickCloseBtn()
+{
+ mOnItemClose(this);
+ close();
+}
+
+BOOL LLNotificationListItem::handleMouseUp(S32 x, S32 y, MASK mask)
+{
+ BOOL res = LLPanel::handleMouseUp(x, y, mask);
+ mOnItemClick(this);
+ return res;
+}
+
+void LLNotificationListItem::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ mCondensedViewPanel->setTransparentColor(LLUIColorTable::instance().getColor( "ScrollHoveredColor" ));
+ mExpandedViewPanel->setTransparentColor(LLUIColorTable::instance().getColor( "ScrollHoveredColor" ));
+}
+
+void LLNotificationListItem::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ mCondensedViewPanel->setTransparentColor(LLUIColorTable::instance().getColor( "SysWellItemUnselected" ));
+ mExpandedViewPanel->setTransparentColor(LLUIColorTable::instance().getColor( "SysWellItemUnselected" ));
+}
+
+//static
+LLNotificationListItem* LLNotificationListItem::create(const Params& p)
+{
+ if (LLNotificationListItem::getGroupInviteTypes().count(p.notification_name))
+ {
+ return new LLGroupInviteNotificationListItem(p);
+ }
+ else if (LLNotificationListItem::getGroupNoticeTypes().count(p.notification_name))
+ {
+ return new LLGroupNoticeNotificationListItem(p);
+ }
+ else if (LLNotificationListItem::getTransactionTypes().count(p.notification_name))
+ {
+ return new LLTransactionNotificationListItem(p);
+ }
+ return new LLSystemNotificationListItem(p);
+}
+
+//static
+std::set<std::string> LLNotificationListItem::getGroupInviteTypes()
+{
+ return LLGroupInviteNotificationListItem::getTypes();
+}
+
+
+std::set<std::string> LLNotificationListItem::getGroupNoticeTypes()
+{
+ return LLGroupNoticeNotificationListItem::getTypes();
+}
+
+//static
+std::set<std::string> LLNotificationListItem::getTransactionTypes()
+{
+ return LLTransactionNotificationListItem::getTypes();
+}
+
+void LLNotificationListItem::onClickExpandBtn()
+{
+ setExpanded(TRUE);
+}
+
+void LLNotificationListItem::onClickCondenseBtn()
+{
+ setExpanded(FALSE);
+}
+
+void LLNotificationListItem::reshapeNotification()
+{
+ if(mExpanded)
+ {
+ S32 width = this->getRect().getWidth();
+ this->reshape(width, mNoticeTextExp->getRect().getHeight() + mExpandedHeight, FALSE);
+ }
+}
+
+void LLNotificationListItem::setExpanded(BOOL value)
+{
+ mCondensedViewPanel->setVisible(!value);
+ mExpandedViewPanel->setVisible(value);
+ S32 width = this->getRect().getWidth();
+
+ if (value)
+ {
+ this->reshape(width, mNoticeTextExp->getRect().getHeight() + mExpandedHeight, FALSE);
+ }
+ else
+ {
+ this->reshape(width, mCondensedHeight, FALSE);
+ }
+ mExpanded = value;
+
+}
+
+std::set<std::string> LLGroupInviteNotificationListItem::getTypes()
+{
+ std::set<std::string> types;
+ types.insert("JoinGroup");
+ return types;
+}
+
+std::set<std::string> LLGroupNoticeNotificationListItem::getTypes()
+{
+ std::set<std::string> types;
+ types.insert("GroupNotice");
+ return types;
+}
+
+std::set<std::string> LLTransactionNotificationListItem::getTypes()
+{
+ std::set<std::string> types;
+ types.insert("PaymentReceived");
+ types.insert("PaymentSent");
+ return types;
+}
+
+LLGroupNotificationListItem::LLGroupNotificationListItem(const Params& p)
+ : LLNotificationListItem(p),
+ mSenderOrFeeBox(NULL)
+{
+}
+
+LLGroupInviteNotificationListItem::LLGroupInviteNotificationListItem(const Params& p)
+ : LLGroupNotificationListItem(p)
+{
+ buildFromFile("panel_notification_list_item.xml");
+}
+
+BOOL LLGroupInviteNotificationListItem::postBuild()
+{
+ BOOL rv = LLGroupNotificationListItem::postBuild();
+ setFee(mParams.fee);
+ mInviteButtonPanel = getChild<LLPanel>("button_panel");
+ mInviteButtonPanel->setVisible(TRUE);
+ mJoinBtn = getChild<LLButton>("join_btn");
+ mDeclineBtn = getChild<LLButton>("decline_btn");
+ mInfoBtn = getChild<LLButton>("info_btn");
+
+ //invitation with any non-default group role, doesn't have newline characters at the end unlike simple invitations
+ std::string invitation_desc = mNoticeTextExp->getValue().asString();
+ boost::regex pattern = boost::regex("\n\n$", boost::regex::perl|boost::regex::icase);
+ boost::match_results<std::string::const_iterator> matches;
+ if(!boost::regex_search(invitation_desc, matches, pattern))
+ {
+ invitation_desc += "\n\n";
+ mNoticeTextExp->setValue(invitation_desc);
+ }
+
+ mJoinBtn->setClickedCallback(boost::bind(&LLGroupInviteNotificationListItem::onClickJoinBtn,this));
+ mDeclineBtn->setClickedCallback(boost::bind(&LLGroupInviteNotificationListItem::onClickDeclineBtn,this));
+ mInfoBtn->setClickedCallback(boost::bind(&LLGroupInviteNotificationListItem::onClickInfoBtn,this));
+
+ std::string expanded_height_resize_str = getString("expanded_height_resize_for_attachment");
+ mExpandedHeightResize = (S32)atoi(expanded_height_resize_str.c_str());
+
+ return rv;
+}
+
+void LLGroupInviteNotificationListItem::onClickJoinBtn()
+{
+ if (!gAgent.canJoinGroups())
+ {
+ LLNotificationsUtil::add("JoinedTooManyGroups");
+ return;
+ }
+
+ if(mParams.fee > 0)
+ {
+ LLSD args;
+ args["COST"] = llformat("%d", mParams.fee);
+ // Set the fee for next time to 0, so that we don't keep
+ // asking about a fee.
+ LLSD next_payload;
+ next_payload["group_id"]= mParams.group_id;
+ next_payload["transaction_id"]= mParams.transaction_id;
+ next_payload["fee"] = 0;
+ LLNotificationsUtil::add("JoinGroupCanAfford", args, next_payload);
+ }
+ else
+ {
+ send_improved_im(mParams.group_id,
+ std::string("name"),
+ std::string("message"),
+ IM_ONLINE,
+ IM_GROUP_INVITATION_ACCEPT,
+ mParams.transaction_id);
+ }
+ LLNotificationListItem::onClickCloseBtn();
+}
+
+void LLGroupInviteNotificationListItem::onClickDeclineBtn()
+{
+ send_improved_im(mParams.group_id,
+ std::string("name"),
+ std::string("message"),
+ IM_ONLINE,
+ IM_GROUP_INVITATION_DECLINE,
+ mParams.transaction_id);
+ LLNotificationListItem::onClickCloseBtn();
+}
+
+void LLGroupInviteNotificationListItem::onClickInfoBtn()
+{
+ LLGroupActions::show(mParams.group_id);
+}
+
+void LLGroupInviteNotificationListItem::setFee(S32 fee)
+{
+ LLStringUtil::format_map_t string_args;
+ string_args["[GROUP_FEE]"] = llformat("%d", fee);
+ std::string fee_text = getString("group_fee_text", string_args);
+ mSenderOrFeeBox->setValue(fee_text);
+ mSenderOrFeeBoxExp->setValue(fee_text);
+ mSenderOrFeeBox->setVisible(TRUE);
+ mSenderOrFeeBoxExp->setVisible(TRUE);
+}
+
+LLGroupNoticeNotificationListItem::LLGroupNoticeNotificationListItem(const Params& p)
+ : LLGroupNotificationListItem(p),
+ mAttachmentPanel(NULL),
+ mAttachmentTextBox(NULL),
+ mAttachmentIcon(NULL),
+ mAttachmentIconExp(NULL),
+ mInventoryOffer(NULL)
+{
+ if (mParams.inventory_offer.isDefined())
+ {
+ mInventoryOffer = new LLOfferInfo(mParams.inventory_offer);
+ }
+
+ buildFromFile("panel_notification_list_item.xml");
+}
+
+LLGroupNoticeNotificationListItem::~LLGroupNoticeNotificationListItem()
+{
+ LLGroupMgr::getInstance()->removeObserver(this);
+}
+
+BOOL LLGroupNoticeNotificationListItem::postBuild()
+{
+ BOOL rv = LLGroupNotificationListItem::postBuild();
+
+ mAttachmentTextBox = getChild<LLTextBox>("attachment_text");
+ mAttachmentIcon = getChild<LLIconCtrl>("attachment_icon");
+ mAttachmentIconExp = getChild<LLIconCtrl>("attachment_icon_exp");
+ mAttachmentPanel = getChild<LLPanel>("attachment_panel");
+ mAttachmentPanel->setVisible(FALSE);
+
+
+ mTitleBox->setValue(mParams.subject);
+ mTitleBoxExp->setValue(mParams.subject);
+ mNoticeTextExp->setValue(mParams.message);
+
+ mTimeBox->setValue(buildNotificationDate(mParams.time_stamp, UTC));
+ mTimeBoxExp->setValue(buildNotificationDate(mParams.time_stamp, UTC));
+ //Workaround: in case server timestamp is 0 - we use the time when notification was actually received
+ if (mParams.time_stamp.isNull())
+ {
+ mTimeBox->setValue(buildNotificationDate(mParams.received_time, UTC));
+ mTimeBoxExp->setValue(buildNotificationDate(mParams.received_time, UTC));
+ }
+ setSender(mParams.sender);
+
+ if (mInventoryOffer != NULL)
+ {
+ mAttachmentTextBox->setValue(mInventoryOffer->mDesc);
+ mAttachmentTextBox->setVisible(TRUE);
+ mAttachmentIcon->setVisible(TRUE);
+
+ std::string icon_name = LLInventoryIcon::getIconName(mInventoryOffer->mType,
+ LLInventoryType::IT_TEXTURE);
+ mAttachmentIconExp->setValue(icon_name);
+ mAttachmentIconExp->setVisible(TRUE);
+
+ mAttachmentTextBox->setClickedCallback(boost::bind(
+ &LLGroupNoticeNotificationListItem::onClickAttachment, this));
+
+ std::string expanded_height_resize_str = getString("expanded_height_resize_for_attachment");
+ mExpandedHeightResize = (S32)atoi(expanded_height_resize_str.c_str());
+
+ mAttachmentPanel->setVisible(TRUE);
+ }
+ return rv;
+}
+
+BOOL LLGroupNotificationListItem::postBuild()
+{
+ BOOL rv = LLNotificationListItem::postBuild();
+
+ mGroupIcon = getChild<LLGroupIconCtrl>("group_icon");
+ mGroupIconExp = getChild<LLGroupIconCtrl>("group_icon_exp");
+ mGroupNameBoxExp = getChild<LLTextBox>("group_name_exp");
+
+ mGroupIcon->setValue(mParams.group_id);
+ mGroupIconExp->setValue(mParams.group_id);
+
+ mGroupIcon->setVisible(TRUE);
+ mGroupIconExp->setVisible(TRUE);
+
+ mGroupId = mParams.group_id;
+
+ mSenderOrFeeBox = getChild<LLTextBox>("sender_or_fee_box");
+ mSenderOrFeeBoxExp = getChild<LLTextBox>("sender_or_fee_box_exp");
+
+ LLSD value(mParams.group_id);
+ setGroupId(value);
+
+ return rv;
+}
+
+void LLGroupNotificationListItem::changed(LLGroupChange gc)
+{
+ if (GC_PROPERTIES == gc)
+ {
+ updateFromCache();
+ LLGroupMgr::getInstance()->removeObserver(this);
+ }
+}
+
+bool LLGroupNotificationListItem::updateFromCache()
+{
+ LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(mGroupId);
+ if (!group_data) return false;
+ setGroupName(group_data->mName);
+ return true;
+}
+
+void LLGroupNotificationListItem::setGroupId(const LLUUID& value)
+{
+ LLGroupMgr* gm = LLGroupMgr::getInstance();
+ if (mGroupId.notNull())
+ {
+ gm->removeObserver(this);
+
+
+ mID = mGroupId;
+
+ // Check if cache already contains image_id for that group
+ if (!updateFromCache())
+ {
+ gm->addObserver(this);
+ gm->sendGroupPropertiesRequest(mGroupId);
+ }
+ }
+}
+
+void LLGroupNotificationListItem::setGroupName(std::string name)
+{
+ if (!name.empty())
+ {
+ LLStringUtil::format_map_t string_args;
+ string_args["[GROUP_NAME]"] = llformat("%s", name.c_str());
+ std::string group_box_str = getString("group_name_text", string_args);
+ mGroupNameBoxExp->setValue(group_box_str);
+ mGroupNameBoxExp->setVisible(TRUE);
+ }
+ else
+ {
+ mGroupNameBoxExp->setValue(LLStringUtil::null);
+ mGroupNameBoxExp->setVisible(FALSE);
+ }
+}
+
+void LLGroupNoticeNotificationListItem::setSender(std::string sender)
+{
+ if (!sender.empty())
+ {
+ LLStringUtil::format_map_t string_args;
+ string_args["[SENDER_RESIDENT]"] = llformat("%s", sender.c_str());
+ std::string sender_text = getString("sender_resident_text", string_args);
+ mSenderOrFeeBox->setValue(sender_text);
+ mSenderOrFeeBoxExp->setValue(sender_text);
+ mSenderOrFeeBox->setVisible(TRUE);
+ mSenderOrFeeBoxExp->setVisible(TRUE);
+ } else {
+ mSenderOrFeeBox->setValue(LLStringUtil::null);
+ mSenderOrFeeBoxExp->setValue(LLStringUtil::null);
+ mSenderOrFeeBox->setVisible(FALSE);
+ mSenderOrFeeBoxExp->setVisible(FALSE);
+ }
+}
+void LLGroupNoticeNotificationListItem::close()
+{
+ // The group notice dialog may be an inventory offer.
+ // If it has an inventory save button and that button is still enabled
+ // Then we need to send the inventory declined message
+ if (mInventoryOffer != NULL)
+ {
+ mInventoryOffer->forceResponse(IOR_DECLINE);
+ mInventoryOffer = NULL;
+ }
+ LLGroupMgr::getInstance()->removeObserver(this);
+}
+
+void LLGroupNoticeNotificationListItem::onClickAttachment()
+{
+ if (mInventoryOffer != NULL) {
+ mInventoryOffer->forceResponse(IOR_ACCEPT);
+
+ static const LLUIColor textColor = LLUIColorTable::instance().getColor(
+ "GroupNotifyDimmedTextColor");
+ mAttachmentTextBox->setColor(textColor);
+ mAttachmentIconExp->setEnabled(FALSE);
+
+ //if attachment isn't openable - notify about saving
+ if (!isAttachmentOpenable(mInventoryOffer->mType)) {
+ LLNotifications::instance().add("AttachmentSaved", LLSD(), LLSD());
+ }
+
+ mInventoryOffer = NULL;
+ }
+}
+
+//static
+bool LLGroupNoticeNotificationListItem::isAttachmentOpenable(LLAssetType::EType type)
+{
+ switch (type)
+ {
+ case LLAssetType::AT_LANDMARK:
+ case LLAssetType::AT_NOTECARD:
+ case LLAssetType::AT_IMAGE_JPEG:
+ case LLAssetType::AT_IMAGE_TGA:
+ case LLAssetType::AT_TEXTURE:
+ case LLAssetType::AT_TEXTURE_TGA:
+ return true;
+ default:
+ return false;
+ }
+}
+
+LLTransactionNotificationListItem::LLTransactionNotificationListItem(const Params& p)
+ : LLNotificationListItem(p),
+ mAvatarIcon(NULL)
+{
+ buildFromFile("panel_notification_list_item.xml");
+}
+
+BOOL LLTransactionNotificationListItem::postBuild()
+{
+ BOOL rv = LLNotificationListItem::postBuild();
+ mAvatarIcon = getChild<LLAvatarIconCtrl>("avatar_icon");
+ mAvatarIconExp = getChild<LLAvatarIconCtrl>("avatar_icon_exp");
+ mAvatarIcon->setValue("System_Notification");
+ mAvatarIconExp->setValue("System_Notification");
+
+ mAvatarIcon->setVisible(TRUE);
+ mAvatarIconExp->setVisible(TRUE);
+ if((GOVERNOR_LINDEN_ID == mParams.paid_to_id) ||
+ (GOVERNOR_LINDEN_ID == mParams.paid_from_id))
+ {
+ return rv;
+ }
+
+ if (mParams.notification_name == "PaymentReceived")
+ {
+ mAvatarIcon->setValue(mParams.paid_from_id);
+ mAvatarIconExp->setValue(mParams.paid_from_id);
+ }
+ else if (mParams.notification_name == "PaymentSent")
+ {
+ mAvatarIcon->setValue(mParams.paid_to_id);
+ mAvatarIconExp->setValue(mParams.paid_to_id);
+ }
+
+ return rv;
+}
+
+LLSystemNotificationListItem::LLSystemNotificationListItem(const Params& p)
+ : LLNotificationListItem(p),
+ mSystemNotificationIcon(NULL),
+ mIsCaution(false)
+{
+ buildFromFile("panel_notification_list_item.xml");
+ mIsCaution = p.notification_priority >= NOTIFICATION_PRIORITY_HIGH;
+ if (mIsCaution)
+ {
+ mTitleBox->setColor(LLUIColorTable::instance().getColor("NotifyCautionBoxColor"));
+ mTitleBoxExp->setColor(LLUIColorTable::instance().getColor("NotifyCautionBoxColor"));
+ mNoticeTextExp->setReadOnlyColor(LLUIColorTable::instance().getColor("NotifyCautionBoxColor"));
+ mTimeBox->setColor(LLUIColorTable::instance().getColor("NotifyCautionBoxColor"));
+ mTimeBoxExp->setColor(LLUIColorTable::instance().getColor("NotifyCautionBoxColor"));
+ }
+}
+
+BOOL LLSystemNotificationListItem::postBuild()
+{
+ BOOL rv = LLNotificationListItem::postBuild();
+ mSystemNotificationIcon = getChild<LLIconCtrl>("system_notification_icon");
+ mSystemNotificationIconExp = getChild<LLIconCtrl>("system_notification_icon_exp");
+ if (mSystemNotificationIcon)
+ mSystemNotificationIcon->setVisible(TRUE);
+ if (mSystemNotificationIconExp)
+ mSystemNotificationIconExp->setVisible(TRUE);
+ return rv;
+}
diff --git a/indra/newview/llnotificationlistitem.h b/indra/newview/llnotificationlistitem.h
new file mode 100644
index 0000000000..9a4ce2be4b
--- /dev/null
+++ b/indra/newview/llnotificationlistitem.h
@@ -0,0 +1,250 @@
+/**
+ * @file llnotificationlistitem.h
+ * @brief
+ *
+ * $LicenseInfo:firstyear=2015&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2015, 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_LLNOTIFICATIONLISTITEM_H
+#define LL_LLNOTIFICATIONLISTITEM_H
+
+#include "llpanel.h"
+#include "lllayoutstack.h"
+#include "lltextbox.h"
+#include "llviewertexteditor.h"
+#include "llbutton.h"
+#include "llgroupiconctrl.h"
+#include "llavatariconctrl.h"
+#include "llchatentry.h"
+#include "llgroupmgr.h"
+#include "llviewermessage.h"
+
+#include <string>
+
+class LLNotificationListItem : public LLPanel
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLPanel::Params>
+ {
+ LLUUID notification_id;
+ LLUUID transaction_id;
+ LLUUID group_id;
+ LLUUID paid_from_id;
+ LLUUID paid_to_id;
+ std::string notification_name;
+ std::string title;
+ std::string subject;
+ std::string message;
+ std::string sender;
+ S32 fee;
+ LLDate time_stamp;
+ LLDate received_time;
+ LLSD inventory_offer;
+ e_notification_priority notification_priority;
+ Params() {};
+ };
+
+ static LLNotificationListItem* create(const Params& p);
+
+ static std::set<std::string> getTransactionTypes();
+ static std::set<std::string> getGroupInviteTypes();
+ static std::set<std::string> getGroupNoticeTypes();
+
+ // title
+ void setTitle( std::string title );
+
+ // get item's ID
+ LLUUID getID() { return mParams.notification_id; }
+ std::string& getTitle() { return mTitle; }
+ std::string& getNotificationName() { return mNotificationName; }
+
+ // handlers
+ virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
+ virtual void onMouseEnter(S32 x, S32 y, MASK mask);
+ virtual void onMouseLeave(S32 x, S32 y, MASK mask);
+
+ //callbacks
+ typedef boost::function<void (LLNotificationListItem* item)> item_callback_t;
+ typedef boost::signals2::signal<void (LLNotificationListItem* item)> item_signal_t;
+ item_signal_t mOnItemClose;
+ item_signal_t mOnItemClick;
+ boost::signals2::connection setOnItemCloseCallback(item_callback_t cb) { return mOnItemClose.connect(cb); }
+ boost::signals2::connection setOnItemClickCallback(item_callback_t cb) { return mOnItemClick.connect(cb); }
+
+ virtual bool showPopup() { return true; }
+ void setExpanded(BOOL value);
+ virtual BOOL postBuild();
+ void reshapeNotification();
+
+ typedef enum e_time_type
+ {
+ SLT = 1,
+ Local = 2,
+ UTC = 3,
+ }ETimeType;
+
+protected:
+ LLNotificationListItem(const Params& p);
+ virtual ~LLNotificationListItem();
+
+ static std::string buildNotificationDate(const LLDate& time_stamp, ETimeType time_type = SLT);
+ void onClickExpandBtn();
+ void onClickCondenseBtn();
+ void onClickCloseBtn();
+ virtual void close() {};
+
+ Params mParams;
+ LLTextBox* mTitleBox;
+ LLTextBox* mTitleBoxExp;
+ LLChatEntry* mNoticeTextExp;
+ LLTextBox* mTimeBox;
+ LLTextBox* mTimeBoxExp;
+ LLButton* mExpandBtn;
+ LLButton* mCondenseBtn;
+ LLButton* mCloseBtn;
+ LLButton* mCloseBtnExp;
+ LLPanel* mCondensedViewPanel;
+ LLPanel* mExpandedViewPanel;
+ std::string mTitle;
+ std::string mNotificationName;
+ S32 mCondensedHeight;
+ S32 mExpandedHeight;
+ S32 mExpandedHeightResize;
+ bool mExpanded;
+};
+
+class LLGroupNotificationListItem
+ : public LLNotificationListItem, public LLGroupMgrObserver
+{
+public:
+ virtual BOOL postBuild();
+
+ void setGroupId(const LLUUID& value);
+ // LLGroupMgrObserver observer trigger
+ virtual void changed(LLGroupChange gc);
+
+ friend class LLNotificationListItem;
+protected:
+ LLGroupNotificationListItem(const Params& p);
+
+ LLGroupIconCtrl* mGroupIcon;
+ LLGroupIconCtrl* mGroupIconExp;
+ LLUUID mGroupId;
+ LLTextBox* mSenderOrFeeBox;
+ LLTextBox* mSenderOrFeeBoxExp;
+ LLTextBox* mGroupNameBoxExp;
+
+private:
+ LLGroupNotificationListItem(const LLGroupNotificationListItem &);
+ LLGroupNotificationListItem & operator=(LLGroupNotificationListItem &);
+
+ void setGroupName(std::string name);
+ bool updateFromCache();
+};
+
+class LLGroupInviteNotificationListItem
+ : public LLGroupNotificationListItem
+{
+public:
+ static std::set<std::string> getTypes();
+ virtual BOOL postBuild();
+
+ /*virtual*/ bool showPopup() { return false; }
+
+private:
+ friend class LLNotificationListItem;
+ LLGroupInviteNotificationListItem(const Params& p);
+ LLGroupInviteNotificationListItem(const LLGroupInviteNotificationListItem &);
+ LLGroupInviteNotificationListItem & operator=(LLGroupInviteNotificationListItem &);
+
+ void setFee(S32 fee);
+
+ void onClickJoinBtn();
+ void onClickDeclineBtn();
+ void onClickInfoBtn();
+
+ LLPanel* mInviteButtonPanel;
+ LLButton* mJoinBtn;
+ LLButton* mDeclineBtn;
+ LLButton* mInfoBtn;
+};
+
+class LLGroupNoticeNotificationListItem
+ : public LLGroupNotificationListItem
+{
+public:
+ ~LLGroupNoticeNotificationListItem();
+ static std::set<std::string> getTypes();
+ virtual BOOL postBuild();
+
+ /*virtual*/ bool showPopup() { return false; }
+
+private:
+ friend class LLNotificationListItem;
+ LLGroupNoticeNotificationListItem(const Params& p);
+ LLGroupNoticeNotificationListItem(const LLGroupNoticeNotificationListItem &);
+ LLGroupNoticeNotificationListItem & operator=(LLGroupNoticeNotificationListItem &);
+
+ void setSender(std::string sender);
+ void onClickAttachment();
+ /*virtual*/ void close();
+
+ static bool isAttachmentOpenable(LLAssetType::EType);
+
+ LLPanel* mAttachmentPanel;
+ LLTextBox* mAttachmentTextBox;
+ LLIconCtrl* mAttachmentIcon;
+ LLIconCtrl* mAttachmentIconExp;
+ LLOfferInfo* mInventoryOffer;
+};
+
+class LLTransactionNotificationListItem : public LLNotificationListItem
+{
+public:
+ static std::set<std::string> getTypes();
+ virtual BOOL postBuild();
+private:
+ friend class LLNotificationListItem;
+ LLTransactionNotificationListItem(const Params& p);
+ LLTransactionNotificationListItem(const LLTransactionNotificationListItem &);
+ LLTransactionNotificationListItem & operator=(LLTransactionNotificationListItem &);
+ LLAvatarIconCtrl* mAvatarIcon;
+ LLAvatarIconCtrl* mAvatarIconExp;
+};
+
+class LLSystemNotificationListItem : public LLNotificationListItem
+{
+public:
+ virtual BOOL postBuild();
+private:
+ friend class LLNotificationListItem;
+ LLSystemNotificationListItem(const Params& p);
+ LLSystemNotificationListItem(const LLSystemNotificationListItem &);
+ LLSystemNotificationListItem & operator=(LLSystemNotificationListItem &);
+ LLIconCtrl* mSystemNotificationIcon;
+ LLIconCtrl* mSystemNotificationIconExp;
+ bool mIsCaution;
+};
+
+#endif // LL_LLNOTIFICATIONLISTITEM_H
+
+
diff --git a/indra/newview/llnotificationlistview.cpp b/indra/newview/llnotificationlistview.cpp
new file mode 100644
index 0000000000..9dce68c9c6
--- /dev/null
+++ b/indra/newview/llnotificationlistview.cpp
@@ -0,0 +1,44 @@
+/**
+ * @file llnotificationlistview.cpp
+ * @brief
+ *
+ * $LicenseInfo:firstyear=2015&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2015, 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 "llnotificationlistview.h"
+
+static const LLDefaultChildRegistry::Register<LLNotificationListView> notification_list_view("notification_list_view");
+
+LLNotificationListView::LLNotificationListView(const Params& p)
+ : LLFlatListView(p)
+{}
+
+LLNotificationListView::~LLNotificationListView()
+{}
+
+bool LLNotificationListView::addNotification(LLNotificationListItem * item)
+{
+ return LLFlatListView::addItem(item, item->getID(), ADD_TOP);
+}
+
+//EOF
diff --git a/indra/newview/llnotificationlistview.h b/indra/newview/llnotificationlistview.h
new file mode 100644
index 0000000000..307ad87789
--- /dev/null
+++ b/indra/newview/llnotificationlistview.h
@@ -0,0 +1,49 @@
+/**
+ * @file llnotificationlistview.h
+ * @brief LLNotificationListView class to support notifications list contained in enclosing floater.
+ *
+ * $LicenseInfo:firstyear=2015&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2015, 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_LLNOTIFICATIONLISTVIEW_H
+#define LL_LLNOTIFICATIONLISTVIEW_H
+
+#include "llflatlistview.h"
+#include "llnotificationlistitem.h"
+
+/**
+ * Notification list
+ */
+class LLNotificationListView : public LLFlatListView
+{
+ LOG_CLASS(LLNotificationListView);
+public:
+ struct Params : public LLInitParam::Block<Params, LLFlatListView::Params> {};
+
+ LLNotificationListView(const Params& p);
+ ~LLNotificationListView();
+ friend class LLUICtrlFactory;
+
+ virtual bool addNotification(LLNotificationListItem * item);
+};
+
+#endif
diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp
index a3b15931c6..7acb2f9e90 100755
--- a/indra/newview/llnotificationscripthandler.cpp
+++ b/indra/newview/llnotificationscripthandler.cpp
@@ -68,6 +68,30 @@ void LLScriptHandler::initChannel()
}
//--------------------------------------------------------------------------
+void LLScriptHandler::addToastWithNotification(const LLNotificationPtr& notification)
+{
+ 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;
+ }
+
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
+ if(channel)
+ {
+ channel->addToast(p);
+ }
+}
+
+//--------------------------------------------------------------------------
bool LLScriptHandler::processNotification(const LLNotificationPtr& notification)
{
if(mChannel.isDead())
@@ -92,42 +116,33 @@ bool LLScriptHandler::processNotification(const LLNotificationPtr& notification)
}
else if (notification->canShowToast())
{
- 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;
- }
-
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
- if(channel)
- {
- channel->addToast(p);
- }
+ addToastWithNotification(notification);
}
return false;
}
+void LLScriptHandler::onChange( LLNotificationPtr notification )
+{
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
+ if (channel)
+ {
+ channel->removeToastByNotificationID(notification->getID());
+ addToastWithNotification(notification);
+ }
+}
void LLScriptHandler::onDelete( LLNotificationPtr notification )
- {
+{
if(notification->hasFormElements() && !notification->canShowToast())
- {
- LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID());
- }
- else
- {
- mChannel.get()->removeToastByNotificationID(notification->getID());
- }
+ {
+ LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID());
}
+ else
+ {
+ mChannel.get()->removeToastByNotificationID(notification->getID());
+ }
+}
//--------------------------------------------------------------------------
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index 4ca961c1f9..596327e8f1 100755
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -113,11 +113,23 @@ bool LLTipHandler::processNotification(const LLNotificationPtr& 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;
-
+
+ LLDate cur_time = LLDate::now();
+ LLDate exp_time = notification->getExpiration();
+ if (exp_time > cur_time)
+ {
+ // we have non-default expiration time - keep visible until expires
+ p.lifetime_secs = exp_time.secondsSinceEpoch() - cur_time.secondsSinceEpoch();
+ }
+ else
+ {
+ // use default time
+ p.lifetime_secs = gSavedSettings.getS32("NotificationTipToastLifeTime");
+ }
+
LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
if(channel)
channel->addToast(p);
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index 19a86cdcea..b7e1b2d3a4 100755
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -925,17 +925,17 @@ void LLPanelEditWearable::onCommitSexChange()
if (!isAgentAvatarValid()) return;
LLWearableType::EType type = mWearablePtr->getType();
- U32 index = gAgentWearables.getWearableIndex(mWearablePtr);
-
- if( !gAgentWearables.isWearableModifiable(type, index))
+ U32 index;
+ if( !gAgentWearables.getWearableIndex(mWearablePtr, index) ||
+ !gAgentWearables.isWearableModifiable(type, index))
{
- return;
+ return;
}
LLViewerVisualParam* param = static_cast<LLViewerVisualParam*>(gAgentAvatarp->getVisualParam( "male" ));
if( !param )
{
- return;
+ return;
}
bool is_new_sex_male = (gSavedSettings.getU32("AvatarSex") ? SEX_MALE : SEX_FEMALE) == SEX_MALE;
@@ -978,10 +978,17 @@ void LLPanelEditWearable::onTexturePickerCommit(const LLUICtrl* ctrl)
}
if (getWearable())
{
- U32 index = gAgentWearables.getWearableIndex(getWearable());
- gAgentAvatarp->setLocalTexture(entry->mTextureIndex, image, FALSE, index);
- LLVisualParamHint::requestHintUpdates();
- gAgentAvatarp->wearableUpdated(type);
+ U32 index;
+ if (gAgentWearables.getWearableIndex(getWearable(), index))
+ {
+ gAgentAvatarp->setLocalTexture(entry->mTextureIndex, image, FALSE, index);
+ LLVisualParamHint::requestHintUpdates();
+ gAgentAvatarp->wearableUpdated(type);
+ }
+ else
+ {
+ LL_WARNS() << "wearable not found in gAgentWearables" << LL_ENDL;
+ }
}
}
else
@@ -1058,7 +1065,12 @@ void LLPanelEditWearable::saveChanges(bool force_save_as)
return;
}
- U32 index = gAgentWearables.getWearableIndex(mWearablePtr);
+ U32 index;
+ if (!gAgentWearables.getWearableIndex(mWearablePtr, index))
+ {
+ LL_WARNS() << "wearable not found" << LL_ENDL;
+ return;
+ }
std::string new_name = mNameEditor->getText();
@@ -1156,6 +1168,8 @@ void LLPanelEditWearable::showWearable(LLViewerWearable* wearable, BOOL show, BO
targetPanel->setVisible(show);
toggleTypeSpecificControls(type);
+ // Update type controls here
+ updateTypeSpecificControls(type);
if (show)
{
@@ -1167,7 +1181,6 @@ void LLPanelEditWearable::showWearable(LLViewerWearable* wearable, BOOL show, BO
mNameEditor->setText(mWearableItem->getName());
updatePanelPickerControls(type);
- updateTypeSpecificControls(type);
// clear and rebuild visual param list
U8 num_subparts = wearable_entry->mSubparts.size();
@@ -1574,6 +1587,12 @@ void LLPanelEditWearable::onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LL
LL_INFOS() << "onInvisibilityCommit, self " << this << " checkbox_ctrl " << checkbox_ctrl << LL_ENDL;
+ U32 index;
+ if (!gAgentWearables.getWearableIndex(getWearable(),index))
+ {
+ LL_WARNS() << "wearable not found" << LL_ENDL;
+ return;
+ }
bool new_invis_state = checkbox_ctrl->get();
if (new_invis_state)
{
@@ -1581,9 +1600,8 @@ void LLPanelEditWearable::onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LL
mPreviousAlphaTexture[te] = lto->getID();
LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture( IMG_INVISIBLE );
- U32 index = gAgentWearables.getWearableIndex(getWearable());
- gAgentAvatarp->setLocalTexture(te, image, FALSE, index);
- gAgentAvatarp->wearableUpdated(getWearable()->getType());
+ gAgentAvatarp->setLocalTexture(te, image, FALSE, index);
+ gAgentAvatarp->wearableUpdated(getWearable()->getType());
}
else
{
@@ -1598,7 +1616,6 @@ void LLPanelEditWearable::onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LL
LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(prev_id);
if (!image) return;
- U32 index = gAgentWearables.getWearableIndex(getWearable());
gAgentAvatarp->setLocalTexture(te, image, FALSE, index);
gAgentAvatarp->wearableUpdated(getWearable()->getType());
}
diff --git a/indra/newview/llpanelexperiencelisteditor.cpp b/indra/newview/llpanelexperiencelisteditor.cpp
new file mode 100644
index 0000000000..7c07301762
--- /dev/null
+++ b/indra/newview/llpanelexperiencelisteditor.cpp
@@ -0,0 +1,264 @@
+/**
+ * @file llpanelexperiencelisteditor.cpp
+ * @brief Editor for building a list of experiences
+ *
+ * $LicenseInfo:firstyear=2014&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 "llpanelexperiencelisteditor.h"
+
+#include "llbutton.h"
+#include "llexperiencecache.h"
+#include "llfloaterexperiencepicker.h"
+#include "llfloaterreg.h"
+#include "llhandle.h"
+#include "llnamelistctrl.h"
+#include "llscrolllistctrl.h"
+#include "llviewerregion.h"
+#include "llagent.h"
+#include "lltextbox.h"
+#include "lltrans.h"
+
+
+static LLPanelInjector<LLPanelExperienceListEditor> t_panel_experience_list_editor("panel_experience_list_editor");
+
+
+LLPanelExperienceListEditor::LLPanelExperienceListEditor()
+ :mItems(NULL)
+ ,mProfile(NULL)
+ ,mRemove(NULL)
+ ,mReadonly(false)
+ ,mMaxExperienceIDs(0)
+{
+}
+
+BOOL LLPanelExperienceListEditor::postBuild()
+{
+ mItems = getChild<LLNameListCtrl>("experience_list");
+ mAdd = getChild<LLButton>("btn_add");
+ mRemove = getChild<LLButton>("btn_remove");
+ mProfile = getChild<LLButton>("btn_profile");
+
+ childSetAction("btn_add", boost::bind(&LLPanelExperienceListEditor::onAdd, this));
+ childSetAction("btn_remove", boost::bind(&LLPanelExperienceListEditor::onRemove, this));
+ childSetAction("btn_profile", boost::bind(&LLPanelExperienceListEditor::onProfile, this));
+
+ mItems->setCommitCallback(boost::bind(&LLPanelExperienceListEditor::checkButtonsEnabled, this));
+
+ checkButtonsEnabled();
+ return TRUE;
+}
+
+const uuid_list_t& LLPanelExperienceListEditor::getExperienceIds() const
+{
+ return mExperienceIds;
+}
+
+void LLPanelExperienceListEditor::addExperienceIds( const uuid_vec_t& experience_ids )
+{
+ // the commented out code in this function is handled by the callback and no longer necessary!
+
+ //mExperienceIds.insert(experience_ids.begin(), experience_ids.end());
+ //onItems();
+ if(!mAddedCallback.empty())
+ {
+ for(uuid_vec_t::const_iterator it = experience_ids.begin(); it != experience_ids.end(); ++it)
+ {
+ mAddedCallback(*it);
+ }
+ }
+}
+
+
+void LLPanelExperienceListEditor::setExperienceIds( const LLSD& experience_ids )
+{
+ mExperienceIds.clear();
+ mExperienceIds.insert(experience_ids.beginArray(), experience_ids.endArray());
+ onItems();
+}
+
+void LLPanelExperienceListEditor::addExperience( const LLUUID& id )
+{
+ mExperienceIds.insert(id);
+ onItems();
+}
+void LLPanelExperienceListEditor::onAdd()
+{
+ if(!mPicker.isDead())
+ {
+ mPicker.markDead();
+ }
+
+ mKey.generateNewID();
+
+ LLFloaterExperiencePicker* picker=LLFloaterExperiencePicker::show(boost::bind(&LLPanelExperienceListEditor::addExperienceIds, this, _1), mKey, FALSE, TRUE, mFilters, mAdd);
+ mPicker = picker->getDerivedHandle<LLFloaterExperiencePicker>();
+}
+
+
+void LLPanelExperienceListEditor::onRemove()
+{
+ // the commented out code in this function is handled by the callback and no longer necessary!
+
+ std::vector<LLScrollListItem*> items= mItems->getAllSelected();
+ std::vector<LLScrollListItem*>::iterator it = items.begin();
+ for(/**/; it != items.end(); ++it)
+ {
+ if((*it) != NULL)
+ {
+ //mExperienceIds.erase((*it)->getValue());
+ mRemovedCallback((*it)->getValue());
+ }
+ }
+ mItems->selectFirstItem();
+ checkButtonsEnabled();
+ //onItems();
+}
+
+void LLPanelExperienceListEditor::onProfile()
+{
+ LLScrollListItem* item = mItems->getFirstSelected();
+ if(item)
+ {
+ LLFloaterReg::showInstance("experience_profile", item->getUUID(), true);
+ }
+}
+
+void LLPanelExperienceListEditor::checkButtonsEnabled()
+{
+ mAdd->setEnabled(!mReadonly);
+ int selected = mItems->getNumSelected();
+
+ bool remove_enabled = !mReadonly && selected>0;
+ if(remove_enabled && mSticky)
+ {
+ std::vector<LLScrollListItem*> items= mItems->getAllSelected();
+ std::vector<LLScrollListItem*>::iterator it = items.begin();
+ for(/**/; it != items.end() && remove_enabled; ++it)
+ {
+ if((*it) != NULL)
+ {
+ remove_enabled = !mSticky((*it)->getValue());
+ }
+ }
+
+
+ }
+ mRemove->setEnabled(remove_enabled);
+ mProfile->setEnabled(selected==1);
+}
+
+void LLPanelExperienceListEditor::onItems()
+{
+ mItems->deleteAllItems();
+
+ LLSD item;
+ uuid_list_t::iterator it = mExperienceIds.begin();
+ for(/**/; it != mExperienceIds.end(); ++it)
+ {
+ const LLUUID& experience = *it;
+ item["id"]=experience;
+ item["target"] = LLNameListCtrl::EXPERIENCE;
+ LLSD& columns = item["columns"];
+ columns[0]["column"] = "experience_name";
+ columns[0]["value"] = getString("loading");
+ mItems->addElement(item);
+
+ LLExperienceCache::get(experience, boost::bind(&LLPanelExperienceListEditor::experienceDetailsCallback,
+ getDerivedHandle<LLPanelExperienceListEditor>(), _1));
+ }
+
+
+ if(mItems->getItemCount() == 0)
+ {
+ mItems->setCommentText(getString("no_results"));
+ }
+
+
+ checkButtonsEnabled();
+}
+
+void LLPanelExperienceListEditor::experienceDetailsCallback( LLHandle<LLPanelExperienceListEditor> panel, const LLSD& experience )
+{
+ if(!panel.isDead())
+ {
+ panel.get()->onExperienceDetails(experience);
+ }
+}
+
+void LLPanelExperienceListEditor::onExperienceDetails( const LLSD& experience )
+{
+ LLScrollListItem* item = mItems->getItem(experience[LLExperienceCache::EXPERIENCE_ID]);
+ if(!item)
+ return;
+
+ std::string experience_name_string = experience[LLExperienceCache::NAME].asString();
+ if (experience_name_string.empty())
+ {
+ experience_name_string = LLTrans::getString("ExperienceNameUntitled");
+ }
+
+ item->getColumn(0)->setValue(experience_name_string);
+}
+
+LLPanelExperienceListEditor::~LLPanelExperienceListEditor()
+{
+ if(!mPicker.isDead())
+ {
+ mPicker.get()->closeFloater();
+ }
+}
+
+void LLPanelExperienceListEditor::loading()
+{
+ mItems->clear();
+ mItems->setCommentText( getString("loading"));
+}
+
+void LLPanelExperienceListEditor::setReadonly( bool val )
+{
+ mReadonly = val;
+ checkButtonsEnabled();
+}
+
+void LLPanelExperienceListEditor::refreshExperienceCounter()
+{
+ if(mMaxExperienceIDs > 0)
+ {
+ LLStringUtil::format_map_t args;
+ args["[EXPERIENCES]"] = llformat("%d", mItems->getItemCount());
+ args["[MAXEXPERIENCES]"] = llformat("%d", mMaxExperienceIDs);
+ getChild<LLTextBox>("text_count")->setText(LLTrans::getString("ExperiencesCounter", args));
+ }
+}
+
+boost::signals2::connection LLPanelExperienceListEditor::setAddedCallback( list_changed_signal_t::slot_type cb )
+{
+ return mAddedCallback.connect(cb);
+}
+
+boost::signals2::connection LLPanelExperienceListEditor::setRemovedCallback( list_changed_signal_t::slot_type cb )
+{
+ return mRemovedCallback.connect(cb);
+}
diff --git a/indra/newview/llpanelexperiencelisteditor.h b/indra/newview/llpanelexperiencelisteditor.h
new file mode 100644
index 0000000000..bc9867752d
--- /dev/null
+++ b/indra/newview/llpanelexperiencelisteditor.h
@@ -0,0 +1,101 @@
+/**
+* @file llpanelexperiencelisteditor.cpp
+* @brief Editor for building a list of experiences
+*
+* $LicenseInfo:firstyear=2014&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_LLPANELEXPERIENCELISTEDITOR_H
+#define LL_LLPANELEXPERIENCELISTEDITOR_H
+
+#include "llpanel.h"
+#include "lluuid.h"
+#include <set>
+
+class LLNameListCtrl;
+class LLScrollListCtrl;
+class LLButton;
+class LLFloaterExperiencePicker;
+
+class LLPanelExperienceListEditor : public LLPanel
+{
+public:
+
+ typedef boost::signals2::signal<void (const LLUUID&) > list_changed_signal_t;
+ // filter function for experiences, return true if the experience should be hidden.
+ typedef boost::function<bool (const LLSD&)> experience_function;
+ typedef std::vector<experience_function> filter_list;
+ typedef LLHandle<LLFloaterExperiencePicker> PickerHandle;
+ LLPanelExperienceListEditor();
+ ~LLPanelExperienceListEditor();
+ BOOL postBuild();
+
+ void loading();
+
+ const uuid_list_t& getExperienceIds()const;
+ void setExperienceIds(const LLSD& experience_ids);
+ void addExperienceIds(const uuid_vec_t& experience_ids);
+
+ void addExperience(const LLUUID& id);
+
+ boost::signals2::connection setAddedCallback(list_changed_signal_t::slot_type cb );
+ boost::signals2::connection setRemovedCallback(list_changed_signal_t::slot_type cb );
+
+ bool getReadonly() const { return mReadonly; }
+ void setReadonly(bool val);
+
+ void refreshExperienceCounter();
+
+ void addFilter(experience_function func){mFilters.push_back(func);}
+ void setStickyFunction(experience_function func){mSticky = func;}
+ U32 getMaxExperienceIDs() const { return mMaxExperienceIDs; }
+ void setMaxExperienceIDs(U32 val) { mMaxExperienceIDs = val; }
+private:
+
+ void onItems();
+ void onRemove();
+ void onAdd();
+ void onProfile();
+
+ void checkButtonsEnabled();
+ static void experienceDetailsCallback( LLHandle<LLPanelExperienceListEditor> panel, const LLSD& experience );
+ void onExperienceDetails( const LLSD& experience );
+ void processResponse( const LLSD& content );
+ uuid_list_t mExperienceIds;
+
+
+ LLNameListCtrl* mItems;
+ filter_list mFilters;
+ LLButton* mAdd;
+ LLButton* mRemove;
+ LLButton* mProfile;
+ PickerHandle mPicker;
+ list_changed_signal_t mAddedCallback;
+ list_changed_signal_t mRemovedCallback;
+ LLUUID mKey;
+ bool mReadonly;
+ experience_function mSticky;
+ U32 mMaxExperienceIDs;
+
+};
+
+#endif //LL_LLPANELEXPERIENCELISTEDITOR_H
diff --git a/indra/newview/llpanelexperiencelog.cpp b/indra/newview/llpanelexperiencelog.cpp
new file mode 100644
index 0000000000..df03ef7526
--- /dev/null
+++ b/indra/newview/llpanelexperiencelog.cpp
@@ -0,0 +1,264 @@
+/**
+ * @file llpanelexperiencelog.cpp
+ * @brief llpanelexperiencelog
+ *
+ * $LicenseInfo:firstyear=2014&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2014, 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 "llpanelexperiencelog.h"
+
+#include "llexperiencelog.h"
+#include "llexperiencecache.h"
+#include "llbutton.h"
+#include "llscrolllistctrl.h"
+#include "llcombobox.h"
+#include "llspinctrl.h"
+#include "llcheckboxctrl.h"
+#include "llfloaterreg.h"
+#include "llfloaterreporter.h"
+#include "llinventoryfunctions.h"
+
+
+#define BTN_PROFILE_XP "btn_profile_xp"
+#define BTN_REPORT_XP "btn_report_xp"
+
+static LLPanelInjector<LLPanelExperienceLog> register_experiences_panel("experience_log");
+
+
+LLPanelExperienceLog::LLPanelExperienceLog( )
+ : mEventList(NULL)
+ , mPageSize(25)
+ , mCurrentPage(0)
+{
+ buildFromFile("panel_experience_log.xml");
+}
+
+
+BOOL LLPanelExperienceLog::postBuild( void )
+{
+ LLExperienceLog* log = LLExperienceLog::getInstance();
+ mEventList = getChild<LLScrollListCtrl>("experience_log_list");
+ mEventList->setCommitCallback(boost::bind(&LLPanelExperienceLog::onSelectionChanged, this));
+ mEventList->setDoubleClickCallback( boost::bind(&LLPanelExperienceLog::onProfileExperience, this));
+
+ getChild<LLButton>("btn_clear")->setCommitCallback(boost::bind(&LLExperienceLog::clear, log));
+ getChild<LLButton>("btn_clear")->setCommitCallback(boost::bind(&LLPanelExperienceLog::refresh, this));
+
+ getChild<LLButton>(BTN_PROFILE_XP)->setCommitCallback(boost::bind(&LLPanelExperienceLog::onProfileExperience, this));
+ getChild<LLButton>(BTN_REPORT_XP )->setCommitCallback(boost::bind(&LLPanelExperienceLog::onReportExperience, this));
+ getChild<LLButton>("btn_notify" )->setCommitCallback(boost::bind(&LLPanelExperienceLog::onNotify, this));
+ getChild<LLButton>("btn_next" )->setCommitCallback(boost::bind(&LLPanelExperienceLog::onNext, this));
+ getChild<LLButton>("btn_prev" )->setCommitCallback(boost::bind(&LLPanelExperienceLog::onPrev, this));
+
+ LLCheckBoxCtrl* check = getChild<LLCheckBoxCtrl>("notify_all");
+ check->set(log->getNotifyNewEvent());
+ check->setCommitCallback(boost::bind(&LLPanelExperienceLog::notifyChanged, this));
+
+
+ LLSpinCtrl* spin = getChild<LLSpinCtrl>("logsizespinner");
+ spin->set(log->getMaxDays());
+ spin->setCommitCallback(boost::bind(&LLPanelExperienceLog::logSizeChanged, this));
+
+ mPageSize = log->getPageSize();
+ refresh();
+ mNewEvent = LLExperienceLog::instance().addUpdateSignal(boost::bind(&LLPanelExperienceLog::refresh, this));
+ return TRUE;
+}
+
+LLPanelExperienceLog* LLPanelExperienceLog::create()
+{
+ return new LLPanelExperienceLog();
+}
+
+void LLPanelExperienceLog::refresh()
+{
+ S32 selected = mEventList->getFirstSelectedIndex();
+ mEventList->deleteAllItems();
+ const LLSD events = LLExperienceLog::instance().getEvents();
+
+ if(events.size() == 0)
+ {
+ mEventList->setCommentText(getString("no_events"));
+ return;
+ }
+
+ setAllChildrenEnabled(FALSE);
+
+ LLSD item;
+ bool waiting = false;
+ LLUUID waiting_id;
+
+ int itemsToSkip = mPageSize*mCurrentPage;
+ int items = 0;
+ bool moreItems = false;
+
+ if (!events.emptyMap())
+ {
+ LLSD::map_const_iterator day = events.endMap();
+ do
+ {
+ --day;
+ const LLSD& dayArray = day->second;
+ int size = dayArray.size();
+ if(itemsToSkip > size)
+ {
+ itemsToSkip -= size;
+ continue;
+ }
+ if(items >= mPageSize && size > 0)
+ {
+ moreItems = true;
+ break;
+ }
+ for(int i = dayArray.size() - itemsToSkip - 1; i >= 0; i--)
+ {
+ if(items >= mPageSize)
+ {
+ moreItems = true;
+ break;
+ }
+ const LLSD event = dayArray[i];
+ LLUUID id = event[LLExperienceCache::EXPERIENCE_ID].asUUID();
+ const LLSD& experience = LLExperienceCache::get(id);
+ if(experience.isUndefined()){
+ waiting = true;
+ waiting_id = id;
+ }
+ if(!waiting)
+ {
+ item["id"] = event;
+
+ LLSD& columns = item["columns"];
+ columns[0]["column"] = "time";
+ columns[0]["value"] = day->first+event["Time"].asString();
+ columns[1]["column"] = "event";
+ columns[1]["value"] = LLExperienceLog::getPermissionString(event, "ExperiencePermissionShort");
+ columns[2]["column"] = "experience_name";
+ columns[2]["value"] = experience[LLExperienceCache::NAME].asString();
+ columns[3]["column"] = "object_name";
+ columns[3]["value"] = event["ObjectName"].asString();
+ mEventList->addElement(item);
+ }
+ ++items;
+ }
+ } while (day != events.beginMap());
+ }
+ if(waiting)
+ {
+ mEventList->deleteAllItems();
+ mEventList->setCommentText(getString("loading"));
+ LLExperienceCache::get(waiting_id, boost::bind(&LLPanelExperienceLog::refresh, this));
+ }
+ else
+ {
+ setAllChildrenEnabled(TRUE);
+
+ mEventList->setEnabled(TRUE);
+ getChild<LLButton>("btn_next")->setEnabled(moreItems);
+ getChild<LLButton>("btn_prev")->setEnabled(mCurrentPage>0);
+ getChild<LLButton>("btn_clear")->setEnabled(mEventList->getItemCount()>0);
+ if(selected<0)
+ {
+ selected = 0;
+ }
+ mEventList->selectNthItem(selected);
+ onSelectionChanged();
+ }
+}
+
+void LLPanelExperienceLog::onProfileExperience()
+{
+ LLSD event = getSelectedEvent();
+ if(event.isDefined())
+ {
+ LLFloaterReg::showInstance("experience_profile", event[LLExperienceCache::EXPERIENCE_ID].asUUID(), true);
+ }
+}
+
+void LLPanelExperienceLog::onReportExperience()
+{
+ LLSD event = getSelectedEvent();
+ if(event.isDefined())
+ {
+ LLFloaterReporter::showFromExperience(event[LLExperienceCache::EXPERIENCE_ID].asUUID());
+ }
+}
+
+void LLPanelExperienceLog::onNotify()
+{
+ LLSD event = getSelectedEvent();
+ if(event.isDefined())
+ {
+ LLExperienceLog::instance().notify(event);
+ }
+}
+
+void LLPanelExperienceLog::onNext()
+{
+ mCurrentPage++;
+ refresh();
+}
+
+void LLPanelExperienceLog::onPrev()
+{
+ if(mCurrentPage>0)
+ {
+ mCurrentPage--;
+ refresh();
+ }
+}
+
+void LLPanelExperienceLog::notifyChanged()
+{
+ LLExperienceLog::instance().setNotifyNewEvent(getChild<LLCheckBoxCtrl>("notify_all")->get());
+}
+
+void LLPanelExperienceLog::logSizeChanged()
+{
+ int value = (int)(getChild<LLSpinCtrl>("logsizespinner")->get());
+ bool dirty = value > 0 && value < LLExperienceLog::instance().getMaxDays();
+ LLExperienceLog::instance().setMaxDays(value);
+ if(dirty)
+ {
+ refresh();
+ }
+}
+
+void LLPanelExperienceLog::onSelectionChanged()
+{
+ bool enabled = (1 == mEventList->getNumSelected());
+ getChild<LLButton>(BTN_REPORT_XP)->setEnabled(enabled);
+ getChild<LLButton>(BTN_PROFILE_XP)->setEnabled(enabled);
+ getChild<LLButton>("btn_notify")->setEnabled(enabled);
+}
+
+LLSD LLPanelExperienceLog::getSelectedEvent()
+{
+ LLScrollListItem* item = mEventList->getFirstSelected();
+ if(item)
+ {
+ return item->getValue();
+ }
+ return LLSD();
+}
diff --git a/indra/newview/llpanelexperiencelog.h b/indra/newview/llpanelexperiencelog.h
new file mode 100644
index 0000000000..4135d9cac9
--- /dev/null
+++ b/indra/newview/llpanelexperiencelog.h
@@ -0,0 +1,64 @@
+/**
+ * @file llpanelexperiencelog.h
+ * @brief llpanelexperiencelog and related class definitions
+ *
+ * $LicenseInfo:firstyear=2014&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2014, 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_LLPANELEXPERIENCELOG_H
+#define LL_LLPANELEXPERIENCELOG_H
+
+#include "llpanel.h"
+class LLScrollListCtrl;
+
+class LLPanelExperienceLog
+ : public LLPanel
+{
+public:
+
+ LLPanelExperienceLog();
+
+ static LLPanelExperienceLog* create();
+
+ /*virtual*/ BOOL postBuild(void);
+
+ void refresh();
+protected:
+ void logSizeChanged();
+ void notifyChanged();
+ void onNext();
+ void onNotify();
+ void onPrev();
+ void onProfileExperience();
+ void onReportExperience();
+ void onSelectionChanged();
+
+ LLSD getSelectedEvent();
+private:
+ LLScrollListCtrl* mEventList;
+ U32 mPageSize;
+ U32 mCurrentPage;
+ boost::signals2::scoped_connection mNewEvent;
+};
+
+#endif // LL_LLPANELEXPERIENCELOG_H
diff --git a/indra/newview/llpanelexperiencepicker.cpp b/indra/newview/llpanelexperiencepicker.cpp
new file mode 100644
index 0000000000..43dc7569a4
--- /dev/null
+++ b/indra/newview/llpanelexperiencepicker.cpp
@@ -0,0 +1,483 @@
+/**
+* @file llpanelexperiencepicker.cpp
+* @brief Implementation of llpanelexperiencepicker
+* @author dolphin@lindenlab.com
+*
+* $LicenseInfo:firstyear=2014&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2014, 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 "llpanelexperiencepicker.h"
+
+
+#include "lllineeditor.h"
+#include "llfloaterreg.h"
+#include "llscrolllistctrl.h"
+#include "llviewerregion.h"
+#include "llagent.h"
+#include "llexperiencecache.h"
+#include "llslurl.h"
+#include "llavatarnamecache.h"
+#include "llcombobox.h"
+#include "llviewercontrol.h"
+#include "llfloater.h"
+#include "lltrans.h"
+#include <boost/regex.hpp>
+
+#define BTN_FIND "find"
+#define BTN_OK "ok_btn"
+#define BTN_CANCEL "cancel_btn"
+#define BTN_PROFILE "profile_btn"
+#define BTN_LEFT "left_btn"
+#define BTN_RIGHT "right_btn"
+#define TEXT_EDIT "edit"
+#define TEXT_MATURITY "maturity"
+#define LIST_RESULTS "search_results"
+#define PANEL_SEARCH "search_panel"
+
+const static std::string columnSpace = " ";
+
+static LLPanelInjector<LLPanelExperiencePicker> t_panel_status("llpanelexperiencepicker");
+
+class LLExperienceSearchResponder : public LLHTTPClient::Responder
+{
+public:
+ LLUUID mQueryID;
+ LLHandle<LLPanelExperiencePicker> mParent;
+
+ LLExperienceSearchResponder(const LLUUID& id, const LLHandle<LLPanelExperiencePicker>& parent) : mQueryID(id), mParent(parent) { }
+
+protected:
+ /*virtual*/ void httpSuccess()
+ {
+ if(mParent.isDead())
+ return;
+
+ LLPanelExperiencePicker* panel =mParent.get();
+ if (panel)
+ {
+ panel->processResponse(mQueryID, getContent());
+ }
+ }
+
+ /*virtual*/ void httpFailure()
+ {
+ if(mParent.isDead())
+ return;
+
+ LLPanelExperiencePicker* panel =mParent.get();
+ if (panel)
+ {
+ panel->processResponse(mQueryID, LLSD());
+ }
+ LL_WARNS() << "experience picker failed [status:" << getStatus() << "]: " << getContent() << LL_ENDL;
+ }
+};
+
+LLPanelExperiencePicker::LLPanelExperiencePicker()
+ :LLPanel()
+{
+ buildFromFile("panel_experience_search.xml");
+ setDefaultFilters();
+}
+
+LLPanelExperiencePicker::~LLPanelExperiencePicker()
+{
+}
+
+BOOL LLPanelExperiencePicker::postBuild()
+{
+ getChild<LLLineEditor>(TEXT_EDIT)->setKeystrokeCallback( boost::bind(&LLPanelExperiencePicker::editKeystroke, this, _1, _2),NULL);
+
+ childSetAction(BTN_FIND, boost::bind(&LLPanelExperiencePicker::onBtnFind, this));
+ getChildView(BTN_FIND)->setEnabled(TRUE);
+
+ LLScrollListCtrl* searchresults = getChild<LLScrollListCtrl>(LIST_RESULTS);
+ searchresults->setDoubleClickCallback( boost::bind(&LLPanelExperiencePicker::onBtnSelect, this));
+ searchresults->setCommitCallback(boost::bind(&LLPanelExperiencePicker::onList, this));
+ getChildView(LIST_RESULTS)->setEnabled(FALSE);
+ getChild<LLScrollListCtrl>(LIST_RESULTS)->setCommentText(getString("no_results"));
+
+ childSetAction(BTN_OK, boost::bind(&LLPanelExperiencePicker::onBtnSelect, this));
+ getChildView(BTN_OK)->setEnabled(FALSE);
+ childSetAction(BTN_CANCEL, boost::bind(&LLPanelExperiencePicker::onBtnClose, this));
+ childSetAction(BTN_PROFILE, boost::bind(&LLPanelExperiencePicker::onBtnProfile, this));
+ getChildView(BTN_PROFILE)->setEnabled(FALSE);
+
+ getChild<LLComboBox>(TEXT_MATURITY)->setCurrentByIndex(2);
+ getChild<LLComboBox>(TEXT_MATURITY)->setCommitCallback(boost::bind(&LLPanelExperiencePicker::onMaturity, this));
+ getChild<LLUICtrl>(TEXT_EDIT)->setFocus(TRUE);
+
+ childSetAction(BTN_LEFT, boost::bind(&LLPanelExperiencePicker::onPage, this, -1));
+ childSetAction(BTN_RIGHT, boost::bind(&LLPanelExperiencePicker::onPage, this, 1));
+
+ LLPanel* search_panel = getChild<LLPanel>(PANEL_SEARCH);
+ if (search_panel)
+ {
+ // Start searching when Return is pressed in the line editor.
+ search_panel->setDefaultBtn(BTN_FIND);
+ }
+ return TRUE;
+}
+
+void LLPanelExperiencePicker::editKeystroke( class LLLineEditor* caller, void* user_data )
+{
+ getChildView(BTN_FIND)->setEnabled(true);
+}
+
+void LLPanelExperiencePicker::onBtnFind()
+{
+ mCurrentPage=1;
+ boost::cmatch what;
+ std::string text = getChild<LLUICtrl>(TEXT_EDIT)->getValue().asString();
+ const boost::regex expression("secondlife:///app/experience/[\\da-f-]+/profile");
+ if (boost::regex_match(text.c_str(), what, expression))
+ {
+ LLURI uri(text);
+ LLSD path_array = uri.pathArray();
+ if (path_array.size() == 4)
+ {
+ std::string exp_id = path_array.get(2).asString();
+ LLUUID experience_id(exp_id);
+ if (!experience_id.isNull())
+ {
+ const LLSD& experience_details = LLExperienceCache::get(experience_id);
+ if(!experience_details.isUndefined())
+ {
+ std::string experience_name_string = experience_details[LLExperienceCache::NAME].asString();
+ if(!experience_name_string.empty())
+ {
+ getChild<LLUICtrl>(TEXT_EDIT)->setValue(experience_name_string);
+ }
+ }
+ else
+ {
+ getChild<LLScrollListCtrl>(LIST_RESULTS)->deleteAllItems();
+ getChild<LLScrollListCtrl>(LIST_RESULTS)->setCommentText(getString("searching"));
+
+ getChildView(BTN_OK)->setEnabled(FALSE);
+ getChildView(BTN_PROFILE)->setEnabled(FALSE);
+
+ getChildView(BTN_RIGHT)->setEnabled(FALSE);
+ getChildView(BTN_LEFT)->setEnabled(FALSE);
+ LLExperienceCache::get(experience_id, boost::bind(&LLPanelExperiencePicker::onBtnFind, this));
+ return;
+ }
+ }
+ }
+ }
+
+
+ find();
+}
+
+void LLPanelExperiencePicker::onList()
+{
+ bool enabled = isSelectButtonEnabled();
+ getChildView(BTN_OK)->setEnabled(enabled);
+
+ enabled = enabled && getChild<LLScrollListCtrl>(LIST_RESULTS)->getNumSelected() == 1;
+ getChildView(BTN_PROFILE)->setEnabled(enabled);
+}
+
+void LLPanelExperiencePicker::find()
+{
+ std::string text = getChild<LLUICtrl>(TEXT_EDIT)->getValue().asString();
+ mQueryID.generate();
+ std::ostringstream url;
+
+ LLViewerRegion* region = gAgent.getRegion();
+ std::string cap = region->getCapability("FindExperienceByName");
+ if (!cap.empty())
+ {
+ url << cap << "?page=" << mCurrentPage << "&page_size=30&query=" << LLURI::escape(text);
+ LLHTTPClient::get(url.str(), new LLExperienceSearchResponder(mQueryID, getDerivedHandle<LLPanelExperiencePicker>()));
+
+ }
+ getChild<LLScrollListCtrl>(LIST_RESULTS)->deleteAllItems();
+ getChild<LLScrollListCtrl>(LIST_RESULTS)->setCommentText(getString("searching"));
+
+ getChildView(BTN_OK)->setEnabled(FALSE);
+ getChildView(BTN_PROFILE)->setEnabled(FALSE);
+
+ getChildView(BTN_RIGHT)->setEnabled(FALSE);
+ getChildView(BTN_LEFT)->setEnabled(FALSE);
+}
+
+bool LLPanelExperiencePicker::isSelectButtonEnabled()
+{
+ LLScrollListCtrl* list=getChild<LLScrollListCtrl>(LIST_RESULTS);
+ return list->getFirstSelectedIndex() >=0;
+}
+
+void LLPanelExperiencePicker::getSelectedExperienceIds( const LLScrollListCtrl* results, uuid_vec_t &experience_ids )
+{
+ std::vector<LLScrollListItem*> items = results->getAllSelected();
+ for(std::vector<LLScrollListItem*>::iterator it = items.begin(); it != items.end(); ++it)
+ {
+ LLScrollListItem* item = *it;
+ if (item->getUUID().notNull())
+ {
+ experience_ids.push_back(item->getUUID());
+ }
+ }
+}
+
+void LLPanelExperiencePicker::setAllowMultiple( bool allow_multiple )
+{
+ getChild<LLScrollListCtrl>(LIST_RESULTS)->setAllowMultipleSelection(allow_multiple);
+}
+
+
+void name_callback(const LLHandle<LLPanelExperiencePicker>& floater, const LLUUID& experience_id, const LLUUID& agent_id, const LLAvatarName& av_name)
+{
+ if(floater.isDead())
+ return;
+ LLPanelExperiencePicker* picker = floater.get();
+ LLScrollListCtrl* search_results = picker->getChild<LLScrollListCtrl>(LIST_RESULTS);
+
+ LLScrollListItem* item = search_results->getItem(experience_id);
+ if(!item)
+ return;
+
+ item->getColumn(2)->setValue(columnSpace+av_name.getDisplayName());
+
+}
+
+void LLPanelExperiencePicker::processResponse( const LLUUID& query_id, const LLSD& content )
+{
+ if(query_id != mQueryID)
+ {
+ return;
+ }
+
+ mResponse = content;
+
+ const LLSD& experiences=mResponse["experience_keys"];
+ LLSD::array_const_iterator it = experiences.beginArray();
+ for ( ; it != experiences.endArray(); ++it)
+ {
+ LLExperienceCache::insert(*it);
+ }
+
+ getChildView(BTN_RIGHT)->setEnabled(content.has("next_page_url"));
+ getChildView(BTN_LEFT)->setEnabled(content.has("previous_page_url"));
+
+ filterContent();
+
+}
+
+void LLPanelExperiencePicker::onBtnSelect()
+{
+ if(!isSelectButtonEnabled())
+ {
+ return;
+ }
+
+ if(mSelectionCallback)
+ {
+ const LLScrollListCtrl* results = getChild<LLScrollListCtrl>(LIST_RESULTS);
+ uuid_vec_t experience_ids;
+
+ getSelectedExperienceIds(results, experience_ids);
+ mSelectionCallback(experience_ids);
+ getChild<LLScrollListCtrl>(LIST_RESULTS)->deselectAllItems(TRUE);
+ if(mCloseOnSelect)
+ {
+ mCloseOnSelect = FALSE;
+ onBtnClose();
+ }
+ }
+ else
+ {
+ onBtnProfile();
+ }
+}
+
+void LLPanelExperiencePicker::onBtnClose()
+{
+ LLFloater* floater = getParentByType<LLFloater>();
+ if (floater)
+ {
+ floater->closeFloater();
+ }
+}
+
+void LLPanelExperiencePicker::onBtnProfile()
+{
+ LLScrollListItem* item = getChild<LLScrollListCtrl>(LIST_RESULTS)->getFirstSelected();
+ if(item)
+ {
+ LLFloaterReg::showInstance("experience_profile", item->getUUID(), true);
+ }
+}
+
+std::string LLPanelExperiencePicker::getMaturityString(int maturity)
+{
+ if(maturity <= SIM_ACCESS_PG)
+ {
+ return getString("maturity_icon_general");
+ }
+ else if(maturity <= SIM_ACCESS_MATURE)
+ {
+ return getString("maturity_icon_moderate");
+ }
+ return getString("maturity_icon_adult");
+}
+
+void LLPanelExperiencePicker::filterContent()
+{
+ LLScrollListCtrl* search_results = getChild<LLScrollListCtrl>(LIST_RESULTS);
+
+ const LLSD& experiences=mResponse["experience_keys"];
+
+ search_results->deleteAllItems();
+
+ LLSD item;
+ LLSD::array_const_iterator it = experiences.beginArray();
+ for ( ; it != experiences.endArray(); ++it)
+ {
+ const LLSD& experience = *it;
+
+ if(isExperienceHidden(experience))
+ continue;
+
+ std::string experience_name_string = experience[LLExperienceCache::NAME].asString();
+ if (experience_name_string.empty())
+ {
+ experience_name_string = LLTrans::getString("ExperienceNameUntitled");
+ }
+
+ item["id"]=experience[LLExperienceCache::EXPERIENCE_ID];
+ LLSD& columns = item["columns"];
+ columns[0]["column"] = "maturity";
+ columns[0]["value"] = getMaturityString(experience[LLExperienceCache::MATURITY].asInteger());
+ columns[0]["type"]="icon";
+ columns[0]["halign"]="right";
+ columns[1]["column"] = "experience_name";
+ columns[1]["value"] = columnSpace+experience_name_string;
+ columns[2]["column"] = "owner";
+ columns[2]["value"] = columnSpace+getString("loading");
+ search_results->addElement(item);
+ LLAvatarNameCache::get(experience[LLExperienceCache::AGENT_ID], boost::bind(name_callback, getDerivedHandle<LLPanelExperiencePicker>(), experience[LLExperienceCache::EXPERIENCE_ID], _1, _2));
+ }
+
+ if (search_results->isEmpty())
+ {
+ LLStringUtil::format_map_t map;
+ std::string search_text = getChild<LLUICtrl>(TEXT_EDIT)->getValue().asString();
+ map["[TEXT]"] = search_text;
+ if (search_text.empty())
+ {
+ getChild<LLScrollListCtrl>(LIST_RESULTS)->setCommentText(getString("no_results"));
+ }
+ else
+ {
+ getChild<LLScrollListCtrl>(LIST_RESULTS)->setCommentText(getString("not_found", map));
+ }
+ search_results->setEnabled(false);
+ getChildView(BTN_OK)->setEnabled(false);
+ getChildView(BTN_PROFILE)->setEnabled(false);
+ }
+ else
+ {
+ getChildView(BTN_OK)->setEnabled(true);
+ search_results->setEnabled(true);
+ search_results->sortByColumnIndex(1, TRUE);
+ std::string text = getChild<LLUICtrl>(TEXT_EDIT)->getValue().asString();
+ if (!search_results->selectItemByLabel(text, TRUE, 1))
+ {
+ search_results->selectFirstItem();
+ }
+ onList();
+ search_results->setFocus(TRUE);
+ }
+}
+
+void LLPanelExperiencePicker::onMaturity()
+{
+ if(mResponse.has("experience_keys") && mResponse["experience_keys"].beginArray() != mResponse["experience_keys"].endArray())
+ {
+ filterContent();
+ }
+}
+
+bool LLPanelExperiencePicker::isExperienceHidden( const LLSD& experience) const
+{
+ bool hide=false;
+ filter_list::const_iterator it = mFilters.begin();
+ for(/**/;it != mFilters.end(); ++it)
+ {
+ if((*it)(experience)){
+ return true;
+ }
+ }
+
+ return hide;
+}
+
+bool LLPanelExperiencePicker::FilterOverRating( const LLSD& experience )
+{
+ int maturity = getChild<LLComboBox>(TEXT_MATURITY)->getSelectedValue().asInteger();
+ return experience[LLExperienceCache::MATURITY].asInteger() > maturity;
+}
+
+bool LLPanelExperiencePicker::FilterWithProperty( const LLSD& experience, S32 prop)
+{
+ return (experience[LLExperienceCache::PROPERTIES].asInteger() & prop) != 0;
+}
+
+bool LLPanelExperiencePicker::FilterWithoutProperties( const LLSD& experience, S32 prop)
+{
+ return ((experience[LLExperienceCache::PROPERTIES].asInteger() & prop) == prop);
+}
+
+bool LLPanelExperiencePicker::FilterWithoutProperty( const LLSD& experience, S32 prop )
+{
+ return (experience[LLExperienceCache::PROPERTIES].asInteger() & prop) == 0;
+}
+
+void LLPanelExperiencePicker::setDefaultFilters()
+{
+ mFilters.clear();
+ addFilter(boost::bind(&LLPanelExperiencePicker::FilterOverRating, this, _1));
+}
+
+bool LLPanelExperiencePicker::FilterMatching( const LLSD& experience, const LLUUID& id )
+{
+ if(experience.isUUID())
+ {
+ return experience.asUUID() == id;
+ }
+ return experience[LLExperienceCache::EXPERIENCE_ID].asUUID() == id;
+}
+
+void LLPanelExperiencePicker::onPage( S32 direction )
+{
+ mCurrentPage += direction;
+ if(mCurrentPage < 1)
+ {
+ mCurrentPage = 1;
+ }
+ find();
+}
diff --git a/indra/newview/llpanelexperiencepicker.h b/indra/newview/llpanelexperiencepicker.h
new file mode 100644
index 0000000000..e39ffed70b
--- /dev/null
+++ b/indra/newview/llpanelexperiencepicker.h
@@ -0,0 +1,95 @@
+/**
+* @file llpanelexperiencepicker.h
+* @brief Header file for llpanelexperiencepicker
+* @author dolphin@lindenlab.com
+*
+* $LicenseInfo:firstyear=2014&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2014, 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_LLPANELEXPERIENCEPICKER_H
+#define LL_LLPANELEXPERIENCEPICKER_H
+
+#include "llpanel.h"
+
+class LLScrollListCtrl;
+class LLLineEditor;
+
+
+class LLPanelExperiencePicker : public LLPanel
+{
+public:
+ friend class LLExperienceSearchResponder;
+ friend class LLFloaterExperiencePicker;
+
+ typedef boost::function<void (const uuid_vec_t&)> select_callback_t;
+ // filter function for experiences, return true if the experience should be hidden.
+ typedef boost::function<bool (const LLSD&)> filter_function;
+ typedef std::vector<filter_function> filter_list;
+
+ LLPanelExperiencePicker();
+ virtual ~LLPanelExperiencePicker();
+
+ BOOL postBuild();
+
+ void addFilter(filter_function func){mFilters.push_back(func);}
+ template <class IT>
+ void addFilters(IT begin, IT end){mFilters.insert(mFilters.end(), begin, end);}
+ void setDefaultFilters();
+
+ static bool FilterWithProperty(const LLSD& experience, S32 prop);
+ static bool FilterWithoutProperties(const LLSD& experience, S32 prop);
+ static bool FilterWithoutProperty(const LLSD& experience, S32 prop);
+ static bool FilterMatching(const LLSD& experience, const LLUUID& id);
+ bool FilterOverRating(const LLSD& experience);
+
+private:
+ void editKeystroke(LLLineEditor* caller, void* user_data);
+
+ void onBtnFind();
+ void onBtnSelect();
+ void onBtnClose();
+ void onBtnProfile();
+ void onList();
+ void onMaturity();
+ void onPage(S32 direction);
+
+ void getSelectedExperienceIds( const LLScrollListCtrl* results, uuid_vec_t &experience_ids );
+ void setAllowMultiple(bool allow_multiple);
+
+
+ void find();
+ bool isSelectButtonEnabled();
+ void processResponse( const LLUUID& query_id, const LLSD& content );
+
+ void filterContent();
+ bool isExperienceHidden(const LLSD& experience) const ;
+ std::string getMaturityString(int maturity);
+
+
+ select_callback_t mSelectionCallback;
+ filter_list mFilters;
+ LLUUID mQueryID;
+ LLSD mResponse;
+ bool mCloseOnSelect;
+ S32 mCurrentPage;
+};
+
+#endif // LL_LLPANELEXPERIENCEPICKER_H
diff --git a/indra/newview/llpanelexperiences.cpp b/indra/newview/llpanelexperiences.cpp
new file mode 100644
index 0000000000..3ee4b5e968
--- /dev/null
+++ b/indra/newview/llpanelexperiences.cpp
@@ -0,0 +1,218 @@
+/**
+ * @file llpanelexperiences.cpp
+ * @brief LLPanelExperiences class implementation
+ *
+ * $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 "llpanelprofile.h"
+#include "lluictrlfactory.h"
+#include "llexperiencecache.h"
+#include "llagent.h"
+
+#include "llpanelexperiences.h"
+#include "llslurl.h"
+#include "lllayoutstack.h"
+
+
+
+static LLPanelInjector<LLPanelExperiences> register_experiences_panel("experiences_panel");
+
+
+//comparators
+static const LLExperienceItemComparator NAME_COMPARATOR;
+
+LLPanelExperiences::LLPanelExperiences( )
+ : mExperiencesList(NULL)
+{
+ buildFromFile("panel_experiences.xml");
+}
+
+BOOL LLPanelExperiences::postBuild( void )
+{
+ mExperiencesList = getChild<LLFlatListView>("experiences_list");
+ if (hasString("loading_experiences"))
+ {
+ mExperiencesList->setNoItemsCommentText(getString("loading_experiences"));
+ }
+ else if (hasString("no_experiences"))
+ {
+ mExperiencesList->setNoItemsCommentText(getString("no_experiences"));
+ }
+ mExperiencesList->setComparator(&NAME_COMPARATOR);
+
+ return TRUE;
+}
+
+
+
+LLExperienceItem* LLPanelExperiences::getSelectedExperienceItem()
+{
+ LLPanel* selected_item = mExperiencesList->getSelectedItem();
+ if (!selected_item) return NULL;
+
+ return dynamic_cast<LLExperienceItem*>(selected_item);
+}
+
+void LLPanelExperiences::setExperienceList( const LLSD& experiences )
+{
+ if (hasString("no_experiences"))
+ {
+ mExperiencesList->setNoItemsCommentText(getString("no_experiences"));
+ }
+ mExperiencesList->clear();
+
+ LLSD::array_const_iterator it = experiences.beginArray();
+ for( /**/ ; it != experiences.endArray(); ++it)
+ {
+ LLUUID public_key = it->asUUID();
+ LLExperienceItem* item = new LLExperienceItem();
+
+ item->init(public_key);
+ mExperiencesList->addItem(item, public_key);
+ }
+
+ mExperiencesList->sort();
+}
+
+LLPanelExperiences* LLPanelExperiences::create(const std::string& name)
+{
+ LLPanelExperiences* panel= new LLPanelExperiences();
+ panel->setName(name);
+ return panel;
+}
+
+void LLPanelExperiences::removeExperiences( const LLSD& ids )
+{
+ LLSD::array_const_iterator it = ids.beginArray();
+ for( /**/ ; it != ids.endArray(); ++it)
+ {
+ removeExperience(it->asUUID());
+ }
+}
+
+void LLPanelExperiences::removeExperience( const LLUUID& id )
+{
+ mExperiencesList->removeItemByUUID(id);
+}
+
+void LLPanelExperiences::addExperience( const LLUUID& id )
+{
+ if(!mExperiencesList->getItemByValue(id))
+ {
+ LLExperienceItem* item = new LLExperienceItem();
+
+ item->init(id);
+ mExperiencesList->addItem(item, id);
+ mExperiencesList->sort();
+ }
+}
+
+void LLPanelExperiences::setButtonAction(const std::string& label, const commit_signal_t::slot_type& cb )
+{
+ if(label.empty())
+ {
+ getChild<LLLayoutPanel>("button_panel")->setVisible(false);
+ }
+ else
+ {
+ getChild<LLLayoutPanel>("button_panel")->setVisible(true);
+ LLButton* child = getChild<LLButton>("btn_action");
+ child->setCommitCallback(cb);
+ child->setLabel(getString(label));
+ }
+}
+
+void LLPanelExperiences::enableButton( bool enable )
+{
+ getChild<LLButton>("btn_action")->setEnabled(enable);
+}
+
+
+LLExperienceItem::LLExperienceItem()
+ : mName(NULL)
+{
+ buildFromFile("panel_experience_list_item.xml");
+}
+
+void LLExperienceItem::init( const LLUUID& id)
+{
+ mName = getChild<LLUICtrl>("experience_name");
+ mName->setValue(LLSLURL("experience", id, "profile").getSLURLString());
+}
+
+LLExperienceItem::~LLExperienceItem()
+{
+
+}
+
+std::string LLExperienceItem::getExperienceName() const
+{
+ if (mName)
+ {
+ return mName->getValue();
+ }
+
+ return "";
+}
+
+void LLPanelSearchExperiences::doSearch()
+{
+
+}
+
+LLPanelSearchExperiences* LLPanelSearchExperiences::create( const std::string& name )
+{
+ LLPanelSearchExperiences* panel= new LLPanelSearchExperiences();
+ panel->getChild<LLPanel>("results")->addChild(LLPanelExperiences::create(name));
+ return panel;
+}
+
+BOOL LLPanelSearchExperiences::postBuild( void )
+{
+ childSetAction("search_button", boost::bind(&LLPanelSearchExperiences::doSearch, this));
+ return TRUE;
+}
+
+bool LLExperienceItemComparator::compare(const LLPanel* item1, const LLPanel* item2) const
+{
+ const LLExperienceItem* experience_item1 = dynamic_cast<const LLExperienceItem*>(item1);
+ const LLExperienceItem* experience_item2 = dynamic_cast<const LLExperienceItem*>(item2);
+
+ if (!experience_item1 || !experience_item2)
+ {
+ LL_ERRS() << "item1 and item2 cannot be null" << LL_ENDL;
+ return true;
+ }
+
+ std::string name1 = experience_item1->getExperienceName();
+ std::string name2 = experience_item2->getExperienceName();
+
+ LLStringUtil::toUpper(name1);
+ LLStringUtil::toUpper(name2);
+
+ return name1 < name2;
+}
diff --git a/indra/newview/llpanelexperiences.h b/indra/newview/llpanelexperiences.h
new file mode 100644
index 0000000000..0370499583
--- /dev/null
+++ b/indra/newview/llpanelexperiences.h
@@ -0,0 +1,97 @@
+/**
+ * @file llpanelexperiences.h
+ * @brief LLPanelExperiences class definition
+ *
+ * $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_LLPANELEXPERIENCES_H
+#define LL_LLPANELEXPERIENCES_H
+
+#include "llaccordionctrltab.h"
+#include "llflatlistview.h"
+#include "llpanelavatar.h"
+
+class LLExperienceItem;
+class LLPanelProfile;
+
+
+class LLPanelSearchExperiences
+ : public LLPanel
+{
+public:
+ LLPanelSearchExperiences(){}
+ static LLPanelSearchExperiences* create(const std::string& name);
+ /*virtual*/ BOOL postBuild(void);
+
+ void doSearch();
+};
+
+class LLPanelExperiences
+ : public LLPanel
+{
+public:
+ LLPanelExperiences();
+
+ static LLPanelExperiences* create(const std::string& name);
+
+ /*virtual*/ BOOL postBuild(void);
+ /*virtual*/ void onClosePanel();
+
+ void setExperienceList(const LLSD& experiences);
+
+ LLExperienceItem* getSelectedExperienceItem();
+ void removeExperiences( const LLSD& ids );
+ void removeExperience( const LLUUID& id);
+ void addExperience( const LLUUID& id);
+ void setButtonAction(const std::string& label, const commit_signal_t::slot_type& cb);
+ void enableButton(bool enable);
+protected:
+
+private:
+ LLFlatListView* mExperiencesList;
+};
+
+class LLExperienceItemComparator : public LLFlatListView::ItemComparator
+{
+ LOG_CLASS(LLExperienceItemComparator);
+
+public:
+ LLExperienceItemComparator() {};
+ virtual ~LLExperienceItemComparator() {};
+
+ virtual bool compare(const LLPanel* item1, const LLPanel* item2) const;
+};
+
+class LLExperienceItem
+ : public LLPanel
+{
+public:
+ LLExperienceItem();
+ ~LLExperienceItem();
+
+ void init(const LLUUID& experience_id);
+ std::string getExperienceName() const;
+protected:
+ LLUICtrl* mName;
+};
+#endif // LL_LLPANELEXPERIENCES_H
diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h
index 9823e84cd9..d7e89b4832 100755
--- a/indra/newview/llpanelface.h
+++ b/indra/newview/llpanelface.h
@@ -307,7 +307,7 @@ private:
LLMaterialMgr::getInstance()->put(object->getID(),face,*new_material);
}
- object->setTEMaterialParams(face, new_material);
+ object->setTEMaterialParams(face, new_material, TRUE);
return new_material;
}
return NULL;
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index f4aab6bd4e..342b57ba4a 100755
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -177,11 +177,13 @@ BOOL LLPanelGroup::postBuild()
LLPanelGroupTab* panel_roles = findChild<LLPanelGroupTab>("group_roles_tab_panel");
LLPanelGroupTab* panel_notices = findChild<LLPanelGroupTab>("group_notices_tab_panel");
LLPanelGroupTab* panel_land = findChild<LLPanelGroupTab>("group_land_tab_panel");
+ LLPanelGroupTab* panel_experiences = findChild<LLPanelGroupTab>("group_experiences_tab_panel");
if(panel_general) mTabs.push_back(panel_general);
if(panel_roles) mTabs.push_back(panel_roles);
if(panel_notices) mTabs.push_back(panel_notices);
if(panel_land) mTabs.push_back(panel_land);
+ if(panel_experiences) mTabs.push_back(panel_experiences);
if(panel_general)
{
@@ -336,7 +338,7 @@ void LLPanelGroup::update(LLGroupChange gc)
group_name_ctrl->setToolTip(group_name);
LLGroupData agent_gdatap;
- bool is_member = gAgent.getGroupData(mID,agent_gdatap) || gAgent.isGodlike();
+ bool is_member = gAgent.getGroupData(mID,agent_gdatap) || gAgent.isGodlikeWithoutAdminMenuFakery();
bool join_btn_visible = !is_member && gdatap->mOpenEnrollment;
mButtonJoin->setVisible(join_btn_visible);
@@ -418,6 +420,7 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
LLAccordionCtrlTab* tab_roles = getChild<LLAccordionCtrlTab>("group_roles_tab");
LLAccordionCtrlTab* tab_notices = getChild<LLAccordionCtrlTab>("group_notices_tab");
LLAccordionCtrlTab* tab_land = getChild<LLAccordionCtrlTab>("group_land_tab");
+ LLAccordionCtrlTab* tab_experiences = getChild<LLAccordionCtrlTab>("group_experiences_tab");
if(mButtonJoin)
mButtonJoin->setVisible(false);
@@ -434,10 +437,13 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
tab_notices->changeOpenClose(tab_notices->getDisplayChildren());
if(tab_land->getDisplayChildren())
tab_land->changeOpenClose(tab_land->getDisplayChildren());
+ if(tab_experiences->getDisplayChildren())
+ tab_experiences->changeOpenClose(tab_land->getDisplayChildren());
tab_roles->setVisible(false);
tab_notices->setVisible(false);
tab_land->setVisible(false);
+ tab_experiences->setVisible(false);
getChild<LLUICtrl>("group_name")->setVisible(false);
getChild<LLUICtrl>("group_name_editor")->setVisible(true);
@@ -459,14 +465,17 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
tab_notices->changeOpenClose(tab_notices->getDisplayChildren());
if(tab_land->getDisplayChildren())
tab_land->changeOpenClose(tab_land->getDisplayChildren());
+ if(tab_experiences->getDisplayChildren())
+ tab_experiences->changeOpenClose(tab_land->getDisplayChildren());
}
LLGroupData agent_gdatap;
- bool is_member = gAgent.getGroupData(mID,agent_gdatap) || gAgent.isGodlike();
+ bool is_member = gAgent.getGroupData(mID,agent_gdatap) || gAgent.isGodlikeWithoutAdminMenuFakery();
tab_roles->setVisible(is_member);
tab_notices->setVisible(is_member);
tab_land->setVisible(is_member);
+ tab_experiences->setVisible(is_member);
getChild<LLUICtrl>("group_name")->setVisible(true);
getChild<LLUICtrl>("group_name_editor")->setVisible(false);
@@ -534,6 +543,7 @@ bool LLPanelGroup::apply()
&& apply(findChild<LLPanelGroupTab>("group_roles_tab_panel"))
&& apply(findChild<LLPanelGroupTab>("group_notices_tab_panel"))
&& apply(findChild<LLPanelGroupTab>("group_land_tab_panel"))
+ && apply(findChild<LLPanelGroupTab>("group_experiences_tab_panel"))
;
}
diff --git a/indra/newview/llpanelgroupbulk.cpp b/indra/newview/llpanelgroupbulk.cpp
index 76792cc6fd..cffda02aa0 100644
--- a/indra/newview/llpanelgroupbulk.cpp
+++ b/indra/newview/llpanelgroupbulk.cpp
@@ -97,6 +97,7 @@ void LLPanelGroupBulkImpl::callbackClickAdd(void* userdata)
if(picker)
{
root_floater->addDependentFloater(picker);
+ LLGroupMgr::getInstance()->sendCapGroupMembersRequest(panelp->mImplementation->mGroupID);
}
}
}
diff --git a/indra/newview/llpanelgroupexperiences.cpp b/indra/newview/llpanelgroupexperiences.cpp
new file mode 100644
index 0000000000..76b68122fb
--- /dev/null
+++ b/indra/newview/llpanelgroupexperiences.cpp
@@ -0,0 +1,143 @@
+/**
+ * @file llpanelgroupexperiences.cpp
+ * @brief List of experiences owned by a group.
+ *
+ * $LicenseInfo:firstyear=2006&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 "llpanelgroupexperiences.h"
+
+#include "lluictrlfactory.h"
+#include "roles_constants.h"
+
+#include "llhttpclient.h"
+#include "llagent.h"
+#include "llviewerregion.h"
+#include "llflatlistview.h"
+#include "llpanelexperiences.h"
+#include "llsd.h"
+
+
+static LLPanelInjector<LLPanelGroupExperiences> t_panel_group_experiences("panel_group_experiences");
+
+
+class LLGroupExperienceResponder : public LLHTTPClient::Responder
+{
+public:
+ LLHandle<LLPanelGroupExperiences> mHandle;
+
+ LLGroupExperienceResponder(LLHandle<LLPanelGroupExperiences> handle) : mHandle(handle) { }
+
+protected:
+ /*virtual*/ void httpSuccess()
+ {
+ if (mHandle.isDead())
+ {
+ return;
+ }
+
+ LLPanelGroupExperiences* panel = mHandle.get();
+ if (panel)
+ {
+ panel->setExperienceList(getContent().get("experience_ids"));
+ }
+ }
+
+ /*virtual*/ void httpFailure()
+ {
+ LL_WARNS() << "experience responder failed [status:" << getStatus() << "]: " << getContent() << LL_ENDL;
+ }
+};
+
+LLPanelGroupExperiences::LLPanelGroupExperiences()
+: LLPanelGroupTab(), mExperiencesList(NULL)
+{
+}
+
+LLPanelGroupExperiences::~LLPanelGroupExperiences()
+{
+}
+
+BOOL LLPanelGroupExperiences::postBuild()
+{
+ mExperiencesList = getChild<LLFlatListView>("experiences_list");
+ if (hasString("loading_experiences"))
+ {
+ mExperiencesList->setNoItemsCommentText(getString("loading_experiences"));
+ }
+ else if (hasString("no_experiences"))
+ {
+ mExperiencesList->setNoItemsCommentText(getString("no_experiences"));
+ }
+
+ return LLPanelGroupTab::postBuild();
+}
+
+void LLPanelGroupExperiences::activate()
+{
+ if (getGroupID() == LLUUID::null)
+ {
+ return;
+ }
+
+ // search for experiences owned by the current group
+ std::string url = gAgent.getRegion()->getCapability("GroupExperiences");
+ if (!url.empty())
+ {
+ url += "?" + getGroupID().asString();
+
+ LLHTTPClient::get(url, new LLGroupExperienceResponder(getDerivedHandle<LLPanelGroupExperiences>()));
+ }
+}
+
+void LLPanelGroupExperiences::setGroupID(const LLUUID& id)
+{
+ LLPanelGroupTab::setGroupID(id);
+
+ if(id == LLUUID::null)
+ {
+ return;
+ }
+
+ activate();
+}
+
+void LLPanelGroupExperiences::setExperienceList(const LLSD& experiences)
+{
+ if (hasString("no_experiences"))
+ {
+ mExperiencesList->setNoItemsCommentText(getString("no_experiences"));
+ }
+ mExperiencesList->clear();
+
+ LLSD::array_const_iterator it = experiences.beginArray();
+ for ( /**/ ; it != experiences.endArray(); ++it)
+ {
+ LLUUID public_key = it->asUUID();
+ LLExperienceItem* item = new LLExperienceItem();
+
+ item->init(public_key);
+ mExperiencesList->addItem(item, public_key);
+ }
+}
diff --git a/indra/newview/llpanelgroupexperiences.h b/indra/newview/llpanelgroupexperiences.h
new file mode 100644
index 0000000000..ae1ecc1ac5
--- /dev/null
+++ b/indra/newview/llpanelgroupexperiences.h
@@ -0,0 +1,53 @@
+/**
+ * @file llpanelgroupexperiences.h
+ * @brief List of experiences owned by a group.
+ *
+ * $LicenseInfo:firstyear=2006&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_LLPANELGROUPEXPERIENCES_H
+#define LL_LLPANELGROUPEXPERIENCES_H
+
+#include "llpanelgroup.h"
+
+class LLFlatListView;
+
+class LLPanelGroupExperiences : public LLPanelGroupTab
+{
+public:
+ LLPanelGroupExperiences();
+ virtual ~LLPanelGroupExperiences();
+
+ // LLPanelGroupTab
+ virtual void activate();
+
+ virtual BOOL postBuild();
+
+ virtual void setGroupID(const LLUUID& id);
+
+ void setExperienceList(const LLSD& experiences);
+
+protected:
+ LLFlatListView* mExperiencesList;
+};
+
+#endif
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index 7ffaa05919..b2164c1f21 100755
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -287,11 +287,6 @@ void LLPanelGroupGeneral::activate()
{
LLGroupMgr::getInstance()->sendGroupTitlesRequest(mGroupID);
LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mGroupID);
-
- if (!gdatap || !gdatap->isMemberDataComplete() )
- {
- LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID);
- }
mFirstUse = FALSE;
}
diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp
index e662a05dfc..866cb8dbef 100755
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -243,56 +243,59 @@ void LLPanelGroupInvite::impl::addRoleNames(LLGroupMgrGroupData* gdatap)
LLGroupMgrGroupData::member_list_t::iterator agent_iter =
gdatap->mMembers.find(gAgent.getID());
+ //loop over the agent's roles in the group
+ //then add those roles to the list of roles that the agent
+ //can invite people to be.
+ //if the user is the owner then we add
+ //all of the roles in the group,
+ //else if they have the add to roles power
+ //we add every role but owner,
+ //else if they have the limited add to roles power
+ //we add every role the user is in,
+ //else we just add to everyone
+ bool is_owner = FALSE;
+ bool can_assign_any = gAgent.hasPowerInGroup(mGroupID,
+ GP_ROLE_ASSIGN_MEMBER);
+ bool can_assign_limited = gAgent.hasPowerInGroup(mGroupID,
+ GP_ROLE_ASSIGN_MEMBER_LIMITED);
+ LLGroupMemberData* member_data = NULL;
//get the member data for the agent if it exists
- if ( agent_iter != gdatap->mMembers.end() )
+ if (agent_iter != gdatap->mMembers.end())
{
- LLGroupMemberData* member_data = (*agent_iter).second;
-
- //loop over the agent's roles in the group
- //then add those roles to the list of roles that the agent
- //can invite people to be
- if ( member_data && mRoleNames)
+ member_data = (*agent_iter).second;
+ if (member_data && mRoleNames)
{
- //if the user is the owner then we add
- //all of the roles in the group
- //else if they have the add to roles power
- //we add every role but owner,
- //else if they have the limited add to roles power
- //we add every role the user is in
- //else we just add to everyone
- bool is_owner = member_data->isOwner();
- bool can_assign_any = gAgent.hasPowerInGroup(mGroupID,
- GP_ROLE_ASSIGN_MEMBER);
- bool can_assign_limited = gAgent.hasPowerInGroup(mGroupID,
- GP_ROLE_ASSIGN_MEMBER_LIMITED);
+ is_owner = member_data->isOwner();
+ }//end if member data is not null
+ }//end if agent is in the group
+
- LLGroupMgrGroupData::role_list_t::iterator rit = gdatap->mRoles.begin();
- LLGroupMgrGroupData::role_list_t::iterator end = gdatap->mRoles.end();
- //populate the role list
- for ( ; rit != end; ++rit)
+ LLGroupMgrGroupData::role_list_t::iterator rit = gdatap->mRoles.begin();
+ LLGroupMgrGroupData::role_list_t::iterator end = gdatap->mRoles.end();
+
+ //populate the role list:
+ for ( ; rit != end; ++rit)
+ {
+ LLUUID role_id = (*rit).first;
+ LLRoleData rd;
+ if ( gdatap->getRoleData(role_id,rd) )
+ {
+ // Owners can add any role.
+ if ( is_owner
+ // Even 'can_assign_any' can't add owner role.
+ || (can_assign_any && role_id != gdatap->mOwnerRole)
+ // Add all roles user is in
+ || (can_assign_limited && member_data && member_data->isInRole(role_id))
+ // Everyone role.
+ || role_id == LLUUID::null )
{
- LLUUID role_id = (*rit).first;
- LLRoleData rd;
- if ( gdatap->getRoleData(role_id,rd) )
- {
- // Owners can add any role.
- if ( is_owner
- // Even 'can_assign_any' can't add owner role.
- || (can_assign_any && role_id != gdatap->mOwnerRole)
- // Add all roles user is in
- || (can_assign_limited && member_data->isInRole(role_id))
- // Everyone role.
- || role_id == LLUUID::null )
- {
- mRoleNames->add(rd.mRoleName,
- role_id,
- ADD_BOTTOM);
- }
- }
+ mRoleNames->add(rd.mRoleName,
+ role_id,
+ ADD_BOTTOM);
}
- }//end if member data is not null
- }//end if agent is in the group
+ }
+ }
}
//static
@@ -579,7 +582,8 @@ void LLPanelGroupInvite::updateLists()
{
waiting = true;
}
- if (gdatap->isRoleDataComplete() && gdatap->isMemberDataComplete() && gdatap->isRoleMemberDataComplete())
+ if (gdatap->isRoleDataComplete() && gdatap->isMemberDataComplete()
+ && (gdatap->isRoleMemberDataComplete() || !gdatap->mMembers.size())) // MAINT-5270: large groups receives an empty members list without some powers, so RoleMemberData wouldn't be complete for them
{
if ( mImplementation->mRoleNames )
{
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index c3a10b3fa0..00c204e702 100755
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -350,12 +350,10 @@ void LLPanelGroupRoles::update(LLGroupChange gc)
void LLPanelGroupRoles::activate()
{
+ if (!gAgent.isInGroup(mGroupID)) return;
+
// Start requesting member and role data if needed.
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
- if (!gdatap || !gdatap->isMemberDataComplete() )
- {
- LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID);
- }
if (!gdatap || !gdatap->isRoleDataComplete() )
{
@@ -364,13 +362,7 @@ void LLPanelGroupRoles::activate()
LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mGroupID);
}
-
- // Check role-member mapping data.
- if (!gdatap || !gdatap->isRoleMemberDataComplete() )
- {
- LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(mGroupID);
- }
-
+
// Need this to get base group member powers
if (!gdatap || !gdatap->isGroupPropertiesDataComplete() )
{
@@ -1163,7 +1155,37 @@ void LLPanelGroupMembersSubTab::onEjectMembers(void *userdata)
if ( selfp )
{
- selfp->handleEjectMembers();
+ selfp->confirmEjectMembers();
+ }
+}
+
+void LLPanelGroupMembersSubTab::confirmEjectMembers()
+{
+ std::vector<LLScrollListItem*> selection = mMembersList->getAllSelected();
+ if (selection.empty()) return;
+
+ S32 selection_count = selection.size();
+ if (selection_count == 1)
+ {
+ LLSD args;
+ std::string fullname;
+ gCacheName->getFullName(mMembersList->getValue(), fullname);
+ args["AVATAR_NAME"] = fullname;
+ LLSD payload;
+ LLNotificationsUtil::add("EjectGroupMemberWarning",
+ args,
+ payload,
+ boost::bind(&LLPanelGroupMembersSubTab::handleEjectCallback, this, _1, _2));
+ }
+ else
+ {
+ LLSD args;
+ args["COUNT"] = llformat("%d", selection_count);
+ LLSD payload;
+ LLNotificationsUtil::add("EjectGroupMembersWarning",
+ args,
+ payload,
+ boost::bind(&LLPanelGroupMembersSubTab::handleEjectCallback, this, _1, _2));
}
}
@@ -1190,6 +1212,16 @@ void LLPanelGroupMembersSubTab::handleEjectMembers()
LLGroupMgr::getInstance()->sendGroupMemberEjects(mGroupID, selected_members);
}
+bool LLPanelGroupMembersSubTab::handleEjectCallback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (0 == option) // Eject button
+ {
+ handleEjectMembers();
+ }
+ return false;
+}
+
void LLPanelGroupMembersSubTab::sendEjectNotifications(const LLUUID& group_id, const uuid_vec_t& selected_members)
{
LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(group_id);
@@ -1327,15 +1359,26 @@ void LLPanelGroupMembersSubTab::handleMemberDoubleClick()
void LLPanelGroupMembersSubTab::activate()
{
+ LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
+
LLPanelGroupSubTab::activate();
if(!mActivated)
{
+ if (!gdatap || !gdatap->isMemberDataComplete())
+ {
+ LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID);
+ }
+
+ if (!gdatap || !gdatap->isRoleMemberDataComplete())
+ {
+ LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(mGroupID);
+ }
+
update(GC_ALL);
mActivated = true;
}
else
{
- LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
// Members can be removed outside of this tab, checking changes
if (!gdatap || (gdatap->isMemberDataComplete() && gdatap->mMembers.size() != mMembersList->getItemCount()))
{
@@ -1636,7 +1679,13 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc)
{
// Build a string with info on retrieval progress.
std::ostringstream retrieved;
- if ( !gdatap->isMemberDataComplete() )
+
+ if ( gdatap->isRoleDataComplete() && gdatap->isMemberDataComplete() && !gdatap->mMembers.size() )
+ {
+ // MAINT-5237
+ retrieved << "Member list not available.";
+ }
+ else if ( !gdatap->isMemberDataComplete() )
{
// Still busy retreiving member list.
retrieved << "Retrieving member list (" << gdatap->mMembers.size()
@@ -1783,7 +1832,7 @@ void LLPanelGroupMembersSubTab::updateMembers()
{
mMembersList->setEnabled(TRUE);
}
- else
+ else if (gdatap->mMembers.size())
{
mMembersList->setEnabled(FALSE);
mMembersList->setCommentText(std::string("No match."));
@@ -1801,7 +1850,47 @@ void LLPanelGroupMembersSubTab::updateMembers()
void LLPanelGroupMembersSubTab::onBanMember(void* user_data)
{
LLPanelGroupMembersSubTab* self = static_cast<LLPanelGroupMembersSubTab*>(user_data);
- self->handleBanMember();
+ self->confirmBanMembers();
+}
+
+void LLPanelGroupMembersSubTab::confirmBanMembers()
+{
+ std::vector<LLScrollListItem*> selection = mMembersList->getAllSelected();
+ if (selection.empty()) return;
+
+ S32 selection_count = selection.size();
+ if (selection_count == 1)
+ {
+ LLSD args;
+ std::string fullname;
+ gCacheName->getFullName(mMembersList->getValue(), fullname);
+ args["AVATAR_NAME"] = fullname;
+ LLSD payload;
+ LLNotificationsUtil::add("BanGroupMemberWarning",
+ args,
+ payload,
+ boost::bind(&LLPanelGroupMembersSubTab::handleBanCallback, this, _1, _2));
+ }
+ else
+ {
+ LLSD args;
+ args["COUNT"] = llformat("%d", selection_count);
+ LLSD payload;
+ LLNotificationsUtil::add("BanGroupMembersWarning",
+ args,
+ payload,
+ boost::bind(&LLPanelGroupMembersSubTab::handleBanCallback, this, _1, _2));
+ }
+}
+
+bool LLPanelGroupMembersSubTab::handleBanCallback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (0 == option) // Eject button
+ {
+ handleBanMember();
+ }
+ return false;
}
void LLPanelGroupMembersSubTab::handleBanMember()
@@ -2111,20 +2200,7 @@ void LLPanelGroupRolesSubTab::update(LLGroupChange gc)
mDeleteRoleButton->setEnabled(FALSE);
}
}
-
- if(!mFirstOpen)
- {
- if (!gdatap || !gdatap->isMemberDataComplete())
- {
- LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID);
- }
-
- if (!gdatap || !gdatap->isRoleMemberDataComplete())
- {
- LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(mGroupID);
- }
- }
-
+
if ((GC_ROLE_MEMBER_DATA == gc || GC_MEMBER_DATA == gc)
&& gdatap
&& gdatap->isMemberDataComplete()
diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h
index 540b24ada6..9a696124a8 100755
--- a/indra/newview/llpanelgrouproles.h
+++ b/indra/newview/llpanelgrouproles.h
@@ -171,6 +171,7 @@ public:
void handleEjectMembers();
void sendEjectNotifications(const LLUUID& group_id, const uuid_vec_t& selected_members);
bool handleEjectCallback(const LLSD& notification, const LLSD& response);
+ void confirmEjectMembers();
static void onRoleCheck(LLUICtrl* check, void* user_data);
void handleRoleCheck(const LLUUID& role_id,
@@ -178,6 +179,8 @@ public:
static void onBanMember(void* user_data);
void handleBanMember();
+ bool handleBanCallback(const LLSD& notification, const LLSD& response);
+ void confirmBanMembers();
void applyMemberChanges();
diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp
index a660cb3b21..06bb886ae8 100755
--- a/indra/newview/llpanellandmarkinfo.cpp
+++ b/indra/newview/llpanellandmarkinfo.cpp
@@ -128,6 +128,10 @@ void LLPanelLandmarkInfo::setInfoType(EInfoType type)
LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
std::string name = parcel_mgr->getAgentParcelName();
LLVector3 agent_pos = gAgent.getPositionAgent();
+
+ std::string desc;
+ LLAgentUI::buildLocationString(desc, LLAgentUI::LOCATION_FORMAT_FULL, agent_pos);
+ mNotesEditor->setText(desc);
if (name.empty())
{
@@ -143,7 +147,8 @@ void LLPanelLandmarkInfo::setInfoType(EInfoType type)
}
else
{
- region_name = getString("unknown");
+ LLAgentUI::buildLocationString(desc, LLAgentUI::LOCATION_FORMAT_NORMAL, agent_pos);
+ region_name = desc;
}
mLandmarkTitleEditor->setText(llformat("%s (%d, %d, %d)",
@@ -154,10 +159,6 @@ void LLPanelLandmarkInfo::setInfoType(EInfoType type)
mLandmarkTitleEditor->setText(name);
}
- std::string desc;
- LLAgentUI::buildLocationString(desc, LLAgentUI::LOCATION_FORMAT_FULL, agent_pos);
- mNotesEditor->setText(desc);
-
// Moved landmark creation here from LLPanelLandmarkInfo::processParcelInfo()
// because we use only agent's current coordinates instead of waiting for
// remote parcel request to complete.
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index cc8c3edd51..953f234a53 100755
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -229,7 +229,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
}
}
server_choice_combo->sortByName();
- server_choice_combo->addSeparator(ADD_TOP);
LL_DEBUGS("AppInit")<<"adding current "<<current_grid<<LL_ENDL;
server_choice_combo->add(LLGridManager::getInstance()->getGridLabel(),
current_grid,
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 17c0b226d0..4229419fce 100755
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -604,7 +604,7 @@ void LLPanelMainInventory::updateItemcountText()
}
else
{
- text = getString("ItemcountUnknown");
+ text = getString("ItemcountUnknown", string_args);
}
mCounterCtrl->setValue(text);
@@ -1134,14 +1134,12 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
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);
- mFilterEditor->setText(item_name);
+ filter.setFindAllLinksMode(item_name, item_id);
+ mFilterEditor->setText(item_name);
mFilterEditor->setFocus(TRUE);
- filter.setFilterUUID(item_id);
- filter.setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- filter.setFilterLinks(LLInventoryFilter::FILTERLINK_ONLY_LINKS);
}
}
diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp
index f7c2f629ec..c5fda3c136 100755
--- a/indra/newview/llpanelmarketplaceinboxinventory.cpp
+++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp
@@ -62,7 +62,7 @@ LLInboxInventoryPanel::LLInboxInventoryPanel(const LLInboxInventoryPanel::Params
LLInboxInventoryPanel::~LLInboxInventoryPanel()
{}
-LLFolderViewFolder * LLInboxInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge)
+LLFolderViewFolder * LLInboxInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge, bool allow_drop)
{
LLUIColor item_color = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
@@ -74,6 +74,7 @@ LLFolderViewFolder * LLInboxInventoryPanel::createFolderViewFolder(LLInvFVBridge
params.tool_tip = params.name;
params.font_color = item_color;
params.font_highlight_color = item_color;
+ params.allow_drop = allow_drop;
return LLUICtrlFactory::create<LLInboxFolderViewFolder>(params);
}
diff --git a/indra/newview/llpanelmarketplaceinboxinventory.h b/indra/newview/llpanelmarketplaceinboxinventory.h
index c05e18c300..66aafe83d1 100755
--- a/indra/newview/llpanelmarketplaceinboxinventory.h
+++ b/indra/newview/llpanelmarketplaceinboxinventory.h
@@ -46,7 +46,7 @@ public:
~LLInboxInventoryPanel();
// virtual
- LLFolderViewFolder * createFolderViewFolder(LLInvFVBridge * bridge);
+ LLFolderViewFolder* createFolderViewFolder(LLInvFVBridge * bridge, bool allow_drop);
LLFolderViewItem * createFolderViewItem(LLInvFVBridge * bridge);
};
diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp
index 2856ea9db1..d7c43c224c 100755
--- a/indra/newview/llpanelmediasettingsgeneral.cpp
+++ b/indra/newview/llpanelmediasettingsgeneral.cpp
@@ -319,6 +319,10 @@ void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& _media
// Helper to set media control to media URL as required
void LLPanelMediaSettingsGeneral::updateMediaPreview()
{
+ if(LLTrans::getString("Multiple Media") == mHomeURL->getValue().asString())
+ {
+ return;
+ }
if ( mHomeURL->getValue().asString().length() > 0 )
{
if(mPreviewMedia->getCurrentNavUrl() != mHomeURL->getValue().asString())
diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp
index 1cdd1b664e..737ae2e32d 100755
--- a/indra/newview/llpanelnearbymedia.cpp
+++ b/indra/newview/llpanelnearbymedia.cpp
@@ -65,6 +65,9 @@ extern LLControlGroup gSavedSettings;
static const LLUUID PARCEL_MEDIA_LIST_ITEM_UUID = LLUUID("CAB5920F-E484-4233-8621-384CF373A321");
static const LLUUID PARCEL_AUDIO_LIST_ITEM_UUID = LLUUID("DF4B020D-8A24-4B95-AB5D-CA970D694822");
+const F32 AUTO_CLOSE_FADE_TIME_START= 2.0f;
+const F32 AUTO_CLOSE_FADE_TIME_END = 3.0f;
+
//
// LLPanelNearByMedia
//
@@ -227,9 +230,6 @@ void LLPanelNearByMedia::reshape(S32 width, S32 height, BOOL called_from_parent)
}
-const F32 AUTO_CLOSE_FADE_TIME_START= 4.0f;
-const F32 AUTO_CLOSE_FADE_TIME_END = 5.0f;
-
/*virtual*/
void LLPanelNearByMedia::draw()
{
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index dcd0aab3ab..5dd44b4444 100755
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -1739,9 +1739,10 @@ void LLPanelObject::sendSculpt()
return;
LLSculptParams sculpt_params;
+ LLUUID sculpt_id = LLUUID::null;
if (mCtrlSculptTexture)
- sculpt_params.setSculptTexture(mCtrlSculptTexture->getImageAssetID());
+ sculpt_id = mCtrlSculptTexture->getImageAssetID();
U8 sculpt_type = 0;
@@ -1765,7 +1766,7 @@ void LLPanelObject::sendSculpt()
if ((mCtrlSculptInvert) && (mCtrlSculptInvert->get()))
sculpt_type |= LL_SCULPT_FLAG_INVERT;
- sculpt_params.setSculptType(sculpt_type);
+ sculpt_params.setSculptTexture(sculpt_id, sculpt_type);
mObject->setParameterEntry(LLNetworkData::PARAMS_SCULPT, sculpt_params, TRUE);
}
@@ -2000,7 +2001,11 @@ void LLPanelObject::onCancelSculpt(const LLSD& data)
LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
if(!mTextureCtrl)
return;
-
+
+ if(mSculptTextureRevert == LLUUID::null)
+ {
+ mSculptTextureRevert = LLUUID(SCULPT_DEFAULT_TEXTURE);
+ }
mTextureCtrl->setImageAssetID(mSculptTextureRevert);
sendSculpt();
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index bf15f56b44..c8af5b6718 100755
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -130,7 +130,7 @@ public:
virtual void move(LLFolderViewModelItem* parent_listener);
virtual BOOL isItemCopyable() const;
virtual BOOL copyToClipboard() const;
- virtual BOOL cutToClipboard() const;
+ virtual BOOL cutToClipboard();
virtual BOOL isClipboardPasteable() const;
virtual void pasteFromClipboard();
virtual void pasteLinkFromClipboard();
@@ -542,7 +542,7 @@ BOOL LLTaskInvFVBridge::copyToClipboard() const
return FALSE;
}
-BOOL LLTaskInvFVBridge::cutToClipboard() const
+BOOL LLTaskInvFVBridge::cutToClipboard()
{
return FALSE;
}
@@ -1163,7 +1163,13 @@ void LLTaskNotecardBridge::openItem()
{
return;
}
- if(object->permModify() || gAgent.isGodlike())
+
+ // Note: even if we are not allowed to modify copyable notecard, we should be able to view it
+ LLInventoryItem *item = dynamic_cast<LLInventoryItem*>(object->getInventoryObject(mUUID));
+ BOOL item_copy = item && gAgent.allowOperation(PERM_COPY, item->getPermissions(), GP_OBJECT_MANIPULATE);
+ if( item_copy
+ || object->permModify()
+ || gAgent.isGodlike())
{
LLPreviewNotecard* preview = LLFloaterReg::showTypedInstance<LLPreviewNotecard>("preview_notecard", LLSD(mUUID), TAKE_FOCUS_YES);
if (preview)
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 5977d558d3..de4efc8612 100755
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -85,6 +85,8 @@ 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";
+const S32 BASE_MAX_AGENT_GROUPS = 42;
+const S32 PREMIUM_MAX_AGENT_GROUPS = 60;
extern S32 gMaxAgentGroups;
@@ -585,6 +587,7 @@ BOOL LLPanelPeople::postBuild()
getChild<LLFilterEditor>("groups_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
getChild<LLFilterEditor>("recent_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
getChild<LLFilterEditor>("fbc_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
+ getChild<LLTextBox>("groupcount")->setURLClickedCallback(boost::bind(&LLPanelPeople::onGroupLimitInfo, this));
mTabContainer = getChild<LLTabContainer>("tabs");
mTabContainer->setCommitCallback(boost::bind(&LLPanelPeople::onTabSelected, this, _2));
@@ -902,8 +905,11 @@ void LLPanelPeople::updateButtons()
LLPanel* groups_panel = mTabContainer->getCurrentPanel();
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.size()));
- groups_panel->getChild<LLUICtrl>("groupcount")->setTextArg("[REMAINING]", llformat("%d",(gMaxAgentGroups-gAgent.mGroups.size())));
+
+ U32 groups_count = gAgent.mGroups.size();
+ U32 groups_ramaining = gMaxAgentGroups > groups_count ? gMaxAgentGroups - groups_count : 0;
+ groups_panel->getChild<LLUICtrl>("groupcount")->setTextArg("[COUNT]", llformat("%d", groups_count));
+ groups_panel->getChild<LLUICtrl>("groupcount")->setTextArg("[REMAINING]", llformat("%d", groups_ramaining));
}
else
{
@@ -1114,6 +1120,14 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string)
}
}
+void LLPanelPeople::onGroupLimitInfo()
+{
+ LLSD args;
+ args["MAX_BASIC"] = BASE_MAX_AGENT_GROUPS;
+ args["MAX_PREMIUM"] = PREMIUM_MAX_AGENT_GROUPS;
+ LLNotificationsUtil::add("GroupLimitInfo", args);
+}
+
void LLPanelPeople::onTabSelected(const LLSD& param)
{
std::string tab_name = getChild<LLPanel>(param.asString())->getName();
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index c1d7a134fa..eb7e76a772 100755
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -93,6 +93,7 @@ private:
// UI callbacks
void onFilterEdit(const std::string& search_string);
+ void onGroupLimitInfo();
void onTabSelected(const LLSD& param);
void onAddFriendButtonClicked();
void onAddFriendWizButtonClicked();
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index d73a5b402e..55c09d85ea 100755
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -432,7 +432,7 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
mNoPicks = !mPicksList->size();
}
- else if(APT_CLASSIFIEDS == type)
+ else if((APT_CLASSIFIEDS == type) || (APT_CLASSIFIED_INFO == type))
{
LLAvatarClassifieds* c_info = static_cast<LLAvatarClassifieds*>(data);
if(c_info && getAvatarId() == c_info->target_id)
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
index e853b2d050..1a665d4c1d 100755
--- a/indra/newview/llpanelplaceprofile.cpp
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -53,6 +53,8 @@
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
+const F64 COVENANT_REFRESH_TIME_SEC = 60.0f;
+
static LLPanelInjector<LLPanelPlaceProfile> t_place_profile("panel_place_profile");
// Statics for textures filenames
@@ -76,6 +78,7 @@ static std::string icon_see_avs_off;
LLPanelPlaceProfile::LLPanelPlaceProfile()
: LLPanelPlaceInfo(),
+ mNextCovenantUpdateTime(0),
mForSalePanel(NULL),
mYouAreHerePanel(NULL),
mSelectedParcelID(-1),
@@ -162,6 +165,9 @@ BOOL LLPanelPlaceProfile::postBuild()
icon_see_avs_on = getString("icon_SeeAVs_On");
icon_see_avs_off = getString("icon_SeeAVs_Off");
+ mLastSelectedRegionID = LLUUID::null;
+ mNextCovenantUpdateTime = 0;
+
return TRUE;
}
@@ -170,6 +176,9 @@ void LLPanelPlaceProfile::resetLocation()
{
LLPanelPlaceInfo::resetLocation();
+ mLastSelectedRegionID = LLUUID::null;
+ mNextCovenantUpdateTime = 0;
+
mForSalePanel->setVisible(FALSE);
mYouAreHerePanel->setVisible(FALSE);
@@ -330,13 +339,20 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
if (!region || !parcel)
return;
- // send EstateCovenantInfo message
- LLMessageSystem *msg = gMessageSystem;
- msg->newMessage("EstateCovenantRequest");
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
- msg->sendReliable(region->getHost());
+ if (mLastSelectedRegionID != region->getRegionID()
+ || mNextCovenantUpdateTime < LLTimer::getElapsedSeconds())
+ {
+ // send EstateCovenantInfo message
+ // Note: LLPanelPlaceProfile doesn't change Covenant's content and any
+ // changes made by Estate floater should be requested by Estate floater
+ LLMessageSystem *msg = gMessageSystem;
+ msg->newMessage("EstateCovenantRequest");
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
+ msg->sendReliable(region->getHost());
+ mNextCovenantUpdateTime = LLTimer::getElapsedSeconds() + COVENANT_REFRESH_TIME_SEC;
+ }
LLParcelData parcel_data;
diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h
index 4547e14b2e..3d2654fc12 100755
--- a/indra/newview/llpanelplaceprofile.h
+++ b/indra/newview/llpanelplaceprofile.h
@@ -71,6 +71,7 @@ private:
*/
S32 mSelectedParcelID;
LLUUID mLastSelectedRegionID;
+ F64 mNextCovenantUpdateTime; //seconds since client start
LLPanel* mForSalePanel;
LLPanel* mYouAreHerePanel;
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index 4bcd932d4b..a9a0c30e26 100755
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -921,7 +921,12 @@ void LLPanelPlaces::onBackButtonClicked()
void LLPanelPlaces::togglePickPanel(BOOL visible)
{
if (mPickPanel)
+ {
mPickPanel->setVisible(visible);
+ mPlaceProfile->setVisible(!visible);
+ updateVerbs();
+ }
+
}
void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible)
@@ -1141,16 +1146,21 @@ void LLPanelPlaces::updateVerbs()
bool is_agent_place_info_visible = mPlaceInfoType == AGENT_INFO_TYPE;
bool is_create_landmark_visible = mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE;
+ bool is_pick_panel_visible = false;
+ if(mPickPanel)
+ {
+ is_pick_panel_visible = mPickPanel->isInVisibleChain();
+ }
bool have_3d_pos = ! mPosGlobal.isExactlyZero();
- mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
- mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
+ mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn && !is_pick_panel_visible);
+ mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn && !is_pick_panel_visible);
mOverflowBtn->setVisible(is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn);
mEditBtn->setVisible(mPlaceInfoType == LANDMARK_INFO_TYPE && !isLandmarkEditModeOn);
mSaveBtn->setVisible(isLandmarkEditModeOn);
mCancelBtn->setVisible(isLandmarkEditModeOn);
mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn);
- mPlaceInfoBtn->setVisible(!is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn);
+ mPlaceInfoBtn->setVisible(!is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn && !is_pick_panel_visible);
mPlaceInfoBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos);
diff --git a/indra/newview/llpanelpresetspulldown.cpp b/indra/newview/llpanelpresetspulldown.cpp
new file mode 100644
index 0000000000..ed67c34bd6
--- /dev/null
+++ b/indra/newview/llpanelpresetspulldown.cpp
@@ -0,0 +1,206 @@
+/**
+ * @file llpanelpresetspulldown.cpp
+ * @brief A panel showing a quick way to pick presets
+ *
+ * $LicenseInfo:firstyear=2014&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2014, 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 "llpanelpresetspulldown.h"
+
+#include "llviewercontrol.h"
+#include "llstatusbar.h"
+
+#include "llbutton.h"
+#include "lltabcontainer.h"
+#include "llfloaterreg.h"
+#include "llfloaterpreference.h"
+#include "llpresetsmanager.h"
+#include "llsliderctrl.h"
+#include "llscrolllistctrl.h"
+
+/* static */ const F32 LLPanelPresetsPulldown::sAutoCloseFadeStartTimeSec = 2.0f;
+/* static */ const F32 LLPanelPresetsPulldown::sAutoCloseTotalTimeSec = 3.0f;
+
+///----------------------------------------------------------------------------
+/// Class LLPanelPresetsPulldown
+///----------------------------------------------------------------------------
+
+// Default constructor
+LLPanelPresetsPulldown::LLPanelPresetsPulldown()
+{
+ mHoverTimer.stop();
+
+ mCommitCallbackRegistrar.add("Presets.GoGraphicsPrefs", boost::bind(&LLPanelPresetsPulldown::onGraphicsButtonClick, this, _2));
+ mCommitCallbackRegistrar.add("Presets.RowClick", boost::bind(&LLPanelPresetsPulldown::onRowClick, this, _2));
+
+ buildFromFile( "panel_presets_pulldown.xml");
+}
+
+BOOL LLPanelPresetsPulldown::postBuild()
+{
+ LLPresetsManager* presetsMgr = LLPresetsManager::getInstance();
+ presetsMgr->setPresetListChangeCallback(boost::bind(&LLPanelPresetsPulldown::populatePanel, this));
+ // Make sure there is a default preference file
+ presetsMgr->createMissingDefault();
+
+ populatePanel();
+
+ return LLPanel::postBuild();
+}
+
+void LLPanelPresetsPulldown::populatePanel()
+{
+ std::string presets_dir = LLPresetsManager::getInstance()->getPresetsDir(PRESETS_GRAPHIC);
+ LLPresetsManager::getInstance()->loadPresetNamesFromDir(presets_dir, mPresetNames, DEFAULT_TOP);
+
+ LLScrollListCtrl* scroll = getChild<LLScrollListCtrl>("preset_list");
+
+ if (scroll && mPresetNames.begin() != mPresetNames.end())
+ {
+ scroll->clearRows();
+
+ for (std::list<std::string>::const_iterator it = mPresetNames.begin(); it != mPresetNames.end(); ++it)
+ {
+ const std::string& name = *it;
+ LL_DEBUGS() << "adding '" << name << "'" << LL_ENDL;
+
+ LLSD row;
+ row["columns"][0]["column"] = "preset_name";
+ row["columns"][0]["value"] = name;
+
+ if (name == gSavedSettings.getString("PresetGraphicActive"))
+ {
+ row["columns"][1]["column"] = "icon";
+ row["columns"][1]["type"] = "icon";
+ row["columns"][1]["value"] = "Check_Mark";
+ }
+
+ scroll->addElement(row);
+ }
+ }
+}
+
+/*virtual*/
+void LLPanelPresetsPulldown::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ mHoverTimer.stop();
+ LLPanel::onMouseEnter(x,y,mask);
+}
+
+/*virtual*/
+void LLPanelPresetsPulldown::onTopLost()
+{
+ setVisible(FALSE);
+}
+
+/*virtual*/
+BOOL LLPanelPresetsPulldown::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ LLPanel::handleMouseDown(x,y,mask);
+ return TRUE;
+}
+
+/*virtual*/
+void LLPanelPresetsPulldown::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ mHoverTimer.start();
+ LLPanel::onMouseLeave(x,y,mask);
+}
+
+/*virtual*/
+void LLPanelPresetsPulldown::onVisibilityChange ( BOOL new_visibility )
+{
+ if (new_visibility)
+ {
+ mHoverTimer.start(); // timer will be stopped when mouse hovers over panel
+ }
+ else
+ {
+ mHoverTimer.stop();
+
+ }
+}
+
+void LLPanelPresetsPulldown::onRowClick(const LLSD& user_data)
+{
+ LLScrollListCtrl* scroll = getChild<LLScrollListCtrl>("preset_list");
+
+ if (scroll)
+ {
+ LLScrollListItem* item = scroll->getFirstSelected();
+ if (item)
+ {
+ std::string name = item->getColumn(1)->getValue().asString();
+
+ LL_DEBUGS() << "selected '" << name << "'" << LL_ENDL;
+ LLPresetsManager::getInstance()->loadPreset(PRESETS_GRAPHIC, name);
+
+ setVisible(FALSE);
+ }
+ else
+ {
+ LL_DEBUGS() << "none selected" << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_DEBUGS() << "no scroll" << LL_ENDL;
+ }
+}
+
+void LLPanelPresetsPulldown::onGraphicsButtonClick(const LLSD& user_data)
+{
+ // close the minicontrol, we're bringing up the big one
+ setVisible(FALSE);
+
+ // bring up the prefs floater
+ LLFloater* prefsfloater = LLFloaterReg::showInstance("preferences");
+ if (prefsfloater)
+ {
+ // grab the 'graphics' panel from the preferences floater and
+ // bring it the front!
+ LLTabContainer* tabcontainer = prefsfloater->getChild<LLTabContainer>("pref core");
+ LLPanel* graphicspanel = prefsfloater->getChild<LLPanel>("display");
+ if (tabcontainer && graphicspanel)
+ {
+ tabcontainer->selectTabPanel(graphicspanel);
+ }
+ }
+}
+
+//virtual
+void LLPanelPresetsPulldown::draw()
+{
+ F32 alpha = mHoverTimer.getStarted()
+ ? clamp_rescale(mHoverTimer.getElapsedTimeF32(), sAutoCloseFadeStartTimeSec, sAutoCloseTotalTimeSec, 1.f, 0.f)
+ : 1.0f;
+ LLViewDrawContext context(alpha);
+
+ LLPanel::draw();
+
+ if (alpha == 0.f)
+ {
+ setVisible(FALSE);
+ }
+}
diff --git a/indra/newview/llpanelpresetspulldown.h b/indra/newview/llpanelpresetspulldown.h
new file mode 100644
index 0000000000..e1e2c26a86
--- /dev/null
+++ b/indra/newview/llpanelpresetspulldown.h
@@ -0,0 +1,60 @@
+/**
+ * @file llpanelpresetspulldown.h
+ * @brief A panel showing a quick way to pick presets
+ *
+ * $LicenseInfo:firstyear=2014&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2014, 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_LLPANELPRESETSPULLDOWN_H
+#define LL_LLPANELPRESETSPULLDOWN_H
+
+#include "linden_common.h"
+
+#include "llpanel.h"
+
+class LLFrameTimer;
+
+class LLPanelPresetsPulldown : public LLPanel
+{
+ public:
+ LLPanelPresetsPulldown();
+ /*virtual*/ void draw();
+ /*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
+ /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ /*virtual*/ void onTopLost();
+ /*virtual*/ void onVisibilityChange ( BOOL new_visibility );
+ /*virtual*/ BOOL postBuild();
+ void populatePanel();
+
+ private:
+ void onGraphicsButtonClick(const LLSD& user_data);
+ void onRowClick(const LLSD& user_data);
+
+ std::list<std::string> mPresetNames;
+ LLFrameTimer mHoverTimer;
+ static const F32 sAutoCloseFadeStartTimeSec;
+ static const F32 sAutoCloseTotalTimeSec;
+ LOG_CLASS(LLPanelPresetsPulldown);
+};
+
+#endif // LL_LLPANELPRESETSPULLDOWN_H
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index f91c4110c0..e795e7eedb 100755
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -168,7 +168,7 @@ public:
{
if (params.size() > 2)
{
- const std::string object_name = params[2].asString();
+ const std::string object_name = LLURI::unescape(params[2].asString());
LLMute mute(avatar_id, object_name, LLMute::OBJECT);
LLMuteList::getInstance()->add(mute);
LLPanelBlockedList::showPanelAndSelect(mute.mID);
diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp
index c8a201a5c8..c55e230b5e 100755
--- a/indra/newview/llpanelsnapshotinventory.cpp
+++ b/indra/newview/llpanelsnapshotinventory.cpp
@@ -48,6 +48,8 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
+ void onResolutionCommit(LLUICtrl* ctrl);
+
private:
/*virtual*/ std::string getWidthSpinnerName() const { return "inventory_snapshot_width"; }
/*virtual*/ std::string getHeightSpinnerName() const { return "inventory_snapshot_height"; }
@@ -72,6 +74,8 @@ BOOL LLPanelSnapshotInventory::postBuild()
{
getChild<LLSpinCtrl>(getWidthSpinnerName())->setAllowEdit(FALSE);
getChild<LLSpinCtrl>(getHeightSpinnerName())->setAllowEdit(FALSE);
+
+ getChild<LLUICtrl>(getImageSizeComboName())->setCommitCallback(boost::bind(&LLPanelSnapshotInventory::onResolutionCommit, this, _1));
return LLPanelSnapshot::postBuild();
}
@@ -89,6 +93,13 @@ void LLPanelSnapshotInventory::updateControls(const LLSD& info)
getChild<LLUICtrl>("save_btn")->setEnabled(have_snapshot);
}
+void LLPanelSnapshotInventory::onResolutionCommit(LLUICtrl* ctrl)
+{
+ BOOL current_window_selected = (getChild<LLComboBox>(getImageSizeComboName())->getCurrentIndex() == 3);
+ getChild<LLSpinCtrl>(getWidthSpinnerName())->setVisible(!current_window_selected);
+ getChild<LLSpinCtrl>(getHeightSpinnerName())->setVisible(!current_window_selected);
+}
+
void LLPanelSnapshotInventory::onSend()
{
LLFloaterSnapshot::saveTexture();
diff --git a/indra/newview/llpanelsnapshotlocal.cpp b/indra/newview/llpanelsnapshotlocal.cpp
index 43e38b95e2..01dfdc4ece 100755
--- a/indra/newview/llpanelsnapshotlocal.cpp
+++ b/indra/newview/llpanelsnapshotlocal.cpp
@@ -58,6 +58,8 @@ private:
/*virtual*/ LLFloaterSnapshot::ESnapshotFormat getImageFormat() const;
/*virtual*/ void updateControls(const LLSD& info);
+ S32 mLocalFormat;
+
void onFormatComboCommit(LLUICtrl* ctrl);
void onQualitySliderCommit(LLUICtrl* ctrl);
void onSaveFlyoutCommit(LLUICtrl* ctrl);
@@ -67,6 +69,7 @@ static LLPanelInjector<LLPanelSnapshotLocal> panel_class("llpanelsnapshotlocal")
LLPanelSnapshotLocal::LLPanelSnapshotLocal()
{
+ mLocalFormat = gSavedSettings.getS32("SnapshotFormat");
mCommitCallbackRegistrar.add("Local.Cancel", boost::bind(&LLPanelSnapshotLocal::cancel, this));
}
@@ -83,6 +86,10 @@ BOOL LLPanelSnapshotLocal::postBuild()
// virtual
void LLPanelSnapshotLocal::onOpen(const LLSD& key)
{
+ if(gSavedSettings.getS32("SnapshotFormat") != mLocalFormat)
+ {
+ getChild<LLComboBox>("local_format_combo")->selectNthItem(mLocalFormat);
+ }
LLPanelSnapshot::onOpen(key);
}
@@ -129,6 +136,7 @@ void LLPanelSnapshotLocal::updateControls(const LLSD& info)
void LLPanelSnapshotLocal::onFormatComboCommit(LLUICtrl* ctrl)
{
+ mLocalFormat = getImageFormat();
// will call updateControls()
LLFloaterSnapshot::getInstance()->notify(LLSD().with("image-format-change", true));
}
diff --git a/indra/newview/llpanelsnapshotpostcard.cpp b/indra/newview/llpanelsnapshotpostcard.cpp
index 8e37b1418c..8e37b1418c 100755..100644
--- a/indra/newview/llpanelsnapshotpostcard.cpp
+++ b/indra/newview/llpanelsnapshotpostcard.cpp
diff --git a/indra/newview/llpanelvolumepulldown.cpp b/indra/newview/llpanelvolumepulldown.cpp
index cb00f742cc..6595da235c 100755
--- a/indra/newview/llpanelvolumepulldown.cpp
+++ b/indra/newview/llpanelvolumepulldown.cpp
@@ -40,8 +40,8 @@
#include "llfloaterpreference.h"
#include "llsliderctrl.h"
-/* static */ const F32 LLPanelVolumePulldown::sAutoCloseFadeStartTimeSec = 4.0f;
-/* static */ const F32 LLPanelVolumePulldown::sAutoCloseTotalTimeSec = 5.0f;
+/* static */ const F32 LLPanelVolumePulldown::sAutoCloseFadeStartTimeSec = 2.0f;
+/* static */ const F32 LLPanelVolumePulldown::sAutoCloseTotalTimeSec = 3.0f;
///----------------------------------------------------------------------------
/// Class LLPanelVolumePulldown
diff --git a/indra/newview/llpresetsmanager.cpp b/indra/newview/llpresetsmanager.cpp
new file mode 100644
index 0000000000..8aad37e505
--- /dev/null
+++ b/indra/newview/llpresetsmanager.cpp
@@ -0,0 +1,305 @@
+/**
+ * @file llpresetsmanager.cpp
+ * @brief Implementation for the LLPresetsManager class.
+ *
+ * $LicenseInfo:firstyear=2007&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 <boost/assign/list_of.hpp>
+
+#include "llpresetsmanager.h"
+
+#include "lldiriterator.h"
+#include "llfloater.h"
+#include "llsdserialize.h"
+#include "lltrans.h"
+#include "lluictrlfactory.h"
+#include "llviewercontrol.h"
+#include "llfloaterpreference.h"
+#include "llfloaterreg.h"
+
+LLPresetsManager::LLPresetsManager()
+{
+}
+
+LLPresetsManager::~LLPresetsManager()
+{
+}
+
+void LLPresetsManager::triggerChangeSignal()
+{
+ mPresetListChangeSignal();
+}
+
+void LLPresetsManager::createMissingDefault()
+{
+ std::string default_file = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PRESETS_DIR, PRESETS_GRAPHIC, PRESETS_DEFAULT + ".xml");
+ if (!gDirUtilp->fileExists(default_file))
+ {
+ LL_INFOS() << "No default preset found -- creating one at " << default_file << LL_ENDL;
+
+ // Write current graphic settings as the default
+ savePreset(PRESETS_GRAPHIC, PRESETS_DEFAULT);
+ }
+ else
+ {
+ LL_DEBUGS() << "default preset exists; no-op" << LL_ENDL;
+ }
+}
+
+std::string LLPresetsManager::getPresetsDir(const std::string& subdirectory)
+{
+ std::string presets_path = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PRESETS_DIR);
+ std::string full_path;
+
+ if (!gDirUtilp->fileExists(presets_path))
+ {
+ LLFile::mkdir(presets_path);
+ }
+
+ full_path = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PRESETS_DIR, subdirectory);
+ if (!gDirUtilp->fileExists(full_path))
+ {
+ LLFile::mkdir(full_path);
+ }
+
+ return full_path;
+}
+
+void LLPresetsManager::loadPresetNamesFromDir(const std::string& dir, preset_name_list_t& presets, EDefaultOptions default_option)
+{
+ LL_INFOS("AppInit") << "Loading list of preset names from " << dir << LL_ENDL;
+
+ mPresetNames.clear();
+
+ LLDirIterator dir_iter(dir, "*.xml");
+ bool found = true;
+ while (found)
+ {
+ std::string file;
+ found = dir_iter.next(file);
+
+ if (found)
+ {
+ std::string path = gDirUtilp->add(dir, file);
+ std::string name = gDirUtilp->getBaseFileName(LLURI::unescape(path), /*strip_exten = */ true);
+
+ LL_DEBUGS() << " Found preset '" << name << "'" << LL_ENDL;
+
+ if (PRESETS_DEFAULT != name)
+ {
+ mPresetNames.push_back(name);
+ }
+ else
+ {
+ switch (default_option)
+ {
+ case DEFAULT_SHOW:
+ mPresetNames.push_back(LLTrans::getString(PRESETS_DEFAULT));
+ break;
+
+ case DEFAULT_TOP:
+ mPresetNames.push_front(LLTrans::getString(PRESETS_DEFAULT));
+ break;
+
+ case DEFAULT_HIDE:
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+ presets = mPresetNames;
+}
+
+bool LLPresetsManager::savePreset(const std::string& subdirectory, const std::string& name)
+{
+ bool saved = false;
+ std::vector<std::string> name_list;
+
+ if(PRESETS_GRAPHIC == subdirectory)
+ {
+ gSavedSettings.setString("PresetGraphicActive", name);
+
+ LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
+ if (instance)
+ {
+ instance->getControlNames(name_list);
+ LL_DEBUGS() << "saving preset '" << name << "'; " << name_list.size() << " names" << LL_ENDL;
+ name_list.push_back("PresetGraphicActive");
+ }
+ else
+ {
+ LL_WARNS() << "preferences floater instance not found" << LL_ENDL;
+ }
+ }
+ else if(PRESETS_CAMERA == subdirectory)
+ {
+ name_list = boost::assign::list_of
+ ("Placeholder");
+ }
+ else
+ {
+ LL_ERRS() << "Invalid presets directory '" << subdirectory << "'" << LL_ENDL;
+ }
+
+ if (name_list.size() > 1) // if the active preset name is the only thing in the list, don't save the list
+ {
+ // make an empty llsd
+ LLSD paramsData(LLSD::emptyMap());
+
+ for (std::vector<std::string>::iterator it = name_list.begin(); it != name_list.end(); ++it)
+ {
+ std::string ctrl_name = *it;
+ LLControlVariable* ctrl = gSavedSettings.getControl(ctrl_name).get();
+ std::string comment = ctrl->getComment();
+ std::string type = gSavedSettings.typeEnumToString(ctrl->type());
+ LLSD value = ctrl->getValue();
+
+ paramsData[ctrl_name]["Comment"] = comment;
+ paramsData[ctrl_name]["Persist"] = 1;
+ paramsData[ctrl_name]["Type"] = type;
+ paramsData[ctrl_name]["Value"] = value;
+ }
+
+ std::string pathName(getPresetsDir(subdirectory) + gDirUtilp->getDirDelimiter() + LLURI::escape(name) + ".xml");
+
+ // write to file
+ llofstream presetsXML(pathName.c_str());
+ if (presetsXML.is_open())
+ {
+
+ LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter();
+ formatter->format(paramsData, presetsXML, LLSDFormatter::OPTIONS_PRETTY);
+ presetsXML.close();
+ saved = true;
+
+ LL_DEBUGS() << "saved preset '" << name << "'; " << paramsData.size() << " parameters" << LL_ENDL;
+
+ gSavedSettings.setString("PresetGraphicActive", name);
+
+ // signal interested parties
+ triggerChangeSignal();
+ }
+ else
+ {
+ LL_WARNS("Presets") << "Cannot open for output preset file " << pathName << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_INFOS() << "No settings found; preferences floater has not yet been created" << LL_ENDL;
+ }
+
+ return saved;
+}
+
+void LLPresetsManager::setPresetNamesInComboBox(const std::string& subdirectory, LLComboBox* combo, EDefaultOptions default_option)
+{
+ combo->clearRows();
+
+ std::string presets_dir = getPresetsDir(subdirectory);
+
+ if (!presets_dir.empty())
+ {
+ std::list<std::string> preset_names;
+ loadPresetNamesFromDir(presets_dir, preset_names, default_option);
+
+ std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive");
+
+ if (preset_names.begin() != preset_names.end())
+ {
+ for (std::list<std::string>::const_iterator it = preset_names.begin(); it != preset_names.end(); ++it)
+ {
+ const std::string& name = *it;
+ combo->add(name, LLSD().with(0, name));
+ }
+ }
+ else
+ {
+ combo->setLabel(LLTrans::getString("preset_combo_label"));
+ }
+ }
+}
+
+void LLPresetsManager::loadPreset(const std::string& subdirectory, const std::string& name)
+{
+ std::string full_path(getPresetsDir(subdirectory) + gDirUtilp->getDirDelimiter() + LLURI::escape(name) + ".xml");
+
+ LL_DEBUGS() << "attempting to load preset '"<<name<<"' from '"<<full_path<<"'" << LL_ENDL;
+
+ if(gSavedSettings.loadFromFile(full_path, false, true) > 0)
+ {
+ if(PRESETS_GRAPHIC == subdirectory)
+ {
+ gSavedSettings.setString("PresetGraphicActive", name);
+ }
+
+ LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
+ if (instance)
+ {
+ instance->refreshEnabledGraphics();
+ }
+ triggerChangeSignal();
+ }
+ else
+ {
+ LL_WARNS() << "failed to load preset '"<<name<<"' from '"<<full_path<<"'" << LL_ENDL;
+ }
+}
+
+bool LLPresetsManager::deletePreset(const std::string& subdirectory, const std::string& name)
+{
+ bool sts = true;
+
+ if (PRESETS_DEFAULT == name)
+ {
+ // This code should never execute
+ LL_WARNS("Presets") << "You are not allowed to delete the default preset." << LL_ENDL;
+ sts = false;
+ }
+
+ if (gDirUtilp->deleteFilesInDir(getPresetsDir(subdirectory), LLURI::escape(name) + ".xml") < 1)
+ {
+ LL_WARNS("Presets") << "Error removing preset " << name << " from disk" << LL_ENDL;
+ sts = false;
+ }
+
+ // If you delete the preset that is currently marked as loaded then also indicate that no preset is loaded.
+ if (gSavedSettings.getString("PresetGraphicActive") == name)
+ {
+ gSavedSettings.setString("PresetGraphicActive", "");
+ }
+
+ // signal interested parties
+ triggerChangeSignal();
+
+ return sts;
+}
+
+boost::signals2::connection LLPresetsManager::setPresetListChangeCallback(const preset_list_signal_t::slot_type& cb)
+{
+ return mPresetListChangeSignal.connect(cb);
+}
diff --git a/indra/newview/llpresetsmanager.h b/indra/newview/llpresetsmanager.h
new file mode 100644
index 0000000000..ce640b49b1
--- /dev/null
+++ b/indra/newview/llpresetsmanager.h
@@ -0,0 +1,79 @@
+/**
+ * @file llpresetsmanager.h
+ * @brief Implementation for the LLPresetsManager class.
+ *
+ * $LicenseInfo:firstyear=2007&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_PRESETSMANAGER_H
+#define LL_PRESETSMANAGER_H
+
+#include "llcombobox.h"
+
+#include <list>
+#include <map>
+
+static const std::string PRESETS_DEFAULT = "Default";
+static const std::string PRESETS_DIR = "presets";
+static const std::string PRESETS_GRAPHIC = "graphic";
+static const std::string PRESETS_CAMERA = "camera";
+
+enum EDefaultOptions
+{
+ DEFAULT_SHOW,
+ DEFAULT_TOP,
+ DEFAULT_HIDE // Do not display "Default" in a list
+};
+
+class LLPresetsManager : public LLSingleton<LLPresetsManager>
+{
+public:
+
+ typedef std::list<std::string> preset_name_list_t;
+ typedef boost::signals2::signal<void()> preset_list_signal_t;
+
+ void createMissingDefault();
+ void triggerChangeSignal();
+ static std::string getPresetsDir(const std::string& subdirectory);
+ void setPresetNamesInComboBox(const std::string& subdirectory, LLComboBox* combo, EDefaultOptions default_option);
+ void loadPresetNamesFromDir(const std::string& dir, preset_name_list_t& presets, EDefaultOptions default_option);
+ bool savePreset(const std::string& subdirectory, const std::string & name);
+ void loadPreset(const std::string& subdirectory, const std::string & name);
+ bool deletePreset(const std::string& subdirectory, const std::string& name);
+
+ // Emitted when a preset gets loaded, deleted, or saved.
+ boost::signals2::connection setPresetListChangeCallback(const preset_list_signal_t::slot_type& cb);
+
+ // Emitted when a preset gets loaded or saved.
+
+ preset_name_list_t mPresetNames;
+
+ LLPresetsManager();
+ ~LLPresetsManager();
+
+ preset_list_signal_t mPresetListChangeSignal;
+
+ private:
+ LOG_CLASS(LLPresetsManager);
+};
+
+#endif // LL_PRESETSMANAGER_H
diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp
index bf2652cb49..fb21b980dc 100755
--- a/indra/newview/llpreview.cpp
+++ b/indra/newview/llpreview.cpp
@@ -49,6 +49,7 @@
#include "llviewerinventory.h"
#include "llviewerwindow.h"
#include "lltrans.h"
+#include "roles_constants.h"
// Constants
@@ -230,8 +231,23 @@ void LLPreview::refreshFromItem()
}
getChild<LLUICtrl>("desc")->setValue(item->getDescription());
- BOOL can_agent_manipulate = item->getPermissions().allowModifyBy(gAgent.getID());
- getChildView("desc")->setEnabled(can_agent_manipulate);
+ getChildView("desc")->setEnabled(canModify(mObjectUUID, item));
+}
+
+// static
+BOOL LLPreview::canModify(const LLUUID taskUUID, const LLInventoryItem* item)
+{
+ if (taskUUID.notNull())
+ {
+ LLViewerObject* object = gObjectList.findObject(taskUUID);
+ if(object && !object->permModify())
+ {
+ // No permission to edit in-world inventory
+ return FALSE;
+ }
+ }
+
+ return item && gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE);
}
// static
diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h
index 759430c3a5..49c114720b 100755
--- a/indra/newview/llpreview.h
+++ b/indra/newview/llpreview.h
@@ -105,7 +105,11 @@ public:
// llview
/*virtual*/ void draw();
void refreshFromItem();
-
+
+ // We can't modify Item or description in preview if either in-world Object
+ // or Item itself is unmodifiable
+ static BOOL canModify(const LLUUID taskUUID, const LLInventoryItem* item);
+
protected:
virtual void onCommit();
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index 1308d1e9a7..9f88b0db5f 100755
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -218,7 +218,7 @@ void LLPreviewNotecard::loadAsset()
LLPermissions perm(item->getPermissions());
BOOL is_owner = gAgent.allowOperation(PERM_OWNER, perm, GP_OBJECT_MANIPULATE);
BOOL allow_copy = gAgent.allowOperation(PERM_COPY, perm, GP_OBJECT_MANIPULATE);
- BOOL allow_modify = gAgent.allowOperation(PERM_MODIFY, perm, GP_OBJECT_MANIPULATE);
+ BOOL allow_modify = canModify(mObjectUUID, item);
if (allow_copy || gAgent.isGodlike())
{
@@ -338,10 +338,7 @@ void LLPreviewNotecard::onLoadComplete(LLVFS *vfs,
}
previewEditor->makePristine();
-
- const LLInventoryItem* item = preview->getItem();
- BOOL modifiable = item && gAgent.allowOperation(PERM_MODIFY,
- item->getPermissions(), GP_OBJECT_MANIPULATE);
+ BOOL modifiable = preview->canModify(preview->mObjectID, preview->getItem());
preview->setEnabled(modifiable);
preview->mAssetStatus = PREVIEW_ASSET_LOADED;
}
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 7feb20332b..67832c5994 100755
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -86,19 +86,22 @@
#include "llviewercontrol.h"
#include "llappviewer.h"
#include "llfloatergotoline.h"
+#include "llexperiencecache.h"
+#include "llfloaterexperienceprofile.h"
+#include "llexperienceassociationresponder.h"
const std::string HELLO_LSL =
"default\n"
"{\n"
- " state_entry()\n"
- " {\n"
- " llSay(0, \"Hello, Avatar!\");\n"
- " }\n"
+ " state_entry()\n"
+ " {\n"
+ " llSay(0, \"Hello, Avatar!\");\n"
+ " }\n"
"\n"
- " touch_start(integer total_number)\n"
- " {\n"
- " llSay(0, \"Touched.\");\n"
- " }\n"
+ " touch_start(integer total_number)\n"
+ " {\n"
+ " llSay(0, \"Touched.\");\n"
+ " }\n"
"}\n";
const std::string HELP_LSL_PORTAL_TOPIC = "LSL_Portal";
@@ -115,6 +118,26 @@ static bool have_script_upload_cap(LLUUID& object_id)
return object && (! object->getRegion()->getCapability("UpdateScriptTask").empty());
}
+
+class ExperienceResponder : public LLHTTPClient::Responder
+{
+public:
+ ExperienceResponder(const LLHandle<LLLiveLSLEditor>& parent):mParent(parent)
+ {
+ }
+
+ LLHandle<LLLiveLSLEditor> mParent;
+
+ /*virtual*/ void httpSuccess()
+ {
+ LLLiveLSLEditor* parent = mParent.get();
+ if(!parent)
+ return;
+
+ parent->setExperienceIds(getContent()["experience_ids"]);
+ }
+};
+
/// ---------------------------------------------------------------------------
/// LLLiveLSLFile
/// ---------------------------------------------------------------------------
@@ -193,7 +216,7 @@ private:
protected:
LLLineEditor* mSearchBox;
LLLineEditor* mReplaceBox;
- void onSearchBoxCommit();
+ void onSearchBoxCommit();
};
LLFloaterScriptSearch* LLFloaterScriptSearch::sInstance = NULL;
@@ -402,6 +425,55 @@ LLScriptEdCore::~LLScriptEdCore()
}
}
+void LLLiveLSLEditor::experienceChanged()
+{
+ if(mScriptEd->getAssociatedExperience() != mExperiences->getSelectedValue().asUUID())
+ {
+ mScriptEd->enableSave(getIsModifiable());
+ //getChildView("Save_btn")->setEnabled(TRUE);
+ mScriptEd->setAssociatedExperience(mExperiences->getSelectedValue().asUUID());
+ updateExperiencePanel();
+ }
+}
+
+void LLLiveLSLEditor::onViewProfile( LLUICtrl *ui, void* userdata )
+{
+ LLLiveLSLEditor* self = (LLLiveLSLEditor*)userdata;
+
+ LLUUID id;
+ if(self->mExperienceEnabled->get())
+ {
+ id=self->mScriptEd->getAssociatedExperience();
+ if(id.notNull())
+ {
+ LLFloaterReg::showInstance("experience_profile", id, true);
+ }
+ }
+
+}
+
+void LLLiveLSLEditor::onToggleExperience( LLUICtrl *ui, void* userdata )
+{
+ LLLiveLSLEditor* self = (LLLiveLSLEditor*)userdata;
+
+ LLUUID id;
+ if(self->mExperienceEnabled->get())
+ {
+ if(self->mScriptEd->getAssociatedExperience().isNull())
+ {
+ id=self->mExperienceIds.beginArray()->asUUID();
+ }
+ }
+
+ if(id != self->mScriptEd->getAssociatedExperience())
+ {
+ self->mScriptEd->enableSave(self->getIsModifiable());
+ }
+ self->mScriptEd->setAssociatedExperience(id);
+
+ self->updateExperiencePanel();
+}
+
BOOL LLScriptEdCore::postBuild()
{
mErrorList = getChild<LLScrollListCtrl>("lsl errors");
@@ -828,7 +900,7 @@ bool LLScriptEdCore::handleSaveChangesDialog(const LLSD& notification, const LLS
case 2: // "Cancel"
default:
// If we were quitting, we didn't really mean it.
- LLAppViewer::instance()->abortQuit();
+ LLAppViewer::instance()->abortQuit();
break;
}
return false;
@@ -863,8 +935,8 @@ void LLScriptEdCore::onBtnDynamicHelp()
LLKeywordToken *token;
LLKeywords::keyword_iterator_t token_it;
for (token_it = mEditor->keywordsBegin();
- token_it != mEditor->keywordsEnd();
- ++token_it)
+ token_it != mEditor->keywordsEnd();
+ ++token_it)
{
token = token_it->second;
help_combo->add(wstring_to_utf8str(token->getToken()));
@@ -1216,6 +1288,143 @@ bool LLScriptEdCore::enableLoadFromFileMenu(void* userdata)
return (self && self->mEditor) ? self->mEditor->canLoadOrSaveToFile() : FALSE;
}
+LLUUID LLScriptEdCore::getAssociatedExperience()const
+{
+ return mAssociatedExperience;
+}
+
+void LLLiveLSLEditor::setExperienceIds( const LLSD& experience_ids )
+{
+ mExperienceIds=experience_ids;
+ updateExperiencePanel();
+}
+
+
+void LLLiveLSLEditor::updateExperiencePanel()
+{
+ if(mScriptEd->getAssociatedExperience().isNull())
+ {
+ mExperienceEnabled->set(FALSE);
+ mExperiences->setVisible(FALSE);
+ if(mExperienceIds.size()>0)
+ {
+ mExperienceEnabled->setEnabled(TRUE);
+ mExperienceEnabled->setToolTip(getString("add_experiences"));
+ }
+ else
+ {
+ mExperienceEnabled->setEnabled(FALSE);
+ mExperienceEnabled->setToolTip(getString("no_experiences"));
+ }
+ getChild<LLButton>("view_profile")->setVisible(FALSE);
+ }
+ else
+ {
+ mExperienceEnabled->setToolTip(getString("experience_enabled"));
+ mExperienceEnabled->setEnabled(getIsModifiable());
+ mExperiences->setVisible(TRUE);
+ mExperienceEnabled->set(TRUE);
+ getChild<LLButton>("view_profile")->setToolTip(getString("show_experience_profile"));
+ buildExperienceList();
+ }
+}
+
+void LLLiveLSLEditor::buildExperienceList()
+{
+ mExperiences->clearRows();
+ bool foundAssociated=false;
+ const LLUUID& associated = mScriptEd->getAssociatedExperience();
+ LLUUID last;
+ LLScrollListItem* item;
+ for(LLSD::array_const_iterator it = mExperienceIds.beginArray(); it != mExperienceIds.endArray(); ++it)
+ {
+ LLUUID id = it->asUUID();
+ EAddPosition position = ADD_BOTTOM;
+ if(id == associated)
+ {
+ foundAssociated = true;
+ position = ADD_TOP;
+ }
+
+ const LLSD& experience = LLExperienceCache::get(id);
+ if(experience.isUndefined())
+ {
+ mExperiences->add(getString("loading"), id, position);
+ last = id;
+ }
+ else
+ {
+ std::string experience_name_string = experience[LLExperienceCache::NAME].asString();
+ if (experience_name_string.empty())
+ {
+ experience_name_string = LLTrans::getString("ExperienceNameUntitled");
+ }
+ mExperiences->add(experience_name_string, id, position);
+ }
+ }
+
+ if(!foundAssociated )
+ {
+ const LLSD& experience = LLExperienceCache::get(associated);
+ if(experience.isDefined())
+ {
+ std::string experience_name_string = experience[LLExperienceCache::NAME].asString();
+ if (experience_name_string.empty())
+ {
+ experience_name_string = LLTrans::getString("ExperienceNameUntitled");
+ }
+ item=mExperiences->add(experience_name_string, associated, ADD_TOP);
+ }
+ else
+ {
+ item=mExperiences->add(getString("loading"), associated, ADD_TOP);
+ last = associated;
+ }
+ item->setEnabled(FALSE);
+ }
+
+ if(last.notNull())
+ {
+ mExperiences->setEnabled(FALSE);
+ LLExperienceCache::get(last, boost::bind(&LLLiveLSLEditor::buildExperienceList, this));
+ }
+ else
+ {
+ mExperiences->setEnabled(TRUE);
+ mExperiences->sortByName(TRUE);
+ mExperiences->setCurrentByIndex(mExperiences->getCurrentIndex());
+ getChild<LLButton>("view_profile")->setVisible(TRUE);
+ }
+}
+
+
+void LLScriptEdCore::setAssociatedExperience( const LLUUID& experience_id )
+{
+ mAssociatedExperience = experience_id;
+}
+
+
+
+void LLLiveLSLEditor::requestExperiences()
+{
+ if (!getIsModifiable())
+ {
+ return;
+ }
+
+ LLViewerRegion* region = gAgent.getRegion();
+ if (region)
+ {
+ std::string lookup_url=region->getCapability("GetCreatorExperiences");
+ if(!lookup_url.empty())
+ {
+ LLHTTPClient::get(lookup_url, new ExperienceResponder(getDerivedHandle<LLLiveLSLEditor>()));
+ }
+ }
+}
+
+
+
/// ---------------------------------------------------------------------------
/// LLScriptEdContainer
/// ---------------------------------------------------------------------------
@@ -1234,7 +1443,7 @@ std::string LLScriptEdContainer::getTmpFileName()
std::string script_id = mObjectUUID.asString() + "_" + mItemUUID.asString();
// Use MD5 sum to make the file name shorter and not exceed maximum path length.
- char script_id_hash_str[33]; /* Flawfinder: ignore */
+ char script_id_hash_str[33]; /* Flawfinder: ignore */
LLMD5 script_id_hash((const U8 *)script_id.c_str());
script_id_hash.hex_digest(script_id_hash_str);
@@ -1772,6 +1981,16 @@ BOOL LLLiveLSLEditor::postBuild()
mScriptEd->mEditor->makePristine();
mScriptEd->mEditor->setFocus(TRUE);
+
+ mExperiences = getChild<LLComboBox>("Experiences...");
+ mExperiences->setCommitCallback(boost::bind(&LLLiveLSLEditor::experienceChanged, this));
+
+ mExperienceEnabled = getChild<LLCheckBoxCtrl>("enable_xp");
+
+ childSetCommitCallback("enable_xp", onToggleExperience, this);
+ childSetCommitCallback("view_profile", onViewProfile, this);
+
+
return LLPreview::postBuild();
}
@@ -1815,61 +2034,60 @@ void LLLiveLSLEditor::loadAsset()
if(object)
{
LLViewerInventoryItem* item = dynamic_cast<LLViewerInventoryItem*>(object->getInventoryObject(mItemUUID));
- if(item
- && (gAgent.allowOperation(PERM_COPY, item->getPermissions(), GP_OBJECT_MANIPULATE)
- || gAgent.isGodlike()))
- {
- mItem = new LLViewerInventoryItem(item);
- //LL_INFOS() << "asset id " << mItem->getAssetUUID() << LL_ENDL;
- }
- if(!gAgent.isGodlike()
- && (item
- && (!gAgent.allowOperation(PERM_COPY, item->getPermissions(), GP_OBJECT_MANIPULATE)
- || !gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE))))
- {
- mItem = new LLViewerInventoryItem(item);
- mScriptEd->setScriptText(getString("not_allowed"), FALSE);
- mScriptEd->mEditor->makePristine();
- mScriptEd->enableSave(FALSE);
- mAssetStatus = PREVIEW_ASSET_LOADED;
- }
- else if(item && mItem.notNull())
+ if(item)
{
- // request the text from the object
+ ExperienceAssociationResponder::fetchAssociatedExperience(item->getParentUUID(), item->getUUID(), boost::bind(&LLLiveLSLEditor::setAssociatedExperience, getDerivedHandle<LLLiveLSLEditor>(), _1));
+
+ bool isGodlike = gAgent.isGodlike();
+ bool copyManipulate = gAgent.allowOperation(PERM_COPY, item->getPermissions(), GP_OBJECT_MANIPULATE);
+ mIsModifiable = gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE);
+
+ if(!isGodlike && (!copyManipulate || !mIsModifiable))
+ {
+ mItem = new LLViewerInventoryItem(item);
+ mScriptEd->setScriptText(getString("not_allowed"), FALSE);
+ mScriptEd->mEditor->makePristine();
+ mScriptEd->enableSave(FALSE);
+ mAssetStatus = PREVIEW_ASSET_LOADED;
+ }
+ else if(copyManipulate || isGodlike)
+ {
+ mItem = new LLViewerInventoryItem(item);
+ // request the text from the object
LLSD* user_data = new LLSD();
user_data->with("taskid", mObjectUUID).with("itemid", mItemUUID);
- gAssetStorage->getInvItemAsset(object->getRegion()->getHost(),
- gAgent.getID(),
- gAgent.getSessionID(),
- item->getPermissions().getOwner(),
- object->getID(),
- item->getUUID(),
- item->getAssetUUID(),
- item->getType(),
- &LLLiveLSLEditor::onLoadComplete,
- (void*)user_data,
- TRUE);
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessageFast(_PREHASH_GetScriptRunning);
- msg->nextBlockFast(_PREHASH_Script);
- msg->addUUIDFast(_PREHASH_ObjectID, mObjectUUID);
- msg->addUUIDFast(_PREHASH_ItemID, mItemUUID);
- msg->sendReliable(object->getRegion()->getHost());
- mAskedForRunningInfo = TRUE;
- mAssetStatus = PREVIEW_ASSET_LOADING;
+ gAssetStorage->getInvItemAsset(object->getRegion()->getHost(),
+ gAgent.getID(),
+ gAgent.getSessionID(),
+ item->getPermissions().getOwner(),
+ object->getID(),
+ item->getUUID(),
+ item->getAssetUUID(),
+ item->getType(),
+ &LLLiveLSLEditor::onLoadComplete,
+ (void*)user_data,
+ TRUE);
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_GetScriptRunning);
+ msg->nextBlockFast(_PREHASH_Script);
+ msg->addUUIDFast(_PREHASH_ObjectID, mObjectUUID);
+ msg->addUUIDFast(_PREHASH_ItemID, mItemUUID);
+ msg->sendReliable(object->getRegion()->getHost());
+ mAskedForRunningInfo = TRUE;
+ mAssetStatus = PREVIEW_ASSET_LOADING;
+ }
}
- else
+
+ if(mItem.isNull())
{
mScriptEd->setScriptText(LLStringUtil::null, FALSE);
mScriptEd->mEditor->makePristine();
mAssetStatus = PREVIEW_ASSET_LOADED;
+ mIsModifiable = FALSE;
}
- mIsModifiable = item && gAgent.allowOperation(PERM_MODIFY,
- item->getPermissions(),
- GP_OBJECT_MANIPULATE);
-
+ refreshFromItem();
// This is commented out, because we don't completely
// handle script exports yet.
/*
@@ -1906,6 +2124,8 @@ void LLLiveLSLEditor::loadAsset()
time_corrected());
mAssetStatus = PREVIEW_ASSET_LOADED;
}
+
+ requestExperiences();
}
// static
@@ -2169,7 +2389,7 @@ void LLLiveLSLEditor::saveIfNeeded(bool sync /*= true*/)
BOOL is_running = getChild<LLCheckBoxCtrl>( "running")->get();
if (!url.empty())
{
- uploadAssetViaCaps(url, filename, mObjectUUID, mItemUUID, is_running);
+ uploadAssetViaCaps(url, filename, mObjectUUID, mItemUUID, is_running, mScriptEd->getAssociatedExperience());
}
else if (gAssetStorage)
{
@@ -2181,7 +2401,8 @@ void LLLiveLSLEditor::uploadAssetViaCaps(const std::string& url,
const std::string& filename,
const LLUUID& task_id,
const LLUUID& item_id,
- BOOL is_running)
+ BOOL is_running,
+ const LLUUID& experience_public_id )
{
LL_INFOS() << "Update Task Inventory via capability " << url << LL_ENDL;
LLSD body;
@@ -2189,6 +2410,7 @@ void LLLiveLSLEditor::uploadAssetViaCaps(const std::string& url,
body["item_id"] = item_id;
body["is_script_running"] = is_running;
body["target"] = monoChecked() ? "mono" : "lsl2";
+ body["experience"] = experience_public_id;
LLHTTPClient::post(url, body,
new LLUpdateTaskInventoryResponder(body, filename, LLAssetType::AT_LSL_TEXT));
}
@@ -2401,8 +2623,12 @@ void LLLiveLSLEditor::onLoad(void* userdata)
void LLLiveLSLEditor::onSave(void* userdata, BOOL close_after_save)
{
LLLiveLSLEditor* self = (LLLiveLSLEditor*)userdata;
- self->mCloseAfterSave = close_after_save;
- self->saveIfNeeded();
+ if(self)
+ {
+ self->mCloseAfterSave = close_after_save;
+ self->mScriptEd->mErrorList->setCommentText("");
+ self->saveIfNeeded();
+ }
}
@@ -2449,3 +2675,18 @@ BOOL LLLiveLSLEditor::monoChecked() const
}
return FALSE;
}
+
+void LLLiveLSLEditor::setAssociatedExperience( LLHandle<LLLiveLSLEditor> editor, const LLSD& experience )
+{
+ LLLiveLSLEditor* scriptEd = editor.get();
+ if(scriptEd)
+ {
+ LLUUID id;
+ if(experience.has(LLExperienceCache::EXPERIENCE_ID))
+ {
+ id=experience[LLExperienceCache::EXPERIENCE_ID].asUUID();
+ }
+ scriptEd->mScriptEd->setAssociatedExperience(id);
+ scriptEd->updateExperiencePanel();
+ }
+}
diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h
index 66727bceee..5f65be7383 100755
--- a/indra/newview/llpreviewscript.h
+++ b/indra/newview/llpreviewscript.h
@@ -51,6 +51,7 @@ class LLVFS;
class LLViewerInventoryItem;
class LLScriptEdContainer;
class LLFloaterGotoLine;
+class LLFloaterExperienceProfile;
// Inner, implementation class. LLPreviewScript and LLLiveLSLEditor each own one of these.
class LLScriptEdCore : public LLPanel
@@ -107,12 +108,14 @@ public:
static void onBtnInsertSample(void*);
static void onBtnInsertFunction(LLUICtrl*, void*);
static void onBtnLoadFromFile(void*);
- static void onBtnSaveToFile(void*);
+ static void onBtnSaveToFile(void*);
static bool enableSaveToFileMenu(void* userdata);
static bool enableLoadFromFileMenu(void* userdata);
- virtual bool hasAccelerators() const { return true; }
+ virtual bool hasAccelerators() const { return true; }
+ LLUUID getAssociatedExperience()const;
+ void setAssociatedExperience( const LLUUID& experience_id );
void setScriptName(const std::string& name){mScriptName = name;};
@@ -146,8 +149,8 @@ private:
void (*mLoadCallback)(void* userdata);
void (*mSaveCallback)(void* userdata, BOOL close_after_save);
void (*mSearchReplaceCallback) (void* userdata);
- void* mUserdata;
- LLComboBox *mFunctions;
+ void* mUserdata;
+ LLComboBox *mFunctions;
BOOL mForceClose;
LLPanel* mCodePanel;
LLScrollListCtrl* mErrorList;
@@ -159,6 +162,7 @@ private:
BOOL mEnableSave;
BOOL mHasScriptData;
LLLiveLSLFile* mLiveFile;
+ LLUUID mAssociatedExperience;
LLScriptEdContainer* mContainer; // parent view
@@ -245,7 +249,18 @@ public:
/*virtual*/ BOOL postBuild();
- void setIsNew() { mIsNew = TRUE; }
+ void setIsNew() { mIsNew = TRUE; }
+
+ static void setAssociatedExperience( LLHandle<LLLiveLSLEditor> editor, const LLSD& experience );
+ static void onToggleExperience(LLUICtrl *ui, void* userdata);
+ static void onViewProfile(LLUICtrl *ui, void* userdata);
+
+ void setExperienceIds(const LLSD& experience_ids);
+ void buildExperienceList();
+ void updateExperiencePanel();
+ void requestExperiences();
+ void experienceChanged();
+ void addAssociatedExperience(const LLSD& experience);
private:
virtual BOOL canClose();
@@ -256,10 +271,11 @@ private:
void loadAsset(BOOL is_new);
/*virtual*/ void saveIfNeeded(bool sync = true);
void uploadAssetViaCaps(const std::string& url,
- const std::string& filename,
+ const std::string& filename,
const LLUUID& task_id,
const LLUUID& item_id,
- BOOL is_running);
+ BOOL is_running,
+ const LLUUID& experience_public_id);
void uploadAssetLegacy(const std::string& filename,
LLViewerObject* object,
const LLTransactionID& tid,
@@ -300,9 +316,16 @@ private:
S32 mPendingUploads;
BOOL getIsModifiable() const { return mIsModifiable; } // Evaluated on load assert
-
+
LLCheckBoxCtrl* mMonoCheckbox;
BOOL mIsModifiable;
+
+
+ LLComboBox* mExperiences;
+ LLCheckBoxCtrl* mExperienceEnabled;
+ LLSD mExperienceIds;
+
+ LLHandle<LLFloater> mExperienceProfile;
};
#endif // LL_LLPREVIEWSCRIPT_H
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index f91a18d8d3..c8cf0faa15 100755
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -618,4 +618,5 @@ void LLPreviewTexture::setObjectID(const LLUUID& object_id)
mAssetStatus = PREVIEW_ASSET_UNLOADED;
loadAsset();
}
+ refreshFromItem();
}
diff --git a/indra/newview/llscenemonitor.cpp b/indra/newview/llscenemonitor.cpp
index 179a73413e..02912f12a9 100644
--- a/indra/newview/llscenemonitor.cpp
+++ b/indra/newview/llscenemonitor.cpp
@@ -39,6 +39,7 @@
#include "llspatialpartition.h"
#include "llagent.h"
#include "pipeline.h"
+#include "llviewerparcelmgr.h"
#include "llviewerpartsim.h"
LLSceneMonitorView* gSceneMonitorView = NULL;
@@ -702,6 +703,13 @@ LLSceneMonitorView::LLSceneMonitorView(const LLRect& rect)
setCanMinimize(false);
setCanClose(true);
+
+ sTeleportFinishConnection = LLViewerParcelMgr::getInstance()->setTeleportFinishedCallback(boost::bind(&LLSceneMonitorView::onTeleportFinished, this));
+}
+
+LLSceneMonitorView::~LLSceneMonitorView()
+{
+ sTeleportFinishConnection.disconnect();
}
void LLSceneMonitorView::onClose(bool app_quitting)
@@ -714,6 +722,14 @@ void LLSceneMonitorView::onClickCloseBtn(bool app_quitting)
setVisible(false);
}
+void LLSceneMonitorView::onTeleportFinished()
+{
+ if(isInVisibleChain())
+ {
+ LLSceneMonitor::getInstance()->reset();
+ }
+}
+
void LLSceneMonitorView::onVisibilityChange(BOOL visible)
{
if (!LLGLSLShader::sNoFixedFunction && visible)
diff --git a/indra/newview/llscenemonitor.h b/indra/newview/llscenemonitor.h
index 5bde3b5aab..2b6ea57b96 100644
--- a/indra/newview/llscenemonitor.h
+++ b/indra/newview/llscenemonitor.h
@@ -64,10 +64,12 @@ public:
void dumpToFile(std::string file_name);
bool hasResults() const { return mSceneLoadRecording.getResults().getDuration() != S32Seconds(0);}
+ void reset();
+
private:
void freezeScene();
void unfreezeScene();
- void reset();
+
LLRenderTarget& getCaptureTarget();
void generateDitheringTexture(S32 width, S32 height);
@@ -109,7 +111,7 @@ class LLSceneMonitorView : public LLFloater
{
public:
LLSceneMonitorView(const LLRect& rect);
-
+ ~LLSceneMonitorView();
virtual void draw();
virtual void onVisibilityChange(BOOL visible);
@@ -117,6 +119,8 @@ public:
protected:
virtual void onClose(bool app_quitting=false);
virtual void onClickCloseBtn(bool app_quitting=false);
+ void onTeleportFinished();
+ boost::signals2::connection sTeleportFinishConnection;
};
extern LLSceneMonitorView* gSceneMonitorView;
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index 8708fb87ee..6d94b178dd 100755
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -541,19 +541,23 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)
{
std::vector<ToastElem>::iterator it = find(mToastList.begin(), mToastList.end(), id);
+ LLPanel* panel_to_delete = panel;
+
if( it != mToastList.end() && 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);
+ panel_to_delete = old_panel;
+ toast->insertPanel(panel);
+ toast->startTimer();
}
redrawToasts();
}
+
+ delete panel_to_delete;
}
//--------------------------------------------------------------------------
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index fdc95c7784..55bcb3dc65 100755
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -52,6 +52,7 @@
// viewer includes
#include "llagent.h"
#include "llagentcamera.h"
+#include "llattachmentsmgr.h"
#include "llviewerwindow.h"
#include "lldrawable.h"
#include "llfloaterinspect.h"
@@ -619,10 +620,33 @@ bool LLSelectMgr::linkObjects()
bool LLSelectMgr::unlinkObjects()
{
+ S32 min_objects_for_confirm = gSavedSettings.getS32("MinObjectsForUnlinkConfirm");
+ S32 unlink_object_count = mSelectedObjects->getObjectCount(); // clears out nodes with NULL objects
+ if (unlink_object_count >= min_objects_for_confirm
+ && unlink_object_count > mSelectedObjects->getRootObjectCount())
+ {
+ // total count > root count means that there are childer inside and that there are linksets that will be unlinked
+ LLNotificationsUtil::add("ConfirmUnlink", LLSD(), LLSD(), boost::bind(&LLSelectMgr::confirmUnlinkObjects, this, _1, _2));
+ return true;
+ }
+
LLSelectMgr::getInstance()->sendDelink();
return true;
}
+void LLSelectMgr::confirmUnlinkObjects(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ // if Cancel pressed
+ if (option == 1)
+ {
+ return;
+ }
+
+ LLSelectMgr::getInstance()->sendDelink();
+ return;
+}
+
// in order to link, all objects must have the same owner, and the
// agent must have the ability to modify all of the objects. However,
// we're not answering that question with this method. The question
@@ -2103,7 +2127,7 @@ void LLSelectMgr::selectionRemoveMaterial()
{
LL_DEBUGS("Materials") << "Removing material from object " << object->getID() << " face " << face << LL_ENDL;
LLMaterialMgr::getInstance()->remove(object->getID(),face);
- object->setTEMaterialParams(face, NULL);
+ object->setTEMaterialParams(face, NULL, FALSE);
}
return true;
}
@@ -2343,6 +2367,7 @@ void LLSelectMgr::selectionSetIncludeInSearch(bool include_in_search)
"ObjectIncludeInSearch",
packAgentAndSessionID,
packObjectIncludeInSearch,
+ logNoOp,
&include_in_search,
SEND_ONLY_ROOTS);
}
@@ -2392,6 +2417,7 @@ void LLSelectMgr::selectionSetClickAction(U8 action)
sendListToRegions("ObjectClickAction",
packAgentAndSessionID,
packObjectClickAction,
+ logNoOp,
&action,
SEND_INDIVIDUALS);
}
@@ -2427,7 +2453,7 @@ void LLSelectMgr::sendGodlikeRequest(const std::string& request, const std::stri
}
else
{
- sendListToRegions(message_type, packGodlikeHead, packObjectIDAsParam, &data, SEND_ONLY_ROOTS);
+ sendListToRegions(message_type, packGodlikeHead, packObjectIDAsParam, logNoOp, &data, SEND_ONLY_ROOTS);
}
}
@@ -2456,6 +2482,23 @@ void LLSelectMgr::packGodlikeHead(void* user_data)
}
// static
+void LLSelectMgr::logNoOp(LLSelectNode* node, void *)
+{
+}
+
+// static
+void LLSelectMgr::logAttachmentRequest(LLSelectNode* node, void *)
+{
+ LLAttachmentsMgr::instance().onAttachmentRequested(node->mItemID);
+}
+
+// static
+void LLSelectMgr::logDetachRequest(LLSelectNode* node, void *)
+{
+ LLAttachmentsMgr::instance().onDetachRequested(node->mItemID);
+}
+
+// static
void LLSelectMgr::packObjectIDAsParam(LLSelectNode* node, void *)
{
std::string buf = llformat("%u", node->getObject()->getLocalID());
@@ -3561,10 +3604,11 @@ bool LLSelectMgr::confirmDelete(const LLSD& notification, const LLSD& response,
// attempt to derez into the trash.
LLDeRezInfo info(DRD_TRASH, trash_id);
LLSelectMgr::getInstance()->sendListToRegions("DeRezObject",
- packDeRezHeader,
- packObjectLocalID,
- (void*) &info,
- SEND_ONLY_ROOTS);
+ packDeRezHeader,
+ packObjectLocalID,
+ logNoOp,
+ (void*) &info,
+ SEND_ONLY_ROOTS);
// VEFFECT: Delete Object - one effect for all deletes
if (LLSelectMgr::getInstance()->mSelectedObjects->mSelectType != SELECT_TYPE_HUD)
{
@@ -3596,6 +3640,7 @@ void LLSelectMgr::selectForceDelete()
"ObjectDelete",
packDeleteHeader,
packObjectLocalID,
+ logNoOp,
(void*)TRUE,
SEND_ONLY_ROOTS);
}
@@ -3766,7 +3811,7 @@ void LLSelectMgr::selectDuplicate(const LLVector3& offset, BOOL select_copy)
data.offset = offset;
data.flags = (select_copy ? FLAGS_CREATE_SELECTED : 0x0);
- sendListToRegions("ObjectDuplicate", packDuplicateHeader, packDuplicate, &data, SEND_ONLY_ROOTS);
+ sendListToRegions("ObjectDuplicate", packDuplicateHeader, packDuplicate, logNoOp, &data, SEND_ONLY_ROOTS);
if (select_copy)
{
@@ -3821,7 +3866,7 @@ void LLSelectMgr::repeatDuplicate()
data.offset = LLVector3::zero;
data.flags = 0x0;
- sendListToRegions("ObjectDuplicate", packDuplicateHeader, packDuplicate, &data, SEND_ONLY_ROOTS);
+ sendListToRegions("ObjectDuplicate", packDuplicateHeader, packDuplicate, logNoOp, &data, SEND_ONLY_ROOTS);
// move current selection based on delta from duplication position and update duplication position
for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
@@ -3900,7 +3945,7 @@ void LLSelectMgr::selectDuplicateOnRay(const LLVector3 &ray_start_region,
data.mFlags = (select_copy ? FLAGS_CREATE_SELECTED : 0x0);
sendListToRegions("ObjectDuplicateOnRay",
- packDuplicateOnRayHead, packObjectLocalID, &data, SEND_ONLY_ROOTS);
+ packDuplicateOnRayHead, packObjectLocalID, logNoOp, &data, SEND_ONLY_ROOTS);
if (select_copy)
{
@@ -3950,6 +3995,7 @@ void LLSelectMgr::sendMultipleUpdate(U32 type)
"MultipleObjectUpdate",
packAgentAndSessionID,
packMultipleUpdate,
+ logNoOp,
&type,
send_type);
}
@@ -4013,7 +4059,7 @@ void LLSelectMgr::sendOwner(const LLUUID& owner_id,
data.group_id = group_id;
data.override = override;
- sendListToRegions("ObjectOwner", packOwnerHead, packObjectLocalID, &data, SEND_ONLY_ROOTS);
+ sendListToRegions("ObjectOwner", packOwnerHead, packObjectLocalID, logNoOp, &data, SEND_ONLY_ROOTS);
}
// static
@@ -4037,7 +4083,7 @@ void LLSelectMgr::packOwnerHead(void *user_data)
void LLSelectMgr::sendGroup(const LLUUID& group_id)
{
LLUUID local_group_id(group_id);
- sendListToRegions("ObjectGroup", packAgentAndSessionAndGroupID, packObjectLocalID, &local_group_id, SEND_ONLY_ROOTS);
+ sendListToRegions("ObjectGroup", packAgentAndSessionAndGroupID, packObjectLocalID, logNoOp, &local_group_id, SEND_ONLY_ROOTS);
}
@@ -4061,7 +4107,7 @@ void LLSelectMgr::sendBuy(const LLUUID& buyer_id, const LLUUID& category_id, con
LLBuyData buy;
buy.mCategoryID = category_id;
buy.mSaleInfo = sale_info;
- sendListToRegions("ObjectBuy", packAgentGroupAndCatID, packBuyObjectIDs, &buy, SEND_ONLY_ROOTS);
+ sendListToRegions("ObjectBuy", packAgentGroupAndCatID, packBuyObjectIDs, logNoOp, &buy, SEND_ONLY_ROOTS);
}
// static
@@ -4105,7 +4151,7 @@ void LLSelectMgr::selectionSetObjectPermissions(U8 field,
data.mMask = mask;
data.mOverride = override;
- sendListToRegions("ObjectPermissions", packPermissionsHead, packPermissions, &data, SEND_ONLY_ROOTS);
+ sendListToRegions("ObjectPermissions", packPermissionsHead, packPermissions, logNoOp, &data, SEND_ONLY_ROOTS);
}
void LLSelectMgr::packPermissionsHead(void* user_data)
@@ -4148,6 +4194,7 @@ void LLSelectMgr::deselectAll()
"ObjectDeselect",
packAgentAndSessionID,
packObjectLocalID,
+ logNoOp,
NULL,
SEND_INDIVIDUALS);
@@ -4178,6 +4225,7 @@ void LLSelectMgr::deselectAllForStandingUp()
"ObjectDeselect",
packAgentAndSessionID,
packObjectLocalID,
+ logNoOp,
NULL,
SEND_INDIVIDUALS);
@@ -4259,6 +4307,7 @@ void LLSelectMgr::selectionSetObjectName(const std::string& name)
sendListToRegions("ObjectName",
packAgentAndSessionID,
packObjectName,
+ logNoOp,
(void*)(&name_copy),
SEND_ONLY_ROOTS);
}
@@ -4267,6 +4316,7 @@ void LLSelectMgr::selectionSetObjectName(const std::string& name)
sendListToRegions("ObjectName",
packAgentAndSessionID,
packObjectName,
+ logNoOp,
(void*)(&name_copy),
SEND_INDIVIDUALS);
}
@@ -4282,6 +4332,7 @@ void LLSelectMgr::selectionSetObjectDescription(const std::string& desc)
sendListToRegions("ObjectDescription",
packAgentAndSessionID,
packObjectDescription,
+ logNoOp,
(void*)(&desc_copy),
SEND_ONLY_ROOTS);
}
@@ -4290,6 +4341,7 @@ void LLSelectMgr::selectionSetObjectDescription(const std::string& desc)
sendListToRegions("ObjectDescription",
packAgentAndSessionID,
packObjectDescription,
+ logNoOp,
(void*)(&desc_copy),
SEND_INDIVIDUALS);
}
@@ -4303,6 +4355,7 @@ void LLSelectMgr::selectionSetObjectCategory(const LLCategory& category)
sendListToRegions("ObjectCategory",
packAgentAndSessionID,
packObjectCategory,
+ logNoOp,
(void*)(&category),
SEND_ONLY_ROOTS);
}
@@ -4312,6 +4365,7 @@ void LLSelectMgr::selectionSetObjectSaleInfo(const LLSaleInfo& sale_info)
sendListToRegions("ObjectSaleInfo",
packAgentAndSessionID,
packObjectSaleInfo,
+ logNoOp,
(void*)(&sale_info),
SEND_ONLY_ROOTS);
}
@@ -4345,6 +4399,7 @@ void LLSelectMgr::sendAttach(U8 attachment_point, bool replace)
"ObjectAttach",
packAgentIDAndSessionAndAttachment,
packObjectIDAndRotation,
+ logAttachmentRequest,
&attachment_point,
SEND_ONLY_ROOTS );
if (!build_mode)
@@ -4365,6 +4420,7 @@ void LLSelectMgr::sendDetach()
"ObjectDetach",
packAgentAndSessionID,
packObjectLocalID,
+ logDetachRequest,
NULL,
SEND_ONLY_ROOTS );
}
@@ -4381,6 +4437,7 @@ void LLSelectMgr::sendDropAttachment()
"ObjectDrop",
packAgentAndSessionID,
packObjectLocalID,
+ logDetachRequest,
NULL,
SEND_ONLY_ROOTS);
}
@@ -4400,6 +4457,7 @@ void LLSelectMgr::sendLink()
"ObjectLink",
packAgentAndSessionID,
packObjectLocalID,
+ logNoOp,
NULL,
SEND_ONLY_ROOTS);
}
@@ -4437,6 +4495,7 @@ void LLSelectMgr::sendDelink()
"ObjectDelink",
packAgentAndSessionID,
packObjectLocalID,
+ logNoOp,
NULL,
SEND_INDIVIDUALS);
}
@@ -4489,6 +4548,7 @@ void LLSelectMgr::sendSelect()
"ObjectSelect",
packAgentAndSessionID,
packObjectLocalID,
+ logNoOp,
NULL,
SEND_INDIVIDUALS);
}
@@ -4885,10 +4945,12 @@ void LLSelectMgr::packPermissions(LLSelectNode* node, void *user_data)
void LLSelectMgr::sendListToRegions(const std::string& message_name,
void (*pack_header)(void *user_data),
void (*pack_body)(LLSelectNode* node, void *user_data),
+ void (*log_func)(LLSelectNode* node, void *user_data),
void *user_data,
ESendType send_type)
{
LLSelectNode* node;
+ LLSelectNode* linkset_root = NULL;
LLViewerRegion* last_region;
LLViewerRegion* current_region;
@@ -4896,6 +4958,8 @@ void LLSelectMgr::sendListToRegions(const std::string& message_name,
S32 packets_sent = 0;
S32 objects_in_this_packet = 0;
+ bool link_operation = message_name == "ObjectLink";
+
//clear update override data (allow next update through)
struct f : public LLSelectedNodeFunctor
{
@@ -5004,8 +5068,16 @@ void LLSelectMgr::sendListToRegions(const std::string& message_name,
&& (! gMessageSystem->isSendFull(NULL))
&& (objects_in_this_packet < MAX_OBJECTS_PER_PACKET))
{
+ if (link_operation && linkset_root == NULL)
+ {
+ // linksets over 254 will be split into multiple messages,
+ // but we need to provide same root for all messages or we will get separate linksets
+ linkset_root = node;
+ }
// add another instance of the body of the data
(*pack_body)(node, user_data);
+ // do any related logging
+ (*log_func)(node, user_data);
++objects_sent;
++objects_in_this_packet;
@@ -5030,6 +5102,22 @@ void LLSelectMgr::sendListToRegions(const std::string& message_name,
gMessageSystem->newMessage(message_name.c_str());
(*pack_header)(user_data);
+ if (linkset_root != NULL)
+ {
+ if (current_region != last_region)
+ {
+ // root should be in one region with the child, reset it
+ linkset_root = NULL;
+ }
+ else
+ {
+ // add root instance into new message
+ (*pack_body)(linkset_root, user_data);
+ ++objects_sent;
+ ++objects_in_this_packet;
+ }
+ }
+
// don't move to the next object, we still need to add the
// body data.
}
@@ -6656,7 +6744,7 @@ void LLSelectMgr::undo()
{
BOOL select_linked_set = !gSavedSettings.getBOOL("EditLinkedParts");
LLUUID group_id(gAgent.getGroupID());
- sendListToRegions("Undo", packAgentAndSessionAndGroupID, packObjectID, &group_id, select_linked_set ? SEND_ONLY_ROOTS : SEND_CHILDREN_FIRST);
+ sendListToRegions("Undo", packAgentAndSessionAndGroupID, packObjectID, logNoOp, &group_id, select_linked_set ? SEND_ONLY_ROOTS : SEND_CHILDREN_FIRST);
}
//-----------------------------------------------------------------------------
@@ -6674,7 +6762,7 @@ void LLSelectMgr::redo()
{
BOOL select_linked_set = !gSavedSettings.getBOOL("EditLinkedParts");
LLUUID group_id(gAgent.getGroupID());
- sendListToRegions("Redo", packAgentAndSessionAndGroupID, packObjectID, &group_id, select_linked_set ? SEND_ONLY_ROOTS : SEND_CHILDREN_FIRST);
+ sendListToRegions("Redo", packAgentAndSessionAndGroupID, packObjectID, logNoOp, &group_id, select_linked_set ? SEND_ONLY_ROOTS : SEND_CHILDREN_FIRST);
}
//-----------------------------------------------------------------------------
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 23c41e4cc1..87d25e3a8c 100755
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -506,6 +506,8 @@ public:
bool unlinkObjects();
+ void confirmUnlinkObjects(const LLSD& notification, const LLSD& response);
+
bool enableLinkObjects();
bool enableUnlinkObjects();
@@ -759,6 +761,7 @@ private:
void sendListToRegions( const std::string& message_name,
void (*pack_header)(void *user_data),
void (*pack_body)(LLSelectNode* node, void *user_data),
+ void (*log_func)(LLSelectNode* node, void *user_data),
void *user_data,
ESendType send_type);
@@ -794,6 +797,9 @@ private:
static void packHingeHead(void *user_data);
static void packPermissionsHead(void* user_data);
static void packGodlikeHead(void* user_data);
+ static void logNoOp(LLSelectNode* node, void *user_data);
+ static void logAttachmentRequest(LLSelectNode* node, void *user_data);
+ static void logDetachRequest(LLSelectNode* node, 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.
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 64f24cd291..ea7cf82674 100755
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -212,7 +212,8 @@ void LLSidepanelAppearance::updateToVisibility(const LLSD &new_visibility)
}
if (is_wearable_edit_visible)
{
- if (gAgentWearables.getWearableIndex(wearable_ptr) == LLAgentWearables::MAX_CLOTHING_PER_TYPE)
+ U32 index;
+ if (!gAgentWearables.getWearableIndex(wearable_ptr,index))
{
// we're no longer wearing the wearable we were last editing, switch back to outfit editor
showOutfitEditPanel();
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index 126f1fb9de..a7cfc173af 100755
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -44,6 +44,9 @@
#include "llviewercontrol.h"
#include "llviewerinventory.h"
#include "llviewerobjectlist.h"
+#include "llexperienceassociationresponder.h"
+#include "llexperiencecache.h"
+#include "lltrans.h"
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -319,6 +322,15 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
is_obj_modify = object->permOwnerModify();
}
+ if(item->getInventoryType() == LLInventoryType::IT_LSL)
+ {
+ getChildView("LabelItemExperienceTitle")->setVisible(TRUE);
+ LLTextBox* tb = getChild<LLTextBox>("LabelItemExperience");
+ tb->setText(getString("loading_experience"));
+ tb->setVisible(TRUE);
+ ExperienceAssociationResponder::fetchAssociatedExperience(item->getParentUUID(), item->getUUID(), boost::bind(&LLSidepanelItemInfo::setAssociatedExperience, getDerivedHandle<LLSidepanelItemInfo>(), _1));
+ }
+
//////////////////////
// ITEM NAME & DESC //
//////////////////////
@@ -674,6 +686,29 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
}
}
+
+void LLSidepanelItemInfo::setAssociatedExperience( LLHandle<LLSidepanelItemInfo> hInfo, const LLSD& experience )
+{
+ LLSidepanelItemInfo* info = hInfo.get();
+ if(info)
+ {
+ LLUUID id;
+ if(experience.has(LLExperienceCache::EXPERIENCE_ID))
+ {
+ id=experience[LLExperienceCache::EXPERIENCE_ID].asUUID();
+ }
+ if(id.notNull())
+ {
+ info->getChild<LLTextBox>("LabelItemExperience")->setText(LLSLURL("experience", id, "profile").getSLURLString());
+ }
+ else
+ {
+ info->getChild<LLTextBox>("LabelItemExperience")->setText(LLTrans::getString("ExperienceNameNull"));
+ }
+ }
+}
+
+
void LLSidepanelItemInfo::startObjectInventoryObserver()
{
if (!mObjectInventoryObserver)
diff --git a/indra/newview/llsidepaneliteminfo.h b/indra/newview/llsidepaneliteminfo.h
index 12aaca923e..2e24e58a2a 100755
--- a/indra/newview/llsidepaneliteminfo.h
+++ b/indra/newview/llsidepaneliteminfo.h
@@ -67,6 +67,8 @@ protected:
void refreshFromItem(LLViewerInventoryItem* item);
private:
+ static void setAssociatedExperience( LLHandle<LLSidepanelItemInfo> hInfo, const LLSD& experience );
+
void startObjectInventoryObserver();
void stopObjectInventoryObserver();
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
index 17ecfab4fb..2548d730f0 100755
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -370,18 +370,25 @@ void LLSidepanelTaskInfo::refresh()
// Update creator text field
getChildView("Creator:")->setEnabled(TRUE);
+
std::string creator_name;
- LLSelectMgr::getInstance()->selectGetCreator(mCreatorID, creator_name);
+ LLUUID creator_id;
+ LLSelectMgr::getInstance()->selectGetCreator(creator_id, creator_name);
- getChild<LLUICtrl>("Creator Name")->setValue(creator_name);
- getChildView("Creator Name")->setEnabled(TRUE);
+ if(creator_id != mCreatorID )
+ {
+ mDACreatorName->setValue(creator_name);
+ mCreatorID = creator_id;
+ }
+ mDACreatorName->setEnabled(TRUE);
// Update owner text field
getChildView("Owner:")->setEnabled(TRUE);
std::string owner_name;
- const BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(mOwnerID, owner_name);
- if (mOwnerID.isNull())
+ LLUUID owner_id;
+ const BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);
+ if (owner_id.isNull())
{
if (LLSelectMgr::getInstance()->selectIsGroupOwned())
{
@@ -402,7 +409,12 @@ void LLSidepanelTaskInfo::refresh()
}
}
}
- getChild<LLUICtrl>("Owner Name")->setValue(owner_name);
+
+ if(owner_id.isNull() || (owner_id != mOwnerID))
+ {
+ mDAOwnerName->setValue(owner_name);
+ mOwnerID = owner_id;
+ }
getChildView("Owner Name")->setEnabled(TRUE);
// update group text field
diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp
index 728fc69723..a8e012bfa1 100755
--- a/indra/newview/llslurl.cpp
+++ b/indra/newview/llslurl.cpp
@@ -271,7 +271,14 @@ LLSLURL::LLSLURL(const std::string& slurl)
// at this point, head of the path array should be [ <region>, <x>, <y>, <z> ] where x, y and z
// are collectively optional
// are optional
+
mRegion = LLURI::unescape(path_array[0].asString());
+
+ if(LLStringUtil::containsNonprintable(mRegion))
+ {
+ LLStringUtil::stripNonprintable(mRegion);
+ }
+
path_array.erase(0);
// parse the x, y, and optionally z
diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index 0ae8a338e0..6af9d61a54 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -195,7 +195,8 @@ void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail
// Stop shining animation.
mShineAnimTimer.stop();
mSnapshotDelayTimer.start();
- mSnapshotDelayTimer.setTimerExpirySec(delay);
+ mSnapshotDelayTimer.resetWithExpiry(delay);
+
mPosTakenGlobal = gAgentCamera.getCameraPositionGlobal();
@@ -670,10 +671,27 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
return FALSE;
}
- // If we're in freeze-frame mode and camera has moved, update snapshot.
+ if (previewp->mSnapshotDelayTimer.getStarted()) // Wait for a snapshot delay timer
+ {
+ if (!previewp->mSnapshotDelayTimer.hasExpired())
+ {
+ return FALSE;
+ }
+ previewp->mSnapshotDelayTimer.stop();
+ }
+
+ if (LLToolCamera::getInstance()->hasMouseCapture()) // Hide full-screen preview while camming, either don't take snapshots while ALT-zoom active
+ {
+ previewp->setVisible(FALSE);
+ return FALSE;
+ }
+
+ // If we're in freeze-frame and/or auto update mode and camera has moved, update snapshot.
LLVector3 new_camera_pos = LLViewerCamera::getInstance()->getOrigin();
LLQuaternion new_camera_rot = LLViewerCamera::getInstance()->getQuaternion();
- if (previewp->mForceUpdateSnapshot || (gSavedSettings.getBOOL("FreezeTime") && previewp->mAllowFullScreenPreview &&
+ if (previewp->mForceUpdateSnapshot ||
+ (((gSavedSettings.getBOOL("AutoSnapshot") && LLView::isAvailable(previewp->mViewContainer)) ||
+ (gSavedSettings.getBOOL("FreezeTime") && previewp->mAllowFullScreenPreview)) &&
(new_camera_pos != previewp->mCameraPos || dot(new_camera_rot, previewp->mCameraRot) < 0.995f)))
{
previewp->mCameraPos = new_camera_pos;
@@ -688,11 +706,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
previewp->mForceUpdateSnapshot = FALSE;
}
- // see if it's time yet to snap the shot and bomb out otherwise.
- previewp->mSnapshotActive =
- (previewp->mSnapshotDelayTimer.getStarted() && previewp->mSnapshotDelayTimer.hasExpired())
- && !LLToolCamera::getInstance()->hasMouseCapture(); // don't take snapshots while ALT-zoom active
- if (!previewp->mSnapshotActive && previewp->getSnapshotUpToDate() && previewp->getThumbnailUpToDate())
+ if (previewp->getSnapshotUpToDate() && previewp->getThumbnailUpToDate())
{
return FALSE;
}
@@ -706,6 +720,8 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
previewp->mPreviewImage = new LLImageRaw;
}
+ previewp->mSnapshotActive = TRUE;
+
previewp->setVisible(FALSE);
previewp->setEnabled(FALSE);
@@ -734,40 +750,9 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
// Full size preview is set: get the decoded image result and save it for animation
if (gSavedSettings.getBOOL("UseFreezeFrame") && previewp->mAllowFullScreenPreview)
{
- // Get the decoded version of the formatted image
- previewp->getEncodedImage();
-
- // We need to scale that a bit for display...
- LLPointer<LLImageRaw> scaled = new LLImageRaw(
- previewp->mPreviewImageEncoded->getData(),
- previewp->mPreviewImageEncoded->getWidth(),
- previewp->mPreviewImageEncoded->getHeight(),
- previewp->mPreviewImageEncoded->getComponents());
-
- if (!scaled->isBufferInvalid())
- {
- // leave original image dimensions, just scale up texture buffer
- if (previewp->mPreviewImageEncoded->getWidth() > 1024 || previewp->mPreviewImageEncoded->getHeight() > 1024)
- {
- // go ahead and shrink image to appropriate power of 2 for display
- scaled->biasedScaleToPowerOfTwo(1024);
- previewp->setImageScaled(TRUE);
- }
- else
- {
- // expand image but keep original image data intact
- scaled->expandToPowerOfTwo(1024, FALSE);
- }
-
- previewp->mViewerImage[previewp->mCurImageIndex] = LLViewerTextureManager::getLocalTexture(scaled.get(), FALSE);
- LLPointer<LLViewerTexture> curr_preview_image = previewp->mViewerImage[previewp->mCurImageIndex];
- gGL.getTexUnit(0)->bind(curr_preview_image);
- curr_preview_image->setFilteringOption(previewp->getSnapshotType() == SNAPSHOT_TEXTURE ? LLTexUnit::TFO_ANISOTROPIC : LLTexUnit::TFO_POINT);
- curr_preview_image->setAddressMode(LLTexUnit::TAM_CLAMP);
-
- previewp->mShineCountdown = 4; // wait a few frames to avoid animation glitch due to readback this frame
- }
+ previewp->prepareFreezeFrame();
}
+
// The snapshot is updated now...
previewp->mSnapshotUpToDate = TRUE;
@@ -777,7 +762,6 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
}
previewp->getWindow()->decBusyCount();
previewp->setVisible(gSavedSettings.getBOOL("UseFreezeFrame") && previewp->mAllowFullScreenPreview); // only show fullscreen preview when in freeze frame mode
- previewp->mSnapshotDelayTimer.stop();
previewp->mSnapshotActive = FALSE;
LL_DEBUGS() << "done creating snapshot" << LL_ENDL;
}
@@ -796,6 +780,47 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
return TRUE;
}
+void LLSnapshotLivePreview::prepareFreezeFrame()
+{
+ // Get the decoded version of the formatted image
+ getEncodedImage();
+
+ // We need to scale that a bit for display...
+ LLPointer<LLImageRaw> scaled = new LLImageRaw(
+ mPreviewImageEncoded->getData(),
+ mPreviewImageEncoded->getWidth(),
+ mPreviewImageEncoded->getHeight(),
+ mPreviewImageEncoded->getComponents());
+
+ if (!scaled->isBufferInvalid())
+ {
+ // leave original image dimensions, just scale up texture buffer
+ if (mPreviewImageEncoded->getWidth() > 1024 || mPreviewImageEncoded->getHeight() > 1024)
+ {
+ // go ahead and shrink image to appropriate power of 2 for display
+ scaled->biasedScaleToPowerOfTwo(1024);
+ setImageScaled(TRUE);
+ }
+ else
+ {
+ // expand image but keep original image data intact
+ scaled->expandToPowerOfTwo(1024, FALSE);
+ }
+
+ mViewerImage[mCurImageIndex] = LLViewerTextureManager::getLocalTexture(scaled.get(), FALSE);
+ LLPointer<LLViewerTexture> curr_preview_image = mViewerImage[mCurImageIndex];
+ gGL.getTexUnit(0)->bind(curr_preview_image);
+ curr_preview_image->setFilteringOption(getSnapshotType() == SNAPSHOT_TEXTURE ? LLTexUnit::TFO_ANISOTROPIC : LLTexUnit::TFO_POINT);
+ curr_preview_image->setAddressMode(LLTexUnit::TAM_CLAMP);
+
+
+ if (gSavedSettings.getBOOL("UseFreezeFrame") && mAllowFullScreenPreview)
+ {
+ mShineCountdown = 4; // wait a few frames to avoid animation glitch due to readback this frame
+ }
+ }
+}
+
S32 LLSnapshotLivePreview::getEncodedImageWidth() const
{
S32 width = getWidth();
diff --git a/indra/newview/llsnapshotlivepreview.h b/indra/newview/llsnapshotlivepreview.h
index fed33bf37c..57e5d83f8e 100644
--- a/indra/newview/llsnapshotlivepreview.h
+++ b/indra/newview/llsnapshotlivepreview.h
@@ -119,7 +119,7 @@ public:
void generateThumbnailImage(BOOL force_update = FALSE) ;
void resetThumbnailImage() { mThumbnailImage = NULL ; }
void drawPreviewRect(S32 offset_x, S32 offset_y) ;
-
+ void prepareFreezeFrame();
LLViewerTexture* getBigThumbnailImage();
S32 getBigThumbnailWidth() const { return mBigThumbnailWidth ; }
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 5e342099d7..da3f344e00 100755
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -862,10 +862,7 @@ void LLSpatialGroup::handleDestruction(const TreeNode* node)
{
if (bridge->mAvatar.notNull())
{
- bridge->mAvatar->mAttachmentGeometryBytes -= mGeometryBytes;
- bridge->mAvatar->mAttachmentGeometryBytes = llmax(bridge->mAvatar->mAttachmentGeometryBytes, 0);
- bridge->mAvatar->mAttachmentSurfaceArea -= mSurfaceArea;
- bridge->mAvatar->mAttachmentSurfaceArea = llmax(bridge->mAvatar->mAttachmentSurfaceArea, 0.f);
+ bridge->mAvatar->subtractAttachmentSizes( mGeometryBytes, mSurfaceArea );
}
}
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 7867e1573c..44c980c96f 100755
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -547,21 +547,8 @@ void LLSpeakerMgr::updateSpeakerList()
// 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);
- F32 large_group_delay = 0.f;
- if (gdatap)
- {
- //This is a viewer-side bandaid for maint-4414 it does not fix the core issue.
- large_group_delay = (F32)(gdatap->mMemberCount / 5000);
- }
-
- const F32 load_group_timeout = gSavedSettings.getF32("ChatLoadGroupTimeout") + large_group_delay;
-
- 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())
+
+ 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();
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 42fc300187..965aad517d 100755
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -48,6 +48,7 @@
#include "llares.h"
#include "llavatarnamecache.h"
+#include "llexperiencecache.h"
#include "lllandmark.h"
#include "llcachename.h"
#include "lldir.h"
@@ -194,6 +195,7 @@
#include "llevents.h"
#include "llstartuplistener.h"
#include "lltoolbarview.h"
+#include "llexperiencelog.h"
#if LL_WINDOWS
#include "lldxhardware.h"
@@ -240,7 +242,8 @@ static LLVector3 gAgentStartLookAt(1.0f, 0.f, 0.f);
static std::string gAgentStartLocation = "safe";
static bool mLoginStatePastUI = false;
-const S32 DEFAULT_MAX_AGENT_GROUPS = 25;
+const S32 DEFAULT_MAX_AGENT_GROUPS = 42;
+const S32 ALLOWED_MAX_AGENT_GROUPS = 500;
boost::scoped_ptr<LLEventPump> LLStartUp::sStateWatcher(new LLEventStream("StartupState"));
boost::scoped_ptr<LLStartupListener> LLStartUp::sListener(new LLStartupListener());
@@ -418,9 +421,7 @@ bool idle_startup()
gSavedSettings.setS32("LastFeatureVersion", LLFeatureManager::getInstance()->getVersion());
gSavedSettings.setString("LastGPUString", thisGPU);
- // load dynamic GPU/feature tables from website (S3)
- LLFeatureManager::getInstance()->fetchHTTPTables();
-
+
std::string xml_file = LLUI::locateSkin("xui_version.xml");
LLXMLNodePtr root;
bool xml_ok = false;
@@ -1306,6 +1307,9 @@ bool idle_startup()
gAgent.setPositionAgent(agent_start_position_region);
display_startup();
+ LLStartUp::initExperiences();
+
+ display_startup();
LLStartUp::setStartupState( STATE_MULTIMEDIA_INIT );
LLConversationLog::getInstance();
@@ -1875,6 +1879,11 @@ bool idle_startup()
}
display_startup();
+
+ // *TODO : Uncomment that line once the whole grid migrated to SLM and suppress it from LLAgent::handleTeleportFinished() (llagent.cpp)
+ //check_merchant_status();
+
+ display_startup();
if (gSavedSettings.getBOOL("HelpFloaterOpen"))
{
@@ -2824,6 +2833,14 @@ void LLStartUp::initNameCache()
LLAvatarNameCache::setUseUsernames(gSavedSettings.getBOOL("NameTagShowUsernames"));
}
+
+void LLStartUp::initExperiences()
+{
+ LLAppViewer::instance()->loadExperienceCache();
+ LLExperienceCache::initClass();
+ LLExperienceLog::instance().initialize();
+}
+
void LLStartUp::cleanupNameCache()
{
LLAvatarNameCache::cleanupClass();
@@ -3219,6 +3236,23 @@ bool process_login_success_response()
LLStringUtil::trim(gDisplayName);
}
}
+ std::string first_name;
+ if(response.has("first_name"))
+ {
+ first_name = response["first_name"].asString();
+ LLStringUtil::replaceChar(first_name, '"', ' ');
+ LLStringUtil::trim(first_name);
+ gAgentUsername = first_name;
+ }
+
+ if(response.has("last_name") && !gAgentUsername.empty() && (gAgentUsername != "Resident"))
+ {
+ std::string last_name = response["last_name"].asString();
+ LLStringUtil::replaceChar(last_name, '"', ' ');
+ LLStringUtil::trim(last_name);
+ gAgentUsername = gAgentUsername + " " + last_name;
+ }
+
if(gDisplayName.empty())
{
if(response.has("first_name"))
@@ -3239,6 +3273,7 @@ bool process_login_success_response()
gDisplayName += text;
}
}
+
if(gDisplayName.empty())
{
gDisplayName.assign(gUserCredential->asString());
@@ -3491,15 +3526,24 @@ bool process_login_success_response()
LLViewerMedia::openIDSetup(openid_url, openid_token);
}
- if(response.has("max-agent-groups")) {
- std::string max_agent_groups(response["max-agent-groups"]);
- gMaxAgentGroups = atoi(max_agent_groups.c_str());
- LL_INFOS("LLStartup") << "gMaxAgentGroups read from login.cgi: "
- << gMaxAgentGroups << LL_ENDL;
+ gMaxAgentGroups = DEFAULT_MAX_AGENT_GROUPS;
+ if(response.has("max-agent-groups"))
+ {
+ S32 agent_groups = atoi(std::string(response["max-agent-groups"]).c_str());
+ if (agent_groups > 0 && agent_groups <= ALLOWED_MAX_AGENT_GROUPS)
+ {
+ gMaxAgentGroups = agent_groups;
+ LL_INFOS("LLStartup") << "gMaxAgentGroups read from login.cgi: "
+ << gMaxAgentGroups << LL_ENDL;
+ }
+ else
+ {
+ LL_INFOS("LLStartup") << "Invalid value received, using defaults for gMaxAgentGroups: "
+ << gMaxAgentGroups << LL_ENDL;
+ }
}
else {
- gMaxAgentGroups = DEFAULT_MAX_AGENT_GROUPS;
- LL_INFOS("LLStartup") << "using gMaxAgentGroups default: "
+ LL_INFOS("LLStartup") << "Missing max-agent-groups, using default value for gMaxAgentGroups: "
<< gMaxAgentGroups << LL_ENDL;
}
@@ -3525,3 +3569,4 @@ void transition_back_to_login_panel(const std::string& emsg)
reset_login(); // calls LLStartUp::setStartupState( STATE_LOGIN_SHOW );
gSavedSettings.setBOOL("AutoLogin", FALSE);
}
+
diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h
index e39810713a..d434e86f82 100755
--- a/indra/newview/llstartup.h
+++ b/indra/newview/llstartup.h
@@ -103,6 +103,7 @@ public:
static void fontInit();
static void initNameCache();
+ static void initExperiences();
static void cleanupNameCache();
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 2d4b23d892..5c1041e556 100755
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -38,6 +38,7 @@
#include "llfloaterbuycurrency.h"
#include "llbuycurrencyhtml.h"
#include "llpanelnearbymedia.h"
+#include "llpanelpresetspulldown.h"
#include "llpanelvolumepulldown.h"
#include "llfloaterregioninfo.h"
#include "llfloaterscriptdebug.h"
@@ -170,6 +171,9 @@ BOOL LLStatusBar::postBuild()
mBtnStats = getChildView("stat_btn");
+ mIconPresets = getChild<LLIconCtrl>( "presets_icon" );
+ mIconPresets->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterPresets, this));
+
mBtnVolume = getChild<LLButton>( "volume_btn" );
mBtnVolume->setClickedCallback( onClickVolume, this );
mBtnVolume->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterVolume, this));
@@ -223,6 +227,11 @@ BOOL LLStatusBar::postBuild()
mSGPacketLoss = LLUICtrlFactory::create<LLStatGraph>(pgp);
addChild(mSGPacketLoss);
+ mPanelPresetsPulldown = new LLPanelPresetsPulldown();
+ addChild(mPanelPresetsPulldown);
+ mPanelPresetsPulldown->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT);
+ mPanelPresetsPulldown->setVisible(FALSE);
+
mPanelVolumePulldown = new LLPanelVolumePulldown();
addChild(mPanelVolumePulldown);
mPanelVolumePulldown->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT);
@@ -460,8 +469,32 @@ void LLStatusBar::onClickBuyCurrency()
LLFirstUse::receiveLindens(false);
}
+void LLStatusBar::onMouseEnterPresets()
+{
+ LLView* popup_holder = gViewerWindow->getRootView()->getChildView("popup_holder");
+ LLIconCtrl* icon = getChild<LLIconCtrl>( "presets_icon" );
+ LLRect icon_rect = icon->getRect();
+ LLRect pulldown_rect = mPanelPresetsPulldown->getRect();
+ pulldown_rect.setLeftTopAndSize(icon_rect.mLeft -
+ (pulldown_rect.getWidth() - icon_rect.getWidth()),
+ icon_rect.mBottom,
+ pulldown_rect.getWidth(),
+ pulldown_rect.getHeight());
+
+ pulldown_rect.translate(popup_holder->getRect().getWidth() - pulldown_rect.mRight, 0);
+ mPanelPresetsPulldown->setShape(pulldown_rect);
+
+ // show the master presets pull-down
+ LLUI::clearPopups();
+ LLUI::addPopup(mPanelPresetsPulldown);
+ mPanelNearByMedia->setVisible(FALSE);
+ mPanelVolumePulldown->setVisible(FALSE);
+ mPanelPresetsPulldown->setVisible(TRUE);
+}
+
void LLStatusBar::onMouseEnterVolume()
{
+ LLView* popup_holder = gViewerWindow->getRootView()->getChildView("popup_holder");
LLButton* volbtn = getChild<LLButton>( "volume_btn" );
LLRect vol_btn_rect = volbtn->getRect();
LLRect volume_pulldown_rect = mPanelVolumePulldown->getRect();
@@ -471,12 +504,14 @@ void LLStatusBar::onMouseEnterVolume()
volume_pulldown_rect.getWidth(),
volume_pulldown_rect.getHeight());
+ volume_pulldown_rect.translate(popup_holder->getRect().getWidth() - volume_pulldown_rect.mRight, 0);
mPanelVolumePulldown->setShape(volume_pulldown_rect);
// show the master volume pull-down
LLUI::clearPopups();
LLUI::addPopup(mPanelVolumePulldown);
+ mPanelPresetsPulldown->setVisible(FALSE);
mPanelNearByMedia->setVisible(FALSE);
mPanelVolumePulldown->setVisible(TRUE);
}
@@ -500,6 +535,7 @@ void LLStatusBar::onMouseEnterNearbyMedia()
LLUI::clearPopups();
LLUI::addPopup(mPanelNearByMedia);
+ mPanelPresetsPulldown->setVisible(FALSE);
mPanelVolumePulldown->setVisible(FALSE);
mPanelNearByMedia->setVisible(TRUE);
}
diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h
index 9d28e6c2bc..277f039f20 100755
--- a/indra/newview/llstatusbar.h
+++ b/indra/newview/llstatusbar.h
@@ -41,8 +41,10 @@ class LLUICtrl;
class LLUUID;
class LLFrameTimer;
class LLStatGraph;
+class LLPanelPresetsPulldown;
class LLPanelVolumePulldown;
class LLPanelNearByMedia;
+class LLIconCtrl;
class LLStatusBar
: public LLPanel
@@ -89,6 +91,7 @@ private:
void onClickBuyCurrency();
void onVolumeChanged(const LLSD& newvalue);
+ void onMouseEnterPresets();
void onMouseEnterVolume();
void onMouseEnterNearbyMedia();
void onClickScreen(S32 x, S32 y);
@@ -103,6 +106,7 @@ private:
LLStatGraph *mSGPacketLoss;
LLView *mBtnStats;
+ LLIconCtrl *mIconPresets;
LLButton *mBtnVolume;
LLTextBox *mBoxBalance;
LLButton *mMediaToggle;
@@ -115,6 +119,7 @@ private:
S32 mSquareMetersCommitted;
LLFrameTimer* mBalanceTimer;
LLFrameTimer* mHealthTimer;
+ LLPanelPresetsPulldown* mPanelPresetsPulldown;
LLPanelVolumePulldown* mPanelVolumePulldown;
LLPanelNearByMedia* mPanelNearByMedia;
};
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index 8babb874f8..8f64cff47c 100755
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -296,158 +296,6 @@ BOOL LLIMWellWindow::ObjectRowPanel::handleRightMouseDown(S32 x, S32 y, MASK mas
}
/************************************************************************/
-/* LLNotificationWellWindow implementation */
-/************************************************************************/
-
-//////////////////////////////////////////////////////////////////////////
-// 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)
-{
- mNotificationUpdates.reset(new WellNotificationChannel(this));
-}
-
-// static
-LLNotificationWellWindow* LLNotificationWellWindow::getInstance(const LLSD& key /*= LLSD()*/)
-{
- return LLFloaterReg::getTypedInstance<LLNotificationWellWindow>("notification_well_window", key);
-}
-
-// virtual
-BOOL LLNotificationWellWindow::postBuild()
-{
- BOOL rv = LLSysWellWindow::postBuild();
- setTitle(getString("title_notification_well_window"));
- return rv;
-}
-
-// virtual
-void LLNotificationWellWindow::setVisible(BOOL visible)
-{
- if (visible)
- {
- // when Notification channel is cleared, storable toasts will be added into the list.
- clearScreenChannels();
- }
-
- LLSysWellWindow::setVisible(visible);
-}
-
-//---------------------------------------------------------------------------------
-void LLNotificationWellWindow::addItem(LLSysWellItem::Params p)
-{
- LLSD value = p.notification_id;
- // do not add clones
- if( mMessageList->getItemByValue(value))
- return;
-
- LLSysWellItem* new_item = new LLSysWellItem(p);
- if (mMessageList->addItem(new_item, value, ADD_TOP))
- {
- mSysWellChiclet->updateWidget(isWindowEmpty());
- reshapeWindow();
- new_item->setOnItemCloseCallback(boost::bind(&LLNotificationWellWindow::onItemClose, this, _1));
- new_item->setOnItemClickCallback(boost::bind(&LLNotificationWellWindow::onItemClick, this, _1));
- }
- else
- {
- LL_WARNS() << "Unable to add Notification into the list, notification ID: " << p.notification_id
- << ", title: " << p.title
- << LL_ENDL;
-
- new_item->die();
- }
-}
-
-void LLNotificationWellWindow::closeAll()
-{
- // Need to clear notification channel, to add storable toasts into the list.
- clearScreenChannels();
- std::vector<LLPanel*> items;
- mMessageList->getItems(items);
- for (std::vector<LLPanel*>::iterator
- iter = items.begin(),
- iter_end = items.end();
- iter != iter_end; ++iter)
- {
- LLSysWellItem* sys_well_item = dynamic_cast<LLSysWellItem*>(*iter);
- if (sys_well_item)
- onItemClose(sys_well_item);
- }
-}
-
-//////////////////////////////////////////////////////////////////////////
-// PRIVATE METHODS
-void LLNotificationWellWindow::initChannel()
-{
- LLSysWellWindow::initChannel();
- if(mChannel)
- {
- mChannel->addOnStoreToastCallback(boost::bind(&LLNotificationWellWindow::onStoreToast, this, _1, _2));
- }
-}
-
-void LLNotificationWellWindow::clearScreenChannels()
-{
- // 1 - remove StartUp toast and channel if present
- if(!LLNotificationsUI::LLScreenChannel::getStartUpToastShown())
- {
- LLNotificationsUI::LLChannelManager::getInstance()->onStartUpToastClose();
- }
-
- // 2 - remove toasts in Notification channel
- if(mChannel)
- {
- mChannel->removeAndStoreAllStorableToasts();
- }
-}
-
-void LLNotificationWellWindow::onStoreToast(LLPanel* info_panel, LLUUID id)
-{
- LLSysWellItem::Params p;
- p.notification_id = id;
- p.title = static_cast<LLToastPanel*>(info_panel)->getTitle();
- addItem(p);
-}
-
-void LLNotificationWellWindow::onItemClick(LLSysWellItem* item)
-{
- LLUUID id = item->getID();
- LLFloaterReg::showInstance("inspect_toast", id);
-}
-
-void LLNotificationWellWindow::onItemClose(LLSysWellItem* item)
-{
- LLUUID id = item->getID();
-
- if(mChannel)
- {
- // removeItemByID() is invoked from killToastByNotificationID() and item will removed;
- mChannel->killToastByNotificationID(id);
- }
- else
- {
- // removeItemByID() should be called one time for each item to remove it from notification well
- removeItemByID(id);
- }
-
-}
-
-void LLNotificationWellWindow::onAdd( LLNotificationPtr notify )
-{
- removeItemByID(notify->getID());
-}
-
-/************************************************************************/
/* LLIMWellWindow implementation */
/************************************************************************/
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index 71b41476f5..d02293e6ff 100755
--- a/indra/newview/llsyswellwindow.h
+++ b/indra/newview/llsyswellwindow.h
@@ -96,57 +96,6 @@ protected:
};
/**
- * Class intended to manage incoming notifications.
- *
- * It contains a list of notifications that have not been responded to.
- */
-class LLNotificationWellWindow : public LLSysWellWindow
-{
-public:
- LLNotificationWellWindow(const LLSD& key);
- static LLNotificationWellWindow* getInstance(const LLSD& key = LLSD());
-
- /*virtual*/ BOOL postBuild();
- /*virtual*/ void setVisible(BOOL visible);
- /*virtual*/ void onAdd(LLNotificationPtr notify);
- // Operating with items
- void addItem(LLSysWellItem::Params p);
-
- // Closes all notifications and removes them from the Notification Well
- 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:
- // init Window's channel
- void initChannel();
- void clearScreenChannels();
-
- void onStoreToast(LLPanel* info_panel, LLUUID id);
-
- // Handlers
- void onItemClick(LLSysWellItem* item);
- void onItemClose(LLSysWellItem* item);
-
- // ID of a toast loaded by user (by clicking notification well item)
- LLUUID mLoadedToastId;
-
-};
-
-/**
* Class intended to manage incoming messages in IM chats.
*
* It contains a list list of all active IM sessions.
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index ef852bc905..bcdf8360ed 100755
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -1544,17 +1544,20 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
{
std::string dirname = mTexturesDirName + delem + subdirs[i];
LL_INFOS() << "Deleting files in directory: " << dirname << LL_ENDL;
- gDirUtilp->deleteFilesInDir(dirname, mask);
if (purge_directories)
{
- LLFile::rmdir(dirname);
+ gDirUtilp->deleteDirAndContents(dirname);
+ }
+ else
+ {
+ gDirUtilp->deleteFilesInDir(dirname, mask);
}
}
if (purge_directories)
{
gDirUtilp->deleteFilesInDir(mTexturesDirName, mask);
LLFile::rmdir(mTexturesDirName);
- }
+ }
}
mHeaderIDMap.clear();
mTexturesSizeMap.clear();
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 717807f513..980810835e 100755
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -188,6 +188,7 @@ protected:
private:
bool mCanApply;
bool mCanPreview;
+ bool mPreviewSettingChanged;
texture_selected_callback mTextureSelectedCallback;
};
@@ -215,7 +216,8 @@ LLFloaterTexturePicker::LLFloaterTexturePicker(
mContextConeOpacity(0.f),
mSelectedItemPinned( FALSE ),
mCanApply(true),
- mCanPreview(true)
+ mCanPreview(true),
+ mPreviewSettingChanged(false)
{
buildFromFile("floater_texture_ctrl.xml");
mCanApplyImmediately = can_apply_immediately;
@@ -823,6 +825,16 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem
}
setImageID(itemp->getAssetUUID(),false);
mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here?
+
+ if(!mPreviewSettingChanged)
+ {
+ mCanPreview = gSavedSettings.getBOOL("TextureLivePreview");
+ }
+ else
+ {
+ mPreviewSettingChanged = false;
+ }
+
if (user_action && mCanPreview)
{
// only commit intentional selections, not implicit ones
@@ -979,6 +991,7 @@ void LLFloaterTexturePicker::setCanApply(bool can_preview, bool can_apply)
mCanApply = can_apply;
mCanPreview = can_preview ? gSavedSettings.getBOOL("TextureLivePreview") : false;
+ mPreviewSettingChanged = true;
}
void LLFloaterTexturePicker::onFilterEdit(const std::string& search_string )
diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp
index 0a9453534b..530bd9a18f 100755
--- a/indra/newview/lltoastalertpanel.cpp
+++ b/indra/newview/lltoastalertpanel.cpp
@@ -67,19 +67,19 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
mLabel(notification->getName()),
mLineEditor(NULL)
{
- // EXP-1822
- // save currently focused view, so that return focus to it
- // on destroying this toast.
- LLView* current_selection = dynamic_cast<LLView*>(gFocusMgr.getKeyboardFocus());
- while(current_selection)
- {
- if (current_selection->isFocusRoot())
- {
- mPreviouslyFocusedView = current_selection->getHandle();
- break;
- }
- current_selection = current_selection->getParent();
- }
+ // EXP-1822
+ // save currently focused view, so that return focus to it
+ // on destroying this toast.
+ LLView* current_selection = dynamic_cast<LLView*>(gFocusMgr.getKeyboardFocus());
+ while(current_selection)
+ {
+ if (current_selection->isFocusRoot())
+ {
+ mPreviouslyFocusedView = current_selection->getHandle();
+ break;
+ }
+ current_selection = current_selection->getParent();
+ }
const LLFontGL* font = LLFontGL::getFontSansSerif();
const S32 LINE_HEIGHT = font->getLineHeight();
@@ -431,7 +431,24 @@ LLToastAlertPanel::~LLToastAlertPanel()
// return focus to the previously focused view if the viewer is not exiting
if (mPreviouslyFocusedView.get() && !LLApp::isExiting())
{
- mPreviouslyFocusedView.get()->setFocus(TRUE);
+ LLView* current_selection = dynamic_cast<LLView*>(gFocusMgr.getKeyboardFocus());
+ while(current_selection)
+ {
+ if (current_selection->isFocusRoot())
+ {
+ break;
+ }
+ current_selection = current_selection->getParent();
+ }
+ if (current_selection)
+ {
+ // If the focus moved to some other view though, move the focus there
+ current_selection->setFocus(TRUE);
+ }
+ else
+ {
+ mPreviouslyFocusedView.get()->setFocus(TRUE);
+ }
}
}
diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp
index e00b18dedb..e22f527a65 100755
--- a/indra/newview/lltoastgroupnotifypanel.cpp
+++ b/indra/newview/lltoastgroupnotifypanel.cpp
@@ -92,7 +92,7 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(const LLNotificationPtr& notifi
+LLTrans::getString("UTCTimeSec")+"] ["
+LLTrans::getString("UTCTimeTimezone")+"]";
const LLDate timeStamp = notification->getDate();
- LLDate notice_date = timeStamp.notNull() ? timeStamp : LLDate::now();
+ LLDate notice_date = timeStamp.notNull() ? timeStamp : payload["received_time"].asDate();
LLSD substitution;
substitution["datetime"] = (S32) notice_date.secondsSinceEpoch();
LLStringUtil::format(timeStr, substitution);
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 602c701a33..98ed2f0fc4 100755
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -46,7 +46,7 @@
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)
+// *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;
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 526f8d1cd8..5c9aedcf8f 100755
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -821,6 +821,7 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
if (!handled)
{
+ // *TODO: Suppress the "outbox" case once "marketplace" is used everywhere for everyone
// Disallow drag and drop to 3D from the outbox
const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
if (outbox_id.notNull())
@@ -835,6 +836,20 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
}
}
}
+ // Disallow drag and drop to 3D from the marketplace
+ const LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ if (marketplacelistings_id.notNull())
+ {
+ for (S32 item_index = 0; item_index < (S32)mCargoIDs.size(); item_index++)
+ {
+ if (gInventory.isObjectDescendentOf(mCargoIDs[item_index], marketplacelistings_id))
+ {
+ *acceptance = ACCEPT_NO;
+ mToolTipMsg = LLTrans::getString("TooltipOutboxDragToWorld");
+ return;
+ }
+ }
+ }
dragOrDrop3D( x, y, mask, drop, acceptance );
}
@@ -994,9 +1009,15 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj,
return TRUE;
}
- // In case the inventory has not been updated (e.g. due to some recent operation
- // causing a dirty inventory), stall the user while fetching the inventory.
- if (hit_obj->isInventoryDirty())
+ // In case the inventory has not been loaded (e.g. due to some recent operation
+ // causing a dirty inventory) and we can do an update, stall the user
+ // while fetching the inventory.
+ //
+ // Note: fetch only if inventory is both dirty and not present since previously checked faces
+ // could have requested new fetch for same item (removed inventory and marked as dirty=false).
+ // Objects without listeners (dirty==true and inventory!=NULL. In this specific case - before
+ // first fetch) shouldn't be updated either since we won't receive any changes.
+ if (hit_obj->isInventoryDirty() && hit_obj->getInventoryRoot() == NULL)
{
hit_obj->fetchInventoryFromServer();
LLSD args;
@@ -1134,8 +1155,7 @@ void LLToolDragAndDrop::dropMesh(LLViewerObject* hit_obj,
}
LLSculptParams sculpt_params;
- sculpt_params.setSculptTexture(asset_id);
- sculpt_params.setSculptType(LL_SCULPT_TYPE_MESH);
+ sculpt_params.setSculptTexture(asset_id, LL_SCULPT_TYPE_MESH);
hit_obj->setParameterEntry(LLNetworkData::PARAMS_SCULPT, sculpt_params, TRUE);
dialog_refresh_all();
diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h
index de501ea32a..63be1ef09b 100755
--- a/indra/newview/lltooldraganddrop.h
+++ b/indra/newview/lltooldraganddrop.h
@@ -89,6 +89,7 @@ public:
void setCargoCount(U32 count) { mCargoCount = count; }
void resetCargoCount() { mCargoCount = 0; }
U32 getCargoCount() const { return (mCargoCount > 0) ? mCargoCount : mCargoIDs.size(); }
+ S32 getCargoIndex() const { return mCurItemIndex; }
static S32 getOperationId() { return sOperationId; }
diff --git a/indra/newview/lltoolgrab.h b/indra/newview/lltoolgrab.h
index 4e22732124..5d24c8813e 100755
--- a/indra/newview/lltoolgrab.h
+++ b/indra/newview/lltoolgrab.h
@@ -78,6 +78,8 @@ public:
// Certain grabs should not highlight the "Build" toolbar button
BOOL getHideBuildHighlight() { return mHideBuildHighlight; }
+ void setClickedInMouselook(BOOL is_clickedInMouselook) {mClickedInMouselook = is_clickedInMouselook;}
+
static void pickCallback(const LLPickInfo& pick_info);
private:
LLVector3d getGrabPointGlobal();
diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp
index 175227173f..3ecb4015ce 100755
--- a/indra/newview/lltoolmgr.cpp
+++ b/indra/newview/lltoolmgr.cpp
@@ -37,6 +37,7 @@
#include "llfloaterinspect.h"
#include "lltool.h"
#include "llmanipscale.h"
+#include "llmarketplacefunctions.h"
#include "llselectmgr.h"
#include "lltoolbrush.h"
#include "lltoolcomp.h"
@@ -83,6 +84,8 @@ LLToolMgr::LLToolMgr()
LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.Active", boost::bind(&LLToolMgr::inEdit, this));
LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.Enabled", boost::bind(&LLToolMgr::canEdit, this));
LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Build.Toggle", boost::bind(&LLToolMgr::toggleBuildMode, this, _2));
+ LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Marketplace.Enabled", boost::bind(&LLToolMgr::canAccessMarketplace, this));
+ LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Marketplace.Toggle", boost::bind(&LLToolMgr::toggleMarketplace, this, _2));
gToolNull = new LLTool(LLStringUtil::null); // Does nothing
setCurrentTool(gToolNull);
@@ -345,6 +348,23 @@ bool LLToolMgr::inBuildMode()
return b;
}
+bool LLToolMgr::canAccessMarketplace()
+{
+ return (LLMarketplaceData::instance().getSLMStatus() != MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT) || gSavedSettings.getBOOL("InventoryOutboxDisplayBoth");
+}
+
+void LLToolMgr::toggleMarketplace(const LLSD& sdname)
+{
+ const std::string& param = sdname.asString();
+
+ if ((param != "marketplace") || !canAccessMarketplace())
+ {
+ return;
+ }
+
+ LLFloaterReg::toggleInstanceOrBringToFront("marketplace_listings");
+}
+
void LLToolMgr::setTransientTool(LLTool* tool)
{
if (!tool)
diff --git a/indra/newview/lltoolmgr.h b/indra/newview/lltoolmgr.h
index e7d1c56c83..a3c1045aac 100755
--- a/indra/newview/lltoolmgr.h
+++ b/indra/newview/lltoolmgr.h
@@ -54,7 +54,9 @@ public:
bool inEdit();
bool canEdit();
+ bool canAccessMarketplace();
void toggleBuildMode(const LLSD& sdname);
+ void toggleMarketplace(const LLSD& sdname);
/* Determines if we are in Build mode or not. */
bool inBuildMode();
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index e4353aafaa..2081297717 100755
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -319,6 +319,7 @@ BOOL LLToolPie::handleLeftClickPick()
{
gGrabTransientTool = this;
mMouseButtonDown = false;
+ LLToolGrab::getInstance()->setClickedInMouselook(gAgentCamera.cameraMouselook());
LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolGrab::getInstance() );
return LLToolGrab::getInstance()->handleObjectHit( mPick );
}
diff --git a/indra/newview/llurllineeditorctrl.cpp b/indra/newview/llurllineeditorctrl.cpp
index cad5769042..8a61114852 100755
--- a/indra/newview/llurllineeditorctrl.cpp
+++ b/indra/newview/llurllineeditorctrl.cpp
@@ -84,7 +84,7 @@ void LLURLLineEditor::copyEscapedURLToClipboard()
const std::string unescaped_text = wstring_to_utf8str(mText.getWString().substr(left_pos, length));
LLWString text_to_copy;
// *HACK: Because LLSLURL is currently broken we cannot use it to check if unescaped_text is a valid SLURL (see EXT-8335).
- if (LLStringUtil::startsWith(unescaped_text, "http://")) // SLURL
+ if (LLStringUtil::startsWith(unescaped_text, "http://") || LLStringUtil::startsWith(unescaped_text, "secondlife://")) // SLURL
text_to_copy = utf8str_to_wstring(LLWeb::escapeURL(unescaped_text));
else // human-readable location
text_to_copy = utf8str_to_wstring(unescaped_text);
diff --git a/indra/newview/llversioninfo.cpp b/indra/newview/llversioninfo.cpp
index 5cc7d7bed3..e53de8be32 100755
--- a/indra/newview/llversioninfo.cpp
+++ b/indra/newview/llversioninfo.cpp
@@ -29,6 +29,7 @@
#include <iostream>
#include <sstream>
#include "llversioninfo.h"
+#include <boost/regex.hpp>
#if ! defined(LL_VIEWER_CHANNEL) \
|| ! defined(LL_VIEWER_VERSION_MAJOR) \
@@ -131,3 +132,43 @@ void LLVersionInfo::resetChannel(const std::string& channel)
sWorkingChannelName = channel;
sVersionChannel.clear(); // Reset version and channel string til next use.
}
+
+//static
+LLVersionInfo::ViewerMaturity LLVersionInfo::getViewerMaturity()
+{
+ ViewerMaturity maturity;
+
+ std::string channel = getChannel();
+
+ static const boost::regex is_test_channel("\\bTest\\b");
+ static const boost::regex is_beta_channel("\\bBeta\\b");
+ static const boost::regex is_project_channel("\\bProject\\b");
+ static const boost::regex is_release_channel("\\bRelease\\b");
+
+ if (boost::regex_search(channel, is_release_channel))
+ {
+ maturity = RELEASE_VIEWER;
+ }
+ else if (boost::regex_search(channel, is_beta_channel))
+ {
+ maturity = BETA_VIEWER;
+ }
+ else if (boost::regex_search(channel, is_project_channel))
+ {
+ maturity = PROJECT_VIEWER;
+ }
+ else if (boost::regex_search(channel, is_test_channel))
+ {
+ maturity = TEST_VIEWER;
+ }
+ else
+ {
+ LL_WARNS() << "Channel '" << channel
+ << "' does not follow naming convention, assuming Test"
+ << LL_ENDL;
+ maturity = TEST_VIEWER;
+ }
+ return maturity;
+}
+
+
diff --git a/indra/newview/llversioninfo.h b/indra/newview/llversioninfo.h
index 077105cae8..4e75535ec5 100755
--- a/indra/newview/llversioninfo.h
+++ b/indra/newview/llversioninfo.h
@@ -68,6 +68,15 @@ public:
/// reset the channel name used by the viewer.
static void resetChannel(const std::string& channel);
+
+ typedef enum
+ {
+ TEST_VIEWER,
+ PROJECT_VIEWER,
+ BETA_VIEWER,
+ RELEASE_VIEWER
+ } ViewerMaturity;
+ static ViewerMaturity getViewerMaturity();
};
#endif
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 5020518454..16f40fb747 100755
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -167,11 +167,6 @@ static bool handleRenderPerfTestChanged(const LLSD& newvalue)
return true;
}
-bool handleRenderAvatarComplexityLimitChanged(const LLSD& newvalue)
-{
- return true;
-}
-
bool handleRenderTransparentWaterChanged(const LLSD& newvalue)
{
LLWorld::getInstance()->updateWaterObjects();
@@ -224,12 +219,6 @@ static bool handleAvatarPhysicsLODChanged(const LLSD& newvalue)
return true;
}
-static bool handleAvatarMaxVisibleChanged(const LLSD& newvalue)
-{
- LLVOAvatar::sMaxVisible = (U32) newvalue.asInteger();
- return true;
-}
-
static bool handleTerrainLODChanged(const LLSD& newvalue)
{
LLVOSurfacePatch::sLODFactor = (F32)newvalue.asReal();
@@ -423,12 +412,6 @@ static bool handleRenderBumpChanged(const LLSD& newval)
return true;
}
-static bool handleRenderUseImpostorsChanged(const LLSD& newvalue)
-{
- LLVOAvatar::sUseImpostors = newvalue.asBoolean();
- return true;
-}
-
static bool handleRenderDebugGLChanged(const LLSD& newvalue)
{
gDebugGL = newvalue.asBoolean() || gDebugSession;
@@ -635,8 +618,6 @@ void settings_setup_listeners()
gSavedSettings.getControl("RenderAvatarCloth")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
- gSavedSettings.getControl("RenderAvatarMaxVisible")->getSignal()->connect(boost::bind(&handleAvatarMaxVisibleChanged, _2));
- gSavedSettings.getControl("RenderAvatarComplexityLimit")->getSignal()->connect(boost::bind(&handleRenderAvatarComplexityLimitChanged, _2));
gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _2));
gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _2));
gSavedSettings.getControl("RenderAvatarPhysicsLODFactor")->getSignal()->connect(boost::bind(&handleAvatarPhysicsLODChanged, _2));
@@ -654,7 +635,6 @@ void settings_setup_listeners()
gSavedSettings.getControl("RenderObjectBump")->getSignal()->connect(boost::bind(&handleRenderBumpChanged, _2));
gSavedSettings.getControl("RenderMaxVBOSize")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderDeferredNoise")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
- gSavedSettings.getControl("RenderUseImpostors")->getSignal()->connect(boost::bind(&handleRenderUseImpostorsChanged, _2));
gSavedSettings.getControl("RenderDebugGL")->getSignal()->connect(boost::bind(&handleRenderDebugGLChanged, _2));
gSavedSettings.getControl("RenderDebugPipeline")->getSignal()->connect(boost::bind(&handleRenderDebugPipelineChanged, _2));
gSavedSettings.getControl("RenderResolutionDivisor")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _2));
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index fc18b20758..65f427c3f1 100755
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -55,12 +55,16 @@
#include "llfloaterconversationlog.h"
#include "llfloaterconversationpreview.h"
#include "llfloaterdeleteenvpreset.h"
+#include "llfloaterdeleteprefpreset.h"
#include "llfloaterdestinations.h"
#include "llfloaterdisplayname.h"
#include "llfloatereditdaycycle.h"
#include "llfloatereditsky.h"
#include "llfloatereditwater.h"
#include "llfloaterenvironmentsettings.h"
+#include "llfloaterexperienceprofile.h"
+#include "llfloaterexperiences.h"
+#include "llfloaterexperiencepicker.h"
#include "llfloaterevent.h"
#include "llfloaterfacebook.h"
#include "llfloaterflickr.h"
@@ -68,7 +72,6 @@
#include "llfloatergesture.h"
#include "llfloatergodtools.h"
#include "llfloatergroups.h"
-#include "llfloaterhardwaresettings.h"
#include "llfloaterhelpbrowser.h"
#include "llfloaterhoverheight.h"
#include "llfloaterhud.h"
@@ -80,12 +83,15 @@
#include "llfloaterlagmeter.h"
#include "llfloaterland.h"
#include "llfloaterlandholdings.h"
+#include "llfloaterloadprefpreset.h"
#include "llfloatermap.h"
+#include "llfloatermarketplacelistings.h"
#include "llfloatermediasettings.h"
#include "llfloatermemleak.h"
#include "llfloatermodelpreview.h"
#include "llfloaternamedesc.h"
#include "llfloaternotificationsconsole.h"
+#include "llfloaternotificationstabbed.h"
#include "llfloaterobjectweights.h"
#include "llfloateropenobject.h"
#include "llfloateroutbox.h"
@@ -101,6 +107,7 @@
#include "llfloaterregioninfo.h"
#include "llfloaterregionrestarting.h"
#include "llfloaterreporter.h"
+#include "llfloatersaveprefpreset.h"
#include "llfloatersceneloadstats.h"
#include "llfloaterscriptdebug.h"
#include "llfloaterscriptedprefs.h"
@@ -183,6 +190,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("block_timers", "floater_fast_timers.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFastTimerView>);
LLFloaterReg::add("about_land", "floater_about_land.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLand>);
LLFloaterReg::add("appearance", "floater_my_appearance.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
+ LLFloaterReg::add("associate_listing", "floater_associate_listing.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAssociateListing>);
LLFloaterReg::add("auction", "floater_auction.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAuction>);
LLFloaterReg::add("avatar", "floater_avatar.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatar>);
LLFloaterReg::add("avatar_picker", "floater_avatar_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarPicker>);
@@ -205,6 +213,7 @@ void LLViewerFloaterReg::registerFloaters()
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("delete_pref_preset", "floater_delete_pref_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDeletePrefPreset>);
LLFloaterReg::add("destinations", "floater_destinations.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDestinations>);
LLFloaterReg::add("env_post_process", "floater_post_process.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostProcess>);
@@ -214,8 +223,11 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("env_edit_water", "floater_edit_water_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEditWater>);
LLFloaterReg::add("env_edit_day_cycle", "floater_edit_day_cycle.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEditDayCycle>);
- LLFloaterReg::add("event", "floater_event.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEvent>);
-
+ LLFloaterReg::add("event", "floater_event.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEvent>);
+ LLFloaterReg::add("experiences", "floater_experiences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterExperiences>);
+ LLFloaterReg::add("experience_profile", "floater_experienceprofile.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterExperienceProfile>);
+ LLFloaterReg::add("experience_search", "floater_experience_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterExperiencePicker>);
+
LLFloaterReg::add("font_test", "floater_font_test.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterFontTest>);
LLFloaterReg::add("gestures", "floater_gesture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGesture>);
@@ -232,6 +244,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("incoming_call", "floater_incoming_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIncomingCallDialog>);
LLFloaterReg::add("inventory", "floater_my_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("inspect", "floater_inspect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInspect>);
+ LLFloaterReg::add("item_properties", "floater_item_properties.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterItemProperties>);
LLInspectAvatarUtil::registerFloater();
LLInspectGroupUtil::registerFloater();
LLInspectObjectUtil::registerFloater();
@@ -242,6 +255,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("lagmeter", "floater_lagmeter.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLagMeter>);
LLFloaterReg::add("land_holdings", "floater_land_holdings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLandHoldings>);
+ LLFloaterReg::add("load_pref_preset", "floater_load_pref_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLoadPrefPreset>);
LLFloaterReg::add("mem_leaking", "floater_mem_leaking.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMemLeak>);
@@ -250,6 +264,8 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("tex_fetch_debugger", "floater_texture_fetch_debugger.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTextureFetchDebugger>);
}
LLFloaterReg::add("media_settings", "floater_media_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMediaSettings>);
+ LLFloaterReg::add("marketplace_listings", "floater_marketplace_listings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMarketplaceListings>);
+ LLFloaterReg::add("marketplace_validation", "floater_marketplace_validation.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMarketplaceValidation>);
LLFloaterReg::add("message_critical", "floater_critical.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTOS>);
LLFloaterReg::add("message_tos", "floater_tos.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTOS>);
LLFloaterReg::add("moveview", "floater_moveview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMove>);
@@ -257,7 +273,8 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("mini_map", "floater_map.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMap>);
LLFloaterReg::add("notifications_console", "floater_notifications_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationConsole>);
- LLFloaterReg::add("notification_well_window", "floater_sys_well.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNotificationWellWindow>);
+
+ LLFloaterReg::add("notification_well_window", "floater_notifications_tabbed.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationsTabbed>);
LLFloaterReg::add("object_weights", "floater_object_weights.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterObjectWeights>);
LLFloaterReg::add("openobject", "floater_openobject.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOpenObject>);
@@ -272,8 +289,8 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("perms_default", "floater_perms_default.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPermsDefault>);
LLFloaterReg::add("places", "floater_places.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
+ LLFloaterReg::add("prefs_graphics_advanced", "floater_preferences_graphics_advanced.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreferenceGraphicsAdvanced>);
LLFloaterReg::add("prefs_proxy", "floater_preferences_proxy.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreferenceProxy>);
- LLFloaterReg::add("prefs_hardware_settings", "floater_hardware_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHardwareSettings>);
LLFloaterReg::add("prefs_spellchecker_import", "floater_spellcheck_import.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSpellCheckerImport>);
LLFloaterReg::add("prefs_translation", "floater_translation_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTranslationSettings>);
LLFloaterReg::add("prefs_spellchecker", "floater_spellcheck.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSpellCheckerSettings>);
@@ -290,6 +307,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("preview_texture", "floater_preview_texture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewTexture>, "preview");
LLFloaterReg::add("properties", "floater_inventory_item_properties.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterProperties>);
LLFloaterReg::add("publish_classified", "floater_publish_classified.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPublishClassifiedFloater>);
+ LLFloaterReg::add("save_pref_preset", "floater_save_pref_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSavePrefPreset>);
LLFloaterReg::add("script_colors", "floater_script_ed_prefs.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptEdPrefs>);
LLFloaterReg::add("telehubs", "floater_telehub.xml",&LLFloaterReg::build<LLFloaterTelehub>);
diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp
index 0401de7e69..158cacbc81 100644
--- a/indra/newview/llviewerfoldertype.cpp
+++ b/indra/newview/llviewerfoldertype.cpp
@@ -140,7 +140,11 @@ LLViewerFolderDictionary::LLViewerFolderDictionary()
addEntry(LLFolderType::FT_OUTBOX, new ViewerFolderEntry("Merchant Outbox", "Inv_SysOpen", "Inv_SysClosed", FALSE, boxes_invisible));
addEntry(LLFolderType::FT_BASIC_ROOT, new ViewerFolderEntry("Basic Root", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
-
+
+ addEntry(LLFolderType::FT_MARKETPLACE_LISTINGS, new ViewerFolderEntry("Marketplace Listings", "Inv_SysOpen", "Inv_SysClosed", FALSE, boxes_invisible));
+ addEntry(LLFolderType::FT_MARKETPLACE_STOCK, new ViewerFolderEntry("New Stock", "Inv_StockFolderOpen", "Inv_StockFolderClosed", FALSE, false, "default"));
+ addEntry(LLFolderType::FT_MARKETPLACE_VERSION, new ViewerFolderEntry("New Version", "Inv_VersionFolderOpen","Inv_VersionFolderClosed", FALSE, false, "default"));
+
addEntry(LLFolderType::FT_NONE, new ViewerFolderEntry("New Folder", "Inv_FolderOpen", "Inv_FolderClosed", FALSE, false, "default"));
for (U32 type = (U32)LLFolderType::FT_ENSEMBLE_START; type <= (U32)LLFolderType::FT_ENSEMBLE_END; ++type)
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index d6c8ba10f6..24096e3222 100755
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -808,6 +808,36 @@ bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const
return true;
}
+bool LLViewerInventoryCategory::acceptItem(LLInventoryItem* inv_item)
+{
+ if (!inv_item)
+ {
+ return false;
+ }
+
+ // Only stock folders have limitation on which item they will accept
+ bool accept = true;
+ if (getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK)
+ {
+ // If the item is copyable (i.e. non stock) do not accept the drop in a stock folder
+ if (inv_item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()))
+ {
+ accept = false;
+ }
+ else
+ {
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(getUUID(),cat_array,item_array);
+ // Destination stock folder must be empty OR types of incoming and existing items must be identical and have the same permissions
+ accept = (!item_array->size() ||
+ ((item_array->at(0)->getInventoryType() == inv_item->getInventoryType()) &&
+ (item_array->at(0)->getPermissions().getMaskNextOwner() == inv_item->getPermissions().getMaskNextOwner())));
+ }
+ }
+ return accept;
+}
+
void LLViewerInventoryCategory::determineFolderType()
{
/* Do NOT uncomment this code. This is for future 2.1 support of ensembles.
@@ -2106,7 +2136,7 @@ LLWearableType::EType LLViewerInventoryItem::getWearableType() const
{
return LLWearableType::WT_INVALID;
}
- return LLWearableType::EType(getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK);
+ return LLWearableType::inventoryFlagsToWearableType(getFlags());
}
@@ -2306,5 +2336,3 @@ BOOL LLViewerInventoryItem::regenerateLink()
gInventory.notifyObservers();
return TRUE;
}
-
-
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index ca92565600..4e91e4110a 100755
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -228,6 +228,9 @@ public:
void changeType(LLFolderType::EType new_folder_type);
virtual void unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0);
virtual BOOL unpackMessage(const LLSD& category);
+
+ // returns true if the category object will accept the incoming item
+ bool acceptItem(LLInventoryItem* inv_item);
private:
friend class LLInventoryModel;
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 509227c683..3eae0f8d86 100755
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -196,7 +196,7 @@ private:
// 500 means "Internal Server error" but we decided it's okay to
// accept this and go past it in the MIME type probe
// 302 means the resource can be found temporarily in a different place - added this for join.secondlife.com
- // 499 is a code specifc to join.secondlife.com (?) apparently safe to ignore
+ // 499 is a code specifc to join.secondlife.com apparently safe to ignore
// if( ((status >= 200) && (status < 300)) ||
// ((status >= 400) && (status < 499)) ||
// (status == 500) ||
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 6803adfaa2..1ce42e97b8 100755
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -248,6 +248,7 @@ public:
void setHomeURL(const std::string& home_url, const std::string& mime_type = LLStringUtil::null) { mHomeURL = home_url; mHomeMimeType = mime_type;};
void clearCache();
void setPageZoomFactor( double factor );
+ double getPageZoomFactor() {return mZoomFactor;}
std::string getMimeType() { return mMimeType; }
void scaleMouse(S32 *mouse_x, S32 *mouse_y);
void scaleTextureCoords(const LLVector2& texture_coords, S32 *x, S32 *y);
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 3b0adcf7f4..4a95ff3264 100755
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -57,6 +57,7 @@
#include "llfacebookconnect.h"
#include "llfilepicker.h"
#include "llfirstuse.h"
+#include "llfloaterabout.h"
#include "llfloaterbuy.h"
#include "llfloaterbuycontents.h"
#include "llbuycurrencyhtml.h"
@@ -88,6 +89,7 @@
#include "llinventoryfunctions.h"
#include "llpanellogin.h"
#include "llpanelblockedlist.h"
+#include "llmarketplacefunctions.h"
#include "llmenuoptionpathfindingrebakenavmesh.h"
#include "llmoveview.h"
#include "llparcel.h"
@@ -98,6 +100,7 @@
#include "llspellcheckmenuhandler.h"
#include "llstatusbar.h"
#include "lltextureview.h"
+#include "lltoolbarview.h"
#include "lltoolcomp.h"
#include "lltoolmgr.h"
#include "lltoolpie.h"
@@ -386,6 +389,66 @@ void set_underclothes_menu_options()
}
}
+void set_merchant_SLM_menu()
+{
+ // DD-170 : SLM Alpha and Beta program : for the moment, we always show the SLM menu and
+ // tools so that all merchants can try out the UI, even if not migrated.
+ // *TODO : Keep SLM UI hidden for non migrated merchant in released viewer
+
+ //if (LLMarketplaceData::instance().getSLMStatus() == MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT)
+ //{
+ // Merchant not migrated: show only the old Merchant Outbox menu
+ // gMenuHolder->getChild<LLView>("MerchantOutbox")->setVisible(TRUE);
+ //}
+ //else
+ //{
+ // All other cases (new merchant, not merchant, migrated merchant): show the new Marketplace Listings menu and enable the tool
+ gMenuHolder->getChild<LLView>("MarketplaceListings")->setVisible(TRUE);
+ LLCommand* command = LLCommandManager::instance().getCommand("marketplacelistings");
+ gToolBarView->enableCommand(command->id(), true);
+ //}
+}
+
+void set_merchant_outbox_menu(U32 status, const LLSD& content)
+{
+ // If the merchant is fully migrated, the API is disabled (503) and we won't show the old menu item.
+ // In all other cases, we show it.
+ if (status != MarketplaceErrorCodes::IMPORT_SERVER_API_DISABLED)
+ {
+ gMenuHolder->getChild<LLView>("MerchantOutbox")->setVisible(TRUE);
+ }
+}
+
+void check_merchant_status()
+{
+ if (!gSavedSettings.getBOOL("InventoryOutboxDisplayBoth"))
+ {
+ // Reset the SLM status: we actually want to check again, that's the point of calling check_merchant_status()
+ LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED);
+
+ // Hide SLM related menu item
+ gMenuHolder->getChild<LLView>("MarketplaceListings")->setVisible(FALSE);
+
+ // Also disable the toolbar button for Marketplace Listings
+ LLCommand* command = LLCommandManager::instance().getCommand("marketplacelistings");
+ gToolBarView->enableCommand(command->id(), false);
+
+ // Launch an SLM test connection to get the merchant status
+ LLMarketplaceData::instance().initializeSLM(boost::bind(&set_merchant_SLM_menu));
+
+ // Do the Merchant Outbox init only once per session
+ if (LLMarketplaceInventoryImporter::instance().getMarketPlaceStatus() == MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED)
+ {
+ // Hide merchant outbox related menu item
+ gMenuHolder->getChild<LLView>("MerchantOutbox")->setVisible(FALSE);
+
+ // Launch a Merchant Outbox test connection to get the migration status
+ LLMarketplaceInventoryImporter::instance().setStatusReportCallback(boost::bind(&set_merchant_outbox_menu,_1, _2));
+ LLMarketplaceInventoryImporter::instance().initialize();
+ }
+ }
+}
+
void init_menus()
{
// Initialize actions
@@ -978,10 +1041,6 @@ U32 info_display_from_string(std::string info_display)
{
return LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY;
}
- else if ("shame" == info_display)
- {
- return LLPipeline::RENDER_DEBUG_SHAME;
- }
else if ("texture area" == info_display)
{
return LLPipeline::RENDER_DEBUG_TEXTURE_AREA;
@@ -1010,9 +1069,9 @@ U32 info_display_from_string(std::string info_display)
{
return LLPipeline::RENDER_DEBUG_COMPOSITION;
}
- else if ("attachment bytes" == info_display)
+ else if ("avatardrawinfo" == info_display)
{
- return LLPipeline::RENDER_DEBUG_ATTACHMENT_BYTES;
+ return (LLPipeline::RENDER_DEBUG_AVATAR_DRAW_INFO);
}
else if ("glow" == info_display)
{
@@ -1048,6 +1107,7 @@ U32 info_display_from_string(std::string info_display)
}
else
{
+ LL_WARNS() << "unrecognized feature name '" << info_display << "'" << LL_ENDL;
return 0;
}
};
@@ -2077,6 +2137,22 @@ class LLAdvancedCheckShowObjectUpdates : public view_listener_t
+///////////////////////
+// CHECK FOR UPDATES //
+///////////////////////
+
+
+
+class LLAdvancedCheckViewerUpdates : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLFloaterAboutUtil::checkUpdatesAndNotify();
+ return true;
+ }
+};
+
+
////////////////////
// COMPRESS IMAGE //
////////////////////
@@ -2695,6 +2771,7 @@ void handle_object_edit()
if (gAgentCamera.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit())
{
+ LLFloaterTools::sPreviousFocusOnAvatar = true;
LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
if (selection->getSelectType() == SELECT_TYPE_HUD || !gSavedSettings.getBOOL("EditCameraMovement"))
@@ -2834,6 +2911,8 @@ BOOL enable_object_build(void*)
bool enable_object_edit()
{
+ if (!isAgentAvatarValid()) return false;
+
// *HACK: The new "prelude" Help Islands have a build sandbox area,
// so users need the Edit and Create pie menu options when they are
// there. Eventually this needs to be replaced with code that only
@@ -2994,11 +3073,11 @@ class LLAvatarCheckImpostorMode : public view_listener_t
switch (mode)
{
case 0:
- return (avatar->getVisualMuteSettings() == LLVOAvatar::VISUAL_MUTE_NOT_SET);
+ return (avatar->getVisualMuteSettings() == LLVOAvatar::AV_RENDER_NORMALLY);
case 1:
- return (avatar->getVisualMuteSettings() == LLVOAvatar::ALWAYS_VISUAL_MUTE);
+ return (avatar->getVisualMuteSettings() == LLVOAvatar::AV_DO_NOT_RENDER);
case 2:
- return (avatar->getVisualMuteSettings() == LLVOAvatar::NEVER_VISUAL_MUTE);
+ return (avatar->getVisualMuteSettings() == LLVOAvatar::AV_ALWAYS_RENDER);
default:
return false;
}
@@ -3020,19 +3099,18 @@ class LLAvatarSetImpostorMode : public view_listener_t
switch (mode)
{
case 0:
- avatar->setVisualMuteSettings(LLVOAvatar::VISUAL_MUTE_NOT_SET);
+ avatar->setVisualMuteSettings(LLVOAvatar::AV_RENDER_NORMALLY);
break;
case 1:
- avatar->setVisualMuteSettings(LLVOAvatar::ALWAYS_VISUAL_MUTE);
+ avatar->setVisualMuteSettings(LLVOAvatar::AV_DO_NOT_RENDER);
break;
case 2:
- avatar->setVisualMuteSettings(LLVOAvatar::NEVER_VISUAL_MUTE);
+ avatar->setVisualMuteSettings(LLVOAvatar::AV_ALWAYS_RENDER);
break;
default:
return false;
}
- avatar->forceUpdateVisualMuteSettings();
LLVOAvatar::cullAvatarsByPixelArea();
return true;
} // handleEvent()
@@ -6632,7 +6710,7 @@ class LLAttachmentDetachFromPoint : public view_listener_t
LLViewerObject *attached_object = (*iter);
ids_to_remove.push_back(attached_object->getAttachmentItemID());
}
- }
+ }
if (!ids_to_remove.empty())
{
LLAppearanceMgr::instance().removeItemsFromAvatar(ids_to_remove);
@@ -7077,11 +7155,10 @@ void handle_selected_texture_info(void*)
{
msg.append( llformat("%d ", (S32)(it->second[i])));
}
-
- LLSD args;
- args["MESSAGE"] = msg;
- LLNotificationsUtil::add("SystemMessage", args);
}
+ LLSD args;
+ args["MESSAGE"] = msg;
+ LLNotificationsUtil::add("SystemMessage", args);
}
}
@@ -8857,6 +8934,7 @@ void initialize_menus()
// Advanced (toplevel)
view_listener_t::addMenu(new LLAdvancedToggleShowObjectUpdates(), "Advanced.ToggleShowObjectUpdates");
view_listener_t::addMenu(new LLAdvancedCheckShowObjectUpdates(), "Advanced.CheckShowObjectUpdates");
+ view_listener_t::addMenu(new LLAdvancedCheckViewerUpdates(), "Advanced.CheckViewerUpdates");
view_listener_t::addMenu(new LLAdvancedCompressImage(), "Advanced.CompressImage");
view_listener_t::addMenu(new LLAdvancedShowDebugSettings(), "Advanced.ShowDebugSettings");
view_listener_t::addMenu(new LLAdvancedEnableViewAdminOptions(), "Advanced.EnableViewAdminOptions");
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index 7f09fc2d8f..b7bdf00157 100755
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -83,6 +83,7 @@ BOOL enable_god_full(void* user_data);
BOOL enable_god_liaison(void* user_data);
BOOL enable_god_basic(void* user_data);
void set_underclothes_menu_options();
+void check_merchant_status();
void exchange_callingcard(const LLUUID& dest_id);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 5cd92c9920..6ba10373b9 100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -57,6 +57,7 @@
#include "llcallingcard.h"
#include "llbuycurrencyhtml.h"
#include "llfirstuse.h"
+#include "llfloaterbump.h"
#include "llfloaterbuyland.h"
#include "llfloaterland.h"
#include "llfloaterregioninfo.h"
@@ -71,6 +72,7 @@
#include "llinventoryobserver.h"
#include "llinventorypanel.h"
#include "llfloaterimnearbychat.h"
+#include "llmarketplacefunctions.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "llpanelgrouplandmoney.h"
@@ -117,6 +119,7 @@
#include <boost/regex.hpp>
#include "llnotificationmanager.h" //
+#include "llexperiencecache.h"
#if LL_MSVC
// disable boost::lexical_cast warning
@@ -142,6 +145,7 @@ extern bool gShiftFrame;
bool check_offer_throttle(const std::string& from_name, bool check_only);
bool check_asset_previewable(const LLAssetType::EType asset_type);
static void process_money_balance_reply_extended(LLMessageSystem* msg);
+bool handle_trusted_experiences_notification(const LLSD&);
//inventory offer throttle globals
LLFrameTimer gThrottleTimer;
@@ -2346,7 +2350,8 @@ static void god_message_name_cb(const LLAvatarName& av_name, LLChat chat, std::s
LLNotificationsUtil::add("GodMessage", args);
// Treat like a system message and put in chat history.
- chat.mText = av_name.getCompleteName() + ": " + message;
+ chat.mSourceType = CHAT_SOURCE_SYSTEM;
+ chat.mText = message;
LLFloaterIMNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat");
if (nearby_chat)
@@ -2678,6 +2683,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
payload["sender_name"] = name;
payload["group_id"] = group_id;
payload["inventory_name"] = item_name;
+ payload["received_time"] = LLDate::now();
if(info && info->asLLSD())
{
payload["inventory_offer"] = info->asLLSD();
@@ -2704,6 +2710,13 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
break;
case IM_GROUP_INVITATION:
{
+ if (!is_muted)
+ {
+ // group is not blocked, but we still need to check agent that sent the invitation
+ // and we have no agent's id
+ // Note: server sends username "first.last".
+ is_muted |= LLMuteList::getInstance()->isMuted(name);
+ }
if (is_do_not_disturb || is_muted)
{
send_do_not_disturb_message(msg, from_id);
@@ -2850,6 +2863,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
case IM_FROM_TASK:
{
+
if (is_do_not_disturb && !is_owned_by_me)
{
return;
@@ -2933,17 +2947,13 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
payload["from_id"] = from_id;
payload["slurl"] = location;
payload["name"] = name;
- std::string session_name;
+
if (from_group)
{
payload["group_owned"] = "true";
}
- LLNotification::Params params("ServerObjectMessage");
- params.substitutions = substitutions;
- params.payload = payload;
-
- LLPostponedNotification::add<LLPostponedServerObjectNotification>(params, from_id, from_group);
+ LLNotificationsUtil::add("ServerObjectMessage", substitutions, payload);
}
break;
@@ -3598,6 +3608,11 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
is_linden = chat.mSourceType != CHAT_SOURCE_OBJECT &&
LLMuteList::getInstance()->isLinden(from_name);
+ if (is_muted && (chat.mSourceType == CHAT_SOURCE_OBJECT))
+ {
+ return;
+ }
+
BOOL is_audible = (CHAT_AUDIBLE_FULLY == chat.mAudible);
chatter = gObjectList.findObject(from_id);
if (chatter)
@@ -3774,11 +3789,15 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
}
}
- LLSD msg_notify = LLSD(LLSD::emptyMap());
- msg_notify["session_id"] = LLUUID();
- msg_notify["from_id"] = chat.mFromID;
- msg_notify["source_type"] = chat.mSourceType;
- on_new_message(msg_notify);
+ if (mesg != "")
+ {
+ LLSD msg_notify = LLSD(LLSD::emptyMap());
+ msg_notify["session_id"] = LLUUID();
+ msg_notify["from_id"] = chat.mFromID;
+ msg_notify["source_type"] = chat.mSourceType;
+ on_new_message(msg_notify);
+ }
+
}
}
@@ -5620,6 +5639,7 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
}
}
final_args["MESSAGE"] = message;
+ payload["dest_id"] = dest_id;
notification = success ? "PaymentSent" : "PaymentFailure";
}
else {
@@ -5694,164 +5714,192 @@ bool handle_prompt_for_maturity_level_change_and_reteleport_callback(const LLSD&
// some of the server notifications need special handling. This is where we do that.
bool handle_special_notification(std::string notificationID, LLSD& llsdBlock)
{
- U8 regionAccess = static_cast<U8>(llsdBlock["_region_access"].asInteger());
- std::string regionMaturity = LLViewerRegion::accessToString(regionAccess);
- LLStringUtil::toLower(regionMaturity);
- llsdBlock["REGIONMATURITY"] = regionMaturity;
bool returnValue = false;
- LLNotificationPtr maturityLevelNotification;
- std::string notifySuffix = "_Notify";
- if (regionAccess == SIM_ACCESS_MATURE)
- {
- if (gAgent.isTeen())
+ if(llsdBlock.has("_region_access"))
+ {
+ U8 regionAccess = static_cast<U8>(llsdBlock["_region_access"].asInteger());
+ std::string regionMaturity = LLViewerRegion::accessToString(regionAccess);
+ LLStringUtil::toLower(regionMaturity);
+ llsdBlock["REGIONMATURITY"] = regionMaturity;
+ LLNotificationPtr maturityLevelNotification;
+ std::string notifySuffix = "_Notify";
+ if (regionAccess == SIM_ACCESS_MATURE)
{
- gAgent.clearTeleportRequest();
- maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
- returnValue = true;
+ if (gAgent.isTeen())
+ {
+ gAgent.clearTeleportRequest();
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
+ returnValue = true;
- notifySuffix = "_NotifyAdultsOnly";
+ notifySuffix = "_NotifyAdultsOnly";
+ }
+ else if (gAgent.prefersPG())
+ {
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
+ returnValue = true;
+ }
+ else if (LLStringUtil::compareStrings(notificationID, "RegionEntryAccessBlocked") == 0)
+ {
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock);
+ returnValue = true;
+ }
}
- else if (gAgent.prefersPG())
+ else if (regionAccess == SIM_ACCESS_ADULT)
{
- maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
- returnValue = true;
+ if (!gAgent.isAdult())
+ {
+ gAgent.clearTeleportRequest();
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
+ returnValue = true;
+
+ notifySuffix = "_NotifyAdultsOnly";
+ }
+ else if (gAgent.prefersPG() || gAgent.prefersMature())
+ {
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
+ returnValue = true;
+ }
+ else if (LLStringUtil::compareStrings(notificationID, "RegionEntryAccessBlocked") == 0)
+ {
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock);
+ returnValue = true;
+ }
}
- else if (LLStringUtil::compareStrings(notificationID, "RegionEntryAccessBlocked") == 0)
+
+ if ((maturityLevelNotification == NULL) || maturityLevelNotification->isIgnored())
{
- maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock);
- returnValue = true;
+ // Given a simple notification if no maturityLevelNotification is set or it is ignore
+ LLNotificationsUtil::add(notificationID + notifySuffix, llsdBlock);
}
}
- else if (regionAccess == SIM_ACCESS_ADULT)
+
+ return returnValue;
+}
+
+bool handle_trusted_experiences_notification(const LLSD& llsdBlock)
+{
+ if(llsdBlock.has("trusted_experiences"))
{
- if (!gAgent.isAdult())
- {
- gAgent.clearTeleportRequest();
- maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
- returnValue = true;
-
- notifySuffix = "_NotifyAdultsOnly";
- }
- else if (gAgent.prefersPG() || gAgent.prefersMature())
+ std::ostringstream str;
+ const LLSD& experiences = llsdBlock["trusted_experiences"];
+ LLSD::array_const_iterator it = experiences.beginArray();
+ for(/**/; it != experiences.endArray(); ++it)
{
- maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
- returnValue = true;
+ str<<LLSLURL("experience", it->asUUID(), "profile").getSLURLString() << "\n";
}
- else if (LLStringUtil::compareStrings(notificationID, "RegionEntryAccessBlocked") == 0)
+ std::string str_list = str.str();
+ if(!str_list.empty())
{
- maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock);
- returnValue = true;
+ LLNotificationsUtil::add("TrustedExperiencesAvailable", LLSD::emptyMap().with("EXPERIENCE_LIST", (LLSD)str_list));
+ return true;
}
}
-
- if ((maturityLevelNotification == NULL) || maturityLevelNotification->isIgnored())
- {
- // Given a simple notification if no maturityLevelNotification is set or it is ignore
- LLNotificationsUtil::add(notificationID + notifySuffix, llsdBlock);
- }
-
- return returnValue;
+ return false;
}
// some of the server notifications need special handling. This is where we do that.
bool handle_teleport_access_blocked(LLSD& llsdBlock, const std::string & notificationID, const std::string & defaultMessage)
{
- U8 regionAccess = static_cast<U8>(llsdBlock["_region_access"].asInteger());
- std::string regionMaturity = LLViewerRegion::accessToString(regionAccess);
- LLStringUtil::toLower(regionMaturity);
- llsdBlock["REGIONMATURITY"] = regionMaturity;
-
bool returnValue = false;
- LLNotificationPtr tp_failure_notification;
- std::string notifySuffix;
-
- if (notificationID == std::string("TeleportEntryAccessBlocked"))
+ if(llsdBlock.has("_region_access"))
{
- notifySuffix = "_Notify";
- if (regionAccess == SIM_ACCESS_MATURE)
- {
- if (gAgent.isTeen())
- {
- gAgent.clearTeleportRequest();
- tp_failure_notification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
- returnValue = true;
+ U8 regionAccess = static_cast<U8>(llsdBlock["_region_access"].asInteger());
+ std::string regionMaturity = LLViewerRegion::accessToString(regionAccess);
+ LLStringUtil::toLower(regionMaturity);
+ llsdBlock["REGIONMATURITY"] = regionMaturity;
- notifySuffix = "_NotifyAdultsOnly";
- }
- else if (gAgent.prefersPG())
+ LLNotificationPtr tp_failure_notification;
+ std::string notifySuffix;
+
+ if (notificationID == std::string("TeleportEntryAccessBlocked"))
+ {
+ notifySuffix = "_Notify";
+ if (regionAccess == SIM_ACCESS_MATURE)
{
- if (gAgent.hasRestartableFailedTeleportRequest())
+ if (gAgent.isTeen())
{
- tp_failure_notification = LLNotificationsUtil::add(notificationID+"_ChangeAndReTeleport", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_and_reteleport_callback);
+ gAgent.clearTeleportRequest();
+ tp_failure_notification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
returnValue = true;
+
+ notifySuffix = "_NotifyAdultsOnly";
+ }
+ else if (gAgent.prefersPG())
+ {
+ if (gAgent.hasRestartableFailedTeleportRequest())
+ {
+ tp_failure_notification = LLNotificationsUtil::add(notificationID+"_ChangeAndReTeleport", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_and_reteleport_callback);
+ returnValue = true;
+ }
+ else
+ {
+ gAgent.clearTeleportRequest();
+ tp_failure_notification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
+ returnValue = true;
+ }
}
else
{
gAgent.clearTeleportRequest();
- tp_failure_notification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
+ tp_failure_notification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
returnValue = true;
}
}
- else
- {
- gAgent.clearTeleportRequest();
- tp_failure_notification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
- returnValue = true;
- }
- }
- else if (regionAccess == SIM_ACCESS_ADULT)
- {
- if (!gAgent.isAdult())
- {
- gAgent.clearTeleportRequest();
- tp_failure_notification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
- returnValue = true;
-
- notifySuffix = "_NotifyAdultsOnly";
- }
- else if (gAgent.prefersPG() || gAgent.prefersMature())
+ else if (regionAccess == SIM_ACCESS_ADULT)
{
- if (gAgent.hasRestartableFailedTeleportRequest())
+ if (!gAgent.isAdult())
{
- tp_failure_notification = LLNotificationsUtil::add(notificationID+"_ChangeAndReTeleport", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_and_reteleport_callback);
+ gAgent.clearTeleportRequest();
+ tp_failure_notification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
returnValue = true;
+
+ notifySuffix = "_NotifyAdultsOnly";
+ }
+ else if (gAgent.prefersPG() || gAgent.prefersMature())
+ {
+ if (gAgent.hasRestartableFailedTeleportRequest())
+ {
+ tp_failure_notification = LLNotificationsUtil::add(notificationID+"_ChangeAndReTeleport", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_and_reteleport_callback);
+ returnValue = true;
+ }
+ else
+ {
+ gAgent.clearTeleportRequest();
+ tp_failure_notification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
+ returnValue = true;
+ }
}
else
{
gAgent.clearTeleportRequest();
- tp_failure_notification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
+ tp_failure_notification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
returnValue = true;
}
}
+ } // End of special handling for "TeleportEntryAccessBlocked"
+ else
+ { // Normal case, no message munging
+ gAgent.clearTeleportRequest();
+ if (LLNotifications::getInstance()->templateExists(notificationID))
+ {
+ tp_failure_notification = LLNotificationsUtil::add(notificationID, llsdBlock, llsdBlock);
+ }
else
{
- gAgent.clearTeleportRequest();
- tp_failure_notification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
- returnValue = true;
+ llsdBlock["MESSAGE"] = defaultMessage;
+ tp_failure_notification = LLNotificationsUtil::add("GenericAlertOK", llsdBlock);
}
- }
- } // End of special handling for "TeleportEntryAccessBlocked"
- else
- { // Normal case, no message munging
- gAgent.clearTeleportRequest();
- if (LLNotifications::getInstance()->templateExists(notificationID))
- {
- tp_failure_notification = LLNotificationsUtil::add(notificationID, llsdBlock, llsdBlock);
+ returnValue = true;
}
- else
+
+ if ((tp_failure_notification == NULL) || tp_failure_notification->isIgnored())
{
- llsdBlock["MESSAGE"] = defaultMessage;
- tp_failure_notification = LLNotificationsUtil::add("GenericAlertOK", llsdBlock);
+ // Given a simple notification if no tp_failure_notification is set or it is ignore
+ LLNotificationsUtil::add(notificationID + notifySuffix, llsdBlock);
}
- returnValue = true;
- }
-
- if ((tp_failure_notification == NULL) || tp_failure_notification->isIgnored())
- {
- // Given a simple notification if no tp_failure_notification is set or it is ignore
- LLNotificationsUtil::add(notificationID + notifySuffix, llsdBlock);
}
+ handle_trusted_experiences_notification(llsdBlock);
return returnValue;
}
@@ -5880,6 +5928,9 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
LL_WARNS() << "attempt_standard_notification: Attempted to read notification parameter data into LLSD but failed:" << llsdRaw << LL_ENDL;
}
}
+
+
+ handle_trusted_experiences_notification(llsdBlock);
if (
(notificationID == "RegionEntryAccessBlocked") ||
@@ -5961,7 +6012,25 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
make_ui_sound("UISndRestart");
}
-
+
+ // Special Marketplace update notification
+ if (notificationID == "SLM_UPDATE_FOLDER")
+ {
+ std::string state = llsdBlock["state"].asString();
+ if (state == "deleted")
+ {
+ // Perform the deletion viewer side, no alert shown in this case
+ LLMarketplaceData::instance().deleteListing(llsdBlock["listing_id"].asInteger());
+ return true;
+ }
+ else
+ {
+ // In general, no message will be displayed, all we want is to get the listing updated in the marketplace floater
+ // If getListing() fails though, the message of the alert will be shown by the caller of attempt_standard_notification()
+ return LLMarketplaceData::instance().getListing(llsdBlock["listing_id"].asInteger());
+ }
+ }
+
LLNotificationsUtil::add(notificationID, llsdBlock);
return true;
}
@@ -6064,8 +6133,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)
{
@@ -6087,10 +6156,10 @@ void process_alert_core(const std::string& message, BOOL modal)
LLFloaterRegionRestarting::close();
}
- std::string new_msg =LLNotifications::instance().getGlobalString(text);
- args["MESSAGE"] = new_msg;
- LLNotificationsUtil::add("SystemMessage", args);
- }
+ std::string new_msg =LLNotifications::instance().getGlobalString(text);
+ args["MESSAGE"] = new_msg;
+ LLNotificationsUtil::add("SystemMessage", args);
+ }
else if (modal)
{
LLSD args;
@@ -6199,6 +6268,11 @@ void process_mean_collision_alert_message(LLMessageSystem *msgsystem, void **use
gCacheName->get(perp, false, boost::bind(&mean_name_callback, _1, _2, _3));
}
}
+ LLFloaterBump* bumps_floater = LLFloaterBump::getInstance();
+ if(bumps_floater && bumps_floater->isInVisibleChain())
+ {
+ bumps_floater->populateCollisionList();
+ }
}
void process_frozen_message(LLMessageSystem *msgsystem, void **user_data)
@@ -6345,6 +6419,12 @@ bool script_question_cb(const LLSD& notification, const LLSD& response)
return false;
}
+ LLUUID experience;
+ if(notification["payload"].has("experience"))
+ {
+ experience = notification["payload"]["experience"].asUUID();
+ }
+
// check whether permissions were granted or denied
BOOL allowed = TRUE;
// the "yes/accept" button is the first button in the template, making it button 0
@@ -6354,6 +6434,16 @@ bool script_question_cb(const LLSD& notification, const LLSD& response)
new_questions = 0;
allowed = FALSE;
}
+ else if(experience.notNull())
+ {
+ LLSD permission;
+ LLSD data;
+ permission["permission"]="Allow";
+
+ data[experience.asString()]=permission;
+ data["experience"]=experience;
+ LLEventPumps::instance().obtain("experience_permission").post(data);
+ }
LLUUID task_id = notification["payload"]["task_id"].asUUID();
LLUUID item_id = notification["payload"]["item_id"].asUUID();
@@ -6380,7 +6470,27 @@ bool script_question_cb(const LLSD& notification, const LLSD& response)
{
script_question_mute(task_id,notification["payload"]["object_name"].asString());
}
+ if ( response["BlockExperience"] )
+ {
+ if(experience.notNull())
+ {
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region)
+ return false;
+ std::string lookup_url=region->getCapability("ExperiencePreferences");
+ if(lookup_url.empty())
+ return false;
+ LLSD permission;
+ LLSD data;
+ permission["permission"]="Block";
+
+ data[experience.asString()]=permission;
+ LLHTTPClient::put(lookup_url, data, NULL);
+ data["experience"]=experience;
+ LLEventPumps::instance().obtain("experience_permission").post(data);
+ }
+}
return false;
}
@@ -6413,8 +6523,24 @@ void script_question_mute(const LLUUID& task_id, const std::string& object_name)
static LLNotificationFunctorRegistration script_question_cb_reg_1("ScriptQuestion", script_question_cb);
static LLNotificationFunctorRegistration script_question_cb_reg_2("ScriptQuestionCaution", script_question_cb);
+static LLNotificationFunctorRegistration script_question_cb_reg_3("ScriptQuestionExperience", script_question_cb);
static LLNotificationFunctorRegistration unknown_script_question_cb_reg("UnknownScriptQuestion", unknown_script_question_cb);
+void process_script_experience_details(const LLSD& experience_details, LLSD args, LLSD payload)
+{
+ if(experience_details[LLExperienceCache::PROPERTIES].asInteger() & LLExperienceCache::PROPERTY_GRID)
+ {
+ args["GRID_WIDE"] = LLTrans::getString("Grid-Scope");
+ }
+ else
+ {
+ args["GRID_WIDE"] = LLTrans::getString("Land-Scope");
+ }
+ args["EXPERIENCE"] = LLSLURL("experience", experience_details[LLExperienceCache::EXPERIENCE_ID].asUUID(), "profile").getSLURLString();
+
+ LLNotificationsUtil::add("ScriptQuestionExperience", args, payload);
+}
+
void process_script_question(LLMessageSystem *msg, void **user_data)
{
// *TODO: Translate owner name -> [FIRST] [LAST]
@@ -6426,6 +6552,7 @@ void process_script_question(LLMessageSystem *msg, void **user_data)
S32 questions;
std::string object_name;
std::string owner_name;
+ LLUUID experienceid;
// taskid -> object key of object requesting permissions
msg->getUUIDFast(_PREHASH_Data, _PREHASH_TaskID, taskid );
@@ -6435,6 +6562,11 @@ void process_script_question(LLMessageSystem *msg, void **user_data)
msg->getStringFast(_PREHASH_Data, _PREHASH_ObjectOwner, owner_name);
msg->getS32Fast(_PREHASH_Data, _PREHASH_Questions, questions );
+ if(msg->has(_PREHASH_Experience))
+ {
+ msg->getUUIDFast(_PREHASH_Experience, _PREHASH_ExperienceID, experienceid);
+ }
+
// Special case. If the objects are owned by this agent, throttle per-object instead
// of per-owner. It's common for residents to reset a ton of scripts that re-request
// permissions, as with tier boxes. UUIDs can't be valid agent names and vice-versa,
@@ -6521,20 +6653,21 @@ void process_script_question(LLMessageSystem *msg, void **user_data)
payload["owner_name"] = owner_name;
// check whether cautions are even enabled or not
- if (gSavedSettings.getBOOL("PermissionsCautionEnabled"))
+ const char* notification = "ScriptQuestion";
+
+ if(caution && gSavedSettings.getBOOL("PermissionsCautionEnabled"))
{
- if (caution)
- {
- args["FOOTERTEXT"] = (count > 1) ? LLTrans::getString("AdditionalPermissionsRequestHeader") + "\n\n" + script_question : "";
- }
- // display the caution permissions prompt
- LLNotificationsUtil::add(caution ? "ScriptQuestionCaution" : "ScriptQuestion", args, payload);
+ args["FOOTERTEXT"] = (count > 1) ? LLTrans::getString("AdditionalPermissionsRequestHeader") + "\n\n" + script_question : "";
+ notification = "ScriptQuestionCaution";
}
- else
+ else if(experienceid.notNull())
{
- // fall back to default behavior if cautions are entirely disabled
- LLNotificationsUtil::add("ScriptQuestion", args, payload);
+ payload["experience"]=experienceid;
+ LLExperienceCache::get(experienceid, boost::bind(process_script_experience_details, _1, args, payload));
+ return;
}
+
+ LLNotificationsUtil::add(notification, args, payload);
}
}
}
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index faa58d423f..6666aecca2 100755
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -119,14 +119,14 @@ void LLGridManager::initialize(const std::string& grid_file)
mGridFile = grid_file;
// as we don't want an attacker to override our grid list
// to point the default grid to an invalid grid
- addSystemGrid("Second Life Main Grid (Agni)",
+ addSystemGrid(LLTrans::getString("AgniGridLabel"),
MAINGRID,
MAIN_GRID_LOGIN_URI,
"https://secondlife.com/helpers/",
DEFAULT_LOGIN_PAGE,
SL_UPDATE_QUERY_URL,
"Agni");
- addSystemGrid("Second Life Beta Test Grid (Aditi)",
+ addSystemGrid(LLTrans::getString("AditiGridLabel"),
"util.aditi.lindenlab.com",
"https://login.aditi.lindenlab.com/cgi-bin/login.cgi",
"http://aditi-secondlife.webdev.lindenlab.com/helpers/",
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index a2c0a91ea6..ae747207b7 100755
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -1958,6 +1958,11 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
if (sent_parentp && (sent_parentp != this) && !sent_parentp->isDead())
{
+ if (((LLViewerObject*)sent_parentp)->isAvatar())
+ {
+ //LL_DEBUGS("Avatar") << "ATT got object update for attachment " << LL_ENDL;
+ }
+
//
// We have a viewer object for the parent, and it's not dead.
// Do the actual reparenting here.
@@ -2880,6 +2885,9 @@ struct LLFilenameAndTask
{
LLUUID mTaskID;
std::string mFilename;
+
+ // for sequencing in case of multiple updates
+ S16 mSerial;
#ifdef _DEBUG
static S32 sCount;
LLFilenameAndTask()
@@ -2915,9 +2923,17 @@ void LLViewerObject::processTaskInv(LLMessageSystem* msg, void** user_data)
return;
}
- msg->getS16Fast(_PREHASH_InventoryData, _PREHASH_Serial, object->mInventorySerialNum);
LLFilenameAndTask* ft = new LLFilenameAndTask;
ft->mTaskID = task_id;
+ // we can receive multiple task updates simultaneously, make sure we will not rewrite newer with older update
+ msg->getS16Fast(_PREHASH_InventoryData, _PREHASH_Serial, ft->mSerial);
+
+ if (ft->mSerial < object->mInventorySerialNum)
+ {
+ // viewer did some changes to inventory that were not saved yet.
+ LL_DEBUGS() << "Task inventory serial might be out of sync, server serial: " << ft->mSerial << " client serial: " << object->mInventorySerialNum << LL_ENDL;
+ object->mInventorySerialNum = ft->mSerial;
+ }
std::string unclean_filename;
msg->getStringFast(_PREHASH_InventoryData, _PREHASH_Filename, unclean_filename);
@@ -2957,9 +2973,13 @@ void LLViewerObject::processTaskInvFile(void** user_data, S32 error_code, LLExtS
{
LLFilenameAndTask* ft = (LLFilenameAndTask*)user_data;
LLViewerObject* object = NULL;
- if(ft && (0 == error_code) &&
- (object = gObjectList.findObject(ft->mTaskID)))
+
+ if (ft
+ && (0 == error_code)
+ && (object = gObjectList.findObject(ft->mTaskID))
+ && ft->mSerial >= object->mInventorySerialNum)
{
+ object->mInventorySerialNum = ft->mSerial;
if (object->loadTaskInvFile(ft->mFilename))
{
@@ -2990,7 +3010,7 @@ void LLViewerObject::processTaskInvFile(void** user_data, S32 error_code, LLExtS
}
else
{
- // This Occurs When to requests were made, and the first one
+ // This Occurs When two requests were made, and the first one
// has already handled it.
LL_DEBUGS() << "Problem loading task inventory. Return code: "
<< error_code << LL_ENDL;
@@ -4632,7 +4652,7 @@ S32 LLViewerObject::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID
return retval;
}
-S32 LLViewerObject::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams)
+S32 LLViewerObject::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams, bool isInitFromServer)
{
S32 retval = 0;
const LLTextureEntry *tep = getTE(te);
@@ -4642,13 +4662,14 @@ S32 LLViewerObject::setTEMaterialParams(const U8 te, const LLMaterialPtr pMateri
return 0;
}
- retval = LLPrimitive::setTEMaterialParams(te, pMaterialParams);
+ setTENormalMap(te, (pMaterialParams) ? pMaterialParams->getNormalID() : LLUUID::null);
+ setTESpecularMap(te, (pMaterialParams) ? pMaterialParams->getSpecularID() : LLUUID::null);
+
+ retval = LLPrimitive::setTEMaterialParams(te, pMaterialParams, isInitFromServer);
LL_DEBUGS("Material") << "Changing material params for te " << (S32)te
<< ", object " << mID
<< " (" << retval << ")"
<< LL_ENDL;
- setTENormalMap(te, (pMaterialParams) ? pMaterialParams->getNormalID() : LLUUID::null);
- setTESpecularMap(te, (pMaterialParams) ? pMaterialParams->getSpecularID() : LLUUID::null);
refreshMaterials();
return retval;
@@ -4942,12 +4963,7 @@ void LLViewerObject::setDebugText(const std::string &utf8text)
if (!mText)
{
- mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT);
- mText->setFont(LLFontGL::getFontSansSerif());
- mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP);
- mText->setMaxLines(-1);
- mText->setSourceObject(this);
- mText->setOnHUDAttachment(isHUDAttachment());
+ initDebugTextHud();
}
mText->setColor(LLColor4::white);
mText->setString(utf8text);
@@ -4956,6 +4972,16 @@ void LLViewerObject::setDebugText(const std::string &utf8text)
updateText();
}
+void LLViewerObject::initDebugTextHud()
+{
+ mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT);
+ mText->setFont(LLFontGL::getFontSansSerif());
+ mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP);
+ mText->setMaxLines(-1);
+ mText->setSourceObject(this);
+ mText->setOnHUDAttachment(isHUDAttachment());
+}
+
void LLViewerObject::setIcon(LLViewerTexture* icon_image)
{
if (!mIcon)
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 05c87c153b..a46bbc7a57 100755
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -330,7 +330,7 @@ public:
/*virtual*/ S32 setTEMediaFlags(const U8 te, const U8 media_flags );
/*virtual*/ S32 setTEGlow(const U8 te, const F32 glow);
/*virtual*/ S32 setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID);
- /*virtual*/ S32 setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams);
+ /*virtual*/ S32 setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams, bool isInitFromServer);
// Used by Materials update functions to properly kick off rebuilds
// of VBs etc when materials updates require changes.
@@ -402,6 +402,7 @@ public:
void setCanSelect(BOOL canSelect);
+ void initDebugTextHud();
void setDebugText(const std::string &utf8text);
void setIcon(LLViewerTexture* icon_image);
void clearIcon();
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 7c36b30dd1..75732a1e19 100755
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -474,13 +474,13 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
{
U32 flags = 0;
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_UpdateFlags, flags, i);
-
+
if(flags & FLAGS_TEMPORARY_ON_REZ)
{
- compressed_dp.unpackUUID(fullid, "ID");
- compressed_dp.unpackU32(local_id, "LocalID");
- compressed_dp.unpackU8(pcode, "PCode");
- }
+ compressed_dp.unpackUUID(fullid, "ID");
+ compressed_dp.unpackU32(local_id, "LocalID");
+ compressed_dp.unpackU8(pcode, "PCode");
+ }
else //send to object cache
{
regionp->cacheFullUpdate(compressed_dp, flags);
@@ -497,7 +497,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
gMessageSystem->getSenderPort());
if (fullid.isNull())
{
- // LL_WARNS() << "update for unknown localid " << local_id << " host " << gMessageSystem->getSender() << ":" << gMessageSystem->getSenderPort() << LL_ENDL;
+ LL_DEBUGS() << "update for unknown localid " << local_id << " host " << gMessageSystem->getSender() << ":" << gMessageSystem->getSenderPort() << LL_ENDL;
mNumUnknownUpdates++;
}
}
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index d9d4c34fb0..2a6b105cab 100755
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -205,8 +205,8 @@ void LLViewerParcelMgr::dump()
mCurrentParcel->dump();
LL_INFOS() << "banning " << mCurrentParcel->mBanList.size() << LL_ENDL;
- access_map_const_iterator cit = mCurrentParcel->mBanList.begin();
- access_map_const_iterator end = mCurrentParcel->mBanList.end();
+ LLAccessEntry::map::const_iterator cit = mCurrentParcel->mBanList.begin();
+ LLAccessEntry::map::const_iterator end = mCurrentParcel->mBanList.end();
for ( ; cit != end; ++cit)
{
LL_INFOS() << "ban id " << (*cit).first << LL_ENDL;
@@ -892,7 +892,7 @@ void LLViewerParcelMgr::sendParcelAccessListRequest(U32 flags)
if (!region) return;
LLMessageSystem *msg = gMessageSystem;
-
+
if (flags & AL_BAN)
{
@@ -902,6 +902,14 @@ void LLViewerParcelMgr::sendParcelAccessListRequest(U32 flags)
{
mCurrentParcel->mAccessList.clear();
}
+ if (flags & AL_ALLOW_EXPERIENCE)
+ {
+ mCurrentParcel->clearExperienceKeysByType(EXPERIENCE_KEY_TYPE_ALLOWED);
+ }
+ if (flags & AL_BLOCK_EXPERIENCE)
+ {
+ mCurrentParcel->clearExperienceKeysByType(EXPERIENCE_KEY_TYPE_BLOCKED);
+ }
// Only the headers differ
msg->newMessageFast(_PREHASH_ParcelAccessListRequest);
@@ -1594,8 +1602,14 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
}
else if (local_id == parcel_mgr.mAgentParcel->getLocalID())
{
- // updated agent parcel
- parcel_mgr.mAgentParcel->unpackMessage(msg);
+ // Parcels in different regions can have same ids.
+ LLViewerRegion* parcel_region = LLWorld::getInstance()->getRegion( msg->getSender() );
+ LLViewerRegion* agent_region = gAgent.getRegion();
+ if (parcel_region && agent_region && parcel_region->getRegionID() == agent_region->getRegionID())
+ {
+ // updated agent parcel
+ parcel_mgr.mAgentParcel->unpackMessage(msg);
+ }
}
}
@@ -1665,7 +1679,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
}
// Request access list information for this land
- parcel_mgr.sendParcelAccessListRequest(AL_ACCESS | AL_BAN);
+ parcel_mgr.sendParcelAccessListRequest(AL_ACCESS | AL_BAN | AL_ALLOW_EXPERIENCE | AL_BLOCK_EXPERIENCE);
// Request dwell for this land, if it's not public land.
parcel_mgr.mSelectedDwell = DWELL_NAN;
@@ -1830,6 +1844,14 @@ void LLViewerParcelMgr::processParcelAccessListReply(LLMessageSystem *msg, void
{
parcel->unpackAccessEntries(msg, &(parcel->mBanList) );
}
+ else if (message_flags & AL_ALLOW_EXPERIENCE)
+ {
+ parcel->unpackExperienceEntries(msg, EXPERIENCE_KEY_TYPE_ALLOWED);
+ }
+ else if (message_flags & AL_BLOCK_EXPERIENCE)
+ {
+ parcel->unpackExperienceEntries(msg, EXPERIENCE_KEY_TYPE_BLOCKED);
+ }
/*else if (message_flags & AL_RENTER)
{
parcel->unpackAccessEntries(msg, &(parcel->mRenterList) );
@@ -1864,10 +1886,6 @@ void LLViewerParcelMgr::processParcelDwellReply(LLMessageSystem* msg, void**)
void LLViewerParcelMgr::sendParcelAccessListUpdate(U32 which)
{
-
- LLUUID transactionUUID;
- transactionUUID.generate();
-
if (!mSelected)
{
return;
@@ -1876,125 +1894,92 @@ void LLViewerParcelMgr::sendParcelAccessListUpdate(U32 which)
LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal( mWestSouth );
if (!region) return;
- LLMessageSystem* msg = gMessageSystem;
-
LLParcel* parcel = mCurrentParcel;
if (!parcel) return;
if (which & AL_ACCESS)
{
- S32 count = parcel->mAccessList.size();
- S32 num_sections = (S32) ceil(count/PARCEL_MAX_ENTRIES_PER_PACKET);
- S32 sequence_id = 1;
- BOOL start_message = TRUE;
- BOOL initial = TRUE;
-
- access_map_const_iterator cit = parcel->mAccessList.begin();
- access_map_const_iterator end = parcel->mAccessList.end();
- while ( (cit != end) || initial )
- {
- if (start_message)
- {
- msg->newMessageFast(_PREHASH_ParcelAccessListUpdate);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
- msg->nextBlockFast(_PREHASH_Data);
- msg->addU32Fast(_PREHASH_Flags, AL_ACCESS);
- msg->addS32(_PREHASH_LocalID, parcel->getLocalID() );
- msg->addUUIDFast(_PREHASH_TransactionID, transactionUUID);
- msg->addS32Fast(_PREHASH_SequenceID, sequence_id);
- msg->addS32Fast(_PREHASH_Sections, num_sections);
- start_message = FALSE;
-
- if (initial && (cit == end))
- {
- // pack an empty block if there will be no data
- msg->nextBlockFast(_PREHASH_List);
- msg->addUUIDFast(_PREHASH_ID, LLUUID::null );
- msg->addS32Fast(_PREHASH_Time, 0 );
- msg->addU32Fast(_PREHASH_Flags, 0 );
- }
+ sendParcelAccessListUpdate(AL_ACCESS, parcel->mAccessList, region, parcel->getLocalID());
+ }
- initial = FALSE;
- sequence_id++;
+ if (which & AL_BAN)
+ {
+ sendParcelAccessListUpdate(AL_BAN, parcel->mBanList, region, parcel->getLocalID());
+ }
- }
-
- while ( (cit != end) && (msg->getCurrentSendTotal() < MTUBYTES))
- {
+ if(which & AL_ALLOW_EXPERIENCE)
+ {
+ sendParcelAccessListUpdate(AL_ALLOW_EXPERIENCE, parcel->getExperienceKeysByType(EXPERIENCE_KEY_TYPE_ALLOWED), region, parcel->getLocalID());
+ }
+ if(which & AL_BLOCK_EXPERIENCE)
+ {
+ sendParcelAccessListUpdate(AL_BLOCK_EXPERIENCE, parcel->getExperienceKeysByType(EXPERIENCE_KEY_TYPE_BLOCKED), region, parcel->getLocalID());
+ }
+}
- const LLAccessEntry& entry = (*cit).second;
-
- msg->nextBlockFast(_PREHASH_List);
- msg->addUUIDFast(_PREHASH_ID, entry.mID );
- msg->addS32Fast(_PREHASH_Time, entry.mTime );
- msg->addU32Fast(_PREHASH_Flags, entry.mFlags );
- ++cit;
- }
+void LLViewerParcelMgr::sendParcelAccessListUpdate(U32 flags, const LLAccessEntry::map& entries, LLViewerRegion* region, S32 parcel_local_id)
+{
+ S32 count = entries.size();
+ S32 num_sections = (S32) ceil(count/PARCEL_MAX_ENTRIES_PER_PACKET);
+ S32 sequence_id = 1;
+ BOOL start_message = TRUE;
+ BOOL initial = TRUE;
- start_message = TRUE;
- msg->sendReliable( region->getHost() );
- }
- }
+ LLUUID transactionUUID;
+ transactionUUID.generate();
- if (which & AL_BAN)
- {
- S32 count = parcel->mBanList.size();
- S32 num_sections = (S32) ceil(count/PARCEL_MAX_ENTRIES_PER_PACKET);
- S32 sequence_id = 1;
- BOOL start_message = TRUE;
- BOOL initial = TRUE;
-
- access_map_const_iterator cit = parcel->mBanList.begin();
- access_map_const_iterator end = parcel->mBanList.end();
- while ( (cit != end) || initial )
- {
- if (start_message)
- {
- msg->newMessageFast(_PREHASH_ParcelAccessListUpdate);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
- msg->nextBlockFast(_PREHASH_Data);
- msg->addU32Fast(_PREHASH_Flags, AL_BAN);
- msg->addS32(_PREHASH_LocalID, parcel->getLocalID() );
- msg->addUUIDFast(_PREHASH_TransactionID, transactionUUID);
- msg->addS32Fast(_PREHASH_SequenceID, sequence_id);
- msg->addS32Fast(_PREHASH_Sections, num_sections);
- start_message = FALSE;
-
- if (initial && (cit == end))
- {
- // pack an empty block if there will be no data
- msg->nextBlockFast(_PREHASH_List);
- msg->addUUIDFast(_PREHASH_ID, LLUUID::null );
- msg->addS32Fast(_PREHASH_Time, 0 );
- msg->addU32Fast(_PREHASH_Flags, 0 );
- }
- initial = FALSE;
- sequence_id++;
+ LLMessageSystem* msg = gMessageSystem;
- }
-
- while ( (cit != end) && (msg->getCurrentSendTotal() < MTUBYTES))
+ LLAccessEntry::map::const_iterator cit = entries.begin();
+ LLAccessEntry::map::const_iterator end = entries.end();
+ while ( (cit != end) || initial )
+ {
+ if (start_message)
+ {
+ msg->newMessageFast(_PREHASH_ParcelAccessListUpdate);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
+ msg->nextBlockFast(_PREHASH_Data);
+ msg->addU32Fast(_PREHASH_Flags, flags);
+ msg->addS32(_PREHASH_LocalID, parcel_local_id);
+ msg->addUUIDFast(_PREHASH_TransactionID, transactionUUID);
+ msg->addS32Fast(_PREHASH_SequenceID, sequence_id);
+ msg->addS32Fast(_PREHASH_Sections, num_sections);
+ start_message = FALSE;
+
+ if (initial && (cit == end))
{
- const LLAccessEntry& entry = (*cit).second;
-
+ // pack an empty block if there will be no data
msg->nextBlockFast(_PREHASH_List);
- msg->addUUIDFast(_PREHASH_ID, entry.mID );
- msg->addS32Fast(_PREHASH_Time, entry.mTime );
- msg->addU32Fast(_PREHASH_Flags, entry.mFlags );
- ++cit;
+ msg->addUUIDFast(_PREHASH_ID, LLUUID::null );
+ msg->addS32Fast(_PREHASH_Time, 0 );
+ msg->addU32Fast(_PREHASH_Flags, 0 );
}
- start_message = TRUE;
- msg->sendReliable( region->getHost() );
+ initial = FALSE;
+ sequence_id++;
+
}
+
+ while ( (cit != end) && (msg->getCurrentSendTotal() < MTUBYTES))
+ {
+ const LLAccessEntry& entry = (*cit).second;
+
+ msg->nextBlockFast(_PREHASH_List);
+ msg->addUUIDFast(_PREHASH_ID, entry.mID );
+ msg->addS32Fast(_PREHASH_Time, entry.mTime );
+ msg->addU32Fast(_PREHASH_Flags, entry.mFlags );
+ ++cit;
+ }
+
+ start_message = TRUE;
+ msg->sendReliable( region->getHost() );
}
}
+
void LLViewerParcelMgr::deedLandToGroup()
{
std::string group_name;
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index b5b269abdf..bb6bbf3308 100755
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -218,7 +218,7 @@ public:
// Takes an Access List flag, like AL_ACCESS or AL_BAN
void sendParcelAccessListUpdate(U32 which);
-
+
// Takes an Access List flag, like AL_ACCESS or AL_BAN
void sendParcelAccessListRequest(U32 flags);
@@ -291,6 +291,8 @@ public:
static BOOL isParcelModifiableByAgent(const LLParcel* parcelp, U64 group_proxy_power);
private:
+ static void sendParcelAccessListUpdate(U32 flags, const std::map<LLUUID, class LLAccessEntry>& entries, LLViewerRegion* region, S32 parcel_local_id);
+ static void sendParcelExperienceUpdate( const U32 flags, uuid_vec_t experience_ids, LLViewerRegion* region, S32 parcel_local_id );
static bool releaseAlertCB(const LLSD& notification, const LLSD& response);
// If the user is claiming land and the current selection
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 92e07c52a5..9771756266 100755
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -475,8 +475,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
mImpl->mObjectPartition.push_back(NULL); //PARTITION_NONE
mImpl->mVOCachePartition = getVOCachePartition();
- mRenderInfoRequestTimer.resetWithExpiry(0.f); // Set timer to be expired
- setCapabilitiesReceivedCallback(boost::bind(&LLAvatarRenderInfoAccountant::expireRenderInfoReportTimer, _1));
+ setCapabilitiesReceivedCallback(boost::bind(&LLAvatarRenderInfoAccountant::scanNewRegion, _1));
}
@@ -828,7 +827,6 @@ void LLViewerRegion::processRegionInfo(LLMessageSystem* msg, void**)
LLRegionInfoModel::instance().update(msg);
LLFloaterGodTools::processRegionInfo(msg);
LLFloaterRegionInfo::processRegionInfo(msg);
- LLFloaterReporter::processRegionInfo(msg);
}
void LLViewerRegion::setCacheID(const LLUUID& id)
@@ -2718,6 +2716,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("CopyInventoryFromNotecard");
capabilityNames.append("CreateInventoryCategory");
capabilityNames.append("DispatchRegionInfo");
+ capabilityNames.append("DirectDelivery");
capabilityNames.append("EnvironmentSettings");
capabilityNames.append("EstateChangeInfo");
capabilityNames.append("EventQueueGet");
@@ -2733,8 +2732,21 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
AISCommand::getCapabilityNames(capabilityNames);
capabilityNames.append("GetDisplayNames");
+ capabilityNames.append("GetExperiences");
+ capabilityNames.append("AgentExperiences");
+ capabilityNames.append("FindExperienceByName");
+ capabilityNames.append("GetExperienceInfo");
+ capabilityNames.append("GetAdminExperiences");
+ capabilityNames.append("GetCreatorExperiences");
+ capabilityNames.append("ExperiencePreferences");
+ capabilityNames.append("GroupExperiences");
+ capabilityNames.append("UpdateExperience");
+ capabilityNames.append("IsExperienceAdmin");
+ capabilityNames.append("IsExperienceContributor");
+ capabilityNames.append("RegionExperiences");
capabilityNames.append("GetMesh");
capabilityNames.append("GetMesh2");
+ capabilityNames.append("GetMetadata");
capabilityNames.append("GetObjectCost");
capabilityNames.append("GetObjectPhysicsData");
capabilityNames.append("GetTexture");
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index c14fa5aee8..419034d626 100755
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -438,7 +438,8 @@ public:
static BOOL sVOCacheCullingEnabled; //vo cache culling enabled or not.
static S32 sLastCameraUpdated;
- LLFrameTimer & getRenderInfoRequestTimer() { return mRenderInfoRequestTimer; };
+ LLFrameTimer & getRenderInfoRequestTimer() { return mRenderInfoRequestTimer; };
+ LLFrameTimer & getRenderInfoReportTimer() { return mRenderInfoReportTimer; };
struct CompareRegionByLastUpdate
{
@@ -547,6 +548,7 @@ private:
// the materials capability throttle
LLFrameTimer mMaterialsCapThrottleTimer;
LLFrameTimer mRenderInfoRequestTimer;
+ LLFrameTimer mRenderInfoReportTimer;
};
inline BOOL LLViewerRegion::getRegionProtocol(U64 protocol) const
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index f60829e9e8..24a6758312 100755
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -60,6 +60,7 @@
#include "llfeaturemanager.h"
#include "llviewernetwork.h"
#include "llmeshrepository.h" //for LLMeshRepository::sBytesReceived
+#include "llsdserialize.h"
namespace LLStatViewer
{
@@ -616,8 +617,10 @@ void send_stats()
body["DisplayNamesShowUsername"] = gSavedSettings.getBOOL("NameTagShowUsernames");
body["MinimalSkin"] = false;
-
+
LLViewerStats::getInstance()->addToMessage(body);
+
+ LL_INFOS("LogViewerStatsPacket") << "Sending viewer statistics: " << body << LL_ENDL;
LLHTTPClient::post(url, body, new ViewerStatsResponder());
LLViewerStats::instance().getRecording().resume();
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index e317989f04..6d73a75b74 100755
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -677,12 +677,12 @@ public:
{
LLVOAvatar* avatar = av_iter->second;
- avatar->calculateUpdateRenderCost(); // Make sure the numbers are up-to-date
+ avatar->calculateUpdateRenderComplexity(); // Make sure the numbers are up-to-date
trunc_name = utf8str_truncate(avatar->getFullname(), 16);
- addText(xpos, ypos, llformat("%s : rez %d, weight %d, bytes %d area %.2f",
+ addText(xpos, ypos, llformat("%s : %s, complexity %d, bytes %d area %.2f",
trunc_name.c_str(),
- avatar->getRezzedStatus(),
+ LLVOAvatar::rezStatusToString(avatar->getRezzedStatus()).c_str(),
avatar->getVisualComplexity(),
avatar->getAttachmentGeometryBytes(),
avatar->getAttachmentSurfaceArea()));
@@ -2336,12 +2336,6 @@ void LLViewerWindow::setMenuBackgroundColor(bool god_mode, bool dev_grid)
LLSD args;
LLColor4 new_bg_color;
- // no l10n problem because channel is always an english string
- std::string channel = LLVersionInfo::getChannel();
- static const boost::regex is_beta_channel("\\bBeta\\b");
- static const boost::regex is_project_channel("\\bProject\\b");
- static const boost::regex is_test_channel("\\bTest$");
-
// god more important than project, proj more important than grid
if ( god_mode )
{
@@ -2354,27 +2348,35 @@ void LLViewerWindow::setMenuBackgroundColor(bool god_mode, bool dev_grid)
new_bg_color = LLUIColorTable::instance().getColor( "MenuNonProductionGodBgColor" );
}
}
- else if (boost::regex_search(channel, is_beta_channel))
- {
- new_bg_color = LLUIColorTable::instance().getColor( "MenuBarBetaBgColor" );
- }
- else if (boost::regex_search(channel, is_project_channel))
- {
- new_bg_color = LLUIColorTable::instance().getColor( "MenuBarProjectBgColor" );
- }
- else if (boost::regex_search(channel, is_test_channel))
- {
- new_bg_color = LLUIColorTable::instance().getColor( "MenuBarTestBgColor" );
- }
- else if(!LLGridManager::getInstance()->isInProductionGrid())
- {
- new_bg_color = LLUIColorTable::instance().getColor( "MenuNonProductionBgColor" );
- }
- else
- {
- new_bg_color = LLUIColorTable::instance().getColor( "MenuBarBgColor" );
- }
-
+ else
+ {
+ switch (LLVersionInfo::getViewerMaturity())
+ {
+ case LLVersionInfo::TEST_VIEWER:
+ new_bg_color = LLUIColorTable::instance().getColor( "MenuBarTestBgColor" );
+ break;
+
+ case LLVersionInfo::PROJECT_VIEWER:
+ new_bg_color = LLUIColorTable::instance().getColor( "MenuBarProjectBgColor" );
+ break;
+
+ case LLVersionInfo::BETA_VIEWER:
+ new_bg_color = LLUIColorTable::instance().getColor( "MenuBarBetaBgColor" );
+ break;
+
+ case LLVersionInfo::RELEASE_VIEWER:
+ if(!LLGridManager::getInstance()->isInProductionGrid())
+ {
+ new_bg_color = LLUIColorTable::instance().getColor( "MenuNonProductionBgColor" );
+ }
+ else
+ {
+ new_bg_color = LLUIColorTable::instance().getColor( "MenuBarBgColor" );
+ }
+ break;
+ }
+ }
+
if(gMenuBarView)
{
gMenuBarView->setBackgroundColor( new_bg_color );
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 6e0d77b10a..e9878fe656 100755
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -43,6 +43,8 @@
#include "llanimationstates.h"
#include "llavatarnamecache.h"
#include "llavatarpropertiesprocessor.h"
+#include "llavatarrendernotifier.h"
+#include "llexperiencecache.h"
#include "llphysicsmotion.h"
#include "llviewercontrol.h"
#include "llcallingcard.h" // IDEVO for LLAvatarTracker
@@ -114,8 +116,6 @@ extern U32 JOINT_COUNT_REQUIRED_FOR_FULLRIG;
const F32 MAX_HOVER_Z = 2.0;
const F32 MIN_HOVER_Z = -2.0;
-// #define OUTPUT_BREAST_DATA
-
using namespace LLAvatarAppearanceDefines;
//-----------------------------------------------------------------------------
@@ -159,6 +159,9 @@ const F32 HEAD_MOVEMENT_AVG_TIME = 0.9f;
const S32 MORPH_MASK_REQUESTED_DISCARD = 0;
+const F32 MAX_STANDOFF_FROM_ORIGIN = 3;
+const F32 MAX_STANDOFF_DISTANCE_CHANGE = 32;
+
// Discard level at which to switch to baked textures
// Should probably be 4 or 3, but didn't want to change it while change other logic - SJB
const S32 SWITCH_TO_BAKED_DISCARD = 5;
@@ -182,6 +185,8 @@ const F32 NAMETAG_UPDATE_THRESHOLD = 0.3f;
const F32 NAMETAG_VERTICAL_SCREEN_OFFSET = 25.f;
const F32 NAMETAG_VERT_OFFSET_WEIGHT = 0.17f;
+const U32 LLVOAvatar::VISUAL_COMPLEXITY_UNKNOWN = 0;
+
enum ERenderName
{
RENDER_NAME_NEVER,
@@ -618,7 +623,7 @@ private:
//-----------------------------------------------------------------------------
LLAvatarAppearanceDictionary *LLVOAvatar::sAvatarDictionary = NULL;
S32 LLVOAvatar::sFreezeCounter = 0;
-U32 LLVOAvatar::sMaxVisible = 12;
+U32 LLVOAvatar::sMaxNonImpostors = 12; // overridden based on graphics setting
F32 LLVOAvatar::sRenderDistance = 256.f;
S32 LLVOAvatar::sNumVisibleAvatars = 0;
S32 LLVOAvatar::sNumLODChangesThisFrame = 0;
@@ -645,7 +650,7 @@ BOOL LLVOAvatar::sShowFootPlane = FALSE;
BOOL LLVOAvatar::sVisibleInFirstPerson = FALSE;
F32 LLVOAvatar::sLODFactor = 1.f;
F32 LLVOAvatar::sPhysicsLODFactor = 1.f;
-BOOL LLVOAvatar::sUseImpostors = FALSE;
+bool LLVOAvatar::sUseImpostors = false; // overwridden by RenderAvatarMaxNonImpostors
BOOL LLVOAvatar::sJointDebug = FALSE;
F32 LLVOAvatar::sUnbakedTime = 0.f;
F32 LLVOAvatar::sUnbakedUpdateTime = 0.f;
@@ -666,9 +671,9 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
LLAvatarAppearance(&gAgentWearables),
LLViewerObject(id, pcode, regionp),
mSpecialRenderMode(0),
- mAttachmentGeometryBytes(-1),
- mAttachmentSurfaceArea(-1.f),
- mReportedVisualComplexity(-1),
+ mAttachmentGeometryBytes(0),
+ mAttachmentSurfaceArea(0.f),
+ mReportedVisualComplexity(VISUAL_COMPLEXITY_UNKNOWN),
mTurning(FALSE),
mLastSkeletonSerialNum( 0 ),
mIsSitting(FALSE),
@@ -698,22 +703,24 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mNeedsSkin(FALSE),
mLastSkinTime(0.f),
mUpdatePeriod(1),
+ mVisualComplexityStale(true),
+ mVisuallyMuteSetting(AV_RENDER_NORMALLY),
+ mMutedAVColor(LLColor4::white /* used for "uninitialize" */),
mFirstFullyVisible(TRUE),
mFullyLoaded(FALSE),
mPreviousFullyLoaded(FALSE),
mFullyLoadedInitialized(FALSE),
- mVisualComplexity(0),
- mVisualComplexityStale(TRUE),
+ mVisualComplexity(VISUAL_COMPLEXITY_UNKNOWN),
mLoadedCallbacksPaused(FALSE),
mRenderUnloadedAvatar(LLCachedControl<bool>(gSavedSettings, "RenderUnloadedAvatar", false)),
mLastRezzedStatus(-1),
mIsEditingAppearance(FALSE),
mUseLocalAppearance(FALSE),
mLastUpdateRequestCOFVersion(-1),
- mLastUpdateReceivedCOFVersion(-1),
- mCachedMuteListUpdateTime(0),
- mCachedInMuteList(false)
+ mLastUpdateReceivedCOFVersion(-1)
{
+ LL_DEBUGS("AvatarRender") << "LLVOAvatar Constructor (0x" << this << ") id:" << mID << LL_ENDL;
+
//VTResume(); // VTune
setHoverOffset(LLVector3(0.0, 0.0, 0.0));
@@ -721,8 +728,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
const BOOL needsSendToSim = false; // currently, this HUD effect doesn't need to pack and unpack data to do its job
mVoiceVisualizer = ( LLVoiceVisualizer *)LLHUDManager::getInstance()->createViewerEffect( LLHUDObject::LL_HUD_EFFECT_VOICE_VISUALIZER, needsSendToSim );
- LL_DEBUGS("Avatar") << "LLVOAvatar Constructor (0x" << this << ") id:" << mID << LL_ENDL;
-
+ LL_DEBUGS("Avatar","Message") << "LLVOAvatar Constructor (0x" << this << ") id:" << mID << LL_ENDL;
mPelvisp = NULL;
mDirtyMesh = 2; // Dirty geometry, need to regenerate.
@@ -771,17 +777,10 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mDebugExistenceTimer.reset();
mLastAppearanceMessageTimer.reset();
- if(LLSceneMonitor::getInstance()->isEnabled())
+ if(LLSceneMonitor::getInstance()->isEnabled())
{
- LLSceneMonitor::getInstance()->freezeAvatar((LLCharacter*)this);
+ LLSceneMonitor::getInstance()->freezeAvatar((LLCharacter*)this);
}
-
- mCachedVisualMute = !isSelf();
- mCachedVisualMuteUpdateTime = LLFrameTimer::getTotalSeconds() + 5.0;
- mVisuallyMuteSetting = VISUAL_MUTE_NOT_SET;
-
- F32 color_value = (F32) (getID().mData[0]);
- mMutedAVColor = calcMutedAVColor(color_value, 0, 256);
}
std::string LLVOAvatar::avString() const
@@ -989,8 +988,8 @@ std::string LLVOAvatar::rezStatusToString(S32 rez_status)
{
if (rez_status==0) return "cloud";
if (rez_status==1) return "gray";
- if (rez_status==2) return "textured";
- if (rez_status==3) return "textured_and_downloaded";
+ if (rez_status==2) return "downloading";
+ if (rez_status==3) return "full";
return "unknown";
}
@@ -2131,7 +2130,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
// animate the character
// store off last frame's root position to be consistent with camera position
- LLVector3 root_pos_last = mRoot->getWorldPosition();
+ mLastRootPos = mRoot->getWorldPosition();
BOOL detailed_update = updateCharacter(agent);
static LLUICachedControl<bool> visualizers_in_calls("ShowVoiceVisualizersInCalls", false);
@@ -2148,9 +2147,9 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
idleUpdateBelowWater(); // wind effect uses this
idleUpdateWindEffect();
}
-
- idleUpdateNameTag( root_pos_last );
- idleUpdateRenderCost();
+
+ idleUpdateNameTag( mLastRootPos );
+ idleUpdateRenderComplexity();
}
void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
@@ -2490,19 +2489,22 @@ void LLVOAvatar::idleUpdateLoadingEffect()
// update visibility when avatar is partially loaded
if (updateIsFullyLoaded()) // changed?
{
- if (isFullyLoaded() && mFirstFullyVisible && isSelf())
- {
- LL_INFOS("Avatar") << avString() << "self isFullyLoaded, mFirstFullyVisible" << LL_ENDL;
- mFirstFullyVisible = FALSE;
- LLAppearanceMgr::instance().onFirstFullyVisible();
- }
- if (isFullyLoaded() && mFirstFullyVisible && !isSelf())
- {
- LL_INFOS("Avatar") << avString() << "other isFullyLoaded, mFirstFullyVisible" << LL_ENDL;
- mFirstFullyVisible = FALSE;
- }
if (isFullyLoaded())
{
+ if (mFirstFullyVisible)
+ {
+ mFirstFullyVisible = FALSE;
+ if (isSelf())
+ {
+ LL_INFOS("Avatar") << avString() << "self isFullyLoaded, mFirstFullyVisible" << LL_ENDL;
+ LLAppearanceMgr::instance().onFirstFullyVisible();
+ }
+ else
+ {
+ LL_INFOS("Avatar") << avString() << "other isFullyLoaded, mFirstFullyVisible" << LL_ENDL;
+ }
+ }
+
deleteParticleSource();
updateLOD();
}
@@ -3081,108 +3083,35 @@ void LLVOAvatar::slamPosition()
mRoot->updateWorldMatrixChildren();
}
-bool LLVOAvatar::isVisuallyMuted()
+bool LLVOAvatar::isVisuallyMuted() const
{
bool muted = false;
+ // Priority order (highest priority first)
+ // * own avatar is never visually muted
+ // * if on the "always draw normally" list, draw them normally
+ // * if on the "always visually mute" list, mute them
+ // * check against the render cost and attachment limits
if (!isSelf())
{
- static LLCachedControl<U32> render_auto_mute_functions(gSavedSettings, "RenderAutoMuteFunctions", 0);
- if (render_auto_mute_functions) // Hacky debug switch for developing feature
+ if (mVisuallyMuteSetting == AV_ALWAYS_RENDER)
{
- // Priority order (highest priority first)
- // * own avatar is never visually muted
- // * if on the "always draw normally" list, draw them normally
- // * if on the "always visually mute" list, mute them
- // * draw them normally if they meet the following criteria:
- // - within the closest N avatars OR on friends list OR in an IM chat
- // - AND aren't over the thresholds
- // * otherwise visually mute all other avatars
-
- static LLCachedControl<U32> max_attachment_bytes(gSavedSettings, "RenderAutoMuteByteLimit", 0);
- static LLCachedControl<F32> max_attachment_area(gSavedSettings, "RenderAutoMuteSurfaceAreaLimit", 0.0);
- static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAutoMuteRenderWeightLimit", 0);
-
- if (mVisuallyMuteSetting == ALWAYS_VISUAL_MUTE)
- { // Always want to see this AV as an impostor
- muted = true;
- }
- else if (mVisuallyMuteSetting == NEVER_VISUAL_MUTE)
- { // Never show as impostor
- muted = false;
- }
- else
- {
- F64 now = LLFrameTimer::getTotalSeconds();
-
- if (now < mCachedVisualMuteUpdateTime)
- { // Use cached mute value
- muted = mCachedVisualMute;
- }
- else
- { // Determine if visually muted or not
-
- U32 max_cost = (U32) (max_render_cost*(LLVOAvatar::sLODFactor+0.5));
-
- muted = (mAttachmentGeometryBytes > max_attachment_bytes && max_attachment_bytes > 0) ||
- (mAttachmentSurfaceArea > max_attachment_area && max_attachment_area > 0.f) ||
- (mVisualComplexity > max_cost && max_render_cost > 0);
-
- // Could be part of the grand || collection above, but yanked out to make the logic visible
- if (!muted)
- {
- if (sMaxVisible > 0)
- { // They are above the visibilty rank - mute them
- muted = (mVisibilityRank > sMaxVisible);
- }
-
- // Always draw friends or those in IMs. Needs UI?
- if ((render_auto_mute_functions & 0x02) &&
- (muted || sMaxVisible == 0)) // Don't mute friends or IMs
- {
- muted = !(LLAvatarTracker::instance().isBuddy(getID()));
- if (muted)
- { // Not a friend, so they are muted ... are they in an IM?
- LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL,getID());
- muted = !gIMMgr->hasSession(session_id);
- }
- }
- }
-
- // Save visual mute state and set interval for updating
- const F64 SECONDS_BETWEEN_RENDER_AUTO_MUTE_UPDATES = 1.5;
- mCachedVisualMuteUpdateTime = now + SECONDS_BETWEEN_RENDER_AUTO_MUTE_UPDATES;
- mCachedVisualMute = muted;
- }
- }
+ muted = false;
+ }
+ else if (mVisuallyMuteSetting == AV_DO_NOT_RENDER)
+ { // Always want to see this AV as an impostor
+ muted = true;
+ }
+ else if (LLMuteList::getInstance()->isMuted(getID()))
+ {
+ muted = true;
+ }
+ else
+ {
+ muted = isTooComplex();
}
}
- return muted || isInMuteList();
-}
-
-void LLVOAvatar::forceUpdateVisualMuteSettings()
-{
- // Set the cache time so it's updated ASAP
- mCachedVisualMuteUpdateTime = LLFrameTimer::getTotalSeconds() - 1.0;
-}
-
-bool LLVOAvatar::isInMuteList()
-{
- bool muted = false;
- F64 now = LLFrameTimer::getTotalSeconds();
- if (now < mCachedMuteListUpdateTime)
- {
- muted = mCachedInMuteList;
- }
- else
- {
- muted = LLMuteList::getInstance()->isMuted(getID());
-
- const F64 SECONDS_BETWEEN_MUTE_UPDATES = 1;
- mCachedMuteListUpdateTime = now + SECONDS_BETWEEN_MUTE_UPDATES;
- mCachedInMuteList = muted;
- }
return muted;
}
@@ -3329,18 +3258,18 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
{ // visually muted avatars update at 16 hz
mUpdatePeriod = 16;
}
- else if (mVisibilityRank <= LLVOAvatar::sMaxVisible ||
- mDrawable->mDistanceWRTCamera < 1.f + mag)
- { //first 25% of max visible avatars are not impostored
- //also, don't impostor avatars whose bounding box may be penetrating the
- //impostor camera near clip plane
+ else if ( ! shouldImpostor()
+ || mDrawable->mDistanceWRTCamera < 1.f + mag)
+ { // first 25% of max visible avatars are not impostored
+ // also, don't impostor avatars whose bounding box may be penetrating the
+ // impostor camera near clip plane
mUpdatePeriod = 1;
}
- else if (mVisibilityRank > LLVOAvatar::sMaxVisible * 4)
+ else if ( shouldImpostor(4) )
{ //background avatars are REALLY slow updating impostors
mUpdatePeriod = 16;
}
- else if (mVisibilityRank > LLVOAvatar::sMaxVisible * 3)
+ else if ( shouldImpostor(3) )
{ //back 25% of max visible avatars are slow updating impostors
mUpdatePeriod = 8;
}
@@ -3924,6 +3853,10 @@ void LLVOAvatar::updateVisibility()
}
}
+ if ( visible != mVisible )
+ {
+ LL_DEBUGS("AvatarRender") << "visible was " << mVisible << " now " << visible << LL_ENDL;
+ }
mVisible = visible;
}
@@ -4196,8 +4129,8 @@ 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) &&
- 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)
{
LLViewerJoint* hair_mesh = getViewerJoint(MESH_ID_HAIR);
if (hair_mesh)
@@ -5733,12 +5666,20 @@ BOOL LLVOAvatar::setParent(LLViewerObject* parent)
void LLVOAvatar::addChild(LLViewerObject *childp)
{
childp->extractAttachmentItemID(); // find the inventory item this object is associated with.
+ if (isSelf())
+ {
+ const LLUUID& item_id = childp->getAttachmentItemID();
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ LL_DEBUGS("Avatar") << "ATT attachment child added " << (item ? item->getName() : "UNKNOWN") << " id " << item_id << LL_ENDL;
+
+ }
+
LLViewerObject::addChild(childp);
if (childp->mDrawable)
{
if (!attachObject(childp))
{
- LL_WARNS() << "addChild() failed for "
+ LL_WARNS() << "ATT addChild() failed for "
<< childp->getID()
<< " item " << childp->getAttachmentItemID()
<< LL_ENDL;
@@ -5808,14 +5749,25 @@ LLViewerJointAttachment* LLVOAvatar::getTargetAttachmentPoint(LLViewerObject* vi
//-----------------------------------------------------------------------------
const LLViewerJointAttachment *LLVOAvatar::attachObject(LLViewerObject *viewer_object)
{
+ if (isSelf())
+ {
+ const LLUUID& item_id = viewer_object->getAttachmentItemID();
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ LL_DEBUGS("Avatar") << "ATT attaching object "
+ << (item ? item->getName() : "UNKNOWN") << " id " << item_id << LL_ENDL;
+ }
LLViewerJointAttachment* attachment = getTargetAttachmentPoint(viewer_object);
if (!attachment || !attachment->addObject(viewer_object))
{
+ const LLUUID& item_id = viewer_object->getAttachmentItemID();
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ LL_WARNS("Avatar") << "ATT attach failed "
+ << (item ? item->getName() : "UNKNOWN") << " id " << item_id << LL_ENDL;
return 0;
}
- mVisualComplexityStale = TRUE;
+ updateVisualComplexity();
if (viewer_object->isSelected())
{
@@ -5871,6 +5823,13 @@ void LLVOAvatar::lazyAttach()
LLPointer<LLViewerObject> cur_attachment = mPendingAttachment[i];
if (cur_attachment->mDrawable)
{
+ if (isSelf())
+ {
+ const LLUUID& item_id = cur_attachment->getAttachmentItemID();
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ LL_DEBUGS("Avatar") << "ATT attaching object "
+ << (item ? item->getName() : "UNKNOWN") << " id " << item_id << LL_ENDL;
+ }
if (!attachObject(cur_attachment))
{ // Drop it
LL_WARNS() << "attachObject() failed for "
@@ -5964,7 +5923,7 @@ BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object)
if (attachment->isObjectAttached(viewer_object))
{
- mVisualComplexityStale = TRUE;
+ updateVisualComplexity();
cleanupAttachedMesh( viewer_object );
attachment->removeObject(viewer_object);
@@ -6053,10 +6012,10 @@ void LLVOAvatar::getOffObject()
{
return;
}
-
+
LLViewerObject* sit_object = (LLViewerObject*)getParent();
- if (sit_object)
+ if (sit_object)
{
stopMotionFromSource(sit_object->getID());
LLFollowCamMgr::setCameraActive(sit_object->getID(), FALSE);
@@ -6073,9 +6032,19 @@ void LLVOAvatar::getOffObject()
}
// assumes that transform will not be updated with drawable still having a parent
+ // or that drawable had no parent from the start
LLVector3 cur_position_world = mDrawable->getWorldPosition();
LLQuaternion cur_rotation_world = mDrawable->getWorldRotation();
+ if (mLastRootPos.length() >= MAX_STANDOFF_FROM_ORIGIN
+ && (cur_position_world.length() < MAX_STANDOFF_FROM_ORIGIN
+ || dist_vec(cur_position_world, mLastRootPos) > MAX_STANDOFF_DISTANCE_CHANGE))
+ {
+ // Most likely drawable got updated too early or some updates were missed - we got relative position to non-existing parent
+ // restore coordinates from cache
+ cur_position_world = mLastRootPos;
+ }
+
// set *local* position based on last *world* position, since we're unparenting the avatar
mDrawable->mXform.setPosition(cur_position_world);
mDrawable->mXform.setRotation(cur_rotation_world);
@@ -6251,36 +6220,25 @@ void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color)
BOOL LLVOAvatar::isVisible() const
{
return mDrawable.notNull()
+ && (!mOrphaned || isSelf())
&& (mDrawable->isVisible() || mIsDummy);
}
// Determine if we have enough avatar data to render
-BOOL LLVOAvatar::getIsCloud() const
+bool LLVOAvatar::getIsCloud() const
{
- // Do we have a shape?
- if ((const_cast<LLVOAvatar*>(this))->visualParamWeightsAreDefault())
- {
- return TRUE;
- }
-
- if (!isTextureDefined(TEX_LOWER_BAKED) ||
- !isTextureDefined(TEX_UPPER_BAKED) ||
- !isTextureDefined(TEX_HEAD_BAKED))
- {
- return TRUE;
- }
-
- if (isTooComplex())
- {
- return TRUE;
- }
- return FALSE;
+ return ( ((const_cast<LLVOAvatar*>(this))->visualParamWeightsAreDefault())// Do we have a shape?
+ || ( !isTextureDefined(TEX_LOWER_BAKED)
+ || !isTextureDefined(TEX_UPPER_BAKED)
+ || !isTextureDefined(TEX_HEAD_BAKED)
+ )
+ );
}
void LLVOAvatar::updateRezzedStatusTimers()
{
// State machine for rezzed status. Statuses are -1 on startup, 0
- // = cloud, 1 = gray, 2 = textured, 3 = textured_and_downloaded.
+ // = cloud, 1 = gray, 2 = downloading, 3 = full.
// Purpose is to collect time data for each it takes avatar to reach
// various loading landmarks: gray, textured (partial), textured fully.
@@ -6320,6 +6278,8 @@ void LLVOAvatar::updateRezzedStatusTimers()
selfStopPhase("update_appearance_from_cof");
selfStopPhase("wear_inventory_category", false);
selfStopPhase("process_initial_wearables_update", false);
+
+ updateVisualComplexity();
}
}
mLastRezzedStatus = rez_status;
@@ -6452,7 +6412,7 @@ void LLVOAvatar::logMetricsTimerRecord(const std::string& phase_name, F32 elapse
// returns true if the value has changed.
BOOL LLVOAvatar::updateIsFullyLoaded()
{
- const BOOL loading = getIsCloud();
+ const bool loading = getIsCloud();
updateRezzedStatusTimers();
updateRuthTimer(loading);
return processFullyLoadedChange(loading);
@@ -6513,6 +6473,12 @@ BOOL LLVOAvatar::processFullyLoadedChange(bool loading)
mPreviousFullyLoaded = mFullyLoaded;
mFullyLoadedInitialized = TRUE;
mFullyLoadedFrameCounter++;
+
+ if (changed && isSelf())
+ {
+ // to know about outfit switching
+ LLAvatarRenderNotifier::getInstance()->updateNotificationState();
+ }
return changed;
}
@@ -6524,15 +6490,26 @@ BOOL LLVOAvatar::isFullyLoaded() const
bool LLVOAvatar::isTooComplex() const
{
- if (gSavedSettings.getS32("RenderAvatarComplexityLimit") > 0 && mVisualComplexity >= gSavedSettings.getS32("RenderAvatarComplexityLimit"))
+ bool too_complex;
+ if (isSelf() || mVisuallyMuteSetting == AV_ALWAYS_RENDER)
{
- return true;
+ too_complex = false;
+ }
+ else
+ {
+ // Determine if visually muted or not
+ static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAvatarMaxComplexity", 0U);
+ static LLCachedControl<U32> max_attachment_bytes(gSavedSettings, "RenderAutoMuteByteLimit", 0U);
+ static LLCachedControl<F32> max_attachment_area(gSavedSettings, "RenderAutoMuteSurfaceAreaLimit", 10.0E6f);
+ too_complex = ((max_render_cost > 0 && mVisualComplexity > max_render_cost)
+ || (max_attachment_bytes > 0 && mAttachmentGeometryBytes > max_attachment_bytes)
+ || (max_attachment_area > 0.0f && mAttachmentSurfaceArea > max_attachment_area)
+ );
}
- return false;
+ return too_complex;
}
-
//-----------------------------------------------------------------------------
// findMotion()
//-----------------------------------------------------------------------------
@@ -7396,7 +7373,10 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
// appearance messages.
mLastUpdateReceivedCOFVersion = this_update_cof_version;
- applyParsedTEMessage(contents.mTEContents);
+ if (applyParsedTEMessage(contents.mTEContents) > 0 && isChanged(TEXTURE))
+ {
+ updateVisualComplexity();
+ }
// prevent the overwriting of valid baked textures with invalid baked textures
for (U8 baked_index = 0; baked_index < mBakedTextureDatas.size(); baked_index++)
@@ -7514,7 +7494,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
// Got an update for some other avatar
// Ignore updates for self, because we have a more authoritative value in the preferences.
setHoverOffset(contents.mHoverOffset);
- LL_INFOS("Avatar") << avString() << "setting hover from message" << contents.mHoverOffset[2] << LL_ENDL;
+ LL_INFOS("Avatar") << avString() << "setting hover to " << contents.mHoverOffset[2] << LL_ENDL;
}
if (!contents.mHoverOffsetWasSet && !isSelf())
@@ -8128,28 +8108,35 @@ U32 LLVOAvatar::getPartitionType() const
}
//static
-void LLVOAvatar::updateImpostors()
+void LLVOAvatar::updateImpostors()
{
- LLCharacter::sAllowInstancesChange = FALSE ;
+ LLCharacter::sAllowInstancesChange = FALSE;
for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
- iter != LLCharacter::sInstances.end(); ++iter)
+ iter != LLCharacter::sInstances.end(); ++iter)
{
LLVOAvatar* avatar = (LLVOAvatar*) *iter;
- if (!avatar->isDead() && avatar->needsImpostorUpdate() && avatar->isVisible() && avatar->isImpostor())
+ if (!avatar->isDead() && avatar->isVisible()
+ && (avatar->isImpostor() && avatar->needsImpostorUpdate())
+ )
{
+ avatar->calcMutedAVColor();
gPipeline.generateImpostor(avatar);
}
}
- LLCharacter::sAllowInstancesChange = TRUE ;
+ LLCharacter::sAllowInstancesChange = TRUE;
}
BOOL LLVOAvatar::isImpostor()
{
- return (sUseImpostors && (isVisuallyMuted() || (mUpdatePeriod >= IMPOSTOR_PERIOD))) || isInMuteList() ? TRUE : FALSE;
+ return sUseImpostors && (isVisuallyMuted() || (mUpdatePeriod >= IMPOSTOR_PERIOD)) ? TRUE : FALSE;
}
+BOOL LLVOAvatar::shouldImpostor(const U32 rank_factor) const
+{
+ return (!isSelf() && sUseImpostors && mVisibilityRank > (sMaxNonImpostors * rank_factor));
+}
BOOL LLVOAvatar::needsImpostorUpdate() const
{
@@ -8190,68 +8177,189 @@ void LLVOAvatar::getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& d
angle.mV[2] = da;
}
+// static
+const U32 LLVOAvatar::IMPOSTORS_OFF = 66; /* Must equal the maximum allowed the RenderAvatarMaxNonImpostors
+ * slider in panel_preferences_graphics1.xml */
-void LLVOAvatar::idleUpdateRenderCost()
+// static
+void LLVOAvatar::updateImpostorRendering(U32 newMaxNonImpostorsValue)
{
- static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAutoMuteRenderWeightLimit", 0);
- static const U32 ARC_LIMIT = 20000;
-
- if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_ATTACHMENT_BYTES))
- { //set debug text to attachment geometry bytes here so render cost will override
- setDebugText(llformat("%.1f KB, %.2f m^2", mAttachmentGeometryBytes/1024.f, mAttachmentSurfaceArea));
+ U32 oldmax = sMaxNonImpostors;
+ bool oldflg = sUseImpostors;
+
+ if (IMPOSTORS_OFF <= newMaxNonImpostorsValue)
+ {
+ sMaxNonImpostors = 0;
}
-
- if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME) && max_render_cost == 0)
+ else
{
- return;
+ sMaxNonImpostors = newMaxNonImpostorsValue;
}
+ // the sUseImpostors flag depends on whether or not sMaxNonImpostors is set to the no-limit value (0)
+ sUseImpostors = (0 != sMaxNonImpostors);
+ if ( oldflg != sUseImpostors )
+ {
+ LL_DEBUGS("AvatarRender")
+ << "was " << (oldflg ? "use" : "don't use" ) << " impostors (max " << oldmax << "); "
+ << "now " << (sUseImpostors ? "use" : "don't use" ) << " impostors (max " << sMaxNonImpostors << "); "
+ << LL_ENDL;
+ }
+}
- calculateUpdateRenderCost(); // Update mVisualComplexity if needed
-
- if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME))
+
+void LLVOAvatar::idleUpdateRenderComplexity()
+{
+ // Render Complexity
+ calculateUpdateRenderComplexity(); // Update mVisualComplexity if needed
+
+ if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_AVATAR_DRAW_INFO))
{
- std::string viz_string = LLVOAvatar::rezStatusToString(getRezzedStatus());
- setDebugText(llformat("%s %d", viz_string.c_str(), mVisualComplexity));
- F32 green = 1.f-llclamp(((F32) mVisualComplexity-(F32)ARC_LIMIT)/(F32)ARC_LIMIT, 0.f, 1.f);
- F32 red = llmin((F32) mVisualComplexity/(F32)ARC_LIMIT, 1.f);
- mText->setColor(LLColor4(red,green,0,1));
+ std::string info_line;
+ F32 red_level;
+ F32 green_level;
+ LLColor4 info_color;
+ LLFontGL::StyleFlags info_style;
+
+ if ( !mText )
+ {
+ initDebugTextHud();
+ mText->setFadeDistance(20.0, 5.0); // limit clutter in large crowds
+ }
+ else
+ {
+ mText->clearString(); // clear debug text
+ }
+
+ /*
+ * NOTE: the logic for whether or not each of the values below
+ * controls muting MUST match that in the isVisuallyMuted and isTooComplex methods.
+ */
+
+ static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAvatarMaxComplexity", 0);
+ info_line = llformat("%d Complexity", mVisualComplexity);
+
+ if (max_render_cost != 0) // zero means don't care, so don't bother coloring based on this
+ {
+ green_level = 1.f-llclamp(((F32) mVisualComplexity-(F32)max_render_cost)/(F32)max_render_cost, 0.f, 1.f);
+ red_level = llmin((F32) mVisualComplexity/(F32)max_render_cost, 1.f);
+ info_color.set(red_level, green_level, 0.0, 1.0);
+ info_style = ( mVisualComplexity > max_render_cost
+ ? LLFontGL::BOLD : LLFontGL::NORMAL );
+ }
+ else
+ {
+ info_color.set(LLColor4::grey);
+ info_style = LLFontGL::NORMAL;
+ }
+ mText->addLine(info_line, info_color, info_style);
+
+ // Visual rank
+ info_line = llformat("%d rank", mVisibilityRank);
+ // Use grey for imposters, white for normal rendering or no impostors
+ info_color.set(isImpostor() ? LLColor4::grey : LLColor4::white);
+ info_style = LLFontGL::NORMAL;
+ mText->addLine(info_line, info_color, info_style);
+
+ // Attachment Surface Area
+ static LLCachedControl<F32> max_attachment_area(gSavedSettings, "RenderAutoMuteSurfaceAreaLimit", 10.0E6f);
+ info_line = llformat("%.2f m^2", mAttachmentSurfaceArea);
+
+ if (max_attachment_area != 0) // zero means don't care, so don't bother coloring based on this
+ {
+ green_level = 1.f-llclamp((mAttachmentSurfaceArea-max_attachment_area)/max_attachment_area, 0.f, 1.f);
+ red_level = llmin(mAttachmentSurfaceArea/max_attachment_area, 1.f);
+ info_color.set(red_level, green_level, 0.0, 1.0);
+ info_style = ( mAttachmentSurfaceArea > max_attachment_area
+ ? LLFontGL::BOLD : LLFontGL::NORMAL );
+
+ }
+ else
+ {
+ info_color.set(LLColor4::grey);
+ info_style = LLFontGL::NORMAL;
+ }
+ mText->addLine(info_line, info_color, info_style);
+
+ // Attachment byte limit
+ static LLCachedControl<U32> max_attachment_bytes(gSavedSettings, "RenderAutoMuteByteLimit", 0);
+ info_line = llformat("%.1f KB", mAttachmentGeometryBytes/1024.f);
+ if (max_attachment_bytes != 0) // zero means don't care, so don't bother coloring based on this
+ {
+ green_level = 1.f-llclamp(((F32) mAttachmentGeometryBytes-(F32)max_attachment_bytes)/(F32)max_attachment_bytes, 0.f, 1.f);
+ red_level = llmin((F32) mAttachmentGeometryBytes/(F32)max_attachment_bytes, 1.f);
+ info_color.set(red_level, green_level, 0.0, 1.0);
+ info_style = ( mAttachmentGeometryBytes > max_attachment_bytes
+ ? LLFontGL::BOLD : LLFontGL::NORMAL );
+ }
+ else
+ {
+ info_color.set(LLColor4::grey);
+ info_style = LLFontGL::NORMAL;
+ }
+ mText->addLine(info_line, info_color, info_style);
+
+ updateText(); // corrects position
}
}
+void LLVOAvatar::addAttachmentSizes(U32 delta_bytes, F32 delta_area)
+{
+ mAttachmentGeometryBytes += delta_bytes;
+ mAttachmentSurfaceArea += delta_area;
+}
+
+void LLVOAvatar::subtractAttachmentSizes(U32 delta_bytes, F32 delta_area)
+{
+ mAttachmentGeometryBytes = delta_bytes > mAttachmentGeometryBytes ? 0 : mAttachmentGeometryBytes - delta_bytes;
+ mAttachmentSurfaceArea = delta_area > mAttachmentSurfaceArea ? 0.0 : mAttachmentSurfaceArea - delta_area;
+}
+
+void LLVOAvatar::updateVisualComplexity()
+{
+ LL_DEBUGS("AvatarRender") << "avatar " << getID() << " appearance changed" << LL_ENDL;
+ // Set the cache time to in the past so it's updated ASAP
+ mVisualComplexityStale = true;
+}
// Calculations for mVisualComplexity value
-void LLVOAvatar::calculateUpdateRenderCost()
+void LLVOAvatar::calculateUpdateRenderComplexity()
{
- static const U32 ARC_BODY_PART_COST = 200;
+ /*****************************************************************
+ * This calculation should not be modified by third party viewers,
+ * since it is used to limit rendering and should be uniform for
+ * everyone. If you have suggested improvements, submit them to
+ * the official viewer for consideration.
+ *****************************************************************/
+ static const U32 COMPLEXITY_BODY_PART_COST = 200;
// Diagnostic list of all textures on our avatar
static std::set<LLUUID> all_textures;
if (mVisualComplexityStale)
{
- mVisualComplexityStale = FALSE;
- U32 cost = 0;
+ U32 cost = VISUAL_COMPLEXITY_UNKNOWN;
LLVOVolume::texture_cost_t textures;
for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)
{
- const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index);
+ const LLAvatarAppearanceDictionary::BakedEntry *baked_dict
+ = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index);
ETextureIndex tex_index = baked_dict->mTextureIndex;
if ((tex_index != TEX_SKIRT_BAKED) || (isWearingWearableType(LLWearableType::WT_SKIRT)))
{
if (isTextureVisible(tex_index))
{
- cost +=ARC_BODY_PART_COST;
+ cost +=COMPLEXITY_BODY_PART_COST;
}
}
}
- for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin();
- iter != mAttachmentPoints.end();
- ++iter)
+ for (attachment_map_t::const_iterator attachment_point = mAttachmentPoints.begin();
+ attachment_point != mAttachmentPoints.end();
+ ++attachment_point)
{
- LLViewerJointAttachment* attachment = iter->second;
+ LLViewerJointAttachment* attachment = attachment_point->second;
for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
attachment_iter != attachment->mAttachedObjects.end();
++attachment_iter)
@@ -8281,10 +8389,12 @@ void LLVOAvatar::calculateUpdateRenderCost()
}
}
- for (LLVOVolume::texture_cost_t::iterator iter = textures.begin(); iter != textures.end(); ++iter)
+ for (LLVOVolume::texture_cost_t::iterator volume_texture = textures.begin();
+ volume_texture != textures.end();
+ ++volume_texture)
{
// add the cost of each individual texture in the linkset
- cost += iter->second;
+ cost += volume_texture->second;
}
}
}
@@ -8331,38 +8441,85 @@ void LLVOAvatar::calculateUpdateRenderCost()
}
}
+ if ( cost != mVisualComplexity )
+ {
+ LL_DEBUGS("AvatarRender") << "Avatar "<< getID()
+ << " complexity updated was " << mVisualComplexity << " now " << cost
+ << " reported " << mReportedVisualComplexity
+ << LL_ENDL;
+ }
+ else
+ {
+ LL_DEBUGS("AvatarRender") << "Avatar "<< getID()
+ << " complexity updated no change " << mVisualComplexity
+ << " reported " << mReportedVisualComplexity
+ << LL_ENDL;
+ }
mVisualComplexity = cost;
+ mVisualComplexityStale = false;
+
+ static LLCachedControl<U32> show_my_complexity_changes(gSavedSettings, "ShowMyComplexityChanges", 20);
+
+ if (isSelf() && show_my_complexity_changes)
+ {
+ LLAvatarRenderNotifier::getInstance()->updateNotificationAgent(mVisualComplexity);
+ }
}
}
+void LLVOAvatar::setVisualMuteSettings(VisualMuteSettings set)
+{
+ mVisuallyMuteSetting = set;
+ mNeedsImpostorUpdate = true;
+}
-// static
-LLColor4 LLVOAvatar::calcMutedAVColor(F32 value, S32 range_low, S32 range_high)
+
+void LLVOAvatar::calcMutedAVColor()
{
- F32 clamped_value = llmin(value, (F32) range_high);
- clamped_value = llmax(value, (F32) range_low);
- F32 spectrum = (clamped_value / range_high); // spectrum is between 0 and 1.f
+ LLColor4 new_color(mMutedAVColor);
+ std::string change_msg;
+ LLUUID av_id(getID());
- // Array of colors. These are arranged so only one RGB color changes between each step,
- // and it loops back to red so there is an even distribution. It is not a heat map
- const S32 NUM_SPECTRUM_COLORS = 7;
- static LLColor4 * spectrum_color[NUM_SPECTRUM_COLORS] = { &LLColor4::red, &LLColor4::magenta, &LLColor4::blue, &LLColor4::cyan, &LLColor4::green, &LLColor4::yellow, &LLColor4::red };
+ if (getVisualMuteSettings() == AV_DO_NOT_RENDER)
+ {
+ // explicitly not-rendered avatars are light grey
+ new_color = LLColor4::grey3;
+ change_msg = " not rendered: color is grey3";
+ }
+ else if (LLMuteList::getInstance()->isMuted(av_id)) // the user blocked them
+ {
+ // blocked avatars are dark grey
+ new_color = LLColor4::grey4;
+ change_msg = " blocked: color is grey4";
+ }
+ else if ( mMutedAVColor == LLColor4::white || mMutedAVColor == LLColor4::grey3 || mMutedAVColor == LLColor4::grey4 )
+ {
+ // select a color based on the first byte of the agents uuid so any muted agent is always the same color
+ F32 color_value = (F32) (av_id.mData[0]);
+ F32 spectrum = (color_value / 256.0); // spectrum is between 0 and 1.f
+
+ // Array of colors. These are arranged so only one RGB color changes between each step,
+ // and it loops back to red so there is an even distribution. It is not a heat map
+ const S32 NUM_SPECTRUM_COLORS = 7;
+ static LLColor4 * spectrum_color[NUM_SPECTRUM_COLORS] = { &LLColor4::red, &LLColor4::magenta, &LLColor4::blue, &LLColor4::cyan, &LLColor4::green, &LLColor4::yellow, &LLColor4::red };
- spectrum = spectrum * (NUM_SPECTRUM_COLORS - 1); // Scale to range of number of colors
- S32 spectrum_index_1 = floor(spectrum); // Desired color will be after this index
- S32 spectrum_index_2 = spectrum_index_1 + 1; // and before this index (inclusive)
- F32 fractBetween = spectrum - (F32)(spectrum_index_1); // distance between the two indexes (0-1)
+ spectrum = spectrum * (NUM_SPECTRUM_COLORS - 1); // Scale to range of number of colors
+ S32 spectrum_index_1 = floor(spectrum); // Desired color will be after this index
+ S32 spectrum_index_2 = spectrum_index_1 + 1; // and before this index (inclusive)
+ F32 fractBetween = spectrum - (F32)(spectrum_index_1); // distance between the two indexes (0-1)
- LLColor4 new_color = lerp(*spectrum_color[spectrum_index_1], *spectrum_color[spectrum_index_2], fractBetween);
- new_color.normalize();
- new_color *= 0.7f; // Tone it down a bit
+ new_color = lerp(*spectrum_color[spectrum_index_1], *spectrum_color[spectrum_index_2], fractBetween);
+ new_color.normalize();
+ new_color *= 0.28f; // Tone it down
- //LL_INFOS() << "From value " << std::setprecision(3) << value << " returning color " << new_color
- // << " using indexes " << spectrum_index_1 << ", " << spectrum_index_2
- // << " and fractBetween " << fractBetween
- // << LL_ENDL;
+ change_msg = " over limit color ";
+ }
- return new_color;
+ if (mMutedAVColor != new_color)
+ {
+ LL_DEBUGS("AvatarRender") << "avatar "<< av_id << change_msg << std::setprecision(3) << new_color << LL_ENDL;
+ mMutedAVColor = new_color;
+ }
}
// static
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 1c3f4f2aa7..81f2883985 100755
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -251,20 +251,23 @@ public:
// force all name tags to rebuild, useful when display names turned on/off
static void invalidateNameTags();
void addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font);
- void idleUpdateRenderCost();
- void calculateUpdateRenderCost();
- void updateVisualComplexity() { mVisualComplexityStale = TRUE; }
+ void idleUpdateRenderComplexity();
+ void calculateUpdateRenderComplexity();
+ static const U32 VISUAL_COMPLEXITY_UNKNOWN;
+ void updateVisualComplexity();
- S32 getVisualComplexity() { return mVisualComplexity; }; // Numbers calculated here by rendering AV
+ U32 getVisualComplexity() { return mVisualComplexity; }; // Numbers calculated here by rendering AV
S32 getAttachmentGeometryBytes() { return mAttachmentGeometryBytes; }; // number of bytes in attached geometry
F32 getAttachmentSurfaceArea() { return mAttachmentSurfaceArea; }; // estimated surface area of attachments
+ void addAttachmentSizes(U32 delta_bytes, F32 delta_area);
+ void subtractAttachmentSizes(U32 delta_bytes, F32 delta_area);
- S32 getReportedVisualComplexity() { return mReportedVisualComplexity; }; // Numbers as reported by the SL server
- void setReportedVisualComplexity(S32 value) { mReportedVisualComplexity = value; };
+ U32 getReportedVisualComplexity() { return mReportedVisualComplexity; }; // Numbers as reported by the SL server
+ void setReportedVisualComplexity(U32 value) { mReportedVisualComplexity = value; };
S32 getUpdatePeriod() { return mUpdatePeriod; };
const LLColor4 & getMutedAVColor() { return mMutedAVColor; };
-
+ static void updateImpostorRendering(U32 newMaxNonImpostorsValue);
void idleUpdateBelowWater();
@@ -274,10 +277,12 @@ public:
public:
static S32 sRenderName;
static BOOL sRenderGroupTitles;
- static U32 sMaxVisible; //(affected by control "RenderAvatarMaxVisible")
+ static const U32 IMPOSTORS_OFF; /* Must equal the maximum allowed the RenderAvatarMaxNonImpostors
+ * slider in panel_preferences_graphics1.xml */
+ static U32 sMaxNonImpostors; //(affected by control "RenderAvatarMaxNonImpostors")
static F32 sRenderDistance; //distance at which avatars will render.
static BOOL sShowAnimationDebug; // show animation debug info
- static BOOL sUseImpostors; //use impostors for far away avatars
+ static bool sUseImpostors; //use impostors for far away avatars
static BOOL sShowFootPlane; // show foot collision plane reported by server
static BOOL sShowCollisionVolumes; // show skeletal collision volumes
static BOOL sVisibleInFirstPerson;
@@ -301,9 +306,9 @@ public:
//--------------------------------------------------------------------
public:
BOOL isFullyLoaded() const;
- bool isTooComplex() const;
+ bool isTooComplex() const;
bool visualParamWeightsAreDefault();
- virtual BOOL getIsCloud() const;
+ virtual bool getIsCloud() const;
BOOL isFullyTextured() const;
BOOL hasGray() const;
S32 getRezzedStatus() const; // 0 = cloud, 1 = gray, 2 = textured, 3 = textured and fully downloaded.
@@ -319,7 +324,7 @@ public:
static void logPendingPhasesAllAvatars();
void logMetricsTimerRecord(const std::string& phase_name, F32 elapsed, bool completed);
- static LLColor4 calcMutedAVColor(F32 value, S32 range_low, S32 range_high);
+ void calcMutedAVColor();
protected:
LLViewerStats::PhaseMap& getPhases() { return mPhases; }
@@ -334,8 +339,6 @@ private:
BOOL mPreviousFullyLoaded;
BOOL mFullyLoadedInitialized;
S32 mFullyLoadedFrameCounter;
- S32 mVisualComplexity;
- BOOL mVisualComplexityStale;
LLColor4 mMutedAVColor;
LLFrameTimer mFullyLoadedTimer;
LLFrameTimer mRuthTimer;
@@ -382,18 +385,16 @@ public:
public:
U32 renderImpostor(LLColor4U color = LLColor4U(255,255,255,255), S32 diffuse_channel = 0);
- bool isVisuallyMuted();
- bool isInMuteList();
- void setCachedVisualMute(bool muted) { mCachedVisualMute = muted; };
+ bool isVisuallyMuted() const;
void forceUpdateVisualMuteSettings();
enum VisualMuteSettings
{
- VISUAL_MUTE_NOT_SET = 0,
- ALWAYS_VISUAL_MUTE = 1,
- NEVER_VISUAL_MUTE = 2
+ AV_RENDER_NORMALLY = 0,
+ AV_DO_NOT_RENDER = 1,
+ AV_ALWAYS_RENDER = 2
};
- void setVisualMuteSettings(VisualMuteSettings set) { mVisuallyMuteSetting = set; };
+ void setVisualMuteSettings(VisualMuteSettings set);
VisualMuteSettings getVisualMuteSettings() { return mVisuallyMuteSetting; };
U32 renderRigid();
@@ -406,12 +407,10 @@ public:
static void destroyGL();
static void restoreGL();
S32 mSpecialRenderMode; // special lighting
+
+ private:
S32 mAttachmentGeometryBytes; //number of bytes in attached geometry
F32 mAttachmentSurfaceArea; //estimated surface area of attachments
-
- S32 mReportedVisualComplexity; // Numbers as reported by the SL server
-
-private:
bool shouldAlphaMask();
BOOL mNeedsSkin; // avatar has been animated and verts have not been updated
@@ -420,11 +419,11 @@ private:
S32 mUpdatePeriod;
S32 mNumInitFaces; //number of faces generated when creating the avatar drawable, does not inculde splitted faces due to long vertex buffer.
- bool mCachedVisualMute; // cached return value for isVisuallyMuted()
- F64 mCachedVisualMuteUpdateTime; // Time to update mCachedVisualMute
+ // the isTooComplex method uses these mutable values to avoid recalculating too frequently
+ mutable U32 mVisualComplexity;
+ mutable bool mVisualComplexityStale;
+ U32 mReportedVisualComplexity; // from other viewers through the simulator
- bool mCachedInMuteList;
- F64 mCachedMuteListUpdateTime;
VisualMuteSettings mVisuallyMuteSetting; // Always or never visually mute this AV
@@ -467,6 +466,7 @@ private:
//--------------------------------------------------------------------
public:
BOOL isImpostor();
+ BOOL shouldImpostor(const U32 rank_factor = 1) const;
BOOL needsImpostorUpdate() const;
const LLVector3& getImpostorOffset() const;
const LLVector2& getImpostorDim() const;
@@ -701,7 +701,6 @@ private:
public:
BOOL isVisible() const;
void setVisibilityRank(U32 rank);
- U32 getVisibilityRank() const { return mVisibilityRank; } // unused
static S32 sNumVisibleAvatars; // Number of instances of this class
/** Appearance
** **
@@ -869,6 +868,8 @@ public:
private:
// set this property only with LLVOAvatar::sitDown method
BOOL mIsSitting;
+ // position backup in case of missing data
+ LLVector3 mLastRootPos;
/** Hierarchy
** **
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 1e9945b514..6871c0b06f 100755
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -38,6 +38,7 @@
#include "pipeline.h"
#include "llagent.h" // Get state values from here
+#include "llattachmentsmgr.h"
#include "llagentcamera.h"
#include "llagentwearables.h"
#include "llhudeffecttrail.h"
@@ -434,7 +435,7 @@ BOOL LLVOAvatarSelf::buildMenus()
++iter)
{
LLViewerJointAttachment* attachment = iter->second;
- if (attachment->getGroup() == i)
+ if (attachment && attachment->getGroup() == i)
{
LLMenuItemCallGL::Params item_params;
@@ -473,7 +474,7 @@ BOOL LLVOAvatarSelf::buildMenus()
++iter)
{
LLViewerJointAttachment* attachment = iter->second;
- if (attachment->getGroup() == i)
+ if (attachment && attachment->getGroup() == i)
{
LLMenuItemCallGL::Params item_params;
std::string sub_piemenu_name = attachment->getName();
@@ -506,7 +507,7 @@ BOOL LLVOAvatarSelf::buildMenus()
++iter)
{
LLViewerJointAttachment* attachment = iter->second;
- if (attachment->getGroup() == 8)
+ if (attachment && attachment->getGroup() == 8)
{
LLMenuItemCallGL::Params item_params;
std::string sub_piemenu_name = attachment->getName();
@@ -608,7 +609,7 @@ BOOL LLVOAvatarSelf::buildMenus()
++iter)
{
LLViewerJointAttachment* attachment = iter->second;
- if(attachment->getGroup() == group)
+ if(attachment && attachment->getGroup() == group)
{
// use multimap to provide a partial order off of the pie slice key
S32 pie_index = attachment->getPieSlice();
@@ -1118,44 +1119,6 @@ BOOL LLVOAvatarSelf::isWearingAttachment(const LLUUID& inv_item_id) const
}
//-----------------------------------------------------------------------------
-BOOL LLVOAvatarSelf::attachmentWasRequested(const LLUUID& inv_item_id) const
-{
- const F32 REQUEST_EXPIRATION_SECONDS = 5.0; // any request older than this is ignored/removed.
- std::map<LLUUID,LLTimer>::iterator it = mAttachmentRequests.find(inv_item_id);
- if (it != mAttachmentRequests.end())
- {
- const LLTimer& request_time = it->second;
- F32 request_time_elapsed = request_time.getElapsedTimeF32();
- if (request_time_elapsed > REQUEST_EXPIRATION_SECONDS)
- {
- mAttachmentRequests.erase(it);
- return FALSE;
- }
- else
- {
- return TRUE;
- }
- }
- else
- {
- return FALSE;
- }
-}
-
-//-----------------------------------------------------------------------------
-void LLVOAvatarSelf::addAttachmentRequest(const LLUUID& inv_item_id)
-{
- LLTimer current_time;
- mAttachmentRequests[inv_item_id] = current_time;
-}
-
-//-----------------------------------------------------------------------------
-void LLVOAvatarSelf::removeAttachmentRequest(const LLUUID& inv_item_id)
-{
- mAttachmentRequests.erase(inv_item_id);
-}
-
-//-----------------------------------------------------------------------------
// getWornAttachment()
//-----------------------------------------------------------------------------
LLViewerObject* LLVOAvatarSelf::getWornAttachment(const LLUUID& inv_item_id)
@@ -1221,8 +1184,6 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view
{
const LLUUID& attachment_id = viewer_object->getAttachmentItemID();
LLAppearanceMgr::instance().registerAttachment(attachment_id);
- // Clear any pending requests once the attachment arrives.
- removeAttachmentRequest(attachment_id);
updateLODRiggedAttachments();
}
@@ -1570,8 +1531,16 @@ BOOL LLVOAvatarSelf::isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex t
return LLVOAvatar::isTextureVisible(type);
}
- U32 index = gAgentWearables.getWearableIndex(wearable);
- return isTextureVisible(type,index);
+ U32 index;
+ if (gAgentWearables.getWearableIndex(wearable,index))
+ {
+ return isTextureVisible(type,index);
+ }
+ else
+ {
+ LL_WARNS() << "Wearable not found" << LL_ENDL;
+ return FALSE;
+ }
}
bool LLVOAvatarSelf::areTexturesCurrent() const
@@ -1916,7 +1885,7 @@ void LLVOAvatarSelf::dumpTotalLocalTextureByteCount()
LL_INFOS() << "Total Avatar LocTex GL:" << (gl_bytes/1024) << "KB" << LL_ENDL;
}
-BOOL LLVOAvatarSelf::getIsCloud() const
+bool LLVOAvatarSelf::getIsCloud() const
{
// Let people know why they're clouded without spamming them into oblivion.
bool do_warn = false;
@@ -1944,7 +1913,7 @@ BOOL LLVOAvatarSelf::getIsCloud() const
<< (skin_count ? "" : "SKIN ")
<< LL_ENDL;
}
- return TRUE;
+ return true;
}
if (!isTextureDefined(TEX_HAIR, 0))
@@ -1953,7 +1922,7 @@ BOOL LLVOAvatarSelf::getIsCloud() const
{
LL_INFOS() << "Self is clouded because of no hair texture" << LL_ENDL;
}
- return TRUE;
+ return true;
}
if (!mPreviousFullyLoaded)
@@ -1965,7 +1934,7 @@ BOOL LLVOAvatarSelf::getIsCloud() const
{
LL_INFOS() << "Self is clouded because lower textures not baked" << LL_ENDL;
}
- return TRUE;
+ return true;
}
if (!isLocalTextureDataAvailable(getLayerSet(BAKED_UPPER)) &&
@@ -1975,7 +1944,7 @@ BOOL LLVOAvatarSelf::getIsCloud() const
{
LL_INFOS() << "Self is clouded because upper textures not baked" << LL_ENDL;
}
- return TRUE;
+ return true;
}
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
@@ -1996,13 +1965,13 @@ BOOL LLVOAvatarSelf::getIsCloud() const
LL_INFOS() << "Self is clouded because texture at index " << i
<< " (texture index is " << texture_data.mTextureIndex << ") is not loaded" << LL_ENDL;
}
- return TRUE;
+ return true;
}
}
LL_DEBUGS() << "Avatar de-clouded" << LL_ENDL;
}
- return FALSE;
+ return false;
}
/*static*/
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index dc5e64d547..60afd43781 100755
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -109,6 +109,7 @@ private:
private:
LLUUID mInitialBakeIDs[6];
+ //bool mInitialBakesLoaded;
/********************************************************************************
@@ -132,7 +133,7 @@ public:
// Loading state
//--------------------------------------------------------------------
public:
- /*virtual*/ BOOL getIsCloud() const;
+ /*virtual*/ bool getIsCloud() const;
//--------------------------------------------------------------------
// Region state
@@ -291,19 +292,12 @@ protected:
public:
void updateAttachmentVisibility(U32 camera_mode);
BOOL isWearingAttachment(const LLUUID& inv_item_id) const;
- BOOL attachmentWasRequested(const LLUUID& inv_item_id) const;
- void addAttachmentRequest(const LLUUID& inv_item_id);
- void removeAttachmentRequest(const LLUUID& inv_item_id);
LLViewerObject* getWornAttachment(const LLUUID& inv_item_id);
bool getAttachedPointName(const LLUUID& inv_item_id, std::string& name) const;
/*virtual*/ const LLViewerJointAttachment *attachObject(LLViewerObject *viewer_object);
/*virtual*/ BOOL detachObject(LLViewerObject *viewer_object);
static BOOL detachAttachmentIntoInventory(const LLUUID& item_id);
-private:
- // Track attachments that have been requested but have not arrived yet.
- mutable std::map<LLUUID,LLTimer> mAttachmentRequests;
-
//--------------------------------------------------------------------
// HUDs
//--------------------------------------------------------------------
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 0432f6f27c..0143ffd269 100755
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -1624,6 +1624,66 @@ static LLTrace::BlockTimerStatHandle FTM_GEN_FLEX("Generate Flexies");
static LLTrace::BlockTimerStatHandle FTM_UPDATE_PRIMITIVES("Update Primitives");
static LLTrace::BlockTimerStatHandle FTM_UPDATE_RIGGED_VOLUME("Update Rigged");
+bool LLVOVolume::lodOrSculptChanged(LLDrawable *drawable, BOOL &compiled)
+{
+ bool regen_faces = false;
+
+ LLVolume *old_volumep, *new_volumep;
+ F32 old_lod, new_lod;
+ S32 old_num_faces, new_num_faces;
+
+ old_volumep = getVolume();
+ old_lod = old_volumep->getDetail();
+ old_num_faces = old_volumep->getNumFaces();
+ old_volumep = NULL;
+
+ {
+ LL_RECORD_BLOCK_TIME(FTM_GEN_VOLUME);
+ const LLVolumeParams &volume_params = getVolume()->getParams();
+ setVolume(volume_params, 0);
+ }
+
+ new_volumep = getVolume();
+ new_lod = new_volumep->getDetail();
+ new_num_faces = new_volumep->getNumFaces();
+ new_volumep = NULL;
+
+ if ((new_lod != old_lod) || mSculptChanged)
+ {
+ compiled = TRUE;
+ sNumLODChanges += new_num_faces;
+
+ if ((S32)getNumTEs() != getVolume()->getNumFaces())
+ {
+ setNumTEs(getVolume()->getNumFaces()); //mesh loading may change number of faces.
+ }
+
+ drawable->setState(LLDrawable::REBUILD_VOLUME); // for face->genVolumeTriangles()
+
+ {
+ LL_RECORD_BLOCK_TIME(FTM_GEN_TRIANGLES);
+ regen_faces = new_num_faces != old_num_faces || mNumFaces != (S32)getNumTEs();
+ if (regen_faces)
+ {
+ regenFaces();
+ }
+
+ if (mSculptChanged)
+ { //changes in sculpt maps can thrash an object bounding box without
+ //triggering a spatial group bounding box update -- force spatial group
+ //to update bounding boxes
+ LLSpatialGroup* group = mDrawable->getSpatialGroup();
+ if (group)
+ {
+ group->unbound();
+ }
+ }
+ }
+ }
+
+ return regen_faces;
+}
+
BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)
{
LL_RECORD_BLOCK_TIME(FTM_UPDATE_PRIMITIVES);
@@ -1664,83 +1724,35 @@ BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)
return TRUE; // No update to complete
}
- if (mVolumeChanged || mFaceMappingChanged )
+ if (mVolumeChanged || mFaceMappingChanged)
{
dirtySpatialGroup(drawable->isState(LLDrawable::IN_REBUILD_Q1));
- compiled = TRUE;
+ bool was_regen_faces = false;
if (mVolumeChanged)
{
- LL_RECORD_BLOCK_TIME(FTM_GEN_VOLUME);
- LLVolumeParams volume_params = getVolume()->getParams();
- setVolume(volume_params, 0);
+ was_regen_faces = lodOrSculptChanged(drawable, compiled);
drawable->setState(LLDrawable::REBUILD_VOLUME);
}
-
+ else if (mSculptChanged || mLODChanged)
{
+ compiled = TRUE;
+ was_regen_faces = lodOrSculptChanged(drawable, compiled);
+ }
+
+ if (!was_regen_faces) {
LL_RECORD_BLOCK_TIME(FTM_GEN_TRIANGLES);
regenFaces();
- genBBoxes(FALSE);
}
+
+ genBBoxes(FALSE);
}
- else if ((mLODChanged) || (mSculptChanged))
+ else if (mLODChanged || mSculptChanged)
{
dirtySpatialGroup(drawable->isState(LLDrawable::IN_REBUILD_Q1));
-
- LLVolume *old_volumep, *new_volumep;
- F32 old_lod, new_lod;
- S32 old_num_faces, new_num_faces ;
-
- old_volumep = getVolume();
- old_lod = old_volumep->getDetail();
- old_num_faces = old_volumep->getNumFaces() ;
- old_volumep = NULL ;
-
- {
- LL_RECORD_BLOCK_TIME(FTM_GEN_VOLUME);
- LLVolumeParams volume_params = getVolume()->getParams();
- setVolume(volume_params, 0);
- }
-
- new_volumep = getVolume();
- new_lod = new_volumep->getDetail();
- new_num_faces = new_volumep->getNumFaces() ;
- new_volumep = NULL ;
-
- if ((new_lod != old_lod) || mSculptChanged)
- {
- compiled = TRUE;
- sNumLODChanges += new_num_faces ;
-
- if((S32)getNumTEs() != getVolume()->getNumFaces())
- {
- setNumTEs(getVolume()->getNumFaces()); //mesh loading may change number of faces.
- }
-
- drawable->setState(LLDrawable::REBUILD_VOLUME); // for face->genVolumeTriangles()
-
- {
- LL_RECORD_BLOCK_TIME(FTM_GEN_TRIANGLES);
- if (new_num_faces != old_num_faces || mNumFaces != (S32)getNumTEs())
- {
- regenFaces();
- }
- genBBoxes(FALSE);
-
- if (mSculptChanged)
- { //changes in sculpt maps can thrash an object bounding box without
- //triggering a spatial group bounding box update -- force spatial group
- //to update bounding boxes
- LLSpatialGroup* group = mDrawable->getSpatialGroup();
- if (group)
- {
- group->unbound();
- }
- }
- }
- }
-
+ compiled = TRUE;
+ lodOrSculptChanged(drawable, compiled);
genBBoxes(FALSE);
}
// it has its own drawable (it's moved) or it has changed UVs or it has changed xforms from global<->local
@@ -2010,7 +2022,7 @@ void LLVOVolume::setTEMaterialParamsCallbackTE(const LLUUID& objectID, const LLM
LLTextureEntry* texture_entry = pVol->getTE(te);
if (texture_entry && (texture_entry->getMaterialID() == pMaterialID))
{
- pVol->setTEMaterialParams(te, pMaterialParams);
+ pVol->setTEMaterialParams(te, pMaterialParams, FALSE);
}
}
}
@@ -2081,7 +2093,7 @@ bool LLVOVolume::notifyAboutCreatingTexture(LLViewerTexture *texture)
for(map_te_material::const_iterator it = new_material.begin(), end = new_material.end(); it != end; ++it)
{
LLMaterialMgr::getInstance()->put(getID(), it->first, *it->second);
- LLViewerObject::setTEMaterialParams(it->first, it->second);
+ LLViewerObject::setTEMaterialParams(it->first, it->second, FALSE);
}
//clear wait-list
@@ -2158,7 +2170,7 @@ bool LLVOVolume::notifyAboutMissingAsset(LLViewerTexture *texture)
for(map_te_material::const_iterator it = new_material.begin(), end = new_material.end(); it != end; ++it)
{
LLMaterialMgr::getInstance()->put(getID(), it->first, *it->second);
- LLViewerObject::setTEMaterialParams(it->first, it->second);
+ LLViewerObject::setTEMaterialParams(it->first, it->second, FALSE);
}
//clear wait-list
@@ -2167,7 +2179,7 @@ bool LLVOVolume::notifyAboutMissingAsset(LLViewerTexture *texture)
return 0 != new_material.size();
}
-S32 LLVOVolume::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams)
+S32 LLVOVolume::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams, bool isInitFromServer)
{
LLMaterialPtr pMaterial = const_cast<LLMaterialPtr&>(pMaterialParams);
@@ -2264,7 +2276,7 @@ S32 LLVOVolume::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialPa
}
}
- S32 res = LLViewerObject::setTEMaterialParams(te, pMaterial);
+ S32 res = LLViewerObject::setTEMaterialParams(te, pMaterial, isInitFromServer);
LL_DEBUGS("MaterialTEs") << "te " << (S32)te << " material " << ((pMaterial) ? pMaterial->asLLSD() : LLSD("null")) << " res " << res
<< ( LLSelectMgr::getInstance()->getSelection()->contains(const_cast<LLVOVolume*>(this), te) ? " selected" : " not selected" )
@@ -3343,6 +3355,13 @@ const LLMatrix4 LLVOVolume::getRenderMatrix() const
// children, and cost should only be increased for unique textures -Nyx
U32 LLVOVolume::getRenderCost(texture_cost_t &textures) const
{
+ /*****************************************************************
+ * This calculation should not be modified by third party viewers,
+ * since it is used to limit rendering and should be uniform for
+ * everyone. If you have suggested improvements, submit them to
+ * the official viewer for consideration.
+ *****************************************************************/
+
// Get access to params we'll need at various points.
// Skip if this is object doesn't have a volume (e.g. is an avatar).
BOOL has_volume = (getVolume() != NULL);
@@ -4163,7 +4182,7 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons
}
//build matrix palette
- static const size_t kMaxJoints = 64;
+ static const size_t kMaxJoints = 52;
LLMatrix4a mp[kMaxJoints];
LLMatrix4* mat = (LLMatrix4*) mp;
@@ -4172,6 +4191,12 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons
for (U32 j = 0; j < maxJoints; ++j)
{
LLJoint* joint = avatar->getJoint(skin->mJointNames[j]);
+ if (!joint)
+ {
+ // Fall back to a point inside the avatar if mesh is
+ // rigged to an unknown joint.
+ joint = avatar->getJoint("mPelvis");
+ }
if (joint)
{
mat[j] = skin->mInvBindMatrix[j];
@@ -4216,8 +4241,9 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons
wght[k] = w - floorf(w);
scale += wght[k];
}
-
- wght *= 1.f/scale;
+ // This is enforced in unpackVolumeFaces()
+ llassert(scale>0.f);
+ wght *= 1.f / scale;
for (U32 k = 0; k < 4; k++)
{
@@ -4225,9 +4251,9 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons
LLMatrix4a src;
// Insure ref'd bone is in our clamped array of mats
- llassert(idx[k] < kMaxJoints);
- // clamp k to kMaxJoints to avoid reading garbage off stack in release
- src.setMul(mp[idx[(k < kMaxJoints) ? k : 0]], w);
+ // clamp idx to maxJoints to avoid reading garbage off stack in release
+ S32 index = llclamp((S32)idx[k],(S32)0,(S32)kMaxJoints-1);
+ src.setMul(mp[index], w);
final_mat.add(src);
}
@@ -4703,10 +4729,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
if (pAvatarVO)
{
- pAvatarVO->mAttachmentGeometryBytes -= group->mGeometryBytes;
- pAvatarVO->mAttachmentGeometryBytes = llmax(pAvatarVO->mAttachmentGeometryBytes, 0);
- pAvatarVO->mAttachmentSurfaceArea -= group->mSurfaceArea;
- pAvatarVO->mAttachmentSurfaceArea = llmax(pAvatarVO->mAttachmentSurfaceArea, 0.f);
+ pAvatarVO->subtractAttachmentSizes( group->mGeometryBytes, group->mSurfaceArea );
}
group->mGeometryBytes = 0;
@@ -5260,24 +5283,9 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
if (pAvatarVO)
{
- if (pAvatarVO->mAttachmentGeometryBytes < 0)
- { // First time through value is -1
- pAvatarVO->mAttachmentGeometryBytes = group->mGeometryBytes;
- }
- else
- {
- pAvatarVO->mAttachmentGeometryBytes += group->mGeometryBytes;
- }
- if (pAvatarVO->mAttachmentSurfaceArea < 0.f)
- { // First time through value is -1
- pAvatarVO->mAttachmentSurfaceArea = group->mSurfaceArea;
- }
- else
- {
- pAvatarVO->mAttachmentSurfaceArea += group->mSurfaceArea;
+ pAvatarVO->addAttachmentSizes( group->mGeometryBytes, group->mSurfaceArea );
}
}
-}
static LLTrace::BlockTimerStatHandle FTM_REBUILD_MESH_FLUSH("Flush Mesh");
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index bbaca316b0..ff7438ac09 100755
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -192,7 +192,7 @@ public:
static void setTEMaterialParamsCallbackTE(const LLUUID& objectID, const LLMaterialID& pMaterialID, const LLMaterialPtr pMaterialParams, U32 te);
- /*virtual*/ S32 setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams);
+ /*virtual*/ S32 setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams, bool isInitFromServer);
/*virtual*/ S32 setTEScale(const U8 te, const F32 s, const F32 t);
/*virtual*/ S32 setTEScaleS(const U8 te, const F32 s);
/*virtual*/ S32 setTEScaleT(const U8 te, const F32 t);
@@ -339,6 +339,10 @@ protected:
void cleanUpMediaImpls();
void addMediaImpl(LLViewerMediaImpl* media_impl, S32 texture_index) ;
void removeMediaImpl(S32 texture_index) ;
+
+private:
+ bool lodOrSculptChanged(LLDrawable *drawable, BOOL &compiled);
+
public:
static S32 getRenderComplexityMax() {return mRenderComplexity_last;}
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index fac0fd63ee..1c3808ce68 100755
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -124,7 +124,7 @@ void LLPanelWearableOutfitItem::updateItem(const std::string& name,
// We don't use get_is_item_worn() here because this update is triggered by
// an inventory observer upon link in COF beind added or removed so actual
// worn status of a linked item may still remain unchanged.
- if (mWornIndicationEnabled && LLAppearanceMgr::instance().isLinkInCOF(mInventoryItemUUID))
+ if (mWornIndicationEnabled && LLAppearanceMgr::instance().isLinkedInCOF(mInventoryItemUUID))
{
search_label += LLTrans::getString("worn");
item_state = IS_WORN;
@@ -894,13 +894,13 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
setMenuItemVisible(menu, "wear_wear", n_already_worn == 0 && n_worn == 0 && can_be_worn);
setMenuItemEnabled(menu, "wear_wear", n_already_worn == 0 && n_worn == 0);
setMenuItemVisible(menu, "wear_add", wear_add_visible);
- setMenuItemEnabled(menu, "wear_add", canAddWearables(ids));
+ setMenuItemEnabled(menu, "wear_add", LLAppearanceMgr::instance().canAddWearables(ids));
setMenuItemVisible(menu, "wear_replace", n_worn == 0 && n_already_worn != 0 && can_be_worn);
//visible only when one item selected and this item is worn
setMenuItemVisible(menu, "edit", !standalone && mask & (MASK_CLOTHING|MASK_BODYPART) && n_worn == n_items && n_worn == 1);
setMenuItemEnabled(menu, "edit", n_editable == 1 && n_worn == 1 && n_items == 1);
setMenuItemVisible(menu, "create_new", mask & (MASK_CLOTHING|MASK_BODYPART) && n_items == 1);
- setMenuItemEnabled(menu, "create_new", canAddWearables(ids));
+ setMenuItemEnabled(menu, "create_new", LLAppearanceMgr::instance().canAddWearables(ids));
setMenuItemVisible(menu, "show_original", !standalone);
setMenuItemEnabled(menu, "show_original", n_items == 1 && n_links == n_items);
setMenuItemVisible(menu, "take_off", mask == MASK_CLOTHING && n_worn == n_items);
@@ -1004,65 +1004,4 @@ void LLWearableItemsList::ContextMenu::createNewWearable(const LLUUID& item_id)
LLAgentWearables::createWearable(item->getWearableType(), true);
}
-// Returns true if all the given objects and clothes can be added.
-// static
-bool LLWearableItemsList::ContextMenu::canAddWearables(const uuid_vec_t& item_ids)
-{
- // TODO: investigate wearables may not be loaded at this point EXT-8231
-
- U32 n_objects = 0;
- boost::unordered_map<LLWearableType::EType, U32> clothes_by_type;
-
- // Count given clothes (by wearable type) and objects.
- for (uuid_vec_t::const_iterator it = item_ids.begin(); it != item_ids.end(); ++it)
- {
- LLViewerInventoryItem* item = gInventory.getItem(*it);
- if (!item)
- {
- return false;
- }
-
- if (item->getType() == LLAssetType::AT_OBJECT)
- {
- ++n_objects;
- }
- else if (item->getType() == LLAssetType::AT_CLOTHING)
- {
- ++clothes_by_type[item->getWearableType()];
- }
- else
- {
- LL_WARNS() << "Unexpected wearable type" << LL_ENDL;
- return false;
- }
- }
-
- // Check whether we can add all the objects.
- if (!isAgentAvatarValid() || !gAgentAvatarp->canAttachMoreObjects(n_objects))
- {
- return false;
- }
-
- // Check whether we can add all the clothes.
- boost::unordered_map<LLWearableType::EType, U32>::const_iterator m_it;
- for (m_it = clothes_by_type.begin(); m_it != clothes_by_type.end(); ++m_it)
- {
- LLWearableType::EType w_type = m_it->first;
- U32 n_clothes = m_it->second;
-
- U32 wearable_count = gAgentWearables.getWearableCount(w_type);
- if ((wearable_count > 0) && !LLWearableType::getAllowMultiwear(w_type))
- {
- return false;
- }
- if ((wearable_count + n_clothes) > LLAgentWearables::MAX_CLOTHING_PER_TYPE)
- {
- return false;
- }
-
- }
-
- return true;
-}
-
// EOF
diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h
index c731a7d6cf..e6788ab249 100755
--- a/indra/newview/llwearableitemslist.h
+++ b/indra/newview/llwearableitemslist.h
@@ -429,7 +429,6 @@ public:
static void setMenuItemEnabled(LLContextMenu* menu, const std::string& name, bool val);
static void updateMask(U32& mask, LLAssetType::EType at);
static void createNewWearable(const LLUUID& item_id);
- static bool canAddWearables(const uuid_vec_t& item_ids);
LLWearableItemsList* mParent;
};
diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp
index bfae142812..837b30586b 100755
--- a/indra/newview/llworldmap.cpp
+++ b/indra/newview/llworldmap.cpp
@@ -383,6 +383,7 @@ void LLWorldMap::reloadItems(bool force)
LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_MATURE_EVENT);
LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_ADULT_EVENT);
LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_LAND_FOR_SALE);
+ LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_LAND_FOR_SALE_ADULT);
}
}
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 03712c1065..46e25b8b04 100755
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -569,7 +569,7 @@ void LLPipeline::init()
connectRefreshCachedSettingsSafe("RenderAutoMaskAlphaDeferred");
connectRefreshCachedSettingsSafe("RenderAutoMaskAlphaNonDeferred");
connectRefreshCachedSettingsSafe("RenderUseFarClip");
- connectRefreshCachedSettingsSafe("RenderAvatarMaxVisible");
+ connectRefreshCachedSettingsSafe("RenderAvatarMaxNonImpostors");
connectRefreshCachedSettingsSafe("RenderDelayVBUpdate");
connectRefreshCachedSettingsSafe("UseOcclusion");
connectRefreshCachedSettingsSafe("VertexShaderEnable");
@@ -1081,7 +1081,8 @@ void LLPipeline::refreshCachedSettings()
LLPipeline::sAutoMaskAlphaDeferred = gSavedSettings.getBOOL("RenderAutoMaskAlphaDeferred");
LLPipeline::sAutoMaskAlphaNonDeferred = gSavedSettings.getBOOL("RenderAutoMaskAlphaNonDeferred");
LLPipeline::sUseFarClip = gSavedSettings.getBOOL("RenderUseFarClip");
- LLVOAvatar::sMaxVisible = (U32)gSavedSettings.getS32("RenderAvatarMaxVisible");
+ LLVOAvatar::sMaxNonImpostors = gSavedSettings.getU32("RenderAvatarMaxNonImpostors");
+ LLVOAvatar::updateImpostorRendering(LLVOAvatar::sMaxNonImpostors);
LLPipeline::sDelayVBUpdate = gSavedSettings.getBOOL("RenderDelayVBUpdate");
LLPipeline::sUseOcclusion =
@@ -11303,16 +11304,25 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
if (!avatar || !avatar->mDrawable)
{
+ LL_WARNS_ONCE("AvatarRenderPipeline") << "Avatar is " << (avatar ? "not drawable" : "null") << LL_ENDL;
return;
}
+ LL_DEBUGS_ONCE("AvatarRenderPipeline") << "Avatar " << avatar->getID() << " is drawable" << LL_ENDL;
assertInitialized();
bool visually_muted = avatar->isVisuallyMuted();
+ LL_DEBUGS_ONCE("AvatarRenderPipeline") << "Avatar " << avatar->getID()
+ << " is " << ( visually_muted ? "" : "not ") << "visually muted"
+ << LL_ENDL;
+ bool too_complex = avatar->isTooComplex();
+ LL_DEBUGS_ONCE("AvatarRenderPipeline") << "Avatar " << avatar->getID()
+ << " is " << ( too_complex ? "" : "not ") << "too complex"
+ << LL_ENDL;
pushRenderTypeMask();
- if (visually_muted)
+ if (visually_muted || too_complex)
{
andRenderTypeMask(LLPipeline::RENDER_TYPE_AVATAR, END_RENDER_TYPES);
}
@@ -11357,7 +11367,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
{
LL_RECORD_BLOCK_TIME(FTM_IMPOSTOR_MARK_VISIBLE);
markVisible(avatar->mDrawable, *viewer_camera);
- LLVOAvatar::sUseImpostors = FALSE;
+ LLVOAvatar::sUseImpostors = false; // @TODO ???
LLVOAvatar::attachment_map_t::iterator iter;
for (iter = avatar->mAttachmentPoints.begin();
@@ -11470,7 +11480,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
F32 old_alpha = LLDrawPoolAvatar::sMinimumAlpha;
- if (visually_muted)
+ if (visually_muted || too_complex)
{ //disable alpha masking for muted avatars (get whole skin silhouette)
LLDrawPoolAvatar::sMinimumAlpha = 0.f;
}
@@ -11532,7 +11542,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
LLGLDisable blend(GL_BLEND);
- if (visually_muted)
+ if (visually_muted || too_complex)
{
gGL.setColorMask(true, true);
}
@@ -11561,13 +11571,16 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
}
- if (LLMuteList::getInstance()->isMuted(avatar->getID()))
- { //grey muted avatar
- gGL.diffuseColor4ub(64,64,64,255);
+ if (visually_muted)
+ { // Visually muted avatar
+ LLColor4 muted_color(avatar->getMutedAVColor());
+ LL_DEBUGS_ONCE("AvatarRenderPipeline") << "Avatar " << avatar->getID() << " MUTED set solid color " << muted_color << LL_ENDL;
+ gGL.diffuseColor4fv( muted_color.mV );
}
else
- { // Visually muted avatar
- gGL.diffuseColor4fv( avatar->getMutedAVColor().mV );
+ { //grey muted avatar
+ LL_DEBUGS_ONCE("AvatarRenderPipeline") << "Avatar " << avatar->getID() << " MUTED set grey" << LL_ENDL;
+ gGL.diffuseColor4fv(LLColor4::pink.mV );
}
{
@@ -11594,7 +11607,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
avatar->setImpostorDim(tdim);
- LLVOAvatar::sUseImpostors = TRUE;
+ LLVOAvatar::sUseImpostors = true; // @TODO ???
sUseOcclusion = occlusion;
sReflectionRender = FALSE;
sImpostorRender = FALSE;
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index ce2f4b17b1..869fe6ffae 100755
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -518,7 +518,7 @@ public:
RENDER_DEBUG_BATCH_SIZE = 0x00004000,
RENDER_DEBUG_ALPHA_BINS = 0x00008000,
RENDER_DEBUG_RAYCAST = 0x00010000,
- RENDER_DEBUG_SHAME = 0x00020000,
+ RENDER_DEBUG_AVATAR_DRAW_INFO = 0x00020000,
RENDER_DEBUG_SHADOW_FRUSTA = 0x00040000,
RENDER_DEBUG_SCULPTED = 0x00080000,
RENDER_DEBUG_AVATAR_VOLUME = 0x00100000,
diff --git a/indra/newview/roles_constants.h b/indra/newview/roles_constants.h
index 8fd7978fa1..24792dd731 100644
--- a/indra/newview/roles_constants.h
+++ b/indra/newview/roles_constants.h
@@ -145,6 +145,9 @@ const U64 GP_SESSION_JOIN = 0x1LL << 16; //can join session
const U64 GP_SESSION_VOICE = 0x1LL << 27; //can hear/talk
const U64 GP_SESSION_MODERATOR = 0x1LL << 37; //can mute people's session
+const U64 GP_EXPERIENCE_ADMIN = 0x1LL << 49; // has admin rights to any experiences owned by this group
+const U64 GP_EXPERIENCE_CREATOR = 0x1LL << 50; // can sign scripts for experiences owned by this group
+
// Group Banning
const U64 GP_GROUP_BAN_ACCESS = 0x1LL << 51; // Allows access to ban / un-ban agents from a group.
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index bdc884885f..8533625e50 100755
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -873,8 +873,11 @@
<color
name="ToolbarDropZoneColor"
value=".48 .69 1 .5" />
-
- <!-- Generic color names (legacy) -->
+ <color
+ name="PanelNotificationListItem"
+ value="0.3 0.3 0.3 .3" />
+
+ <!-- Generic color names (legacy) -->
<color
name="white"
value="1 1 1 1"/>
diff --git a/indra/newview/skins/default/textures/icons/Icon_Attachment_Large.png b/indra/newview/skins/default/textures/icons/Icon_Attachment_Large.png
new file mode 100644
index 0000000000..0732a33d93
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Icon_Attachment_Large.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Icon_Attachment_Small.png b/indra/newview/skins/default/textures/icons/Icon_Attachment_Small.png
new file mode 100644
index 0000000000..8124554902
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Icon_Attachment_Small.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Icon_Notification_Condense.png b/indra/newview/skins/default/textures/icons/Icon_Notification_Condense.png
new file mode 100644
index 0000000000..4d245eb57a
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Icon_Notification_Condense.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Icon_Notification_Expand.png b/indra/newview/skins/default/textures/icons/Icon_Notification_Expand.png
new file mode 100644
index 0000000000..186822da43
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Icon_Notification_Expand.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_StockFolderClosed.png b/indra/newview/skins/default/textures/icons/Inv_StockFolderClosed.png
new file mode 100644
index 0000000000..4dc484dc22
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_StockFolderClosed.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_StockFolderOpen.png b/indra/newview/skins/default/textures/icons/Inv_StockFolderOpen.png
new file mode 100644
index 0000000000..0d140b56a7
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_StockFolderOpen.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_VersionFolderClosed.png b/indra/newview/skins/default/textures/icons/Inv_VersionFolderClosed.png
new file mode 100644
index 0000000000..e89a4d7f31
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_VersionFolderClosed.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_VersionFolderOpen.png b/indra/newview/skins/default/textures/icons/Inv_VersionFolderOpen.png
new file mode 100644
index 0000000000..659d7d392f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_VersionFolderOpen.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Presets_Icon.png b/indra/newview/skins/default/textures/icons/Presets_Icon.png
new file mode 100644
index 0000000000..5a6628816b
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Presets_Icon.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/System_Notification_Large.png b/indra/newview/skins/default/textures/icons/System_Notification_Large.png
new file mode 100644
index 0000000000..434ce3e8b6
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/System_Notification_Large.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/System_Notification_Small.png b/indra/newview/skins/default/textures/icons/System_Notification_Small.png
new file mode 100644
index 0000000000..027a8446d8
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/System_Notification_Small.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 9c2d55e7b4..72037a84b3 100755
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -140,6 +140,7 @@ with the same filename but different name
<texture name="Command_Inventory_Icon" file_name="toolbar_icons/inventory.png" preload="true" />
<texture name="Command_Map_Icon" file_name="toolbar_icons/map.png" preload="true" />
<texture name="Command_Marketplace_Icon" file_name="toolbar_icons/marketplace.png" preload="true" />
+ <texture name="Command_MktListings_Icon" file_name="toolbar_icons/mktlistings.png" preload="true" />
<texture name="Command_MiniCart_Icon" file_name="toolbar_icons/mini_cart.png" preload="true" />
<texture name="Command_MiniMap_Icon" file_name="toolbar_icons/mini_map.png" preload="true" />
<texture name="Command_Move_Icon" file_name="toolbar_icons/move.png" preload="true" />
@@ -204,6 +205,8 @@ with the same filename but different name
<texture name="Facebook_Icon" file_name="icons/Facebook.png" preload="false" />
+ <texture name="Presets_Icon" file_name="icons/Presets_Icon.png" preload="true" />
+
<texture name="Favorite_Star_Active" file_name="navbar/Favorite_Star_Active.png" preload="false" />
<texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" />
<texture name="Favorite_Star_Press" file_name="navbar/Favorite_Star_Press.png" preload="false" />
@@ -222,6 +225,7 @@ with the same filename but different name
<texture name="ForwardArrow_Off" file_name="icons/ForwardArrow_Off.png" preload="false" />
<texture name="ForwardArrow_Press" file_name="icons/ForwardArrow_Press.png" preload="false" />
+ <texture name="Generic_Experience" file_name="Blank.png" preload="false" />
<texture name="Generic_Group" file_name="icons/Generic_Group.png" preload="false" />
<texture name="Generic_Group_Large" file_name="icons/Generic_Group_Large.png" preload="false" />
<texture name="icon_group.tga" file_name="icons/Generic_Group.png" preload="false" />
@@ -305,6 +309,8 @@ with the same filename but different name
<texture name="Inv_Snapshot" file_name="icons/Inv_Snapshot.png" preload="false" />
<texture name="Inv_Socks" file_name="icons/Inv_Socks.png" preload="false" />
<texture name="Inv_Sound" file_name="icons/Inv_Sound.png" preload="false" />
+ <texture name="Inv_StockFolderClosed" file_name="icons/Inv_StockFolderClosed.png" preload="false" />
+ <texture name="Inv_StockFolderOpen" file_name="icons/Inv_StockFolderOpen.png" preload="false" />
<texture name="Inv_SysClosed" file_name="icons/Inv_SysClosed.png" preload="false" />
<texture name="Inv_SysOpen" file_name="icons/Inv_SysOpen.png" preload="false" />
<texture name="Inv_Tattoo" file_name="icons/Inv_Tattoo.png" preload="false" />
@@ -316,6 +322,8 @@ with the same filename but different name
<texture name="Inv_Undershirt" file_name="icons/Inv_Undershirt.png" preload="false" />
<texture name="Inv_Link" file_name="icons/Inv_Link.png" preload="false" />
<texture name="Inv_Invalid" file_name="icons/Inv_Invalid.png" preload="false" />
+ <texture name="Inv_VersionFolderClosed" file_name="icons/Inv_VersionFolderClosed.png" preload="false" />
+ <texture name="Inv_VersionFolderOpen" file_name="icons/Inv_VersionFolderOpen.png" preload="false" />
<texture name="Linden_Dollar_Alert" file_name="widgets/Linden_Dollar_Alert.png"/>
<texture name="Linden_Dollar_Background" file_name="widgets/Linden_Dollar_Background.png"/>
@@ -333,6 +341,7 @@ with the same filename but different name
<texture name="Map_Placeholder_Icon" file_name="icons/map_placeholder.png" preload="true" />
+ <texture name="Marketplace_Dropzone_Background" file_name="widgets/Marketplace_Dropzone_Background.png" preload="true" />
<texture name="MarketplaceBtn_Off" file_name="widgets/MarketplaceBtn_Off.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" />
<texture name="MarketplaceBtn_Selected" file_name="widgets/MarketplaceBtn_Selected.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" />
@@ -797,4 +806,9 @@ with the same filename but different name
<texture name="Camera_Drag_Dot" file_name="world/CameraDragDot.png"/>
<texture name="NavBar Separator" file_name="navbar/separator.png"/>
+ <texture name="Notification_Condense" file_name="icons/Icon_Notification_Condense.png" preload="true"/>
+ <texture name="Notification_Expand" file_name="icons/Icon_Notification_Expand.png" preload="true"/>
+ <texture name="System_Notification" file_name="icons/SL_Logo.png" preload="true"/>
+ <texture name="Icon_Attachment_Small" file_name="icons/Icon_Attachment_Small.png" preload="true"/>
+ <texture name="Icon_Attachment_Large" file_name="icons/Icon_Attachment_Large.png" preload="true"/>
</textures>
diff --git a/indra/newview/skins/default/textures/toolbar_icons/mktlistings.png b/indra/newview/skins/default/textures/toolbar_icons/mktlistings.png
new file mode 100644
index 0000000000..a6f90461d7
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/mktlistings.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Marketplace_Dropzone_Background.png b/indra/newview/skins/default/textures/widgets/Marketplace_Dropzone_Background.png
new file mode 100644
index 0000000000..9478f7b813
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/Marketplace_Dropzone_Background.png
Binary files differ
diff --git a/indra/newview/skins/default/xui/da/menu_viewer.xml b/indra/newview/skins/default/xui/da/menu_viewer.xml
index aa6bc53672..299322001b 100755
--- a/indra/newview/skins/default/xui/da/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/da/menu_viewer.xml
@@ -37,7 +37,7 @@
<menu_item_separator/>
<menu_item_call label="Profil for sted" name="Place Profile"/>
<menu_item_call label="Om land" name="About Land"/>
- <menu_item_call label="Region/Estate" name="Region/Estate"/>
+ <menu_item_call label="Region/Estate" name="RegionEstate"/>
<menu_item_call label="Køb dette land" name="Buy Land"/>
<menu_item_call label="Mit land" name="My Land"/>
<menu label="Vis" name="LandShow">
diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml
index 33b876bdb9..aad3b9d062 100755
--- a/indra/newview/skins/default/xui/da/notifications.xml
+++ b/indra/newview/skins/default/xui/da/notifications.xml
@@ -1311,9 +1311,6 @@ Prøv igen om lidt.
<notification name="NoValidCircuit">
Ingen gyldig kode for kredsløb.
</notification>
- <notification name="NoValidTimestamp">
- Ikke et gyldigt klokkeslæt.
- </notification>
<notification name="NoPendingConnection">
Kunne ikke skabe fast forbindelse.
</notification>
diff --git a/indra/newview/skins/default/xui/de/floater_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml
index bc0eae7c5d..ee631476cb 100755
--- a/indra/newview/skins/default/xui/de/floater_about.xml
+++ b/indra/newview/skins/default/xui/de/floater_about.xml
@@ -1,74 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="INFO ÜBER [CAPITALIZED_APP_NAME]">
- <floater.string name="AboutHeader">
- [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
-[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
- </floater.string>
- <floater.string name="AboutCompiler">
- Kompiliert mit [COMPILER] version [COMPILER_VERSION]
- </floater.string>
- <floater.string name="AboutPosition">
- Sie befinden sich an [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] auf &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
-SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
-(globale Koordinaten [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
-[SERVER_VERSION]
-[SERVER_RELEASE_NOTES_URL]
- </floater.string>
- <floater.string name="AboutSystem">
- CPU: [CPU]
-Speicher: [MEMORY_MB] MB
-Betriebssystem, Version: [OS_VERSION]
-Grafikkarten-Hersteller: [GRAPHICS_CARD_VENDOR]
-Grafikkarten: [GRAPHICS_CARD]
- </floater.string>
- <floater.string name="AboutDriver">
- Windows Grafiktreiber-Version: [GRAPHICS_DRIVER_VERSION]
- </floater.string>
- <floater.string name="AboutLibs">
- OpenGL Version: [OPENGL_VERSION]
-
-libcurl-Version: [LIBCURL_VERSION]
-J2C-Decoderversion: [J2C_VERSION]
-Audio-Treiberversion: [AUDIO_DRIVER_VERSION]
-Qt Webkit-Version: [QT_WEBKIT_VERSION]
-Voice-Serverversion: [VOICE_VERSION]
- </floater.string>
- <floater.string name="none">
- (keiner)
- </floater.string>
- <floater.string name="AboutTraffic">
- Paketverlust: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
- </floater.string>
- <floater.string name="ErrorFetchingServerReleaseNotesURL">
- Fehler beim Abrufen der URL für die Server-Versionshinweise.
- </floater.string>
<tab_container name="about_tab">
<panel label="Info" name="support_panel">
<button label="In Zwischenablage kopieren" name="copy_btn"/>
</panel>
<panel label="Danksagung" name="credits_panel">
- <text name="linden_intro">
- Second Life wird präsentiert von den Lindens:
- </text>
- <text_editor name="linden_names">
- Philip, Andrew, Doug, Richard, Phoenix, Ian, Mark, Robin, Dan, Char, Ryan, Eric, Jim, Lee, Jeff, Michael, Kelly, Steve, Catherine, Bub, Ramzi, Jill, Jeska, Don, Kona, Callum, Charity, Jack, Shawn, babbage, James, Lauren, Blue, Brent, Reuben, Pathfinder, Jesse, Patsy, Torley, Bo, Cyn, Jonathan, Gia, Annette, Ginsu, Harry, Lex, Runitai, Guy, Cornelius, Beth, Swiss, Thumper, Wendy, Teeple, Seth, Dee, Mia, Sally, Liana, Aura, Beez, Milo, Red, Gulliver, Marius, Joe, Jose, Dore, Justin, Nora, Morpheus, Lexie, Amber, Chris, Xan, Leyla, Walker, Sabin, Joshua, Hiromi, Tofu, Fritz, June, Jean, Ivy, Dez, Ken, Betsy, Which, Spike, Rob, Zee, Dustin, George, Claudia, del, Matthew, jane, jay, Adrian, Yool, Rika, Yoz, siobhan, Qarl, Benjamin, Beast, Everett, madhavi, Christopher, Izzy, stephany, Jeremy, sean, adreanne, Pramod, Tobin, sejong, Iridium, maurice, kj, Meta, kari, JP, bert, kyle, Jon, Socrates, Bridie, Ivan, maria, Aric, Coco, Periapse, sandy, Storrs, Lotte, Colossus, Brad, Pastrami, Zen, BigPapi, Banzai, Sardonyx, Mani, Garry, Jaime, Neuro, Samuel, Niko, CeeLo, Austin, Soft, Poppy, emma, tessa, angelo, kurz, alexa, Sue, CG, Blake, Erica, Brett, Bevis, kristen, Q, simon, Enus, MJ, laurap, Kip, Scouse, Ron, Ram, kend, Marty, Prospero, melissa, kraft, Nat, Seraph, Hamilton, Lordan, Green, miz, Ashlei, Trinity, Ekim, Echo, Charlie, Rowan, Rome, Jt, Doris, benoc, Christy, Bao, Kate, Tj, Patch, Cheah, Johan, Brandy, Angela, Oreh, Cogsworth, Lan, Mitchell, Space, Bambers, Einstein, Bender, Malbers, Matias, Maggie, Rothman, Milton, Niall, Marin, Allison, Mango, Andrea, Katt, Yi, Ambroff, Rico, Raymond, Gail, Christa, William, Dawn, Usi, Dynamike, M, Corr, Dante, Molly, kaylee, Danica, Kelv, Lil, jacob, Nya, Rodney, elsie, Blondin, Grant, Nyx, Devin, Monty, Minerva, Keira, Katie, Jenn, Makai, Clare, Joy, Cody, Gayathri, FJ, spider, Oskar, Landon, Jarv, Noelle, Al, Doc, Gray, Vir, t, Maestro, Simone, Shannon, yang, Courtney, Scott, charlene, Quixote, Susan, Zed, Amanda, Katelin, Esbee, JoRoan, Enkidu, roxie, Scarlet, Merov, Kevin, Judy, Rand, Newell, Les, Dessie, Galen, Michon, Geo, Siz, Calyle, Pete, Praveen, Callen, Sheldon, Pink, Nelson, jenelle, Terrence, Nathan, Juan, Sascha, Huseby, Karina, Kaye, Kotler, Lis, Darv, Charrell, Dakota, Kimmora, Theeba, Taka, Mae, Perry, Ducot, dana, Esther, Dough, gisele, Doten, Viale, Fisher, jessieann, ashley, Torres, delby, rountree, kurt, Slaton, Madison, Rue, Gino, Wen, Casssandra, Brodesky, Squid, Gez, Rakesh, Gecko, Ladan, Tony, Tatem, Squire, Falcon, BK, Crimp, Tiggs, Bacon, Coyot, Carmilla, Webb, Sea, Arch, Jillian, Jason, Bernard, Vogt, Peggy, dragon, Pup, xandix, Wallace, Bewest, Inoshiro, Rhett, AG, Aimee, Ghengis, Itiaes, Eli, Steffan, Epic, Grapes, Stone, Prep, Scobu, Robert, Alain, Carla, Vicky, Tia, Alec, Taras, Lisa, Oz, Ariane, Log, House, Kazu, Kim, Drofnas, Tyler, Campbell, Michele, Madeline, Nelly, Baron, Thor, Lori, Hele, Fredrik, Teddy, Pixie, Berry, Gabrielle, Alfonso, Brooke, Wolf, Ringo, Cru, Charlar, Rodvik, Gibson, Elise, Bagman, Greger, Leonidas, Jerm, Leslie, CB, Brenda, Durian, Carlo, mm, Zeeshan, Caleb, Max, Elikak, Mercille, Steph, Chase
- </text_editor>
- <text name="contrib_intro">
- mit Open-Source-Beiträgen von:
- </text>
- <text_editor name="contrib_names">
- Dummy-Name wird zur Laufzeit ersetzt
- </text_editor>
- <text name="trans_intro">
- mit Übersetzungen von:
- </text>
- <text_editor name="trans_names">
- Dummy Name wird zur Laufzeit ersetzt
- </text_editor>
+ <text name="linden_intro">Second Life wird präsentiert von den Lindens
+mit Open-Source-Beiträgen von:</text>
+ <text_editor name="contrib_names">Dummy-Name wird zur Laufzeit ersetzt</text_editor>
</panel>
<panel label="Lizenzen" name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion.
+ <text_editor name="licenses_editor">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).
@@ -95,8 +37,7 @@ Voice-Serverversion: [VOICE_VERSION]
Alle Rechte vorbehalten. Details siehe licenses.txt.
- Audiocodierung für Voice-Chat: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
+ Audiocodierung für Voice-Chat: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)</text_editor>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml
index 44922fbe78..60f25704dd 100755
--- a/indra/newview/skins/default/xui/de/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_about_land.xml
@@ -309,9 +309,6 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<panel.string name="push_restrict_region_text">
Kein Stoßen (regional)
</panel.string>
- <panel.string name="see_avs_text">
- Avatare auf anderen Parzellen können
- </panel.string>
<text name="allow_label">
Anderen Einwohnern gestatten:
</text>
@@ -337,22 +334,6 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<check_box label="Sicher (kein Schaden)" name="check safe" tool_tip="Falls aktiviert, wird Land auf Option „Sicher“ eingestellt, Kampfschäden sind deaktiviert. Ansonsten sind Kampfschäden aktiviert."/>
<check_box label="Kein Stoßen" name="PushRestrictCheck" tool_tip="Verhindert Stoßen durch Skripte. Durch Aktivieren dieser Option verhindern Sie störendes Verhalten auf Ihrem Land."/>
<check_box label="Ort in Suche anzeigen (30 L$/Woche)" name="ShowDirectoryCheck" tool_tip="Diese Parzelle in Suchergebnissen anzeigen."/>
- <combo_box name="land category with adult">
- <combo_box.item label="Alle Kategorien" name="item0"/>
- <combo_box.item label="Lindenort" name="item1"/>
- <combo_box.item label="Adult" name="item2"/>
- <combo_box.item label="Kunst &amp; Kultur" name="item3"/>
- <combo_box.item label="Business" name="item4"/>
- <combo_box.item label="Bildung" name="item5"/>
- <combo_box.item label="Spielen" name="item6"/>
- <combo_box.item label="Treffpunkt" name="item7"/>
- <combo_box.item label="Anfängergerecht" name="item8"/>
- <combo_box.item label="Parks und Natur" name="item9"/>
- <combo_box.item label="Wohngebiet" name="item10"/>
- <combo_box.item label="Shopping" name="item11"/>
- <combo_box.item label="Vermietung" name="item13"/>
- <combo_box.item label="Sonstige" name="item12"/>
- </combo_box>
<combo_box name="land category">
<combo_box.item label="Alle Kategorien" name="item0"/>
<combo_box.item label="Lindenort" name="item1"/>
@@ -449,15 +430,9 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<panel.string name="access_estate_defined">
(Durch Grundbesitz festgelegt)
</panel.string>
- <panel.string name="allow_public_access">
- Öffentlichen Zugang erlauben ([MATURITY]) (Hinweis: Bei Deaktivierung dieser Option werden Bannlinien generiert)
- </panel.string>
<panel.string name="estate_override">
Eine oder mehrere dieser Optionen gelten auf Grundbesitzebene
</panel.string>
- <text name="Limit access to this parcel to:">
- Zugang zu dieser Parzelle
- </text>
<check_box label="Öffentlichen Zugang gestatten (bei Deaktivierung dieser Option werden Bannlinien generiert)" name="public_access"/>
<text name="Only Allow" width="400">
Zugang nur Einwohnern gestatten, die:
@@ -489,5 +464,6 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<button label="Entfernen" label_selected="Entfernen" name="remove_banned"/>
</panel>
</panel>
+ <panel label="ERLEBNISSE" name="land_experiences_panel"/>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_associate_listing.xml b/indra/newview/skins/default/xui/de/floater_associate_listing.xml
new file mode 100644
index 0000000000..827b1b0aea
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_associate_listing.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="associate listing" title="AUFLISTUNG VERKNÜPFEN">
+ <text name="message">Auflistungs-ID:</text>
+ <line_editor name="listing_id">ID hier eingeben</line_editor>
+ <button label="OK" name="OK"/>
+ <button label="Abbrechen" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_edit_hover_height.xml b/indra/newview/skins/default/xui/de/floater_edit_hover_height.xml
new file mode 100644
index 0000000000..c26f7f367d
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_edit_hover_height.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="HoverHeight" title="SCHWEBEHÖHE FESTLEGEN">
+ <slider label="Höhe" name="HoverHeightSlider"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_experience_search.xml b/indra/newview/skins/default/xui/de/floater_experience_search.xml
new file mode 100644
index 0000000000..0fda5086ff
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_experience_search.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="experiencepicker" title="ERLEBNIS AUSWÄHLEN"/>
diff --git a/indra/newview/skins/default/xui/de/floater_experienceprofile.xml b/indra/newview/skins/default/xui/de/floater_experienceprofile.xml
new file mode 100644
index 0000000000..a553a5b6f0
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_experienceprofile.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater title="EXPERIENCE PROFILE">
+ <floater.string name="empty_slurl">
+ (keines)
+ </floater.string>
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Light&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Light&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Light&quot;
+ </floater.string>
+ <text name="edit_title" value="Erlebnisprofil"/>
+ <tab_container name="tab_container">
+ <panel name="panel_experience_info">
+ <scroll_container name="xp_scroll">
+ <panel name="scrolling_panel">
+ <layout_stack>
+ <layout_panel name="top panel">
+ <button label="Bearbeiten" name="edit_btn"/>
+ </layout_panel>
+ <layout_panel name="maturity panel">
+ <text name="ContentRating">
+ Einstufung:
+ </text>
+ </layout_panel>
+ <layout_panel name="location panel">
+ <text name="Location">
+ Standort:
+ </text>
+ </layout_panel>
+ <layout_panel>
+ <text name="Owner">
+ Eigentümer:
+ </text>
+ </layout_panel>
+ <layout_panel name="group_panel">
+ <text name="Group">
+ Gruppe:
+ </text>
+ </layout_panel>
+ <layout_panel name="perm panel">
+ <button label="Zulassen" name="allow_btn"/>
+ <button label="Vergessen" name="forget_btn"/>
+ <button label="Blockieren" name="block_btn"/>
+ <text name="privileged">
+ Dieses Erlebnis ist für alle Einwohner aktiviert.
+ </text>
+ <button label="Missbrauch melden" name="report_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ </panel>
+ <panel name="edit_panel_experience_info">
+ <scroll_container name="edit_xp_scroll">
+ <panel name="edit_scrolling_panel">
+ <text name="edit_experience_title_label" value="Name:"/>
+ <text name="edit_experience_desc_label" value="Beschreibung:"/>
+ <button label="Gruppe" name="Group_btn"/>
+ <text name="edit_ContentRating">
+ Einstufung:
+ </text>
+ <icons_combo_box label="Moderat" name="edit_ContentRatingText" tool_tip="Bei Erhöhung der Inhaltseinstufung eines Erlebnisses wird die Berechtigung für alle Einwohner zurückgesetzt, die das Erlebnis zugelassen haben.">
+ <icons_combo_box.item label="Adult" name="Adult" value="42"/>
+ <icons_combo_box.item label="Moderat" name="Mature" value="21"/>
+ <icons_combo_box.item label="Allgemein" name="PG" value="13"/>
+ </icons_combo_box>
+ <text name="edit_Location">
+ Standort:
+ </text>
+ <button label="Aktuellen Standort verwenden" name="location_btn"/>
+ <button label="Standort löschen" name="clear_btn"/>
+ <check_box label="Erlebnis aktivieren" name="edit_enable_btn" tool_tip=""/>
+ <check_box label="Aus Suche ausschließen" name="edit_private_btn"/>
+ <text name="changes" value="Es kann mehrere Minuten dauern, bis Erlebnisänderungen in allen Regionen umgesetzt werden."/>
+ <button label="Zurück" name="cancel_btn"/>
+ <button label="Speichern" name="save_btn"/>
+ </panel>
+ </scroll_container>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_experiences.xml b/indra/newview/skins/default/xui/de/floater_experiences.xml
new file mode 100644
index 0000000000..932592a63b
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_experiences.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_experiences" title="ERLEBNISSE"/>
diff --git a/indra/newview/skins/default/xui/de/floater_facebook.xml b/indra/newview/skins/default/xui/de/floater_facebook.xml
index 25b11536eb..32d6d02c7a 100644
--- a/indra/newview/skins/default/xui/de/floater_facebook.xml
+++ b/indra/newview/skins/default/xui/de/floater_facebook.xml
@@ -1,20 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_facebook" title="AUF FACEBOOK POSTEN">
- <panel name="background">
- <tab_container name="tabs">
- <panel label="STATUS" name="panel_facebook_status"/>
- <panel label="FOTO" name="panel_facebook_photo"/>
- <panel label="EINCHECKEN" name="panel_facebook_place"/>
- <panel label="FREUNDE" name="panel_facebook_friends"/>
- <panel label="KONTO" name="panel_facebook_account"/>
- </tab_container>
- <panel name="connection_status_panel">
- <text name="connection_error_text">
- Fehler
- </text>
- <text name="connection_loading_text">
- Laden...
- </text>
- </panel>
- </panel>
+ <tab_container name="tabs">
+ <panel label="STATUS" name="panel_facebook_status"/>
+ <panel label="FOTO" name="panel_facebook_photo"/>
+ <panel label="EINCHECKEN" name="panel_facebook_place"/>
+ <panel label="FREUNDE" name="panel_facebook_friends"/>
+ </tab_container>
+ <text name="connection_error_text">
+ Fehler
+ </text>
+ <text name="connection_loading_text">
+ Laden...
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
index 7f48105460..92c038057f 100755
--- a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
@@ -1,67 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="item properties" title="EIGENSCHAFTEN: INVENTAROBJEKT">
- <floater.string name="unknown">
- (unbekannt)
- </floater.string>
- <floater.string name="public">
- (öffentlich)
- </floater.string>
- <floater.string name="you_can">
- Sie können:
- </floater.string>
- <floater.string name="owner_can">
- Eigentümer kann:
- </floater.string>
- <floater.string name="acquiredDate">
- [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
- </floater.string>
- <text name="LabelItemNameTitle">
- Name:
- </text>
- <text name="LabelItemDescTitle">
- Beschreibung:
- </text>
- <text name="LabelCreatorTitle">
- Ersteller:
- </text>
+ <floater.string name="unknown">(unbekannt)</floater.string>
+ <floater.string name="public">(öffentlich)</floater.string>
+ <floater.string name="you_can">Sie können:</floater.string>
+ <floater.string name="owner_can">Eigentümer kann:</floater.string>
+ <floater.string name="acquiredDate">[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]</floater.string>
+ <text name="LabelItemNameTitle">Name:</text>
+ <text name="LabelItemDescTitle">Beschreibung:</text>
+ <text name="LabelCreatorTitle">Ersteller:</text>
<button label="Profil..." label_selected="" name="BtnCreator"/>
- <text name="LabelOwnerTitle">
- Eigentümer:
- </text>
+ <text name="LabelOwnerTitle">Eigentümer:</text>
<button label="Profil..." label_selected="" name="BtnOwner"/>
- <text name="LabelAcquiredTitle">
- Erworben:
- </text>
- <text name="LabelAcquiredDate">
- Mittwoch, 24. Mai 2006, 12:50:46
- </text>
- <text name="OwnerLabel">
- Sie:
- </text>
+ <text name="LabelAcquiredTitle">Erworben:</text>
+ <text name="LabelAcquiredDate">Mittwoch, 24. Mai 2006, 12:50:46</text>
+ <text name="OwnerLabel">Sie:</text>
<check_box label="Bearbeiten" name="CheckOwnerModify"/>
<check_box label="Kopieren" left_delta="85" name="CheckOwnerCopy"/>
<check_box label="Wiederverkaufen" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">
- Jeder:
- </text>
+ <text name="AnyoneLabel">Jeder:</text>
<check_box label="Kopieren" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">
- Gruppe:
- </text>
+ <text name="GroupLabel">Gruppe:</text>
<check_box label="Teilen" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel" width="150">
- Nächster Eigentümer:
- </text>
+ <text name="NextOwnerLabel" width="150">Nächster Eigentümer:</text>
<check_box label="Bearbeiten" name="CheckNextOwnerModify"/>
<check_box label="Kopieren" left_delta="55" name="CheckNextOwnerCopy"/>
<check_box label="Wiederverkaufen" name="CheckNextOwnerTransfer"/>
<check_box label="Zum Verkauf" name="CheckPurchase"/>
- <combo_box name="combobox sale copy" left_pad="25">
- <combo_box.item label="Kopieren" name="Copy"/>
+ <combo_box name="ComboBoxSaleType">
+ <combo_box.item label="Kopie" name="Copy"/>
+ <combo_box.item label="Inhalt" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
<spinner label="Preis:" name="Edit Cost"/>
- <text name="CurrencySymbol">
- L$
- </text>
+ <text name="CurrencySymbol">L$</text>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml
index d63426d684..0820e75029 100755
--- a/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml
@@ -5,8 +5,8 @@
<check_box label="Kleidung" name="check_clothing"/>
<check_box label="Gesten" name="check_gesture"/>
<check_box label="Landmarken" name="check_landmark"/>
- <check_box label="Netze" name="check_mesh"/>
<check_box label="Notizkarten" name="check_notecard"/>
+ <check_box label="Netze" name="check_mesh"/>
<check_box label="Objekte" name="check_object"/>
<check_box label="Skripts" name="check_script"/>
<check_box label="Sounds" name="check_sound"/>
@@ -19,6 +19,10 @@
<text name="- OR -">
- ODER -
</text>
+ <radio_group name="date_search_direction">
+ <radio_item label="Neuer als" name="newer"/>
+ <radio_item label="Älter als" name="older"/>
+ </radio_group>
<spinner label="Stunden zuvor" label_width="80" name="spin_hours_ago"/>
<spinner label="Tage zuvor" name="spin_days_ago"/>
<button label="Schließen" label_selected="Schließen" name="Close"/>
diff --git a/indra/newview/skins/default/xui/de/floater_item_properties.xml b/indra/newview/skins/default/xui/de/floater_item_properties.xml
new file mode 100644
index 0000000000..eb8314ad13
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_item_properties.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Item Properties" title="OBJEKTEIGENSCHAFTEN"/>
diff --git a/indra/newview/skins/default/xui/de/floater_lagmeter.xml b/indra/newview/skins/default/xui/de/floater_lagmeter.xml
index 45ff37c147..2c8b76ace7 100644
--- a/indra/newview/skins/default/xui/de/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/de/floater_lagmeter.xml
@@ -4,7 +4,7 @@
Lag-Anzeige
</floater.string>
<floater.string name="max_width_px">
- 350
+ 360
</floater.string>
<floater.string name="min_title_msg">
Lag
@@ -25,10 +25,10 @@
Normal, Fenster im Hintergrund
</floater.string>
<floater.string name="client_frame_time_critical_msg">
- Client-Frame-Rate unter [CLIENT_FRAME_RATE_CRITICAL]
+ Client-Framerate unter [CLIENT_FRAME_RATE_CRITICAL]
</floater.string>
<floater.string name="client_frame_time_warning_msg">
- Client-Frame-Rate zwischen [CLIENT_FRAME_RATE_CRITICAL] und [CLIENT_FRAME_RATE_WARNING]
+ Client-Framerate zwischen [CLIENT_FRAME_RATE_CRITICAL] und [CLIENT_FRAME_RATE_WARNING]
</floater.string>
<floater.string name="client_frame_time_normal_msg">
Normal
@@ -55,10 +55,10 @@
5
</floater.string>
<floater.string name="network_packet_loss_critical_msg">
- Paketverlust der Verbindung übersteigt [NETWORK_PACKET_LOSS_CRITICAL]%
+ Paketverlust der Verbindung übersteigt [NETWORK_PACKET_LOSS_CRITICAL] %
</floater.string>
<floater.string name="network_packet_loss_warning_msg">
- Paketverlust der Verbindung liegt bei [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]%
+ Paketverlust der Verbindung liegt bei [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL] %
</floater.string>
<floater.string name="network_performance_normal_msg">
Normal
@@ -76,10 +76,10 @@
Ping-Zeit der Verbindung liegt bei [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
</floater.string>
<floater.string name="network_packet_loss_cause_msg">
- Möglicherweise schlechte Verbindung oder zu hoher Wert für „Bandbreite“.
+ Möglicherweise schlechte Verbindung oder zu hoher Bandbreitenwert.
</floater.string>
<floater.string name="network_ping_cause_msg">
- Möglicherweise schlechte Verbindung oder File-Sharing-Anwendung.
+ Möglicherweise schlechte Verbindung oder Filesharing-Anwendung.
</floater.string>
<floater.string name="server_text_msg">
Server
@@ -94,10 +94,10 @@
20
</floater.string>
<floater.string name="server_frame_time_critical_msg">
- Simulator-Frame-Rate liegt unter [SERVER_FRAME_RATE_CRITICAL]
+ Simulator-Framerate liegt unter [SERVER_FRAME_RATE_CRITICAL]
</floater.string>
<floater.string name="server_frame_time_warning_msg">
- Simulator-Frame-Rate liegt zwischen [SERVER_FRAME_RATE_CRITICAL] und [SERVER_FRAME_RATE_WARNING]
+ Simulator-Framerate liegt zwischen [SERVER_FRAME_RATE_CRITICAL] und [SERVER_FRAME_RATE_WARNING]
</floater.string>
<floater.string name="server_frame_time_normal_msg">
Normal
@@ -112,13 +112,13 @@
Mögliche Ursache: Zu viel Netzwerktraffic
</floater.string>
<floater.string name="server_agent_cause_msg">
- Mögliche Ursache: Zu viele Personen in Bewegung in der Region
+ Mögliche Ursache: Zu viele Personen in der Region in Bewegung
</floater.string>
<floater.string name="server_images_cause_msg">
Mögliche Ursache: Zu viele Bildberechnungen
</floater.string>
<floater.string name="server_generic_cause_msg">
- Mögliche Ursache: Zu hohe Simulator-Last
+ Mögliche Ursache: Zu hohe Simulatorlast
</floater.string>
<floater.string name="smaller_label">
&gt;&gt;
@@ -147,5 +147,5 @@
<text name="server_text">
Normal
</text>
- <button label="&gt;&gt; " name="minimize" tool_tip="Fenstergröße ändern"/>
+ <button label="&gt;&gt;" name="minimize" tool_tip="Fenstergröße ändern"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml
index 3b42a8b741..ae2dd4db67 100755
--- a/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml
@@ -9,7 +9,24 @@
<floater.string name="Title">
SKRIPT: [NAME]
</floater.string>
+ <floater.string name="experience_enabled">
+ Markierung löschen, um aktuelles Erlebnis zu entfernen
+ </floater.string>
+ <floater.string name="no_experiences">
+ Sie sind zu keinen Erlebnissen berechtigt
+ </floater.string>
+ <floater.string name="add_experiences">
+ Auswählen, um Erlebnis hinzuzufügen
+ </floater.string>
+ <floater.string name="show_experience_profile">
+ Klicken, um Erlebnisprofil aufzurufen
+ </floater.string>
+ <floater.string name="loading">
+ Laden...
+ </floater.string>
<button label="Zurücksetzen" label_selected="Zurücksetzen" name="Reset"/>
<check_box initial_value="true" label="Läuft" name="running"/>
<check_box initial_value="true" label="Mono" name="mono"/>
+ <check_box label="Erlebnis verwenden:" name="enable_xp"/>
+ <button label="&gt;" name="view_profile"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_marketplace_listings.xml b/indra/newview/skins/default/xui/de/floater_marketplace_listings.xml
new file mode 100644
index 0000000000..fd6e2d904f
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_marketplace_listings.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_listings" title="MARKTPLATZ-AUFLISTUNGEN">
+ <panel name="marketplace_listings_panel">
+ <panel>
+ <panel name="marketplace_listings_inventory_placeholder_panel">
+ <text name="marketplace_listings_inventory_placeholder_title">Laden...</text>
+ </panel>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_marketplace_validation.xml b/indra/newview/skins/default/xui/de/floater_marketplace_validation.xml
new file mode 100644
index 0000000000..4782b353b4
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_marketplace_validation.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_validation" title="Marketplace-Auflistungen prüfen">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <text_editor name="validation_text">MARKETPLACE_VALIDATION_TEXT</text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_openobject.xml b/indra/newview/skins/default/xui/de/floater_openobject.xml
index c3e7052283..cd7796418c 100755
--- a/indra/newview/skins/default/xui/de/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/de/floater_openobject.xml
@@ -3,6 +3,11 @@
<text name="object_name">
[DESC]:
</text>
- <button label="In Inventar kopieren" label_selected="In Inventar kopieren" name="copy_to_inventory_button" width="120"/>
- <button label="Kopieren und anziehen" label_selected="Kopieren und anziehen" left_pad="6" name="copy_and_wear_button" width="136"/>
+ <text name="border_note">
+ In Inventar kopieren und tragen
+ </text>
+ <button label="Zum Outfit hinzufügen" label_selected="Zum Outfit hinzufügen" left_pad="6" name="copy_and_wear_button" width="136"/>
+ <button label="Outfit ersetzen" label_selected="Outfit ersetzen" name="copy_and_replace_button"/>
+ <button label="Nur in Inventar kopieren" label_selected="Nur in Inventar kopieren" name="copy_to_inventory_button" width="120"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="cancel_button"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_pay.xml b/indra/newview/skins/default/xui/de/floater_pay.xml
index a0a622ecbc..1882f5150b 100755
--- a/indra/newview/skins/default/xui/de/floater_pay.xml
+++ b/indra/newview/skins/default/xui/de/floater_pay.xml
@@ -1,25 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <string name="payee_group">
- Gruppe bezahlen
- </string>
- <string name="payee_resident">
- Einwohner bezahlen
- </string>
- <text name="payee_label" width="130">
- Bezahlen:
- </text>
- <icon name="icon_person" tool_tip="Person"/>
- <text left="130" name="payee_name">
- Extrem langen Namen testen, um zu prüfen, ob er abgeschnitten wird
- </text>
- <button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
- <button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
- <button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
- <button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
- <text name="amount text">
- oder Betrag auswählen:
- </text>
- <button label="Bezahlen" label_selected="Bezahlen" name="pay btn"/>
- <button label="Abbrechen" label_selected="Abbrechen" name="cancel btn"/>
+ <string name="payee_group">Gruppe bezahlen</string>
+ <string name="payee_resident">Einwohner bezahlen</string>
+ <text name="paying_text">Sie zahlen:</text>
+ <text left="130" name="payee_name">Extrem langen Namen testen, um zu prüfen, ob er abgeschnitten wird</text>
+ <panel label="Suchen" name="PatternsPanel">
+ <button label="L$ 1 zahlen" label_selected="L$ 1 zahlen" name="fastpay 1"/>
+ <button label="L$ 5 zahlen" label_selected="L$ 5 zahlen" name="fastpay 5"/>
+ <button label="L$ 10 zahlen" label_selected="L$ 10 zahlen" name="fastpay 10"/>
+ <button label="L$ 20 zahlen" label_selected="L$ 20 zahlen" name="fastpay 20"/>
+ </panel>
+ <panel label="Suchen" name="InputPanel">
+ <text name="amount text">Anderer Betrag:</text>
+ <button label="Bezahlen" label_selected="Bezahlen" name="pay btn"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="cancel btn"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_pay_object.xml b/indra/newview/skins/default/xui/de/floater_pay_object.xml
index 7159bbadb3..35f3ca032a 100755
--- a/indra/newview/skins/default/xui/de/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/de/floater_pay_object.xml
@@ -1,29 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <string name="payee_group" width="105">
- Gruppe bezahlen
- </string>
- <string name="payee_resident" width="118">
- Einwohner bezahlen
- </string>
- <icon name="icon_person" tool_tip="Person"/>
- <text left="128" name="payee_name" width="168">
- Ericacita Moostopolison
- </text>
- <text halign="left" name="object_name_label">
- Über Objekt:
- </text>
+ <string name="payee_group" width="105">Gruppe bezahlen</string>
+ <string name="payee_resident" width="118">Einwohner bezahlen</string>
+ <text name="paying_text">Sie zahlen:</text>
+ <text left="128" name="payee_name" width="168">Ericacita Moostopolison</text>
+ <text halign="left" name="object_name_label">Über Objekt:</text>
<icon name="icon_object" tool_tip="Objekte"/>
- <text left="105" name="object_name_text">
- ...
- </text>
- <button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
- <button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
- <button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
- <button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
- <text name="amount text">
- oder Betrag auswählen:
- </text>
- <button label="Bezahlen" label_selected="Bezahlen" name="pay btn"/>
- <button label="Abbrechen" label_selected="Abbrechen" name="cancel btn" width="76"/>
+ <text left="105" name="object_name_text">...</text>
+ <panel label="Suchen" name="PatternsPanel">
+ <button label="L$ 1 zahlen" label_selected="L$ 1 zahlen" name="fastpay 1"/>
+ <button label="L$ 5 zahlen" label_selected="L$ 5 zahlen" name="fastpay 5"/>
+ <button label="L$ 10 zahlen" label_selected="L$ 10 zahlen" name="fastpay 10"/>
+ <button label="L$ 20 zahlen" label_selected="L$ 20 zahlen" name="fastpay 20"/>
+ </panel>
+ <panel label="Suchen" name="InputPanel">
+ <text name="amount text">Anderer Betrag:</text>
+ <button label="Bezahlen" label_selected="Bezahlen" name="pay btn"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="cancel btn"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_report_abuse.xml b/indra/newview/skins/default/xui/de/floater_report_abuse.xml
index 34cb3d1cc2..6999679b3f 100755
--- a/indra/newview/skins/default/xui/de/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/de/floater_report_abuse.xml
@@ -77,7 +77,7 @@ Objekt:
<combo_box.item label="Land &gt; Unbefugte Nutzung &gt; Objekte oder Texturen" name="Land__Encroachment__Objects_textures"/>
<combo_box.item label="Land &gt; Unbefugte Nutzung &gt; Partikel" name="Land__Encroachment__Particles"/>
<combo_box.item label="Land &gt; Unbefugte Nutzung &gt; Bäume/Pflanzen" name="Land__Encroachment__Trees_plants"/>
- <combo_box.item label="Wetten/Glücksspiel" name="Wagering_gambling"/>
+ <combo_box.item label="Verstoß gegen die Spielerichtlinie" name="Wagering_gambling"/>
<combo_box.item label="Sonstige" name="Other"/>
</combo_box>
<text name="abuser_name_title">
diff --git a/indra/newview/skins/default/xui/de/floater_snapshot.xml b/indra/newview/skins/default/xui/de/floater_snapshot.xml
index 51614f1e8d..f0152ad8cd 100755
--- a/indra/newview/skins/default/xui/de/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/de/floater_snapshot.xml
@@ -39,13 +39,7 @@
<string name="local_failed_str">
Fehler beim Speichern auf dem Computer.
</string>
- <button name="advanced_options_btn" tool_tip="Erweiterte Optionen"/>
- <text name="image_res_text">
- [WIDTH]px (Breite) x [HEIGHT]px (Höhe)
- </text>
- <text name="file_size_label">
- [SIZE] KB
- </text>
+ <button label="AKTUALISIEREN" name="new_snapshot_btn"/>
<panel name="advanced_options_panel">
<text name="layer_type_label">
Aufnehmen:
@@ -65,4 +59,10 @@
<combo_box.item label="Kein Filter" name="NoFilter"/>
</combo_box>
</panel>
+ <text name="image_res_text">
+ [WIDTH] px (Breite) x [HEIGHT] px (Höhe)
+ </text>
+ <text name="file_size_label">
+ [SIZE] KB
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_top_objects.xml b/indra/newview/skins/default/xui/de/floater_top_objects.xml
index f8130c6379..d01b4640c2 100755
--- a/indra/newview/skins/default/xui/de/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/de/floater_top_objects.xml
@@ -21,6 +21,12 @@
<floater.string name="none_descriptor">
Nicht gefunden.
</floater.string>
+ <floater.string name="URLs">
+ URLs
+ </floater.string>
+ <floater.string name="memory">
+ Speicher (KB)
+ </floater.string>
<text name="title_text">
Wird geladen...
</text>
@@ -30,7 +36,7 @@
<scroll_list.columns label="Eigentümer" name="owner"/>
<scroll_list.columns label="Position" name="location" width="125"/>
<scroll_list.columns label="Parzelle" name="parcel"/>
- <scroll_list.columns label="Uhrzeit" name="time"/>
+ <scroll_list.columns label="Datum" name="time"/>
<scroll_list.columns label="URLs" name="URLs"/>
<scroll_list.columns label="Speicher (KB)" name="memory"/>
</scroll_list>
diff --git a/indra/newview/skins/default/xui/de/floater_twitter.xml b/indra/newview/skins/default/xui/de/floater_twitter.xml
index a79a5d3cac..483641c260 100644
--- a/indra/newview/skins/default/xui/de/floater_twitter.xml
+++ b/indra/newview/skins/default/xui/de/floater_twitter.xml
@@ -1,17 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_twitter" title="TWITTER">
- <panel name="background">
- <tab_container name="tabs">
- <panel label="ERSTELLEN" name="panel_twitter_photo"/>
- <panel label="KONTO" name="panel_twitter_account"/>
- </tab_container>
- <panel name="connection_status_panel">
- <text name="connection_error_text">
- Fehler
- </text>
- <text name="connection_loading_text">
- Laden...
- </text>
- </panel>
- </panel>
+ <tab_container name="tabs">
+ <panel label="ERSTELLEN" name="panel_twitter_photo"/>
+ <panel label="KONTO" name="panel_twitter_account"/>
+ </tab_container>
+ <text name="connection_error_text">
+ Fehler
+ </text>
+ <text name="connection_loading_text">
+ Laden...
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/de/menu_attachment_self.xml b/indra/newview/skins/default/xui/de/menu_attachment_self.xml
index 7888c7b0a1..e0f37b28af 100755
--- a/indra/newview/skins/default/xui/de/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/de/menu_attachment_self.xml
@@ -8,6 +8,7 @@
<menu_item_call label="Mein Aussehen" name="Change Outfit"/>
<menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/>
<menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/>
+ <menu_item_call label="Schwebehöhe" name="Hover Height"/>
<menu_item_call label="Meine Freunde" name="Friends..."/>
<menu_item_call label="Meine Gruppen" name="Groups..."/>
<menu_item_call label="Mein Profil" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/de/menu_avatar_self.xml b/indra/newview/skins/default/xui/de/menu_avatar_self.xml
index 022cd8c3ca..b53f8cd6af 100755
--- a/indra/newview/skins/default/xui/de/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/de/menu_avatar_self.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Mein Aussehen" name="Chenge Outfit"/>
<menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/>
<menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/>
+ <menu_item_call label="Schwebehöhe" name="Hover Height"/>
<menu_item_call label="Meine Freunde" name="Friends..."/>
<menu_item_call label="Meine Gruppen" name="Groups..."/>
<menu_item_call label="Mein Profil" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/de/menu_inventory.xml b/indra/newview/skins/default/xui/de/menu_inventory.xml
index d838f736f8..e1f545adfc 100755
--- a/indra/newview/skins/default/xui/de/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory.xml
@@ -1,5 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
+ <menu_item_call label="Auflistung erstellen" name="Marketplace Create Listing"/>
+ <menu_item_call label="Auflistung verknüpfen" name="Marketplace Associate Listing"/>
+ <menu_item_call label="Auflistung abrufen (aktualisieren)" name="Marketplace Get Listing"/>
+ <menu_item_call label="Auf Fehler prüfen" name="Marketplace Check Listing"/>
+ <menu_item_call label="Auflistung bearbeiten" name="Marketplace Edit Listing"/>
+ <menu_item_call label="Auflisten" name="Marketplace List"/>
+ <menu_item_call label="Entfernen" name="Marketplace Unlist"/>
+ <menu_item_call label="Aktivieren" name="Marketplace Activate"/>
+ <menu_item_call label="Deaktivieren" name="Marketplace Deactivate"/>
<menu_item_call label="Teilen" name="Share"/>
<menu_item_call label="Kaufen" name="Task Buy"/>
<menu_item_call label="Öffnen" name="Task Open"/>
@@ -87,6 +96,7 @@
<menu_item_call label="Hinzufügen" name="Wearable Add"/>
<menu_item_call label="Ausziehen" name="Take Off"/>
<menu_item_call label="In Händler-Outbox kopieren" name="Merchant Copy"/>
- <menu_item_call label="In Marktplatz übertragen" name="Marketplace Send"/>
+ <menu_item_call label="In Marktplatz-Auflistungen kopieren" name="Marketplace Copy"/>
+ <menu_item_call label="In Marktplatz-Auflistungen verschieben" name="Marketplace Move"/>
<menu_item_call label="--keine Optionen--" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml
index 48dec3e856..7438fc5aa2 100755
--- a/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml
@@ -5,7 +5,7 @@
<menu_item_check label="Nach aktuellesten Objekten sortieren" name="sort_by_recent"/>
<menu_item_check label="Ordner immer nach Namen sortieren" name="sort_folders_by_name"/>
<menu_item_check label="Systemordner nach oben" name="sort_system_folders_to_top"/>
- <menu_item_call label="Filter anzeigen" name="show_filters"/>
+ <menu_item_call label="Filter anzeigen..." name="show_filters"/>
<menu_item_call label="Filter zurücksetzen" name="reset_filters"/>
<menu_item_call label="Alle Ordner schließen" name="close_folders"/>
<menu_item_call label="Fundbüro ausleeren" name="empty_lostnfound"/>
diff --git a/indra/newview/skins/default/xui/de/menu_marketplace_view.xml b/indra/newview/skins/default/xui/de/menu_marketplace_view.xml
new file mode 100644
index 0000000000..41516a1e7c
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_marketplace_view.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_marketplace_sort">
+ <menu_item_check label="Nach verfügbarer Menge sortieren (niedrig bis hoch)" name="sort_by_stock_amount"/>
+ <menu_item_check label="Nur Auflistungsordner anzeigen" name="show_only_listing_folders"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_url_experience.xml b/indra/newview/skins/default/xui/de/menu_url_experience.xml
new file mode 100644
index 0000000000..45c118cb6d
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_url_experience.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index 50a6dafa91..956530c990 100755
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -8,13 +8,14 @@
<menu_item_call label="Neues Inventarfenster" name="NewInventoryWindow"/>
<menu_item_call label="Orte..." name="Places"/>
<menu_item_call label="Auswahlen..." name="Picks"/>
+ <menu_item_call label="Erlebnisse..." name="Experiences"/>
<menu_item_call label="Kamerasteuerungen..." name="Camera Controls"/>
<menu label="Bewegung" name="Movement">
<menu_item_call label="Hinsetzen" name="Sit Down Here"/>
<menu_item_check label="Fliegen" name="Fly"/>
<menu_item_check label="Immer rennen" name="Always Run"/>
<menu_item_call label="Animation meines Avatars stoppen" name="Stop Animating My Avatar"/>
- <menu_item_call label="Gehen/Rennen/Fliegen..." name="Walk / run / fly"/>
+ <menu_item_call label="Gehen/Rennen/Fliegen..." name="WalkRunFly"/>
</menu>
<menu label="Status" name="Status">
<menu_item_check label="Abwesend" name="Away"/>
@@ -22,6 +23,7 @@
</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="Marktplatz-Auflistungen..." name="MarketplaceListings"/>
<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>
@@ -48,7 +50,7 @@
<menu_item_check label="Freunde" name="My Friends"/>
<menu_item_check label="Gruppen" name="My Groups"/>
<menu_item_check label="Leute in der Nähe" name="Active Speakers"/>
- <menu_item_call label="Blockierliste" name="Block List"/>
+ <menu_item_check label="Blockierliste" name="Block List"/>
<menu_item_check label="Nicht stören" name="Do Not Disturb"/>
</menu>
<menu label="Welt" name="World">
@@ -62,7 +64,7 @@
<menu_item_call label="Foto" name="Take Snapshot"/>
<menu_item_call label="Ortsprofil" name="Place Profile"/>
<menu_item_call label="Landinformationen" name="About Land"/>
- <menu_item_call label="Region/Grundbesitz" name="Region/Estate"/>
+ <menu_item_call label="Region/Grundbesitz" name="RegionEstate"/>
<menu_item_call label="Mein Landbesitz..." name="My Land"/>
<menu_item_call label="Dieses Land kaufen" name="Buy Land"/>
<menu label="Anzeigen" name="LandShow">
@@ -250,6 +252,7 @@
<menu_item_check label="Textur" name="Texture Console"/>
<menu_item_check label="Fehler beseitigen" name="Debug Console"/>
<menu_item_call label="Meldungen" name="Notifications"/>
+ <menu_item_check label="Regions-Debug-Konsole" name="Region Debug Console"/>
<menu_item_check label="Schnelle Timer" name="Fast Timers"/>
<menu_item_check label="Speicher" name="Memory"/>
<menu_item_check label="Szenestatistiken" name="Scene Statistics"/>
@@ -353,7 +356,7 @@
<menu_item_check label="Positionen der interpolierten Objekte anfragen" name="Ping Interpolate Object Positions"/>
<menu_item_call label="Ein Paket fallenlassen" name="Drop a Packet"/>
</menu>
- <menu_item_call label="Geskriptete Kamera ausgeben" name="Dump Scripted Camera"/>
+ <menu_item_call label="Geskriptete Kamera ausgeben" name="Dump Scripted Camera"/>
<menu label="Rekorder" name="Recorder">
<menu_item_call label="Wiedergabe starten" name="Start Playback"/>
<menu_item_call label="Wiedergabe stoppen" name="Stop Playback"/>
diff --git a/indra/newview/skins/default/xui/de/mime_types.xml b/indra/newview/skins/default/xui/de/mime_types.xml
index de93107e94..ee05e47a63 100755
--- a/indra/newview/skins/default/xui/de/mime_types.xml
+++ b/indra/newview/skins/default/xui/de/mime_types.xml
@@ -44,6 +44,14 @@
Audio an diesem Ort wiedergeben
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ Keine Inhalte
+ </label>
+ <tooltip name="none_tooltip">
+ Keine Medien gefunden
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Echtzeit-Streaming
@@ -119,11 +127,6 @@
Macromedia Director
</label>
</mimetype>
- <mimetype name="application/x-shockwave-flash">
- <label name="application/x-shockwave-flash_label">
- Flash
- </label>
- </mimetype>
<mimetype name="audio/mid">
<label name="audio/mid_label">
Audio (MIDI)
diff --git a/indra/newview/skins/default/xui/de/mime_types_linux.xml b/indra/newview/skins/default/xui/de/mime_types_linux.xml
index e4b5c53292..ffe819d157 100755
--- a/indra/newview/skins/default/xui/de/mime_types_linux.xml
+++ b/indra/newview/skins/default/xui/de/mime_types_linux.xml
@@ -44,6 +44,14 @@
Das Audio dieses Standorts abspielen
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ Keine Inhalte
+ </label>
+ <tooltip name="none_tooltip">
+ Keine Medien gefunden
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Echtzeit-Streaming
diff --git a/indra/newview/skins/default/xui/de/mime_types_mac.xml b/indra/newview/skins/default/xui/de/mime_types_mac.xml
index e4b5c53292..ffe819d157 100755
--- a/indra/newview/skins/default/xui/de/mime_types_mac.xml
+++ b/indra/newview/skins/default/xui/de/mime_types_mac.xml
@@ -44,6 +44,14 @@
Das Audio dieses Standorts abspielen
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ Keine Inhalte
+ </label>
+ <tooltip name="none_tooltip">
+ Keine Medien gefunden
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Echtzeit-Streaming
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index 2fa5005d15..fa7db0a8a3 100755
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -73,6 +73,10 @@ Fehlerdetails: The notification called &apos;[_NAME]&apos; was not found in noti
[MESSAGE]
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/>
</notification>
+ <notification name="GenericAlertOK">
+ [MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="BadInstallation">
Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte [http://get.secondlife.com laden Sie die aktuellste Version des Viewers herunter].
<usetemplate name="okbutton" yestext="OK"/>
@@ -125,6 +129,88 @@ Aufgrund eines System- oder Netzwerkfehlers wurden keine Ordner an den Marktplat
Marktplatzinitialisierung aufgrund eines System- oder Netzwerkfehlers fehlgeschlagen. Versuchen Sie es später erneut.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="StockPasteFailed">
+ Kopieren oder Verschieben in Bestandsordner fehlgeschlagen mit Fehler:
+
+ „[ERROR_CODE]“
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantPasteFailed">
+ Kopieren oder Verschieben von Marktplatz-Auflistungen fehlgeschlagen mit Fehler:
+
+ „[ERROR_CODE]“
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantTransactionFailed">
+ Marktplatztransaktion fehlgeschlagen mit Fehler:
+
+ Grund: „[ERROR_REASON]“
+ [ERROR_DESCRIPTION]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantUnprocessableEntity">
+ Wir konnten dieses Produkt nicht auflisten bzw. den Versionsordner nicht aktivieren. Dies liegt meist an fehlenden Informationen im Formular zur Beschreibung der Auflistung, kann aber auch auf eine falsche Ordnerstruktur zurückzuführen sein. Bearbeiten Sie die Auflistung oder überprüfen Sie den Auflistungsordner auf Fehler.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantListingFailed">
+ Auflistung in Marktplatz fehlgeschlagen mit Fehler:
+
+ „[ERROR_CODE]“
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantFolderActivationFailed">
+ Aktivierung dieses Versionsordners fehlgeschlagen mit Fehler:
+
+ „[ERROR_CODE]“
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantActiveChange">
+ Diese Aktion ändert den aktiven Inhalt dieser Auflistung. Möchten Sie fortfahren?
+ <usetemplate ignoretext="Vor Ändern einer aktiven Auflistung im Marktplatz bestätigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantMoveInventory">
+ Objekte, die ins Marktplatz-Auflistungsfenster gezogen werden, werden verschoben, nicht kopiert. Möchten Sie fortfahren?
+ <usetemplate ignoretext="Vor Verschieben eines Objekts aus dem Inventar in den Marktplatz bestätigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmListingCutOrDelete">
+ Wenn Sie einen Auflistungsordner verschieben oder löschen, wird Ihre Marktplatz-Auflistung gelöscht. Um die Marktplatz-Auflistung beizubehalten, verschieben oder löschen Sie den Inhalt des Versionsordners, den Sie ändern möchten. Möchten Sie fortfahren?
+ <usetemplate ignoretext="Bestätigen, bevor ich eine Auflistung aus dem Marktplatz entferne oder verschiebe" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmCopyToMarketplace">
+ Sie haben keine Berechtigung, eines oder mehrere dieser Objekte in den Marktplatz zu kopieren. Sie können sie verschieben oder zurücklassen.
+ <usetemplate canceltext="Abbrechen" ignoretext="Vor Kopieren einer Auswahl mit kopiergeschützten Objekten in den Marktplatz bestätigen" name="yesnocancelbuttons" notext="Artikel nicht verschieben" yestext="Artikel verschieben"/>
+ </notification>
+ <notification name="ConfirmMerchantUnlist">
+ Diese Aktion entfernt diese Auflistung. Möchten Sie fortfahren?
+ <usetemplate ignoretext="Vor Entfernen einer aktiven Auflistung aus dem Marktplatz bestätigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantClearVersion">
+ Diese Aktion deaktiviert den Versionsordner der aktuellen Auflistung. Möchten Sie fortfahren?
+ <usetemplate ignoretext="Vor Deaktivieren des Versionsordners einer Auflistung im Marktplatz bestätigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantListingNotUpdated">
+ Diese Auflistung konnte nicht aktualisiert werden.
+[[URL] Klicken Sie hier], um sie im Marktplatz zu bearbeiten.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantListingCannotWear">
+ Sie können keine Kleidung oder Körperteile tragen, die im Marktplatz-Auflistungsordner enthalten sind
+ </notification>
+ <notification name="AlertMerchantListingInvalidID">
+ Auflistungs-ID ungültig.
+ </notification>
+ <notification name="AlertMerchantListingActivateRequired">
+ In dieser Auflistung gibt es mehrere oder keine Versionsordner. Sie müssen später einen auswählen und aktivieren.
+ <usetemplate ignoretext="Benachrichtung zur Versionsordneraktivierung, wenn ich eine Auflistung mit mehreren Versionsordnern erstelle" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderSplit">
+ Wir haben Bestandsobjekte unterschiedlicher Typen in separate Bestandsordner gelegt, damit wir Ihren Ordner auflisten können.
+ <usetemplate ignoretext="Benachrichtigen,wenn Bestandsordner vor dem Auflisten aufgeteilt wird" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderEmpty">
+ Wir haben Ihre Auflistung entfernt, da der Bestandsordner leer ist. Um diese Auflistung wieder zu listen, müssen Sie weitere Einheiten zum Bestandsordner hinzufügen.
+ <usetemplate ignoretext="Benachrichtigen, wenn Auflistung aufgrund eines leeren Bestandsordners nicht aufgelistet wird" name="okignore" yestext="OK"/>
+ </notification>
<notification name="CompileQueueSaveText">
Der Text für ein Skript konnte aus folgendem Grund nicht hochgeladen werden: [REASON]. Bitte versuchen Sie es erneut.
</notification>
@@ -476,6 +562,10 @@ Hinweis: Der Cache wird dabei gelöscht/geleert.
Änderungen speichern?
<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/>
</notification>
+ <notification name="DeleteNotecard">
+ Notizkarte löschen?
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+ </notification>
<notification name="GestureSaveFailedTooManySteps">
Speichern der Geste fehlgeschlagen.
Die Geste besteht aus zu vielen Schritten.
@@ -582,6 +672,9 @@ Sie können die Grafikqualität unter Einstellungen &gt; Grafik wieder erhöhen.
<notification name="RegionNoTerraforming">
Die Region [REGION] erlaubt kein Terraforming.
</notification>
+ <notification name="ParcelNoTerraforming">
+ Sie sind nicht zum Terraformen der Parzelle „[PARCEL]“ berechtigt.
+ </notification>
<notification name="CannotCopyWarning">
Sie sind nicht berechtigt, die folgenden Objekte zu kopieren:
[ITEMS]
@@ -1839,6 +1932,30 @@ Tausende Regionen werden verändert und der Spaceserver wird dadurch stark belas
Verwalter nur für diesen Grundbesitz oder für [ALL_ESTATES] entfernen?
<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Diesen Grundbesitz"/>
</notification>
+ <notification label="Grundbesitz auswählen" name="EstateAllowedExperienceAdd">
+ Nur für diesen Grundbesitz oder für [ALL_ESTATES] zur Erlaubnisliste hinzufügen?
+ <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Dieser Grundbesitz"/>
+ </notification>
+ <notification label="Grundbesitz auswählen" name="EstateAllowedExperienceRemove">
+ Nur für diesen Grundbesitz oder für [ALL_ESTATES] aus der Erlaubnisliste entfernen?
+ <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Dieser Grundbesitz"/>
+ </notification>
+ <notification label="Grundbesitz auswählen" name="EstateBlockedExperienceAdd">
+ Nur für diesen Grundbesitz oder für [ALL_ESTATES] zur Blockierliste hinzufügen?
+ <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Dieser Grundbesitz"/>
+ </notification>
+ <notification label="Grundbesitz auswählen" name="EstateBlockedExperienceRemove">
+ Nur für diesen Grundbesitz oder für [ALL_ESTATES] aus der Blockierliste entfernen?
+ <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Dieser Grundbesitz"/>
+ </notification>
+ <notification label="Grundbesitz auswählen" name="EstateTrustedExperienceAdd">
+ Nur für diesen Grundbesitz oder für [ALL_ESTATES] zur Schlüsselliste hinzufügen?
+ <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Dieser Grundbesitz"/>
+ </notification>
+ <notification label="Grundbesitz auswählen" name="EstateTrustedExperienceRemove">
+ Nur für diesen Grundbesitz oder für [ALL_ESTATES] aus der Schlüsselliste entfernen?
+ <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Dieser Grundbesitz"/>
+ </notification>
<notification label="Rauswurf bestätigen" name="EstateKickUser">
Benutzer [EVIL_USER] von diesem Grundbesitz werfen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
@@ -1851,6 +1968,9 @@ Tausende Regionen werden verändert und der Spaceserver wird dadurch stark belas
Die Region, die Sie besuchen möchten, enthält Inhalte, die Ihre aktuellen Einstellungen überschreiten. Sie können Ihre Einstellungen unter „Ich“ &gt; „Einstellungen“ &gt; „Allgemein“ ändern.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="SLM_UPDATE_FOLDER">
+ [MESSAGE]
+ </notification>
<notification name="RegionEntryAccessBlocked_AdultsOnlyContent">
Die Region, die Sie besuchen möchten, enthält [REGIONMATURITY]-Inhalte, die nur für Erwachsene zugänglich sind.
<url name="url">
@@ -1913,6 +2033,10 @@ Tausende Regionen werden verändert und der Spaceserver wird dadurch stark belas
Wir haben technische Probleme mit Ihrem Teleport, da Ihre Einstellungen nicht mit dem Server synchronisiert sind.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="RegionTPSpecialUsageBlocked">
+ Betreten der Region nicht gestattet. „[REGION_NAME]“ ist eine Region für Geschicklichkeitsspiele. Der Zugang ist Einwohnern vorbehalten, die bestimmte Kriterien erfüllen. Weitere Details finden Sie unter [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="PreferredMaturityChanged">
Sie erhalten keine Benachrichtigungen mehr, wenn Sie eine Region der Inhaltseinstufung „[RATING]“ besuchen. Sie können Ihre Inhaltseinstellungen von der Menüleiste aus ändern („Ich“ &gt; „Einstellungen“ &gt; „Allgemein“).
<usetemplate name="okbutton" yestext="OK"/>
@@ -2136,6 +2260,10 @@ Inventarobjekt(e) verschieben?
<ignore name="ignore" text="Ich habe die Aktion „Objekt bezahlen&quot; eingestellt, während ich ein Objekt gebaut habe, dass kein Geld()-Skript enthält."/>
</form>
</notification>
+ <notification name="PayConfirmation">
+ Bestätigen Sie, dass Sie L$ [AMOUNT] an [TARGET] zahlen möchten.
+ <usetemplate ignoretext="Vor den Bezahlen bestätigen (Summen über L$ 200)" name="okcancelignore" notext="Abbrechen" yestext="Bezahlen"/>
+ </notification>
<notification name="OpenObjectCannotCopy">
Sie haben keine Berechtigung zum Kopieren von Elementen in diesem Objekt.
</notification>
@@ -2220,6 +2348,9 @@ Möchten Sie es mit dem ausgewählten Objekt ersetzen?
<button ignore="Nie ersetzen" name="No" text="Abbrechen"/>
</form>
</notification>
+ <notification name="TooManyWearables">
+ Sie können keinen Ordner tragen, der mehr als [AMOUNT] Elemente enthält. Sie können diesen Höchstwert unter „Erweitert“ &gt; „Debug-Einstellungen anzeigen“ &gt; „WearFolderLimit“ ändern.
+ </notification>
<notification label="Warnung für Nicht-stören-Modus" name="DoNotDisturbModePay">
Sie haben den Nicht-stören-Modus aktiviert. Sie erhalten keine Artikel, die im Gegenzug für diese Zahlung angeboten werden.
@@ -2671,9 +2802,6 @@ Versuchen Sie es in einigen Minuten erneut.
<notification name="NoValidCircuit">
Kein gültiger Verbindungscode.
</notification>
- <notification name="NoValidTimestamp">
- Kein gültiger Zeitstempel.
- </notification>
<notification name="NoPendingConnection">
Verbindung kann nicht hergestellt werden.
</notification>
@@ -2828,7 +2956,7 @@ Wenn Sie in dieser Region bleiben, werden Sie abgemeldet.
[MESSAGE]
-Von Objekt: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, Eigentümer: [NAME]?
+Von Objekt: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, Eigentümer: [NAME]
<form name="form">
<button name="Gotopage" text="Zur Seite"/>
<button name="Cancel" text="Abbrechen"/>
@@ -2854,6 +2982,72 @@ Ist das OK?
<button name="Mute" text="Ignorieren"/>
</form>
</notification>
+ <notification name="ExperienceAcquireFailed">
+ Fehler beim Erwerb eines neuen Erlebnisses:
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NotInGroupExperienceProfileMessage">
+ Eine Änderung der Erlebnisgruppe wurde ignoriert, weil der Eigentümer nicht Mitglied der ausgewählten Gruppe ist.
+ </notification>
+ <notification name="UneditableExperienceProfileMessage">
+ Das nicht bearbeitbare Feld „[field]“ wurde beim Aktualisieren des Erlebnisprofils ignoriert.
+ </notification>
+ <notification name="RestrictedToOwnerExperienceProfileMessage">
+ Änderungen des Felds „[field]“ ignoriert; Feld kann nur vom Eigentümer des Erlebnisses eingestellt werden.
+ </notification>
+ <notification name="MaturityRatingExceedsOwnerExperienceProfileMessage">
+ Sie können die Inhaltseinstufung eines Erlebnisses nicht auf eine höhere Stufe setzen als die des Eigentümers.
+ </notification>
+ <notification name="RestrictedTermExperienceProfileMessage">
+ Die folgenden Elemente verhinderten die Aktualisierung des Namens und/oder der Beschreibung im Erlebnisprofil: [extra_info]
+ </notification>
+ <notification name="TeleportedHomeExperienceRemoved">
+ Sie wurden aus der Region [region_name] teleportiert, weil Sie das Erlebnis secondlife:///app/experience/[public_id]/profile entfernt haben und nicht mehr berechtigt sind, sich in dieser Region aufzuhalten.
+ <form name="form">
+ <ignore name="ignore" text="Wegen Entfernen eines Erlebnisses aus Region hinausgeworfen"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperienceEntry">
+ Sie durften die Region [region_name] betreten, weil Sie am Schlüsselerlebnis secondlife:///app/experience/[public_id]/profile teilgenommen haben. Wenn Sie dieses Erlebnis entfernen, werden Sie u. U. aus der Region hinausgeworfen.
+ <form name="form">
+ <ignore name="ignore" text="Betreten der Region durch ein Erlebnis gestattet"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperiencesAvailable">
+ Sie haben keinen Zugang zu diesem Ziel. Sie erhalten u. U. Zugang zur Region, wenn Sie unten ein Erlebnis akzeptieren:
+
+[EXPERIENCE_LIST]
+
+Möglicherweise sind noch weitere Schlüsselerlebnisse verfügbar.
+ </notification>
+ <notification name="ExperienceEvent">
+ Ein Objekt erhielt vom Erlebnis secondlife:///app/experience/[public_id]/profile die Erlaubnis zum Durchführen der folgenden Aktion: [EventType].
+ Eigentümer: secondlife:///app/agent/[OwnerID]/inspect
+ Objektname: [ObjectName]
+ Parzellenname: [ParcelName]
+ </notification>
+ <notification name="ExperienceEventAttachment">
+ Ein Anhang erhielt vom Erlebnis secondlife:///app/experience/[public_id]/profile die Erlaubnis zum Durchführen der folgenden Aktion: [EventType].
+ Eigentümer: secondlife:///app/agent/[OwnerID]/inspect
+ </notification>
+ <notification name="ScriptQuestionExperience">
+ „&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;“, ein Objekt, das „[NAME]“ gehört, lädt Sie zur Teilnahme an diesem Erlebnis mit [GRID_WIDE] ein:
+
+[EXPERIENCE]
+
+Nach Erteilung der Genehmigung wird diese Nachricht für dieses Erlebnis nicht erneut angezeigt, es sei denn, Sie widerrufen die Genehmigung im Erlebnisprofil.
+
+Mit diesem Erlebnis verknüpfte Skripts können in Regionen, in denen dieses Erlebnis aktiv ist, Folgendes tun:
+
+[QUESTIONS]Sind Sie damit einverstanden?
+ <form name="form">
+ <button name="BlockExperience" text="Erlebnis blockieren"/>
+ <button name="Mute" text="Objekt blockieren"/>
+ <button name="Yes" text="Ja"/>
+ <button name="No" text="Nein"/>
+ </form>
+ </notification>
<notification name="ScriptQuestionCaution">
Achtung: Das Objekt „&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;“ fordert uneingeschränkten Zugriff auf Ihr Linden-Dollar-Konto an. Wenn Sie Zugriff gewähren, kann dieses Objekt jederzeit und ohne weitere Warnung Ihr Konto belasten bzw. ganz leeren.
@@ -3174,6 +3368,10 @@ Sie haben eine [RESOLUTION]-gebackene Textur für „[BODYREGION]“ nach [TIME]
( [EXISTENCE] Sekunden am Leben)
Sie haben lokal eine [RESOLUTION]-gebackene Textur für „[BODYREGION]“ nach [TIME] Sekunden aktualisiert.
</notification>
+ <notification name="CannotUploadTexture">
+ Textur kann nicht hochgeladen werden.
+[REASON]
+ </notification>
<notification name="LivePreviewUnavailable">
Wir können keine Vorschau dieser Textur anzeigen, da sie nicht kopier- und/oder übertragungsfähig ist.
<usetemplate ignoretext="Hinweis anzeigen, wenn bei nicht kopier- und/oder übertragungsfähigen Texturen keine Live-Vorschau möglich ist" name="okignore" yestext="OK"/>
@@ -3747,9 +3945,11 @@ Warten Sie kurz und versuchen Sie es noch einmal.
</notification>
<notification name="TeleportedByAttachment">
Sie wurden von einem Anhang an [ITEM_ID] teleportiert
+ <usetemplate ignoretext="Teleport: Sie wurden von einem Anhang teleportiert" name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOnParcel">
Sie wurden von Objekt „[OBJECT_NAME]“ auf der Parzelle „[PARCEL_NAME]“ teleportiert
+ <usetemplate ignoretext="Teleport: Sie wurden von einem Objekt in einer Parzelle teleportiert" name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOwnedBy">
Sie wurden von Objekt „[OBJECT_NAME]“, das [OWNER_ID] gehört, teleportiert
@@ -4081,7 +4281,7 @@ Wählen Sie eine kleinere Landfläche aus.
<usetemplate ignoretext="Dateien können nicht verschoben werden. Vorheriger Pfad wurde wiederhergestellt." name="okignore" yestext="OK"/>
</notification>
<notification name="DefaultObjectPermissions">
- Die Standardberechtigungen konnten aus folgendem Grund nicht gespeichert werden: [REASON]. Versuchen Sie später, die Standardberechtigungen einzustellen.
+ Problem beim Speichern der standardmäßigen Objektberechtigungen: [REASON]. Versuchen Sie später, die Standardberechtigungen einzustellen.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ChatHistoryIsBusyAlert">
diff --git a/indra/newview/skins/default/xui/de/panel_experience_info.xml b/indra/newview/skins/default/xui/de/panel_experience_info.xml
new file mode 100644
index 0000000000..7231719561
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_experience_info.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_experience_info">
+ <text name="title" value="Erlebnisprofil"/>
+ <scroll_container name="xp_scroll">
+ <panel name="scrolling_panel">
+ <layout_stack>
+ <layout_panel>
+ <text name="experience_title" value="Kyle&apos;s Superhero RPG"/>
+ </layout_panel>
+ <layout_panel name="location panel">
+ <text name="Location">
+ Standort:
+ </text>
+ <text name="LocationTextText">
+ irgendwo
+ </text>
+ <button label="Teleportieren" name="teleport_btn"/>
+ <button label="Karte" name="map_btn"/>
+ </layout_panel>
+ <layout_panel name="marketplace panel">
+ <text name="Location">
+ Marketplace-Laden:
+ </text>
+ <text name="LocationTextText">
+ irgendwo
+ </text>
+ </layout_panel>
+ <layout_panel>
+ <text name="ContentRating">
+ Einstufung:
+ </text>
+ <text name="ContentRatingText">
+ Adult
+ </text>
+ <text name="Owner">
+ Eigentümer:
+ </text>
+ <text name="OwnerText">
+ Kyle
+ </text>
+ <button label="Bearbeiten" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_experience_list_editor.xml b/indra/newview/skins/default/xui/de/panel_experience_list_editor.xml
new file mode 100644
index 0000000000..b87c814485
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_experience_list_editor.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="experince_list_editor">
+ <panel.string name="loading">
+ wird geladen...
+ </panel.string>
+ <panel.string name="panel_allowed">
+ Zulässige Erlebnisse:
+ </panel.string>
+ <panel.string name="panel_blocked">
+ Blockierte Erlebnisse:
+ </panel.string>
+ <panel.string name="panel_trusted">
+ Schlüsselerlebnisse:
+ </panel.string>
+ <panel.string name="no_results">
+ (leer)
+ </panel.string>
+ <text name="text_name">
+ Erlebnisliste
+ </text>
+ <scroll_list name="experience_list">
+ <columns label="Name" name="experience_name"/>
+ </scroll_list>
+ <button label="Hinzufügen..." name="btn_add"/>
+ <button label="Entfernen" name="btn_remove"/>
+ <button label="Profil..." name="btn_profile"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_experience_list_item.xml b/indra/newview/skins/default/xui/de/panel_experience_list_item.xml
new file mode 100644
index 0000000000..cfffa27a20
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_experience_list_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiences">
+ <text name="experience_name">
+ Dummy-Name
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_experience_log.xml b/indra/newview/skins/default/xui/de/panel_experience_log.xml
new file mode 100644
index 0000000000..393bbbbf8e
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_experience_log.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="EVENTS">
+ <string name="no_events" value="Keine Events."/>
+ <string name="loading" value="Laden..."/>
+ <layout_stack>
+ <layout_panel>
+ <scroll_list name="experience_log_list">
+ <columns label="Zeit" name="time"/>
+ <columns label="Event" name="event"/>
+ <columns label="Erlebnis" name="experience_name"/>
+ <columns label="Objekt" name="object_name"/>
+ </scroll_list>
+ <button label="Benachrichtigen" name="btn_notify"/>
+ <button label="Profil" name="btn_profile_xp"/>
+ <button label="Melden" name="btn_report_xp"/>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <check_box label="Alle Events benachrichtigen Tage" name="notify_all"/>
+ <button label="Entfernen" name="btn_clear"/>
+ <button label="&lt;" name="btn_prev"/>
+ <button label="&gt;" name="btn_next"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_experience_search.xml b/indra/newview/skins/default/xui/de/panel_experience_search.xml
new file mode 100644
index 0000000000..e556335213
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_experience_search.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="SEARCH">
+ <string name="not_found">
+ „[TEXT]“ nicht gefunden
+ </string>
+ <string name="no_results">
+ Keine Ergebnisse
+ </string>
+ <string name="searching">
+ Suchen...
+ </string>
+ <string name="loading">
+ Laden...
+ </string>
+ <string name="maturity_icon_general">
+ &quot;Parcel_PG_Light&quot;
+ </string>
+ <string name="maturity_icon_moderate">
+ &quot;Parcel_M_Light&quot;
+ </string>
+ <string name="maturity_icon_adult">
+ &quot;Parcel_R_Light&quot;
+ </string>
+ <panel name="search_panel">
+ <button label="Los" name="find"/>
+ <icons_combo_box label="Moderat" name="maturity">
+ <icons_combo_box.item label="Adult" name="Adult" value="42"/>
+ <icons_combo_box.item label="Moderat" name="Mature" value="21"/>
+ <icons_combo_box.item label="Allgemein" name="PG" value="13"/>
+ </icons_combo_box>
+ <scroll_list name="search_results">
+ <columns label="Name" name="experience_name"/>
+ <columns label="Eigentümer" name="owner"/>
+ </scroll_list>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+ <button label="Profil anzeigen" name="profile_btn"/>
+ <button label="&lt;" name="left_btn"/>
+ <button label="&gt;" name="right_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_experiences.xml b/indra/newview/skins/default/xui/de/panel_experiences.xml
new file mode 100644
index 0000000000..6c1630d973
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_experiences.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiences">
+ <string name="loading_experiences" value="Erlebnisse werden geladen..."/>
+ <string name="no_experiences" value="Keine Erlebnisse."/>
+ <string name="acquire" value="Erlebnis erwerben"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_facebook_friends.xml b/indra/newview/skins/default/xui/de/panel_facebook_friends.xml
index 9712d681c7..f6a8fda23e 100644
--- a/indra/newview/skins/default/xui/de/panel_facebook_friends.xml
+++ b/indra/newview/skins/default/xui/de/panel_facebook_friends.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_friends">
<string name="facebook_friends_empty" value="Sie haben gegenwärtig keine Facebook-Freunde, die gleichzeitig Einwohner von Second Life sind. Laden Sie Ihre Facebook-Freunde ein, Second Life beizutreten!"/>
- <string name="facebook_friends_no_connected" value="Sie sind gegenwärtig nicht mit Facebook verbunden. Um eine Verbindung herzustellen und diese Funktion zu aktivieren, gehen Sie zur Registerkarte „Konto“."/>
+ <string name="facebook_friends_no_connected" value="Sie sind gegenwärtig nicht mit Facebook verbunden. Um eine Verbindung herzustellen und diese Funktion zu aktivieren, gehen Sie zur Registerkarte „Status“."/>
<accordion name="friends_accordion">
<accordion_tab name="tab_second_life_friends" title="SL-Freunde"/>
<accordion_tab name="tab_suggested_friends" title="Diese Personen als SL-Freunde hinzufügen"/>
diff --git a/indra/newview/skins/default/xui/de/panel_facebook_photo.xml b/indra/newview/skins/default/xui/de/panel_facebook_photo.xml
index a1aabcd29c..bc48931129 100644
--- a/indra/newview/skins/default/xui/de/panel_facebook_photo.xml
+++ b/indra/newview/skins/default/xui/de/panel_facebook_photo.xml
@@ -1,26 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Bildauflösung">
- <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="1200x630" name="1200x630"/>
- </combo_box>
- <combo_box name="filters_combobox" tool_tip="Bildfilter">
- <combo_box.item label="Kein Filter" name="NoFilter"/>
- </combo_box>
- <button label="Aktualisieren" name="new_snapshot_btn" tool_tip="Zum Aktualisieren klicken"/>
- <button label="Vorschau" name="big_preview_btn" tool_tip="Klicken, um Vorschau ein-/auszuschalten"/>
- <text name="caption_label">
- Kommentar (optional):
- </text>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Posten" name="post_photo_btn"/>
- <button label="Abbrechen" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <combo_box name="resolution_combobox" tool_tip="Bildauflösung">
+ <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1200x630" name="1200x630"/>
+ </combo_box>
+ <combo_box name="filters_combobox" tool_tip="Bildfilter">
+ <combo_box.item label="Kein Filter" name="NoFilter"/>
+ </combo_box>
+ <button label="Aktualisieren" name="new_snapshot_btn" tool_tip="Zum Aktualisieren klicken"/>
+ <button label="Vorschau" name="big_preview_btn" tool_tip="Klicken, um Vorschau ein-/auszuschalten"/>
+ <text name="caption_label">
+ Kommentar (optional):
+ </text>
+ <button label="Posten" name="post_photo_btn"/>
+ <button label="Abbrechen" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_facebook_place.xml b/indra/newview/skins/default/xui/de/panel_facebook_place.xml
index 0f556565b4..102be80502 100644
--- a/indra/newview/skins/default/xui/de/panel_facebook_place.xml
+++ b/indra/newview/skins/default/xui/de/panel_facebook_place.xml
@@ -1,17 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_place">
- <layout_stack name="stack_place">
- <layout_panel name="place_detail_panel">
- <text name="place_caption_label">
- Details zu Ihrem aktuellen Standort:
- </text>
- </layout_panel>
- <layout_panel name="place_map_panel">
- <check_box initial_value="false" label="" name="add_place_view_cb"/>
- </layout_panel>
- <layout_panel name="place_button_panel">
- <button label="Posten" name="post_place_btn"/>
- <button label="Abbrechen" name="cancel_place_btn"/>
- </layout_panel>
- </layout_stack>
+ <text name="place_caption_label">
+ Details zu Ihrem aktuellen Standort:
+ </text>
+ <check_box initial_value="false" label="Draufsicht des Standorts einschließen" name="add_place_view_cb"/>
+ <button label="Posten" name="post_place_btn"/>
+ <button label="Abbrechen" name="cancel_place_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_facebook_status.xml b/indra/newview/skins/default/xui/de/panel_facebook_status.xml
index 437243c360..23c9d3b75f 100644
--- a/indra/newview/skins/default/xui/de/panel_facebook_status.xml
+++ b/indra/newview/skins/default/xui/de/panel_facebook_status.xml
@@ -1,14 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_status">
- <layout_stack name="stack_status">
- <layout_panel name="status_detail_panel">
- <text name="status_caption_label">
- Was machst du gerade?
- </text>
- </layout_panel>
- <layout_panel name="status_button_panel">
- <button label="Posten" name="post_status_btn"/>
- <button label="Abbrechen" name="cancel_status_btn"/>
- </layout_panel>
- </layout_stack>
+ <string name="facebook_connected" value="Sie sind mit Facebook verbunden als:"/>
+ <string name="facebook_disconnected" value="Nicht mit Facebook verbunden"/>
+ <text name="account_caption_label">
+ Nicht mit Facebook verbunden.
+ </text>
+ <panel name="panel_buttons">
+ <button label="Verbinden..." name="connect_btn"/>
+ <button label="Trennen" name="disconnect_btn"/>
+ <text name="account_learn_more_label">
+ [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 Anweisungen zum Posten auf Facebook]
+ </text>
+ </panel>
+ <text name="status_caption_label">
+ Was machst du gerade?
+ </text>
+ <button label="Posten" name="post_status_btn"/>
+ <button label="Abbrechen" name="cancel_status_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_flickr_photo.xml b/indra/newview/skins/default/xui/de/panel_flickr_photo.xml
index 1627f405c5..38b5302fef 100644
--- a/indra/newview/skins/default/xui/de/panel_flickr_photo.xml
+++ b/indra/newview/skins/default/xui/de/panel_flickr_photo.xml
@@ -1,41 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_flickr_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Bildauflösung">
- <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- </combo_box>
- <combo_box name="filters_combobox" tool_tip="Bildfilter">
- <combo_box.item label="Kein Filter" name="NoFilter"/>
- </combo_box>
- <button label="Aktualisieren" name="new_snapshot_btn" tool_tip="Zum Aktualisieren klicken"/>
- <button label="Vorschau" name="big_preview_btn" tool_tip="Klicken, um Vorschau ein-/auszuschalten"/>
- <text name="title_label">
- Titel:
- </text>
- <text name="description_label">
- Beschreibung:
- </text>
- <check_box initial_value="true" label="SL-Standort am Ende der Beschreibung hinzufügen" name="add_location_cb"/>
- <text name="tags_label">
- Markierungen:
- </text>
- <text name="tags_help_label">
- Markierungen durch Leerzeichen trennen.
+ <combo_box name="resolution_combobox" tool_tip="Bildauflösung">
+ <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ </combo_box>
+ <combo_box name="filters_combobox" tool_tip="Bildfilter">
+ <combo_box.item label="Kein Filter" name="NoFilter"/>
+ </combo_box>
+ <button label="Aktualisieren" name="new_snapshot_btn" tool_tip="Zum Aktualisieren klicken"/>
+ <button label="Vorschau" name="big_preview_btn" tool_tip="Klicken, um Vorschau ein-/auszuschalten"/>
+ <text name="title_label">
+ Titel:
+ </text>
+ <text name="description_label">
+ Beschreibung:
+ </text>
+ <check_box initial_value="true" label="SL-Standort am Ende der Beschreibung hinzufügen" name="add_location_cb"/>
+ <text name="tags_label">
+ Markierungen:
+ </text>
+ <text name="tags_help_label">
+ Markierungen durch Leerzeichen trennen.
Für Markierungen, die aus mehreren Wörtern bestehen, &quot;&quot; verwenden.
- </text>
- <combo_box name="rating_combobox" tool_tip="Flickr-Inhaltseinstufung">
- <combo_box.item label="Sichere Flickr-Einstufung" name="SafeRating"/>
- <combo_box.item label="Moderate Flickr-Einstufung" name="ModerateRating"/>
- <combo_box.item label="Beschränkte Flickr-Einstufung" name="RestrictedRating"/>
- </combo_box>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Hochladen" name="post_photo_btn"/>
- <button label="Abbrechen" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ </text>
+ <combo_box name="rating_combobox" tool_tip="Flickr-Inhaltseinstufung">
+ <combo_box.item label="Sichere Flickr-Einstufung" name="SafeRating"/>
+ <combo_box.item label="Moderate Flickr-Einstufung" name="ModerateRating"/>
+ <combo_box.item label="Beschränkte Flickr-Einstufung" name="RestrictedRating"/>
+ </combo_box>
+ <button label="Hochladen" name="post_photo_btn"/>
+ <button label="Abbrechen" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/de/panel_group_info_sidetray.xml
index 1775394ecd..92c2a4b83a 100755
--- a/indra/newview/skins/default/xui/de/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_info_sidetray.xml
@@ -23,6 +23,7 @@
<accordion_tab name="group_roles_tab" title="Rollen und Mitglieder"/>
<accordion_tab name="group_notices_tab" title="Mitteilungen"/>
<accordion_tab name="group_land_tab" title="Land/Kapital"/>
+ <accordion_tab name="group_experiences_tab" title="Erlebnisse"/>
</accordion>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml
index 816f22178c..32c9598edf 100755
--- a/indra/newview/skins/default/xui/de/panel_login.xml
+++ b/indra/newview/skins/default/xui/de/panel_login.xml
@@ -1,26 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_login">
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=de
- </panel.string>
+ <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=de</panel.string>
<layout_stack name="ui_stack">
<layout_panel name="ui_container">
<combo_box label="Benutzername" name="username_combo" tool_tip="Bei der Registrierung gewählter Benutzername wie „berndschmidt12“ oder „Liebe Sonne“"/>
<line_editor label="Kennwort" name="password_edit"/>
- <check_box label="Details speichern" name="remember_check"/>
- <text name="forgot_password_text">
- Kennwort vergessen
- </text>
- <button label="Anmelden" name="connect_btn"/>
- <text name="At_My_Last_Location_Label">
- bei letztem Ort
- </text>
<combo_box label="Meine Lieblingsorte" name="start_location_combo">
+ <combo_box.item label="Mein letzter Standort" name="MyLastLocation"/>
<combo_box.item label="Mein Zuhause" name="MyHome"/>
</combo_box>
- <button label="Anmelden" name="connect_favorite_btn"/>
- <line_editor label="Ort eingeben" name="location_edit"/>
- <button label="Anmelden" name="connect_location_btn"/>
+ <button label="Anmelden" name="connect_btn"/>
+ <check_box label="Details speichern" name="remember_check"/>
+ <text name="forgot_password_text">Kennwort vergessen</text>
<combo_box label="Grid auswählen" name="server_combo"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/de/panel_marketplace_listings.xml b/indra/newview/skins/default/xui/de/panel_marketplace_listings.xml
new file mode 100644
index 0000000000..bc9065e185
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_marketplace_listings.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Marktplatz" name="Marketplace Panel">
+ <panel name="tool_panel">
+ <menu_button name="sort_btn" tool_tip="Anzeige-/Sortieroptionen"/>
+ <button name="add_btn" tool_tip="Neuen Auflistungsordner erstellen"/>
+ <button label="Auf Fehler prüfen" name="audit_btn" tool_tip="Marktplatz-Auflistungen überprüfen"/>
+ </panel>
+ <panel name="tab_container_panel">
+ <filter_editor label="Marktplatz-Auflistungen filtern" name="filter_editor"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_marketplace_listings_inventory.xml b/indra/newview/skins/default/xui/de/panel_marketplace_listings_inventory.xml
new file mode 100644
index 0000000000..becf79b0a2
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_marketplace_listings_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="ALLE" name="All Items" tool_tip="Objekte zum Auflisten hier ablegen"/>
diff --git a/indra/newview/skins/default/xui/de/panel_marketplace_listings_listed.xml b/indra/newview/skins/default/xui/de/panel_marketplace_listings_listed.xml
new file mode 100644
index 0000000000..63c4f34bad
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_marketplace_listings_listed.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="AUFGELISTET" name="Active Items"/>
diff --git a/indra/newview/skins/default/xui/de/panel_marketplace_listings_unassociated.xml b/indra/newview/skins/default/xui/de/panel_marketplace_listings_unassociated.xml
new file mode 100644
index 0000000000..26908c3e25
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_marketplace_listings_unassociated.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="NICHT VERKNÜPFT" name="Unassociated Items"/>
diff --git a/indra/newview/skins/default/xui/de/panel_marketplace_listings_unlisted.xml b/indra/newview/skins/default/xui/de/panel_marketplace_listings_unlisted.xml
new file mode 100644
index 0000000000..00ea1e6fe7
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_marketplace_listings_unlisted.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="NICHT AUFGELISTET" name="Inactive Items"/>
diff --git a/indra/newview/skins/default/xui/de/panel_postcard_settings.xml b/indra/newview/skins/default/xui/de/panel_postcard_settings.xml
index e6d3b7de66..93b4121db5 100755
--- a/indra/newview/skins/default/xui/de/panel_postcard_settings.xml
+++ b/indra/newview/skins/default/xui/de/panel_postcard_settings.xml
@@ -9,7 +9,7 @@
</combo_box>
<spinner label="Breite x Höhe" name="postcard_snapshot_width"/>
<check_box label="Seitenverhältnis beibehalten" name="postcard_keep_aspect_check"/>
- <slider label="Qualität" name="image_quality_slider"/>
+ <slider label="Qualität:" name="image_quality_slider"/>
<text name="image_quality_level">
([QLVL])
</text>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
index 24e5033bfc..e6c90f21d1 100755
--- a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
@@ -14,9 +14,9 @@
<text name="Web:">
Web:
</text>
- <radio_group name="use_external_browser">
- <radio_item label="Meinen Browser verwenden (IE, Firefox, Safari)" name="external" tool_tip="Standard Webbrowser des Systems verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Bei Vollbildmodus nicht empfohlen." value="true"/>
- <radio_item label="Integrierten Browser verwenden" name="internal" tool_tip="Integrierten Webbrowser verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Dieser Browser öffnet als neues Fenster innerhalb von [APP_NAME]." value=""/>
+ <radio_group name="preferred_browser_behavior">
+ <radio_item label="Meinen Browser (Chrome, Firefox, IE) für alle Links verwenden" name="internal" tool_tip="Standard-Browser für Hilfe, Weblinks usw. verwenden. Im Vollbildmodus nicht empfohlen." value="0"/>
+ <radio_item label="Integrierten Browser nur für Linden Lab-/Second Life-Links verwenden" name="external" tool_tip="Verwenden Sie den Standard-Webbrowser Ihres Systems für Hilfe, Weblinks usw. Der integrierte Browser wird nur für Linden Lab-/Second Life-Links verwendet." value="1"/>
</radio_group>
<check_box initial_value="true" label="Plugins aktivieren" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Cookies annehmen" name="cookies_enabled"/>
diff --git a/indra/newview/skins/default/xui/de/panel_region_experiences.xml b/indra/newview/skins/default/xui/de/panel_region_experiences.xml
new file mode 100644
index 0000000000..6e193aba19
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_region_experiences.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Erlebnisse" name="Experiences">
+ <panel.string name="trusted_estate_text">
+ Jedes Erlebnis kann ein Schlüsselerlebnis sein.
+
+Schlüsselerlebnisse können in diesem Grundbesitz ausgeführt werden.
+
+Wenn der Grundbesitz keinen öffentlichen Zugang gestattet, können Einwohner, die an einem Schlüsselerlebnis teilnehmen, den Grundbesitz betreten und sich dort aufhalten, solange sie an einem Schlüsselerlebnis beteiligt sind.
+ </panel.string>
+ <panel.string name="allowed_estate_text">
+ Nur Erlebnisse mit Landumfang können zulässig sein.
+
+Zulässige Erlebnisse können in diesem Grundbesitz ausgeführt werden.
+ </panel.string>
+ <panel.string name="blocked_estate_text">
+ Nur Erlebnisse mit Gridumfang können blockiert werden.
+
+Blockierte Erlebnisse können in diesem Grundbesitz nicht ausgeführt werden.
+ </panel.string>
+ <panel.string name="estate_caption">
+ Änderungen wirken sich auf alle Regionen des Grundbesitzes aus.
+ </panel.string>
+ <panel.string name="allowed_parcel_text">
+ Nur Erlebnisse mit Landumfang können zulässig sein.
+
+Zulässige Erlebnisse können in dieser Parzelle ausgeführt werden, sofern sie nicht vom Grundbesitz blockiert sind.
+ </panel.string>
+ <panel.string name="blocked_parcel_text">
+ Jedes Einwohnererlebnis kann blockiert werden.
+
+Blockierte Erlebnisse können in dieser Parzelle nicht ausgeführt werden.
+ </panel.string>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_script_experience.xml b/indra/newview/skins/default/xui/de/panel_script_experience.xml
new file mode 100644
index 0000000000..192e661925
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_script_experience.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel name="script_experience" title="ERLEBNIS">
+ <button label="Erlebnis" name="Expand Experience"/>
+ <check_box label="Verwendet Erlebnis" name="enable_xp"/>
+ <layout_stack name="xp_details">
+ <layout_panel>
+ <combo_box label="Erlebnis auswählen..." name="Experiences..."/>
+ </layout_panel>
+ </layout_stack>
+ <text name="No Experiences">
+ Sie tragen zu keinen Erlebnissen bei.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml
index d13f56ed3d..2b8c4e6cd1 100755
--- a/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml
@@ -3,18 +3,18 @@
<text name="title">
Inventar
</text>
- <text name="hint_lbl">
- Das Speichern eines Bilds in Ihrem Inventar kostet [UPLOAD_COST] L$. Um das Bild als Textur zu speichern, wählen Sie eines der quadratischen Formate aus.
- </text>
<combo_box label="Auflösung" name="texture_size_combo">
- <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
<combo_box.item label="Klein (128x128)" name="Small(128x128)"/>
<combo_box.item label="Mittel (256x256)" name="Medium(256x256)"/>
<combo_box.item label="Groß (512x512)" name="Large(512x512)"/>
<combo_box.item label="Benutzerdefiniert" name="Custom"/>
</combo_box>
<spinner label="Breite x Höhe" name="inventory_snapshot_width"/>
+ <spinner label="" name="inventory_snapshot_height"/>
<check_box label="Seitenverhältnis beibehalten" name="inventory_keep_aspect_check"/>
+ <text name="hint_lbl">
+ Das Speichern eines Bilds in Ihrem Inventar kostet [UPLOAD_COST] L$. Um das Bild als Textur zu speichern, wählen Sie eines der quadratischen Formate aus.
+ </text>
<button label="Abbrechen" name="cancel_btn"/>
<button label="Speichern" name="save_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_local.xml b/indra/newview/skins/default/xui/de/panel_snapshot_local.xml
index 53e78ba290..9182c14063 100755
--- a/indra/newview/skins/default/xui/de/panel_snapshot_local.xml
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_local.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_local">
<text name="title">
- Festplatte
+ Datenträger
</text>
<combo_box label="Auflösung" name="local_size_combo">
<combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
@@ -15,15 +15,15 @@
</combo_box>
<spinner label="Breite x Höhe" name="local_snapshot_width"/>
<check_box label="Seitenverhältnis beibehalten" name="local_keep_aspect_check"/>
+ <text name="local_format_label">
+ Format:
+ </text>
<combo_box label="Format" name="local_format_combo">
<combo_box.item label="PNG (verlustfrei)" name="PNG"/>
<combo_box.item label="JPEG" name="JPEG"/>
<combo_box.item label="BMP (verlustfrei)" name="BMP"/>
</combo_box>
- <slider label="Qualität" name="image_quality_slider"/>
- <text name="image_quality_level">
- ([QLVL])
- </text>
+ <slider label="Qualität:" name="image_quality_slider"/>
<button label="Abbrechen" name="cancel_btn"/>
<flyout_button label="Speichern" name="save_btn" tool_tip="Bild als Datei speichern">
<flyout_button.item label="Speichern" name="save_item"/>
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_options.xml b/indra/newview/skins/default/xui/de/panel_snapshot_options.xml
index 7ec22adc4c..82e2b56f3f 100755
--- a/indra/newview/skins/default/xui/de/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_options.xml
@@ -1,16 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_options">
- <button label="Ins Profil hochladen" name="save_to_profile_btn"/>
+ <button label="Auf Datenträger speichern" name="save_to_computer_btn"/>
+ <button label="In Inventar speichern ([AMOUNT] L$)" name="save_to_inventory_btn"/>
+ <button label="In Profil hochladen" name="save_to_profile_btn"/>
+ <button label="Auf Facebook hochladen" name="send_to_facebook_btn"/>
+ <button label="Auf Twitter hochladen" name="send_to_twitter_btn"/>
+ <button label="Auf Flickr hochladen" name="send_to_flickr_btn"/>
<button label="Per E-Mail senden" name="save_to_email_btn"/>
- <button label="Im Inventar speichern" name="save_to_inventory_btn"/>
- <button label="Auf Festplatte speichern" name="save_to_computer_btn"/>
- <text name="send_to_facebook_textbox">
- Senden an: [secondlife:/// Facebook]
- </text>
- <text name="send_to_twitter_textbox">
- [secondlife:/// Twitter]
- </text>
- <text name="send_to_flickr_textbox">
- [secondlife:/// Flickr]
- </text>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml
index ead56f2885..3f5bbda724 100755..100644
--- a/indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml
@@ -13,9 +13,9 @@
E-Mail
</text>
<tab_container name="postcard_tabs">
- <panel name="panel_postcard_message" label="Nachricht"/>
- <panel name="panel_postcard_settings" label="Einstellungen"/>
+ <panel label="Nachricht" name="panel_postcard_message"/>
+ <panel label="Einstellungen" name="panel_postcard_settings"/>
</tab_container>
- <button name="cancel_btn" label="Abbrechen"/>
- <button name="send_btn" label="Absenden"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+ <button label="Senden" name="send_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/de/panel_snapshot_profile.xml
index 0f21edd1b6..8c856b87a2 100755
--- a/indra/newview/skins/default/xui/de/panel_snapshot_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_profile.xml
@@ -4,11 +4,11 @@
Profil
</text>
<combo_box label="Auflösung" name="profile_size_combo">
- <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="Benutzerdefiniert" name="Custom"/>
+ <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Benutzerdefiniert" name="Custom"/>
</combo_box>
<spinner label="Breite x Höhe" name="profile_snapshot_width"/>
<check_box label="Seitenverhältnis beibehalten" name="profile_keep_aspect_check"/>
diff --git a/indra/newview/skins/default/xui/de/panel_status_bar.xml b/indra/newview/skins/default/xui/de/panel_status_bar.xml
index 14ace0ac3a..d3d85de3c3 100755
--- a/indra/newview/skins/default/xui/de/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/de/panel_status_bar.xml
@@ -1,28 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <panel.string name="packet_loss_tooltip">
- Paketverlust
- </panel.string>
- <panel.string name="bandwidth_tooltip">
- Bandbreite
- </panel.string>
- <panel.string name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string name="timeTooltip">
- [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
- </panel.string>
- <panel.string name="buycurrencylabel">
- [AMT] L$
- </panel.string>
+ <panel.string name="packet_loss_tooltip">Paketverlust</panel.string>
+ <panel.string name="bandwidth_tooltip">Bandbreite</panel.string>
+ <panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>
+ <panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>
+ <panel.string name="buycurrencylabel">[AMT] L$</panel.string>
<panel left="-415" name="balance_bg" width="205">
- <text name="balance" tool_tip="Klicken, um L$-Guthaben zu aktualisieren" value="20 L$"/>
+ <text name="balance" tool_tip="Klicken, um L$-Guthaben zu aktualisieren" value="L$ ??"/>
<button label="L$ kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/>
<button label="Einkaufen" name="goShop" tool_tip="Second Life-Marktplatz öffnen" width="85"/>
</panel>
- <text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)">
- 24:00 H PST
- </text>
+ <text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)">24:00 H PST</text>
<button name="media_toggle_btn" tool_tip="Alle Medien starten/stoppen (Musik, Video, Webseiten)"/>
<button name="volume_btn" tool_tip="Steuerung der Gesamtlautstärke"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_twitter_photo.xml b/indra/newview/skins/default/xui/de/panel_twitter_photo.xml
index 89c4b98ffc..e637253983 100644
--- a/indra/newview/skins/default/xui/de/panel_twitter_photo.xml
+++ b/indra/newview/skins/default/xui/de/panel_twitter_photo.xml
@@ -1,32 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_twitter_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="text_panel">
- <text name="status_label">
- Was ist los?
- </text>
- <text name="status_counter_label">
- 140
- </text>
- <check_box initial_value="true" label="SL-Standort hinzufügen" name="add_location_cb"/>
- <check_box initial_value="true" label="Foto hinzufügen" name="add_photo_cb"/>
- </layout_panel>
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Bildauflösung">
- <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- </combo_box>
- <combo_box name="filters_combobox" tool_tip="Bildfilter">
- <combo_box.item label="Kein Filter" name="NoFilter"/>
- </combo_box>
- <button label="Aktualisieren" name="new_snapshot_btn" tool_tip="Zum Aktualisieren klicken"/>
- <button label="Vorschau" name="big_preview_btn" tool_tip="Klicken, um Vorschau ein-/auszuschalten"/>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Tweeten" name="post_photo_btn"/>
- <button label="Abbrechen" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <text name="status_label">
+ Was ist los?
+ </text>
+ <text name="status_counter_label">
+ 140
+ </text>
+ <check_box initial_value="true" label="SL-Standort hinzufügen" name="add_location_cb"/>
+ <check_box initial_value="true" label="Foto hinzufügen" name="add_photo_cb"/>
+ <combo_box name="resolution_combobox" tool_tip="Bildauflösung">
+ <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ </combo_box>
+ <combo_box name="filters_combobox" tool_tip="Bildfilter">
+ <combo_box.item label="Kein Filter" name="NoFilter"/>
+ </combo_box>
+ <button label="Aktualisieren" name="new_snapshot_btn" tool_tip="Zum Aktualisieren klicken"/>
+ <button label="Vorschau" name="big_preview_btn" tool_tip="Klicken, um Vorschau ein-/auszuschalten"/>
+ <button label="Tweeten" name="post_photo_btn"/>
+ <button label="Abbrechen" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/role_actions.xml b/indra/newview/skins/default/xui/de/role_actions.xml
index d834fc57ca..e3fbe2a630 100755
--- a/indra/newview/skins/default/xui/de/role_actions.xml
+++ b/indra/newview/skins/default/xui/de/role_actions.xml
@@ -71,4 +71,8 @@
<action description="Gruppen-Voice-Chat beitreten" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Gruppen-Voice-Chat beitreten. HINWEIS: Sie benötigen die Fähigkeit „Gruppen-Chat beitreten“, um Zugang zu dieser Voice-Chat-Sitzung zu erhalten." name="join voice chat" value="27"/>
<action description="Gruppen-Chat moderieren" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können den Zugang zu und die Teilnahme an Gruppen-Chat- und Voice-Chat-Sitzungen steuern." name="moderate group chat" value="37"/>
</action_set>
+ <action_set description="Diese Fähigkeiten enthalten die Berechtigung, die Erlebnisse zu ändern, die dieser Gruppe gehören." name="experience_tools_experience">
+ <action description="Erlebnis-Administrator" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können die Metadaten für ein Erlebnis ändern." name="experience admin" value="49"/>
+ <action description="Erlebnis-Contributor" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Skripts für ein Erlebnis beitragen." name="experience contributor" value="50"/>
+ </action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml
index 1b67eaf03b..f7dc265cf4 100755
--- a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="item properties" title="Objektprofil">
+ <panel.string name="loading_experience">
+ (laden)
+ </panel.string>
<panel.string name="unknown">
(unbekannt)
</panel.string>
@@ -43,6 +46,9 @@
<text name="LabelAcquiredTitle">
Erworben:
</text>
+ <text name="LabelItemExperienceTitle">
+ Erlebnis:
+ </text>
<panel name="perms_inv">
<text name="perm_modify">
Sie können:
@@ -66,8 +72,9 @@
<check_box label="Übertragen" name="CheckNextOwnerTransfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/>
</panel>
<check_box label="Zum Verkauf" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
- <combo_box.item label="Kopieren" name="Copy"/>
+ <combo_box name="ComboBoxSaleType">
+ <combo_box.item label="Kopie" name="Copy"/>
+ <combo_box.item label="Inhalt" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
<spinner label="Preis: L$" name="Edit Cost"/>
diff --git a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml
index 29239033fe..c30611c66c 100755
--- a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml
@@ -1,71 +1,31 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="object properties" title="Objektprofil">
- <panel.string name="text deed continued">
- Übertragung
- </panel.string>
- <panel.string name="text deed">
- Übertragung
- </panel.string>
- <panel.string name="text modify info 1">
- Sie können dieses Objekt bearbeiten.
- </panel.string>
- <panel.string name="text modify info 2">
- Sie können diese Objekte bearbeiten.
- </panel.string>
- <panel.string name="text modify info 3">
- Sie können dieses Objekt nicht bearbeiten.
- </panel.string>
- <panel.string name="text modify info 4">
- Sie können diese Objekte nicht bearbeiten.
- </panel.string>
- <panel.string name="text modify info 5">
- Dieses Objekt kann nicht über eine Regionsgrenze hinweg geändert werden
- </panel.string>
- <panel.string name="text modify info 6">
- Diese Objekte können nicht über eine Regionsgrenze hinweg geändert werden
- </panel.string>
- <panel.string name="text modify warning">
- Diese Objekt verfügt über verknüpfte Teile
- </panel.string>
- <panel.string name="Cost Default">
- Preis: L$
- </panel.string>
- <panel.string name="Cost Total">
- Summe: L$
- </panel.string>
- <panel.string name="Cost Per Unit">
- Stückpreis: L$
- </panel.string>
- <panel.string name="Cost Mixed">
- Mischpreis
- </panel.string>
- <panel.string name="Sale Mixed">
- Mischverkauf
- </panel.string>
+ <panel.string name="text deed continued">Übertragung</panel.string>
+ <panel.string name="text deed">Übertragung</panel.string>
+ <panel.string name="text modify info 1">Sie können dieses Objekt bearbeiten.</panel.string>
+ <panel.string name="text modify info 2">Sie können diese Objekte bearbeiten.</panel.string>
+ <panel.string name="text modify info 3">Sie können dieses Objekt nicht bearbeiten.</panel.string>
+ <panel.string name="text modify info 4">Sie können diese Objekte nicht bearbeiten.</panel.string>
+ <panel.string name="text modify info 5">Dieses Objekt kann nicht über eine Regionsgrenze hinweg geändert werden</panel.string>
+ <panel.string name="text modify info 6">Diese Objekte können nicht über eine Regionsgrenze hinweg geändert werden</panel.string>
+ <panel.string name="text modify warning">Diese Objekt verfügt über verknüpfte Teile</panel.string>
+ <panel.string name="Cost Default">Preis: L$</panel.string>
+ <panel.string name="Cost Total">Summenpreis: L$</panel.string>
+ <panel.string name="Cost Per Unit">Stückpreis: L$</panel.string>
+ <panel.string name="Cost Mixed">Mischpreis</panel.string>
+ <panel.string name="Sale Mixed">Mischverkauf</panel.string>
<text name="title" value="Objektprofil"/>
<text name="where" value="(Inworld)"/>
<panel label="" name="properties_panel">
- <text name="Name:">
- Name:
- </text>
- <text name="Description:">
- Beschreibung:
- </text>
- <text name="CreatorNameLabel">
- Ersteller:
- </text>
- <text name="Owner:">
- Eigentümer:
- </text>
- <text name="Group_label">
- Gruppe:
- </text>
+ <text name="Name:">Name:</text>
+ <text name="Description:">Beschreibung:</text>
+ <text name="CreatorNameLabel">Ersteller:</text>
+ <text name="Owner:">Eigentümer:</text>
+ <text name="Group_label">Gruppe:</text>
<button name="button set group" tool_tip="Eine Gruppe auswählen, um die Berechtigungen des Objekts zu teilen."/>
<name_box initial_value="Wird geladen..." name="Group Name Proxy"/>
<button label="Übertragung" label_selected="Übertragung" name="button deed" tool_tip="Eine Übertragung bedeutet, dass das Objekt mit den Berechtigungen „Nächster Eigentümer“ weitergegeben wird. Mit der Gruppe geteilte Objekte können von einem Gruppen-Officer übertragen werden."/>
- <text name="label click action">
- Bei Linksklick:
- </text>
+ <text name="label click action">Bei Linksklick:</text>
<combo_box name="clickaction">
<combo_box.item label="Berühren (Standard)" name="Touch/grab(default)"/>
<combo_box.item label="Auf Objekt setzen" name="Sitonobject"/>
@@ -75,21 +35,13 @@
<combo_box.item label="Zoomen" name="Zoom"/>
</combo_box>
<panel name="perms_inv">
- <text name="perm_modify">
- Sie können dieses Objekt bearbeiten.
- </text>
- <text name="Anyone can:">
- Jeder:
- </text>
+ <text name="perm_modify">Sie können dieses Objekt bearbeiten.</text>
+ <text name="Anyone can:">Jeder:</text>
<check_box label="Kopieren" name="checkbox allow everyone copy"/>
<check_box label="Bewegen" name="checkbox allow everyone move"/>
- <text name="GroupLabel">
- Gruppe:
- </text>
+ <text name="GroupLabel">Gruppe:</text>
<check_box label="Teilen" name="checkbox share with group" tool_tip="Mit allen Mitgliedern der zugeordneten Gruppe, Ihre Berechtigungen dieses Objekt zu ändern, teilen. Sie müssen Übereignen, um Rollenbeschränkungen zu aktivieren."/>
- <text name="NextOwnerLabel">
- Nächster Eigentümer:
- </text>
+ <text name="NextOwnerLabel">Nächster Eigentümer:</text>
<check_box label="Bearbeiten" name="checkbox next owner can modify"/>
<check_box label="Kopieren" name="checkbox next owner can copy"/>
<check_box label="Transferieren" name="checkbox next owner can transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/>
@@ -102,27 +54,13 @@
</combo_box>
<spinner label="Preis: L$" name="Edit Cost"/>
<check_box label="In Suche anzeigen" name="search_check" tool_tip="Dieses Objekt in Suchergebnissen anzeigen"/>
- <text name="pathfinding_attributes_label">
- Pathfinding-Attribute:
- </text>
- <text name="B:">
- B:
- </text>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
+ <text name="pathfinding_attributes_label">Pathfinding-Attribute:</text>
+ <text name="B:">B:</text>
+ <text name="O:">O:</text>
+ <text name="G:">G:</text>
+ <text name="E:">E:</text>
+ <text name="N:">N:</text>
+ <text name="F:">F:</text>
</panel>
<panel name="button_panel">
<button label="Öffnen" name="open_btn"/>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index d4ce7b3fc3..35f5624c13 100755
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -449,30 +449,51 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="TooltipMustSingleDrop">
Sie können nur ein einzelnes Objekt hierher ziehen
</string>
+ <string name="TooltipTooManyWearables">
+ Sie können keinen Ordner tragen, der mehr als [AMOUNT] Elemente enthält. Sie können diesen Höchstwert unter „Erweitert“ &gt; „Debug-Einstellungen anzeigen“ &gt; „WearFolderLimit“ ändern.
+ </string>
<string name="TooltipPrice" value="[AMOUNT] L$"/>
<string name="TooltipOutboxDragToWorld">
- Sie können Artikel nicht in Ihrer Händler-Outbox rezzen
+ Sie können keine Objekte aus dem Marktplatz-Auflistungsordner rezzen
+ </string>
+ <string name="TooltipOutboxWorn">
+ Sie können Objekte, die Sie tragen, nicht in den Marktplatz-Auflistungsordner stellen
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ Tiefe der verschachtelten Ordner überschreitet [AMOUNT]. Reduzieren Sie die Ordnertiefe. Verpacken Sie ggf. einige Artikel.
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Anzahl von Unterordnern überschreitet [AMOUNT]. Reduzieren Sie die Anzahl von Ordnern in Ihrer Auflistung. Verpacken Sie ggf. einige Artikel.
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Anzahl von Objekten überschreitet [AMOUNT]. Um mehr als [AMOUNT] Objekte in einer Auflistung verkaufen zu können, müssen Sie einige davon verpacken.
+ </string>
+ <string name="TooltipOutboxTooManyStockItems">
+ Anzahl von Bestandsobjekten überschreitet [AMOUNT].
+ </string>
+ <string name="TooltipOutboxCannotDropOnRoot">
+ Sie können Objekte oder Ordner nur in der Registerkarte „Alle“ ablegen. Wählen Sie diese Registerkarte aus und verschieben Sie Ihre Objekte bzw. Ordner noch einmal.
</string>
<string name="TooltipOutboxNoTransfer">
- Einer oder mehrere dieser Artikel können nicht verkauft oder übertragen werden.
+ Mindestens eines dieser Objekte kann nicht verkauft oder übertragen werden
</string>
<string name="TooltipOutboxNotInInventory">
- Nur Artikel direkt aus Ihrem Inventar können in Ihre Händler-Outbox gelegt werden
+ Sie können nur Objekte aus Ihrem Inventar in den Marktplatz einstellen
</string>
- <string name="TooltipOutboxWorn">
- Artikel, die Sie tragen, können nicht in Ihre Händler-Outbox gelegt werden.
+ <string name="TooltipOutboxLinked">
+ Sie können keine verknüpften Objekte oder Ordner in den Marktplatz einstellen
</string>
<string name="TooltipOutboxCallingCard">
- Sie können keine Visitenkarten in Ihre Händler-Outbox legen
+ Sie können Visitenkarten nicht in den Marktplatz einstellen
</string>
- <string name="TooltipOutboxFolderLevels">
- Tiefe der verschachtelten Ordner überschreitet 3
+ <string name="TooltipOutboxDragActive">
+ Sie können keine gelistete Auflistung entfernen
</string>
- <string name="TooltipOutboxTooManyFolders">
- Anzahl von Unterordnern im obersten Ordner überschreitet 20
+ <string name="TooltipOutboxCannotMoveRoot">
+ Der Stammordner mit Marktplatz-Auflistungen kann nicht verschoben werden.
</string>
- <string name="TooltipOutboxTooManyObjects">
- Anzahl von Artikeln im obersten Ordner überschreitet 200
+ <string name="TooltipOutboxMixedStock">
+ Alle Objekte in einem Bestandsordner müssen vom gleichen Typ sein und die gleiche Berechtigung haben
</string>
<string name="TooltipDragOntoOwnChild">
Sie können einen Ordner nicht in einen seiner untergeordneten Ordner verschieben
@@ -1060,9 +1081,7 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="AgentNameSubst">
(Sie)
</string>
- <string name="JoinAnExperience">
- Bei einem Erlebnis mitmachen
- </string>
+ <string name="JoinAnExperience"/><!-- intentionally blank -->
<string name="SilentlyManageEstateAccess">
Beim Verwalten von Grundbesitzzugangslisten Warnhinweise unterdrücken
</string>
@@ -1129,6 +1148,12 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="bitmap_image_files">
Bitmap-Bilder
</string>
+ <string name="png_image_files">
+ PNG-Bilder
+ </string>
+ <string name="save_texture_image_files">
+ Targa- oder PNG-Bilder
+ </string>
<string name="avi_movie_file">
AVI-Filmdatei
</string>
@@ -1378,6 +1403,9 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="FavoritesNoMatchingItems">
Landmarke hier hin ziehen, um diese hinzuzufügen.
</string>
+ <string name="MarketplaceNoMatchingItems">
+ Keine übereinstimmenden Objekte gefunden. Überprüfen Sie die Schreibweise des Suchbegriffs und versuchen Sie es noch einmal.
+ </string>
<string name="InventoryNoTexture">
Sie haben keine Kopie dieser Textur in Ihrem Inventar.
</string>
@@ -1425,29 +1453,95 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="InventoryOutboxError">
Der [[MARKETPLACE_CREATE_STORE_URL] Marktplatz-Laden] gibt Fehler zurück.
</string>
+ <string name="InventoryMarketplaceError">
+ Diese Funktion befindet sich in der Betaphase. Wenn Sie teilnehmen möchten, tragen Sie sich in dieses [http://goo.gl/forms/FCQ7UXkakz Google-Formular] ein.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItemsTitle">
+ Ihr Ordner mit Marktplatz-Auflistungen ist leer.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItems">
+ Ziehen Sie Ordner in diesen Bereich, um sie im [[MARKETPLACE_DASHBOARD_URL] Marktplatz] zum Verkauf anzubieten.
+ </string>
+ <string name="Marketplace Validation Warning Stock">
+ Bestandsordner müssen in einem Versionsordner gespeichert sein
+ </string>
+ <string name="Marketplace Validation Error Mixed Stock">
+ : Fehler: Alle Objekte in einem Bestandsordner müssen kopiergeschützt und vom gleichen Typ sein.
+ </string>
+ <string name="Marketplace Validation Error Subfolder In Stock">
+ : Fehler: Bestandsordner kann keine Unterordner enthalten
+ </string>
+ <string name="Marketplace Validation Warning Empty">
+ : Warnung: Ordner enthält keine Objekte
+ </string>
+ <string name="Marketplace Validation Warning Create Stock">
+ : Warnung: Bestandsordner wird erstellt
+ </string>
+ <string name="Marketplace Validation Warning Create Version">
+ : Warnung: Versionsordner wird erstellt
+ </string>
+ <string name="Marketplace Validation Warning Move">
+ : Warnung: Objekte werden verschoben
+ </string>
+ <string name="Marketplace Validation Warning Delete">
+ : Warnung: Ordnerinhalte wurden in Bestandsordner übertragen; leerer Ordner wird entfernt
+ </string>
+ <string name="Marketplace Validation Error Stock Item">
+ : Fehler: Kopiergeschützte Objekte müssen in einem Bestandsordner gespeichert sein
+ </string>
+ <string name="Marketplace Validation Warning Unwrapped Item">
+ : Warnung: Objekte müssen in einem Versionsordner gespeichert sein
+ </string>
+ <string name="Marketplace Validation Error">
+ : Fehler:
+ </string>
+ <string name="Marketplace Validation Warning">
+ : Warnung:
+ </string>
+ <string name="Marketplace Validation Error Empty Version">
+ : Warnung: Versionsordner muss mindestens 1 Objekt enthalten
+ </string>
+ <string name="Marketplace Validation Error Empty Stock">
+ : Warnung: Bestandsordner muss mindestens 1 Objekt enthalten
+ </string>
+ <string name="Marketplace Validation No Error">
+ Keine Fehler oder Warnungen
+ </string>
<string name="Marketplace Error None">
Keine Fehler
</string>
+ <string name="Marketplace Error Prefix">
+ 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).
+ 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 name="Marketplace Error Not Accepted">
+ Objekt kann nicht in diesen Ordner verschoben werden.
</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 name="Marketplace Error Unsellable Item">
+ Dieses Objekt kann nicht im Marktplatz verkauft werden.
</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 name="MarketplaceNoID">
+ keine Mkt-ID
</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 name="MarketplaceLive">
+ aufgelistet
</string>
- <string name="Marketplace Error Unsellable Item">
- Fehler: Dieser Artikel kann nicht im Marktplatz verkauft werden.
+ <string name="MarketplaceActive">
+ aktiv
</string>
- <string name="Marketplace Error Internal Import">
- Fehler: Bei diesem Artikel ist ein Problem aufgetreten. Versuchen Sie es später erneut.
+ <string name="MarketplaceMax">
+ max.
+ </string>
+ <string name="MarketplaceStock">
+ Bestand
+ </string>
+ <string name="MarketplaceNoStock">
+ ausverkauft
+ </string>
+ <string name="MarketplaceUpdating">
+ Aktualisierung läuft...
</string>
<string name="Open landmarks">
Landmarken öffnen
@@ -1468,6 +1562,7 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
Keine Inhalte
</string>
<string name="WornOnAttachmentPoint" value=" (getragen am [ATTACHMENT_POINT])"/>
+ <string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/>
<string name="ActiveGesture" value="[GESLABEL] (aktiviert)"/>
<string name="PermYes">
Ja
@@ -1738,6 +1833,15 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="Invalid Attachment">
Ungültige Stelle für Anhang
</string>
+ <string name="ATTACHMENT_MISSING_ITEM">
+ Fehler: fehlendes Objekt
+ </string>
+ <string name="ATTACHMENT_MISSING_BASE_ITEM">
+ Fehler: Basisobjekt fehlt
+ </string>
+ <string name="ATTACHMENT_NOT_ATTACHED">
+ Fehler: Objekt ist im aktuellen Outfit, aber nicht angehängt
+ </string>
<string name="YearsMonthsOld">
[AGEYEARS] [AGEMONTHS] alt
</string>
@@ -1906,6 +2010,9 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="SaveComplete">
Speichervorgang abgeschlossen.
</string>
+ <string name="UploadFailed">
+ Datei-Upload fehlgeschlagen:
+ </string>
<string name="ObjectOutOfRange">
Skript (Objekt außerhalb des Bereichs)
</string>
@@ -1915,6 +2022,9 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="GroupsNone">
keine
</string>
+ <string name="CompileNoExperiencePerm">
+ Skript „[SCRIPT]“ mit Erlebnis „[EXPERIENCE]“ wird übersprungen.
+ </string>
<string name="Group" value=" (Gruppe)"/>
<string name="Unknown">
(unbekannt)
@@ -5066,6 +5176,9 @@ Setzen Sie den Editorpfad in Anführungszeichen
<string name="Command_Marketplace_Label">
Marktplatz
</string>
+ <string name="Command_MarketplaceListings_Label">
+ Marktplatz
+ </string>
<string name="Command_MiniMap_Label">
Minikarte
</string>
@@ -5153,6 +5266,9 @@ Setzen Sie den Editorpfad in Anführungszeichen
<string name="Command_Marketplace_Tooltip">
Einkaufen gehen
</string>
+ <string name="Command_MarketplaceListings_Tooltip">
+ Ihre Kreation verkaufen
+ </string>
<string name="Command_MiniMap_Tooltip">
Leute in der Nähe anzeigen
</string>
@@ -5276,4 +5392,85 @@ Setzen Sie den Editorpfad in Anführungszeichen
<string name="loading_chat_logs">
Laden...
</string>
+ <string name="experience_tools_experience">
+ Erlebnis
+ </string>
+ <string name="ExperienceNameNull">
+ (kein Erlebnis)
+ </string>
+ <string name="ExperienceNameUntitled">
+ (unbenanntes Erlebnis)
+ </string>
+ <string name="Land-Scope">
+ Landumfang
+ </string>
+ <string name="Grid-Scope">
+ Gridumfang
+ </string>
+ <string name="Allowed_Experiences_Tab">
+ ZULÄSSIG
+ </string>
+ <string name="Blocked_Experiences_Tab">
+ BLOCKIERT
+ </string>
+ <string name="Contrib_Experiences_Tab">
+ CONTRIBUTOR
+ </string>
+ <string name="Admin_Experiences_Tab">
+ ADMIN
+ </string>
+ <string name="Recent_Experiences_Tab">
+ AKTUELL
+ </string>
+ <string name="Owned_Experiences_Tab">
+ EIGENE
+ </string>
+ <string name="ExperiencesCounter">
+ ([EXPERIENCES], max. [MAXEXPERIENCES])
+ </string>
+ <string name="ExperiencePermission1">
+ Ihre Steuerungen übernehmen
+ </string>
+ <string name="ExperiencePermission3">
+ Animationen Ihres Avatars auslösen
+ </string>
+ <string name="ExperiencePermission4">
+ an Ihren Avatar anhängen
+ </string>
+ <string name="ExperiencePermission9">
+ Ihre Kamera vorfolgen
+ </string>
+ <string name="ExperiencePermission10">
+ Ihre Kamera steuern
+ </string>
+ <string name="ExperiencePermission11">
+ Sie teleportieren
+ </string>
+ <string name="ExperiencePermission12">
+ automatisch Erlebnisberechtigungen akzeptieren
+ </string>
+ <string name="ExperiencePermissionShortUnknown">
+ unbekannten Vorgang durchführen: [Permission]
+ </string>
+ <string name="ExperiencePermissionShort1">
+ Steuerungen übernehmen
+ </string>
+ <string name="ExperiencePermissionShort3">
+ Animationen auslösen
+ </string>
+ <string name="ExperiencePermissionShort4">
+ Anhängen
+ </string>
+ <string name="ExperiencePermissionShort9">
+ Kamera verfolgen
+ </string>
+ <string name="ExperiencePermissionShort10">
+ Kamera steuern
+ </string>
+ <string name="ExperiencePermissionShort11">
+ Teleportieren
+ </string>
+ <string name="ExperiencePermissionShort12">
+ Berechtigung
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/de/teleport_strings.xml b/indra/newview/skins/default/xui/de/teleport_strings.xml
index 8062633df6..e590db0dba 100755
--- a/indra/newview/skins/default/xui/de/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/de/teleport_strings.xml
@@ -49,6 +49,9 @@ Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in e
<message name="MustGetAgeRegion">
Sie müssen mindestens 18 Jahre alt sein, um diese Region betreten zu können.
</message>
+ <message name="RegionTPSpecialUsageBlocked">
+ Betreten der Region nicht gestattet. „[REGION_NAME]“ ist eine Region für Geschicklichkeitsspiele. Der Zutritt ist Einwohnern vorbehalten, die bestimmte Kriterien erfüllen. Weitere Details finden Sie unter [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ].
+ </message>
</message_set>
<message_set name="progress">
<message name="sending_dest">
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index 60f36770bb..ec87b3684e 100755
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -43,6 +43,14 @@
top_pad="5"
height="25"
width="180" />
+ <button
+ follows="left|top"
+ label="Check for updates"
+ name="update_btn"
+ left_pad="70"
+ top_delta="0"
+ height="25"
+ width="180" />
</panel>
<panel
border="true"
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index a660e812cc..edf028bf60 100755
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -23,15 +23,15 @@
</floater.string>
<floater.string
name="Minutes">
- [MINUTES] minutes
+ [MINUTES] min.
</floater.string>
<floater.string
name="Minute">
- minute
+ min.
</floater.string>
<floater.string
name="Seconds">
- [SECONDS] seconds
+ [SECONDS] sec.
</floater.string>
<floater.string
name="Remaining">
@@ -2013,7 +2013,7 @@ Only large parcels can be listed in search.
name="AllowedText"
top="0"
width="230">
- Allowed Residents
+ Allowed Residents ([COUNT])
</text>
<name_list
column_padding="0"
@@ -2062,7 +2062,7 @@ Only large parcels can be listed in search.
name="BanCheck"
top="0"
width="200">
- Banned Residents
+ Banned Residents ([COUNT])
</text>
<name_list
column_padding="0"
@@ -2096,5 +2096,17 @@ Only large parcels can be listed in search.
width="100" />
</panel>
</panel>
+ <panel
+ border="true"
+ follows="all"
+ label="EXPERIENCES"
+ layout="topleft"
+ left="0"
+ top="0"
+ help_topic="land_experiences_tab"
+ name="land_experiences_panel"
+ class="land_experiences_panel"
+ filename="panel_region_experiences.xml">
+ </panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_associate_listing.xml b/indra/newview/skins/default/xui/en/floater_associate_listing.xml
new file mode 100755
index 0000000000..e019ed58dd
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_associate_listing.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_minimize="false"
+ height="110"
+ layout="topleft"
+ name="associate listing"
+ help_topic="associate_listing"
+ title="ASSOCIATE LISTING"
+ width="375">
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ font="SansSerifLarge"
+ height="16"
+ layout="topleft"
+ left="10"
+ top="25"
+ name="message">
+ Listing ID:
+ </text>
+ <line_editor
+ type="string"
+ length="1"
+ follows="top|right"
+ font="SansSerif"
+ height="20"
+ layout="topleft"
+ left_delta="0"
+ name="listing_id"
+ top_pad="5"
+ width="350">
+ Type ID here
+ </line_editor>
+ <button
+ follows="bottom|left"
+ height="23"
+ label="OK"
+ layout="topleft"
+ left="155"
+ name="OK"
+ top_pad="10"
+ width="100" />
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left_pad="5"
+ name="Cancel"
+ width="100" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_bumps.xml b/indra/newview/skins/default/xui/en/floater_bumps.xml
index 1f2fe62b3c..126e3aac48 100755
--- a/indra/newview/skins/default/xui/en/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/en/floater_bumps.xml
@@ -7,7 +7,7 @@
help_topic="floater_bumps"
save_rect="true"
title="BUMPS, PUSHES &amp; HITS"
- width="400">
+ width="420">
<floater.string
name="none_detected">
None detected
@@ -34,7 +34,7 @@
</floater.string>
<floater.string
name="timeStr">
- [[hour,datetime,slt]:[min,datetime,slt]]
+ [[hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt]]
</floater.string>
<scroll_list
draw_border="false"
@@ -45,5 +45,5 @@
multi_select="true"
name="bump_list"
top="20"
- width="388" />
+ width="408" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_delete_pref_preset.xml b/indra/newview/skins/default/xui/en/floater_delete_pref_preset.xml
new file mode 100644
index 0000000000..0688fdb42c
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_delete_pref_preset.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<floater
+ legacy_header_height="18"
+ height="130"
+ help_topic="floater_delete_preset"
+ layout="topleft"
+ name="Delete Pref Preset"
+ save_rect="true"
+ title="DELETE PREF PRESET"
+ width="300">
+
+ <string name="title_graphic">Delete Graphic Preset</string>
+ <string name="title_camera">Delete Camera Preset</string>
+
+ <text
+ follows="top|left|right"
+ height="10"
+ layout="topleft"
+ left="20"
+ name="Preset"
+ top="30"
+ width="200">
+ Select a preset
+ </text>
+ <combo_box
+ follows="top|left"
+ layout="topleft"
+ left="20"
+ name="preset_combo"
+ top_delta="20"
+ width="200"/>
+ <button
+ follows="top|left"
+ height="23"
+ label="Delete"
+ layout="topleft"
+ top_delta="40"
+ left="20"
+ name="delete"
+ width="70"/>
+ <button
+ follows="top|left"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left_pad="20"
+ name="cancel"
+ width="70"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_experience_search.xml b/indra/newview/skins/default/xui/en/floater_experience_search.xml
new file mode 100644
index 0000000000..15a4b5665e
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_experience_search.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ positioning="cascading"
+ legacy_header_height="18"
+ can_resize="true"
+ height="350"
+ layout="topleft"
+ min_height="200"
+ min_width="400"
+ name="experiencepicker"
+ help_topic="experiencepicker"
+ title="CHOOSE EXPERIENCE"
+ width="350">
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_experienceprofile.xml b/indra/newview/skins/default/xui/en/floater_experienceprofile.xml
new file mode 100644
index 0000000000..2dfba1ac44
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_experienceprofile.xml
@@ -0,0 +1,688 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+
+<floater
+ positioning="cascading"
+ can_close="true"
+ enabled="true"
+ can_resize="true"
+ help_topic="floater_experienceprofile"
+ title="EXPERIENCE PROFILE"
+ save_rect="true"
+ min_width="325"
+ min_height="325"
+ width="358"
+ height="650">
+ <floater.string
+ name="empty_slurl">
+ (none)
+ </floater.string>
+ <floater.string
+ name="maturity_icon_general">
+ "Parcel_PG_Light"
+ </floater.string>
+ <floater.string
+ name="maturity_icon_moderate">
+ "Parcel_M_Light"
+ </floater.string>
+ <floater.string
+ name="maturity_icon_adult">
+ "Parcel_R_Light"
+ </floater.string>
+ <text
+ follows="top|left|right"
+ font="SansSerifHugeBold"
+ height="26"
+ layout="topleft"
+ left_pad="4"
+ name="edit_title"
+ top="2"
+ value="Experience Profile"
+ use_ellipses="true"
+ left="6"
+ right="-3"/>
+ <tab_container
+ hide_tabs="true"
+ follows="all"
+ height="615"
+ layout="topleft"
+ left="5"
+ min_height="250"
+ top_pad="3"
+ width="348"
+ name="tab_container">
+ <panel
+ background_visible="true"
+ follows="all"
+ height="540"
+ layout="topleft"
+ left="0"
+ min_height="250"
+ top="0"
+ width="348"
+ name="panel_experience_info">
+ <scroll_container
+ color="DkGray2"
+ follows="all"
+ height="520"
+ layout="topleft"
+ left="9"
+ name="xp_scroll"
+ opaque="true"
+ top_pad="10"
+ width="330">
+ <panel
+ bg_alpha_color="DkGray2"
+ follows="top|left|right"
+ height="550"
+ layout="topleft"
+ left="0"
+ name="scrolling_panel"
+ top="0"
+ width="315"
+ min_width="315">
+ <layout_stack
+ follows="all"
+ height="550"
+ layout="topleft"
+ left="0"
+ animate="false"
+ top="0"
+ orientation="vertical"
+ width="315">
+ <layout_panel
+ follows="all"
+ height="29"
+ layout="topleft"
+ left="0"
+ top="0"
+ auto_resize="false"
+ visible="false"
+ width="315"
+ name="top panel">
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ font="SansSerif"
+ height="19"
+ top="10"
+ layout="topleft"
+ left="10"
+ right="-123"
+ visible="false"
+ name="grid_wide"/>
+ <button
+ follows="top|right"
+ height="23"
+ label="Edit"
+ layout="topleft"
+ name="edit_btn"
+ width="100"
+ visible="false"
+ top_pad="-23"
+ right="-14"/>
+ </layout_panel>
+ <layout_panel
+ follows="all"
+ height="197"
+ layout="topleft"
+ left="0"
+ top="0"
+ auto_resize="false"
+ visible="false"
+ width="315"
+ name="image_panel">
+ <texture_picker
+ enabled="false"
+ fallback_image="default_land_picture.j2c"
+ follows="left|top"
+ height="197"
+ layout="topleft"
+ left="10"
+ name="logo"
+ top="10"
+ width="290" />
+ </layout_panel>
+ <layout_panel
+ follows="all"
+ height="19"
+ layout="topleft"
+ left="0"
+ top="5"
+ width="313"
+ auto_resize="false">
+ <text
+ follows="left|top|right"
+ font="SansSerifLarge"
+ height="14"
+ layout="topleft"
+ left="10"
+ name="experience_title"
+ top="0"
+ use_ellipses="true"
+ value=""
+ width="288"/>
+ </layout_panel>
+ <layout_panel
+ follows=""
+ height="50"
+ layout="topleft"
+ left="0"
+ top="0"
+ auto_resize="false"
+ width="315"
+ visible="false"
+ name="description panel">
+ <expandable_text
+ follows="left|top|right"
+ font="SansSerif"
+ height="50"
+ layout="topleft"
+ left="7"
+ name="experience_description"
+ top="0"
+ value=""
+ width="293"
+ textbox.max_length="2048"/>
+ </layout_panel>
+ <layout_panel
+ follows=""
+ height="18"
+ layout="topleft"
+ left="0"
+ top="0"
+ auto_resize="false"
+ width="315"
+ visible="true"
+ name="maturity panel">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="ContentRating"
+ width="75">
+ Rating:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="18"
+ layout="topleft"
+ left_pad="2"
+ valign="center"
+ name="ContentRatingText"
+ top_delta="-3"
+ width="188">
+ </text>
+ </layout_panel>
+ <layout_panel
+ follows="all"
+ height="46"
+ layout="topleft"
+ left="0"
+ top="5"
+ width="313"
+ visible="false"
+ auto_resize="false"
+ name="location panel">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="Location"
+ width="290">
+ Location:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="18"
+ layout="topleft"
+ left="10"
+ valign="center"
+ use_ellipses="true"
+ name="LocationTextText"
+ width="288">
+ </text>
+ </layout_panel>
+ <layout_panel
+ follows="all"
+ height="53"
+ layout="topleft"
+ left="0"
+ top="5"
+ width="313"
+ visible="false"
+ auto_resize="false"
+ name="marketplace panel">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ width="290">
+ Marketplace store:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="18"
+ layout="topleft"
+ left="10"
+ valign="center"
+ use_ellipses="true"
+ name="marketplace"
+ width="288">
+ </text>
+ </layout_panel>
+ <layout_panel
+ follows="left|top|right"
+ height="18"
+ left="0"
+ top="0"
+ auto_resize="false"
+ width="315">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="Owner"
+ width="75">
+ Owner:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="18"
+ layout="topleft"
+ left_pad="2"
+ valign="center"
+ name="OwnerText"
+ use_ellipses="true"
+ top_delta="-2"
+ width="188">
+ </text>
+ </layout_panel>
+ <layout_panel
+ follows="all"
+ height="18"
+ layout="topleft"
+ left="0"
+ top="5"
+ width="313"
+ visible="false"
+ auto_resize="false"
+ name="group_panel">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="Group"
+ width="75">
+ Group:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="18"
+ layout="topleft"
+ left_pad="2"
+ valign="center"
+ name="GroupText"
+ use_ellipses="true"
+ top_delta="-2"
+ width="188">
+ </text>
+ </layout_panel>
+ <layout_panel
+ follows="all"
+ height="75"
+ layout="topleft"
+ left="0"
+ top="5"
+ width="313"
+ auto_resize="false"
+ visible="true"
+ name="perm panel">
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Allow"
+ layout="topleft"
+ name="allow_btn"
+ width="94"
+ top_pad="3"
+ left="10"
+ enabled="false"/>
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Forget"
+ layout="topleft"
+ name="forget_btn"
+ width="94"
+ top_pad="-23"
+ left_pad="3"
+ enabled="false"/>
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Block"
+ layout="topleft"
+ name="block_btn"
+ width="94"
+ top_pad="-23"
+ left_pad="3"
+ enabled="false"/>
+ <text
+ type="string"
+ halign="center"
+ length="1"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="privileged"
+ visible="false"
+ width="288">
+ This experience is enabled for all residents.
+ </text>
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Report Abuse"
+ layout="topleft"
+ name="report_btn"
+ width="94"
+ top_pad="3"
+ left="107"
+ enabled="true"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ </panel>
+ <panel
+ background_visible="true"
+ follows="all"
+ layout="topleft"
+ height="540"
+ left="0"
+ top="0"
+ width="348"
+ name="edit_panel_experience_info">
+ <scroll_container
+ color="DkGray2"
+ follows="all"
+ height="520"
+ layout="topleft"
+ left="9"
+ name="edit_xp_scroll"
+ opaque="true"
+ top_pad="10"
+ width="330">
+ <panel
+ bg_alpha_color="DkGray2"
+ follows="top|left|right"
+ height="590"
+ layout="topleft"
+ left="0"
+ name="edit_scrolling_panel"
+ top="0"
+ width="310">
+ <texture_picker
+ enabled="true"
+ fallback_image="default_land_picture.j2c"
+ follows="left|top"
+ height="197"
+ layout="topleft"
+ left="10"
+ name="edit_logo"
+ top="10"
+ width="290" />
+ <text
+ follows="left|top|right"
+ height="14"
+ layout="topleft"
+ left="10"
+ name="edit_experience_title_label"
+ use_ellipses="true"
+ value="Name:"
+ right="-10"/>
+ <line_editor
+ follows="left|top|right"
+ height="19"
+ layout="topleft"
+ left="10"
+ name="edit_experience_title"
+ max_length_bytes="63"
+ text_color="black"
+ right="-10"/>
+ <text
+ follows="left|top|right"
+ height="14"
+ layout="topleft"
+ left="10"
+ top_pad="10"
+ name="edit_experience_desc_label"
+ use_ellipses="true"
+ value="Description:"
+ right="-10"/>
+ <text_editor
+ follows="left|top|right"
+ height="57"
+ layout="topleft"
+ left="11"
+ name="edit_experience_description"
+ max_length="2048"
+ text_color="black"
+ right="-11"
+ word_wrap="true"/>
+ <button
+ top_pad="10"
+ left="10"
+ width="125"
+ height="23"
+ name="Group_btn"
+ label="Group"
+ />
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="14"
+ layout="topleft"
+ left_pad="10"
+ top_pad="-18"
+ use_ellipses="true"
+ name="edit_GroupText"
+ right="-10" />
+ <text
+ top_pad="10"
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="edit_ContentRating"
+ right="-10">
+ Rating:
+ </text>
+ <icons_combo_box
+ follows="right|top"
+ height="20"
+ label="Moderate"
+ layout="topleft"
+ right="-10"
+ top_pad="-19"
+ tool_tip="Increasing the maturity rating on an experience will reset permission for all residents which have allowed the experience."
+ name="edit_ContentRatingText"
+ width="105">
+ <icons_combo_box.drop_down_button
+ image_overlay="Parcel_M_Light"
+ image_overlay_alignment="left"
+ imgoverlay_label_space="3"
+ pad_left="3"/>
+ <icons_combo_box.item
+ label="Adult"
+ name="Adult"
+ value="42">
+ <item.columns
+ halign="center"
+ type="icon"
+ value="Parcel_R_Light"
+ width="20"/>
+ </icons_combo_box.item>
+ <icons_combo_box.item
+ label="Moderate"
+ name="Mature"
+ value="21">
+ <item.columns
+ halign="center"
+ type="icon"
+ value="Parcel_M_Light"
+ width="20"/>
+ </icons_combo_box.item>
+ <icons_combo_box.item
+ label="General"
+ name="PG"
+ value="13">
+ <item.columns
+ halign="center"
+ type="icon"
+ value="Parcel_PG_Light"
+ width="20"/>
+ </icons_combo_box.item>
+ </icons_combo_box>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left="10"
+ top_pad="10"
+ name="edit_Location"
+ right="90">
+ Location:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="14"
+ layout="topleft"
+ left_pad="5"
+ top_pad="-14"
+ use_ellipses="true"
+ name="edit_LocationTextText"
+ right="-10" />
+ <button
+ left="10"
+ width="125"
+ height="23"
+ name="location_btn"
+ label="Set to Current"
+ />
+ <button
+ top_pad="-23"
+ follows="top|right"
+ right="-10"
+ width="125"
+ name="clear_btn"
+ label="Clear Location"/>
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="14"
+ top_pad="10"
+ layout="topleft"
+ left="10"
+ right="-10">
+ Marketplace store:
+ </text>
+ <line_editor
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="19"
+ layout="topleft"
+ left="10"
+ max_length_bytes="255"
+ valign="center"
+ name="edit_marketplace"
+ right="-10"/>
+ <check_box width="140"
+ height="21"
+ left="10"
+ layout="topleft"
+ follows="top|left"
+ tool_tip=""
+ label="Enable Experience"
+ name="edit_enable_btn"/>
+ <check_box width="125"
+ height="21"
+ top_pad="-21"
+ right="-10"
+ visible="false"
+ layout="topleft"
+ follows="top|left|right"
+ label="Hide In Search"
+ name="edit_private_btn"/>
+ <text
+ follows="left|top|right"
+ height="25"
+ layout="topleft"
+ left="10"
+ top_pad="10"
+ name="changes"
+ use_ellipses="true"
+ word_wrap="true"
+ value="Experience changes may take several minutes to be seen on all regions."
+ right="-10"/>
+ <button
+ follows="top|left"
+ height="23"
+ label="Back"
+ layout="topleft"
+ name="cancel_btn"
+ width="125"
+ top_pad="15"
+ left="10"
+ visible="true"/>
+ <button
+ follows="top|right"
+ height="23"
+ label="Save"
+ layout="topleft"
+ name="save_btn"
+ top_pad="-23"
+ width="125"
+ right="-10"
+ visible="true"/>
+ </panel>
+ </scroll_container>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_experiences.xml b/indra/newview/skins/default/xui/en/floater_experiences.xml
new file mode 100644
index 0000000000..442da887c5
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_experiences.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+
+<floater
+ can_close="true"
+ can_resize="true"
+ height="400"
+ width="500"
+ min_height="300"
+ min_width="500"
+ layout="topleft"
+ help_topic="floater_experiences"
+ name="floater_experiences"
+ save_rect="true"
+ single_instance="true"
+
+ bg_opaque_color="0 0.5 0 0.3"
+ title="EXPERIENCES">
+ <tab_container
+ top="3"
+ left="3"
+ layout="topleft"
+ right="-3"
+ follows="all"
+ height="394"
+ name="xp_tabs">
+ </tab_container>
+
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
deleted file mode 100755
index 9deb0d2030..0000000000
--- a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
+++ /dev/null
@@ -1,198 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- height="224"
- layout="topleft"
- name="Hardware Settings Floater"
- help_topic="hardware_settings_floater"
- title="HARDWARE SETTINGS"
- width="615">
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left="10"
- name="Filtering:"
- top="20"
- width="188">
- Filtering:
- </text>
- <check_box
- control_name="RenderAnisotropic"
- height="16"
- label="Anisotropic Filtering (slower when enabled)"
- layout="topleft"
- left_pad="10"
- name="ani"
- top_delta="0"
- width="256" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left="10"
- name="antialiasing label"
- top_pad="7"
- width="188">
- Antialiasing:
- </text>
- <combo_box
- control_name="RenderFSAASamples"
- height="22"
- initial_value="false"
- label="Antialiasing"
- layout="topleft"
- left_pad="10"
- name="fsaa"
- top_delta="0"
- width="130">
- <combo_box.item
- label="Disabled"
- name="FSAADisabled"
- value="0" />
- <combo_box.item
- label="2x"
- name="2x"
- value="2" />
- <combo_box.item
- label="4x"
- name="4x"
- value="4" />
- <combo_box.item
- label="8x"
- name="8x"
- value="8" />
- <combo_box.item
- label="16x"
- name="16x"
- value="16" />
- </combo_box>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left_pad="10"
- name="antialiasing restart"
- top_delta="0"
- width="230">
- (requires viewer restart)
- </text>
- <spinner
- control_name="RenderGamma"
- decimal_digits="2"
- follows="left|top"
- height="16"
- increment="0.01"
- initial_value="1"
- label="Gamma:"
- label_width="198"
- layout="topleft"
- left="10"
- max_val="2"
- name="gamma"
- top_pad="11"
- width="262" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left_pad="10"
- name="(brightness, lower is brighter)"
- top_delta="2"
- width="385">
- (0 = default brightness, lower = brighter)
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="Enable VBO:"
- top_pad="10"
- width="188">
- Enable VBO:
- </text>
- <check_box
- control_name="RenderVBOEnable"
- height="16"
- initial_value="true"
- label="Enable OpenGL Vertex Buffer Objects"
- layout="topleft"
- left_pad="10"
- name="vbo"
- tool_tip="Enabling this on modern hardware gives a performance gain. However, older hardware often has poor implementations of VBOs and you may get crashes when this is enabled."
- width="315" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="tc label"
- top_pad="10"
- width="188">
- Enable S3TC:
- </text>
- <check_box
- control_name="RenderCompressTextures"
- height="16"
- initial_value="true"
- label="Enable Texture Compression (requires restart)"
- layout="topleft"
- left_pad="10"
- name="texture compression"
- tool_tip="Compresses textures in video memory, allowing for higher resolution textures to be loaded at the cost of some color quality."
- width="315" />
- <slider
- control_name="TextureMemory"
- decimal_digits="0"
- follows="left|top"
- height="20"
- increment="16"
- initial_value="32"
- label="Texture Memory (MB):"
- label_width="195"
- layout="topleft"
- left="10"
- max_val="4096"
- name="GraphicsCardTextureMemory"
- tool_tip="Amount of memory to allocate for textures. Defaults to video card memory. Reducing this may improve performance but may also make textures blurry."
- top_pad="10"
- width="360" />
- <spinner
- control_name="RenderFogRatio"
- decimal_digits="1"
- follows="left|top"
- height="22"
- initial_value="4"
- label="Fog Distance Ratio:"
- label_width="198"
- layout="topleft"
- left_delta="0"
- max_val="10"
- min_val="0.5"
- name="fog"
- top_pad="7"
- width="262" />
- <button
- follows="right|bottom"
- height="22"
- label="OK"
- label_selected="OK"
- layout="topleft"
- left="-102"
- name="OK"
- top="192"
- width="90" />
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_item_properties.xml b/indra/newview/skins/default/xui/en/floater_item_properties.xml
new file mode 100755
index 0000000000..0fc54a9c8b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_item_properties.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ height="570"
+ layout="topleft"
+ name="Item Properties"
+ help_topic="item+properties"
+ title="ITEM PROPERTIES"
+ width="330">
+ <panel
+ follows="all"
+ layout="topleft"
+ left="0"
+ class="sidepanel_item_info"
+ filename="sidepanel_item_info.xml"
+ name="item_panel"
+ top="20"
+ label=""
+ height="570"
+ visible="true"
+ width="330">
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
index 5cd7cd196d..e8826034f6 100755
--- a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
@@ -1,71 +1,118 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
- legacy_header_height="18"
- bevel_style="none"
- border_style="line"
- can_resize="true"
- height="580"
- layout="topleft"
- min_height="271"
- min_width="290"
- name="script ed float"
- help_topic="script_ed_float"
- save_rect="true"
- title="SCRIPT: NEW SCRIPT"
- width="508">
- <floater.string
- name="not_allowed">
- You can not view or edit this script, since it has been set as &quot;no copy&quot;. You need full permissions to view or edit a script inside an object.
- </floater.string>
- <floater.string
- name="script_running">
- Running
- </floater.string>
- <floater.string
- name="Title">
- SCRIPT: [NAME]
- </floater.string>
- <panel
- bevel_style="none"
+ legacy_header_height="18"
+ bevel_style="none"
+ border_style="line"
+ can_resize="true"
+ height="582"
+ layout="topleft"
+ min_height="271"
+ min_width="328"
+ name="script ed float"
+ help_topic="script_ed_float"
+ save_rect="true"
+ title="SCRIPT: NEW SCRIPT"
+ width="508">
+ <floater.string
+ name="not_allowed">
+ You can not view or edit this script, since it has been set as &quot;no copy&quot;. You need full permissions to view or edit a script inside an object.
+ </floater.string>
+ <floater.string
+ name="script_running">
+ Running
+ </floater.string>
+ <floater.string
+ name="Title">
+ SCRIPT: [NAME]
+ </floater.string>
+ <floater.string
+ name="experience_enabled">
+ Uncheck to remove the current experience
+ </floater.string>
+ <floater.string
+ name="no_experiences">
+ You are not authorized for any experiences
+ </floater.string>
+ <floater.string
+ name="add_experiences">
+ Select to add an experience
+ </floater.string>
+ <floater.string
+ name="show_experience_profile">
+ Click to view the experience profile
+ </floater.string>
+ <floater.string
+ name="loading">
+ Loading...
+ </floater.string>
+ <panel
+ bevel_style="none"
- border_style="line"
- follows="left|top|right|bottom"
- height="522"
- layout="topleft"
- left="10"
- name="script ed panel"
- top="20"
- width="497" />
- <button
- follows="left|bottom"
- height="23"
- label="Reset"
- label_selected="Reset"
- layout="topleft"
- name="Reset"
- left="10"
- width="85" />
- <check_box
+ border_style="line"
+ follows="left|top|right|bottom"
+ height="499"
+ layout="topleft"
+ left="10"
+ name="script ed panel"
+ top="16"
+ width="501" />
+ <button
+ follows="left|bottom"
+ height="23"
+ label="Reset"
+ label_selected="Reset"
+ layout="topleft"
+ name="Reset"
+ left="10"
+ width="85" />
+ <check_box
left_delta="90"
top_delta="3"
- enabled="false"
- follows="left|bottom"
- font="SansSerif"
- height="18"
- initial_value="true"
- label="Running"
- layout="topleft"
- name="running"
- width="205" />
- <check_box
+ enabled="false"
+ follows="left|bottom"
+ font="SansSerif"
+ height="18"
+ initial_value="true"
+ label="Running"
+ layout="topleft"
+ name="running"
+ width="205" />
+ <check_box
left_delta="140"
- enabled="true"
- follows="left|bottom"
- font="SansSerif"
- height="18"
- initial_value="true"
- label="Mono"
- layout="topleft"
- name="mono"
- width="100" />
+ enabled="true"
+ follows="left|bottom"
+ font="SansSerif"
+ height="18"
+ initial_value="true"
+ label="Mono"
+ layout="topleft"
+ name="mono"
+ width="100" />
+ <check_box width="130"
+ height="21"
+ enabled="false"
+ left="9"
+ top_pad="10"
+ layout="topleft"
+ follows="bottom|left"
+ label="Use Experience:"
+ name="enable_xp"/>
+ <combo_box
+ label=""
+ top_pad="-21"
+ left="149"
+ right="467"
+ layout="topleft"
+ follows="left|bottom|right"
+ visible="false"
+ name="Experiences..."/>
+ <button label="&gt;"
+ name="view_profile"
+ height="23"
+ width="23"
+ right="496"
+ layout="topleft"
+ top_pad="-23"
+ follows="right"
+ visible="false"/>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_load_pref_preset.xml b/indra/newview/skins/default/xui/en/floater_load_pref_preset.xml
new file mode 100644
index 0000000000..5f2eb770e2
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_load_pref_preset.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<floater
+ legacy_header_height="18"
+ height="130"
+ help_topic="floater_load_preset"
+ layout="topleft"
+ name="Load Pref Preset"
+ save_rect="true"
+ title="LOAD PREF PRESET"
+ width="300">
+
+ <string name="title_graphic">Load Graphic Preset</string>
+ <string name="title_camera">Load Camera Preset</string>
+
+ <text
+ follows="top|left|right"
+ height="16"
+ layout="topleft"
+ left="20"
+ name="Preset"
+ top="30"
+ width="200">
+ Select a preset
+ </text>
+ <combo_box
+ follows="top|left"
+ layout="topleft"
+ left="20"
+ name="preset_combo"
+ top_delta="20"
+ width="200"/>
+ <button
+ follows="top|left"
+ height="23"
+ label="OK"
+ layout="topleft"
+ top_delta="40"
+ left="20"
+ name="ok"
+ width="70"/>
+ <button
+ follows="top|left"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left_pad="20"
+ name="cancel"
+ width="70"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_marketplace_listings.xml b/indra/newview/skins/default/xui/en/floater_marketplace_listings.xml
new file mode 100755
index 0000000000..0806a87288
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_marketplace_listings.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<floater
+ title="MARKETPLACE LISTINGS"
+ name="floater_marketplace_listings"
+ help_topic="floater_marketplace_listings"
+ positioning="cascading"
+ width="333"
+ height="445"
+ min_width="200"
+ min_height="300"
+ can_close="true"
+ can_resize="true"
+ save_rect="true"
+ save_visibility="false"
+ reuse_instance="true">
+ <panel
+ name="marketplace_listings_panel"
+ follows="all"
+ layout="topleft"
+ left="0"
+ top="0"
+ height="440"
+ width="333">
+ <panel
+ follows="all"
+ left="10"
+ height="440"
+ width="313"
+ top="0"
+ bg_opaque_color="InventoryBackgroundColor">
+ <panel
+ name="marketplace_listings_inventory_placeholder_panel"
+ follows="all"
+ layout="topleft"
+ top="0"
+ left="0"
+ width="313"
+ height="440"
+ bg_opaque_color="InventoryBackgroundColor">
+ <text
+ name="marketplace_listings_inventory_placeholder_title"
+ type="string"
+ follows="top|left|right"
+ layout="topleft"
+ top="10"
+ left="0"
+ width="313"
+ height="25"
+ wrap="true"
+ halign="center"
+ font="SansSerifBold">
+ Loading...
+ </text>
+ <text
+ name="marketplace_listings_inventory_placeholder_text"
+ type="string"
+ follows="top|left|right"
+ layout="topleft"
+ top="35"
+ left="0"
+ width="313"
+ height="130"
+ wrap="true"
+ halign="left" />
+ </panel>
+ <panel
+ name="panel_marketplace_listing"
+ filename="panel_marketplace_listings.xml"
+ class="llpanelmarketplacelistings"
+ top="0"
+ follows="all"/>
+ </panel>
+ <panel
+ name="marketplace_panel_status"
+ follows="bottom|left|right"
+ layout="topleft"
+ left="10"
+ width="313"
+ height="20">
+ <text
+ name="marketplace_status"
+ type="string"
+ follows="bottom|left|right"
+ layout="topleft"
+ top="0"
+ left="5"
+ width="150"
+ height="20"
+ wrap="true"
+ halign="left"
+ valign="center"
+ font="SansSerif"/>
+ </panel>
+ <layout_stack name="initialization_progress_indicator" orientation="vertical" left="0" height="440" top="0" width="333" follows="all" visible="false">
+ <layout_panel />
+ <layout_panel height="24" auto_resize="false">
+ <layout_stack orientation="horizontal" left="0" height="24" top="0" width="333" follows="all">
+ <layout_panel width="0" />
+ <layout_panel width="24" auto_resize="false">
+ <loading_indicator
+ height="24"
+ layout="topleft"
+ left="0"
+ top="0"
+ width="24" />
+ </layout_panel>
+ <layout_panel width="0" />
+ </layout_stack>
+ </layout_panel>
+ <layout_panel />
+ </layout_stack>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_marketplace_validation.xml b/indra/newview/skins/default/xui/en/floater_marketplace_validation.xml
new file mode 100755
index 0000000000..9035a7c161
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_marketplace_validation.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ title="Audit Marketplace Listings"
+ name="floater_marketplace_validation"
+ help_topic="floater_marketplace_validation"
+ layout="topleft"
+ positioning="cascading"
+ legacy_header_height="18"
+ width="600"
+ height="500"
+ min_width="400"
+ min_height="200"
+ can_close="true"
+ can_resize="true"
+ can_minimize="true"
+ save_rect="true"
+ reuse_instance="true"
+ save_visibility="false">
+ <button
+ name="OK"
+ label="OK"
+ label_selected="OK"
+ layout="topleft"
+ follows="right|bottom"
+ top="465"
+ width="100"
+ height="20"
+ left="484"/>
+ <text_editor
+ name="validation_text"
+ type="string"
+ font="SansSerif"
+ length="1"
+ max_length="65536"
+ layout="topleft"
+ follows="all"
+ bg_readonly_color="TextBgReadOnlyColor"
+ text_readonly_color="TextFgReadOnlyColor"
+ top="25"
+ bottom="455"
+ left="20"
+ right="-20"
+ word_wrap="true">
+ MARKETPLACE_VALIDATION_TEXT
+ </text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
index 56bf9833f5..d2c8dddfe1 100755
--- a/indra/newview/skins/default/xui/en/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -31,6 +31,7 @@
<string name="mesh_status_too_many_vertices">Level of detail has too many vertices.</string>
<string name="mesh_status_missing_lod">Missing required level of detail.</string>
<string name="mesh_status_invalid_material_list">LOD materials are not a subset of reference model.</string>
+ <string name="phys_status_vertex_limit_exceeded">Some physical hulls exceed vertex limitations.</string>
<string name="layer_all">All</string> <!-- Text to display in physics layer combo box for "all layers" -->
<string name="decomposing">Analyzing...</string>
<string name="simplifying">Simplifying...</string>
@@ -66,7 +67,7 @@
follows="top|left"
layout="topleft"
height="19"
- max_length_bytes="64"
+ max_length_bytes="63"
name="description_form"
prevalidate_callback="ascii"
top_pad="5"
@@ -1046,19 +1047,19 @@
bg_alpha_color="0 0 0 0"
bg_opaque_color="0 0 0 0.3"
follows="left|top"
- height="16"
+ height="19"
layout="topleft"
left="18"
name="physics info"
- top_pad="15"
- width="589">
+ top_pad="12"
+ width="319">
<text
follows="top|left"
height="15"
layout="topleft"
left="0"
text_color="White"
- top_pad="0"
+ top_pad="3"
name="results_text"
width="50">
Results:
@@ -1096,6 +1097,33 @@
Hulls: [HULLS]
</text>
</panel>
+ <panel
+ bg_alpha_color="0 0 0 0"
+ bg_opaque_color="0 0 0 0.3"
+ follows="left|top"
+ height="19"
+ layout="topleft"
+ left_pad="5"
+ top_delta="0"
+ name="physics message"
+ width="270">
+ <icon
+ follows="left|top"
+ height="16"
+ left="0"
+ layout="topleft"
+ name="physics_status_message_icon"
+ top_pad="0"
+ width="16" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left_pad="2"
+ name="physics_status_message_text"
+ width="252"
+ top_delta="3"/>
+ </panel>
</panel>
<!-- MODIFIERS PANEL -->
<panel
diff --git a/indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml b/indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml
new file mode 100644
index 0000000000..afc609de52
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater
+ legacy_header_height="18"
+ bevel_style="in"
+ layout="topleft"
+ name="floater_notifications_tabbed"
+ help_topic="notification_chiclet"
+ save_rect="true"
+ title="NOTIFICATIONS"
+ width="350"
+ min_width="435"
+ height="550"
+ min_height="150"
+ can_minimize="false"
+ can_tear_off="false"
+ can_resize="true"
+ can_drag_on_left="false"
+ can_dock="true"
+ save_dock_state="true"
+ save_visibility="true"
+ single_instance="true"
+>
+ <floater.string
+ name="system_tab_title">
+ System ([COUNT])
+ </floater.string>
+ <floater.string
+ name="transactions_tab_title">
+ Transactions ([COUNT])
+ </floater.string>
+ <floater.string
+ name="group_invitations_tab_title">
+ Invitations ([COUNT])
+ </floater.string>
+ <floater.string
+ name="group_notices_tab_title">
+ Group ([COUNT])
+ </floater.string>
+
+ <string
+ name="title_notification_tabbed_window">
+ NOTIFICATIONS
+ </string>
+ <layout_stack
+ width="336"
+ height="533"
+ enabled="true"
+ orientation="vertical"
+ name="TabButtonsStack"
+ follows="left|top|right|bottom"
+ top="17">
+ <layout_panel
+ width="336"
+ height="530"
+ enabled="true"
+ name="TabButtonsLayoutPanel">
+ <tab_container
+ follows="left|top|right|bottom"
+ halign="center"
+ layout="topleft"
+ tab_position="top"
+ left="7"
+ top="7"
+ width="336"
+ height="491"
+ mouse_opaque="true"
+ name="notifications_tab_container">
+ <panel
+ border="true"
+ bevel_style="none"
+ follows="left|top|right|bottom"
+ label="System (0)"
+ layout="topleft"
+ name="system_notification_list_tab">
+ <notification_list_view
+ color="FloaterDefaultBackgroundColor"
+ follows="all"
+ layout="topleft"
+ name="system_notification_list"
+ left="0"
+ top="5"
+ height="0"
+ width="330"/>
+ </panel>
+ <panel
+ border="true"
+ bevel_style="none"
+ follows="left|top|right|bottom"
+ label="Transactions (0)"
+ layout="topleft"
+ name="transaction_notifications_tab">
+ <notification_list_view
+ color="FloaterDefaultBackgroundColor"
+ follows="all"
+ layout="topleft"
+ name="transaction_notification_list"
+ left="0"
+ top="5"
+ height="0"
+ width="328"/>
+ </panel>
+ <panel
+ border="true"
+ bevel_style="none"
+ follows="left|top|right|bottom"
+ label="Invitations (0)"
+ layout="topleft"
+ name="group_invite_notifications_tab">
+ <notification_list_view
+ color="FloaterDefaultBackgroundColor"
+ follows="all"
+ layout="topleft"
+ name="group_invite_notification_list"
+ left="0"
+ top="5"
+ height="0"
+ width="328"/>
+ </panel>
+ <panel
+ border="true"
+ bevel_style="none"
+ follows="left|top|right|bottom"
+ label="Group (0)"
+ layout="topleft"
+ name="group_notice_notifications_tab">
+ <notification_list_view
+ color="FloaterDefaultBackgroundColor"
+ follows="all"
+ layout="topleft"
+ name="group_notice_notification_list"
+ left="0"
+ top="5"
+ height="0"
+ width="328"/>
+ </panel>
+ </tab_container>
+
+ <layout_stack width="336" height="26" enabled="true" orientation="horizontal" follows="left|right" name="ButtonsStack">
+ <layout_panel width="336" height="30" enabled="true" orientation="horizontal" name="CondenseAllButtonPanel">
+ <button width="93" height="21" left="2" label="Collapse all" name="collapse_all_button">
+ </button>
+ </layout_panel>
+ <layout_panel width="336" height="30" enabled="true" orientation="horizontal" name="GapLayoutPanel">
+ <panel width="90" height="21" left="2" label="Gap Panel" border="false" name="GapPanel">
+ </panel>
+ </layout_panel>
+ <layout_panel width="336" height="30" enabled="true" orientation="horizontal" name="DeleteAllButtonPanel">
+ <button width="93" height="21" left="2" label="Delete all" name="delete_all_button">
+ </button>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index bd6faf4ed8..638a4e2da8 100755
--- a/indra/newview/skins/default/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences.xml
@@ -11,7 +11,7 @@
single_instance="true"
title="PREFERENCES"
width="658">
- <button
+ <button
follows="right|bottom"
height="23"
label="OK"
diff --git a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
new file mode 100644
index 0000000000..7ffb4e0d99
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
@@ -0,0 +1,935 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ height="400"
+ layout="topleft"
+ name="prefs_graphics_advanced"
+ help_topic="Preferences_Graphics_Advanced"
+ single_instance="true"
+ save_rect="true"
+ title="ADVANCED GRAPHICS PREFERENCES"
+ width="800">
+
+<!-- This block shows Advanced Settings -->
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ name="GeneralText"
+ top="5"
+ left="10"
+ width="128">
+ General
+ </text>
+
+ <slider
+ control_name="RenderFarClip"
+ decimal_digits="0"
+ follows="left|top"
+ height="16"
+ increment="8"
+ initial_value="160"
+ label="Draw distance:"
+ label_width="185"
+ layout="topleft"
+ left="30"
+ min_val="64"
+ max_val="512"
+ name="DrawDistance"
+ top_delta="16"
+ width="330" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ name="DrawDistanceMeterText2"
+ top_delta="0"
+ left_delta="330"
+ width="20">
+ m
+ </text>
+ <slider
+ control_name="RenderMaxPartCount"
+ decimal_digits="0"
+ follows="left|top"
+ height="16"
+ increment="256"
+ initial_value="4096"
+ label="Max. particle count:"
+ label_width="185"
+ layout="topleft"
+ left="30"
+ max_val="8192"
+ name="MaxParticleCount"
+ top_delta="16"
+ width="336" />
+
+ <slider
+ control_name="RenderGlowResolutionPow"
+ decimal_digits="0"
+ follows="left|top"
+ height="16"
+ increment="1"
+ initial_value="8"
+ label="Post process quality:"
+ label_width="185"
+ layout="topleft"
+ left="30"
+ min_val="8"
+ max_val="9"
+ name="RenderPostProcess"
+ show_text="false"
+ top_delta="16"
+ width="300">
+ <slider.commit_callback
+ function="Pref.UpdateSliderText"
+ parameter="PostProcessText" />
+ </slider>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ name="PostProcessText"
+ top_delta="0"
+ left_delta="304"
+ width="65">
+ Low
+ </text>
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ name="AvatarText"
+ top_delta="20"
+ left="10"
+ width="128">
+ Avatar
+ </text>
+
+ <slider
+ control_name="IndirectMaxComplexity"
+ tool_tip="Controls at what point a visually complex avatar is drawn as a jellybaby"
+ follows="left|top"
+ height="16"
+ initial_value="101"
+ increment="1"
+ label="Maximum complexity:"
+ label_width="185"
+ layout="topleft"
+ left="30"
+ min_val="1"
+ max_val="101"
+ name="IndirectMaxComplexity"
+ show_text="false"
+ top_delta="16"
+ width="300">
+ <slider.commit_callback
+ function="Pref.UpdateIndirectMaxComplexity"
+ parameter="IndirectMaxComlexityText" />
+ </slider>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ top_delta="0"
+ left_delta="304"
+ text_readonly_color="LabelDisabledColor"
+ name="IndirectMaxComplexityText"
+ width="65">
+ 0
+ </text>
+
+ <slider
+ control_name="IndirectMaxNonImpostors"
+ decimal_digits="0"
+ follows="left|top"
+ height="16"
+ increment="1"
+ initial_value="12"
+ label="Max. # of non-impostors:"
+ label_width="185"
+ layout="topleft"
+ left="30"
+ min_val="1"
+ max_val="66"
+ name="IndirectMaxNonImpostors"
+ show_text="false"
+ top_delta="16"
+ width="300">
+ <slider.commit_callback
+ function="Pref.UpdateIndirectMaxNonImpostors"
+ parameter="IndirectNonImpostorsText" />
+ </slider>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ top_delta="0"
+ left_delta="304"
+ text_readonly_color="LabelDisabledColor"
+ name="IndirectMaxNonImpostorsText"
+ width="65">
+ 0
+ </text>
+
+ <slider
+ control_name="RenderAvatarLODFactor"
+ follows="left|top"
+ height="16"
+ increment="0.125"
+ initial_value="160"
+ label="Detail:"
+ label_width="185"
+ layout="topleft"
+ left="30"
+ name="AvatarMeshDetail"
+ show_text="false"
+ top_delta="16"
+ width="300">
+ <slider.commit_callback
+ function="Pref.UpdateSliderText"
+ parameter="AvatarMeshDetailText" />
+ </slider>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ name="AvatarMeshDetailText"
+ top_delta="0"
+ left_delta="304"
+ width="65">
+ Low
+ </text>
+
+ <slider
+ control_name="RenderAvatarPhysicsLODFactor"
+ follows="left|top"
+ height="16"
+ initial_value="100"
+ increment=".05"
+ label="Physics:"
+ label_width="185"
+ layout="topleft"
+ left="30"
+ name="AvatarPhysicsDetail"
+ show_text="false"
+ top_delta="16"
+ width="300">
+ <slider.commit_callback
+ function="Pref.UpdateSliderText"
+ parameter="AvatarPhysicsDetailText" />
+ </slider>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ top_delta="0"
+ left_delta="304"
+ name="AvatarPhysicsDetailText"
+ width="65">
+ Low
+ </text>
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ name="ShadersText"
+ top_delta="20"
+ left="10"
+ width="128">
+ Hardware
+ </text>
+
+ <slider
+ control_name="TextureMemory"
+ decimal_digits="0"
+ follows="left|top"
+ height="16"
+ increment="16"
+ initial_value="32"
+ label="Texture Memory (MB):"
+ label_width="185"
+ layout="topleft"
+ left="30"
+ max_val="4096"
+ name="GraphicsCardTextureMemory"
+ tool_tip="Amount of memory to allocate for textures. Defaults to video card memory. Reducing this may improve performance but may also make textures blurry."
+ top_delta="16"
+ width="335" />
+
+ <slider
+ control_name="RenderFogRatio"
+ follows="left|top"
+ height="16"
+ initial_value="4"
+ decimal_digits="1"
+ label="Fog Distance Ratio:"
+ label_width="185"
+ layout="topleft"
+ left="30"
+ name="fog"
+ min_val="0.5"
+ max_val="10"
+ increment="0.1"
+ top_delta="16"
+ width="332" />
+
+ <slider
+ control_name="RenderGamma"
+ follows="left|top"
+ height="16"
+ initial_value="1"
+ decimal_digits="2"
+ label="Gamma:"
+ label_width="185"
+ layout="topleft"
+ left="30"
+ name="gamma"
+ min_val="0"
+ max_val="2"
+ increment="0.01"
+ top_delta="16"
+ width="332" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="30"
+ name="(brightness, lower is brighter)"
+ top_delta="16"
+ width="260">
+ (0 = default brightness, lower = brighter)
+ </text>
+
+ <check_box
+ control_name="RenderAnisotropic"
+ height="16"
+ label="Anisotropic Filtering (slower when enabled)"
+ layout="topleft"
+ left="30"
+ name="ani"
+ top_delta="16"
+ width="256" />
+
+ <check_box
+ control_name="RenderVBOEnable"
+ height="16"
+ initial_value="true"
+ label="Enable OpenGL Vertex Buffer Objects"
+ layout="topleft"
+ left="30"
+ top_delta="16"
+ name="vbo"
+ tool_tip="Enabling this on modern hardware gives a performance gain. However, older hardware often has poor implementations of VBOs and you may get crashes when this is enabled."
+ width="315" />
+
+ <check_box
+ control_name="RenderCompressTextures"
+ height="16"
+ initial_value="true"
+ label="Enable Texture Compression (requires restart)"
+ layout="topleft"
+ left="30"
+ top_delta="16"
+ name="texture compression"
+ tool_tip="Compresses textures in video memory, allowing for higher resolution textures to be loaded at the cost of some color quality."
+ width="315" />
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left="30"
+ name="antialiasing label"
+ top_delta="20"
+ width="100">
+ Antialiasing:
+ </text>
+ <combo_box
+ control_name="RenderFSAASamples"
+ height="20"
+ initial_value="false"
+ label="Antialiasing"
+ layout="topleft"
+ left_pad="40"
+ name="fsaa"
+ top_delta="0"
+ width="90">
+ <combo_box.item
+ label="Disabled"
+ name="FSAADisabled"
+ value="0" />
+ <combo_box.item
+ label="2x"
+ name="2x"
+ value="2" />
+ <combo_box.item
+ label="4x"
+ name="4x"
+ value="4" />
+ <combo_box.item
+ label="8x"
+ name="8x"
+ value="8" />
+ <combo_box.item
+ label="16x"
+ name="16x"
+ value="16" />
+ </combo_box>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="antialiasing restart"
+ top_delta="0"
+ width="130">
+ (requires restart)
+ </text>
+ <view_border
+ bevel_style="in"
+ height="322"
+ layout="topleft"
+ left="385"
+ name="vert_border"
+ top="16"
+ width="0"/>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ name="AvatarText"
+ top_delta="20"
+ left="400"
+ top="21"
+ width="128">
+ Mesh
+ </text>
+
+ <slider
+ control_name="RenderTerrainLODFactor"
+ follows="left|top"
+ height="16"
+ increment="0.125"
+ initial_value="160"
+ label="Terrain Mesh Detail:"
+ label_width="185"
+ layout="topleft"
+ left="420"
+ min_val="1"
+ max_val="2"
+ name="TerrainMeshDetail"
+ show_text="false"
+ top_delta="16"
+ width="300">
+ <slider.commit_callback
+ function="Pref.UpdateSliderText"
+ parameter="TerrainMeshDetailText" />
+ </slider>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ name="TerrainMeshDetailText"
+ text_readonly_color="LabelDisabledColor"
+ top_delta="0"
+ left_delta="304"
+ width="65">
+ Low
+ </text>
+
+ <slider
+ control_name="RenderTreeLODFactor"
+ follows="left|top"
+ height="16"
+ increment="0.125"
+ initial_value="160"
+ label="Trees:"
+ label_width="185"
+ layout="topleft"
+ left="420"
+ name="TreeMeshDetail"
+ show_text="false"
+ top_delta="16"
+ width="300">
+ <slider.commit_callback
+ function="Pref.UpdateSliderText"
+ parameter="TreeMeshDetailText" />
+ </slider>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ name="TreeMeshDetailText"
+ top_delta="0"
+ left_delta="304"
+ width="65">
+ Low
+ </text>
+
+ <slider
+ control_name="RenderVolumeLODFactor"
+ follows="left|top"
+ height="16"
+ increment="0.125"
+ initial_value="160"
+ label="Objects:"
+ label_width="185"
+ layout="topleft"
+ left="420"
+ max_val="2"
+ name="ObjectMeshDetail"
+ show_text="false"
+ top_delta="16"
+ width="300">
+ <slider.commit_callback
+ function="Pref.UpdateSliderText"
+ parameter="ObjectMeshDetailText" />
+ </slider>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ name="ObjectMeshDetailText"
+ top_delta="0"
+ left_delta="304"
+ width="65">
+ Low
+ </text>
+
+ <slider
+ control_name="RenderFlexTimeFactor"
+ follows="left|top"
+ height="16"
+ initial_value="160"
+ label="Flexiprims:"
+ label_width="185"
+ layout="topleft"
+ left="420"
+ name="FlexibleMeshDetail"
+ show_text="false"
+ top_delta="16"
+ width="300">
+ <slider.commit_callback
+ function="Pref.UpdateSliderText"
+ parameter="FlexibleMeshDetailText" />
+ </slider>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ name="FlexibleMeshDetailText"
+ top_delta="0"
+ left_delta="304"
+ width="65">
+ Low
+ </text>
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ name="ShadersText"
+ top_delta="20"
+ left="400"
+ width="128">
+ Shaders
+ </text>
+
+ <check_box
+ control_name="RenderTransparentWater"
+ height="16"
+ initial_value="true"
+ label="Transparent Water"
+ layout="topleft"
+ left="420"
+ name="TransparentWater"
+ top_delta="16"
+ width="300" />
+
+ <check_box
+ control_name="RenderObjectBump"
+ height="16"
+ initial_value="true"
+ label="Bump mapping and shiny"
+ layout="topleft"
+ left="420"
+ name="BumpShiny"
+ top_delta="16"
+ width="300">
+ <check_box.commit_callback
+ function="Pref.VertexShaderEnable" />
+ </check_box>
+
+ <check_box
+ control_name="RenderLocalLights"
+ height="16"
+ initial_value="true"
+ label="Local Lights"
+ layout="topleft"
+ left="420"
+ name="LocalLights"
+ top_delta="16"
+ width="300" />
+
+ <check_box
+ control_name="VertexShaderEnable"
+ height="16"
+ initial_value="true"
+ label="Basic shaders"
+ layout="topleft"
+ left="420"
+ name="BasicShaders"
+ tool_tip="Disabling this option may prevent some graphics card drivers from crashing"
+ top_delta="16"
+ width="300">
+ <check_box.commit_callback
+ function="Pref.VertexShaderEnable" />
+ </check_box>
+
+ <slider
+ control_name="RenderTerrainDetail"
+ follows="left|top"
+ height="16"
+ label="Terrain Detail:"
+ label_width="165"
+ layout="topleft"
+ left="440"
+ show_text="false"
+ initial_value="0"
+ increment="1"
+ min_val="0"
+ max_val="1"
+ name="TerrainDetail"
+ top_delta="16"
+ width="280" >
+ <slider.commit_callback
+ function="Pref.UpdateSliderText"
+ parameter="TerrainDetail" />
+ </slider>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ top_delta="0"
+ left_delta="284"
+ name="TerrainDetailText"
+ text_readonly_color="LabelDisabledColor"
+ width="65">
+ Low
+ </text>
+
+ <check_box
+ control_name="RenderAvatarVP"
+ height="16"
+ initial_value="true"
+ label="Avatar Hardware skinning"
+ layout="topleft"
+ left="440"
+ name="AvatarVertexProgram"
+ top_delta="16"
+ width="280">
+ <check_box.commit_callback
+ function="Pref.VertexShaderEnable" />
+ </check_box>
+
+ <check_box
+ control_name="RenderAvatarCloth"
+ height="16"
+ initial_value="true"
+ label="Avatar cloth"
+ layout="topleft"
+ left="440"
+ name="AvatarCloth"
+ top_delta="16"
+ width="280" />
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ name="ReflectionsText"
+ text_readonly_color="LabelDisabledColor"
+ top_delta="16"
+ left="440"
+ width="128">
+ Water Reflections:
+ </text>
+ <combo_box
+ control_name="RenderReflectionDetail"
+ height="18"
+ layout="topleft"
+ left_delta="170"
+ top_delta="0"
+ name="Reflections"
+ width="150">
+ <combo_box.item
+ label="Minimal"
+ name="0"
+ value="0"/>
+ <combo_box.item
+ label="Terrain and trees"
+ name="1"
+ value="1"/>
+ <combo_box.item
+ label="All static objects"
+ name="2"
+ value="2"/>
+ <combo_box.item
+ label="All avatars and objects"
+ name="3"
+ value="3"/>
+ <combo_box.item
+ label="Everything"
+ name="4"
+ value="4"/>
+ </combo_box>
+
+ <check_box
+ control_name="WindLightUseAtmosShaders"
+ height="16"
+ initial_value="true"
+ label="Atmospheric shaders"
+ layout="topleft"
+ left="440"
+ name="WindLightUseAtmosShaders"
+ top_delta="16"
+ width="280">
+ <check_box.commit_callback
+ function="Pref.VertexShaderEnable" />
+ </check_box>
+
+ <slider
+ control_name="WLSkyDetail"
+ decimal_digits="0"
+ follows="left|top"
+ height="16"
+ increment="8"
+ initial_value="160"
+ label="Sky:"
+ label_width="145"
+ layout="topleft"
+ left="460"
+ min_val="16"
+ max_val="128"
+ name="SkyMeshDetail"
+ show_text="false"
+ top_delta="16"
+ width="260">
+ <slider.commit_callback
+ function="Pref.UpdateSliderText"
+ parameter="SkyMeshDetailText" />
+ </slider>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_delta="264"
+ name="SkyMeshDetailText"
+ text_readonly_color="LabelDisabledColor"
+ top_delta="0"
+ width="65">
+ Low
+ </text>
+
+ <check_box
+ control_name="RenderDeferred"
+ height="16"
+ initial_value="true"
+ label="Advanced Lighting Model"
+ layout="topleft"
+ left="460"
+ name="UseLightShaders"
+ top_delta="16"
+ width="260">
+ <check_box.commit_callback
+ function="Pref.VertexShaderEnable" />
+ </check_box>
+
+ <check_box
+ control_name="RenderDeferredSSAO"
+ height="16"
+ initial_value="true"
+ label="Ambient Occlusion"
+ layout="topleft"
+ left="480"
+ name="UseSSAO"
+ top_delta="16"
+ width="240">
+ <check_box.commit_callback
+ function="Pref.VertexShaderEnable" />
+ </check_box>
+
+ <check_box
+ control_name="RenderDepthOfField"
+ height="16"
+ initial_value="true"
+ label="Depth of Field"
+ layout="topleft"
+ left="480"
+ name="UseDoF"
+ top_delta="16"
+ width="240">
+ <check_box.commit_callback
+ function="Pref.VertexShaderEnable" />
+ </check_box>
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="480"
+ name="RenderShadowDetailText"
+ text_readonly_color="LabelDisabledColor"
+ top_delta="16"
+ width="128">
+ Shadows:
+ </text>
+ <combo_box
+ control_name="RenderShadowDetail"
+ height="18"
+ layout="topleft"
+ left_delta="130"
+ top_delta="0"
+ name="ShadowDetail"
+ width="150">
+ <combo_box.item
+ label="None"
+ name="0"
+ value="0"/>
+ <combo_box.item
+ label="Sun/Moon"
+ name="1"
+ value="1"/>
+ <combo_box.item
+ label="Sun/Moon + Projectors"
+ name="2"
+ value="2"/>
+ </combo_box>
+
+<!-- End of Advanced Settings block -->
+ <view_border
+ bevel_style="in"
+ height="0"
+ layout="topleft"
+ left="13"
+ name="horiz_border"
+ top_pad="5"
+ top_delta="5"
+ width="774"/>
+ <button
+ follows="top|left"
+ height="23"
+ label="Reset to recommended settings"
+ layout="topleft"
+ left="20"
+ name="Defaults"
+ top_delta="10"
+ width="210">
+ <button.commit_callback
+ function="Pref.HardwareDefaults" />
+ </button>
+
+ <button
+ follows="right|bottom"
+ height="23"
+ label="OK"
+ label_selected="OK"
+ layout="topleft"
+ right="-115"
+ name="OK"
+ top_delta="0"
+ width="80">
+ <button.commit_callback
+ function="Pref.OK"
+ parameter="closeadvanced" />
+ </button>
+
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Cancel"
+ label_selected="Cancel"
+ layout="topleft"
+ left_pad="5"
+ right="-20"
+ name="Cancel"
+ top_delta="0"
+ width="80" >
+ <button.commit_callback
+ function="Pref.Cancel"
+ parameter="closeadvanced" />
+ </button>
+
+<!-- These two check boxes are dummies and will never be displayed. They are here so the control variables
+are saved in a preset file. -->
+ <check_box
+ control_name="RenderAvatarMaxComplexity"
+ visible="false"
+ height="0"
+ label="RenderAvatarMaxComplexity"
+ layout="topleft"
+ left="0"
+ name="RenderAvatarMaxNonImpostors"
+ top_delta="0"
+ width="0">
+ </check_box>
+
+ <check_box
+ control_name="RenderAvatarMaxNonImpostors"
+ visible="false"
+ height="0"
+ label="RenderAvatarMaxNonImpostors"
+ layout="topleft"
+ left="0"
+ name="RenderAvatarMaxNonImpostors"
+ top_delta="0"
+ width="0">
+ </check_box>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_save_pref_preset.xml b/indra/newview/skins/default/xui/en/floater_save_pref_preset.xml
new file mode 100644
index 0000000000..7dee28eff3
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_save_pref_preset.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<floater
+ legacy_header_height="18"
+ height="145"
+ help_topic="floater_save_preset"
+ layout="topleft"
+ name="Save Pref Preset"
+ save_rect="true"
+ title="SAVE PREF PRESET"
+ width="300">
+
+ <string name="title_graphic">Save Graphic Preset</string>
+ <string name="title_camera">Save Camera Preset</string>
+
+ <text
+ follows="top|left|right"
+ height="32"
+ layout="topleft"
+ word_wrap="true"
+ left="20"
+ name="Preset"
+ top="30"
+ width="200">
+ Type a name for the preset or choose an existing preset.
+ </text>
+ <combo_box
+ follows="top|left"
+ layout="topleft"
+ left="20"
+ name="preset_combo"
+ top_delta="35"
+ allow_text_entry="true"
+ width="200"/>
+ <button
+ follows="top|left"
+ height="23"
+ label="Save"
+ layout="topleft"
+ top_delta="40"
+ left="20"
+ name="save"
+ width="70"/>
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left_pad="20"
+ name="cancel"
+ width="70"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_sys_well.xml b/indra/newview/skins/default/xui/en/floater_sys_well.xml
index ecedb27438..2c5176cf01 100755
--- a/indra/newview/skins/default/xui/en/floater_sys_well.xml
+++ b/indra/newview/skins/default/xui/en/floater_sys_well.xml
@@ -23,10 +23,6 @@
name="title_im_well_window">
CONVERSATIONS
</string>
- <string
- name="title_notification_well_window">
- NOTIFICATIONS
- </string>
<flat_list_view
color="FloaterDefaultBackgroundColor"
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_other.xml b/indra/newview/skins/default/xui/en/menu_attachment_other.xml
index ba91b0b5d9..0cb412ad9a 100755
--- a/indra/newview/skins/default/xui/en/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_other.xml
@@ -116,8 +116,8 @@
<menu_item_separator />
<menu_item_check
- name="Normal"
- label="Normal Rendering">
+ name="RenderNormally"
+ label="Render Normally">
<menu_item_check.on_check
function="Avatar.CheckImpostorMode"
parameter="0" />
@@ -126,8 +126,8 @@
parameter="0" />
</menu_item_check>
<menu_item_check
- name="Always use impostor"
- label="Always use impostor">
+ name="DoNotRender"
+ label="Do Not Render">
<menu_item_check.on_check
function="Avatar.CheckImpostorMode"
parameter="1" />
@@ -136,8 +136,8 @@
parameter="1" />
</menu_item_check>
<menu_item_check
- name="Never use impostor"
- label="Never use impostor">
+ name="AlwaysRenderFully"
+ label="Always Render Fully">
<menu_item_check.on_check
function="Avatar.CheckImpostorMode"
parameter="2" />
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_other.xml b/indra/newview/skins/default/xui/en/menu_avatar_other.xml
index cfbbe41f95..9fb1fd2aff 100755
--- a/indra/newview/skins/default/xui/en/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_other.xml
@@ -106,8 +106,8 @@
<menu_item_separator />
<menu_item_check
- name="Normal"
- label="Normal Rendering">
+ name="RenderNormally"
+ label="Render Normally">
<menu_item_check.on_check
function="Avatar.CheckImpostorMode"
parameter="0" />
@@ -116,8 +116,8 @@
parameter="0" />
</menu_item_check>
<menu_item_check
- name="Always use impostor"
- label="Always use impostor">
+ name="DoNotRender"
+ label="Do Not Render">
<menu_item_check.on_check
function="Avatar.CheckImpostorMode"
parameter="1" />
@@ -126,8 +126,8 @@
parameter="1" />
</menu_item_check>
<menu_item_check
- name="Never use impostor"
- label="Never use impostor">
+ name="AlwaysRenderFully"
+ label="Always Render Fully">
<menu_item_check.on_check
function="Avatar.CheckImpostorMode"
parameter="2" />
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index 7099db63ab..61002bf1b5 100755
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -4,6 +4,81 @@
layout="topleft"
name="Popup"
visible="false">
+ <menu_item_call
+ label="Create listing"
+ layout="topleft"
+ name="Marketplace Create Listing">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="marketplace_create_listing" />
+ </menu_item_call>
+ <menu_item_call
+ label="Associate listing"
+ layout="topleft"
+ name="Marketplace Associate Listing">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="marketplace_associate_listing" />
+ </menu_item_call>
+ <menu_item_call
+ label="Get (Refresh) listing"
+ layout="topleft"
+ name="Marketplace Get Listing">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="marketplace_get_listing" />
+ </menu_item_call>
+ <menu_item_call
+ label="Check for errors"
+ layout="topleft"
+ name="Marketplace Check Listing">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="marketplace_check_listing" />
+ </menu_item_call>
+ <menu_item_call
+ label="Edit listing"
+ layout="topleft"
+ name="Marketplace Edit Listing">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="marketplace_edit_listing" />
+ </menu_item_call>
+ <menu_item_call
+ label="List"
+ layout="topleft"
+ name="Marketplace List">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="marketplace_list" />
+ </menu_item_call>
+ <menu_item_call
+ label="Unlist"
+ layout="topleft"
+ name="Marketplace Unlist">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="marketplace_unlist" />
+ </menu_item_call>
+ <menu_item_call
+ label="Activate"
+ layout="topleft"
+ name="Marketplace Activate">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="marketplace_activate" />
+ </menu_item_call>
+ <menu_item_call
+ label="Deactivate"
+ layout="topleft"
+ name="Marketplace Deactivate">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="marketplace_deactivate" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Marketplace Listings Separator" />
<menu_item_call
label="Share"
layout="topleft"
@@ -490,14 +565,6 @@
<menu_item_call
label="Delete"
layout="topleft"
- name="Remove Link">
- <menu_item_call.on_click
- function="Inventory.DoToSelected"
- parameter="delete" />
- </menu_item_call>
- <menu_item_call
- label="Delete"
- layout="topleft"
name="Delete">
<menu_item_call.on_click
function="Inventory.DoToSelected"
@@ -710,20 +777,20 @@
layout="topleft"
name="Marketplace Separator" />
<menu_item_call
- label="Copy to Merchant Outbox"
- layout="topleft"
- name="Merchant Copy">
+ label="Copy to Marketplace Listings"
+ layout="topleft"
+ name="Marketplace Copy">
<menu_item_call.on_click
- function="Inventory.DoToSelected"
- parameter="copy_to_outbox" />
+ function="Inventory.DoToSelected"
+ parameter="copy_to_marketplace_listings" />
</menu_item_call>
<menu_item_call
- label="Send to Marketplace"
- layout="topleft"
- name="Marketplace Send">
+ label="Move to Marketplace Listings"
+ layout="topleft"
+ name="Marketplace Move">
<menu_item_call.on_click
- function="Inventory.DoToSelected"
- parameter="send_to_marketplace" />
+ function="Inventory.DoToSelected"
+ parameter="move_to_marketplace_listings" />
</menu_item_call>
<menu_item_call
label="--no options--"
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index e91eea04d1..73ca7c529d 100755
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -108,6 +108,12 @@
function="Floater.Show"
parameter="sl_about" />
</menu_item_call>
+ <menu_item_call
+ label="Check for Updates"
+ name="Check for Updates">
+ <menu_item_call.on_click
+ function="Advanced.CheckViewerUpdates"/>
+ </menu_item_call>
</menu>
<menu_item_check
label="Show Debug Menu"
diff --git a/indra/newview/skins/default/xui/en/menu_marketplace_view.xml b/indra/newview/skins/default/xui/en/menu_marketplace_view.xml
new file mode 100755
index 0000000000..4b3bb8ee1c
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_marketplace_view.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ name="menu_marketplace_sort"
+ left="0" bottom="0" visible="false"
+ mouse_opaque="false">
+ <menu_item_check
+ label="Sort by name"
+ name="sort_by_name">
+ <menu_item_check.on_click
+ function="Marketplace.ViewSort.Action"
+ parameter="sort_by_name" />
+ <menu_item_check.on_check
+ function="Marketplace.ViewSort.CheckItem"
+ parameter="sort_by_name" />
+ </menu_item_check>
+ <menu_item_check
+ label="Sort by most recent"
+ name="sort_by_recent">
+ <menu_item_check.on_click
+ function="Marketplace.ViewSort.Action"
+ parameter="sort_by_recent" />
+ <menu_item_check.on_check
+ function="Marketplace.ViewSort.CheckItem"
+ parameter="sort_by_recent" />
+ </menu_item_check>
+ <menu_item_check
+ label="Sort by stock amount (low to high)"
+ name="sort_by_stock_amount">
+ <menu_item_check.on_click
+ function="Marketplace.ViewSort.Action"
+ parameter="sort_by_stock_amount"/>
+ <menu_item_check.on_check
+ function="Marketplace.ViewSort.CheckItem"
+ parameter="sort_by_stock_amount"/>
+ </menu_item_check>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_check
+ label="Show only listing folders"
+ name="show_only_listing_folders">
+ <menu_item_check.on_click
+ function="Marketplace.ViewSort.Action"
+ parameter="show_only_listing_folders"/>
+ <menu_item_check.on_check
+ function="Marketplace.ViewSort.CheckItem"
+ parameter="show_only_listing_folders"/>
+ </menu_item_check>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_url_email.xml b/indra/newview/skins/default/xui/en/menu_url_email.xml
new file mode 100644
index 0000000000..6467fe5c90
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_url_email.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Email Popup">
+ <menu_item_call
+ label="Compose Email in an External client"
+ layout="topleft"
+ name="email_open_external">
+ <menu_item_call.on_click
+ function="Url.OpenExternal" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="Copy Email to clipboard"
+ layout="topleft"
+ name="email_copy">
+ <menu_item_call.on_click
+ function="Url.CopyLabel" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_url_experience.xml b/indra/newview/skins/default/xui/en/menu_url_experience.xml
new file mode 100644
index 0000000000..f4d50e1603
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_url_experience.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Url Popup">
+ <menu_item_call
+ label="Copy SLurl to clipboard"
+ layout="topleft"
+ name="url_copy">
+ <menu_item_call.on_click
+ function="Url.CopyUrl" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index e0cc73f894..26004a3bd5 100755
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -66,6 +66,13 @@
function="Floater.ToggleOrBringToFront"
parameter="picks" />
</menu_item_call>
+ <menu_item_call
+ label="Experiences..."
+ name="Experiences">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="experiences"/>
+ </menu_item_call>
<menu_item_separator/>
<menu_item_call
label="Camera Controls..."
@@ -127,7 +134,7 @@
</menu_item_call>
<menu_item_call
label="Walk / run / fly..."
- name="Walk / run / fly">
+ name="WalkRunFly">
<menu_item_call.on_click
function="Floater.ToggleOrBringToFront"
parameter="moveview" />
@@ -173,6 +180,13 @@
function="Floater.ToggleOrBringToFront"
parameter="outbox" />
</menu_item_call>
+ <menu_item_call
+ label="Marketplace listings..."
+ name="MarketplaceListings">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="marketplace_listings" />
+ </menu_item_call>
<menu_item_call
label="Account dashboard..."
name="Manage My Account">
@@ -495,7 +509,7 @@
</menu_item_call>
<menu_item_call
label="Region / Estate"
- name="Region/Estate">
+ name="RegionEstate">
<menu_item_call.on_click
function="Floater.Show"
parameter="region_info" />
@@ -1424,7 +1438,7 @@
function="Floater.Show"
parameter="bumps" />
</menu_item_call>
- <menu_item_separator/>
+ <menu_item_separator/>
<menu_item_call
label="About [APP_NAME]"
name="About Second Life">
@@ -1432,6 +1446,12 @@
function="Floater.Show"
parameter="sl_about" />
</menu_item_call>
+ <menu_item_call
+ label="Check for Updates"
+ name="Check for Updates">
+ <menu_item_call.on_click
+ function="Advanced.CheckViewerUpdates"/>
+ </menu_item_call>
</menu>
<menu
create_jump_keys="true"
@@ -1540,14 +1560,14 @@
parameter="scene_load_stats" />
</menu_item_call>
<menu_item_check
- label="Show Draw Weight for Avatars"
- name="Avatar Rendering Cost">
+ label="Show avatar complexity information"
+ name="Avatar Draw Info">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
- parameter="shame" />
+ parameter="avatardrawinfo" />
<menu_item_check.on_click
function="Advanced.ToggleInfoDisplay"
- parameter="shame" />
+ parameter="avatardrawinfo" />
</menu_item_check>
</menu>
<menu
@@ -2678,26 +2698,6 @@
function="Advanced.ToggleInfoDisplay"
parameter="wind vectors" />
</menu_item_check>
- <menu_item_check
- label="Render Complexity"
- name="rendercomplexity">
- <menu_item_check.on_check
- function="Advanced.CheckInfoDisplay"
- parameter="rendercomplexity" />
- <menu_item_check.on_click
- function="Advanced.ToggleInfoDisplay"
- parameter="rendercomplexity" />
- </menu_item_check>
- <menu_item_check
- label="Attachment Bytes"
- name="attachment bytes">
- <menu_item_check.on_check
- function="Advanced.CheckInfoDisplay"
- parameter="attachment bytes" />
- <menu_item_check.on_click
- function="Advanced.ToggleInfoDisplay"
- parameter="attachment bytes" />
- </menu_item_check>
<menu_item_check
label="Sculpt"
name="Sculpt">
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index bd8099ef1f..570a7625f3 100755
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -308,9 +308,251 @@ Initialization with the Marketplace failed because of a system or network error.
name="okbutton"
yestext="OK"/>
</notification>
+
+ <notification
+ icon="OutboxStatus_Error"
+ name="StockPasteFailed"
+ type="outbox">
+ Copy or move to Stock Folder failed with error :
+
+ &apos;[ERROR_CODE]&apos;
+
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+ <notification
+ icon="OutboxStatus_Error"
+ name="MerchantPasteFailed"
+ type="outbox">
+ Copy or move to Marketplace Listings failed with error :
+
+ &apos;[ERROR_CODE]&apos;
+
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="OutboxStatus_Error"
+ name="MerchantTransactionFailed"
+ type="outbox">
+ The transaction with the Marketplace failed with the following error :
+
+ Reason : &apos;[ERROR_REASON]&apos;
+ [ERROR_DESCRIPTION]
+
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="OutboxStatus_Error"
+ name="MerchantUnprocessableEntity"
+ type="outbox">
+ We are unable to list this product or activate the version folder. Usually this is caused by missing information in the listing description form, but it may be due to errors in the folder structure. Either edit the listing or check the listing folder for errors.
+
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="OutboxStatus_Error"
+ name="MerchantListingFailed"
+ type="outbox">
+ Listing to Marketplace failed with error :
+
+ &apos;[ERROR_CODE]&apos;
+
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="OutboxStatus_Error"
+ name="MerchantFolderActivationFailed"
+ type="outbox">
+ Activating this version folder failed with error :
+
+ &apos;[ERROR_CODE]&apos;
+
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
<notification
+ icon="alertmodal.tga"
+ name="MerchantForceValidateListing"
+ type="alertmodal">
+ In order to create your listing, we fixed the hierarchy of your listing contents.
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Warn me that creating a listing fixes the hierarchy of the content"
+ name="okignore"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ConfirmMerchantActiveChange"
+ type="alertmodal">
+ This action will change the active content of this listing. Do you want to continue?
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Confirm before I change an active listing on the marketplace"
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ConfirmMerchantMoveInventory"
+ type="alertmodal">
+ Items dragged to the Marketplace Listings window are moved from their original locations, not copied. Do you want to continue?
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Confirm before I move an item from the inventory to the marketplace"
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ConfirmListingCutOrDelete"
+ type="alertmodal">
+ Moving or deleting a listing folder will delete your Marketplace listing. If you would like to keep the Marketplace listing, move or delete the contents of the version folder you would like to modify. Do you want to continue?
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Confirm before I move or delete a listing from the marketplace"
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ConfirmCopyToMarketplace"
+ type="alertmodal">
+ You don't have permission to copy one or more of these items to the Marketplace. You can move them or leave them behind.
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Confirm before I try to copy a selection containing no copy items to the marketplace"
+ name="yesnocancelbuttons"
+ yestext="Move item(s)"
+ notext="Don't move item(s)"
+ canceltext="Cancel"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ConfirmMerchantUnlist"
+ type="alertmodal">
+ This action will unlist this listing. Do you want to continue?
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Confirm before I unlist an active listing on the marketplace"
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ConfirmMerchantClearVersion"
+ type="alertmodal">
+ This action will deactivate the version folder of the current listing. Do you want to continue?
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Confirm before I deactivate the version folder of a listing on the marketplace"
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AlertMerchantListingNotUpdated"
+ type="alertmodal">
+This listing could not be updated.
+[[URL] Click here] to edit it on the Marketplace.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AlertMerchantListingCannotWear"
+ type="alertmodal">
+ You cannot wear clothes or body parts that are in the Marketplace Listings folder.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AlertMerchantListingInvalidID"
+ type="alertmodal">
+ Invalid listing ID.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AlertMerchantListingActivateRequired"
+ type="alertmodal">
+ There are several or no version folders in this listing. You will need to select and activate one independently later.
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Alert about version folder activation when I create a listing with several version folders"
+ name="okignore"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AlertMerchantStockFolderSplit"
+ type="alertmodal">
+ We have separated stock items of different types into separate stock folders, so your folder is arranged in a way that we can list it.
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Alert when stock folder is being split before being listed"
+ name="okignore"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AlertMerchantStockFolderEmpty"
+ type="alertmodal">
+ We have unlisted your listing because the stock is empty. You need to add more units to the stock folder to list the listing again.
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Alert when a listing is unlisted because stock folder is empty"
+ name="okignore"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="AlertMerchantVersionFolderEmpty"
+ type="alertmodal">
+ We have unlisted your listing because the version folder is empty. You need to add items to the version folder to list the listing again.
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Alert when a listing is unlisted because version folder is empty"
+ name="okignore"
+ yestext="OK"/>
+ </notification>
+
+ <notification
icon="alertmodal.tga"
name="CompileQueueSaveText"
type="alertmodal">
@@ -577,6 +819,33 @@ If you no longer wish to have these abilities granted to this role, disable them
notext="Cancel"
yestext="Eject"/>
</notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="BanGroupMemberWarning"
+ type="alertmodal">
+ You are about to ban [AVATAR_NAME] from the group.
+ <tag>group</tag>
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Confirm banning a participant from group"
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="Ban"/>
+ </notification>
+ <notification
+ icon="alertmodal.tga"
+ name="BanGroupMembersWarning"
+ type="alertmodal">
+ You are about to ban [COUNT] members from group.
+ <tag>group</tag>
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Confirm banning multiple members from group"
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="Ban"/>
+ </notification>
<notification
icon="alertmodal.tga"
@@ -783,7 +1052,7 @@ Objects: [N]
icon="alertmodal.tga"
name="ReturnAllTopObjects"
type="alertmodal">
-Are you sure you want to return all listed objects back to their owner&apos;s inventory?
+Are you sure you want to return all listed objects back to their owner&apos;s inventory? This will return ALL scripted objects in the region!
<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
@@ -2481,8 +2750,9 @@ This is usually a temporary failure. Please customize and save the wearable agai
icon="alertmodal.tga"
name="YouHaveBeenLoggedOut"
type="alertmodal">
-Darn. You have been logged out of [SECOND_LIFE]
- [MESSAGE]
+Darn. You have been logged out of [SECOND_LIFE].
+
+[MESSAGE]
<usetemplate
name="okcancelbuttons"
notext="Quit"
@@ -3051,6 +3321,29 @@ You can use [SECOND_LIFE] normally and other people will see you correctly.
</notification>
<notification
+ icon = "notifytip.tga"
+ name = "RegionAndAgentComplexity"
+ type = "notifytip"
+ log_to_chat = "false">
+ <unique combine = "cancel_old">
+ <context>AgentComplexityNotice</context>
+ </unique>
+Your [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 visual complexity] is [AGENT_COMPLEXITY].
+[OVERLIMIT_MSG]
+ </notification>
+
+ <notification
+ icon = "notifytip.tga"
+ name = "AgentComplexity"
+ type = "notifytip"
+ log_to_chat = "false">
+ <unique combine = "cancel_old">
+ <context>AgentComplexityNotice</context>
+ </unique>
+Your [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 visual complexity] is [AGENT_COMPLEXITY].
+ </notification>
+
+ <notification
icon="alertmodal.tga"
name="FirstRun"
type="alertmodal">
@@ -3650,6 +3943,53 @@ see [[INFO_URL] Information about this update]
name="okbutton"
yestext="OK"/>
</notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="UpdateDownloadInProgress"
+ type="alertmodal">
+An update is available!
+It's downloading in the background and we will prompt you to restart your viewer to finish installing it as soon as it's ready.
+ <tag>confirm</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="UpdateDownloadComplete"
+ type="alertmodal">
+An update was downloaded. It will be installed during restart.
+ <tag>confirm</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="UpdateCheckError"
+ type="alertmodal">
+An error occured while checking for update.
+Please try again later.
+ <tag>confirm</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="UpdateViewerUpToDate"
+ type="alertmodal">
+Your viewer is up to date!
+If you can't wait to try out the latest features and fixes, check out the Alternate Viewers page. http://wiki.secondlife.com/wiki/Linden_Lab_Official:Alternate_Viewers.
+ <tag>confirm</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
<notification
icon="alertmodal.tga"
@@ -3953,6 +4293,21 @@ You have reached your maximum number of groups. Please leave some group before j
<notification
icon="alert.tga"
+ name="GroupLimitInfo"
+ type="alert">
+The group limit for base accounts is [MAX_BASIC], and for [https://secondlife.com/premium/ premium]
+accounts is [MAX_PREMIUM].
+If you downgraded your account, you will need to get below [MAX_BASIC] group limit before you can join more.
+
+[https://secondlife.com/my/account/membership.php Upgrade today!]
+ <tag>group</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="Close"/>
+ </notification>
+
+ <notification
+ icon="alert.tga"
name="KickUser"
type="alert">
<tag>win</tag>
@@ -4446,6 +4801,90 @@ Remove estate manager for this estate only or for [ALL_ESTATES]?
<notification
icon="alert.tga"
+ label="Select estate"
+ name="EstateAllowedExperienceAdd"
+ type="alert">
+ Add to allowed list for this estate only or for [ALL_ESTATES]?
+ <tag>confirm</tag>
+ <usetemplate
+ canceltext="Cancel"
+ name="yesnocancelbuttons"
+ notext="All Estates"
+ yestext="This Estate"/>
+ </notification>
+
+ <notification
+ icon="alert.tga"
+ label="Select estate"
+ name="EstateAllowedExperienceRemove"
+ type="alert">
+ Remove from allowed list for this estate only or for [ALL_ESTATES]?
+ <tag>confirm</tag>
+ <usetemplate
+ canceltext="Cancel"
+ name="yesnocancelbuttons"
+ notext="All Estates"
+ yestext="This Estate"/>
+ </notification>
+
+ <notification
+ icon="alert.tga"
+ label="Select estate"
+ name="EstateBlockedExperienceAdd"
+ type="alert">
+ Add to blocked list for this estate only or for [ALL_ESTATES]?
+ <tag>confirm</tag>
+ <usetemplate
+ canceltext="Cancel"
+ name="yesnocancelbuttons"
+ notext="All Estates"
+ yestext="This Estate"/>
+ </notification>
+
+ <notification
+ icon="alert.tga"
+ label="Select estate"
+ name="EstateBlockedExperienceRemove"
+ type="alert">
+ Remove from blocked list for this estate only or for [ALL_ESTATES]?
+ <tag>confirm</tag>
+ <usetemplate
+ canceltext="Cancel"
+ name="yesnocancelbuttons"
+ notext="All Estates"
+ yestext="This Estate"/>
+ </notification>
+
+ <notification
+ icon="alert.tga"
+ label="Select estate"
+ name="EstateTrustedExperienceAdd"
+ type="alert">
+ Add to key list for this estate only or for [ALL_ESTATES]?
+ <tag>confirm</tag>
+ <usetemplate
+ canceltext="Cancel"
+ name="yesnocancelbuttons"
+ notext="All Estates"
+ yestext="This Estate"/>
+ </notification>
+
+ <notification
+ icon="alert.tga"
+ label="Select estate"
+ name="EstateTrustedExperienceRemove"
+ type="alert">
+ Remove from key list for this estate only or for [ALL_ESTATES]?
+ <tag>confirm</tag>
+ <usetemplate
+ canceltext="Cancel"
+ name="yesnocancelbuttons"
+ notext="All Estates"
+ yestext="This Estate"/>
+ </notification>
+
+ <notification
+ icon="alert.tga"
label="Confirm Kick"
name="EstateKickUser"
type="alert">
@@ -4481,6 +4920,13 @@ Are you sure you want to change the Estate Covenant?
</notification>
<notification
+ icon="alertmodal.tga"
+ name="SLM_UPDATE_FOLDER"
+ type="alertmodal">
+ [MESSAGE]
+ </notification>
+
+ <notification
icon="alertmodal.tga"
name="RegionEntryAccessBlocked_AdultsOnlyContent"
type="alertmodal">
@@ -5354,16 +5800,19 @@ You cannot undo this action.
notext="Cancel"
yestext="OK"/>
</notification>
-
+
<notification
- icon="alertmodal.tga"
- name="HelpReportAbuseEmailLL"
- type="alert">
+ icon="alertmodal.tga"
+ name="ConfirmUnlink"
+ type="alertmodal">
<unique/>
-
-Use this tool to report violations of the [http://secondlife.com/corporate/tos.php Terms of Service] and [http://secondlife.com/corporate/cs.php Community Standards].
-
-All reported abuses are investigated and resolved.
+ This is a large selection with linksets. If you unlink it, you may not be able to link it again. You may wish to take copies of linksets into your inventory as a precaution.
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Confirm when unlinking a linkset"
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="Unlink"/>
</notification>
<notification
@@ -6671,15 +7120,6 @@ No valid circuit code.
<notification
icon="notify.tga"
- name="NoValidTimestamp"
- persist="true"
- type="notify">
- <tag>fail</tag>
-No valid timestamp.
- </notification>
-
- <notification
- icon="notify.tga"
name="NoPendingConnection"
persist="true"
type="notify">
@@ -7151,6 +7591,154 @@ Is this OK?
</notification>
<notification
+ icon="alertmodal.tga"
+ name="ExperienceAcquireFailed"
+ type="alertmodal">
+Unable to acquire a new experience:
+ [ERROR_MESSAGE]
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="notify.tga"
+ name="NotInGroupExperienceProfileMessage"
+ persist="false"
+ type="notify">
+ A change to the experience group was ignored because the owner is not a member of the selected group.
+ </notification>
+
+ <notification
+ icon="notify.tga"
+ name="UneditableExperienceProfileMessage"
+ persist="false"
+ type="notify">
+ The uneditable field '[field]' was ignored when updating the experience profile.
+ </notification>
+
+ <notification
+ icon="notify.tga"
+ name="RestrictedToOwnerExperienceProfileMessage"
+ persist="false"
+ type="notify">
+ Ignored changes to the field '[field]' which can only be set by the experience owner.
+ </notification>
+
+ <notification
+ icon="notify.tga"
+ name="MaturityRatingExceedsOwnerExperienceProfileMessage"
+ persist="false"
+ type="notify">
+ You may not set the maturity rating of an experience higher than that of the owner.
+ </notification>
+
+ <notification
+ icon="notify.tga"
+ name="RestrictedTermExperienceProfileMessage"
+ persist="false"
+ type="notify">
+ The following terms prevented the update of the experience profile name and/or description: [extra_info]
+ </notification>
+
+ <notification
+ icon="notify.tga"
+ name="TeleportedHomeExperienceRemoved"
+ persist="false"
+ type="notify">
+ You have been teleported from the region [region_name] for removing the experience secondlife:///app/experience/[public_id]/profile and are no longer permitted in the region.
+ <form name="form">
+ <ignore name="ignore"
+ text="Kicked from region for removing an experience"/>
+ </form>
+ </notification>
+
+ <notification
+ icon="notify.tga"
+ name="TrustedExperienceEntry"
+ persist="false"
+ type="notify">
+ You have been allowed into the region [region_name] by participating in the key experience secondlife:///app/experience/[public_id]/profile removing this experience may kick you from the region.
+ <form name="form">
+ <ignore name="ignore"
+ text="Allowed into a region by an experience"/>
+ </form>
+ </notification>
+
+ <notification
+ icon="notify.tga"
+ name="TrustedExperiencesAvailable"
+ persist="false"
+ type="notify">
+You do not have access to this destination. You may be allowed into the region by Accepting an experience below:
+
+[EXPERIENCE_LIST]
+
+Other Key Experiences may be available.
+ </notification>
+
+
+ <notification
+ icon="notify.tga"
+ name="ExperienceEvent"
+ persist="false"
+ type="notifytip">
+ An object was allowed to [EventType] by the secondlife:///app/experience/[public_id]/profile experience.
+ Owner: secondlife:///app/agent/[OwnerID]/inspect
+ Object Name: [ObjectName]
+ Parcel Name: [ParcelName]
+ </notification>
+
+ <notification
+ icon="notify.tga"
+ name="ExperienceEventAttachment"
+ persist="false"
+ type="notifytip">
+ An attachment was allowed to [EventType] by the secondlife:///app/experience/[public_id]/profile experience.
+ Owner: secondlife:///app/agent/[OwnerID]/inspect
+ </notification>
+
+ <notification
+ icon="notify.tga"
+ name="ScriptQuestionExperience"
+ persist="false"
+ type="notify">
+&apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, an object owned by &apos;[NAME]&apos;, requests your participation in the [GRID_WIDE] experience:
+
+[EXPERIENCE]
+
+Once permission is granted you will not see this message again for this experience unless it is revoked from the experience profile.
+
+Scripts associated with this experience will be able to do the following on regions where the experience is active:
+
+[QUESTIONS]Is this OK?
+
+ <unique combine="combine_with_new">
+ <context>experience</context>
+ </unique>
+ <tag>confirm</tag>
+ <form name="form">
+ <button
+ index="3"
+ name="BlockExperience"
+ text="Block Experience"/>
+ <button
+ index="2"
+ name="Mute"
+ text="Block Object"/>
+ <button
+ index="0"
+ name="Yes"
+ text="Yes"/>
+ <button
+ index="1"
+ name="No"
+ text="No"/>
+ </form>
+ </notification>
+
+ <notification
icon="notify.tga"
name="ScriptQuestionCaution"
priority="critical"
@@ -7678,6 +8266,20 @@ Attachment has been saved.
</notification>
<notification
+ icon="notifytip.tga"
+ name="PresetNotSaved"
+ type="notifytip">
+Error saving preset [NAME].
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="PresetNotDeleted"
+ type="notifytip">
+Error deleting preset [NAME].
+ </notification>
+
+ <notification
icon="alertmodal.tga"
name="UnableToFindHelpTopic"
type="alertmodal">
@@ -7761,9 +8363,8 @@ Select residents to share with.
name="MeshUploadError"
icon="alert.tga"
type="alert">
- [LABEL] failed to upload: [MESSAGE] [IDENTIFIER]
-
-See the log file for details.
+ [LABEL] failed to upload: [MESSAGE] [IDENTIFIER]
+[DETAILS]See SecondLife.log for details
</notification>
<notification
@@ -8004,7 +8605,7 @@ We cannot display a preview of this texture because it is no-copy and/or no-tran
<notification
icon="alertmodal.tga"
name="ConfirmLeaveCall"
- type="alert">
+ type="alertmodal">
Are you sure you want to leave this call?
<tag>confirm</tag>
<tag>voice</tag>
diff --git a/indra/newview/skins/default/xui/en/panel_experience_info.xml b/indra/newview/skins/default/xui/en/panel_experience_info.xml
new file mode 100644
index 0000000000..70d8a4fc64
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_experience_info.xml
@@ -0,0 +1,377 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ follows="all"
+ height="570"
+ layout="topleft"
+ left="5"
+ min_height="350"
+ top="5"
+ width="348"
+ name="panel_experience_info">
+ <text
+ follows="top|left|right"
+ font="SansSerifHugeBold"
+ height="26"
+ layout="topleft"
+ left_pad="4"
+ name="title"
+ text_color="White"
+ top="2"
+ value="Experience Profile"
+ use_ellipses="true"
+ left="3"
+ right="-3"/>
+ <scroll_container
+ color="DkGray2"
+ follows="all"
+ height="532"
+ layout="topleft"
+ left="9"
+ name="xp_scroll"
+ opaque="true"
+ top_pad="10"
+ width="330">
+ <panel
+ bg_alpha_color="DkGray2"
+ follows="top|left"
+ height="480"
+ layout="topleft"
+ left="0"
+ min_height="480"
+ name="scrolling_panel"
+ top="0"
+ width="315"
+ min_width="315">
+ <layout_stack
+ follows="all"
+ height="480"
+ layout="topleft"
+ left="0"
+ top="0"
+ orientation="vertical"
+ width="315">
+ <layout_panel
+ follows="all"
+ height="197"
+ layout="topleft"
+ left="0"
+ top="0"
+ auto_resize="false"
+ visible="true"
+ width="315"
+ name="image_panel">
+ <texture_picker
+ enabled="false"
+ fallback_image="default_land_picture.j2c"
+ follows="left|top"
+ height="197"
+ layout="topleft"
+ left="10"
+ name="logo"
+ top="10"
+ width="290" />
+ </layout_panel>
+ <layout_panel
+ follows="all"
+ height="19"
+ layout="topleft"
+ left="0"
+ top="5"
+ width="313"
+ auto_resize="false"
+ >
+ <text
+ follows="left|top|right"
+ font="SansSerifLarge"
+ height="14"
+ layout="topleft"
+ left="10"
+ name="experience_title"
+ text_color="white"
+ top="0"
+ use_ellipses="true"
+ value="Kyle's Superhero RPG"
+ width="288"/>
+ </layout_panel>
+ <layout_panel
+ follows=""
+ height="50"
+ layout="topleft"
+ left="0"
+ top="0"
+ auto_resize="false"
+ width="315"
+ name="description panel">
+ <expandable_text
+ follows="left|top|right"
+ font="SansSerif"
+ height="50"
+ layout="topleft"
+ left="7"
+ name="experience_description"
+ top="0"
+ value=""
+ width="293"/>
+ </layout_panel>
+ <layout_panel
+ follows="all"
+ height="69"
+ layout="topleft"
+ left="0"
+ top="5"
+ width="313"
+ visible="true"
+ auto_resize="false"
+ name="location panel"
+ >
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="Location"
+ width="290">
+ Location:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="18"
+ layout="topleft"
+ left="10"
+ valign="center"
+ name="LocationTextText"
+ width="288">
+ someplace
+ </text>
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Teleport"
+ layout="topleft"
+ name="teleport_btn"
+ width="151"
+ left="10"/>
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Map"
+ layout="topleft"
+ name="map_btn"
+ top_pad="-23"
+ width="101"
+ left_pad="5"/>
+ </layout_panel>
+ <layout_panel
+ follows="all"
+ height="53"
+ layout="topleft"
+ left="0"
+ top="5"
+ width="313"
+ visible="true"
+ auto_resize="false"
+ name="marketplace panel"
+
+ >
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="Location"
+ width="290">
+ Marketplace store:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="18"
+ layout="topleft"
+ left="10"
+ valign="center"
+ name="LocationTextText"
+ width="288">
+ someplace
+ </text>
+ </layout_panel>
+ <layout_panel
+ follows="left|top|right"
+ height="69"
+ left="0"
+ top="0"
+ auto_resize="false"
+ width="315"
+ >
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="ContentRating"
+ width="100">
+ Rating:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="18"
+ layout="topleft"
+ left_pad="2"
+ valign="center"
+ name="ContentRatingText"
+ top_delta="-2"
+ width="188">
+ Adult
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="Owner"
+ width="100">
+ Owner:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="18"
+ layout="topleft"
+ left_pad="2"
+ valign="center"
+ name="OwnerText"
+ top_delta="-2"
+ width="188">
+ Kyle
+ </text>
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Edit"
+ layout="topleft"
+ name="edit_btn"
+ top_pad="0"
+ width="151"
+ left="10"/>
+ <!--
+
+
+ <expandable_text
+ allow_scroll="false"
+ bg_visible="false"
+ follows="left|top|right"
+ h_pad="0"
+ height="35"
+ width="280"
+ layout="topleft"
+ font="SansSerifBig"
+ font.style="BOLD"
+ left="10"
+ top_pad="10"
+ name="pick_name"
+ read_only="false"
+ text_color="white"
+ v_pad="0"
+ use_ellipses="true"
+ value="It's an experience" />
+
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ top_pad="10"
+ value="Maturity level:"
+ width="130" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="unknown"
+ layout="topleft"
+ left_pad="10"
+ name="maturity_icon"
+ top_pad="-18"
+ width="18" />
+ <text
+ follows="top|left"
+ height="16"
+ layout="topleft"
+ left_pad="5"
+ name="maturity_value"
+ top_pad="-14"
+ value="unknown"
+ width="118" />
+ <panel
+ follows="left|top|right"
+ name="location_panel"
+ left="10"
+ width="280"
+ visible="false"
+ top_pad="10"
+ height="42">
+ <text
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left="00"
+ top="0"
+ value="Location:"
+ width="280" />
+
+ <text
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left="0"
+ top_pad="10"
+ value="Location:"
+ width="280" />
+ </panel>
+
+ <panel
+ follows="left|top|right"
+ name="location_panel"
+ left="10"
+ width="280"
+ top_pad="10"
+ height="42">
+ <text
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left="00"
+ top="0"
+ value="Location:"
+ width="280" />
+
+ <text
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left="0"
+ top_pad="10"
+ value="Location:"
+ width="280" />
+ </panel>
+
+-->
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_experience_list_editor.xml b/indra/newview/skins/default/xui/en/panel_experience_list_editor.xml
new file mode 100644
index 0000000000..c357f9e7d5
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_experience_list_editor.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ layout="topleft"
+ left="0"
+ top="0"
+ width="300"
+ height="100"
+ min_height="100"
+ follows="all"
+ border="true"
+ name="experince_list_editor">
+ <panel.string
+ name="loading">
+ loading...
+ </panel.string>
+ <panel.string
+ name="panel_allowed">
+ Allowed Experiences:
+ </panel.string>
+ <panel.string
+ name="panel_blocked">
+ Blocked Experiences:
+ </panel.string>
+ <panel.string
+ name="panel_trusted">
+ Key Experiences:
+ </panel.string>
+ <panel.string
+ name="no_results">
+ (empty)
+ </panel.string>
+ <text
+ layout="topleft"
+ name="text_name"
+ left="3"
+ right="120"
+ height="12"
+ follows="left|top">
+ Experience List
+ </text>
+ <text
+ layout="topleft"
+ name="text_count"
+ left="125"
+ top_pad="-12"
+ right="-1"
+ height="12"
+ follows="top|left">
+ </text>
+ <name_list
+ draw_heading="false"
+ left="3"
+ width="225"
+ height="75"
+ follows="all"
+ name="experience_list">
+ <name_list.columns
+ width="225"
+ user_resize="false"
+ name="experience_name"
+ label="Name"/>
+ </name_list>
+ <button
+ layout="topleft"
+ follows="top|right"
+ top_pad="-77"
+ left_pad="3"
+ width="65"
+ name="btn_add"
+ label="Add..."/>
+ <button
+ layout="topleft"
+ follows="top|right"
+ width="64"
+ name="btn_remove"
+ label="Remove"/>
+ <button
+ layout="topleft"
+ follows="top|right"
+ width="64"
+ name="btn_profile"
+ label="Profile..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_experience_list_item.xml b/indra/newview/skins/default/xui/en/panel_experience_list_item.xml
new file mode 100644
index 0000000000..a9777c51e7
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_experience_list_item.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+
+<panel
+ layout="topleft"
+ top="100"
+ left="5"
+ width="100"
+ height="19"
+ label="Experiences"
+ follows="top|right|left">
+ <text
+ left="3"
+ top="3"
+ height="16"
+ width="177"
+ follows="all"
+ name="experience_name"
+ >
+ Dummy Name
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_experience_log.xml b/indra/newview/skins/default/xui/en/panel_experience_log.xml
new file mode 100644
index 0000000000..6869a135d8
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_experience_log.xml
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+
+<panel
+ layout="topleft"
+ top="3"
+ left="3"
+ width="500"
+ height="300"
+ label="EVENTS"
+ bg_opaque_color="0 0.5 0 0.3"
+ follows="all">
+ <string
+ name="no_events"
+ value="No events."/>
+ <string
+ name="loading"
+ value="loading..."/>
+ <layout_stack
+ layout="topleft"
+ top="0"
+ left="4"
+ right="-1"
+ bottom="-4"
+ orientation="vertical"
+ follows="all">
+ <layout_panel
+ layout="topleft"
+ top="0"
+ left="1"
+ right="-1"
+ height="250"
+ follows="all">
+ <scroll_list
+ draw_heading="true"
+ left="1"
+ right="-86"
+ height="250"
+ follows="all"
+ name="experience_log_list">
+ <columns
+ width="100"
+ user_resize="true"
+ name="time"
+ label="Time"/>
+ <columns
+ width="100"
+ user_resize="true"
+ name="event"
+ label="Event"/>
+ <columns
+ width="100"
+ user_resize="true"
+ name="experience_name"
+ label="Experience"/>
+ <columns
+ width="100"
+ user_resize="true"
+ name="object_name"
+ label="Object"/>
+ </scroll_list>
+
+ <button
+ layout="topleft"
+ follows="top|right"
+ name="btn_notify"
+ label="Notify"
+ top_pad="-225"
+ left_pad="5"
+ right="-1"
+ enabled="false"/>
+
+ <button
+ layout="topleft"
+ follows="top|right"
+ name="btn_profile_xp"
+ label="Profile"
+ top_pad="5"
+ right="-1"
+ enabled="false"/>
+
+ <button
+ layout="topleft"
+ follows="top|right"
+ name="btn_report_xp"
+ label="Report"
+ top_pad="5"
+ right="-1"
+ enabled="false"/>
+ </layout_panel>
+ <layout_panel
+ layout="topleft"
+ top="0"
+ left="1"
+ right="-1"
+ height="30"
+ min_height="30"
+ follows="all"
+ name="button_panel"
+ visible="true">
+ <check_box
+ top="0"
+ follows="top|left"
+ height="26"
+ label="Notify All Events Days"
+ width="140"
+ name="notify_all" />
+
+ <spinner
+ top="5"
+ control_name="LogDays"
+ decimal_digits="0"
+ follows="left|top"
+ height="23"
+ increment="1"
+ initial_value="7"
+ label_width="30"
+ layout="topleft"
+ left_pad="5"
+ max_val="14"
+ min_val="0"
+ name="logsizespinner"
+ width="40" />
+ <button
+ top="5"
+ left="280"
+ layout="topleft"
+ follows="top|left"
+ name="btn_clear"
+ label="Clear"
+ width="80"
+ enabled="false"/>
+ <button
+ top="5"
+ layout="topleft"
+ left_pad="5"
+ width="20"
+ follows="top|left"
+ name="btn_prev"
+ label="&lt;"
+ enabled="false"/>
+ <button
+ top="5"
+ layout="topleft"
+ follows="top|left"
+ name="btn_next"
+ label="&gt;"
+ left_pad="5"
+ width="20"
+ enabled="false"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_experience_search.xml b/indra/newview/skins/default/xui/en/panel_experience_search.xml
new file mode 100644
index 0000000000..99ad3e7fe3
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_experience_search.xml
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ layout="topleft"
+ top="18"
+ left="0"
+ width="350"
+ height="330"
+ label="SEARCH"
+ follows="all">
+
+ <string
+ name="not_found">
+ &apos;[TEXT]&apos; not found
+ </string>
+ <string
+ name="no_results">
+ No results
+ </string>
+ <string
+ name="searching">
+ Searching...
+ </string>
+ <string
+ name="loading">
+ Loading...
+ </string>
+ <string
+ name="maturity_icon_general">
+ "Parcel_PG_Light"
+ </string>
+ <string
+ name="maturity_icon_moderate">
+ "Parcel_M_Light"
+ </string>
+ <string
+ name="maturity_icon_adult">
+ "Parcel_R_Light"
+ </string>
+ <panel
+ follows="all"
+ left="5"
+ right="-3"
+ bottom="-2"
+ top="0"
+ name="search_panel">
+ <text
+ left="0"
+ follows="top|left|right"
+ right="-1">
+ Enter part of the name:
+ </text>
+ <line_editor
+ left="0"
+ follows="left|top|right"
+ name="edit"
+ height="18"
+ right="-60"/>
+ <button label="Go"
+ follows="top|right"
+ top_pad="-18"
+ left_pad="2"
+ right="-1"
+ height="18"
+ name="find"/>
+ <text
+ top_pad="6"
+ left="0"
+ follows="top|left"
+ width="180">
+ Max Content Rating:
+ </text>
+ <icons_combo_box
+ follows="left|top"
+ height="20"
+ label="Moderate"
+ layout="topleft"
+ name="maturity"
+ top_pad="-13"
+ left_pad="0"
+ right="-1">
+ <icons_combo_box.drop_down_button
+ image_overlay="Parcel_M_Light"
+ image_overlay_alignment="left"
+ imgoverlay_label_space="3"
+ pad_left="3"/>
+ <icons_combo_box.item
+ label="Adult"
+ name="Adult"
+ value="42">
+ <item.columns
+ halign="center"
+ type="icon"
+ value="Parcel_R_Light"
+ width="20"/>
+ </icons_combo_box.item>
+ <icons_combo_box.item
+ label="Moderate"
+ name="Mature"
+ value="21">
+ <item.columns
+ halign="center"
+ type="icon"
+ value="Parcel_M_Light"
+ width="20"/>
+ </icons_combo_box.item>
+ <icons_combo_box.item
+ label="General"
+ name="PG"
+ value="13">
+ <item.columns
+ halign="center"
+ type="icon"
+ value="Parcel_PG_Light"
+ width="20"/>
+ </icons_combo_box.item>
+ </icons_combo_box>
+ <scroll_list
+ draw_heading="true"
+ left="0"
+ right="-1"
+ height="239"
+ top_pad="4"
+ follows="all"
+ column_padding="5"
+ name="search_results">
+ <columns
+ halign="center"
+ width="24"
+ name="maturity"
+ label=""/>
+ <columns
+ user_resize="true"
+ name="experience_name"
+ label="Name"/>
+ <columns
+ user_resize="true"
+ name="owner"
+ label="Owner"/>
+ </scroll_list>
+
+ <button
+ follows="left|bottom"
+ height="23"
+ label="OK"
+ label_selected="OK"
+ name="ok_btn"
+ top_pad="3"
+ left="0"
+ width="95" />
+ <button
+ follows="left|bottom"
+ height="23"
+ label="Cancel"
+ name="cancel_btn"
+ width="95"
+ left_pad="3" />
+ <button
+ follows="left|bottom"
+ height="23"
+ label="View Profile"
+ name="profile_btn"
+ width="95"
+ left_pad="3" />
+ <button
+ follows="left|bottom"
+ height="23"
+ label="&lt;"
+ name="left_btn"
+ width="23"
+ left_pad="3"
+ enabled="false"/>
+ <button
+ follows="left|bottom"
+ height="23"
+ label="&gt;"
+ name="right_btn"
+ width="23"
+ left_pad="3"
+ enabled="false" />
+
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_experiences.xml b/indra/newview/skins/default/xui/en/panel_experiences.xml
new file mode 100644
index 0000000000..7691e684c0
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_experiences.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+
+<panel
+ layout="topleft"
+ top="3"
+ left="3"
+ width="200"
+ height="300"
+ label="Experiences"
+ bg_opaque_color="0 0.5 0 0.3"
+ follows="all">
+ <string
+ name="loading_experiences"
+ value="Loading experiences..."/>
+ <string
+ name="no_experiences"
+ value="No experiences."/>
+ <string
+ name="acquire"
+ value="Acquire an Experience" />
+ <layout_stack
+ layout="topleft"
+ top="0"
+ left="4"
+ right="-1"
+ bottom="-4"
+ orientation="vertical"
+ follows="all">
+ <layout_panel
+ layout="topleft"
+ top="0"
+ left="1"
+ right="-1"
+ height="250"
+ follows="all">
+ <flat_list_view
+ name="experiences_list"
+ layout="topleft"
+ top="0"
+ left="1"
+ right="-1"
+ bottom="-1"
+ follows="all">
+ </flat_list_view>
+ </layout_panel>
+ <layout_panel
+ layout="topleft"
+ top="0"
+ left="1"
+ right="-1"
+ height="24"
+ min_height="24"
+ follows="all"
+ name="button_panel"
+ visible="false">
+ <button
+ layout="topleft"
+ left="2"
+ top="0"
+ follows="top|left"
+ name="btn_action"
+ enabled="true"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
index b3326d8da6..95312edfb9 100755
--- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
@@ -176,6 +176,22 @@ background_visible="true"
name="group_land_tab_panel"
top="0" />
</accordion_tab>
+ <accordion_tab
+ expanded="false"
+ layout="topleft"
+ name="group_experiences_tab"
+ title="Experiences"
+ fit_panel="false">
+ <panel
+ border="false"
+ class="panel_group_experiences"
+ filename="panel_experiences.xml"
+ follows="left|top|right"
+ layout="topleft"
+ left="0"
+ name="group_experiences_tab_panel"
+ top="0" />
+ </accordion_tab>
</accordion>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index 0518688f45..0a85477bf4 100755
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -21,7 +21,7 @@
</panel.string>
<panel.string
name="ItemcountUnknown">
-
+ Fetched [ITEM_COUNT] Items [FILTER]
</panel.string>
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/panel_marketplace_listings.xml b/indra/newview/skins/default/xui/en/panel_marketplace_listings.xml
new file mode 100755
index 0000000000..2b17473a84
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_marketplace_listings.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ label="Marketplace"
+ name="Marketplace Panel"
+ follows="all"
+ layout="topleft"
+ width="308"
+ height="440">
+ <panel
+ name="tool_panel"
+ follows="left|top|right"
+ layout="topleft"
+ height="30"
+ width="308"
+ top="0"
+ left="0">
+ <menu_button
+ name="sort_btn"
+ tool_tip="View/sort options"
+ layout="topleft"
+ follows="top|left"
+ width="31"
+ height="25"
+ left="2"
+ menu_filename="menu_marketplace_view.xml"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_sort"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ menu_position="bottomleft"/>
+ <button
+ name="add_btn"
+ tool_tip="Create a new listing folder"
+ layout="topleft"
+ follows="top|left"
+ width="31"
+ height="25"
+ left_pad="2"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_plus"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"/>
+ <button
+ name="audit_btn"
+ label="Check for Errors"
+ tool_tip="Check your marketplace listings"
+ layout="topleft"
+ follows="top|right"
+ width="97"
+ height="26"
+ left_pad="143"/>
+ </panel>
+ <panel
+ name="tab_container_panel"
+ follows="all"
+ layout="topleft"
+ default_tab_group="1"
+ width="308"
+ height="350">
+ <filter_editor
+ text_pad_left="10"
+ follows="left|top|right"
+ height="23"
+ label="Filter Marketplace Listings"
+ layout="topleft"
+ left="0"
+ max_length_chars="300"
+ name="filter_editor"
+ top="0"
+ width="308" />
+ <tab_container
+ name="marketplace_filter_tabs"
+ follows="all"
+ layout="topleft"
+ top="30"
+ left="0"
+ top_pad="0"
+ width="308"
+ height="320"
+ halign="center"
+ tab_height="30"
+ tab_group="1"
+ tab_position="top"
+ tab_min_width="50">
+ </tab_container>
+ </panel>
+ <panel
+ name="marketplace_drop_zone"
+ mouse_opaque="true"
+ follows="bottom|left|right"
+ left="2"
+ width="306"
+ height="40"
+ background_visible="true"
+ background_opaque="true"
+ bg_alpha_image="none"
+ bg_alpha_color="EmphasisColor_35"
+ bg_opaque_image="Marketplace_Dropzone_Background"
+ border="true"
+ bevel_style="in"
+ visible="true">
+ <text
+ type="string"
+ follows="bottom|left|right"
+ layout="topleft"
+ top="13"
+ height="20"
+ left="2"
+ width="306"
+ halign="center"
+ font="SansSerifMedium"
+ font_shadow="hard"
+ valign="top">
+ Drop folders here to create new listings
+ </text>
+ </panel>
+</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_marketplace_listings_inventory.xml b/indra/newview/skins/default/xui/en/panel_marketplace_listings_inventory.xml
new file mode 100755
index 0000000000..8d5fa265e2
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_marketplace_listings_inventory.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<inventory_panel
+ label="ALL"
+ name="All Items"
+ help_topic="marketplace_tab"
+ layout="topleft"
+ follows="all"
+ width="308"
+ height="370"
+ top="16"
+ left="0"
+ start_folder.name="Marketplace listings"
+ show_empty_message="true"
+ show_root_folder="false"
+ use_marketplace_folders="true"
+ start_folder.type="merchant"
+ tool_tip="Drag and drop items here to list them"
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ border="false"
+ bevel_style="none"
+ show_item_link_overlays="true">
+ <item allow_wear="false"/>
+</inventory_panel>
diff --git a/indra/newview/skins/default/xui/en/panel_marketplace_listings_listed.xml b/indra/newview/skins/default/xui/en/panel_marketplace_listings_listed.xml
new file mode 100755
index 0000000000..44f507ad84
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_marketplace_listings_listed.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<inventory_panel
+ label="LISTED"
+ name="Active Items"
+ help_topic="marketplace_tab"
+ layout="topleft"
+ follows="all"
+ width="308"
+ height="370"
+ left_delta="0"
+ start_folder.name="Marketplace listings"
+ show_empty_message="true"
+ show_root_folder="false"
+ use_marketplace_folders="true"
+ allow_drop_on_root="false"
+ start_folder.type="merchant"
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ border="false"
+ bevel_style="none"
+ show_item_link_overlays="true">
+ <item allow_wear="false"/>
+</inventory_panel>
diff --git a/indra/newview/skins/default/xui/en/panel_marketplace_listings_unassociated.xml b/indra/newview/skins/default/xui/en/panel_marketplace_listings_unassociated.xml
new file mode 100755
index 0000000000..871e8773c4
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_marketplace_listings_unassociated.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<inventory_panel
+ label="UNASSOCIATED"
+ name="Unassociated Items"
+ help_topic="marketplace_tab"
+ layout="topleft"
+ follows="all"
+ width="308"
+ height="370"
+ left_delta="0"
+ start_folder.name="Marketplace listings"
+ show_empty_message="true"
+ show_root_folder="false"
+ use_marketplace_folders="true"
+ start_folder.type="merchant"
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ border="false"
+ bevel_style="none"
+ show_item_link_overlays="true">
+ <item allow_wear="false"/>
+</inventory_panel>
diff --git a/indra/newview/skins/default/xui/en/panel_marketplace_listings_unlisted.xml b/indra/newview/skins/default/xui/en/panel_marketplace_listings_unlisted.xml
new file mode 100755
index 0000000000..98bef04aa7
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_marketplace_listings_unlisted.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<inventory_panel
+ label="UNLISTED"
+ name="Inactive Items"
+ help_topic="marketplace_tab"
+ layout="topleft"
+ follows="all"
+ width="308"
+ height="370"
+ left_delta="0"
+ start_folder.name="Marketplace listings"
+ show_empty_message="true"
+ show_root_folder="false"
+ use_marketplace_folders="true"
+ allow_drop_on_root="false"
+ start_folder.type="merchant"
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ border="false"
+ bevel_style="none"
+ show_item_link_overlays="true">
+ <item allow_wear="false"/>
+</inventory_panel>
diff --git a/indra/newview/skins/default/xui/en/panel_notification_list_item.xml b/indra/newview/skins/default/xui/en/panel_notification_list_item.xml
new file mode 100644
index 0000000000..a909028f9f
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_notification_list_item.xml
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- All our XML is utf-8 encoded. -->
+<panel
+ translate="false"
+ name="main_panel"
+ title="panel_notification_list_item"
+ visible="true"
+ top="0"
+ left="0"
+ width="331"
+ height="202"
+ can_resize="true"
+ layout="topleft"
+ follows="left|top|right|bottom" >
+ <!-- background_opaque="false" -->
+ <!-- background_visible="true"> -->
+ <!-- bg_alpha_color="PanelNotificationListItem"> -->
+ <panel.string
+ name="sender_resident_text">
+ Sender: "[SENDER_RESIDENT]"
+ </panel.string>
+ <panel.string
+ name="group_name_text">
+ Group: "[GROUP_NAME]"
+ </panel.string>
+ <panel.string
+ name="group_fee_text">
+ Fee: [GROUP_FEE]
+ </panel.string>
+ <panel.string
+ name="item_condensed_height">
+ 50
+ </panel.string>
+ <panel.string
+ name="item_expanded_height">
+ 87
+ </panel.string>
+ <panel.string
+ name="expanded_height_resize_for_attachment">
+ 27
+ </panel.string>
+
+ <panel top="0" left="0" width="331" height="196" bevel_style="none" layout="topleft" follows="left|top|right|bottom" name="panel_total_view">
+ <layout_stack top="0" left="0" width="331" height="196" orientation="vertical" follows="left|top|right|bottom" name="item_vertical_stack">
+ <layout_panel top="0" left="0" height="30" follows="left|top|right|bottom" layout="topleft" name="layout_panel_condensed_view" visible="false" background_opaque="false" background_visible="true" bg_alpha_color="SysWellItemUnselected">
+ <panel border="true" top="0" left="5" height="30" bevel_style="none" layout="topleft" follows="left|top|right|bottom" name="panel_condensed_view">
+ <layout_stack top="0" left="0" width="325" height="50" orientation="horizontal" follows="left|top|right|bottom" name="horizontal_stack">
+ <layout_panel width="30" height="39" orientation="horizontal" follows="left|top|right|bottom" name="layout_panel_right">
+ <group_icon left="5" top="6" width="25" height="25" mouse_opaque="true" name="group_icon" tool_tip="Group" default_icon_name="Generic_Group" visible="true"/>
+ <avatar_icon left="5" top="6" width="25" height="25" mouse_opaque="true" name="avatar_icon" tool_tip="Avatar" default_icon_name="Generic_Person" visible="false"/>
+ <icon left="5" top="6" width="25" height="25" mouse_opaque="true" name="system_notification_icon" tool_tip="Icon" image_name="System_Notification" visible="false"/>
+ </layout_panel>
+ <layout_panel width="260" height="50" orientation="horizontal" name="layout_panel_middle">
+ <panel border="false" top="0" width="260" height="38" bevel_style="none" follows="left|top|right" layout="topleft" name="main_info_panel">
+ <panel border="false" top="0" left="0" width="260" height="19" bevel_style="none" follows="left|top|right|bottom" layout="topleft" name="notification_title_panel">
+ <text allow_scroll="false" font="SansSerifSmall" top="6" left="0" width="260" height="12" layout="topleft" follows="right|left" text_color="White"
+ use_ellipses="true" word_wrap="true" mouse_opaque="false" name="notification_title" >
+ Group Name:Notice Title N o t i c e T i t l e N o t i c e T i t l e N o t i c e T i t l e N oticeTitle
+ </text>
+ <icon top="1" left="242" width="21" height="21" image_name="Icon_Attachment_Small" follows="right" mouse_opaque="true" name="attachment_icon" tool_tip="Attachment" visible="false"/>
+ </panel>
+ <panel border="false" top="23" left="0" width="260" height="15" bevel_style="none" follows="left|top|right|bottom" layout="topleft" name="sender_time_panel">
+ <text allow_scroll="false" font="SansSerifSmall" top="0" left="0" width="170" height="13" layout="topleft" follows="right|left"
+ use_ellipses="true" word_wrap="false" mouse_opaque="false" name="sender_or_fee_box" visible="false">
+ Sender: "Resident R e s i d e n t R e s i d e n t"
+ </text>
+ <text allow_scroll="false" font="SansSerifSmall" top="0" right="-5" width="95" height="13" follows="right" halign="right" layout="topleft" left_pad="5"
+ name="notification_time" value="2014/12/24 23:30" />
+ </panel>
+ </panel>
+ </layout_panel>
+ <layout_panel width="18" height="48" orientation="horizontal" follows="right|top|bottom" name="layout_panel_right">
+ <panel top="0" left="0" width="17" height="39" follows="left|top|right|bottom" layout="topleft" name="close_expand_panel">
+ <button top="0" left="0" width="17" height="17" layout="topleft" follows="top" name="close_btn" mouse_opaque="true"
+ tab_stop="false" image_unselected="Icon_Close_Foreground" image_selected="Icon_Close_Press" />
+ <button bottom="-16" right="15" width="17" height="17" layout="topleft" follows="bottom" name="expand_btn" mouse_opaque="true"
+ tab_stop="false" image_unselected="Notification_Expand" image_selected="Notification_Expand" />
+ </panel>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </layout_panel>
+ <layout_panel top="0" left="0" height="196" follows="left|top|right|bottom" layout="topleft" name="layout_panel_expanded_view" visible="true" background_opaque="false" background_visible="true" bg_alpha_color="SysWellItemUnselected">
+ <panel border="true" top="0" left="5" height="196" bevel_style="none" follows="left|top|right|bottom" layout="topleft" name="panel_expanded_view">
+ <layout_stack top="0" left="0" width="325" height="196" orientation="horizontal" follows="left|top|right|bottom" name="horizontal_stack">
+ <layout_panel width="30" height="170" orientation="horizontal" follows="left|top|bottom" name="layout_panel_right_exp">
+ <group_icon left="5" top="6" width="25" height="25" mouse_opaque="true" name="group_icon_exp" tool_tip="Group" default_icon_name="Generic_Group" visible="true"/>
+ <avatar_icon left="5" top="6" width="25" height="25" mouse_opaque="true" name="avatar_icon_exp" tool_tip="Avatar" default_icon_name="Generic_Person" visible="false"/>
+ <icon left="5" top="6" width="25" height="25" mouse_opaque="true" name="system_notification_icon_exp" tool_tip="Icon" image_name="System_Notification" visible="false"/>
+ <icon left="12" top="144" width="20" height="20" name="attachment_icon_exp" tool_tip="Attachment" image_name="Icon_Attachment_Large" follows="left" mouse_opaque="true" visible="false"/>
+ </layout_panel>
+ <layout_panel width="230" height="196" orientation="horizontal" follows="left|top|right|bottom" name="layout_panel_middle_exp">
+ <panel border="false" top="0" width="230" height="196" bevel_style="none" follows="left|top|right|bottom" layout="topleft" name="main_info_panel_expanded">
+ <panel border="false" top="0" left="0" width="230" height="30" bevel_style="none" follows="left|top|right" layout="topleft" name="notification_title_panel_exp" >
+ <text allow_scroll="false" font="SansSerif" top="6" left="0" width="233" height="10" layout="topleft" follows="right|left" text_color="White"
+ use_ellipses="true" word_wrap="false" mouse_opaque="false" name="notification_title_exp">
+ Notice Title Notice Title N o t i c e T i t l e N o t i c e T i t l e
+ </text>
+ <text allow_scroll="false" font="SansSerif" left="0" width="233" height="10" layout="topleft" follows="right|left" text_color="White"
+ use_ellipses="true" word_wrap="false" mouse_opaque="false" name="group_name_exp" parse_urls="false" visible="false">
+ Group Name Group Name Group Na m e e
+ </text>
+ </panel>
+ <panel border="false" left="0" width="230" height="15" bevel_style="none" follows="left|top|right" layout="topleft" name="sender_time_panel_exp">
+ <text allow_scroll="false" font="SansSerifSmall" top="0" left="0" width="145" height="13" layout="topleft" follows="right|left"
+ use_ellipses="true" word_wrap="false" mouse_opaque="false" name="sender_or_fee_box_exp" visible="false">
+ Sender: "Resident R e s i d e n t R e s i d e n t"
+ </text>
+ <text allow_scroll="false" font="SansSerifSmall" top="0" right="-1" width="95" height="13" follows="right" halign="right" layout="topleft" left_pad="5"
+ name="notification_time_exp" value="2014/12/24 23:30" />
+ </panel>
+ <panel border="false" left="0" height="115" width="230" bevel_style="none" follows="all" layout="topleft" name="notification_text_panel_exp" visible="true">
+ <chat_editor is_expandable="true" top="0" left="0" width="230" height="110" layout="topleft" follows="left|right"
+ word_wrap="true" max_length="65536" name="notification_text_exp" parse_urls="true">
+ Notice text goes here b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla. bla bla bla bla bla bla bla bla bla bla bla bla bla .
+ </chat_editor>
+ </panel>
+ <panel border="false" left="1" bottom="-5" width="230" height="22" bevel_style="none" follows="left|right|bottom" layout="topleft" name="attachment_panel" visible="false">
+ <text allow_scroll="false" font="SansSerifSmall" top="4" left="5" width="220" height="12" layout="topleft" follows="left|top|right|bottom"
+ use_ellipses="true" word_wrap="true" max_length="96" name="attachment_text">
+ Attachment goes here b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla. bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla .
+ </text>
+ </panel>
+ <panel border="false" left="1" bottom="-5" height="55" bevel_style="none" follows="left|right|bottom" layout="topleft" name="button_panel" visible="false">
+ <button top="2" left="0" width="65" height="23" layout="topleft" follows="left|top|bottom" name="join_btn" mouse_opaque="true" tab_stop="false" label = "Join"/>
+ <button top="2" left_pad="12" width="65" height="23" layout="topleft" follows="left|top|bottom" name="decline_btn" mouse_opaque="true" tab_stop="false" label = "Decline"/>
+ <button top="2" left_pad="12" width="65" height="23" layout="topleft" follows="left|top|bottom" name="info_btn" mouse_opaque="true" tab_stop="false" label = "Info"/>
+ </panel>
+ </panel>
+ </layout_panel>
+ <layout_panel width="18" orientation="horizontal" follows="right|top|bottom" name="layout_panel_left_exp">
+ <panel top="0" left="0" width="17" follows="left|top|right|bottom" layout="topleft" name="close_expand_panel_exp">
+ <button top="0" left="2" width="17" height="17" layout="topleft" follows="top" name="close_expanded_btn" mouse_opaque="true"
+ tab_stop="false" image_unselected="Icon_Close_Foreground" image_selected="Icon_Close_Press" />
+ <button bottom="5" left="0" width="17" height="17" layout="topleft" follows="bottom" name="condense_btn" mouse_opaque="true"
+ tab_stop="false" image_unselected="Notification_Condense" image_selected="Notification_Condense" />
+ </panel>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
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 c80e5b168a..b2d8bb874b 100755
--- a/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml
@@ -3,7 +3,6 @@
name="inventory_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"
@@ -28,5 +27,5 @@
text_pad_right="4"
arrow_size="12"
max_folder_item_overlap="2"/>
- <item allow_open="false"/>
+ <item allow_wear="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 2d4665c128..4fb8b9a67f 100755
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -506,7 +506,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
left="3"
use_ellipses="true"
name="groupcount">
- You belong to [COUNT] groups, and can join [REMAINING] more.
+ You belong to [COUNT] groups, and can join [REMAINING] more. [secondlife:/// Want more?]
</text>
<group_list
allow_select="true"
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 2e778014c5..3e96160834 100755
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -216,7 +216,7 @@
control_name="QAMode"
follows="top|left"
height="15"
- label="Show Developer Menu"
+ label="Show Develop Menu"
layout="topleft"
left="30"
name="show_develop_menu_check"
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 f6665a1d5d..9da044ab64 100755
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -39,7 +39,12 @@
enabled="true"
label="English"
name="English"
- value="en" />
+ value="en" />
+ <combo_box.item
+ enabled="true"
+ label="Dansk (Danish) - Beta"
+ name="Danish"
+ value="da" />
<combo_box.item
enabled="true"
label="Deutsch (German) - Beta"
@@ -59,7 +64,12 @@
enabled="true"
label="Italiano (Italian) - Beta"
name="Italian"
- value="it" />
+ value="it" />
+ <combo_box.item
+ enabled="true"
+ label="Polski (Polish) - Beta"
+ name="Polish"
+ value="pl" />
<combo_box.item
enabled="true"
label="Português (Portuguese) - Beta"
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 3344b97794..6cf9045f2a 100755
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -9,905 +9,325 @@
name="Display panel"
top="1"
width="517">
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left="30"
- name="QualitySpeed"
- top="10"
- width="400">
- Quality and speed:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- halign="right"
- height="12"
- layout="topleft"
- left="35"
- name="FasterText"
- top_pad="4"
- width="80">
- Faster
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left_delta="360"
- name="BetterText"
- top_delta="0"
- width="100">
- Better
- </text>
- <icon
- color="DkGray"
- height="14"
- image_name="Rounded_Square"
- layout="topleft"
- left="128"
- name="LowGraphicsDivet"
- top_delta="-2"
- width="2" />
+
+ <text
+ follows="top|left|right"
+ height="16"
+ layout="topleft"
+ left="5"
+ top="5"
+ width="100">
+ Preset in use:
+ </text>
+
+ <text
+ follows="top|left|right"
+ height="16"
+ layout="topleft"
+ left_delta="110"
+ name="preset_text"
+ top="5"
+ width="120">
+ (None)
+ </text>
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ left="10"
+ name="QualitySpeed"
+ top_delta="35"
+ width="400">
+ Quality &amp; speed:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ halign="center"
+ height="12"
+ layout="topleft"
+ left="118"
+ name="ShadersPrefText"
+ top_delta="0"
+ width="80">
+ Low
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ halign="center"
+ height="12"
+ layout="topleft"
+ left_delta="87"
+ name="ShadersPrefText2"
+ top_delta="0"
+ width="80">
+ Mid
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ halign="center"
+ height="12"
+ layout="topleft"
+ left_delta="87"
+ name="ShadersPrefText3"
+ top_delta="0"
+ width="80">
+ High
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ halign="center"
+ height="12"
+ layout="topleft"
+ left_delta="85"
+ name="ShadersPrefText4"
+ top_delta="0"
+ width="80">
+ Ultra
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ halign="right"
+ height="12"
+ layout="topleft"
+ left="65"
+ name="FasterText"
+ top_pad="4"
+ width="80">
+ Faster
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ left_delta="360"
+ name="BetterText"
+ top_delta="0"
+ width="100">
+ Better
+ </text>
+ <icon
+ color="DkGray"
+ height="14"
+ image_name="Rounded_Square"
+ layout="topleft"
+ left="158"
+ name="LowGraphicsDivet"
+ top_delta="-2"
+ width="2" />
+ <icon
+ color="DkGray"
+ height="14"
+ image_name="Rounded_Square"
+ layout="topleft"
+ left_pad="41"
+ name="LowMidGraphicsDivet"
+ width="2" />
+ <icon
+ color="DkGray"
+ height="14"
+ image_name="Rounded_Square"
+ layout="topleft"
+ left_pad="41"
+ name="MidGraphicsDivet"
+ top_delta="0"
+ width="2" />
<icon
- color="DkGray"
- height="14"
- image_name="Rounded_Square"
- layout="topleft"
- left_pad="41"
- name="LowMidGraphicsDivet"
- width="2" />
- <icon
- color="DkGray"
- height="14"
- image_name="Rounded_Square"
- layout="topleft"
- left_pad="41"
- name="MidGraphicsDivet"
- top_delta="0"
- width="2" />
+ color="DkGray"
+ height="14"
+ image_name="Rounded_Square"
+ layout="topleft"
+ left_pad="41"
+ name="MidHighGraphicsDivet"
+ top_delta="0"
+ width="2" />
<icon
- color="DkGray"
- height="14"
- image_name="Rounded_Square"
- layout="topleft"
- left_pad="41"
- name="MidHighGraphicsDivet"
- top_delta="0"
- width="2" />
- <icon
- color="DkGray"
- height="14"
- image_name="Rounded_Square"
- layout="topleft"
- left_pad="41"
- name="HighGraphicsDivet"
- top_delta="0"
- width="2" />
+ color="DkGray"
+ height="14"
+ image_name="Rounded_Square"
+ layout="topleft"
+ left_pad="41"
+ name="HighGraphicsDivet"
+ top_delta="0"
+ width="2" />
<icon
- color="DkGray"
- height="14"
- image_name="Rounded_Square"
- layout="topleft"
- left_pad="41"
- name="HighUltraGraphicsDivet"
- top_delta="0"
- width="2" />
- <icon
- color="DkGray"
- height="14"
- image_name="Rounded_Square"
- layout="topleft"
- left_pad="41"
- name="UltraGraphicsDivet"
- top_delta="0"
- width="2" />
- <slider
- control_name="RenderQualityPerformance"
- decimal_digits="0"
- follows="left|top"
- height="16"
- increment="1"
- initial_value="0"
- layout="topleft"
- left="120"
- max_val="6"
- name="QualityPerformanceSelection"
- show_text="false"
- top_delta="-2"
- width="275">
- <slider.commit_callback
- function="Pref.QualityPerformance"/>
- </slider>
- <text
- type="string"
- length="1"
- follows="left|top"
- halign="center"
- height="12"
- layout="topleft"
- left="88"
- name="ShadersPrefText"
- top_delta="20"
- width="80">
- Low
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- halign="center"
- height="12"
- layout="topleft"
- left_delta="87"
- name="ShadersPrefText2"
- top_delta="0"
- width="80">
- Mid
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- halign="center"
- height="12"
- layout="topleft"
- left_delta="87"
- name="ShadersPrefText3"
- top_delta="0"
- width="80">
- High
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- halign="center"
- height="12"
- layout="topleft"
- left_delta="85"
- name="ShadersPrefText4"
- top_delta="0"
- width="80">
- Ultra
- </text>
+ color="DkGray"
+ height="14"
+ image_name="Rounded_Square"
+ layout="topleft"
+ left_pad="41"
+ name="HighUltraGraphicsDivet"
+ top_delta="0"
+ width="2" />
+ <icon
+ color="DkGray"
+ height="14"
+ image_name="Rounded_Square"
+ layout="topleft"
+ left_pad="41"
+ name="UltraGraphicsDivet"
+ top_delta="0"
+ width="2" />
<slider
- control_name="RenderAvatarLODFactor"
- invisiblity_control="ShowAdvancedGraphicsSettings"
- follows="left|top"
- height="16"
- increment="0.125"
- initial_value="160"
- label="Avatar detail:"
- label_width="90"
- layout="topleft"
- left="30"
- name="AvatarMeshDetail2"
- show_text="false"
- top="72"
- width="300">
+ control_name="RenderQualityPerformance"
+ decimal_digits="0"
+ follows="left|top"
+ height="16"
+ increment="1"
+ initial_value="0"
+ layout="topleft"
+ left="150"
+ max_val="6"
+ name="QualityPerformanceSelection"
+ show_text="false"
+ top_delta="-2"
+ width="275">
<slider.commit_callback
- function="Pref.UpdateSliderText"
- parameter="AvatarMeshDetailText2" />
+ function="Pref.QualityPerformance"/>
</slider>
- <text
- type="string"
- invisiblity_control="ShowAdvancedGraphicsSettings"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- name="AvatarMeshDetailText2"
- top_delta="0"
- left_delta="304"
- width="128">
- Low
- </text>
+
+<!-- This block shows Basic Settings -->
+
<slider
- control_name="RenderFarClip"
- invisiblity_control="ShowAdvancedGraphicsSettings"
- decimal_digits="0"
- follows="left|top"
- height="16"
- increment="8"
- initial_value="160"
- label="Draw distance:"
- label_width="90"
- layout="topleft"
- left="30"
- max_val="512"
- min_val="64"
- name="DrawDistance"
- top="110"
- width="330" />
+ control_name="RenderFarClip"
+ decimal_digits="0"
+ follows="left|top"
+ height="16"
+ increment="8"
+ initial_value="160"
+ label="Draw distance:"
+ label_width="90"
+ layout="topleft"
+ left="30"
+ min_val="64"
+ max_val="512"
+ name="DrawDistance"
+ top_delta="40"
+ width="330" />
<text
- type="string"
- invisiblity_control="ShowAdvancedGraphicsSettings"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left_delta="330"
- name="DrawDistanceMeterText2"
- top_delta="0"
- width="128">
- m
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ left_delta="330"
+ name="DrawDistanceMeterText2"
+ top_delta="0"
+ width="128">
+ m
</text>
+
<check_box
- control_name="RenderDeferred"
- invisiblity_control="ShowAdvancedGraphicsSettings"
- height="16"
- initial_value="true"
- label="Advanced Lighting Model"
- layout="topleft"
- left="30"
- name="UseLightShaders2"
- top="148"
- width="256">
+ control_name="WindLightUseAtmosShaders"
+ height="16"
+ initial_value="true"
+ label="Atmospheric shaders"
+ layout="topleft"
+ left="30"
+ name="WindLightUseAtmosShaders"
+ top_delta="20"
+ width="280">
<check_box.commit_callback
function="Pref.VertexShaderEnable" />
</check_box>
- <panel
- visiblity_control="ShowAdvancedGraphicsSettings"
- border="false"
- follows="top|left"
- height="300"
- label="CustomGraphics"
- layout="topleft"
- left="5"
- name="CustomGraphics Panel"
- top="76"
- width="485">
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left_delta="5"
- name="ShadersText"
- top="3"
- width="128">
- Shaders:
- </text>
- <check_box
- control_name="RenderTransparentWater"
- height="16"
- initial_value="true"
- label="Transparent Water"
- layout="topleft"
- left_delta="0"
- name="TransparentWater"
- top_pad="7"
- width="256" />
- <check_box
- control_name="RenderObjectBump"
- height="16"
- initial_value="true"
- label="Bump mapping and shiny"
- layout="topleft"
- left_delta="0"
- name="BumpShiny"
- top_pad="1"
- width="256">
- <check_box.commit_callback
- function="Pref.VertexShaderEnable" />
- </check_box>
- <check_box
- control_name="RenderLocalLights"
- height="16"
- initial_value="true"
- label="Local Lights"
- layout="topleft"
- left_delta="0"
- name="LocalLights"
- top_pad="1"
- width="256" />
- <check_box
- control_name="VertexShaderEnable"
- height="16"
- initial_value="true"
- label="Basic shaders"
- layout="topleft"
- left_delta="0"
- name="BasicShaders"
- tool_tip="Disabling this option may prevent some graphics card drivers from crashing"
- top_pad="1"
- width="315">
- <check_box.commit_callback
- function="Pref.VertexShaderEnable" />
- </check_box>
- <check_box
- control_name="WindLightUseAtmosShaders"
- height="16"
- initial_value="true"
- label="Atmospheric shaders"
- layout="topleft"
- left_delta="0"
- name="WindLightUseAtmosShaders"
- top_pad="1"
- width="256">
- <check_box.commit_callback
- function="Pref.VertexShaderEnable" />
- </check_box>
- <check_box
- control_name="RenderDeferred"
- height="16"
- initial_value="true"
- label="Advanced Lighting Model"
- layout="topleft"
- left_delta="0"
- name="UseLightShaders"
- top_pad="1"
- width="256">
- <check_box.commit_callback
- function="Pref.VertexShaderEnable" />
- </check_box>
- <check_box
- control_name="RenderDeferredSSAO"
- height="16"
- initial_value="true"
- label="Ambient Occlusion"
- layout="topleft"
- left_delta="0"
- name="UseSSAO"
- top_pad="1"
- width="256">
- <check_box.commit_callback
- function="Pref.VertexShaderEnable" />
- </check_box>
- <check_box
- control_name="RenderDepthOfField"
- height="16"
- initial_value="true"
- label="Depth of Field"
- layout="topleft"
- left_delta="0"
- name="UseDoF"
- top_pad="1"
- width="256">
- <check_box.commit_callback
- function="Pref.VertexShaderEnable" />
- </check_box>
- <text
- type="string"
- length="1"
- top_pad="8"
- follows="top|left"
- height="23"
- width="110"
- word_wrap="true"
- layout="topleft"
- left="10"
- name="shadows_label">
- Shadows:
- </text>
- <combo_box
- control_name="RenderShadowDetail"
- height="23"
- layout="topleft"
- left="10"
- top_pad="0"
- name="ShadowDetail"
- width="150">
- <combo_box.item
- label="None"
- name="0"
- value="0"/>
- <combo_box.item
- label="Sun/Moon"
- name="1"
- value="1"/>
- <combo_box.item
- label="Sun/Moon + Projectors"
- name="2"
- value="2"/>
- </combo_box>
+ <check_box
+ control_name="RenderDeferred"
+ height="16"
+ initial_value="true"
+ label="Advanced Lighting Model"
+ layout="topleft"
+ left="50"
+ name="UseLightShaders"
+ top_delta="20"
+ width="256">
+ <check_box.commit_callback
+ function="Pref.VertexShaderEnable" />
+ </check_box>
+
+<!-- End of Basic Settings block -->
+
+ <button
+ follows="top|left"
+ height="23"
+ label="Save settings as a preset..."
+ layout="topleft"
+ left="10"
+ name="PrefSaveButton"
+ top="310"
+ width="200">
+ <button.commit_callback
+ function="Pref.PrefSave"
+ parameter="graphic" />
+ </button>
+
+ <button
+ follows="top|left"
+ height="23"
+ label="Load preset..."
+ layout="topleft"
+ left_pad="10"
+ name="PrefLoadButton"
+ top_delta="0"
+ width="115">
+ <button.commit_callback
+ function="Pref.PrefLoad"
+ parameter="graphic"/>
+ </button>
+
+ <button
+ follows="top|left"
+ height="23"
+ label="Delete preset..."
+ layout="topleft"
+ left_pad="10"
+ name="PrefDeleteButton"
+ top_delta="0"
+ width="115">
+ <button.commit_callback
+ function="Pref.PrefDelete"
+ parameter="graphic"/>
+ </button>
- <text
- type="string"
- length="1"
- top_pad="8"
- follows="top|left"
- height="12"
- width="110"
- word_wrap="true"
- layout="topleft"
- left="05"
- name="reflection_label">
- Water Reflections:
- </text>
- <combo_box
- control_name="RenderReflectionDetail"
- height="18"
- layout="topleft"
- left_delta="10"
- top_pad ="3"
- name="Reflections"
- width="150">
- <combo_box.item
- label="Minimal"
- name="0"
- value="0"/>
- <combo_box.item
- label="Terrain and trees"
- name="1"
- value="1"/>
- <combo_box.item
- label="All static objects"
- name="2"
- value="2"/>
- <combo_box.item
- label="All avatars and objects"
- name="3"
- value="3"/>
- <combo_box.item
- label="Everything"
- name="4"
- value="4"/>
- </combo_box>
-
- <slider
- control_name="RenderAvatarPhysicsLODFactor"
- follows="left|top"
- height="16"
- initial_value="100"
- increment=".05"
- label=" Avatar Physics:"
- label_width="85"
- layout="topleft"
- left_delta="-16"
- name="AvatarPhysicsDetail"
- show_text="false"
- top_pad="12"
- width="160">
- <slider.commit_callback
- function="Pref.UpdateSliderText"
- parameter="AvatarPhysicsDetailText" />
- </slider>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left_delta="165"
- name="AvatarPhysicsDetailText"
- top_pad="-16"
- width="128">
- Low
- </text>
+ <button
+ follows="top|left"
+ height="23"
+ label="Reset to recommended settings"
+ layout="topleft"
+ left="10"
+ name="Defaults"
+ top_delta="65"
+ width="210">
+ <button.commit_callback
+ function="Pref.HardwareDefaults" />
+ </button>
- <slider
- control_name="RenderFarClip"
- decimal_digits="0"
- follows="left|top"
- height="16"
- increment="8"
- initial_value="160"
- label="Draw distance:"
- label_width="185"
- layout="topleft"
- left="200"
- max_val="512"
- min_val="64"
- name="DrawDistance"
- top="3"
- width="296" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left_delta="291"
- name="DrawDistanceMeterText2"
- top_delta="0"
- width="128">
- m
- </text>
- <slider
- control_name="RenderMaxPartCount"
- decimal_digits="0"
- follows="left|top"
- height="16"
- increment="256"
- initial_value="4096"
- label="Max. particle count:"
- label_width="185"
- layout="topleft"
- left="200"
- max_val="8192"
- name="MaxParticleCount"
- top_pad="7"
- width="303" />
- <slider
- control_name="RenderAvatarMaxVisible"
- decimal_digits="0"
- follows="left|top"
- height="16"
- increment="1"
- initial_value="12"
- label="Max. # of non-impostor avatars:"
- label_width="185"
- layout="topleft"
- left_delta="0"
- max_val="65"
- min_val="1"
- name="MaxNumberAvatarDrawn"
- top_pad="4"
- width="290" />
- <slider
- control_name="RenderGlowResolutionPow"
- decimal_digits="0"
- follows="left|top"
- height="16"
- increment="1"
- initial_value="8"
- label="Post process quality:"
- label_width="185"
- layout="topleft"
- left="200"
- max_val="9"
- min_val="8"
- name="RenderPostProcess"
- show_text="false"
- top_pad="4"
- width="264">
- <slider.commit_callback
- function="Pref.UpdateSliderText"
- parameter="PostProcessText" />
- </slider>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left_delta="0"
- name="MeshDetailText"
- top_pad="5"
- width="128">
- Mesh detail:
- </text>
- <slider
- control_name="RenderVolumeLODFactor"
- follows="left|top"
- height="16"
- increment="0.125"
- initial_value="160"
- label=" Objects:"
- label_width="185"
- layout="topleft"
- left_delta="0"
- max_val="2"
- name="ObjectMeshDetail"
- show_text="false"
- top_pad="6"
- width="264">
- <slider.commit_callback
- function="Pref.UpdateSliderText"
- parameter="ObjectMeshDetailText" />
- </slider>
- <slider
- control_name="RenderFlexTimeFactor"
- follows="left|top"
- height="16"
- initial_value="160"
- label=" Flexiprims:"
- label_width="185"
- layout="topleft"
- left_delta="0"
- name="FlexibleMeshDetail"
- show_text="false"
- top_pad="4"
- width="264">
- <slider.commit_callback
- function="Pref.UpdateSliderText"
- parameter="FlexibleMeshDetailText" />
- </slider>
- <slider
- control_name="RenderTreeLODFactor"
- follows="left|top"
- height="16"
- increment="0.125"
- initial_value="160"
- label=" Trees:"
- label_width="185"
- layout="topleft"
- left_delta="0"
- name="TreeMeshDetail"
- show_text="false"
- top_pad="4"
- width="264">
- <slider.commit_callback
- function="Pref.UpdateSliderText"
- parameter="TreeMeshDetailText" />
- </slider>
- <slider
- control_name="RenderAvatarLODFactor"
- follows="left|top"
- height="16"
- increment="0.125"
- initial_value="160"
- label=" Avatars:"
- label_width="185"
- layout="topleft"
- left_delta="0"
- name="AvatarMeshDetail"
- show_text="false"
- top_pad="4"
- width="264">
- <slider.commit_callback
- function="Pref.UpdateSliderText"
- parameter="AvatarMeshDetailText" />
- </slider>
- <slider
- control_name="RenderTerrainLODFactor"
- follows="left|top"
- height="16"
- increment="0.125"
- initial_value="160"
- label=" Terrain:"
- label_width="185"
- layout="topleft"
- left_delta="0"
- max_val="2"
- min_val="1"
- name="TerrainMeshDetail"
- show_text="false"
- top_pad="4"
- width="264">
- <slider.commit_callback
- function="Pref.UpdateSliderText"
- parameter="TerrainMeshDetailText" />
- </slider>
- <slider
- control_name="WLSkyDetail"
- enabled_control="WindLightUseAtmosShaders"
- decimal_digits="0"
- follows="left|top"
- height="16"
- increment="8"
- initial_value="160"
- label=" Sky:"
- label_width="185"
- layout="topleft"
- left_delta="0"
- max_val="128"
- min_val="16"
- name="SkyMeshDetail"
- show_text="false"
- top_pad="4"
- width="264">
- <slider.commit_callback
- function="Pref.UpdateSliderText"
- parameter="SkyMeshDetailText" />
- </slider>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left="469"
- name="PostProcessText"
- top="60"
- width="128">
- Low
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left_delta="0"
- name="ObjectMeshDetailText"
- top_pad="26"
- width="128">
- Low
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left_delta="0"
- name="FlexibleMeshDetailText"
- top_pad="8"
- width="128">
- Low
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left_delta="0"
- name="TreeMeshDetailText"
- top_pad="8"
- width="128">
- Low
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left_delta="0"
- name="AvatarMeshDetailText"
- top_pad="8"
- width="128">
- Low
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left_delta="0"
- name="TerrainMeshDetailText"
- top_pad="8"
- width="128">
- Low
- </text>
- <text
- enabled_control="WindLightUseAtmosShaders"
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left_delta="0"
- name="SkyMeshDetailText"
- top_pad="8"
- width="128">
- Low
- </text>
+ <button
+ follows="top|left"
+ height="23"
+ label="Advanced Settings..."
+ layout="topleft"
+ left_pad="10"
+ name="AdvancedSettings"
+ top_delta="0"
+ width="200">
+ <button.commit_callback
+ function="Pref.Advanced"
+ parameter="advanced" />
+ </button>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left_delta="-260"
- name="AvatarRenderingText"
- top_pad="18"
- width="128">
- Avatar Rendering:
- </text>
- <check_box
- control_name="RenderUseImpostors"
- height="16"
- initial_value="true"
- label="Avatar impostors"
- layout="topleft"
- left_delta="0"
- name="AvatarImpostors"
- top_pad="7"
- width="256" />
- <check_box
- control_name="RenderAvatarVP"
- height="16"
- initial_value="true"
- label="Hardware skinning"
- layout="topleft"
- left_delta="0"
- name="AvatarVertexProgram"
- top_pad="1"
- width="256">
- <check_box.commit_callback
- function="Pref.VertexShaderEnable" />
- </check_box>
- <check_box
- control_name="RenderAvatarCloth"
- height="16"
- initial_value="true"
- label="Avatar cloth"
- layout="topleft"
- left_delta="0"
- name="AvatarCloth"
- top_pad="1"
- width="256" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left="407"
- left_pad="-30"
- name="TerrainDetailText"
- top="250"
- width="155">
- Terrain detail:
- </text>
- <radio_group
- control_name="RenderTerrainDetail"
- draw_border="false"
- height="38"
- layout="topleft"
- left_delta="5"
- name="TerrainDetailRadio"
- top_pad="5"
- width="70">
- <radio_item
- height="16"
- label="Low"
- layout="topleft"
- name="0"
- top="3"
- width="50" />
- <radio_item
- height="16"
- label="High"
- layout="topleft"
- name="2"
- top_delta="16"
- width="50" />
- </radio_group>
- </panel>
-
- <button
- follows="left|bottom"
- height="23"
- label="Apply"
- label_selected="Apply"
- layout="topleft"
- left="10"
- name="Apply"
- top="390"
- width="115">
- <button.commit_callback
- function="Pref.Apply" />
- </button>
- <button
- follows="left|bottom"
- height="23"
- label="Reset"
- layout="topleft"
- left_pad="3"
- name="Defaults"
- top="390"
- width="115">
- <button.commit_callback
- function="Pref.HardwareDefaults" />
- </button>
- <button
- control_name="ShowAdvancedGraphicsSettings"
- follows="right|bottom"
- height="23"
- is_toggle="true"
- label="Advanced"
- layout="topleft"
- left_pad="35"
- name="Advanced"
- top_delta="0"
- width="115" />
- <button
- follows="right|bottom"
- height="23"
- label="Hardware"
- label_selected="Hardware"
- layout="topleft"
- left_pad="3"
- name="GraphicsHardwareButton"
- top_delta="0"
- width="115">
- <button.commit_callback
- function="Pref.HardwareSettings" />
- </button>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
index 10f2a3a8b9..be88ef9b3d 100755
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -270,7 +270,7 @@
value="1" />
-->
<combo_box.item
- label="Download and install updates manually"
+ label="I will download and install updates manually"
name="Install_manual"
value="0" />
</combo_box>
diff --git a/indra/newview/skins/default/xui/en/panel_presets_pulldown.xml b/indra/newview/skins/default/xui/en/panel_presets_pulldown.xml
new file mode 100644
index 0000000000..b87dda2315
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_presets_pulldown.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_opaque="true"
+ background_visible="true"
+ bg_opaque_image="Volume_Background"
+ bg_alpha_image="Volume_Background"
+ border_visible="false"
+ border="false"
+ chrome="true"
+ follows="bottom"
+ height="155"
+ layout="topleft"
+ name="presets_pulldown"
+ width="225">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ top="4"
+ left_delta="5"
+ font.style="BOLD"
+ name="Graphic Presets"
+ width="120">
+ Graphic Presets
+ </text>
+ <scroll_list
+ follows="left|top"
+ layout="topleft"
+ column_padding="0"
+ height="100"
+ width="215"
+ draw_heading="false"
+ draw_stripes="false"
+ bg_stripe_color="0.25 0.25 0.25 0.25"
+ top_delta="15"
+ left_delta="0"
+ name="preset_list">
+ <scroll_list.columns
+ name="icon"
+ width="16" />
+ <scroll_list.columns
+ relative_width="1"
+ name="preset_name" />
+ <scroll_list.commit_callback
+ function="Presets.RowClick" />
+ </scroll_list>
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="0"
+ layout="topleft"
+ left="5"
+ name="horiz_separator"
+ top_delta="105"
+ width="215" />
+ <button
+ name="open_prefs_btn"
+ label="Open Graphics Preferences"
+ tool_tip = "Bring up graphics prefs"
+ top_delta="5"
+ left="15"
+ height="20"
+ width="200">
+ <button.commit_callback
+ function="Presets.GoGraphicsPrefs" />
+ </button>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_experiences.xml b/indra/newview/skins/default/xui/en/panel_region_experiences.xml
new file mode 100644
index 0000000000..bced46f7dc
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_region_experiences.xml
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ border="true"
+ follows="all"
+ height="320"
+ help_topic="panel_region_experience_tab"
+ label="Experiences"
+ name="Experiences"
+ layout="topleft"
+ left="0"
+ top="320"
+ width="480">
+ <panel.string
+ name="trusted_estate_text">
+Any Experience may be Key.
+
+Key Experiences have permission to run on this estate.
+
+Additionally, if the estate does not allow public access, Residents participating in any Key Experience may enter the estate and can remain as long as they are in a Key Experience.
+ </panel.string>
+ <panel.string
+ name="allowed_estate_text">
+Only Experiences that are Land-Scope may be Allowed.
+
+Allowed Experiences have permission to run on this estate.
+ </panel.string>
+ <panel.string
+ name="blocked_estate_text">
+Only Grid-Scope Experiences may be Blocked.
+
+Blocked Experiences may not run on this estate.
+ </panel.string>
+ <panel.string
+ name="estate_caption">
+ Changes to settings on this tab will affect all regions in the estate.
+ </panel.string>
+ <panel.string
+ name="allowed_parcel_text">Only Experiences that are Land-Scope may be Allowed.
+
+Allowed Experiences have permission to run on this parcel if they are not Blocked by the estate.
+ </panel.string>
+ <panel.string
+ name="blocked_parcel_text">Any Resident Experience may be Blocked.
+
+Blocked Experiences may not run on this parcel.
+ </panel.string>
+ <panel.string
+ name="parcel_caption">
+ </panel.string>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="32"
+ layout="topleft"
+ left="10"
+ name="experiences_help_text"
+ top="14"
+ word_wrap="true"/>
+ <layout_stack
+ left="5"
+ layout="topleft"
+ follows="all"
+ right="-5"
+ height="260"
+ orientation="vertical">
+ <layout_panel
+ follows="all"
+ height="93"
+ min_height="50"
+ width="530"
+ visible="false"
+ name="trusted_layout_panel">
+ <panel follows="all"
+ width="330"
+ name="panel_trusted"
+ class="panel_experience_list_editor"
+ filename="panel_experience_list_editor.xml" />
+ <text
+ layout="topleft"
+ name="trusted_text_help"
+ length="1"
+ top="5"
+ left_pad="5"
+ width="200"
+ height="200"
+ follows="top|right"
+ word_wrap="true">
+ </text>
+ </layout_panel>
+ <layout_panel
+ height="93"
+ min_height="50"
+ follows="all"
+ width="530">
+ <panel
+ width="330"
+ name="panel_allowed"
+ class="panel_experience_list_editor"
+ filename="panel_experience_list_editor.xml"/>
+ <text
+ layout="topleft"
+ name="allowed_text_help"
+ length="1"
+ top="5"
+ left_pad="5"
+ width="200"
+ height="200"
+ follows="top|right"
+ word_wrap="true">
+ </text>
+ </layout_panel>
+ <layout_panel
+ height="93"
+ min_height="50"
+ follows="all"
+ width="530">
+ <panel
+ width="330"
+ name="panel_blocked"
+ class="panel_experience_list_editor"
+ filename="panel_experience_list_editor.xml"/>
+ <text
+ layout="topleft"
+ name="blocked_text_help"
+ length="1"
+ top="5"
+ left_pad="5"
+ width="200"
+ height="200"
+ follows="top|right"
+ word_wrap="true">
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
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 eb1b954e61..c56a5e17cd 100755
--- a/indra/newview/skins/default/xui/en/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml
@@ -1,75 +1,75 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- bevel_style="none"
- border_style="line"
- follows="left|top|right|bottom"
+ bevel_style="none"
+ border_style="line"
+ follows="left|top|right|bottom"
height="522"
- layout="topleft"
- left="0"
- name="script panel"
- width="497">
- <panel.string
- name="loading">
- Loading...
- </panel.string>
- <panel.string
- name="can_not_view">
- You can not view or edit this script, since it has been set as &quot;no copy&quot;. You need full permissions to view or edit a script inside an object.
- </panel.string>
- <panel.string
- name="public_objects_can_not_run">
- Public Objects cannot run scripts
- </panel.string>
- <panel.string
- name="script_running">
- Running
- </panel.string>
- <panel.string
- name="Title">
- Script: [NAME]
- </panel.string>
- <panel.string
- name="external_editor_not_set">
- Select an editor by setting the environment variable LL_SCRIPT_EDITOR or the ExternalEditor setting.
- </panel.string>
- <menu_bar
- bg_visible="false"
- follows="left|top"
- height="18"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- name="script_menu"
- width="476">
- <menu
- top="0"
- height="62"
- label="File"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- name="File"
- width="138">
- <menu_item_call
- label="Save"
- layout="topleft"
- name="Save" />
- <menu_item_separator
- layout="topleft" />
- <menu_item_call
- label="Revert All Changes"
- layout="topleft"
- name="Revert All Changes" />
- <menu_item_separator
- layout="topleft" />
- <menu_item_call
- label="Load from file..."
- layout="topleft"
- name="LoadFromFile" />
- <menu_item_call
- label="Save to file..."
- layout="topleft"
- name="SaveToFile" />
+ layout="topleft"
+ left="0"
+ name="script panel"
+ width="497">
+ <panel.string
+ name="loading">
+ Loading...
+ </panel.string>
+ <panel.string
+ name="can_not_view">
+ You can not view or edit this script, since it has been set as &quot;no copy&quot;. You need full permissions to view or edit a script inside an object.
+ </panel.string>
+ <panel.string
+ name="public_objects_can_not_run">
+ Public Objects cannot run scripts
+ </panel.string>
+ <panel.string
+ name="script_running">
+ Running
+ </panel.string>
+ <panel.string
+ name="Title">
+ Script: [NAME]
+ </panel.string>
+ <panel.string
+ name="external_editor_not_set">
+ Select an editor by setting the environment variable LL_SCRIPT_EDITOR or the ExternalEditor setting.
+ </panel.string>
+ <menu_bar
+ bg_visible="false"
+ follows="left|top"
+ height="18"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="script_menu"
+ width="476">
+ <menu
+ top="0"
+ height="62"
+ label="File"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="File"
+ width="138">
+ <menu_item_call
+ label="Save"
+ layout="topleft"
+ name="Save" />
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="Revert All Changes"
+ layout="topleft"
+ name="Revert All Changes" />
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="Load from file..."
+ layout="topleft"
+ name="LoadFromFile" />
+ <menu_item_call
+ label="Save to file..."
+ layout="topleft"
+ name="SaveToFile" />
<menu_item_separator
layout="topleft" />
<menu_item_call
@@ -80,95 +80,95 @@
function="Floater.Toggle"
parameter="script_colors"/>
</menu_item_call>
- </menu>
- <menu
- top="0"
- height="198"
- label="Edit"
- layout="topleft"
- mouse_opaque="false"
- name="Edit"
- width="139">
- <menu_item_call
- enabled="false"
- label="Undo"
- layout="topleft"
- name="Undo" />
- <menu_item_call
- enabled="false"
- label="Redo"
- layout="topleft"
- name="Redo" />
- <menu_item_separator
- layout="topleft" />
- <menu_item_call
- enabled="false"
- label="Cut"
- layout="topleft"
- name="Cut" />
- <menu_item_call
- enabled="false"
- label="Copy"
- layout="topleft"
- name="Copy" />
- <menu_item_call
- enabled="false"
- label="Paste"
- layout="topleft"
- name="Paste" />
- <menu_item_separator
- layout="topleft"
- name="separator2" />
- <menu_item_call
- label="Select All"
- layout="topleft"
- name="Select All" />
- <menu_item_call
- enabled="false"
- label="Deselect"
- layout="topleft"
- name="Deselect" />
- <menu_item_separator
- layout="topleft"
- name="separator3" />
- <menu_item_call
- label="Search / Replace..."
- layout="topleft"
- name="Search / Replace..." />
+ </menu>
+ <menu
+ top="0"
+ height="198"
+ label="Edit"
+ layout="topleft"
+ mouse_opaque="false"
+ name="Edit"
+ width="139">
+ <menu_item_call
+ enabled="false"
+ label="Undo"
+ layout="topleft"
+ name="Undo" />
+ <menu_item_call
+ enabled="false"
+ label="Redo"
+ layout="topleft"
+ name="Redo" />
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ enabled="false"
+ label="Cut"
+ layout="topleft"
+ name="Cut" />
+ <menu_item_call
+ enabled="false"
+ label="Copy"
+ layout="topleft"
+ name="Copy" />
+ <menu_item_call
+ enabled="false"
+ label="Paste"
+ layout="topleft"
+ name="Paste" />
+ <menu_item_separator
+ layout="topleft"
+ name="separator2" />
+ <menu_item_call
+ label="Select All"
+ layout="topleft"
+ name="Select All" />
+ <menu_item_call
+ enabled="false"
+ label="Deselect"
+ layout="topleft"
+ name="Deselect" />
+ <menu_item_separator
+ layout="topleft"
+ name="separator3" />
+ <menu_item_call
+ label="Search / Replace..."
+ layout="topleft"
+ name="Search / Replace..." />
<menu_item_call
label="Go to line..."
layout="topleft"
name="Go to line..." />
- </menu>
- <menu
- top="0"
- height="34"
- label="Help"
- layout="topleft"
- mouse_opaque="false"
- name="Help"
- width="112">
- <menu_item_call
- label="Help..."
- layout="topleft"
- name="Help..." />
- <menu_item_call
- label="Keyword Help..."
- layout="topleft"
- name="Keyword Help..." />
- </menu>
- </menu_bar>
+ </menu>
+ <menu
+ top="0"
+ height="34"
+ label="Help"
+ layout="topleft"
+ mouse_opaque="false"
+ name="Help"
+ width="112">
+ <menu_item_call
+ label="Help..."
+ layout="topleft"
+ name="Help..." />
+ <menu_item_call
+ label="Keyword Help..."
+ layout="topleft"
+ name="Keyword Help..." />
+ </menu>
+ </menu_bar>
<script_editor
- left="0"
- type="string"
- length="1"
- follows="left|top|right|bottom"
- font="Monospace"
+ left="0"
+ type="string"
+ length="1"
+ follows="left|top|right|bottom"
+ font="Monospace"
height="376"
- ignore_tab="false"
- layout="topleft"
+ ignore_tab="false"
+ layout="topleft"
max_length="262144"
- name="Script Editor"
+ name="Script Editor"
width="487"
text_color="ScriptText"
default_color="ScriptText"
@@ -177,51 +177,51 @@
text_readonly_color="ScriptText"
bg_readonly_color="ScriptBackground"
cursor_color="ScriptCursorColor"
- enable_tooltip_paste="true"
+ enable_tooltip_paste="true"
word_wrap="true"
show_context_menu="true">
- Loading...
+ Loading...
</script_editor>
- <scroll_list
+ <scroll_list
top_pad="10"
left="0"
- follows="left|right|bottom"
- height="60"
- layout="topleft"
- name="lsl errors"
+ follows="left|right|bottom"
+ height="60"
+ layout="topleft"
+ name="lsl errors"
width="487" />
- <text
- follows="left|bottom"
- height="12"
- layout="topleft"
+ <text
+ follows="left|bottom"
+ height="12"
+ layout="topleft"
left="0"
- name="line_col"
- width="128" />
- <combo_box
- follows="left|bottom"
- height="23"
- label="Insert..."
- layout="topleft"
- name="Insert..."
+ name="line_col"
+ width="128" />
+ <combo_box
+ follows="left|bottom"
+ height="23"
+ label="Insert..."
+ layout="topleft"
+ name="Insert..."
width="128" />
- <button
- follows="right|bottom"
- height="23"
- label="Save"
- label_selected="Save"
- layout="topleft"
- top_pad="-35"
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Save"
+ label_selected="Save"
+ layout="topleft"
+ top_pad="-35"
right="487"
- name="Save_btn"
- width="81" />
- <button
- enabled="false"
- follows="right|bottom"
- height="23"
- label="Edit..."
- layout="topleft"
- top_pad="-23"
+ name="Save_btn"
+ width="81" />
+ <button
+ enabled="false"
+ follows="right|bottom"
+ height="23"
+ label="Edit..."
+ layout="topleft"
+ top_pad="-23"
right="400"
- name="Edit_btn"
- width="81" />
+ name="Edit_btn"
+ width="81" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_script_experience.xml b/indra/newview/skins/default/xui/en/panel_script_experience.xml
new file mode 100644
index 0000000000..e798638751
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_script_experience.xml
@@ -0,0 +1,97 @@
+<panel
+ name="script_experience"
+ title="EXPERIENCE"
+ width="400"
+ follows="top|left|right"
+ top="0"
+ left="0"
+ layout="topleft">
+ <!-- <floater.string name="EXPERIENCE">EXPERIENCE!!!!</floater.string>
+
+ <floater.string name="Script:">Script:</floater.string>
+ <floater.string name="Associated with:">Associated with:</floater.string>
+ <floater.string name="You can contribute:">You can contribute:</floater.string>
+ <floater.string name="Associate with:">Associate with:</floater.string>
+ <floater.string name="Yes">Yes</floater.string>
+ <floater.string name="No">No</floater.string>
+ <floater.string name="(none)"></floater.string>
+ <floater.string name="Choose Experience...">Choose Experience...</floater.string>
+ <floater.string name="You are not a contributor to any experiences.">You are not a contributor to any experiences.</floater.string>
+ -->
+
+ <button name="Expand Experience" width="200"
+ height="35"
+ is_toggle="true"
+ tab_stop="false"
+ pad_left="35"
+ top="0"
+ left="3"
+ label="Experience"
+ halign="left"
+ handle_right_mouse="false"
+ follows="top|left|right"
+ image_unselected="MarketplaceBtn_Off"
+ image_selected="MarketplaceBtn_Selected">
+ </button>
+ <check_box
+ follows="top|right" height="25" label="Uses Experience" left="215" width="0" top="0" name="enable_xp"
+ />
+ <layout_stack
+ follows="top|left|right"
+
+ width="384"
+ height="140"
+ name="xp_details"
+ left="4"
+ top="45"
+ orientation="horizontal"
+ layout="topleft"
+ visible="false">
+ <layout_panel width="120"
+ height="140">
+ <text >
+ Script:
+ </text>
+ <text bottom_delta="25">
+ Associated with:
+ </text>
+ <text bottom_delta="25">
+ You can contribute:
+ </text>
+ <text bottom_delta="25">
+ Associate with:
+ </text>
+ </layout_panel>
+
+ <layout_panel width="250"
+ height="140">
+ <text >
+ EasySit Animator 1.2.4
+ </text>
+ <text bottom_delta="25"
+ text_color="HTMLLinkColor" font.style="UNDERLINE">
+ Kyle's Superhero RPG
+ </text>
+ <text bottom_delta="25">
+ Yes
+ </text>
+ <combo_box left="0" bottom_delta="33"
+ label="Choose Experience..."
+ name="Experiences..."
+ follows="top|left|right"
+ />
+ </layout_panel>
+ </layout_stack>
+ <text
+ follows="top|left|right"
+ width="400"
+ height="15"
+ bottom_delta="-12"
+ left="0"
+ halign="center"
+ name="No Experiences"
+ visible="false"
+ text_color="AlertCautionTextColor">
+ You are not a contributor to any experiences.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml
index ea579c6dae..d019a0a310 100755
--- a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml
@@ -60,6 +60,10 @@
name="Large(512x512)"
value="[i512,i512]" />
<combo_box.item
+ label="Current Window(512x512)"
+ name="CurrentWindow"
+ value="[i0,i0]" />
+ <combo_box.item
label="Custom"
name="Custom"
value="[i-1,i-1]" />
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml
index 975b08be05..975b08be05 100755..100644
--- a/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index dbf7bc031f..998f1ce599 100755
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -35,7 +35,7 @@
</panel.string>
<panel
height="18"
- left="-395"
+ left="-416"
width="185"
top="1"
follows="right|top"
@@ -105,6 +105,14 @@
width="145">
24:00 AM PST
</text>
+ <icon
+ follows="right|top"
+ height="16"
+ image_name="Presets_Icon"
+ left_pad="8"
+ top="2"
+ name="presets_icon"
+ width="18" />
<button
follows="right|top"
height="16"
diff --git a/indra/newview/skins/default/xui/en/role_actions.xml b/indra/newview/skins/default/xui/en/role_actions.xml
index 1044cbfd2e..c2e7c706d6 100755
--- a/indra/newview/skins/default/xui/en/role_actions.xml
+++ b/indra/newview/skins/default/xui/en/role_actions.xml
@@ -190,4 +190,16 @@
longdescription="Members in a Role with this Ability can control access and participation in group voice and text chat sessions."
name="moderate group chat" value="37" />
</action_set>
+ <action_set
+ description="These Abilities include power to modify experiences owned by this group."
+ name="experience_tools_experience">
+ <action description="Experience Admin"
+ longdescription="Members in a role with this ability can edit the meta-data for an experience."
+ name="experience admin"
+ value ="49" />
+ <action description="Experience Contributor"
+ longdescription="Members in a role with this ability can contribute scripts for an experience."
+ name="experience contributor"
+ value ="50" />
+ </action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index 9be01c5d4f..fd14b13ed6 100755
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -1,444 +1,476 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- follows="all"
- height="570"
- layout="topleft"
- name="item properties"
- help_topic="item_properties"
- title="Item Profile"
- width="333">
- <panel.string
- name="unknown">
- (unknown)
- </panel.string>
- <panel.string
- name="unknown_multiple">
- (unknown / multiple)
- </panel.string>
- <panel.string
- name="public">
- (public)
- </panel.string>
- <panel.string
- name="you_can">
- You can:
- </panel.string>
- <panel.string
- name="owner_can">
- Owner can:
- </panel.string>
- <panel.string
- name="acquiredDate">
- [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
- </panel.string>
- <panel.string
- name="origin_inventory">
- (Inventory)
- </panel.string>
- <panel.string
- name="origin_inworld">
- (Inworld)
- </panel.string>
- <icon
- follows="top|right"
- height="18"
- image_name="Lock"
- layout="topleft"
- right="-15"
- mouse_opaque="true"
- name="IconLocked"
- top="8"
- width="18" />
- <button
- follows="top|left"
- height="24"
- image_hover_unselected="BackButton_Over"
- image_pressed="BackButton_Press"
- image_unselected="BackButton_Off"
- layout="topleft"
- left="12"
- name="back_btn"
- tab_stop="false"
- top="2"
- width="30"
- use_draw_context_alpha="false" />
- <text
- follows="top|left|right"
- font="SansSerifHugeBold"
- height="26"
- layout="topleft"
- left_pad="3"
- name="title"
- text_color="LtGray"
- top="2"
- use_ellipses="true"
- value="Item Profile"
- width="275" />
- <text
- follows="top|left|right"
- height="13"
- layout="topleft"
- left="45"
- name="origin"
- text_color="LtGray_50"
- use_ellipses="true"
- value="(Inventory)"
- width="275" />
- <scroll_container
- color="DkGray2"
- follows="all"
- layout="topleft"
- left="9"
- name="item_profile_scroll"
- opaque="true"
- height="493"
- width="313"
- top="45">
- <panel
- follows="left|top|right"
- height="390"
- help_topic=""
- label=""
- layout="topleft"
- left="0"
- name="item_profile"
- top="0"
- width="295">
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="5"
- name="LabelItemNameTitle"
- top="10"
- width="78">
- Name:
- </text>
- <line_editor
- border_style="line"
- border_thickness="1"
- follows="left|top|right"
- height="20"
- layout="topleft"
- left_delta="78"
- max_length_bytes="63"
- name="LabelItemName"
- top_delta="0"
- width="210" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="5"
- name="LabelItemDescTitle"
- top_pad="10"
- width="78">
- Description:
- </text>
- <line_editor
- border_style="line"
- border_thickness="1"
- follows="left|top|right"
- height="23"
- layout="topleft"
- left_delta="78"
- max_length_bytes="127"
- name="LabelItemDesc"
- top_delta="-5"
- width="210" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="23"
- layout="topleft"
- left="5"
- name="LabelCreatorTitle"
- top_pad="10"
- width="78">
- Creator:
- </text>
- <avatar_icon
- follows="top|left"
- height="20"
- default_icon_name="Generic_Person"
- layout="topleft"
- left_pad="0"
- top_delta="-6"
- mouse_opaque="true"
- width="20" />
- <text
- type="string"
- follows="left|right|top"
- font="SansSerifSmall"
- height="15"
- layout="topleft"
- left_pad="5"
- name="LabelCreatorName"
- top_delta="6"
- use_ellipses="true"
- width="165">
- </text>
- <button
- follows="top|right"
- height="16"
+ follows="all"
+ height="570"
+ layout="topleft"
+ name="item properties"
+ help_topic="item_properties"
+ title="Item Profile"
+ width="333">
+ <panel.string
+ name="loading_experience">
+ (loading)
+ </panel.string>
+ <panel.string
+ name="unknown">
+ (unknown)
+ </panel.string>
+ <panel.string
+ name="unknown_multiple">
+ (unknown / multiple)
+ </panel.string>
+ <panel.string
+ name="public">
+ (public)
+ </panel.string>
+ <panel.string
+ name="you_can">
+ You can:
+ </panel.string>
+ <panel.string
+ name="owner_can">
+ Owner can:
+ </panel.string>
+ <panel.string
+ name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <panel.string
+ name="origin_inventory">
+ (Inventory)
+ </panel.string>
+ <panel.string
+ name="origin_inworld">
+ (Inworld)
+ </panel.string>
+ <icon
+ follows="top|right"
+ height="18"
+ image_name="Lock"
+ layout="topleft"
+ right="-15"
+ mouse_opaque="true"
+ name="IconLocked"
+ top="8"
+ width="18" />
+ <button
+ follows="top|left"
+ height="24"
+ image_hover_unselected="BackButton_Over"
+ image_pressed="BackButton_Press"
+ image_unselected="BackButton_Off"
+ layout="topleft"
+ left="12"
+ name="back_btn"
+ tab_stop="false"
+ top="2"
+ width="30"
+ use_draw_context_alpha="false" />
+ <text
+ follows="top|left|right"
+ font="SansSerifHugeBold"
+ height="26"
+ layout="topleft"
+ left_pad="3"
+ name="title"
+ text_color="LtGray"
+ top="2"
+ use_ellipses="true"
+ value="Item Profile"
+ width="275" />
+ <text
+ follows="top|left|right"
+ height="13"
+ layout="topleft"
+ left="45"
+ name="origin"
+ text_color="LtGray_50"
+ use_ellipses="true"
+ value="(Inventory)"
+ width="275" />
+ <scroll_container
+ color="DkGray2"
+ follows="all"
+ layout="topleft"
+ left="9"
+ name="item_profile_scroll"
+ opaque="true"
+ height="493"
+ width="313"
+ top="45">
+ <panel
+ follows="left|top|right"
+ height="390"
+ help_topic=""
+ label=""
+ layout="topleft"
+ left="0"
+ name="item_profile"
+ top="0"
+ width="295">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="5"
+ name="LabelItemNameTitle"
+ top="10"
+ width="78">
+ Name:
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|top|right"
+ height="20"
+ layout="topleft"
+ left_delta="78"
+ max_length_bytes="63"
+ name="LabelItemName"
+ top_delta="0"
+ width="210" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="5"
+ name="LabelItemDescTitle"
+ top_pad="10"
+ width="78">
+ Description:
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|top|right"
+ height="23"
+ layout="topleft"
+ left_delta="78"
+ max_length_bytes="127"
+ name="LabelItemDesc"
+ top_delta="-5"
+ width="210" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="LabelCreatorTitle"
+ top_pad="10"
+ width="78">
+ Creator:
+ </text>
+ <avatar_icon
+ follows="top|left"
+ height="20"
+ default_icon_name="Generic_Person"
+ layout="topleft"
+ left_pad="0"
+ top_delta="-6"
+ mouse_opaque="true"
+ width="20" />
+ <text
+ type="string"
+ follows="left|right|top"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="5"
+ name="LabelCreatorName"
+ top_delta="6"
+ use_ellipses="true"
+ width="165">
+ </text>
+ <button
+ follows="top|right"
+ height="16"
+ image_selected="Inspector_I"
+ image_unselected="Inspector_I"
+ layout="topleft"
+ right="-5"
+ name="BtnCreator"
+ top_delta="-6"
+ width="16" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="LabelOwnerTitle"
+ top_pad="10"
+ width="78">
+ Owner:
+ </text>
+ <avatar_icon
+ follows="top|left"
+ height="20"
+ default_icon_name="Generic_Person"
+ layout="topleft"
+ left_pad="0"
+ top_delta="-6"
+ mouse_opaque="true"
+ width="20" />
+ <text
+ type="string"
+ follows="left|right|top"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="5"
+ name="LabelOwnerName"
+ top_delta="6"
+ use_ellipses="true"
+ width="165">
+ </text>
+ <button
+ follows="top|right"
+ height="16"
image_selected="Inspector_I"
image_unselected="Inspector_I"
+ layout="topleft"
+ right="-5"
+ name="BtnOwner"
+ top_delta="-3"
+ width="16" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="LabelAcquiredTitle"
+ top_pad="10"
+ width="78">
+ Acquired:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="23"
+ layout="topleft"
+ left_delta="78"
+ name="LabelAcquiredDate"
+ top_delta="0"
+ width="210">
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="5"
+ name="LabelItemExperienceTitle"
+ top_pad="0"
+ width="78"
+ visible="true">
+ Experience:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="10"
+ layout="topleft"
+ left_delta="78"
+ name="LabelItemExperience"
+ top_delta="0"
+ width="210"
+ visible="true"
+ />
+ <panel
+ border="false"
+ follows="left|top|right"
+ layout="topleft"
+ mouse_opaque="false"
+ name="perms_inv"
+ left="0"
+ top_pad="25"
+ height="155"
+ width="313">
+ <text
+ type="string"
+ length="1"
+ left="10"
+ top_pad="13"
+ text_color="EmphasisColor"
+ height="15"
+ follows="left|top|right"
+ layout="topleft"
+ name="perm_modify"
+ width="200">
+ You can:
+ </text>
+ <check_box
+ height="18"
+ label="Modify"
+ layout="topleft"
+ left="20"
+ name="CheckOwnerModify"
+ top_pad="0"
+ width="90" />
+ <check_box
+ height="18"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="CheckOwnerCopy"
+ width="90" />
+ <check_box
+ height="18"
+ label="Transfer"
+ layout="topleft"
+ left_pad="0"
+ name="CheckOwnerTransfer"
+ width="106" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="AnyoneLabel"
+ top_pad="8"
+ width="100">
+ Anyone:
+ </text>
+ <check_box
+ height="18"
+ label="Copy"
layout="topleft"
- right="-5"
- name="BtnCreator"
- top_delta="-6"
- width="16" />
- <text
+ left_pad="0"
+ name="CheckEveryoneCopy"
+ top_delta="-2"
+ width="150" />
+ <text
type="string"
length="1"
follows="left|top"
- height="23"
+ height="16"
layout="topleft"
- left="5"
- name="LabelOwnerTitle"
- top_pad="10"
- width="78">
- Owner:
- </text>
- <avatar_icon
- follows="top|left"
- height="20"
- default_icon_name="Generic_Person"
- layout="topleft"
- left_pad="0"
- top_delta="-6"
- mouse_opaque="true"
- width="20" />
- <text
+ left="10"
+ name="GroupLabel"
+ top_pad="8"
+ width="100">
+ Group:
+ </text>
+ <check_box
+ height="18"
+ label="Share"
+ layout="topleft"
+ left_pad="0"
+ top_delta="-2"
+ name="CheckShareWithGroup"
+ tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
+ width="150" />
+ <text
type="string"
- follows="left|right|top"
- font="SansSerifSmall"
- height="15"
- layout="topleft"
- left_pad="5"
- name="LabelOwnerName"
- top_delta="6"
- use_ellipses="true"
- width="165">
- </text>
- <button
- follows="top|right"
- height="16"
- image_selected="Inspector_I"
- image_unselected="Inspector_I"
- layout="topleft"
- right="-5"
- name="BtnOwner"
- top_delta="-3"
- width="16" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="23"
- layout="topleft"
- left="5"
- name="LabelAcquiredTitle"
- top_pad="10"
- width="78">
- Acquired:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- height="23"
- layout="topleft"
- left_delta="78"
- name="LabelAcquiredDate"
- top_delta="0"
- width="210">
- </text>
- <panel
- border="false"
- follows="left|top|right"
- layout="topleft"
- mouse_opaque="false"
- name="perms_inv"
- left="0"
- top_pad="25"
- height="155"
- width="313">
- <text
- type="string"
- length="1"
- left="10"
- top_pad="13"
- text_color="EmphasisColor"
- height="15"
- follows="left|top|right"
- layout="topleft"
- name="perm_modify"
- width="200">
- You can:
- </text>
- <check_box
- height="18"
- label="Modify"
- layout="topleft"
- left="20"
- name="CheckOwnerModify"
- top_pad="0"
- width="90" />
- <check_box
- height="18"
- label="Copy"
- layout="topleft"
- left_pad="0"
- name="CheckOwnerCopy"
- width="90" />
- <check_box
- height="18"
- label="Transfer"
- layout="topleft"
- left_pad="0"
- name="CheckOwnerTransfer"
- width="106" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="AnyoneLabel"
- top_pad="8"
- width="100">
- Anyone:
- </text>
- <check_box
- height="18"
- label="Copy"
- layout="topleft"
- left_pad="0"
- name="CheckEveryoneCopy"
- top_delta="-2"
- width="150" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="GroupLabel"
- top_pad="8"
- width="100">
- Group:
- </text>
- <check_box
- height="18"
- label="Share"
- layout="topleft"
- left_pad="0"
- top_delta="-2"
- name="CheckShareWithGroup"
- tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
- width="150" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="NextOwnerLabel"
- top_pad="8"
- width="200"
- word_wrap="true">
- Next owner:
- </text>
- <check_box
- height="18"
- label="Modify"
- layout="topleft"
- left="20"
- top_pad="0"
- name="CheckNextOwnerModify"
- width="90" />
- <check_box
- height="18"
- label="Copy"
- layout="topleft"
- left_pad="0"
- name="CheckNextOwnerCopy"
- width="90" />
- <check_box
- height="18"
- label="Transfer"
- layout="topleft"
- left_pad="0"
- name="CheckNextOwnerTransfer"
- tool_tip="Next owner can give away or resell this object"
- width="106" />
- </panel>
+ 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="For Sale"
- layout="topleft"
- left="20"
- name="CheckPurchase"
- top_pad="20"
- width="100" />
- <combo_box
- height="23"
- left_pad="0"
- layout="topleft"
- follows="left|top"
- name="ComboBoxSaleType"
- 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"
- control_name="Edit Cost"
- name="Edit Cost"
- label="Price: L$"
- label_width="75"
- left="120"
- width="170"
- min_val="0"
- height="23"
- max_val="999999999"
- top_pad="10"/>
- </panel>
- </scroll_container>
- <panel
- height="30"
- layout="topleft"
- name="button_panel"
- left="5"
- top_pad="0"
- width="313">
- <button
- height="23"
- label="Cancel"
- layout="topleft"
- name="cancel_btn"
- right="-1"
- width="100" />
- </panel>
- </panel>
+ height="18"
+ label="Modify"
+ layout="topleft"
+ left="20"
+ top_pad="0"
+ name="CheckNextOwnerModify"
+ width="90" />
+ <check_box
+ height="18"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="CheckNextOwnerCopy"
+ width="90" />
+ <check_box
+ height="18"
+ label="Transfer"
+ layout="topleft"
+ left_pad="0"
+ name="CheckNextOwnerTransfer"
+ tool_tip="Next owner can give away or resell this object"
+ width="106" />
+ </panel>
+ <check_box
+ height="18"
+ label="For Sale"
+ layout="topleft"
+ left="20"
+ name="CheckPurchase"
+ top_pad="20"
+ width="100" />
+ <combo_box
+ height="23"
+ left_pad="0"
+ layout="topleft"
+ follows="left|top"
+ name="ComboBoxSaleType"
+ 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"
+ control_name="Edit Cost"
+ name="Edit Cost"
+ label="Price: L$"
+ label_width="75"
+ left="120"
+ width="170"
+ min_val="0"
+ height="23"
+ max_val="999999999"
+ top_pad="10"/>
+ </panel>
+
+ </scroll_container>
+ <panel
+ height="30"
+ layout="topleft"
+ name="button_panel"
+ left="5"
+ top_pad="0"
+ width="313"
+ follows="top|right|left">
+ <button
+ follows="top|right"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ name="cancel_btn"
+ right="-1"
+ width="100" />
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index f77678e5f8..0b33cea1d4 100755
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -96,7 +96,10 @@ Voice Server Version: [VOICE_VERSION]
<string name="LoginFailed">Login failed.</string>
<string name="Quit">Quit</string>
<string name="create_account_url">http://join.secondlife.com/?sourceid=[sourceid]</string>
-
+
+ <string name="AgniGridLabel">Second Life Main Grid (Agni)</string>
+ <string name="AditiGridLabel">Second Life Beta Test Grid (Aditi)</string>
+
<string name="ViewerDownloadURL">http://secondlife.com/download</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:
@@ -235,15 +238,22 @@ Please try logging in again in a minute.</string>
<string name="TooltipMustSingleDrop">Only a single item can be dragged here</string>
<string name="TooltipTooManyWearables">You can't wear a folder containing more than [AMOUNT] items. You can change this limit in Advanced > Show Debug Settings > WearFolderLimit.</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="TooltipSLIcon">This links to a page on the official SecondLife.com or LindenLab.com domain.</string>
+
+ <string name="TooltipOutboxDragToWorld">You can't rez items from the Marketplace Listings folder</string>
+ <string name="TooltipOutboxWorn">You can't put items you are wearing in the Marketplace Listings folder</string>
+ <string name="TooltipOutboxFolderLevels">Depth of nested folders exceeds [AMOUNT]. Decrease the depth of folders-within-folders; box items if necessary.</string>
+ <string name="TooltipOutboxTooManyFolders">Subfolder count exceeds [AMOUNT]. Decrease the number of folders in your listing; box items if necessary.</string>
+ <string name="TooltipOutboxTooManyObjects">Item count exceeds [AMOUNT]. In order to sell more than [AMOUNT] items in one listing, you must box some of them.</string>
+ <string name="TooltipOutboxTooManyStockItems">Stock items count exceeds [AMOUNT].</string>
+ <string name="TooltipOutboxCannotDropOnRoot">You can only drop items or folders in the ALL or UNASSOCIATED tabs. Please select one of those tabs and move your item(s) or folder(s) again.</string>
+ <string name="TooltipOutboxNoTransfer">One or more of these objects cannot be sold or transferred</string>
+ <string name="TooltipOutboxNotInInventory">You can only put items from your inventory on the marketplace</string>
+ <string name="TooltipOutboxLinked">You can't put linked items or folders on the marketplace</string>
+ <string name="TooltipOutboxCallingCard">You can't put calling cards on the marketplace</string>
+ <string name="TooltipOutboxDragActive">You can't move a listed listing</string>
+ <string name="TooltipOutboxCannotMoveRoot">You can't move the marketplace listings root folder</string>
+ <string name="TooltipOutboxMixedStock">All items in a stock folder must have the same type and permission</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>
@@ -268,6 +278,7 @@ Please try logging in again in a minute.</string>
<string name="TooltipMapUrl">Click to view this location on a map</string>
<string name="TooltipSLAPP">Click to run the secondlife:// command</string>
<string name="CurrentURL" value=" CurrentURL: [CurrentURL]" />
+ <string name="TooltipEmail">Click to compose an email</string>
<!-- text for SLURL labels -->
<string name="SLurlLabelTeleport">Teleport to</string>
@@ -489,7 +500,7 @@ Please try logging in again in a minute.</string>
<string name="NotConnected">Not Connected</string>
<string name="AgentNameSubst">(You)</string> <!-- Substitution for agent name -->
- <string name="JoinAnExperience">Join an experience</string> <!-- not used -->
+ <string name="JoinAnExperience"/><!-- intentionally blank -->
<string name="SilentlyManageEstateAccess">Suppress alerts when managing estate access lists</string>
<string name="OverrideYourAnimations">Replace your default animations</string>
<string name="ScriptReturnObjects">Return objects on your behalf</string>
@@ -2256,6 +2267,7 @@ For AI Character: Get the closest navigable point to the point provided.
<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="MarketplaceNoMatchingItems">No items found. Check the spelling of your search string and try again.</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>
@@ -2283,16 +2295,45 @@ We are accessing your account on the [[MARKETPLACE_CREATE_STORE_URL] Marketplace
<string name="InventoryOutboxError">
The [[MARKETPLACE_CREATE_STORE_URL] Marketplace store] is returning errors.
</string>
-
+ <string name="InventoryMarketplaceError">
+This feature is currently in Beta. Please add your name to this [http://goo.gl/forms/FCQ7UXkakz Google form] if you would like to participate.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItemsTitle">Your Marketplace Listings folder is empty.</string>
+ <string name="InventoryMarketplaceListingsNoItemsTooltip"></string>
+ <string name="InventoryMarketplaceListingsNoItems">
+ Drag folders to this area to list them for sale on the [[MARKETPLACE_DASHBOARD_URL] Marketplace].
+ </string>
+
+ <string name="Marketplace Validation Log"></string>
+ <string name="Marketplace Validation Warning Stock">stock folder must be contained by a version folder</string>
+ <string name="Marketplace Validation Error Mixed Stock">: Error: all items in a stock folder must be no-copy and of the same type</string>
+ <string name="Marketplace Validation Error Subfolder In Stock">: Error: stock folder cannot contain subfolders</string>
+ <string name="Marketplace Validation Warning Empty">: Warning: folder doesn't contain any items</string>
+ <string name="Marketplace Validation Warning Create Stock">: Warning: creating stock folder</string>
+ <string name="Marketplace Validation Warning Create Version">: Warning: creating version folder</string>
+ <string name="Marketplace Validation Warning Move">: Warning : moving items</string>
+ <string name="Marketplace Validation Warning Delete">: Warning: folder content transfered to stock folder, removing empty folder</string>
+ <string name="Marketplace Validation Error Stock Item">: Error: no-copy items must be contained by a stock folder</string>
+ <string name="Marketplace Validation Warning Unwrapped Item">: Warning: items must be contained by a version folder</string>
+ <string name="Marketplace Validation Error">: Error: </string>
+ <string name="Marketplace Validation Warning">: Warning: </string>
+ <string name="Marketplace Validation Error Empty Version">: Warning: version folder must contain at least 1 item</string>
+ <string name="Marketplace Validation Error Empty Stock">: Warning: stock folder must contain at least 1 item</string>
+
+ <string name="Marketplace Validation No Error">No errors or warnings to report</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="Marketplace Error Prefix">Error: </string>
+ <string name="Marketplace Error Not Merchant">Before sending items to the Marketplace you will need to set yourself up as a merchant (free of charge).</string>
+ <string name="Marketplace Error Not Accepted">Cannot move item in that folder.</string>
+ <string name="Marketplace Error Unsellable Item">This item cannot be sold on the Marketplace.</string>
+
+ <string name="MarketplaceNoID">no Mkt ID</string>
+ <string name="MarketplaceLive">listed</string>
+ <string name="MarketplaceActive">active</string>
+ <string name="MarketplaceMax">max</string>
+ <string name="MarketplaceStock">stock</string>
+ <string name="MarketplaceNoStock">out of stock</string>
+ <string name="MarketplaceUpdating">updating...</string>
<string name="Open landmarks">Open landmarks</string>
<string name="Unconstrained">Unconstrained</string>
@@ -2449,6 +2490,14 @@ The [[MARKETPLACE_CREATE_STORE_URL] Marketplace store] is returning errors.
<string name="DaysOld">[AGEDAYS] old</string>
<string name="TodayOld">Joined today</string>
+ <!-- Avatar complexity rendering messages, see
+ llavatarrendernotifier -->
+ <string name="av_render_everyone_now">Everyone can see you now.</string>
+ <string name="av_render_not_everyone">You may not be rendered by everyone around you.</string>
+ <string name="av_render_over_half">You may not be rendered by over half of those around you.</string>
+ <string name="av_render_most_of">You may not be rendered by most of those around you.</string>
+ <string name="av_render_anyone">You may not be rendered by anyone around you.</string>
+
<!-- AgeYearsA = singular,
AgeYearsB = plural,
AgeYearsC = plural for non-English languages like Russian
@@ -2500,6 +2549,7 @@ The [[MARKETPLACE_CREATE_STORE_URL] Marketplace store] is returning errors.
<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="CompileNoExperiencePerm">Skipping script [SCRIPT] with Experience [EXPERIENCE].</string>
<string name="CompileQueueTitle">Recompilation Progress</string>
<string name="CompileQueueStart">recompile</string>
<string name="ResetQueueTitle">Reset Progress</string>
@@ -3955,6 +4005,7 @@ Try enclosing path to the editor with double quotes.
<string name="Command_Inventory_Label">Inventory</string>
<string name="Command_Map_Label">Map</string>
<string name="Command_Marketplace_Label">Marketplace</string>
+ <string name="Command_MarketplaceListings_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>
@@ -3985,6 +4036,7 @@ Try enclosing path to the editor with double quotes.
<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_MarketplaceListings_Tooltip">Sell your creation</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>
@@ -4033,6 +4085,36 @@ Try enclosing path to the editor with double quotes.
<!-- Spell check settings floater -->
<string name="UserDictionary">[User]</string>
+ <!-- Experience Tools strings -->
+ <string name="experience_tools_experience">Experience</string>
+ <string name="ExperienceNameNull">(no experience)</string>
+ <string name="ExperienceNameUntitled">(untitled experience)</string>
+ <string name="Land-Scope">Land-Scope</string>
+ <string name="Grid-Scope">Grid-Scope</string>
+ <string name="Allowed_Experiences_Tab">ALLOWED</string>
+ <string name="Blocked_Experiences_Tab">BLOCKED</string>
+ <string name="Contrib_Experiences_Tab">CONTRIBUTOR</string>
+ <string name="Admin_Experiences_Tab">ADMIN</string>
+ <string name="Recent_Experiences_Tab">RECENT</string>
+ <string name="Owned_Experiences_Tab">OWNED</string>
+ <string name="ExperiencesCounter">([EXPERIENCES], max [MAXEXPERIENCES])</string>
+ <string name="ExperiencePermission1">take over your controls</string>
+ <string name="ExperiencePermission3">trigger animations on your avatar</string>
+ <string name="ExperiencePermission4">attach to your avatar</string>
+ <string name="ExperiencePermission9">track your camera</string>
+ <string name="ExperiencePermission10">control your camera</string>
+ <string name="ExperiencePermission11">teleport you</string>
+ <string name="ExperiencePermission12">automatically accept experience permissions</string>
+ <string name="ExperiencePermissionShortUnknown">perform an unknown operation: [Permission]</string>
+ <string name="ExperiencePermissionShort1">Take Controls</string>
+ <string name="ExperiencePermissionShort3">Trigger Animations</string>
+ <string name="ExperiencePermissionShort4">Attach</string>
+ <string name="ExperiencePermissionShort9">Track Camera</string>
+ <string name="ExperiencePermissionShort10">Control Camera</string>
+ <string name="ExperiencePermissionShort11">Teleport</string>
+ <string name="ExperiencePermissionShort12">Permission</string>
+ <string name="ExperiencePermissionShortUnknown">Unknown: [Permission]</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.
@@ -4046,5 +4128,21 @@ Try enclosing path to the editor with double quotes.
<string name="loading_chat_logs">
Loading...
</string>
+
+ <!-- Presets graphic/camera -->
+ <string name="preset_combo_label">-Empty list-</string>
+ <string name="Default">Default</string>
+ <string name="none_paren_cap">(None)</string>
+ <string name="no_limit">No Limit</string>
- </strings>
+ <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">
+ The physics shape contains triangles which are too small. Try simplifying the physics model.
+ </string>
+ <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">
+ The physics shape contains bad confirmation data. Try to correct the physics model.
+ </string>
+ <string name="Mav_Details_MAV_UNKNOWN_VERSION">
+ The physics shape does not have correct version. Set the correct version for the physics model.
+ </string>
+
+</strings>
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 d5b10e7f51..92f815d4bf 100755
--- 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,3 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<inbox_inventory_panel show_load_status="false"
- start_folder.type="inbox"/>
+<inbox_inventory_panel start_folder.type="inbox"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/inventory_panel.xml b/indra/newview/skins/default/xui/en/widgets/inventory_panel.xml
index eaf148c5e4..d5efd723c4 100755
--- a/indra/newview/skins/default/xui/en/widgets/inventory_panel.xml
+++ b/indra/newview/skins/default/xui/en/widgets/inventory_panel.xml
@@ -3,7 +3,6 @@
bg_opaque_color="InventoryBackgroundColor"
background_visible="true"
background_opaque="true"
- show_load_status="true"
accepts_drag_and_drop="true"
>
<scroll
diff --git a/indra/newview/skins/default/xui/en/widgets/notification_list_view.xml b/indra/newview/skins/default/xui/en/widgets/notification_list_view.xml
new file mode 100644
index 0000000000..150225af27
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/notification_list_view.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<notification_list_view
+ allow_select="false"
+ color="PanelFocusBackgroundColor"
+ item_pad="0"
+ keep_one_selected="false"
+ multi_select="false"
+ opaque="true">
+ <flat_list_view
+ color="FloaterDefaultBackgroundColor"
+ follows="all"
+ layout="topleft"
+ name="notification_list"
+ left="1"
+ top="20"
+ height="0"
+ width="318"/>
+</notification_list_view> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/es/floater_about.xml b/indra/newview/skins/default/xui/es/floater_about.xml
index e0a2375067..9bf485ce40 100755
--- a/indra/newview/skins/default/xui/es/floater_about.xml
+++ b/indra/newview/skins/default/xui/es/floater_about.xml
@@ -1,82 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="ACERCA DE [CAPITALIZED_APP_NAME]">
- <floater.string name="AboutHeader">
- [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
-[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
- </floater.string>
- <floater.string name="AboutCompiler">
- Compilado con [COMPILER], versión [COMPILER_VERSION]
- </floater.string>
- <floater.string name="AboutPosition">
- Estás en la posición [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] de [REGION], alojada en &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
-SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
-(coordenadas globales [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
-[SERVER_VERSION]
-[SERVER_RELEASE_NOTES_URL]
- </floater.string>
- <floater.string name="AboutSystem">
- CPU: [CPU]
-Memoria: [MEMORY_MB] MB
-Versión del Sistema Operativo: [OS_VERSION]
-Fabricante de la tarjeta gráfica: [GRAPHICS_CARD_VENDOR]
-Tarjeta gráfica: [GRAPHICS_CARD]
- </floater.string>
- <floater.string name="AboutDriver">
- Versión de Windows Graphics Driver: [GRAPHICS_DRIVER_VERSION]
- </floater.string>
- <floater.string name="AboutLibs">
- Versión de OpenGL: [OPENGL_VERSION]
-
-Versión de libcurl: [LIBCURL_VERSION]
-Versión de J2C Decoder: [J2C_VERSION]
-Versión de Audio Driver: [AUDIO_DRIVER_VERSION]
-Versión de Qt Webkit: [QT_WEBKIT_VERSION]
-Versión del servidor de voz: [VOICE_VERSION]
- </floater.string>
- <floater.string name="none">
- (no hay)
- </floater.string>
- <floater.string name="AboutTraffic">
- Paquetes perdidos: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
- </floater.string>
- <floater.string name="ErrorFetchingServerReleaseNotesURL">
- Error al obtener la URL de las notas de la versión del servidor.
- </floater.string>
<tab_container name="about_tab">
<panel label="Información" name="support_panel">
<button label="Copiar al portapapeles" name="copy_btn" width="165"/>
</panel>
<panel label="Créditos" name="credits_panel">
- <text name="linden_intro">
- Second Life ofrecido por los Lindens:
- </text>
- <text_editor name="linden_names">
- Philip, Andrew, Doug, Richard, Phoenix, Ian, Mark, Robin, Dan, Char, Ryan, Eric, Jim, Lee, Jeff, Michael, Kelly, Steve, Catherine, Bub, Ramzi, Jill, Jeska, Don, Kona, Callum, Charity, Jack, Shawn, babbage, James, Lauren, Blue, Brent, Reuben, Pathfinder, Jesse, Patsy, Torley, Bo, Cyn, Jonathan, Gia, Annette, Ginsu, Harry, Lex, Runitai, Guy, Cornelius, Beth, Swiss, Thumper, Wendy, Teeple, Seth, Dee, Mia, Sally, Liana, Aura, Beez, Milo, Red, Gulliver, Marius, Joe, Jose, Dore, Justin, Nora, Morpheus, Lexie, Amber, Chris, Xan, Leyla, Walker, Sabin, Joshua, Hiromi, Tofu, Fritz, June, Jean, Ivy, Dez, Ken, Betsy, Which, Spike, Rob, Zee, Dustin, George, Claudia, del, Matthew, jane, jay, Adrian, Yool, Rika, Yoz, siobhan, Qarl, Benjamin, Beast, Everett, madhavi, Christopher, Izzy, stephany, Jeremy, sean, adreanne, Pramod, Tobin, sejong, Iridium, maurice, kj, Meta, kari, JP, bert, kyle, Jon, Socrates, Bridie, Ivan, maria, Aric, Coco, Periapse, sandy, Storrs, Lotte, Colossus, Brad, Pastrami, Zen, BigPapi, Banzai, Sardonyx, Mani, Garry, Jaime, Neuro, Samuel, Niko, CeeLo, Austin, Soft, Poppy, emma, tessa, angelo, kurz, alexa, Sue, CG, Blake, Erica, Brett, Bevis, kristen, Q, simon, Enus, MJ, laurap, Kip, Scouse, Ron, Ram, kend, Marty, Prospero, melissa, kraft, Nat, Seraph, Hamilton, Lordan, Green, miz, Ashlei, Trinity, Ekim, Echo, Charlie, Rowan, Rome, Jt, Doris, benoc, Christy, Bao, Kate, Tj, Patch, Cheah, Johan, Brandy, Angela, Oreh, Cogsworth, Lan, Mitchell, Space, Bambers, Einstein, Bender, Malbers, Matias, Maggie, Rothman, Milton, Niall, Marin, Allison, Mango, Andrea, Katt, Yi, Ambroff, Rico, Raymond, Gail, Christa, William, Dawn, Usi, Dynamike, M, Corr, Dante, Molly, kaylee, Danica, Kelv, Lil, jacob, Nya, Rodney, elsie, Blondin, Grant, Nyx, Devin, Monty, Minerva, Keira, Katie, Jenn, Makai, Clare, Joy, Cody, Gayathri, FJ, spider, Oskar, Landon, Jarv, Noelle, Al, Doc, Gray, Vir, t, Maestro, Simone, Shannon, yang, Courtney, Scott, charlene, Quixote, Susan, Zed, Amanda, Katelin, Esbee, JoRoan, Enkidu, roxie, Scarlet, Merov, Kevin, Judy, Rand, Newell, Les, Dessie, Galen, Michon, Geo, Siz, Calyle, Pete, Praveen, Callen, Sheldon, Pink, Nelson, jenelle, Terrence, Nathan, Juan, Sascha, Huseby, Karina, Kaye, Kotler, Lis, Darv, Charrell, Dakota, Kimmora, Theeba, Taka, Mae, Perry, Ducot, dana, Esther, Dough, gisele, Doten, Viale, Fisher, jessieann, ashley, Torres, delby, rountree, kurt, Slaton, Madison, Rue, Gino, Wen, Casssandra, Brodesky, Squid, Gez, Rakesh, Gecko, Ladan, Tony, Tatem, Squire, Falcon, BK, Crimp, Tiggs, Bacon, Coyot, Carmilla, Webb, Sea, Arch, Jillian, Jason, Bernard, Vogt, Peggy, dragon, Pup, xandix, Wallace, Bewest, Inoshiro, Rhett, AG, Aimee, Ghengis, Itiaes, Eli, Steffan, Epic, Grapes, Stone, Prep, Scobu, Robert, Alain, Carla, Vicky, Tia, Alec, Taras, Lisa, Oz, Ariane, Log, House, Kazu, Kim, Drofnas, Tyler, Campbell, Michele, Madeline, Nelly, Baron, Thor, Lori, Hele, Fredrik, Teddy, Pixie, Berry, Gabrielle, Alfonso, Brooke, Wolf, Ringo, Cru, Charlar, Rodvik, Gibson, Elise, Bagman, Greger, Leonidas, Jerm, Leslie, CB, Brenda, Durian, Carlo, mm, Zeeshan, Caleb, Max, Elikak, Mercille, Steph, Chase
- </text_editor>
- <text name="contrib_intro">
- con contribuciones de código abierto de:
- </text>
- <text_editor name="contrib_names">
- Dummy Name sustituido durante la ejecución
- </text_editor>
- <text name="trans_intro">
- y traducido por:
- </text>
- <text_editor name="trans_names">
- Dummy Name sustituido durante la ejecución
- </text_editor>
+ <text name="linden_intro">Second Life ofrecido por los Lindens,
+con contribuciones de código abierto de:</text>
+ <text_editor name="contrib_names">Dummy Name sustituido durante la ejecución</text_editor>
</panel>
<panel label="Licencias" name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
+ <text_editor name="licenses_editor">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.
+ FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm y 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.
+ GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University y 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)
@@ -87,7 +29,7 @@ Versión del servidor de voz: [VOICE_VERSION]
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.
+ zlib Copyright (C) 1995-2012 Jean-loup Gailly y Mark Adler.
El visor de Second Life usa Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (y sus licenciadores). Reservados todos los derechos. Vea los detalles en www.havok.com.
@@ -95,8 +37,7 @@ Versión del servidor de voz: [VOICE_VERSION]
Reservados todos los derechos. Consulte los detalles en licenses.txt.
- Codificación del audio del chat de voz: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
+ Codificación del audio del chat de voz: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)</text_editor>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml
index f8c40d798a..10907344ae 100755
--- a/indra/newview/skins/default/xui/es/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_about_land.xml
@@ -308,9 +308,6 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
<panel.string name="push_restrict_region_text">
Sin &apos;empujones&apos; (prevalece lo marcado en la región)
</panel.string>
- <panel.string name="see_avs_text">
- Los avatares de otras parcelas pueden ver
- </panel.string>
<text name="allow_label">
Permitir a otros Residentes:
</text>
@@ -336,22 +333,6 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
<check_box label="Seguro (sin daño)" name="check safe" tool_tip="Si se marca, convierte el terreno en &apos;seguro&apos;, desactivando el daño en combate. Si no, se activa el daño en combate."/>
<check_box label="Sin &apos;empujones&apos;" name="PushRestrictCheck" tool_tip="Previene scripts que empujen. Marcando esta opción prevendrá que en su terreno haya comportamientos destructivos."/>
<check_box label="Mostrar el sitio en la búsqueda (30 L$/semana)" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/>
- <combo_box name="land category with adult">
- <combo_box.item label="Cualquier categoría" name="item0"/>
- <combo_box.item label="Localización Linden" name="item1"/>
- <combo_box.item label="Adulto" name="item2"/>
- <combo_box.item label="Arte y Cultura" name="item3"/>
- <combo_box.item label="Negocios" name="item4"/>
- <combo_box.item label="Educativo" name="item5"/>
- <combo_box.item label="Juegos de azar" name="item6"/>
- <combo_box.item label="Entretenimiento" name="item7"/>
- <combo_box.item label="Para recién llegados" name="item8"/>
- <combo_box.item label="Parques y Naturaleza" name="item9"/>
- <combo_box.item label="Residencial" name="item10"/>
- <combo_box.item label="Compras" name="item11"/>
- <combo_box.item label="Terreno en alquiler" name="item13"/>
- <combo_box.item label="Otra" name="item12"/>
- </combo_box>
<combo_box name="land category">
<combo_box.item label="Cualquier categoría" name="item0"/>
<combo_box.item label="Localización Linden" name="item1"/>
@@ -451,15 +432,9 @@ los media:
<panel.string name="access_estate_defined">
(Definido por el Estado)
</panel.string>
- <panel.string name="allow_public_access">
- Permitir el acceso público ([MATURITY]) (Nota: Si no seleccionas esta opción, se crearán líneas de prohibición)
- </panel.string>
<panel.string name="estate_override">
Una o más de esta opciones está configurada a nivel del estado
</panel.string>
- <text name="Limit access to this parcel to:">
- Acceso a esta parcela
- </text>
<check_box label="Permitir el acceso público (si no seleccionas esta opción, se crearán líneas de prohibición)" name="public_access"/>
<text name="Only Allow">
Permitir únicamente el acceso a los Residentes que:
@@ -491,5 +466,6 @@ los media:
<button label="Quitar" label_selected="Quitar" name="remove_banned"/>
</panel>
</panel>
+ <panel label="EXPERIENCIAS" name="land_experiences_panel"/>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_associate_listing.xml b/indra/newview/skins/default/xui/es/floater_associate_listing.xml
new file mode 100644
index 0000000000..128382b277
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_associate_listing.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="associate listing" title="ASOCIAR ARTÍCULOS">
+ <text name="message">Id. de artículos:</text>
+ <line_editor name="listing_id">Escribe aquí el Id.</line_editor>
+ <button label="OK" name="OK"/>
+ <button label="Cancelar" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_edit_hover_height.xml b/indra/newview/skins/default/xui/es/floater_edit_hover_height.xml
new file mode 100644
index 0000000000..d2130228bc
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_edit_hover_height.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="HoverHeight" title="CONFIGURAR ALTURA DEL AVATAR">
+ <slider label="Altura" name="HoverHeightSlider"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_experience_search.xml b/indra/newview/skins/default/xui/es/floater_experience_search.xml
new file mode 100644
index 0000000000..315b3363fa
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_experience_search.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="experiencepicker" title="ELEGIR EXPERIENCIA"/>
diff --git a/indra/newview/skins/default/xui/es/floater_experienceprofile.xml b/indra/newview/skins/default/xui/es/floater_experienceprofile.xml
new file mode 100644
index 0000000000..c37208647a
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_experienceprofile.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater title="EXPERIENCE PROFILE">
+ <floater.string name="empty_slurl">
+ (ninguno)
+ </floater.string>
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Light&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Light&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Light&quot;
+ </floater.string>
+ <text name="edit_title" value="Perfil de experiencia"/>
+ <tab_container name="tab_container">
+ <panel name="panel_experience_info">
+ <scroll_container name="xp_scroll">
+ <panel name="scrolling_panel">
+ <layout_stack>
+ <layout_panel name="top panel">
+ <button label="Editar" name="edit_btn"/>
+ </layout_panel>
+ <layout_panel name="maturity panel">
+ <text name="ContentRating">
+ Calificación:
+ </text>
+ </layout_panel>
+ <layout_panel name="location panel">
+ <text name="Location">
+ Ubicación:
+ </text>
+ </layout_panel>
+ <layout_panel>
+ <text name="Owner">
+ Propietario:
+ </text>
+ </layout_panel>
+ <layout_panel name="group_panel">
+ <text name="Group">
+ Grupo:
+ </text>
+ </layout_panel>
+ <layout_panel name="perm panel">
+ <button label="Permitir" name="allow_btn"/>
+ <button label="Olvidar" name="forget_btn"/>
+ <button label="Bloquear" name="block_btn"/>
+ <text name="privileged">
+ Esta experiencia está habilitada para todos los residentes.
+ </text>
+ <button label="Denunciar una infracción" name="report_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ </panel>
+ <panel name="edit_panel_experience_info">
+ <scroll_container name="edit_xp_scroll">
+ <panel name="edit_scrolling_panel">
+ <text name="edit_experience_title_label" value="Nombre:"/>
+ <text name="edit_experience_desc_label" value="Descripción:"/>
+ <button label="Grupo" name="Group_btn"/>
+ <text name="edit_ContentRating">
+ Calificación:
+ </text>
+ <icons_combo_box label="Moderado" name="edit_ContentRatingText" tool_tip="Al aumentar el nivel de calificación de una experiencia se restablecen los permisos de todos los residentes que han permitido la experiencia.">
+ <icons_combo_box.item label="Adulto" name="Adult" value="42"/>
+ <icons_combo_box.item label="Moderado" name="Mature" value="21"/>
+ <icons_combo_box.item label="General" name="PG" value="13"/>
+ </icons_combo_box>
+ <text name="edit_Location">
+ Ubicación:
+ </text>
+ <button label="Configurar en mi posición" name="location_btn"/>
+ <button label="Borrar lugar" name="clear_btn"/>
+ <check_box label="Habilitar experiencia" name="edit_enable_btn" tool_tip=""/>
+ <check_box label="Ocultar en la búsqueda" name="edit_private_btn"/>
+ <text name="changes" value="Los cambios de una experiencia pueden tardar varios minutos en mostrarse en todas las regiones.+"/>
+ <button label="Anterior" name="cancel_btn"/>
+ <button label="Guardar" name="save_btn"/>
+ </panel>
+ </scroll_container>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_experiences.xml b/indra/newview/skins/default/xui/es/floater_experiences.xml
new file mode 100644
index 0000000000..1a95aa3da8
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_experiences.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_experiences" title="EXPERIENCIAS"/>
diff --git a/indra/newview/skins/default/xui/es/floater_facebook.xml b/indra/newview/skins/default/xui/es/floater_facebook.xml
index 3b0e05b193..4bccc6ee57 100644
--- a/indra/newview/skins/default/xui/es/floater_facebook.xml
+++ b/indra/newview/skins/default/xui/es/floater_facebook.xml
@@ -1,20 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_facebook" title="PUBLICAR EN FACEBOOK">
- <panel name="background">
- <tab_container name="tabs">
- <panel label="ESTADO" name="panel_facebook_status"/>
- <panel label="FOTO" name="panel_facebook_photo"/>
- <panel label="ESTOY AQUÍ" name="panel_facebook_place"/>
- <panel label="AMIGOS" name="panel_facebook_friends"/>
- <panel label="CUENTA" name="panel_facebook_account"/>
- </tab_container>
- <panel name="connection_status_panel">
- <text name="connection_error_text">
- Error
- </text>
- <text name="connection_loading_text">
- Cargando...
- </text>
- </panel>
- </panel>
+ <tab_container name="tabs">
+ <panel label="ESTADO" name="panel_facebook_status"/>
+ <panel label="FOTO" name="panel_facebook_photo"/>
+ <panel label="ESTOY AQUÍ" name="panel_facebook_place"/>
+ <panel label="AMIGOS" name="panel_facebook_friends"/>
+ </tab_container>
+ <text name="connection_error_text">
+ Error
+ </text>
+ <text name="connection_loading_text">
+ Cargando...
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml
index bf84c3d808..a8a3ad08f8 100755
--- a/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml
@@ -1,67 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="item properties" title="PROPIEDADES DEL ÍTEM DEL INVENTARIO">
- <floater.string name="unknown">
- (desconocido)
- </floater.string>
- <floater.string name="public">
- (público)
- </floater.string>
- <floater.string name="you_can">
- Usted puede:
- </floater.string>
- <floater.string name="owner_can">
- El propietario puede:
- </floater.string>
- <floater.string name="acquiredDate">
- [wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
- </floater.string>
- <text name="LabelItemNameTitle">
- Nombre:
- </text>
- <text name="LabelItemDescTitle">
- Descripción:
- </text>
- <text name="LabelCreatorTitle">
- Creador:
- </text>
+ <floater.string name="unknown">(desconocido)</floater.string>
+ <floater.string name="public">(público)</floater.string>
+ <floater.string name="you_can">Usted puede:</floater.string>
+ <floater.string name="owner_can">El propietario puede:</floater.string>
+ <floater.string name="acquiredDate">[wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]</floater.string>
+ <text name="LabelItemNameTitle">Nombre:</text>
+ <text name="LabelItemDescTitle">Descripción:</text>
+ <text name="LabelCreatorTitle">Creador:</text>
<button label="Perfil..." label_selected="" name="BtnCreator"/>
- <text name="LabelOwnerTitle">
- Propietario:
- </text>
+ <text name="LabelOwnerTitle">Propietario:</text>
<button label="Perfil..." label_selected="" name="BtnOwner"/>
- <text name="LabelAcquiredTitle">
- Adquirido:
- </text>
- <text name="LabelAcquiredDate">
- May Mié 24 12:50:46 2006
- </text>
- <text name="OwnerLabel">
- Tú:
- </text>
+ <text name="LabelAcquiredTitle">Adquirido:</text>
+ <text name="LabelAcquiredDate">May Mié 24 12:50:46 2006</text>
+ <text name="OwnerLabel">Tú:</text>
<check_box label="Editar" name="CheckOwnerModify"/>
<check_box label="Copiarlo" left_delta="88" name="CheckOwnerCopy"/>
<check_box label="Revender" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">
- Cualquiera:
- </text>
+ <text name="AnyoneLabel">Cualquiera:</text>
<check_box label="Copiar" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">
- Grupo:
- </text>
+ <text name="GroupLabel">Grupo:</text>
<check_box label="Compartir" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel" width="230">
- Próximo propietario:
- </text>
+ <text name="NextOwnerLabel" width="230">Próximo propietario:</text>
<check_box label="Editar" name="CheckNextOwnerModify"/>
<check_box label="Copiarlo" left_delta="88" name="CheckNextOwnerCopy"/>
<check_box label="Revender" name="CheckNextOwnerTransfer"/>
<check_box label="En venta" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
- <combo_box.item label="Copia" name="Copy"/>
+ <combo_box name="ComboBoxSaleType">
+ <combo_box.item label="Copiar" name="Copy"/>
+ <combo_box.item label="Contenidos" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
<spinner label="Precio:" name="Edit Cost"/>
- <text name="CurrencySymbol">
- L$
- </text>
+ <text name="CurrencySymbol">L$</text>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml
index 6004034504..5d16ccd271 100755
--- a/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml
@@ -5,8 +5,8 @@
<check_box label="Ropa" name="check_clothing"/>
<check_box label="Gestos" name="check_gesture"/>
<check_box label="Hitos" name="check_landmark"/>
- <check_box label="Redes" name="check_mesh"/>
<check_box label="Notas" name="check_notecard"/>
+ <check_box label="Redes" name="check_mesh"/>
<check_box label="Objetos" name="check_object"/>
<check_box label="Scripts" name="check_script"/>
<check_box label="Sonidos" name="check_sound"/>
@@ -19,6 +19,10 @@
<text name="- OR -">
- o -
</text>
+ <radio_group name="date_search_direction">
+ <radio_item label="Posteriores a" name="newer"/>
+ <radio_item label="Anteriores a" name="older"/>
+ </radio_group>
<spinner label="horas atrás" name="spin_hours_ago"/>
<spinner label="días atrás" name="spin_days_ago"/>
<button bottom_delta="-30" label="Cerrar" label_selected="Cerrar" name="Close"/>
diff --git a/indra/newview/skins/default/xui/es/floater_item_properties.xml b/indra/newview/skins/default/xui/es/floater_item_properties.xml
new file mode 100644
index 0000000000..b5fd595c24
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_item_properties.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Item Properties" title="PROPIEDADES DEL ARTÍCULO"/>
diff --git a/indra/newview/skins/default/xui/es/floater_lagmeter.xml b/indra/newview/skins/default/xui/es/floater_lagmeter.xml
index 227689a194..64a2124cd6 100644
--- a/indra/newview/skins/default/xui/es/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/es/floater_lagmeter.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="MEDIDOR DEL LAG">
+<floater name="floater_lagmeter" title="MEDIDOR DE LAG">
<floater.string name="max_title_msg">
- Medidor del lag
+ Medidor de lag
</floater.string>
<floater.string name="max_width_px">
360
@@ -25,25 +25,25 @@
Normal, ventana en segundo plano
</floater.string>
<floater.string name="client_frame_time_critical_msg">
- Frames del cliente valorados por debajo de [CLIENT_FRAME_RATE_CRITICAL]
+ Velocidad de fotogramas del cliente inferior a [CLIENT_FRAME_RATE_CRITICAL]
</floater.string>
<floater.string name="client_frame_time_warning_msg">
- Frames del cliente valorados entre [CLIENT_FRAME_RATE_CRITICAL] y [CLIENT_FRAME_RATE_WARNING]
+ Velocidad de fotogramas del cliente entre [CLIENT_FRAME_RATE_CRITICAL] y [CLIENT_FRAME_RATE_WARNING]
</floater.string>
<floater.string name="client_frame_time_normal_msg">
Normal
</floater.string>
<floater.string name="client_draw_distance_cause_msg">
- Posible causa: distancia de dibujo fijada muy alta
+ Causa posible: la distancia de dibujo configurada es demasiado grande
</floater.string>
<floater.string name="client_texture_loading_cause_msg">
- Posible causa: imágenes cargándose
+ Causa posible: se están cargando las imágenes
</floater.string>
<floater.string name="client_texture_memory_cause_msg">
- Posible causa: demasiadas imágenes en la memoria
+ Causa posible: demasiadas imágenes en la memoria
</floater.string>
<floater.string name="client_complex_objects_cause_msg">
- Posible causa: demasiados objetos complejos en la escena
+ Causa posible: la escena contiene demasiados objetos complejos
</floater.string>
<floater.string name="network_text_msg">
Red
@@ -55,10 +55,10 @@
5
</floater.string>
<floater.string name="network_packet_loss_critical_msg">
- La conexión deja caer más del [NETWORK_PACKET_LOSS_CRITICAL]% de los paquetes
+ La conexión pierde más de un [NETWORK_PACKET_LOSS_CRITICAL] % de paquetes
</floater.string>
<floater.string name="network_packet_loss_warning_msg">
- La conexión deja caer [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% de los paquetes
+ La conexión pierde entre un [NETWORK_PACKET_LOSS_WARNING] % y un [NETWORK_PACKET_LOSS_CRITICAL] % de paquetes
</floater.string>
<floater.string name="network_performance_normal_msg">
Normal
@@ -70,16 +70,16 @@
300
</floater.string>
<floater.string name="network_ping_critical_msg">
- El tiempo de conexión -ping- supera los [NETWORK_PING_CRITICAL] ms
+ Tiempo de ping de la conexión superior a [NETWORK_PING_CRITICAL] ms
</floater.string>
<floater.string name="network_ping_warning_msg">
- El tiempo de conexión -ping- es de [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
+ Tiempo de ping de la conexión de [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
</floater.string>
<floater.string name="network_packet_loss_cause_msg">
- Quizá una mala conexión o un ancho de banda fijado demasiado alto.
+ Posible conexión deficiente o la preferencia &apos;Bandwidth&apos; tiene un valor demasiado alto.
</floater.string>
<floater.string name="network_ping_cause_msg">
- Quizá una mala conexión o una aplicación de archivos compartidos.
+ Posible conexión deficiente o aplicación de archivos compartidos.
</floater.string>
<floater.string name="server_text_msg">
Servidor
@@ -94,31 +94,31 @@
20
</floater.string>
<floater.string name="server_frame_time_critical_msg">
- Frecuencia (framerate) por debajo de [SERVER_FRAME_RATE_CRITICAL]
+ Velocidad de fotogramas del simulador inferior a [SERVER_FRAME_RATE_CRITICAL]
</floater.string>
<floater.string name="server_frame_time_warning_msg">
- Frecuencia (framerate) entre [SERVER_FRAME_RATE_CRITICAL] y [SERVER_FRAME_RATE_WARNING]
+ Velocidad de fotogramas del simulador entre [SERVER_FRAME_RATE_CRITICAL] y [SERVER_FRAME_RATE_WARNING]
</floater.string>
<floater.string name="server_frame_time_normal_msg">
Normal
</floater.string>
<floater.string name="server_physics_cause_msg">
- Posible causa: demasiados objetos físicos
+ Causa posible: demasiados objetos físicos
</floater.string>
<floater.string name="server_scripts_cause_msg">
- Posible causa: demasiados objetos con script
+ Causa posible: demasiados objetos programados
</floater.string>
<floater.string name="server_net_cause_msg">
- Posible causa: demasiado tráfico en la red
+ Causa posible: tráfico excesivo en la red
</floater.string>
<floater.string name="server_agent_cause_msg">
- Posible causa: demasiada gente moviéndose en la región
+ Causa posible: demasiadas personas moviéndose en la región
</floater.string>
<floater.string name="server_images_cause_msg">
- Posible causa: demasiados cálculos de imáganes
+ Causa posible: demasiados cálculos de imagen
</floater.string>
<floater.string name="server_generic_cause_msg">
- Posible causa: carga del simulador muy pesada
+ Causa posible: carga del simulador excesiva
</floater.string>
<floater.string name="smaller_label">
&gt;&gt;
@@ -126,7 +126,7 @@
<floater.string name="bigger_label">
&lt;&lt;
</floater.string>
- <button label="" label_selected="" name="client_lagmeter" tool_tip="Estado del lag del cliente"/>
+ <button label="" label_selected="" name="client_lagmeter" tool_tip="Estado de lag del cliente"/>
<text name="client">
Cliente
</text>
@@ -134,7 +134,7 @@
Normal
</text>
<text left="30" name="client_lag_cause" right="-10"/>
- <button label="" label_selected="" name="network_lagmeter" tool_tip="Estado del lag de la red"/>
+ <button label="" label_selected="" name="network_lagmeter" tool_tip="Estado de lag de la red"/>
<text name="network">
Red
</text>
@@ -142,7 +142,7 @@
Normal
</text>
<text left="30" name="network_lag_cause" right="-10"/>
- <button label="" label_selected="" name="server_lagmeter" tool_tip="Estado del lag del servidor"/>
+ <button label="" label_selected="" name="server_lagmeter" tool_tip="Estado de lag del servidor"/>
<text name="server">
Servidor
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml
index 4ff54bccb5..9672f910ea 100755
--- a/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml
@@ -9,7 +9,24 @@
<floater.string name="Title">
SCRIPT: [NAME]
</floater.string>
+ <floater.string name="experience_enabled">
+ Anular la selección para quitar la experiencia actual
+ </floater.string>
+ <floater.string name="no_experiences">
+ No tienes autorización para ninguna experiencia
+ </floater.string>
+ <floater.string name="add_experiences">
+ Seleccionar para agregar una experiencia
+ </floater.string>
+ <floater.string name="show_experience_profile">
+ Pulsar para ver el perfil de la experiencia
+ </floater.string>
+ <floater.string name="loading">
+ Cargando...
+ </floater.string>
<button label="Reiniciar" label_selected="Reiniciar" name="Reset"/>
<check_box initial_value="true" label="Ejecutándose" left="4" name="running"/>
<check_box initial_value="true" label="Mono" left="106" name="mono"/>
+ <check_box label="Usar experiencia(s):" name="enable_xp"/>
+ <button label="&gt;" name="view_profile"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_marketplace_listings.xml b/indra/newview/skins/default/xui/es/floater_marketplace_listings.xml
new file mode 100644
index 0000000000..2869af87f3
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_marketplace_listings.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_listings" title="ARTÍCULOS DEL MERCADO">
+ <panel name="marketplace_listings_panel">
+ <panel>
+ <panel name="marketplace_listings_inventory_placeholder_panel">
+ <text name="marketplace_listings_inventory_placeholder_title">Cargando...</text>
+ </panel>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_marketplace_validation.xml b/indra/newview/skins/default/xui/es/floater_marketplace_validation.xml
new file mode 100644
index 0000000000..aab4b223dc
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_marketplace_validation.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_validation" title="Auditar artículos del Mercado">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <text_editor name="validation_text">MARKETPLACE_VALIDATION_TEXT</text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_openobject.xml b/indra/newview/skins/default/xui/es/floater_openobject.xml
index b8b688df60..ab5bec3301 100755
--- a/indra/newview/skins/default/xui/es/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/es/floater_openobject.xml
@@ -3,6 +3,11 @@
<text name="object_name">
[DESC]:
</text>
- <button label="Copiar al inventario" label_selected="Copiar al inventario" name="copy_to_inventory_button"/>
- <button label="Copiar y vestirse" label_selected="Copiar y vestirse" name="copy_and_wear_button"/>
+ <text name="border_note">
+ Copiar en el inventario y vestir
+ </text>
+ <button label="Añadir a vestuario" label_selected="Añadir a vestuario" name="copy_and_wear_button"/>
+ <button label="Reemplazar vestuario" label_selected="Reemplazar vestuario" name="copy_and_replace_button"/>
+ <button label="Solo copiar en el inventario" label_selected="Solo copiar en el inventario" name="copy_to_inventory_button"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel_button"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_pay.xml b/indra/newview/skins/default/xui/es/floater_pay.xml
index ad9a43ad71..567f980446 100755
--- a/indra/newview/skins/default/xui/es/floater_pay.xml
+++ b/indra/newview/skins/default/xui/es/floater_pay.xml
@@ -1,26 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <string name="payee_group">
- Pagar al grupo
- </string>
- <string name="payee_resident">
- Pagar al residente
- </string>
- <text left="5" name="payee_label" width="105">
- Pagar:
- </text>
- <icon name="icon_person" tool_tip="Persona"/>
- <text left="115" name="payee_name">
- Nombre de prueba demasiado largo para comprobar la función de recorte
- </text>
- <button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
- <button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
- <button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
- <button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
- <text left="4" name="amount text">
- O elige cuánto:
- </text>
- <line_editor left="60" name="amount" width="55"/>
- <button label="Pagar" label_selected="Pagar" name="pay btn"/>
- <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
+ <string name="payee_group">Pagar al grupo</string>
+ <string name="payee_resident">Pagar al residente</string>
+ <text name="paying_text">Vas a pagar:</text>
+ <text left="115" name="payee_name">Nombre de prueba demasiado largo para comprobar la función de recorte</text>
+ <panel label="Buscar" name="PatternsPanel">
+ <button label="Pagar 1 L$" label_selected="Pagar 1 L$" name="fastpay 1"/>
+ <button label="Pagar 5 L$" label_selected="Pagar 5 L$" name="fastpay 5"/>
+ <button label="Pagar 10 L$" label_selected="Pagar 10 L$" name="fastpay 10"/>
+ <button label="Pagar 20 L$" label_selected="Pagar 20 L$" name="fastpay 20"/>
+ </panel>
+ <panel label="Buscar" name="InputPanel">
+ <text name="amount text">Otra cantidad:</text>
+ <button label="Pagar" label_selected="Pagar" name="pay btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_pay_object.xml b/indra/newview/skins/default/xui/es/floater_pay_object.xml
index 4767f4dfa0..8a5b028927 100755
--- a/indra/newview/skins/default/xui/es/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/es/floater_pay_object.xml
@@ -1,29 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <string left="5" name="payee_group" width="110">
- Pagar al grupo
- </string>
- <string left="5" name="payee_resident" width="110">
- Pagar al residente
- </string>
- <icon name="icon_person" tool_tip="Persona"/>
- <text left="120" name="payee_name" width="180">
- Ericacita Moostopolison
- </text>
- <text left="5" name="object_name_label" width="110">
- A través del objeto:
- </text>
+ <string left="5" name="payee_group" width="110">Pagar al grupo</string>
+ <string left="5" name="payee_resident" width="110">Pagar al residente</string>
+ <text name="paying_text">Vas a pagar:</text>
+ <text left="120" name="payee_name" width="180">Ericacita Moostopolison</text>
+ <text left="5" name="object_name_label" width="110">A través del objeto:</text>
<icon name="icon_object" tool_tip="Objetos"/>
- <text left="120" name="object_name_text" width="180">
- El muy largo nombre de mi objeto
- </text>
- <button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
- <button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
- <button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
- <button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
- <text name="amount text">
- O elige cuánto:
- </text>
- <button label="Pagar" label_selected="Pagar" name="pay btn"/>
- <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
+ <text left="120" name="object_name_text" width="180">El muy largo nombre de mi objeto</text>
+ <panel label="Buscar" name="PatternsPanel">
+ <button label="Pagar 1 L$" label_selected="Pagar 1 L$" name="fastpay 1"/>
+ <button label="Pagar 5 L$" label_selected="Pagar 5 L$" name="fastpay 5"/>
+ <button label="Pagar 10 L$" label_selected="Pagar 10 L$" name="fastpay 10"/>
+ <button label="Pagar 20 L$" label_selected="Pagar 20 L$" name="fastpay 20"/>
+ </panel>
+ <panel label="Buscar" name="InputPanel">
+ <text name="amount text">Otra cantidad:</text>
+ <button label="Pagar" label_selected="Pagar" name="pay btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_report_abuse.xml b/indra/newview/skins/default/xui/es/floater_report_abuse.xml
index fe37f125b8..8d8906c617 100755
--- a/indra/newview/skins/default/xui/es/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/es/floater_report_abuse.xml
@@ -76,7 +76,7 @@
<combo_box.item label="Terreno &gt; Invasión &gt; Objetos o texturas" name="Land__Encroachment__Objects_textures"/>
<combo_box.item label="Terreno &gt; Invasión &gt; Partículas" name="Land__Encroachment__Particles"/>
<combo_box.item label="Terreno &gt; Invasión &gt; Árboles/Plantas" name="Land__Encroachment__Trees_plants"/>
- <combo_box.item label="Apostar" name="Wagering_gambling"/>
+ <combo_box.item label="Incumplimiento de la política de juegos" name="Wagering_gambling"/>
<combo_box.item label="Otra" name="Other"/>
</combo_box>
<text name="abuser_name_title">
diff --git a/indra/newview/skins/default/xui/es/floater_snapshot.xml b/indra/newview/skins/default/xui/es/floater_snapshot.xml
index 5e02bc52b7..c2c996aa8a 100755
--- a/indra/newview/skins/default/xui/es/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/es/floater_snapshot.xml
@@ -39,17 +39,8 @@
<string name="local_failed_str">
Error al guardar en el equipo.
</string>
- <button name="advanced_options_btn" tool_tip="Opciones avanzadas"/>
- <text name="image_res_text">
- [WIDTH] x [HEIGHT] px
- </text>
- <text name="file_size_label">
- [SIZE] kB
- </text>
+ <button label="ACTUALIZAR" name="new_snapshot_btn"/>
<panel name="advanced_options_panel">
- <text name="advanced_options_label">
- OPCIONES AVANZADAS
- </text>
<text name="layer_type_label">
Captura:
</text>
@@ -68,4 +59,10 @@
<combo_box.item label="Sin filtro" name="NoFilter"/>
</combo_box>
</panel>
+ <text name="image_res_text">
+ [WIDTH] px (ancho) × [HEIGHT] px (alto)
+ </text>
+ <text name="file_size_label">
+ [SIZE] kB
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_top_objects.xml b/indra/newview/skins/default/xui/es/floater_top_objects.xml
index bb53f116c2..4eaa552fda 100755
--- a/indra/newview/skins/default/xui/es/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/es/floater_top_objects.xml
@@ -21,6 +21,12 @@
<floater.string name="none_descriptor">
No se ha encontrado ninguno.
</floater.string>
+ <floater.string name="URLs">
+ URL
+ </floater.string>
+ <floater.string name="memory">
+ Memoria (KB)
+ </floater.string>
<text name="title_text">
Cargando...
</text>
@@ -30,7 +36,7 @@
<scroll_list.columns label="Propietario" name="owner"/>
<scroll_list.columns label="Posición" name="location"/>
<scroll_list.columns label="Parcela" name="parcel"/>
- <scroll_list.columns label="Tiempo" name="time"/>
+ <scroll_list.columns label="Fecha" name="time"/>
<scroll_list.columns label="URLs" name="URLs"/>
<scroll_list.columns label="Memoria (KB)" name="memory"/>
</scroll_list>
diff --git a/indra/newview/skins/default/xui/es/floater_twitter.xml b/indra/newview/skins/default/xui/es/floater_twitter.xml
index 050ee1a391..92f4fc5bba 100644
--- a/indra/newview/skins/default/xui/es/floater_twitter.xml
+++ b/indra/newview/skins/default/xui/es/floater_twitter.xml
@@ -1,17 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_twitter" title="TWITTER">
- <panel name="background">
- <tab_container name="tabs">
- <panel label="REDACTAR" name="panel_twitter_photo"/>
- <panel label="CUENTA" name="panel_twitter_account"/>
- </tab_container>
- <panel name="connection_status_panel">
- <text name="connection_error_text">
- Error
- </text>
- <text name="connection_loading_text">
- Cargando...
- </text>
- </panel>
- </panel>
+ <tab_container name="tabs">
+ <panel label="REDACTAR" name="panel_twitter_photo"/>
+ <panel label="CUENTA" name="panel_twitter_account"/>
+ </tab_container>
+ <text name="connection_error_text">
+ Error
+ </text>
+ <text name="connection_loading_text">
+ Cargando...
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/es/menu_attachment_self.xml b/indra/newview/skins/default/xui/es/menu_attachment_self.xml
index 5acd0c327a..02819e6816 100755
--- a/indra/newview/skins/default/xui/es/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/es/menu_attachment_self.xml
@@ -8,6 +8,7 @@
<menu_item_call label="Mi apariencia" name="Change Outfit"/>
<menu_item_call label="Editar mi vestuario" name="Edit Outfit"/>
<menu_item_call label="Editar mi anatomía" name="Edit My Shape"/>
+ <menu_item_call label="Altura del avatar" name="Hover Height"/>
<menu_item_call label="Mis amigos" name="Friends..."/>
<menu_item_call label="Mis grupos" name="Groups..."/>
<menu_item_call label="Mi perfil" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/es/menu_avatar_self.xml b/indra/newview/skins/default/xui/es/menu_avatar_self.xml
index 717b46ac74..d60a3434cf 100755
--- a/indra/newview/skins/default/xui/es/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/es/menu_avatar_self.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Mi apariencia" name="Chenge Outfit"/>
<menu_item_call label="Editar mi vestuario" name="Edit Outfit"/>
<menu_item_call label="Editar mi anatomía" name="Edit My Shape"/>
+ <menu_item_call label="Altura del avatar" name="Hover Height"/>
<menu_item_call label="Mis amigos" name="Friends..."/>
<menu_item_call label="Mis grupos" name="Groups..."/>
<menu_item_call label="Mi perfil" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/es/menu_inventory.xml b/indra/newview/skins/default/xui/es/menu_inventory.xml
index cd5bc7917d..5d108abf67 100755
--- a/indra/newview/skins/default/xui/es/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/es/menu_inventory.xml
@@ -1,5 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
+ <menu_item_call label="Crear artículos" name="Marketplace Create Listing"/>
+ <menu_item_call label="Asociar artículos" name="Marketplace Associate Listing"/>
+ <menu_item_call label="Obtener (actualizar) artículos" name="Marketplace Get Listing"/>
+ <menu_item_call label="Comprobar errores" name="Marketplace Check Listing"/>
+ <menu_item_call label="Editar artículos" name="Marketplace Edit Listing"/>
+ <menu_item_call label="Incluir en la lista" name="Marketplace List"/>
+ <menu_item_call label="Retirar de la lista" name="Marketplace Unlist"/>
+ <menu_item_call label="Activar" name="Marketplace Activate"/>
+ <menu_item_call label="Desactivar" name="Marketplace Deactivate"/>
<menu_item_call label="Compartir" name="Share"/>
<menu_item_call label="Comprar" name="Task Buy"/>
<menu_item_call label="Abrir" name="Task Open"/>
@@ -86,6 +95,7 @@
<menu_item_call label="Añadir" name="Wearable Add"/>
<menu_item_call label="Quitarse" name="Take Off"/>
<menu_item_call label="Copiar al Buzón de salida de comerciante" name="Merchant Copy"/>
- <menu_item_call label="Enviar al Mercado" name="Marketplace Send"/>
+ <menu_item_call label="Copiar en artículos del Mercado" name="Marketplace Copy"/>
+ <menu_item_call label="Mover a artículos del Mercado" name="Marketplace Move"/>
<menu_item_call label="--sin opciones--" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml
index 0e9644629e..c24910066b 100755
--- a/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml
@@ -5,7 +5,7 @@
<menu_item_check label="Ordenar por los más recientes" name="sort_by_recent"/>
<menu_item_check label="Ordenar las carpetas siempre alfabéticamente" name="sort_folders_by_name"/>
<menu_item_check label="Las carpetas del sistema, arriba" name="sort_system_folders_to_top"/>
- <menu_item_call label="Ver los filtros" name="show_filters"/>
+ <menu_item_call label="Ver los filtros..." name="show_filters"/>
<menu_item_call label="Restablecer los filtros" name="reset_filters"/>
<menu_item_call label="Cerrar todas las carpetas" name="close_folders"/>
<menu_item_call label="Vaciar Objetos Perdidos" name="empty_lostnfound"/>
diff --git a/indra/newview/skins/default/xui/es/menu_marketplace_view.xml b/indra/newview/skins/default/xui/es/menu_marketplace_view.xml
new file mode 100644
index 0000000000..c46a9f490e
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_marketplace_view.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_marketplace_sort">
+ <menu_item_check label="Ordenar por cantidad en stock (de baja a alta)" name="sort_by_stock_amount"/>
+ <menu_item_check label="Mostrar solamente las carpetas de artículos" name="show_only_listing_folders"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_experience.xml b/indra/newview/skins/default/xui/es/menu_url_experience.xml
new file mode 100644
index 0000000000..a18cb0e8e8
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_experience.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index 9596a8277e..f6ebb498ec 100755
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -8,19 +8,21 @@
<menu_item_call label="Nueva ventana del inventario" name="NewInventoryWindow"/>
<menu_item_call label="Lugares..." name="Places"/>
<menu_item_call label="Destacados..." name="Picks"/>
+ <menu_item_call label="Experiencias..." name="Experiences"/>
<menu_item_call label="Controles de la cámara..." name="Camera Controls"/>
<menu label="Movimiento" name="Movement">
<menu_item_call label="Sentarte" name="Sit Down Here"/>
<menu_item_check label="Volar" name="Fly"/>
<menu_item_check label="Correr siempre" name="Always Run"/>
<menu_item_call label="Parar mis animaciones" name="Stop Animating My Avatar"/>
- <menu_item_call label="Caminar / Correr / Volar..." name="Walk / run / fly"/>
+ <menu_item_call label="Caminar / Correr / Volar..." name="WalkRunFly"/>
</menu>
<menu label="Estado" name="Status">
<menu_item_check label="Ausente" name="Away"/>
<menu_item_check label="No molestar" name="Do Not Disturb"/>
</menu>
<menu_item_call label="Comprar L$..." name="Buy and Sell L$"/>
+ <menu_item_call label="Artículos del Mercado..." name="MarketplaceListings"/>
<menu_item_call label="Panel de control de la cuenta..." name="Manage My Account">
<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es"/>
</menu_item_call>
@@ -47,7 +49,7 @@
<menu_item_check label="Amigos" name="My Friends"/>
<menu_item_check label="Grupos" name="My Groups"/>
<menu_item_check label="Gente cerca" name="Active Speakers"/>
- <menu_item_call label="Lista de ignorados" name="Block List"/>
+ <menu_item_check label="Lista de ignorados" name="Block List"/>
<menu_item_check label="No molestar" name="Do Not Disturb"/>
</menu>
<menu label="Mundo" name="World">
@@ -61,7 +63,7 @@
<menu_item_call label="Foto" name="Take Snapshot"/>
<menu_item_call label="Perfil del lugar" name="Place Profile"/>
<menu_item_call label="Acerca del terreno" name="About Land"/>
- <menu_item_call label="Región/Estado" name="Region/Estate"/>
+ <menu_item_call label="Región/Estado" name="RegionEstate"/>
<menu_item_call label="Mis terrenos..." name="My Land"/>
<menu_item_call label="Comprar este terreno" name="Buy Land"/>
<menu label="Mostrar" name="LandShow">
@@ -248,6 +250,7 @@
<menu_item_check label="Texture Console" name="Texture Console"/>
<menu_item_check label="Debug Console" name="Debug Console"/>
<menu_item_call label="Notifications Console" name="Notifications"/>
+ <menu_item_check label="Consola de depuración de región" name="Region Debug Console"/>
<menu_item_check label="Fast Timers" name="Fast Timers"/>
<menu_item_check label="Memory" name="Memory"/>
<menu_item_check label="Datos de la escena" name="Scene Statistics"/>
@@ -323,7 +326,7 @@
<menu label="Red" name="Network">
<menu_item_check label="Pause Avatar" name="AgentPause"/>
<menu_item_call label="Drop a Packet" name="Drop a Packet"/>
- </menu>
+ </menu>
<menu label="Mundo virtual" name="DevelopWorld">
<menu_item_check label="Anular el sol del Sim" name="Sim Sun Override"/>
<menu_item_check label="Meteorología fija" name="Fixed Weather"/>
diff --git a/indra/newview/skins/default/xui/es/mime_types.xml b/indra/newview/skins/default/xui/es/mime_types.xml
index 85ff4cfb48..eb212344ce 100755
--- a/indra/newview/skins/default/xui/es/mime_types.xml
+++ b/indra/newview/skins/default/xui/es/mime_types.xml
@@ -27,7 +27,7 @@
No hay contenido
</label>
<tooltip name="none_tooltip">
- Aquí no hay multimedia
+ Aquí no hay contenido multimedia
</tooltip>
</widgetset>
<widgetset name="image">
diff --git a/indra/newview/skins/default/xui/es/mime_types_linux.xml b/indra/newview/skins/default/xui/es/mime_types_linux.xml
index 77d05934f4..e5887e7d96 100755
--- a/indra/newview/skins/default/xui/es/mime_types_linux.xml
+++ b/indra/newview/skins/default/xui/es/mime_types_linux.xml
@@ -44,6 +44,14 @@
Oír el audio de este sitio
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ No hay contenido
+ </label>
+ <tooltip name="none_tooltip">
+ Aquí no hay contenido multimedia
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Streaming en &apos;Real Time&apos;
diff --git a/indra/newview/skins/default/xui/es/mime_types_mac.xml b/indra/newview/skins/default/xui/es/mime_types_mac.xml
index 77d05934f4..e5887e7d96 100755
--- a/indra/newview/skins/default/xui/es/mime_types_mac.xml
+++ b/indra/newview/skins/default/xui/es/mime_types_mac.xml
@@ -44,6 +44,14 @@
Oír el audio de este sitio
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ No hay contenido
+ </label>
+ <tooltip name="none_tooltip">
+ Aquí no hay contenido multimedia
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Streaming en &apos;Real Time&apos;
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index 01407dc69e..1e367b33fc 100755
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -73,6 +73,10 @@ Detalles del error: la notificación de nombre &apos;[_NAME]&apos; no se ha enco
[MESSAGE]
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
</notification>
+ <notification name="GenericAlertOK">
+ [MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="BadInstallation">
Ha habido un error actualizando [APP_NAME]. Por favor, [http://get.secondlife.com descarga la última versión] del Visor.
<usetemplate name="okbutton" yestext="OK"/>
@@ -125,6 +129,88 @@ No se han enviado carpetas al Mercado a causa de un error del sistema o de la re
La inicialización del mercado ha fallado por un error del sistema o de la red. Vuelve a intentarlo más tarde.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="StockPasteFailed">
+ Ha ocurrido el siguiente error al copiar o mover a la carpeta de stock:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantPasteFailed">
+ Ha ocurrido el siguiente error al copiar o mover a artículos del Mercado:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantTransactionFailed">
+ La transacción con el Mercado ha fallado por el siguiente error:
+
+ Motivo: &apos;[ERROR_REASON]&apos;
+ [ERROR_DESCRIPTION]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantUnprocessableEntity">
+ No hemos podido incluir este producto en tus artículos o activar la carpeta de versión. Normalmente esto ocurre porque falta información en el formulario de descripción de los artículos, aunque también puede deberse a errores en la estructura de carpetas. Puedes editar los artículos o comprobar si la carpeta de artículos tiene algún error.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantListingFailed">
+ Ha ocurrido el siguiente error en la lista de artículos del Mercado:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantFolderActivationFailed">
+ Ha ocurrido el siguiente error al activar esta carpeta de versión:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantActiveChange">
+ Esta acción cambiará el contenido activo de esta lista de artículos. ¿Quieres continuar?
+ <usetemplate ignoretext="Confirmar antes de que cambie una lista de artículos activa en el Mercado" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantMoveInventory">
+ Los artículos arrastrados a la ventana Artículos del mercado se mueven desde sus ubicaciones originales, no se copian. ¿Quieres continuar?
+ <usetemplate ignoretext="Confirmar antes de mover un artículo desde el inventario al Mercado" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmListingCutOrDelete">
+ Al mover o eliminar una carpeta de artículos, se eliminarán tus artículos del Mercado. Si deseas conservar los artículos del Mercado, mueve o elimina el contenido de la carpeta de versión que desees modificar. ¿Quieres continuar?
+ <usetemplate ignoretext="Confirmar antes de que mueva o elimine una lista de artículos del Mercado" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmCopyToMarketplace">
+ No tienes permiso para copiar uno o varios de estos artículos en el Mercado. Puedes moverlos o dejártelos.
+ <usetemplate canceltext="Cancelar" ignoretext="Confirmar cuando intente copiar una selección que contiene artículos que no se pueden copiar en el Mercado" name="yesnocancelbuttons" notext="No mover objeto(s)" yestext="Mover objeto(s)"/>
+ </notification>
+ <notification name="ConfirmMerchantUnlist">
+ Esta acción retirará esta lista de artículos. ¿Quieres continuar?
+ <usetemplate ignoretext="Confirmar antes de que retire una lista de artículos activa en el Mercado" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantClearVersion">
+ Esta acción desactivará la carpeta de versión de la lista de artículos actual. ¿Quieres continuar?
+ <usetemplate ignoretext="Confirmar antes de que desactive la carpeta de versión de una lista de artículos del Mercado" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantListingNotUpdated">
+ No se ha podido actualizar esta lista de artículos.
+[[URL] Haz clic aquí] para editarla en el Mercado.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantListingCannotWear">
+ No puedes ponerte prendas ni partes del cuerpo que se encuentren en la carpeta Artículos del mercado.
+ </notification>
+ <notification name="AlertMerchantListingInvalidID">
+ Id. de lista de artículos no válida
+ </notification>
+ <notification name="AlertMerchantListingActivateRequired">
+ Esta lista de artículos contiene varias carpetas de versión o ninguna. Tendrás que seleccionar y activar una por tu cuenta más tarde.
+ <usetemplate ignoretext="Mostrar una alerta de la activación de la carpeta de versión cuando cree una lista de artículos con varias carpetas de versión" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderSplit">
+ Hemos separado los artículos en stock de diferentes tipos en carpetas distintas, para que tu carpeta esté organizada de tal forma que podamos incluirla en el Mercado.
+ <usetemplate ignoretext="Mostrar alerta cuando la carpeta de stock se divida antes de incluirla en la lista" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderEmpty">
+ Hemos retirado tu lista de artículos porque el stock está vacío. Para volver a publicar tus artículos, añade más unidades a la carpeta de stock.
+ <usetemplate ignoretext="Mostrar alerta cuando una lista de artículos se retire porque la carpeta de stock está vacía" name="okignore" yestext="OK"/>
+ </notification>
<notification name="CompileQueueSaveText">
Hubo un problema al subir el texto de un script por la siguiente razón: [REASON]. Por favor, inténtalo más tarde.
</notification>
@@ -464,6 +550,10 @@ o hacer una puja?
¿Guardar los cambios?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardar" yestext="Guardar"/>
</notification>
+ <notification name="DeleteNotecard">
+ ¿Deseas borrar la nota?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="GestureSaveFailedTooManySteps">
Fallo al guardar el gesto.
Este gesto tiene demasiados pasos.
@@ -570,6 +660,9 @@ La calidad gráfica puede ajustarse en Preferencias &gt; Gráficos.
<notification name="RegionNoTerraforming">
En la región [REGION] no se permite modificar el terreno.
</notification>
+ <notification name="ParcelNoTerraforming">
+ No tienes permiso para modificar el terreno de la parcela [PARCEL].
+ </notification>
<notification name="CannotCopyWarning">
No tienes permiso para copiar los elementos siguientes:
[ITEMS] y, si los das, los perderás del inventario. ¿Seguro que quieres ofrecerlos?
@@ -1834,6 +1927,30 @@ Se cambiarán miles de regiones, y se provocará un colapso en el espacio del se
¿Remover al administrador del estado sólo para este estado o para [ALL_ESTATES]?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
</notification>
+ <notification label="Seleccionar estado" name="EstateAllowedExperienceAdd">
+ ¿Añadir a la lista de permitidos solamente en este estado o en [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar estado" name="EstateAllowedExperienceRemove">
+ ¿Quitar de la lista de permitidos solamente en este estado o en [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar estado" name="EstateBlockedExperienceAdd">
+ ¿Añadir a la lista de bloqueados solamente en este estado o en [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar estado" name="EstateBlockedExperienceRemove">
+ ¿Quitar de la lista de bloqueados solamente en este estado o en [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar estado" name="EstateTrustedExperienceAdd">
+ ¿Añadir a la lista de claves solamente en este estado o en [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar estado" name="EstateTrustedExperienceRemove">
+ ¿Quitar de la lista de claves solamente en este estado o en [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
<notification label="Confirmar la expulsión" name="EstateKickUser">
¿Echar a [EVIL_USER] de este estado?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
@@ -1846,6 +1963,9 @@ Se cambiarán miles de regiones, y se provocará un colapso en el espacio del se
Tus preferencias de contenido actuales te impiden visitar la región que has seleccionado. Puedes cambiar las preferencias en Yo &gt; Preferencias &gt; General.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="SLM_UPDATE_FOLDER">
+ [MESSAGE]
+ </notification>
<notification name="RegionEntryAccessBlocked_AdultsOnlyContent">
La región que intentas visitar tiene un contenido [REGIONMATURITY], que solo es accesible para los adultos.
<url name="url">
@@ -1908,6 +2028,10 @@ Se cambiarán miles de regiones, y se provocará un colapso en el espacio del se
Estamos experimentando dificultades técnicas con el teleporte porque tus preferencias no están sincronizadas con el servidor.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="RegionTPSpecialUsageBlocked">
+ No puedes entrar en la región. &apos;[REGION_NAME]&apos; es una región de juegos de habilidad, y debes cumplir determinados criterios para poder entrar en ella. Consulta los detalles en las [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life P+F de juegos de habilidad].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="PreferredMaturityChanged">
No recibirás más notificaciones cuando vayas a visitar una región con un contenido [RATING]. En el futuro, puedes cambiar tus preferencias de contenido en Yo &gt; Preferencias &gt; General en la barra de menús.
<usetemplate name="okbutton" yestext="OK"/>
@@ -2130,6 +2254,10 @@ Dado que estos objetos tienen scripts, moverlos a tu inventario puede provocar u
<ignore name="ignore" text="He establecido la acción &apos;Pagar al objeto&apos; cuando construyo uno sin un script money()"/>
</form>
</notification>
+ <notification name="PayConfirmation">
+ Confirma que deseas pagar L$[AMOUNT] a [TARGET].
+ <usetemplate ignoretext="Confirmar antes de pagar (sumas mayores de 200 L$)" name="okcancelignore" notext="Cancelar" yestext="Pagar"/>
+ </notification>
<notification name="OpenObjectCannotCopy">
En este objeto, no hay ítems que estés autorizado a copiar.
</notification>
@@ -2214,6 +2342,9 @@ Linden Lab
<button ignore="Nunca reemplazar" name="No" text="Cancelar"/>
</form>
</notification>
+ <notification name="TooManyWearables">
+ No puedes tener una carpeta de prendas que contenga más de [AMOUNT] elementos. Puedes cambiar este límite en Avanzado &gt; Mostrar las configuraciones del depurador &gt; WearFolderLimit.
+ </notification>
<notification label="Advertencia del modo No molestar" name="DoNotDisturbModePay">
Tienes activado No molestar. No podrás recibir ningún objeto ofrecido a cambio de este pago.
@@ -2665,9 +2796,6 @@ Por favor, vuelve a intentarlo en unos momentos.
<notification name="NoValidCircuit">
Circuito de código inválido.
</notification>
- <notification name="NoValidTimestamp">
- Fecha inválida.
- </notification>
<notification name="NoPendingConnection">
No se puede crear la conexión.
</notification>
@@ -2822,7 +2950,7 @@ Si permaneces en esta región serás desconectado.
[MESSAGE]
-Del objeto: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, propietario: [NAME]?
+Del objeto: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, propietario: [NAME]
<form name="form">
<button name="Gotopage" text="Cargar"/>
<button name="Cancel" text="Cancelar"/>
@@ -2848,6 +2976,72 @@ Del objeto: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, propietario: [NAME]?
<button name="Mute" text="Ignorar"/>
</form>
</notification>
+ <notification name="ExperienceAcquireFailed">
+ No se puede adquirir una experiencia nueva:
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NotInGroupExperienceProfileMessage">
+ Se ha omitido un cambio en el grupo de la experiencia porque el propietario no es miembro del grupo seleccionado.
+ </notification>
+ <notification name="UneditableExperienceProfileMessage">
+ El campo no modificable &apos;[field]&apos; se ha omitido al actualizar el perfil de la experiencia.
+ </notification>
+ <notification name="RestrictedToOwnerExperienceProfileMessage">
+ Cambios omitidos en el campo &apos;[field]&apos; que solo puede configurar el propietario de la experiencia.
+ </notification>
+ <notification name="MaturityRatingExceedsOwnerExperienceProfileMessage">
+ No puedes definir un nivel de calificación de una experiencia superior al establecido por el propietario.
+ </notification>
+ <notification name="RestrictedTermExperienceProfileMessage">
+ Las condiciones siguientes han impedido la actualización del nombre o la descripción del perfil de la experiencia: [extra_info]
+ </notification>
+ <notification name="TeleportedHomeExperienceRemoved">
+ Te has teleportado desde la región [region_name] porque al quitar la experiencia secondlife:///app/experience/[public_id]/profile ya no tienes permiso para entrar en la región.
+ <form name="form">
+ <ignore name="ignore" text="Expulsado de la región por quitar una experiencia"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperienceEntry">
+ La participación en la experiencia clave secondlife:///app/experience/[public_id]/profile te otorga permiso para entrar en la región [region_name]. Si quitas esta experiencia, puede que te expulsen de la región.
+ <form name="form">
+ <ignore name="ignore" text="Admitido en una región por una experiencia"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperiencesAvailable">
+ No tienes permiso de acceso a este destino. Puedes obtener el permiso para entrar en la región si aceptas una de las siguientes experiencias:
+
+[EXPERIENCE_LIST]
+
+Pueden estar disponibles otras experiencias clave.
+ </notification>
+ <notification name="ExperienceEvent">
+ La experiencia secondlife:///app/experience/[public_id]/profile permitió la siguiente operación con un objeto: [EventType].
+ Propietario: secondlife:///app/agent/[OwnerID]/inspect
+ Nombre del objeto: [ObjectName]
+ Nombre de la parcela: [ParcelName]
+ </notification>
+ <notification name="ExperienceEventAttachment">
+ La experiencia secondlife:///app/experience/[public_id]/profile permitió la siguiente operación con un anexo: [EventType].
+ Propietario: secondlife:///app/agent/[OwnerID]/inspect
+ </notification>
+ <notification name="ScriptQuestionExperience">
+ &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, un objeto de propiedad de &apos;[NAME]&apos;, solicita tu participación en la experiencia [GRID_WIDE]:
+
+[EXPERIENCE]
+
+Una vez concedido el permiso, este mensaje no volverá a aparecer para la experiencia salvo que se revoque en el perfil de la experiencia.
+
+Los scripts asociados a esta experiencia podrán hacer lo siguiente en las regiones donde la experiencia esté activa:
+
+[QUESTIONS]¿Lo aceptas?
+ <form name="form">
+ <button name="BlockExperience" text="Bloquear experiencia"/>
+ <button name="Mute" text="Bloquear objeto"/>
+ <button name="Yes" text="Sí"/>
+ <button name="No" text="No"/>
+ </form>
+ </notification>
<notification name="ScriptQuestionCaution">
Atención: El objeto &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; solicita un acceso pleno a tu cuenta de dólares Linden. Si le autorizas el acceso, podrá retirar fondos de tu cuenta en cualquier momento o vaciarla por completo, cuando lo desee y sin más advertencias.
@@ -3160,6 +3354,10 @@ Has actualizado una textura obtenida mediante bake de [RESOLUTION] para &apos;[B
( [EXISTENCE] segundos con vida )
Has actualizado de manera local una textura obtenida mediante bake de [RESOLUTION] para &apos;[BODYREGION]&apos; después de [TIME] segundos.
</notification>
+ <notification name="CannotUploadTexture">
+ No se puede subir la textura.
+[REASON]
+ </notification>
<notification name="LivePreviewUnavailable">
No se puede mostrar una vista previa de esta textura porque es de tipo &apos;no copiable&apos; y/o &apos;no transferible&apos;.
<usetemplate ignoretext="Advertirme si el modo Vista previa inmediata no está disponible para las texturas &apos;no copiable&apos; y/o &apos;no transferible&apos;" name="okignore" yestext="OK"/>
@@ -3732,9 +3930,11 @@ Prueba otra vez dentro de un minuto.
</notification>
<notification name="TeleportedByAttachment">
Has sido teleportado por un anexo de [ITEM_ID]
+ <usetemplate ignoretext="Teleportarme: has sido teleportado por un anexo" name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOnParcel">
Has sido teleportado por el objeto &apos;[OBJECT_NAME]&apos; de la parcela &apos;[PARCEL_NAME]&apos;
+ <usetemplate ignoretext="Teleportarme: has sido teleportado por un objeto de una parcela" name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOwnedBy">
Has sido teleportado por el objeto &apos;[OBJECT_NAME]&apos; que es propiedad de [OWNER_ID]
@@ -4066,7 +4266,7 @@ Prueba a seleccionar un terreno más pequeño.
<usetemplate ignoretext="No se pueden mover los archivos. Ruta anterior restaurada." name="okignore" yestext="OK"/>
</notification>
<notification name="DefaultObjectPermissions">
- Ha ocurrido un problema al guardar los permisos predeterminados por el siguiente motivo: [REASON]. Intenta configurar los permisos predeterminados más adelante.
+ Ha ocurrido un problema al guardar los permisos de objeto predeterminados: [REASON]. Intenta configurar los permisos predeterminados más adelante.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ChatHistoryIsBusyAlert">
diff --git a/indra/newview/skins/default/xui/es/panel_experience_info.xml b/indra/newview/skins/default/xui/es/panel_experience_info.xml
new file mode 100644
index 0000000000..85fc94ebdc
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_experience_info.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_experience_info">
+ <text name="title" value="Perfil de experiencia"/>
+ <scroll_container name="xp_scroll">
+ <panel name="scrolling_panel">
+ <layout_stack>
+ <layout_panel>
+ <text name="experience_title" value="Kyle&apos;s Superhero RPG"/>
+ </layout_panel>
+ <layout_panel name="location panel">
+ <text name="Location">
+ Ubicación:
+ </text>
+ <text name="LocationTextText">
+ algún lugar
+ </text>
+ <button label="Teleportarte" name="teleport_btn"/>
+ <button label="Mapa" name="map_btn"/>
+ </layout_panel>
+ <layout_panel name="marketplace panel">
+ <text name="Location">
+ Tienda del Mercado:
+ </text>
+ <text name="LocationTextText">
+ algún lugar
+ </text>
+ </layout_panel>
+ <layout_panel>
+ <text name="ContentRating">
+ Calificación:
+ </text>
+ <text name="ContentRatingText">
+ Adulto
+ </text>
+ <text name="Owner">
+ Propietario:
+ </text>
+ <text name="OwnerText">
+ Kyle
+ </text>
+ <button label="Editar" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_experience_list_editor.xml b/indra/newview/skins/default/xui/es/panel_experience_list_editor.xml
new file mode 100644
index 0000000000..5cc1462605
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_experience_list_editor.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="experince_list_editor">
+ <panel.string name="loading">
+ cargando...
+ </panel.string>
+ <panel.string name="panel_allowed">
+ Experiencias permitidas:
+ </panel.string>
+ <panel.string name="panel_blocked">
+ Experiencias bloqueadas:
+ </panel.string>
+ <panel.string name="panel_trusted">
+ Experiencias clave:
+ </panel.string>
+ <panel.string name="no_results">
+ (vacío)
+ </panel.string>
+ <text name="text_name">
+ Lista de experiencias
+ </text>
+ <scroll_list name="experience_list">
+ <columns label="Nombre" name="experience_name"/>
+ </scroll_list>
+ <button label="Añadir..." name="btn_add"/>
+ <button label="Eliminar" name="btn_remove"/>
+ <button label="Perfil..." name="btn_profile"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_experience_list_item.xml b/indra/newview/skins/default/xui/es/panel_experience_list_item.xml
new file mode 100644
index 0000000000..bd2e146223
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_experience_list_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiences">
+ <text name="experience_name">
+ Nombre ficticio
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_experience_log.xml b/indra/newview/skins/default/xui/es/panel_experience_log.xml
new file mode 100644
index 0000000000..54d0f0fc44
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_experience_log.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="EVENTS">
+ <string name="no_events" value="No hay eventos."/>
+ <string name="loading" value="cargando..."/>
+ <layout_stack>
+ <layout_panel>
+ <scroll_list name="experience_log_list">
+ <columns label="Hora" name="time"/>
+ <columns label="Evento" name="event"/>
+ <columns label="Experiencia" name="experience_name"/>
+ <columns label="Objeto" name="object_name"/>
+ </scroll_list>
+ <button label="Notificar" name="btn_notify"/>
+ <button label="Perfil" name="btn_profile_xp"/>
+ <button label="Denunciar" name="btn_report_xp"/>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <check_box label="Notificar todos los eventos Días" name="notify_all"/>
+ <button label="Limpiar" name="btn_clear"/>
+ <button label="&lt;" name="btn_prev"/>
+ <button label="&gt;" name="btn_next"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_experience_search.xml b/indra/newview/skins/default/xui/es/panel_experience_search.xml
new file mode 100644
index 0000000000..bb05ada5b9
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_experience_search.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="SEARCH">
+ <string name="not_found">
+ &apos;[TEXT]&apos; no encontrado
+ </string>
+ <string name="no_results">
+ No hay resultados
+ </string>
+ <string name="searching">
+ Buscando...
+ </string>
+ <string name="loading">
+ Cargando...
+ </string>
+ <string name="maturity_icon_general">
+ &quot;Parcel_PG_Light&quot;
+ </string>
+ <string name="maturity_icon_moderate">
+ &quot;Parcel_M_Light&quot;
+ </string>
+ <string name="maturity_icon_adult">
+ &quot;Parcel_R_Light&quot;
+ </string>
+ <panel name="search_panel">
+ <button label="Ir" name="find"/>
+ <icons_combo_box label="Moderado" name="maturity">
+ <icons_combo_box.item label="Adulto" name="Adult" value="42"/>
+ <icons_combo_box.item label="Moderado" name="Mature" value="21"/>
+ <icons_combo_box.item label="General" name="PG" value="13"/>
+ </icons_combo_box>
+ <scroll_list name="search_results">
+ <columns label="Nombre" name="experience_name"/>
+ <columns label="Propietario" name="owner"/>
+ </scroll_list>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Ver el perfil" name="profile_btn"/>
+ <button label="&lt;" name="left_btn"/>
+ <button label="&gt;" name="right_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_experiences.xml b/indra/newview/skins/default/xui/es/panel_experiences.xml
new file mode 100644
index 0000000000..182981fcb0
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_experiences.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiences">
+ <string name="loading_experiences" value="Cargando experiencias..."/>
+ <string name="no_experiences" value="No hay experiencias."/>
+ <string name="acquire" value="Adquirir una experiencia"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_facebook_friends.xml b/indra/newview/skins/default/xui/es/panel_facebook_friends.xml
index 6913e87aba..5557c0a73c 100644
--- a/indra/newview/skins/default/xui/es/panel_facebook_friends.xml
+++ b/indra/newview/skins/default/xui/es/panel_facebook_friends.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_friends">
<string name="facebook_friends_empty" value="Actualmente no tienes amigos en Facebook que también sean residentes de Second Life. Invita a tus amigos de Facebook a que se unan a Second Life."/>
- <string name="facebook_friends_no_connected" value="Actualmente no estás conectado a Facebook. Selecciona la pestaña Cuenta para conectarte y habilitar esta función."/>
+ <string name="facebook_friends_no_connected" value="Actualmente no estás conectado a Facebook. Selecciona la pestaña Estado para conectarte y habilitar esta función."/>
<accordion name="friends_accordion">
<accordion_tab name="tab_second_life_friends" title="Amigos de SL"/>
<accordion_tab name="tab_suggested_friends" title="Agregar estas personas como amigos de SL"/>
diff --git a/indra/newview/skins/default/xui/es/panel_facebook_photo.xml b/indra/newview/skins/default/xui/es/panel_facebook_photo.xml
index f9e7265d34..5a533f8bcb 100644
--- a/indra/newview/skins/default/xui/es/panel_facebook_photo.xml
+++ b/indra/newview/skins/default/xui/es/panel_facebook_photo.xml
@@ -1,26 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Resolución de imagen">
- <combo_box.item label="Ventana actual" name="CurrentWindow"/>
- <combo_box.item label="640 × 480" name="640x480"/>
- <combo_box.item label="800 × 600" name="800x600"/>
- <combo_box.item label="1024 × 768" name="1024x768"/>
- <combo_box.item label="1200 × 630" name="1200x630"/>
- </combo_box>
- <combo_box name="filters_combobox" tool_tip="Filtros de imagen">
- <combo_box.item label="Sin filtro" name="NoFilter"/>
- </combo_box>
- <button label="Actualizar" name="new_snapshot_btn" tool_tip="Pulsa para actualizar"/>
- <button label="Vista previa" name="big_preview_btn" tool_tip="Pulsa para alternar entre vista previa sí/no"/>
- <text name="caption_label">
- Comentario (opcional):
- </text>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Publicar" name="post_photo_btn"/>
- <button label="Cancelar" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <combo_box name="resolution_combobox" tool_tip="Resolución de imagen">
+ <combo_box.item label="Ventana actual" name="CurrentWindow"/>
+ <combo_box.item label="640 × 480" name="640x480"/>
+ <combo_box.item label="800 × 600" name="800x600"/>
+ <combo_box.item label="1024 × 768" name="1024x768"/>
+ <combo_box.item label="1200 × 630" name="1200x630"/>
+ </combo_box>
+ <combo_box name="filters_combobox" tool_tip="Filtros de imagen">
+ <combo_box.item label="Sin filtro" name="NoFilter"/>
+ </combo_box>
+ <button label="Actualizar" name="new_snapshot_btn" tool_tip="Pulsa para actualizar"/>
+ <button label="Vista previa" name="big_preview_btn" tool_tip="Pulsa para alternar entre vista previa sí/no"/>
+ <text name="caption_label">
+ Comentario (opcional):
+ </text>
+ <button label="Publicar" name="post_photo_btn"/>
+ <button label="Cancelar" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_facebook_place.xml b/indra/newview/skins/default/xui/es/panel_facebook_place.xml
index 639825818a..5139bd1d0b 100644
--- a/indra/newview/skins/default/xui/es/panel_facebook_place.xml
+++ b/indra/newview/skins/default/xui/es/panel_facebook_place.xml
@@ -1,17 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_place">
- <layout_stack name="stack_place">
- <layout_panel name="place_detail_panel">
- <text name="place_caption_label">
- Cuenta algo del lugar donde te encuentras:
- </text>
- </layout_panel>
- <layout_panel name="place_map_panel">
- <check_box initial_value="false" label="" name="add_place_view_cb"/>
- </layout_panel>
- <layout_panel name="place_button_panel">
- <button label="Publicar" name="post_place_btn"/>
- <button label="Cancelar" name="cancel_place_btn"/>
- </layout_panel>
- </layout_stack>
+ <text name="place_caption_label">
+ Cuenta algo del lugar donde te encuentras:
+ </text>
+ <check_box initial_value="false" label="Incluir una vista general del lugar" name="add_place_view_cb"/>
+ <button label="Publicar" name="post_place_btn"/>
+ <button label="Cancelar" name="cancel_place_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_facebook_status.xml b/indra/newview/skins/default/xui/es/panel_facebook_status.xml
index dfaf4089fc..e6f137b750 100644
--- a/indra/newview/skins/default/xui/es/panel_facebook_status.xml
+++ b/indra/newview/skins/default/xui/es/panel_facebook_status.xml
@@ -1,14 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_status">
- <layout_stack name="stack_status">
- <layout_panel name="status_detail_panel">
- <text name="status_caption_label">
- ¿En qué estás pensando?
- </text>
- </layout_panel>
- <layout_panel name="status_button_panel">
- <button label="Publicar" name="post_status_btn"/>
- <button label="Cancelar" name="cancel_status_btn"/>
- </layout_panel>
- </layout_stack>
+ <string name="facebook_connected" value="Estás conectado a Facebook como:"/>
+ <string name="facebook_disconnected" value="No conectado a Facebook"/>
+ <text name="account_caption_label">
+ No conectado a Facebook.
+ </text>
+ <panel name="panel_buttons">
+ <button label="Conectar..." name="connect_btn"/>
+ <button label="Desconectar" name="disconnect_btn"/>
+ <text name="account_learn_more_label">
+ [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 Aprende a publicar en Facebook]
+ </text>
+ </panel>
+ <text name="status_caption_label">
+ ¿En qué estás pensando?
+ </text>
+ <button label="Publicar" name="post_status_btn"/>
+ <button label="Cancelar" name="cancel_status_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_flickr_photo.xml b/indra/newview/skins/default/xui/es/panel_flickr_photo.xml
index 465e80667b..fe80199355 100644
--- a/indra/newview/skins/default/xui/es/panel_flickr_photo.xml
+++ b/indra/newview/skins/default/xui/es/panel_flickr_photo.xml
@@ -1,41 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_flickr_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Resolución de imagen">
- <combo_box.item label="Ventana actual" name="CurrentWindow"/>
- <combo_box.item label="640 × 480" name="640x480"/>
- <combo_box.item label="800 × 600" name="800x600"/>
- <combo_box.item label="1024 × 768" name="1024x768"/>
- </combo_box>
- <combo_box name="filters_combobox" tool_tip="Filtros de imagen">
- <combo_box.item label="Sin filtro" name="NoFilter"/>
- </combo_box>
- <button label="Actualizar" name="new_snapshot_btn" tool_tip="Pulsa para actualizar"/>
- <button label="Vista previa" name="big_preview_btn" tool_tip="Pulsa para alternar entre vista previa sí/no"/>
- <text name="title_label">
- Título:
- </text>
- <text name="description_label">
- Descripción:
- </text>
- <check_box initial_value="true" label="Incluir la ubicación de SL al final de la descripción" name="add_location_cb"/>
- <text name="tags_label">
- Etiquetas:
- </text>
- <text name="tags_help_label">
- Separa las etiquetas con espacios
+ <combo_box name="resolution_combobox" tool_tip="Resolución de imagen">
+ <combo_box.item label="Ventana actual" name="CurrentWindow"/>
+ <combo_box.item label="640 × 480" name="640x480"/>
+ <combo_box.item label="800 × 600" name="800x600"/>
+ <combo_box.item label="1024 × 768" name="1024x768"/>
+ </combo_box>
+ <combo_box name="filters_combobox" tool_tip="Filtros de imagen">
+ <combo_box.item label="Sin filtro" name="NoFilter"/>
+ </combo_box>
+ <button label="Actualizar" name="new_snapshot_btn" tool_tip="Pulsa para actualizar"/>
+ <button label="Vista previa" name="big_preview_btn" tool_tip="Pulsa para alternar entre vista previa sí/no"/>
+ <text name="title_label">
+ Título:
+ </text>
+ <text name="description_label">
+ Descripción:
+ </text>
+ <check_box initial_value="true" label="Incluir la ubicación de SL al final de la descripción" name="add_location_cb"/>
+ <text name="tags_label">
+ Etiquetas:
+ </text>
+ <text name="tags_help_label">
+ Separa las etiquetas con espacios
Usa &quot;&quot; para las etiquetas con varias palabras
- </text>
- <combo_box name="rating_combobox" tool_tip="Calificación de contenido de Flickr">
- <combo_box.item label="Calificación segura de Flickr" name="SafeRating"/>
- <combo_box.item label="Calificación moderada de Flickr" name="ModerateRating"/>
- <combo_box.item label="Calificación restringida de Flickr" name="RestrictedRating"/>
- </combo_box>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Subir" name="post_photo_btn"/>
- <button label="Cancelar" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ </text>
+ <combo_box name="rating_combobox" tool_tip="Calificación de contenido de Flickr">
+ <combo_box.item label="Calificación segura de Flickr" name="SafeRating"/>
+ <combo_box.item label="Calificación moderada de Flickr" name="ModerateRating"/>
+ <combo_box.item label="Calificación restringida de Flickr" name="RestrictedRating"/>
+ </combo_box>
+ <button label="Subir" name="post_photo_btn"/>
+ <button label="Cancelar" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/es/panel_group_info_sidetray.xml
index 18eaa834da..8d8f3a9bbb 100755
--- a/indra/newview/skins/default/xui/es/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/es/panel_group_info_sidetray.xml
@@ -23,6 +23,7 @@
<accordion_tab name="group_roles_tab" title="Miembros y Roles"/>
<accordion_tab name="group_notices_tab" title="Avisos"/>
<accordion_tab name="group_land_tab" title="Terreno/Bienes"/>
+ <accordion_tab name="group_experiences_tab" title="Experiencias"/>
</accordion>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/es/panel_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml
index 253d0800e1..5300fce153 100755
--- a/indra/newview/skins/default/xui/es/panel_login.xml
+++ b/indra/newview/skins/default/xui/es/panel_login.xml
@@ -1,26 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_login">
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=es
- </panel.string>
+ <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=es</panel.string>
<layout_stack name="ui_stack">
<layout_panel name="ui_container">
<combo_box label="Nombre de usuario" name="username_combo" tool_tip="El nombre de usuario que elegiste al registrarte, como bobsmith12 o Steller Sunshine"/>
<line_editor label="Contraseña" name="password_edit"/>
- <check_box label="Recordarme" name="remember_check"/>
- <text name="forgot_password_text">
- Contraseña olvidada
- </text>
- <button label="Iniciar sesión" name="connect_btn"/>
- <text name="At_My_Last_Location_Label">
- en mi última posición
- </text>
<combo_box label="Mis lugares favoritos" name="start_location_combo">
+ <combo_box.item label="Mi última posición" name="MyLastLocation"/>
<combo_box.item label="Mi Base" name="MyHome"/>
</combo_box>
- <button label="Iniciar sesión" name="connect_favorite_btn"/>
- <line_editor label="Especifica una ubicación" name="location_edit"/>
- <button label="Iniciar sesión" name="connect_location_btn"/>
+ <button label="Iniciar sesión" name="connect_btn"/>
+ <check_box label="Recordarme" name="remember_check"/>
+ <text name="forgot_password_text">Contraseña olvidada</text>
<combo_box label="Seleccionar cuadrícula" name="server_combo"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/es/panel_marketplace_listings.xml b/indra/newview/skins/default/xui/es/panel_marketplace_listings.xml
new file mode 100644
index 0000000000..d9cd93b349
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_marketplace_listings.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Mercado" name="Marketplace Panel">
+ <panel name="tool_panel">
+ <menu_button name="sort_btn" tool_tip="Opciones de vista/orden"/>
+ <button name="add_btn" tool_tip="Crear una carpeta de artículos nueva"/>
+ <button label="Comprobar errores" name="audit_btn" tool_tip="Comprobar tus artículos del Mercado"/>
+ </panel>
+ <panel name="tab_container_panel">
+ <filter_editor label="Filtrar artículos del Mercado" name="filter_editor"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_marketplace_listings_inventory.xml b/indra/newview/skins/default/xui/es/panel_marketplace_listings_inventory.xml
new file mode 100644
index 0000000000..77540aee39
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_marketplace_listings_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="TODOS" name="All Items" tool_tip="Arrastra y suelta aquí los artículos para incluirlos en la lista de artículos"/>
diff --git a/indra/newview/skins/default/xui/es/panel_marketplace_listings_listed.xml b/indra/newview/skins/default/xui/es/panel_marketplace_listings_listed.xml
new file mode 100644
index 0000000000..ca8ff6aea9
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_marketplace_listings_listed.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="INCLUIDOS EN LA LISTA" name="Active Items"/>
diff --git a/indra/newview/skins/default/xui/es/panel_marketplace_listings_unassociated.xml b/indra/newview/skins/default/xui/es/panel_marketplace_listings_unassociated.xml
new file mode 100644
index 0000000000..2606e035cd
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_marketplace_listings_unassociated.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="SIN ASOCIAR" name="Unassociated Items"/>
diff --git a/indra/newview/skins/default/xui/es/panel_marketplace_listings_unlisted.xml b/indra/newview/skins/default/xui/es/panel_marketplace_listings_unlisted.xml
new file mode 100644
index 0000000000..ea568cab8a
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_marketplace_listings_unlisted.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="RETIRADOS DE LA LISTA" name="Inactive Items"/>
diff --git a/indra/newview/skins/default/xui/es/panel_postcard_settings.xml b/indra/newview/skins/default/xui/es/panel_postcard_settings.xml
index 3931319447..75bcd67f1f 100755
--- a/indra/newview/skins/default/xui/es/panel_postcard_settings.xml
+++ b/indra/newview/skins/default/xui/es/panel_postcard_settings.xml
@@ -7,17 +7,7 @@
<combo_box.item label="1024x768" name="1024x768"/>
<combo_box.item label="Personalizado" name="Custom"/>
</combo_box>
- <layout_stack name="postcard_image_params_ls">
- <layout_panel name="postcard_image_size_lp">
- <spinner label="Ancho" name="postcard_snapshot_width"/>
- <spinner label="Altura" name="postcard_snapshot_height"/>
- <check_box label="Mantener las proporciones" name="postcard_keep_aspect_check"/>
- </layout_panel>
- <layout_panel name="postcard_image_format_quality_lp">
- <slider label="Calidad de la imagen" name="image_quality_slider"/>
- <text name="image_quality_level">
- ([QLVL])
- </text>
- </layout_panel>
- </layout_stack>
+ <spinner label="Ancho × alto" name="postcard_snapshot_width"/>
+ <check_box label="Mantener las proporciones" name="postcard_keep_aspect_check"/>
+ <slider label="Calidad:" name="image_quality_slider"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
index 508bfbcd32..7ccad84b55 100755
--- a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
@@ -14,9 +14,9 @@
<text name="Web:">
Web:
</text>
- <radio_group name="use_external_browser">
- <radio_item label="Usar mi navegador (IE, Firefox, Safari)" name="external" tool_tip="Usa tu navegador por defecto para ayuda, enlaces web, etc. No es aconsejable si estás a pantalla completa." value="true"/>
- <radio_item label="Usar el navegador incorporado" name="internal" tool_tip="Usa el navegador incorporado para ayuda, enlaces web, etc. Este navegador se abre en una nueva ventana dentro de [APP_NAME]." value=""/>
+ <radio_group name="preferred_browser_behavior">
+ <radio_item label="Usar mi navegador (Chrome, Firefox, IE) para todos los enlaces" name="internal" tool_tip="Usa el navegador predeterminado para obtener ayuda, visitar enlaces web, etc. No es aconsejable si estás a pantalla completa." value="0"/>
+ <radio_item label="Usar el navegador integrado solo para los enlaces de Second Life" name="external" tool_tip="Usa el navegador predeterminado del sistema para obtener ayuda, visitar enlaces web, etc. El navegador integrado solo se utilizará para los enlaces de LindenLab/SecondLife." value="1"/>
</radio_group>
<check_box initial_value="true" label="Activar plugins" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Aceptar las &apos;cookies&apos;" name="cookies_enabled"/>
diff --git a/indra/newview/skins/default/xui/es/panel_region_experiences.xml b/indra/newview/skins/default/xui/es/panel_region_experiences.xml
new file mode 100644
index 0000000000..4b7f82d3fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_region_experiences.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiencias" name="Experiences">
+ <panel.string name="trusted_estate_text">
+ Cualquier experiencia puede ser clave.
+
+Las experiencias clave tienen permiso de ejecución en este estado.
+
+Además, si el estado no admite el acceso público, los residentes que participen en una experiencia clave pueden entrar en el estado y permanecer en él mientras se encuentren en dicha experiencia.
+ </panel.string>
+ <panel.string name="allowed_estate_text">
+ Solo se permiten las experiencias activas en el terreno.
+
+Las experiencias permitidas tienen permiso de ejecución en este estado.
+ </panel.string>
+ <panel.string name="blocked_estate_text">
+ Solo pueden bloquearse las experiencias activas en el Grid.
+
+Las experiencias bloqueadas no pueden ejecutarse en este estado.
+ </panel.string>
+ <panel.string name="estate_caption">
+ En esta pestaña, los cambios en la configuración afectarán a todas las regiones del estado.
+ </panel.string>
+ <panel.string name="allowed_parcel_text">
+ Solo se permiten las experiencias activas en el terreno.
+
+Las experiencias permitidas tienen permiso de ejecución en esta parcela si no las ha bloqueado el estado.
+ </panel.string>
+ <panel.string name="blocked_parcel_text">
+ Puede bloquearse cualquier experiencia de los residentes.
+
+Las experiencias bloqueadas no pueden ejecutarse en esta parcela.
+ </panel.string>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_script_experience.xml b/indra/newview/skins/default/xui/es/panel_script_experience.xml
new file mode 100644
index 0000000000..2629a9fa69
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_script_experience.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel name="script_experience" title="EXPERIENCIA">
+ <button label="Experiencia" name="Expand Experience"/>
+ <check_box label="Usa las experiencias" name="enable_xp"/>
+ <layout_stack name="xp_details">
+ <layout_panel>
+ <combo_box label="Elegir experiencia..." name="Experiences..."/>
+ </layout_panel>
+ </layout_stack>
+ <text name="No Experiences">
+ No eres colaborador de ninguna experiencia.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml
index 12c74b5cd1..c9eea9a58e 100755
--- a/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_inventory">
<text name="title">
- Guardar en mi inventario
+ Inventario
</text>
<text name="hint_lbl">
Guardar una imagen en el inventario cuesta [UPLOAD_COST] L$. Para guardar una imagen como una textura, selecciona uno de los formatos cuadrados.
@@ -13,8 +13,8 @@
<combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
<combo_box.item label="Personalizado" name="Custom"/>
</combo_box>
- <spinner label="Ancho" name="inventory_snapshot_width"/>
- <spinner label="Altura" name="inventory_snapshot_height"/>
+ <spinner label="Ancho × alto" name="inventory_snapshot_width"/>
+ <spinner label="" name="inventory_snapshot_height"/>
<check_box label="Mantener las proporciones" name="inventory_keep_aspect_check"/>
<button label="Cancelar" name="cancel_btn"/>
<button label="Guardar" name="save_btn"/>
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_local.xml b/indra/newview/skins/default/xui/es/panel_snapshot_local.xml
index 08c45d2e76..d0ea34d612 100755
--- a/indra/newview/skins/default/xui/es/panel_snapshot_local.xml
+++ b/indra/newview/skins/default/xui/es/panel_snapshot_local.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_local">
<text name="title">
- Guardar en mi ordenador
+ Disco
</text>
<combo_box label="Resolución" name="local_size_combo">
<combo_box.item label="Ventana actual" name="CurrentWindow"/>
@@ -13,24 +13,17 @@
<combo_box.item label="1600x1200" name="1600x1200"/>
<combo_box.item label="Personalizado" name="Custom"/>
</combo_box>
- <layout_stack name="local_image_params_ls">
- <layout_panel name="local_image_size_lp">
- <spinner label="Ancho" name="local_snapshot_width"/>
- <spinner label="Altura" name="local_snapshot_height"/>
- <check_box label="Mantener las proporciones" name="local_keep_aspect_check"/>
- </layout_panel>
- <layout_panel name="local_image_format_quality_lp">
- <combo_box label="Formato" name="local_format_combo">
- <combo_box.item label="PNG (sin pérdida)" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP (sin pérdida)" name="BMP"/>
- </combo_box>
- <slider label="Calidad de la imagen" name="image_quality_slider"/>
- <text name="image_quality_level">
- ([QLVL])
- </text>
- </layout_panel>
- </layout_stack>
+ <spinner label="Ancho × alto" name="local_snapshot_width"/>
+ <check_box label="Mantener las proporciones" name="local_keep_aspect_check"/>
+ <text name="local_format_label">
+ Formato:
+ </text>
+ <combo_box label="Formato" name="local_format_combo">
+ <combo_box.item label="PNG (sin pérdida)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (sin pérdida)" name="BMP"/>
+ </combo_box>
+ <slider label="Calidad:" name="image_quality_slider"/>
<button label="Cancelar" name="cancel_btn"/>
<flyout_button label="Guardar" name="save_btn" tool_tip="Guardar la imagen en un archivo">
<flyout_button.item label="Guardar" name="save_item"/>
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_options.xml b/indra/newview/skins/default/xui/es/panel_snapshot_options.xml
index f4bfc0e0b5..c1955f1fde 100755
--- a/indra/newview/skins/default/xui/es/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/es/panel_snapshot_options.xml
@@ -1,16 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_options">
- <button label="Publicar en los comentarios de Mi perfil" name="save_to_profile_btn"/>
- <button label="Correo-e" name="save_to_email_btn"/>
- <button label="Guardar en Mi inventario ([AMOUNT] L$)" name="save_to_inventory_btn"/>
- <button label="Guardar en mi ordenador" name="save_to_computer_btn"/>
- <text name="send_to_facebook_textbox">
- Enviar a: [secondlife:/// Facebook]
- </text>
- <text name="send_to_twitter_textbox">
- [secondlife:/// Twitter]
- </text>
- <text name="send_to_flickr_textbox">
- [secondlife:/// Flickr]
- </text>
+ <button label="Guardar en disco" name="save_to_computer_btn"/>
+ <button label="Guardar en inventario (L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="Subir al perfil" name="save_to_profile_btn"/>
+ <button label="Subir a Facebook" name="send_to_facebook_btn"/>
+ <button label="Subir a Twitter" name="send_to_twitter_btn"/>
+ <button label="Subir a Flickr" name="send_to_flickr_btn"/>
+ <button label="Enviar por correo electrónico" name="save_to_email_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/es/panel_snapshot_postcard.xml
index 649d547ba0..357b432c4c 100755..100644
--- a/indra/newview/skins/default/xui/es/panel_snapshot_postcard.xml
+++ b/indra/newview/skins/default/xui/es/panel_snapshot_postcard.xml
@@ -10,8 +10,12 @@
Enviando...
</string>
<text name="title">
- Correo-e
+ Correo electrónico
</text>
- <button label="Mensaje" name="message_btn"/>
- <button label="Ajustes" name="settings_btn"/>
+ <tab_container name="postcard_tabs">
+ <panel label="Mensaje" name="panel_postcard_message"/>
+ <panel label="Opciones" name="panel_postcard_settings"/>
+ </tab_container>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Enviar" name="send_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/es/panel_snapshot_profile.xml
index 6a0bc22d68..9fc925835f 100755
--- a/indra/newview/skins/default/xui/es/panel_snapshot_profile.xml
+++ b/indra/newview/skins/default/xui/es/panel_snapshot_profile.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_profile">
<text name="title">
- Publicar en los comentarios de Mi perfil
+ Perfil
</text>
<combo_box label="Resolución" name="profile_size_combo">
<combo_box.item label="Ventana actual" name="CurrentWindow"/>
@@ -10,19 +10,12 @@
<combo_box.item label="1024x768" name="1024x768"/>
<combo_box.item label="Personalizado" name="Custom"/>
</combo_box>
- <layout_stack name="profile_image_params_ls">
- <layout_panel name="profile_image_size_lp">
- <spinner label="Ancho" name="profile_snapshot_width"/>
- <spinner label="Altura" name="profile_snapshot_height"/>
- <check_box label="Mantener las proporciones" name="profile_keep_aspect_check"/>
- </layout_panel>
- <layout_panel name="profile_image_metadata_lp">
- <text name="caption_label">
- Título:
- </text>
- <check_box initial_value="true" label="Incluir ubicación" name="add_location_cb"/>
- </layout_panel>
- </layout_stack>
+ <spinner label="Ancho × alto" name="profile_snapshot_width"/>
+ <check_box label="Mantener las proporciones" name="profile_keep_aspect_check"/>
+ <text name="caption_label">
+ Título:
+ </text>
+ <check_box initial_value="true" label="Incluir ubicación" name="add_location_cb"/>
<button label="Cancelar" name="cancel_btn"/>
<button label="Publicar" name="post_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_status_bar.xml b/indra/newview/skins/default/xui/es/panel_status_bar.xml
index 7eead3bc18..8ea56c5262 100755
--- a/indra/newview/skins/default/xui/es/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/es/panel_status_bar.xml
@@ -1,28 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <panel.string name="packet_loss_tooltip">
- Pérdida de paquetes
- </panel.string>
- <panel.string name="bandwidth_tooltip">
- Ancho de banda
- </panel.string>
- <panel.string name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string name="timeTooltip">
- [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
- </panel.string>
- <panel.string name="buycurrencylabel">
- [AMT] L$
- </panel.string>
+ <panel.string name="packet_loss_tooltip">Pérdida de paquetes</panel.string>
+ <panel.string name="bandwidth_tooltip">Ancho de banda</panel.string>
+ <panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>
+ <panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>
+ <panel.string name="buycurrencylabel">[AMT] L$</panel.string>
<panel left="-410" name="balance_bg" width="200">
- <text name="balance" tool_tip="Haz clic para actualizar tu saldo en L$" value="20 L$"/>
+ <text name="balance" tool_tip="Haz clic para actualizar tu saldo en L$" value="L$??"/>
<button label="Comprar L$" name="buyL" tool_tip="Pulsa para comprar más L$"/>
<button label="Comprar" name="goShop" tool_tip="Abrir el mercado de Second Life" width="80"/>
</panel>
- <text name="TimeText" tool_tip="Hora actual (Pacífico)">
- 24:00 AM PST
- </text>
+ <text name="TimeText" tool_tip="Hora actual (Pacífico)">24:00 AM PST</text>
<button name="media_toggle_btn" tool_tip="Iniciar/Parar todos los media (música, vídeo, páginas web)"/>
<button name="volume_btn" tool_tip="Control general del volumen"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_twitter_photo.xml b/indra/newview/skins/default/xui/es/panel_twitter_photo.xml
index be1896b33b..0ae790514a 100644
--- a/indra/newview/skins/default/xui/es/panel_twitter_photo.xml
+++ b/indra/newview/skins/default/xui/es/panel_twitter_photo.xml
@@ -1,32 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_twitter_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="text_panel">
- <text name="status_label">
- ¿Qué está ocurriendo?
- </text>
- <text name="status_counter_label">
- 140
- </text>
- <check_box initial_value="true" label="Incluir ubicación de SL" name="add_location_cb"/>
- <check_box initial_value="true" label="Incluir una foto" name="add_photo_cb"/>
- </layout_panel>
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Resolución de imagen">
- <combo_box.item label="Ventana actual" name="CurrentWindow"/>
- <combo_box.item label="640 × 480" name="640x480"/>
- <combo_box.item label="800 × 600" name="800x600"/>
- <combo_box.item label="1024 × 768" name="1024x768"/>
- </combo_box>
- <combo_box name="filters_combobox" tool_tip="Filtros de imagen">
- <combo_box.item label="Sin filtro" name="NoFilter"/>
- </combo_box>
- <button label="Actualizar" name="new_snapshot_btn" tool_tip="Pulsa para actualizar"/>
- <button label="Vista previa" name="big_preview_btn" tool_tip="Pulsa para alternar entre vista previa sí/no"/>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Tuitear" name="post_photo_btn"/>
- <button label="Cancelar" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <text name="status_label">
+ ¿Qué está ocurriendo?
+ </text>
+ <text name="status_counter_label">
+ 140
+ </text>
+ <check_box initial_value="true" label="Incluir ubicación de SL" name="add_location_cb"/>
+ <check_box initial_value="true" label="Incluir una foto" name="add_photo_cb"/>
+ <combo_box name="resolution_combobox" tool_tip="Resolución de imagen">
+ <combo_box.item label="Ventana actual" name="CurrentWindow"/>
+ <combo_box.item label="640 × 480" name="640x480"/>
+ <combo_box.item label="800 × 600" name="800x600"/>
+ <combo_box.item label="1024 × 768" name="1024x768"/>
+ </combo_box>
+ <combo_box name="filters_combobox" tool_tip="Filtros de imagen">
+ <combo_box.item label="Sin filtro" name="NoFilter"/>
+ </combo_box>
+ <button label="Actualizar" name="new_snapshot_btn" tool_tip="Pulsa para actualizar"/>
+ <button label="Vista previa" name="big_preview_btn" tool_tip="Pulsa para alternar entre vista previa sí/no"/>
+ <button label="Tuitear" name="post_photo_btn"/>
+ <button label="Cancelar" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/role_actions.xml b/indra/newview/skins/default/xui/es/role_actions.xml
index 5e0c21992d..3928ca2ab7 100755
--- a/indra/newview/skins/default/xui/es/role_actions.xml
+++ b/indra/newview/skins/default/xui/es/role_actions.xml
@@ -71,4 +71,8 @@
<action description="Abrir chat de voz del grupo" longdescription="Quien tenga un rol con esta capacidad puede abrir sesiones de chat de voz del grupo. NOTA: para acceder al chat de voz debe tenerse la capacidad &apos;Abrir chat de grupo&apos;." name="join voice chat" value="27"/>
<action description="Moderar el chat de grupo" longdescription="Quien tenga esta capacidad puede controlar el acceso y la participación en los chats de texto y de voz del grupo." name="moderate group chat" value="37"/>
</action_set>
+ <action_set description="Estas capacidades incluyen la posibilidad de modificar las experiencias propiedad del grupo." name="experience_tools_experience">
+ <action description="Admin. de la experiencia" longdescription="Los miembros con un rol que tenga esta capacidad pueden editar los metadatos de una experiencia." name="experience admin" value="49"/>
+ <action description="Colaborador de la experiencia" longdescription="Los miembros con un rol que tenga esta capacidad pueden incluir scripts en una experiencia." name="experience contributor" value="50"/>
+ </action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/es/sidepanel_item_info.xml b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml
index 176247f90e..8132bbdb1b 100755
--- a/indra/newview/skins/default/xui/es/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="item properties" title="Perfil del elemento">
+ <panel.string name="loading_experience">
+ (cargando)
+ </panel.string>
<panel.string name="unknown">
(desconocidas)
</panel.string>
@@ -43,6 +46,9 @@
<text name="LabelAcquiredTitle">
Obtenido:
</text>
+ <text name="LabelItemExperienceTitle">
+ Experiencia:
+ </text>
<panel name="perms_inv">
<text name="perm_modify">
Tú puedes:
@@ -66,8 +72,9 @@
<check_box label="Transferir" name="CheckNextOwnerTransfer" tool_tip="El próximo propietario puede dar o revender este objeto"/>
</panel>
<check_box label="En venta" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
+ <combo_box name="ComboBoxSaleType">
<combo_box.item label="Copiar" name="Copy"/>
+ <combo_box.item label="Contenidos" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
<spinner label="Precio: L$" name="Edit Cost"/>
diff --git a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml
index cb061796e7..b9c8139f16 100755
--- a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml
@@ -1,71 +1,31 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="object properties" title="Perfil del objeto">
- <panel.string name="text deed continued">
- Transferir
- </panel.string>
- <panel.string name="text deed">
- Transferir
- </panel.string>
- <panel.string name="text modify info 1">
- Puedes modificar este objeto
- </panel.string>
- <panel.string name="text modify info 2">
- Puedes modificar estos objetos
- </panel.string>
- <panel.string name="text modify info 3">
- No puedes modificar este objeto
- </panel.string>
- <panel.string name="text modify info 4">
- No puedes modificar estos objetos
- </panel.string>
- <panel.string name="text modify info 5">
- No se puede modificar este objeto a través del límite de una región
- </panel.string>
- <panel.string name="text modify info 6">
- No se pueden modificar estos objetos a través del límite de una región
- </panel.string>
- <panel.string name="text modify warning">
- Este objeto tiene partes enlazadas
- </panel.string>
- <panel.string name="Cost Default">
- Precio: L$
- </panel.string>
- <panel.string name="Cost Total">
- Precio total: L$
- </panel.string>
- <panel.string name="Cost Per Unit">
- Price Per: L$
- </panel.string>
- <panel.string name="Cost Mixed">
- Mixed Price
- </panel.string>
- <panel.string name="Sale Mixed">
- Mixed Sale
- </panel.string>
+ <panel.string name="text deed continued">Transferir</panel.string>
+ <panel.string name="text deed">Transferir</panel.string>
+ <panel.string name="text modify info 1">Puedes modificar este objeto</panel.string>
+ <panel.string name="text modify info 2">Puedes modificar estos objetos</panel.string>
+ <panel.string name="text modify info 3">No puedes modificar este objeto</panel.string>
+ <panel.string name="text modify info 4">No puedes modificar estos objetos</panel.string>
+ <panel.string name="text modify info 5">No se puede modificar este objeto a través del límite de una región</panel.string>
+ <panel.string name="text modify info 6">No se pueden modificar estos objetos a través del límite de una región</panel.string>
+ <panel.string name="text modify warning">Este objeto tiene partes enlazadas</panel.string>
+ <panel.string name="Cost Default">Precio: L$</panel.string>
+ <panel.string name="Cost Total">Precio total: L$</panel.string>
+ <panel.string name="Cost Per Unit">Price Per: L$</panel.string>
+ <panel.string name="Cost Mixed">Mixed Price</panel.string>
+ <panel.string name="Sale Mixed">Mixed Sale</panel.string>
<text name="title" value="Perfil del objeto"/>
<text name="where" value="(En el mundo)"/>
<panel label="" name="properties_panel">
- <text name="Name:">
- Nombre:
- </text>
- <text name="Description:">
- Descripción:
- </text>
- <text name="CreatorNameLabel">
- Creador:
- </text>
- <text name="Owner:">
- Propietario:
- </text>
- <text name="Group_label">
- Grupo:
- </text>
+ <text name="Name:">Nombre:</text>
+ <text name="Description:">Descripción:</text>
+ <text name="CreatorNameLabel">Creador:</text>
+ <text name="Owner:">Propietario:</text>
+ <text name="Group_label">Grupo:</text>
<button name="button set group" tool_tip="Elige un grupo con el que compartir los permisos de este objeto"/>
<name_box initial_value="Cargando..." name="Group Name Proxy"/>
<button label="Transferir" label_selected="Transferir" name="button deed" tool_tip="La transferencia entrega este objeto con los permisos del próximo propietario. Los objetos compartidos por el grupo pueden ser transferidos por un oficial del grupo."/>
- <text name="label click action">
- Pulsa para:
- </text>
+ <text name="label click action">Pulsa para:</text>
<combo_box name="clickaction">
<combo_box.item label="Tocarlo (por defecto)" name="Touch/grab(default)"/>
<combo_box.item label="Sentarme en el objeto" name="Sitonobject"/>
@@ -75,21 +35,13 @@
<combo_box.item label="Zoom" name="Zoom"/>
</combo_box>
<panel name="perms_inv">
- <text name="perm_modify">
- Puedes modificar este objeto
- </text>
- <text name="Anyone can:">
- Cualquiera:
- </text>
+ <text name="perm_modify">Puedes modificar este objeto</text>
+ <text name="Anyone can:">Cualquiera:</text>
<check_box label="Copiar" name="checkbox allow everyone copy"/>
<check_box label="Mover" name="checkbox allow everyone move"/>
- <text name="GroupLabel">
- Grupo:
- </text>
+ <text name="GroupLabel">Grupo:</text>
<check_box label="Compartir" name="checkbox share with group" tool_tip="Permite que todos los miembros del grupo compartan tus permisos de modificación de este objeto. Debes transferirlo para activar las restricciones según los roles."/>
- <text name="NextOwnerLabel">
- Próximo propietario:
- </text>
+ <text name="NextOwnerLabel">Próximo propietario:</text>
<check_box label="Modificar" name="checkbox next owner can modify"/>
<check_box label="Copiar" name="checkbox next owner can copy"/>
<check_box label="Transferir" name="checkbox next owner can transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/>
@@ -102,27 +54,13 @@
</combo_box>
<spinner label="Precio: L$" name="Edit Cost"/>
<check_box label="Mostrar en la búsqueda" name="search_check" tool_tip="Permitir que la gente vea este objeto en los resultados de la búsqueda"/>
- <text name="pathfinding_attributes_label">
- Atributos de pathfinding:
- </text>
- <text name="B:">
- B:
- </text>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
+ <text name="pathfinding_attributes_label">Atributos de pathfinding:</text>
+ <text name="B:">B:</text>
+ <text name="O:">O:</text>
+ <text name="G:">G:</text>
+ <text name="E:">E:</text>
+ <text name="N:">N:</text>
+ <text name="F:">F:</text>
</panel>
<panel name="button_panel">
<button label="Abrir" name="open_btn"/>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index bd339513b3..404aa1e60e 100755
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -440,30 +440,51 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="TooltipMustSingleDrop">
Aquí se puede arrastrar sólo un ítem
</string>
+ <string name="TooltipTooManyWearables">
+ No puedes tener una carpeta de prendas que contenga más de [AMOUNT] elementos. Puedes cambiar este límite en Avanzado &gt; Mostrar las configuraciones del depurador &gt; WearFolderLimit.
+ </string>
<string name="TooltipPrice" value="[AMOUNT] L$:"/>
<string name="TooltipOutboxDragToWorld">
- No puedes colocar objetos en tu buzón de salida de comerciante
+ No se pueden mostrar artículos desde la carpeta Artículos del mercado
+ </string>
+ <string name="TooltipOutboxWorn">
+ Los artículos que tienes puestos no se pueden colocar en la carpeta Artículos del mercado
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ La profundidad de carpetas anidadas excede de [AMOUNT]. Disminuye la profundidad de las carpetas anidadas; si es necesario, agrupa los artículos.
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ La cantidad de subcarpetas excede de [AMOUNT]. Disminuye la cantidad de carpetas de tu lista de artículos; si es necesario, agrupa los artículos.
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ La cantidad de artículos excede de [AMOUNT]. Para vender más de [AMOUNT] artículos en la misma lista, debes agrupar algunos.
+ </string>
+ <string name="TooltipOutboxTooManyStockItems">
+ La cantidad de artículos en stock excede de [AMOUNT].
+ </string>
+ <string name="TooltipOutboxCannotDropOnRoot">
+ Solo se pueden soltar artículos o carpetas en la pestaña TODOS. Selecciona esta pestaña y mueve otra vez los artículos o carpetas.
</string>
<string name="TooltipOutboxNoTransfer">
- Uno o varios de estos objetos no se pueden vender o transferir.
+ 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
+ Solo puedes colocar en el mercado artículos de tu inventario
</string>
- <string name="TooltipOutboxWorn">
- No puedes poner artículos que llevas puestos en el buzón de salida de comerciante
+ <string name="TooltipOutboxLinked">
+ No puedes poner carpetas o artículos vinculados en el Mercado
</string>
<string name="TooltipOutboxCallingCard">
- No puedes poner tarjetas de visita en tu buzón de salida de comerciante
+ No puedes colocar tarjetas de visita en el Mercado
</string>
- <string name="TooltipOutboxFolderLevels">
- La profundidad de carpetas anidadas excede de 3
+ <string name="TooltipOutboxDragActive">
+ No se puede mover una lista de artículos publicada
</string>
- <string name="TooltipOutboxTooManyFolders">
- El número de subcarpetas de la carpeta de nivel superior excede de 20
+ <string name="TooltipOutboxCannotMoveRoot">
+ No se puede mover la carpeta raíz de artículos del Mercado
</string>
- <string name="TooltipOutboxTooManyObjects">
- El número de elementos de la carpeta de nivel superior excede de 200
+ <string name="TooltipOutboxMixedStock">
+ Todos los artículos de una carpeta de stock deben tener el mismo tipo y permiso
</string>
<string name="TooltipDragOntoOwnChild">
No puedes mover una carpeta a su carpeta secundaria
@@ -1042,9 +1063,7 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="AgentNameSubst">
(Tú)
</string>
- <string name="JoinAnExperience">
- Únete a una experiencia
- </string>
+ <string name="JoinAnExperience"/><!-- intentionally blank -->
<string name="SilentlyManageEstateAccess">
Suprimir alertas al gestionar las listas de acceso a un estado
</string>
@@ -1111,6 +1130,12 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="bitmap_image_files">
Imágenes de mapa de bits
</string>
+ <string name="png_image_files">
+ Imágenes PNG
+ </string>
+ <string name="save_texture_image_files">
+ Imágenes Targa o PNG
+ </string>
<string name="avi_movie_file">
Archivo de película AVI
</string>
@@ -1360,6 +1385,9 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="FavoritesNoMatchingItems">
Arrastra aquí un hito para tenerlo en tus favoritos.
</string>
+ <string name="MarketplaceNoMatchingItems">
+ No se han encontrado artículos. Comprueba si has escrito correctamente la cadena de búsqueda y vuelve a intentarlo.
+ </string>
<string name="InventoryNoTexture">
No tienes en tu inventario una copia de esta textura
</string>
@@ -1407,29 +1435,95 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="InventoryOutboxError">
La [[MARKETPLACE_CREATE_STORE_URL] tienda del Mercado] devuelve errores.
</string>
+ <string name="InventoryMarketplaceError">
+ Esta función está actualmente en versión beta. Si quieres participar, añade tu nombre a este [http://goo.gl/forms/FCQ7UXkakz Formulario de Google].
+ </string>
+ <string name="InventoryMarketplaceListingsNoItemsTitle">
+ Tu carpeta Artículos del mercado está vacía.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItems">
+ Arrastra carpetas a esta sección para incluirlas en la lista de venta del [[MARKETPLACE_DASHBOARD_URL] Mercado].
+ </string>
+ <string name="Marketplace Validation Warning Stock">
+ La carpeta de stock debe estar contenida en una carpeta de versión
+ </string>
+ <string name="Marketplace Validation Error Mixed Stock">
+ : Error: todos los artículos de una carpeta de stock deben ser del mismo tipo y que no se puedan copiar
+ </string>
+ <string name="Marketplace Validation Error Subfolder In Stock">
+ : Error: la carpeta de stock no puede contener subcarpetas
+ </string>
+ <string name="Marketplace Validation Warning Empty">
+ : Atención: la carpeta no contiene ningún artículo
+ </string>
+ <string name="Marketplace Validation Warning Create Stock">
+ : Atención: creando carpeta de stock
+ </string>
+ <string name="Marketplace Validation Warning Create Version">
+ : Atención: creando la carpeta de versión
+ </string>
+ <string name="Marketplace Validation Warning Move">
+ : Atención: moviendo artículos
+ </string>
+ <string name="Marketplace Validation Warning Delete">
+ : Atención: se ha transferido el contenido de la carpeta a la carpeta de stock, y se eliminará la carpeta vacía
+ </string>
+ <string name="Marketplace Validation Error Stock Item">
+ : Error: los artículos que no se pueden copiar deben estar contenidos en una carpeta de stock
+ </string>
+ <string name="Marketplace Validation Warning Unwrapped Item">
+ : Atención: los artículos deben estar contenidos en una carpeta de versión
+ </string>
+ <string name="Marketplace Validation Error">
+ : Error:
+ </string>
+ <string name="Marketplace Validation Warning">
+ : Atención:
+ </string>
+ <string name="Marketplace Validation Error Empty Version">
+ : Atención: la carpeta de versión debe contener al menos un artículo
+ </string>
+ <string name="Marketplace Validation Error Empty Stock">
+ : Atención: la carpeta de stock debe contener al menos un artículo
+ </string>
+ <string name="Marketplace Validation No Error">
+ No se han producido errores ni advertencias
+ </string>
<string name="Marketplace Error None">
Sin errores
</string>
+ <string name="Marketplace Error Prefix">
+ Error:
+ </string>
<string name="Marketplace Error Not Merchant">
- Error: Para poder enviar objetos al mercado, debes registrarte como comerciante (es gratis).
+ 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 name="Marketplace Error Not Accepted">
+ No se puede mover el artículo a esa carpeta.
</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 name="Marketplace Error Unsellable Item">
+ Este artículo no se puede vender en el Mercado.
</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 name="MarketplaceNoID">
+ no Mkt ID
</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 name="MarketplaceLive">
+ en la lista
</string>
- <string name="Marketplace Error Unsellable Item">
- Error: Este objeto no se puede vender en el mercado.
+ <string name="MarketplaceActive">
+ activa
</string>
- <string name="Marketplace Error Internal Import">
- Error: Este objeto tiene un problema. Vuelve a intentarlo más tarde.
+ <string name="MarketplaceMax">
+ máx.
+ </string>
+ <string name="MarketplaceStock">
+ stock
+ </string>
+ <string name="MarketplaceNoStock">
+ existencias agotadas
+ </string>
+ <string name="MarketplaceUpdating">
+ actualizando...
</string>
<string name="Open landmarks">
Abrir hitos
@@ -1450,6 +1544,7 @@ Intenta iniciar sesión de nuevo en unos instantes.
No hay contenido
</string>
<string name="WornOnAttachmentPoint" value="(lo llevas en: [ATTACHMENT_POINT])"/>
+ <string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/>
<string name="ActiveGesture" value="[GESLABEL] (activo)"/>
<string name="Chat Message" value="Chat:"/>
<string name="Sound" value="Sonido :"/>
@@ -1714,6 +1809,15 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="Invalid Attachment">
Punto de colocación no válido
</string>
+ <string name="ATTACHMENT_MISSING_ITEM">
+ Error: falta un artículo
+ </string>
+ <string name="ATTACHMENT_MISSING_BASE_ITEM">
+ Error: falta el artículo de base
+ </string>
+ <string name="ATTACHMENT_NOT_ATTACHED">
+ Error: el objeto se encuentra en el vestuario actual, pero no está anexado
+ </string>
<string name="YearsMonthsOld">
[AGEYEARS] [AGEMONTHS] de edad
</string>
@@ -1882,6 +1986,9 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="SaveComplete">
Guardado.
</string>
+ <string name="UploadFailed">
+ Error al subir el archivo:
+ </string>
<string name="ObjectOutOfRange">
Script (objeto fuera de rango)
</string>
@@ -1891,6 +1998,9 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="GroupsNone">
ninguno
</string>
+ <string name="CompileNoExperiencePerm">
+ Omitiendo el script [SCRIPT] con la experiencia [EXPERIENCE].
+ </string>
<string name="Group" value="(grupo)"/>
<string name="Unknown">
(Desconocido)
@@ -4976,6 +5086,9 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas
<string name="Command_Marketplace_Label">
Mercado
</string>
+ <string name="Command_MarketplaceListings_Label">
+ Mercado
+ </string>
<string name="Command_MiniMap_Label">
Minimapa
</string>
@@ -5063,6 +5176,9 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas
<string name="Command_Marketplace_Tooltip">
Ir de compras
</string>
+ <string name="Command_MarketplaceListings_Tooltip">
+ Vende tu creación
+ </string>
<string name="Command_MiniMap_Tooltip">
Mostrar la gente que está cerca
</string>
@@ -5186,4 +5302,85 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas
<string name="loading_chat_logs">
Cargando...
</string>
+ <string name="experience_tools_experience">
+ Experiencia
+ </string>
+ <string name="ExperienceNameNull">
+ (sin experiencia)
+ </string>
+ <string name="ExperienceNameUntitled">
+ (experiencia sin título)
+ </string>
+ <string name="Land-Scope">
+ Activa en el terreno
+ </string>
+ <string name="Grid-Scope">
+ Activa en el Grid
+ </string>
+ <string name="Allowed_Experiences_Tab">
+ PERMITIDO
+ </string>
+ <string name="Blocked_Experiences_Tab">
+ BLOQUEADO
+ </string>
+ <string name="Contrib_Experiences_Tab">
+ COLABORADOR
+ </string>
+ <string name="Admin_Experiences_Tab">
+ ADMIN.
+ </string>
+ <string name="Recent_Experiences_Tab">
+ RECIENTE
+ </string>
+ <string name="Owned_Experiences_Tab">
+ PROPIEDAD
+ </string>
+ <string name="ExperiencesCounter">
+ ([EXPERIENCES], máx. [MAXEXPERIENCES])
+ </string>
+ <string name="ExperiencePermission1">
+ hacerte con tus controles
+ </string>
+ <string name="ExperiencePermission3">
+ activar animaciones en tu avatar
+ </string>
+ <string name="ExperiencePermission4">
+ anexar a tu avatar
+ </string>
+ <string name="ExperiencePermission9">
+ seguimiento de la cámara
+ </string>
+ <string name="ExperiencePermission10">
+ controlar tu cámara
+ </string>
+ <string name="ExperiencePermission11">
+ teleportarte
+ </string>
+ <string name="ExperiencePermission12">
+ aceptar automáticamente permisos de experiencias
+ </string>
+ <string name="ExperiencePermissionShortUnknown">
+ ha realizado una operación desconocida: [Permission]
+ </string>
+ <string name="ExperiencePermissionShort1">
+ Ponerte al mando
+ </string>
+ <string name="ExperiencePermissionShort3">
+ Activar animaciones
+ </string>
+ <string name="ExperiencePermissionShort4">
+ Anexar
+ </string>
+ <string name="ExperiencePermissionShort9">
+ Seguir la cámara
+ </string>
+ <string name="ExperiencePermissionShort10">
+ Controlar la cámara
+ </string>
+ <string name="ExperiencePermissionShort11">
+ Teleportarte
+ </string>
+ <string name="ExperiencePermissionShort12">
+ Otorgar permisos
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/es/teleport_strings.xml b/indra/newview/skins/default/xui/es/teleport_strings.xml
index 94975a83f8..a9b351b39c 100755
--- a/indra/newview/skins/default/xui/es/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/es/teleport_strings.xml
@@ -47,6 +47,9 @@ Para repetir el tutorial, visita la isla de bienvenida pública.
<message name="MustGetAgeRegion">
Solo pueden acceder a esta región los mayores de 18 años.
</message>
+ <message name="RegionTPSpecialUsageBlocked">
+ No puedes entrar en la región. &apos;[REGION_NAME]&apos; es una región de juegos de habilidad, y debes cumplir determinados criterios para poder entrar en ella. Consulta los detalles en las [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life P+F de juegos de habilidad].
+ </message>
</message_set>
<message_set name="progress">
<message name="sending_dest">
diff --git a/indra/newview/skins/default/xui/fr/floater_about.xml b/indra/newview/skins/default/xui/fr/floater_about.xml
index 384966354e..08f26e60b4 100755
--- a/indra/newview/skins/default/xui/fr/floater_about.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about.xml
@@ -1,74 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="À PROPOS DE [CAPITALIZED_APP_NAME]">
- <floater.string name="AboutHeader">
- [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
-[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
- </floater.string>
- <floater.string name="AboutCompiler">
- Compilé avec [COMPILER] version [COMPILER_VERSION]
- </floater.string>
- <floater.string name="AboutPosition">
- Vous êtes à [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] dans [REGION], se trouvant à &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
-SLURL : &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
-(coordonnées globales [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
-[SERVER_VERSION]
-[SERVER_RELEASE_NOTES_URL]
- </floater.string>
- <floater.string name="AboutSystem">
- CPU : [CPU]
-Mémoire : [MEMORY_MB] Mo
-Version OS : [OS_VERSION]
-Distributeur de cartes graphiques : [GRAPHICS_CARD_VENDOR]
-Cartes graphiques : [GRAPHICS_CARD]
- </floater.string>
- <floater.string name="AboutDriver">
- Version Windows Graphics Driver : [GRAPHICS_DRIVER_VERSION]
- </floater.string>
- <floater.string name="AboutLibs">
- Version OpenGL : [OPENGL_VERSION]
-
-Version libcurl : [LIBCURL_VERSION]
-Version J2C Decoder : [J2C_VERSION]
-Version Audio Driver : [AUDIO_DRIVER_VERSION]
-Version Qt Webkit : [QT_WEBKIT_VERSION]
-Version serveur vocal : [VOICE_VERSION]
- </floater.string>
- <floater.string name="none">
- (aucun)
- </floater.string>
- <floater.string name="AboutTraffic">
- Paquets perdus : [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
- </floater.string>
- <floater.string name="ErrorFetchingServerReleaseNotesURL">
- Erreur lors de la récupération de l&apos;URL des notes de version du serveur.
- </floater.string>
<tab_container name="about_tab">
<panel label="Infos" name="support_panel">
<button label="Copier dans le presse-papiers" name="copy_btn"/>
</panel>
<panel label="Remerciements" name="credits_panel">
- <text name="linden_intro">
- Second Life vous est proposé par les Linden :
- </text>
- <text_editor name="linden_names">
- Philip, Andrew, Doug, Richard, Phoenix, Ian, Mark, Robin, Dan, Char, Ryan, Eric, Jim, Lee, Jeff, Michael, Kelly, Steve, Catherine, Bub, Ramzi, Jill, Jeska, Don, Kona, Callum, Charity, Jack, Shawn, babbage, James, Lauren, Blue, Brent, Reuben, Pathfinder, Jesse, Patsy, Torley, Bo, Cyn, Jonathan, Gia, Annette, Ginsu, Harry, Lex, Runitai, Guy, Cornelius, Beth, Swiss, Thumper, Wendy, Teeple, Seth, Dee, Mia, Sally, Liana, Aura, Beez, Milo, Red, Gulliver, Marius, Joe, Jose, Dore, Justin, Nora, Morpheus, Lexie, Amber, Chris, Xan, Leyla, Walker, Sabin, Joshua, Hiromi, Tofu, Fritz, June, Jean, Ivy, Dez, Ken, Betsy, Which, Spike, Rob, Zee, Dustin, George, Claudia, del, Matthew, jane, jay, Adrian, Yool, Rika, Yoz, siobhan, Qarl, Benjamin, Beast, Everett, madhavi, Christopher, Izzy, stephany, Jeremy, sean, adreanne, Pramod, Tobin, sejong, Iridium, maurice, kj, Meta, kari, JP, bert, kyle, Jon, Socrates, Bridie, Ivan, maria, Aric, Coco, Periapse, sandy, Storrs, Lotte, Colossus, Brad, Pastrami, Zen, BigPapi, Banzai, Sardonyx, Mani, Garry, Jaime, Neuro, Samuel, Niko, CeeLo, Austin, Soft, Poppy, emma, tessa, angelo, kurz, alexa, Sue, CG, Blake, Erica, Brett, Bevis, kristen, Q, simon, Enus, MJ, laurap, Kip, Scouse, Ron, Ram, kend, Marty, Prospero, melissa, kraft, Nat, Seraph, Hamilton, Lordan, Green, miz, Ashlei, Trinity, Ekim, Echo, Charlie, Rowan, Rome, Jt, Doris, benoc, Christy, Bao, Kate, Tj, Patch, Cheah, Johan, Brandy, Angela, Oreh, Cogsworth, Lan, Mitchell, Space, Bambers, Einstein, Bender, Malbers, Matias, Maggie, Rothman, Milton, Niall, Marin, Allison, Mango, Andrea, Katt, Yi, Ambroff, Rico, Raymond, Gail, Christa, William, Dawn, Usi, Dynamike, M, Corr, Dante, Molly, kaylee, Danica, Kelv, Lil, jacob, Nya, Rodney, elsie, Blondin, Grant, Nyx, Devin, Monty, Minerva, Keira, Katie, Jenn, Makai, Clare, Joy, Cody, Gayathri, FJ, spider, Oskar, Landon, Jarv, Noelle, Al, Doc, Gray, Vir, t, Maestro, Simone, Shannon, yang, Courtney, Scott, charlene, Quixote, Susan, Zed, Amanda, Katelin, Esbee, JoRoan, Enkidu, roxie, Scarlet, Merov, Kevin, Judy, Rand, Newell, Les, Dessie, Galen, Michon, Geo, Siz, Calyle, Pete, Praveen, Callen, Sheldon, Pink, Nelson, jenelle, Terrence, Nathan, Juan, Sascha, Huseby, Karina, Kaye, Kotler, Lis, Darv, Charrell, Dakota, Kimmora, Theeba, Taka, Mae, Perry, Ducot, dana, Esther, Dough, gisele, Doten, Viale, Fisher, jessieann, ashley, Torres, delby, rountree, kurt, Slaton, Madison, Rue, Gino, Wen, Casssandra, Brodesky, Squid, Gez, Rakesh, Gecko, Ladan, Tony, Tatem, Squire, Falcon, BK, Crimp, Tiggs, Bacon, Coyot, Carmilla, Webb, Sea, Arch, Jillian, Jason, Bernard, Vogt, Peggy, dragon, Pup, xandix, Wallace, Bewest, Inoshiro, Rhett, AG, Aimee, Ghengis, Itiaes, Eli, Steffan, Epic, Grapes, Stone, Prep, Scobu, Robert, Alain, Carla, Vicky, Tia, Alec, Taras, Lisa, Oz, Ariane, Log, House, Kazu, Kim, Drofnas, Tyler, Campbell, Michele, Madeline, Nelly, Baron, Thor, Lori, Hele, Fredrik, Teddy, Pixie, Berry, Gabrielle, Alfonso, Brooke, Wolf, Ringo, Cru, Charlar, Rodvik, Gibson, Elise, Bagman, Greger, Leonidas, Jerm, Leslie, CB, Brenda, Durian, Carlo, mm, Zeeshan, Caleb, Max, Elikak, Mercille, Steph, Chase
- </text_editor>
- <text name="contrib_intro">
- Contributions Open Source :
- </text>
- <text_editor name="contrib_names">
- Dummy Name remplacé au moment de l&apos;exécution
- </text_editor>
- <text name="trans_intro">
- Participation aux traductions :
- </text>
- <text_editor name="trans_names">
- Dummy Name remplacé au moment de l&apos;exécution
- </text_editor>
+ <text name="linden_intro">Second Life vous est proposé par les Linden,
+avec les contributions Open Source de :</text>
+ <text_editor name="contrib_names">Dummy Name remplacé au moment de l&apos;exécution</text_editor>
</panel>
<panel label="Licences" name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
+ <text_editor name="licenses_editor">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)
@@ -95,8 +37,7 @@ Version serveur vocal : [VOICE_VERSION]
Tous droits réservés. Voir licenses.txt pour plus d&apos;informations.
- Codage audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
+ Codage audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)</text_editor>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_about_land.xml b/indra/newview/skins/default/xui/fr/floater_about_land.xml
index 25c49b97b5..3de282e8d5 100755
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -312,9 +312,6 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
<panel.string name="push_restrict_region_text">
Pas de bousculades (les règles de la région priment)
</panel.string>
- <panel.string name="see_avs_text">
- Les avatars sur les autres parcelles peuvent voir
- </panel.string>
<text name="allow_label">
Autoriser les autres résidents à :
</text>
@@ -340,22 +337,6 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
<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="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"/>
- <combo_box.item label="Adult" name="item2"/>
- <combo_box.item label="Art et Culture" name="item3"/>
- <combo_box.item label="Affaires" name="item4"/>
- <combo_box.item label="Éducation" name="item5"/>
- <combo_box.item label="Jeux" name="item6"/>
- <combo_box.item label="Favoris" name="item7"/>
- <combo_box.item label="Accueil pour les nouveaux" name="item8"/>
- <combo_box.item label="Parcs et Nature" name="item9"/>
- <combo_box.item label="Résidentiel" name="item10"/>
- <combo_box.item label="Shopping" name="item11"/>
- <combo_box.item label="Location" name="item13"/>
- <combo_box.item label="Autre" name="item12"/>
- </combo_box>
<combo_box name="land category">
<combo_box.item label="Toutes catégories" name="item0"/>
<combo_box.item label="Appartenant aux Lindens" name="item1"/>
@@ -456,15 +437,9 @@ musique :
<panel.string name="access_estate_defined">
(défini par le domaine
</panel.string>
- <panel.string name="allow_public_access">
- Autoriser l&apos;accès public ([MATURITY]) (Remarque : des lignes d&apos;interdiction seront créées si cette case n&apos;est pas cochée)
- </panel.string>
<panel.string name="estate_override">
Au moins une de ces options est définie au niveau du domaine.
</panel.string>
- <text name="Limit access to this parcel to:">
- Accès à cette parcelle
- </text>
<check_box label="Autoriser l&apos;accès public (des lignes d&apos;interdiction seront créées si cette case n&apos;est pas cochée)" name="public_access"/>
<text name="Only Allow">
Conditions d&apos;accès des résidents :
@@ -496,5 +471,6 @@ musique :
<button label="Supprimer" label_selected="Supprimer" name="remove_banned"/>
</panel>
</panel>
+ <panel label="EXPÉRIENCES" name="land_experiences_panel"/>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_associate_listing.xml b/indra/newview/skins/default/xui/fr/floater_associate_listing.xml
new file mode 100644
index 0000000000..3c61cfe4ca
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_associate_listing.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="associate listing" title="ASSOCIER L&apos;ANNONCE">
+ <text name="message">ID d&apos;annonce :</text>
+ <line_editor name="listing_id">Saisir l&apos;ID ici</line_editor>
+ <button label="OK" name="OK"/>
+ <button label="Annuler" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_edit_hover_height.xml b/indra/newview/skins/default/xui/fr/floater_edit_hover_height.xml
new file mode 100644
index 0000000000..28e7e87193
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_edit_hover_height.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="HoverHeight" title="DÉFINIR LA HAUTEUR DE SUSTENTATION">
+ <slider label="Hauteur" name="HoverHeightSlider"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_experience_search.xml b/indra/newview/skins/default/xui/fr/floater_experience_search.xml
new file mode 100644
index 0000000000..b7a175a066
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_experience_search.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="experiencepicker" title="CHOISIR UNE EXPÉRIENCE"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_experienceprofile.xml b/indra/newview/skins/default/xui/fr/floater_experienceprofile.xml
new file mode 100644
index 0000000000..080c6e4dde
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_experienceprofile.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater title="EXPERIENCE PROFILE">
+ <floater.string name="empty_slurl">
+ (aucun)
+ </floater.string>
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Light&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Light&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Light&quot;
+ </floater.string>
+ <text name="edit_title" value="Profil de l&apos;expérience"/>
+ <tab_container name="tab_container">
+ <panel name="panel_experience_info">
+ <scroll_container name="xp_scroll">
+ <panel name="scrolling_panel">
+ <layout_stack>
+ <layout_panel name="top panel">
+ <button label="Modifier" name="edit_btn"/>
+ </layout_panel>
+ <layout_panel name="maturity panel">
+ <text name="ContentRating">
+ Catégorie :
+ </text>
+ </layout_panel>
+ <layout_panel name="location panel">
+ <text name="Location">
+ Endroit :
+ </text>
+ </layout_panel>
+ <layout_panel>
+ <text name="Owner">
+ Propriétaire :
+ </text>
+ </layout_panel>
+ <layout_panel name="group_panel">
+ <text name="Group">
+ Groupe :
+ </text>
+ </layout_panel>
+ <layout_panel name="perm panel">
+ <button label="Autoriser" name="allow_btn"/>
+ <button label="Oublier" name="forget_btn"/>
+ <button label="Bloquer" name="block_btn"/>
+ <text name="privileged">
+ Cette expérience est activée pour tous les résidents.
+ </text>
+ <button label="Signaler une infraction" name="report_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ </panel>
+ <panel name="edit_panel_experience_info">
+ <scroll_container name="edit_xp_scroll">
+ <panel name="edit_scrolling_panel">
+ <text name="edit_experience_title_label" value="Nom :"/>
+ <text name="edit_experience_desc_label" value="Description :"/>
+ <button label="Groupe" name="Group_btn"/>
+ <text name="edit_ContentRating">
+ Catégorie :
+ </text>
+ <icons_combo_box label="Modéré" name="edit_ContentRatingText" tool_tip="Si vous augmentez la catégorie de contenu pour une expérience, les permissions seront réinitialisées pour tous les résidents ayant autorisé l&apos;expérience.">
+ <icons_combo_box.item label="Adulte" name="Adult" value="42"/>
+ <icons_combo_box.item label="Modéré" name="Mature" value="21"/>
+ <icons_combo_box.item label="Général" name="PG" value="13"/>
+ </icons_combo_box>
+ <text name="edit_Location">
+ Endroit :
+ </text>
+ <button label="Définir sur l&apos;emplacement actuel" name="location_btn"/>
+ <button label="Effacer l&apos;emplacement" name="clear_btn"/>
+ <check_box label="Activer l&apos;expérience" name="edit_enable_btn" tool_tip=""/>
+ <check_box label="Cacher dans les résultats de recherche" name="edit_private_btn"/>
+ <text name="changes" value="Il peut falloir plusieurs minutes pour que l&apos;expérience soit visible dans toutes les régions."/>
+ <button label="Retour" name="cancel_btn"/>
+ <button label="Enregistrer" name="save_btn"/>
+ </panel>
+ </scroll_container>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_experiences.xml b/indra/newview/skins/default/xui/fr/floater_experiences.xml
new file mode 100644
index 0000000000..d130129a25
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_experiences.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_experiences" title="EXPÉRIENCES"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_facebook.xml b/indra/newview/skins/default/xui/fr/floater_facebook.xml
index 12a3c9ae61..f5097e7a88 100644
--- a/indra/newview/skins/default/xui/fr/floater_facebook.xml
+++ b/indra/newview/skins/default/xui/fr/floater_facebook.xml
@@ -1,20 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_facebook" title="PUBLIER SUR FACEBOOK">
- <panel name="background">
- <tab_container name="tabs">
- <panel label="STATUT" name="panel_facebook_status"/>
- <panel label="PHOTO" name="panel_facebook_photo"/>
- <panel label="INDIQUER VOTRE PRÉSENCE" name="panel_facebook_place"/>
- <panel label="AMIS" name="panel_facebook_friends"/>
- <panel label="COMPTE" name="panel_facebook_account"/>
- </tab_container>
- <panel name="connection_status_panel">
- <text name="connection_error_text">
- Erreur
- </text>
- <text name="connection_loading_text">
- Chargement...
- </text>
- </panel>
- </panel>
+ <tab_container name="tabs">
+ <panel label="STATUT" name="panel_facebook_status"/>
+ <panel label="PHOTO" name="panel_facebook_photo"/>
+ <panel label="INDIQUER VOTRE PRÉSENCE" name="panel_facebook_place"/>
+ <panel label="AMIS" name="panel_facebook_friends"/>
+ </tab_container>
+ <text name="connection_error_text">
+ Erreur
+ </text>
+ <text name="connection_loading_text">
+ Chargement...
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
index f2eb3cb6bc..1d4e7c818f 100755
--- a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
@@ -1,67 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="item properties" title="PROPRIÉTÉS DES ARTICLES DE L&apos;INVENTAIRE">
- <floater.string name="unknown">
- (inconnu)
- </floater.string>
- <floater.string name="public">
- (public)
- </floater.string>
- <floater.string name="you_can">
- Vous pouvez :
- </floater.string>
- <floater.string name="owner_can">
- Le propriétaire peut :
- </floater.string>
- <floater.string name="acquiredDate">
- [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
- </floater.string>
- <text name="LabelItemNameTitle">
- Nom :
- </text>
- <text name="LabelItemDescTitle">
- Description :
- </text>
- <text name="LabelCreatorTitle">
- Créateur :
- </text>
+ <floater.string name="unknown">(inconnu)</floater.string>
+ <floater.string name="public">(public)</floater.string>
+ <floater.string name="you_can">Vous pouvez :</floater.string>
+ <floater.string name="owner_can">Le propriétaire peut :</floater.string>
+ <floater.string name="acquiredDate">[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]</floater.string>
+ <text name="LabelItemNameTitle">Nom :</text>
+ <text name="LabelItemDescTitle">Description :</text>
+ <text name="LabelCreatorTitle">Créateur :</text>
<button label="Profil..." label_selected="" name="BtnCreator"/>
- <text name="LabelOwnerTitle">
- Propriétaire :
- </text>
+ <text name="LabelOwnerTitle">Propriétaire :</text>
<button label="Profil..." label_selected="" name="BtnOwner"/>
- <text name="LabelAcquiredTitle">
- Acquis :
- </text>
- <text name="LabelAcquiredDate">
- Wed May 24 12:50:46 2006
- </text>
- <text name="OwnerLabel">
- Vous :
- </text>
+ <text name="LabelAcquiredTitle">Acquis :</text>
+ <text name="LabelAcquiredDate">Wed May 24 12:50:46 2006</text>
+ <text name="OwnerLabel">Vous :</text>
<check_box label="Modifier" name="CheckOwnerModify"/>
<check_box label="Copier" name="CheckOwnerCopy"/>
<check_box label="Revendre" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel" width="80">
- N&apos;importe qui :
- </text>
+ <text name="AnyoneLabel" width="80">N&apos;importe qui :</text>
<check_box label="Copier" name="CheckEveryoneCopy"/>
- <text name="GroupLabel" width="80">
- Groupe :
- </text>
+ <text name="GroupLabel" width="80">Groupe :</text>
<check_box label="Partager" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel" width="192">
- Le prochain propriétaire :
- </text>
+ <text name="NextOwnerLabel" width="192">Le prochain propriétaire :</text>
<check_box label="Modifier" name="CheckNextOwnerModify"/>
<check_box label="Copier" name="CheckNextOwnerCopy"/>
<check_box label="Revendre" name="CheckNextOwnerTransfer"/>
<check_box label="À vendre" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
+ <combo_box name="ComboBoxSaleType">
<combo_box.item label="Copier" name="Copy"/>
+ <combo_box.item label="Contenu" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
<spinner label="Prix :" name="Edit Cost"/>
- <text name="CurrencySymbol">
- L$
- </text>
+ <text name="CurrencySymbol">L$</text>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
index 7567817f3a..fdc4000746 100755
--- a/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
@@ -5,8 +5,8 @@
<check_box label="Habits" name="check_clothing"/>
<check_box label="Gestes" name="check_gesture"/>
<check_box label="Repères" name="check_landmark"/>
- <check_box label="Maillages" name="check_mesh"/>
<check_box label="Notes" name="check_notecard"/>
+ <check_box label="Maillages" name="check_mesh"/>
<check_box label="Objets" name="check_object"/>
<check_box label="Scripts" name="check_script"/>
<check_box label="Sons" name="check_sound"/>
@@ -19,6 +19,10 @@
<text name="- OR -">
Ou il y a...
</text>
+ <radio_group name="date_search_direction">
+ <radio_item label="Ultérieure à" name="newer"/>
+ <radio_item label="Antérieure à" name="older"/>
+ </radio_group>
<spinner label="Heures" name="spin_hours_ago"/>
<spinner label="Jours" name="spin_days_ago"/>
<button label="Fermer" label_selected="Fermer" name="Close"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_item_properties.xml b/indra/newview/skins/default/xui/fr/floater_item_properties.xml
new file mode 100644
index 0000000000..5301e759ee
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_item_properties.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Item Properties" title="PROPRIÉTÉS DE L&apos;ARTICLE"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_lagmeter.xml b/indra/newview/skins/default/xui/fr/floater_lagmeter.xml
index 39a861d8bd..c93ca5aacb 100644
--- a/indra/newview/skins/default/xui/fr/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/fr/floater_lagmeter.xml
@@ -25,7 +25,7 @@
Normal, fenêtre en arrière-plan
</floater.string>
<floater.string name="client_frame_time_critical_msg">
- Taux de défilement [CLIENT_FRAME_RATE_CRITICAL]
+ Taux de défilement client ci-dessous [CLIENT_FRAME_RATE_CRITICAL]
</floater.string>
<floater.string name="client_frame_time_warning_msg">
Taux de défilement entre [CLIENT_FRAME_RATE_CRITICAL] et [CLIENT_FRAME_RATE_WARNING]
@@ -34,16 +34,16 @@
Normal
</floater.string>
<floater.string name="client_draw_distance_cause_msg">
- Cause possible : limite d&apos;affichage trop élevée
+ Cause possible : la limite d&apos;affichage est trop élevée
</floater.string>
<floater.string name="client_texture_loading_cause_msg">
- Cause possible : images en cours de chargement
+ Cause possible : images en cours de chargement
</floater.string>
<floater.string name="client_texture_memory_cause_msg">
- Cause possible : trop d&apos;images en mémoire
+ Cause possible : trop d&apos;images en mémoire
</floater.string>
<floater.string name="client_complex_objects_cause_msg">
- Cause possible : trop d&apos;objets complexes
+ Cause possible : trop d&apos;objets complexes dans la scène
</floater.string>
<floater.string name="network_text_msg">
Réseau
@@ -55,10 +55,10 @@
5
</floater.string>
<floater.string name="network_packet_loss_critical_msg">
- La connexion perd plus de [NETWORK_PACKET_LOSS_CRITICAL] % de paquets
+ La connexion perd plus de [NETWORK_PACKET_LOSS_CRITICAL] % de paquets
</floater.string>
<floater.string name="network_packet_loss_warning_msg">
- La connexion perd entre [NETWORK_PACKET_LOSS_WARNING] % et [NETWORK_PACKET_LOSS_CRITICAL] % de paquets
+ La connexion perd entre [NETWORK_PACKET_LOSS_WARNING] % et [NETWORK_PACKET_LOSS_CRITICAL] % de paquets
</floater.string>
<floater.string name="network_performance_normal_msg">
Normal
@@ -70,7 +70,7 @@
300
</floater.string>
<floater.string name="network_ping_critical_msg">
- Connexion ping > [NETWORK_PING_CRITICAL] ms
+ Temps de connexion ping &gt;[NETWORK_PING_CRITICAL] ms
</floater.string>
<floater.string name="network_ping_warning_msg">
Connexion ping entre [NETWORK_PING_WARNING] et [NETWORK_PING_CRITICAL] ms
@@ -94,31 +94,31 @@
20
</floater.string>
<floater.string name="server_frame_time_critical_msg">
- Défilement du simulateur &lt; [SERVER_FRAME_RATE_CRITICAL]
+ Taux de défilement du simulateur au-dessous de [SERVER_FRAME_RATE_CRITICAL]
</floater.string>
<floater.string name="server_frame_time_warning_msg">
- Défilement simulateur entre [SERVER_FRAME_RATE_CRITICAL] et [SERVER_FRAME_RATE_WARNING]
+ Taux de défilement du simulateur entre [SERVER_FRAME_RATE_CRITICAL] et [SERVER_FRAME_RATE_WARNING]
</floater.string>
<floater.string name="server_frame_time_normal_msg">
Normal
</floater.string>
<floater.string name="server_physics_cause_msg">
- Cause possible : trop d&apos;objets physiques
+ Cause possible : trop d&apos;objets physiques
</floater.string>
<floater.string name="server_scripts_cause_msg">
- Cause possible : trop d&apos;objets scriptés
+ Cause possible : trop d&apos;objets scriptés
</floater.string>
<floater.string name="server_net_cause_msg">
- Cause possible : trop de trafic réseau
+ Cause possible : trop de trafic réseau
</floater.string>
<floater.string name="server_agent_cause_msg">
- Cause possible : trop de personnes en mouvement
+ Cause possible : trop de personnes en mouvement dans la région
</floater.string>
<floater.string name="server_images_cause_msg">
- Cause possible : trop de calculs d&apos;images
+ Cause possible : trop de calculs d&apos;images
</floater.string>
<floater.string name="server_generic_cause_msg">
- Cause possible : charge simulateur trop lourde
+ Cause possible : charge simulateur trop lourde
</floater.string>
<floater.string name="smaller_label">
&gt;&gt;
@@ -126,21 +126,21 @@
<floater.string name="bigger_label">
&lt;&lt;
</floater.string>
- <button name="client_lagmeter" tool_tip="Statut du lag client"/>
+ <button name="client_lagmeter" tool_tip="Statut du lag au niveau du client"/>
<text name="client">
Client
</text>
<text name="client_text">
Normal
</text>
- <button name="network_lagmeter" tool_tip="Statut du lag réseau"/>
+ <button name="network_lagmeter" tool_tip="Statut du lag au niveau du réseau"/>
<text name="network">
Réseau
</text>
<text name="network_text">
Normal
</text>
- <button name="server_lagmeter" tool_tip="Statut du lag serveur"/>
+ <button name="server_lagmeter" tool_tip="Statut du lag au niveau du serveur"/>
<text name="server">
Serveur
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml
index 7647452e91..d69c311a8e 100755
--- a/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml
@@ -9,7 +9,24 @@
<floater.string name="Title">
SCRIPT : [NAME]
</floater.string>
+ <floater.string name="experience_enabled">
+ Supprimer la coche pour supprimer l&apos;expérience actuelle
+ </floater.string>
+ <floater.string name="no_experiences">
+ Vous n&apos;êtes autorisé(e) pour aucune expérience.
+ </floater.string>
+ <floater.string name="add_experiences">
+ Sélectionner pour ajouter une expérience
+ </floater.string>
+ <floater.string name="show_experience_profile">
+ Cliquer pour afficher le profil de l&apos;expérience
+ </floater.string>
+ <floater.string name="loading">
+ Chargement...
+ </floater.string>
<button label="Réinitialiser" label_selected="Réinitialiser" name="Reset"/>
<check_box initial_value="true" label="Exécution en cours" name="running"/>
<check_box initial_value="true" label="Mono" name="mono"/>
+ <check_box label="Utiliser la ou les expériences :" name="enable_xp"/>
+ <button label="&gt;" name="view_profile"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_marketplace_listings.xml b/indra/newview/skins/default/xui/fr/floater_marketplace_listings.xml
new file mode 100644
index 0000000000..8488d17d00
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_marketplace_listings.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_listings" title="ANNONCES DE LA PLACE DU MARCHÉ">
+ <panel name="marketplace_listings_panel">
+ <panel>
+ <panel name="marketplace_listings_inventory_placeholder_panel">
+ <text name="marketplace_listings_inventory_placeholder_title">Chargement…</text>
+ </panel>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_marketplace_validation.xml b/indra/newview/skins/default/xui/fr/floater_marketplace_validation.xml
new file mode 100644
index 0000000000..01527800ac
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_marketplace_validation.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_validation" title="Auditer les annonces de la Place du marché">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <text_editor name="validation_text">MARKETPLACE_VALIDATION_TEXT</text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_openobject.xml b/indra/newview/skins/default/xui/fr/floater_openobject.xml
index 4e046ff3f3..54edf92379 100755
--- a/indra/newview/skins/default/xui/fr/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/fr/floater_openobject.xml
@@ -3,6 +3,11 @@
<text name="object_name">
[DESC]:
</text>
- <button label="Copier vers l&apos;inventaire" label_selected="Copier vers l&apos;inventaire" name="copy_to_inventory_button" width="132"/>
- <button label="Copier et porter" label_selected="Copier et porter" left="152" name="copy_and_wear_button"/>
+ <text name="border_note">
+ Copier dans l&apos;inventaire et porter
+ </text>
+ <button label="Ajouter à la tenue" label_selected="Ajouter à la tenue" left="152" name="copy_and_wear_button"/>
+ <button label="Remplacer la tenue" label_selected="Remplacer la tenue" name="copy_and_replace_button"/>
+ <button label="Copier uniquement dans l&apos;inventaire" label_selected="Copier uniquement dans l&apos;inventaire" name="copy_to_inventory_button" width="132"/>
+ <button label="Annuler" label_selected="Annuler" name="cancel_button"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_pay.xml b/indra/newview/skins/default/xui/fr/floater_pay.xml
index 397436876d..bbd20e868c 100755
--- a/indra/newview/skins/default/xui/fr/floater_pay.xml
+++ b/indra/newview/skins/default/xui/fr/floater_pay.xml
@@ -1,26 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <string name="payee_group">
- Payer le groupe
- </string>
- <string name="payee_resident">
- Payer le résident
- </string>
- <text left="5" name="payee_label">
- Payer :
- </text>
- <icon name="icon_person" tool_tip="Résident"/>
- <text name="payee_name">
- Test Name That Is Extremely Long To Check Clipping
- </text>
- <button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
- <button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
- <button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
- <button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
- <text left="4" name="amount text">
- Ou choisir un montant :
- </text>
- <line_editor left="60" name="amount" width="55"/>
- <button label="Payer" label_selected="Payer" name="pay btn"/>
- <button label="Annuler" label_selected="Annuler" name="cancel btn"/>
+ <string name="payee_group">Payer le groupe</string>
+ <string name="payee_resident">Payer le résident</string>
+ <text name="paying_text">Vous payez :</text>
+ <text name="payee_name">Test Name That Is Extremely Long To Check Clipping</text>
+ <panel label="Rechercher" name="PatternsPanel">
+ <button label="Payer 1 L$" label_selected="Payer 1 L$" name="fastpay 1"/>
+ <button label="Payer 5 L$" label_selected="Payer 5 L$" name="fastpay 5"/>
+ <button label="Payer 10 L$" label_selected="Payer 10 L$" name="fastpay 10"/>
+ <button label="Payer 20 L$" label_selected="Payer 20 L$" name="fastpay 20"/>
+ </panel>
+ <panel label="Rechercher" name="InputPanel">
+ <text name="amount text">Autre montant :</text>
+ <button label="Payer" label_selected="Payer" name="pay btn"/>
+ <button label="Annuler" label_selected="Annuler" name="cancel btn"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_pay_object.xml b/indra/newview/skins/default/xui/fr/floater_pay_object.xml
index 966fa3b8a6..c98d2f7c0c 100755
--- a/indra/newview/skins/default/xui/fr/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/fr/floater_pay_object.xml
@@ -1,30 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <string name="payee_group" width="95">
- Payer le groupe
- </string>
- <string halign="left" name="payee_resident" width="100">
- Payer le résident
- </string>
- <icon name="icon_person" tool_tip="Résident"/>
- <text left="105" name="payee_name">
- Ericacita Moostopolison
- </text>
- <text left="25" name="object_name_label">
- Via un objet :
- </text>
+ <string name="payee_group" width="95">Payer le groupe</string>
+ <string halign="left" name="payee_resident" width="100">Payer le résident</string>
+ <text name="paying_text">Vous payez :</text>
+ <text left="105" name="payee_name">Ericacita Moostopolison</text>
+ <text left="25" name="object_name_label">Via un objet :</text>
<icon name="icon_object" tool_tip="Objets"/>
- <text left="105" name="object_name_text">
- ...
- </text>
- <button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
- <button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
- <button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
- <button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
- <text halign="left" left="5" name="amount text">
- Ou choisir un montant :
- </text>
- <line_editor left="65" name="amount" width="50"/>
- <button label="Payer" label_selected="Payer" name="pay btn"/>
- <button label="Annuler" label_selected="Annuler" name="cancel btn"/>
+ <text left="105" name="object_name_text">...</text>
+ <panel label="Rechercher" name="PatternsPanel">
+ <button label="Payer 1 L$" label_selected="Payer 1 L$" name="fastpay 1"/>
+ <button label="Payer 5 L$" label_selected="Payer 5 L$" name="fastpay 5"/>
+ <button label="Payer 10 L$" label_selected="Payer 10 L$" name="fastpay 10"/>
+ <button label="Payer 20 L$" label_selected="Payer 20 L$" name="fastpay 20"/>
+ </panel>
+ <panel label="Rechercher" name="InputPanel">
+ <text name="amount text">Autre montant :</text>
+ <button label="Payer" label_selected="Payer" name="pay btn"/>
+ <button label="Annuler" label_selected="Annuler" name="cancel btn"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
index 153be444e5..638f0d68ff 100755
--- a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
@@ -76,7 +76,7 @@
<combo_box.item label="Terrain &gt; Empiètement &gt; Objets ou textures" name="Land__Encroachment__Objects_textures"/>
<combo_box.item label="Terrain &gt; Empiètement &gt; Particules" name="Land__Encroachment__Particles"/>
<combo_box.item label="Terrain &gt; Empiètement &gt; Arbres/plantes" name="Land__Encroachment__Trees_plants"/>
- <combo_box.item label="Paris ou jeux d&apos;argent" name="Wagering_gambling"/>
+ <combo_box.item label="Violation du règlement pour les jeux" name="Wagering_gambling"/>
<combo_box.item label="Autre" name="Other"/>
</combo_box>
<text name="abuser_name_title">
diff --git a/indra/newview/skins/default/xui/fr/floater_snapshot.xml b/indra/newview/skins/default/xui/fr/floater_snapshot.xml
index ab2256e356..8eb05dd945 100755
--- a/indra/newview/skins/default/xui/fr/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/fr/floater_snapshot.xml
@@ -39,17 +39,8 @@
<string name="local_failed_str">
Échec d&apos;enregistrement sur l&apos;ordinateur.
</string>
- <button name="advanced_options_btn" tool_tip="Options avancées"/>
- <text name="image_res_text">
- [WIDTH] x [HEIGHT] px
- </text>
- <text name="file_size_label">
- [SIZE] Ko
- </text>
+ <button label="ACTUALISER" name="new_snapshot_btn"/>
<panel name="advanced_options_panel">
- <text name="advanced_options_label">
- OPTIONS AVANCÉES
- </text>
<text name="layer_type_label">
Capturer :
</text>
@@ -68,4 +59,10 @@
<combo_box.item label="Aucun filtre" name="NoFilter"/>
</combo_box>
</panel>
+ <text name="image_res_text">
+ [WIDTH] px (largeur) x [HEIGHT] px (hauteur)
+ </text>
+ <text name="file_size_label">
+ [SIZE] Ko
+ </text>
</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 eb084d9184..2c411933a8 100755
--- a/indra/newview/skins/default/xui/fr/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/fr/floater_top_objects.xml
@@ -21,6 +21,12 @@
<floater.string name="none_descriptor">
Aucun résultat.
</floater.string>
+ <floater.string name="URLs">
+ URL
+ </floater.string>
+ <floater.string name="memory">
+ Mémoire (Ko)
+ </floater.string>
<text name="title_text">
Chargement...
</text>
@@ -30,7 +36,7 @@
<scroll_list.columns label="Propriétaire" name="owner"/>
<scroll_list.columns label="Lieu" name="location"/>
<scroll_list.columns label="Parcelle" name="parcel"/>
- <scroll_list.columns label="Temps" name="time"/>
+ <scroll_list.columns label="Date" name="time"/>
<scroll_list.columns label="URL" name="URLs"/>
<scroll_list.columns label="Mémoire (Ko)" name="memory"/>
</scroll_list>
diff --git a/indra/newview/skins/default/xui/fr/floater_twitter.xml b/indra/newview/skins/default/xui/fr/floater_twitter.xml
index 9ca2b0d48d..608b02dced 100644
--- a/indra/newview/skins/default/xui/fr/floater_twitter.xml
+++ b/indra/newview/skins/default/xui/fr/floater_twitter.xml
@@ -1,17 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_twitter" title="TWITTER">
- <panel name="background">
- <tab_container name="tabs">
- <panel label="COMPOSER" name="panel_twitter_photo"/>
- <panel label="COMPTE" name="panel_twitter_account"/>
- </tab_container>
- <panel name="connection_status_panel">
- <text name="connection_error_text">
- Erreur
- </text>
- <text name="connection_loading_text">
- Chargement...
- </text>
- </panel>
- </panel>
+ <tab_container name="tabs">
+ <panel label="COMPOSER" name="panel_twitter_photo"/>
+ <panel label="COMPTE" name="panel_twitter_account"/>
+ </tab_container>
+ <text name="connection_error_text">
+ Erreur
+ </text>
+ <text name="connection_loading_text">
+ Chargement...
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/menu_attachment_self.xml b/indra/newview/skins/default/xui/fr/menu_attachment_self.xml
index f2e7928c24..1ccba08099 100755
--- a/indra/newview/skins/default/xui/fr/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/fr/menu_attachment_self.xml
@@ -8,6 +8,7 @@
<menu_item_call label="Mon apparence" name="Change Outfit"/>
<menu_item_call label="Modifier ma tenue" name="Edit Outfit"/>
<menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
+ <menu_item_call label="Hauteur de sustentation" name="Hover Height"/>
<menu_item_call label="Mes amis" name="Friends..."/>
<menu_item_call label="Mes groupes" name="Groups..."/>
<menu_item_call label="Mon profil" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
index 4815ad0676..1c768a078c 100755
--- a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Mon apparence" name="Chenge Outfit"/>
<menu_item_call label="Modifier ma tenue" name="Edit Outfit"/>
<menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
+ <menu_item_call label="Hauteur de sustentation" name="Hover Height"/>
<menu_item_call label="Mes amis" name="Friends..."/>
<menu_item_call label="Mes groupes" name="Groups..."/>
<menu_item_call label="Mon profil" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory.xml b/indra/newview/skins/default/xui/fr/menu_inventory.xml
index 87b11bdaa5..c0808f1139 100755
--- a/indra/newview/skins/default/xui/fr/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inventory.xml
@@ -1,5 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
+ <menu_item_call label="Créer une annonce" name="Marketplace Create Listing"/>
+ <menu_item_call label="Associer l&apos;annonce" name="Marketplace Associate Listing"/>
+ <menu_item_call label="Obtenir (actualiser) l&apos;annonce" name="Marketplace Get Listing"/>
+ <menu_item_call label="Consultez les erreurs" name="Marketplace Check Listing"/>
+ <menu_item_call label="Modifier l&apos;annonce" name="Marketplace Edit Listing"/>
+ <menu_item_call label="Publier" name="Marketplace List"/>
+ <menu_item_call label="Ne plus publier" name="Marketplace Unlist"/>
+ <menu_item_call label="Activer" name="Marketplace Activate"/>
+ <menu_item_call label="Désactiver" name="Marketplace Deactivate"/>
<menu_item_call label="Partager" name="Share"/>
<menu_item_call label="Acheter" name="Task Buy"/>
<menu_item_call label="Ouvrir" name="Task Open"/>
@@ -87,6 +96,7 @@
<menu_item_call label="Ajouter" name="Wearable Add"/>
<menu_item_call label="Enlever" name="Take Off"/>
<menu_item_call label="Copier vers la boîte d&apos;envoi vendeur" name="Merchant Copy"/>
- <menu_item_call label="Envoyer vers la Place du marché" name="Marketplace Send"/>
+ <menu_item_call label="Copier dans les annonces Place du marché" name="Marketplace Copy"/>
+ <menu_item_call label="Déplacer dans les annonces Place du marché" name="Marketplace Move"/>
<menu_item_call label="--aucune option--" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml
index 364872c875..c21caae0b2 100755
--- a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml
@@ -5,7 +5,7 @@
<menu_item_check label="Trier en commençant par le plus récent" name="sort_by_recent"/>
<menu_item_check label="Toujours trier les dossiers par nom" name="sort_folders_by_name"/>
<menu_item_check label="Dossiers système en premier" name="sort_system_folders_to_top"/>
- <menu_item_call label="Afficher les filtres" name="show_filters"/>
+ <menu_item_call label="Afficher les filtres..." name="show_filters"/>
<menu_item_call label="Réinitialiser les filtres" name="reset_filters"/>
<menu_item_call label="Fermer tous les dossiers" name="close_folders"/>
<menu_item_call label="Vider les objets trouvés" name="empty_lostnfound"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_marketplace_view.xml b/indra/newview/skins/default/xui/fr/menu_marketplace_view.xml
new file mode 100644
index 0000000000..a63e2082b7
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_marketplace_view.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_marketplace_sort">
+ <menu_item_check label="Trier par volume de stock (de bas à élevé)" name="sort_by_stock_amount"/>
+ <menu_item_check label="Afficher uniquement les dossiers d&apos;annonces" name="show_only_listing_folders"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_url_experience.xml b/indra/newview/skins/default/xui/fr/menu_url_experience.xml
new file mode 100644
index 0000000000..90c0ce6765
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_url_experience.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index 2c30fe07b4..788cdbf856 100755
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -8,13 +8,14 @@
<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="Expériences..." name="Experiences"/>
<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"/>
<menu_item_check label="Toujours courir" name="Always Run"/>
<menu_item_call label="Arrêter mon animation" name="Stop Animating My Avatar"/>
- <menu_item_call label="Marcher / Courir / Voler..." name="Walk / run / fly"/>
+ <menu_item_call label="Marcher / Courir / Voler..." name="WalkRunFly"/>
</menu>
<menu label="Statut" name="Status">
<menu_item_check label="Absent" name="Away"/>
@@ -22,6 +23,7 @@
</menu>
<menu_item_call label="Acheter des L$..." name="Buy and Sell L$"/>
<menu_item_call label="Boîte d&apos;envoi vendeur..." name="MerchantOutbox"/>
+ <menu_item_call label="Annonces de Place du marché..." name="MarketplaceListings"/>
<menu_item_call label="Page d&apos;accueil du compte..." name="Manage My Account">
<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=fr"/>
</menu_item_call>
@@ -48,7 +50,7 @@
<menu_item_check label="Amis" name="My Friends"/>
<menu_item_check label="Groupes" name="My Groups"/>
<menu_item_check label="Personnes près de vous" name="Active Speakers"/>
- <menu_item_call label="Liste des ignorés" name="Block List"/>
+ <menu_item_check label="Liste des ignorés" name="Block List"/>
<menu_item_check label="Ne pas déranger" name="Do Not Disturb"/>
</menu>
<menu label="Monde" name="World">
@@ -62,7 +64,7 @@
<menu_item_call label="Photo" name="Take Snapshot"/>
<menu_item_call label="Profil du lieu" name="Place Profile"/>
<menu_item_call label="À propos du terrain" name="About Land"/>
- <menu_item_call label="Région/Domaine" name="Region/Estate"/>
+ <menu_item_call label="Région/Domaine" name="RegionEstate"/>
<menu_item_call label="Mes terrains..." name="My Land"/>
<menu_item_call label="Acheter ce terrain" name="Buy Land"/>
<menu label="Afficher" name="LandShow">
@@ -250,6 +252,7 @@
<menu_item_check label="Console de textures" name="Texture Console"/>
<menu_item_check label="Console de débogage" name="Debug Console"/>
<menu_item_call label="Console de notifications" name="Notifications"/>
+ <menu_item_check label="Console de débogage de région" name="Region Debug Console"/>
<menu_item_check label="Chronos" name="Fast Timers"/>
<menu_item_check label="Mémoire" name="Memory"/>
<menu_item_check label="Statistiques de la scène" name="Scene Statistics"/>
@@ -353,7 +356,7 @@
<menu_item_check label="Interpolation ping des positions des objets" name="Ping Interpolate Object Positions"/>
<menu_item_call label="Abandonner un paquet" name="Drop a Packet"/>
</menu>
- <menu_item_call label="Dump caméra scriptée" name="Dump Scripted Camera"/>
+ <menu_item_call label="Dump caméra scriptée" name="Dump Scripted Camera"/>
<menu label="Enregistreur" name="Recorder">
<menu_item_call label="Commencer la lecture" name="Start Playback"/>
<menu_item_call label="Arrêter la lecture" name="Stop Playback"/>
diff --git a/indra/newview/skins/default/xui/fr/mime_types_linux.xml b/indra/newview/skins/default/xui/fr/mime_types_linux.xml
index 3a7ff979ee..93d1406ba5 100755
--- a/indra/newview/skins/default/xui/fr/mime_types_linux.xml
+++ b/indra/newview/skins/default/xui/fr/mime_types_linux.xml
@@ -44,6 +44,14 @@
Lire le contenu audio qui se trouve ici
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ Aucun contenu
+ </label>
+ <tooltip name="none_tooltip">
+ Aucun média ici
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Flux en temps réel
diff --git a/indra/newview/skins/default/xui/fr/mime_types_mac.xml b/indra/newview/skins/default/xui/fr/mime_types_mac.xml
index 3a7ff979ee..93d1406ba5 100755
--- a/indra/newview/skins/default/xui/fr/mime_types_mac.xml
+++ b/indra/newview/skins/default/xui/fr/mime_types_mac.xml
@@ -44,6 +44,14 @@
Lire le contenu audio qui se trouve ici
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ Aucun contenu
+ </label>
+ <tooltip name="none_tooltip">
+ Aucun média ici
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Flux en temps réel
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index 2325c8e34d..29e6fe1979 100755
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -73,6 +73,10 @@ Détails de l&apos;erreur : La notification, appelée &apos;[_NAME]&apos;, est i
[MESSAGE]
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/>
</notification>
+ <notification name="GenericAlertOK">
+ [MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="BadInstallation">
Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez [http://get.secondlife.com télécharger la dernière version] du client.
<usetemplate name="okbutton" yestext="OK"/>
@@ -125,6 +129,88 @@ Aucun dossier n&apos;a été envoyé vers la Place du marché en raison d&apos;u
L&apos;initialisation de la Place du marché a échoué en raison d&apos;une erreur système ou réseau. Réessayez ultérieurement.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="StockPasteFailed">
+ Échec de la copie ou du déplacement vers le dossier de stock. Erreur :
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantPasteFailed">
+ Échec de la copie ou du déplacement vers les annonces Place du marché. Erreur :
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantTransactionFailed">
+ La transaction avec la Place du marché a échoué en raison de l&apos;erreur suivante :
+
+ Motif : &apos;[ERROR_REASON]&apos;
+ [ERROR_DESCRIPTION]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantUnprocessableEntity">
+ Nous ne pouvons pas publier ce produit ni activer le dossier de version. Cela est en général dû à des informations manquantes dans le formulaire de description de l&apos;annonce, mais parfois à cause d&apos;erreurs dans la structure du dossier. Modifiez l&apos;annonce ou consultez les erreurs du dossier de l&apos;annonce.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantListingFailed">
+ Échec de la publication d&apos;une annonce sur la Place du marché. Erreur :
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantFolderActivationFailed">
+ Échec de l&apos;activation de ce dossier de version. Erreur :
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantActiveChange">
+ Cette action va modifier le contenu actif de cette annonce. Voulez-vous continuer ?
+ <usetemplate ignoretext="Confirmer avant que je ne modifie une annonce active sur la Place du marché" name="okcancelignore" notext="Annuler" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantMoveInventory">
+ Les articles glissés vers la fenêtre Annonces de la Place du marché sont déplacés de leur emplacement d&apos;origine, et non copiés. Voulez-vous continuer ?
+ <usetemplate ignoretext="Confirmer avant que je ne déplace un article de l&apos;inventaire vers la Place du marché" name="okcancelignore" notext="Annuler" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmListingCutOrDelete">
+ Le déplacement ou la suppression d&apos;un dossier d&apos;annonces supprimera votre annonce de la Place du marché. Si vous souhaitez conserver l&apos;annonce de la Place du marché, déplacez ou supprimez le contenu du dossier de version que vous souhaitez modifier. Voulez-vous continuer ?
+ <usetemplate ignoretext="Confirmer avant que je déplace ou supprime une annonce de la Place du marché" name="okcancelignore" notext="Annuler" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmCopyToMarketplace">
+ Vous n&apos;êtes pas autorisé à copier un ou plusieurs de ces articles vers la Place du marché. Vous pouvez les déplacer ou les laisser.
+ <usetemplate canceltext="Annuler" ignoretext="Confirmer avant que je ne copie une sélection contenant des articles non reproductibles vers la Place du marché" name="yesnocancelbuttons" notext="Ne pas déplacer les articles" yestext="Déplacer les articles"/>
+ </notification>
+ <notification name="ConfirmMerchantUnlist">
+ Cette action va annuler cette annonce. Voulez-vous continuer ?
+ <usetemplate ignoretext="Confirmer avant que j&apos;annule une annonce active sur la Place du marché" name="okcancelignore" notext="Annuler" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantClearVersion">
+ Cette action va désactiver le dossier de version de l&apos;annonce active. Voulez-vous continuer ?
+ <usetemplate ignoretext="Confirmer avant que je ne désactive le dossier de version d&apos;une annonce de la Place du marché" name="okcancelignore" notext="Annuler" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantListingNotUpdated">
+ Impossible de mettre à jour cette annonce.
+[[URL] Cliquez ici] pour la modifier sur la Place du marché.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantListingCannotWear">
+ Vous ne pouvez pas porter de vêtements ou des parties du corps se trouvant dans le dossier Annonces de la Place du marché.
+ </notification>
+ <notification name="AlertMerchantListingInvalidID">
+ ID d&apos;annonce non valide.
+ </notification>
+ <notification name="AlertMerchantListingActivateRequired">
+ Il y a plusieurs dossiers de version (ou aucun) dans cette liste. Vous devrez en sélectionner et activer un indépendamment plus tard.
+ <usetemplate ignoretext="Alerter en cas d&apos;activation du dossier de version lorsque je crée une annonce avec plusieurs dossiers de version" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderSplit">
+ Nous avons classé les articles du stock de types différents dans des dossiers de stocks distincts ; votre dossier est organisé de telle façon que nous pouvons le répertorier.
+ <usetemplate ignoretext="Alerter lorsque le dossier de stock est divisé avant publication" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderEmpty">
+ Nous avons retiré votre annonce car le stock est vide. Vous devez ajouter plus d&apos;unités au dossier de stock pour publier à nouveau l&apos;annonce.
+ <usetemplate ignoretext="Alerter lorsqu&apos;une annonce n&apos;est pas publiée parce que le dossier de stock est vide" name="okignore" yestext="OK"/>
+ </notification>
<notification name="CompileQueueSaveText">
Une erreur est survenue lors du chargement du texte pour un script, suite au problème suivant : [REASON]. Veuillez réessayer ultérieurement.
</notification>
@@ -468,6 +554,10 @@ Remarque : cela videra le cache.
Enregistrer les changements ?
<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/>
</notification>
+ <notification name="DeleteNotecard">
+ Supprimer la note ?
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+ </notification>
<notification name="GestureSaveFailedTooManySteps">
L&apos;enregistrement du geste a échoué.
Il y a trop d&apos;étapes dans ce geste.
@@ -574,6 +664,9 @@ La qualité des graphiques peut être augmentée à la section Préférences &gt
<notification name="RegionNoTerraforming">
Le terraformage est interdit dans la région [REGION].
</notification>
+ <notification name="ParcelNoTerraforming">
+ Vous n&apos;êtes pas autorisé(e) à terraformer la parcelle [PARCEL].
+ </notification>
<notification name="CannotCopyWarning">
Vous n&apos;êtes pas autorisé à copier les articles suivants :
[ITEMS].
@@ -1824,6 +1917,30 @@ Cette action modifiera des milliers de régions et sera difficile à digérer po
Supprimer le gérant de domaine pour ce domaine uniquement ou pour [ALL_ESTATES] ?
<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
</notification>
+ <notification label="Sélectionner un domaine" name="EstateAllowedExperienceAdd">
+ Ajouter à la liste des expériences autorisées uniquement pour ce domaine ou pour [ALL_ESTATES] ?
+ <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
+ </notification>
+ <notification label="Sélectionner un domaine" name="EstateAllowedExperienceRemove">
+ Supprimer de la liste des expériences autorisées uniquement pour ce domaine ou pour [ALL_ESTATES] ?
+ <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
+ </notification>
+ <notification label="Sélectionner un domaine" name="EstateBlockedExperienceAdd">
+ Ajouter à la liste des expériences bloquées uniquement pour ce domaine ou pour [ALL_ESTATES]
+ <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
+ </notification>
+ <notification label="Sélectionner un domaine" name="EstateBlockedExperienceRemove">
+ Supprimer de la liste des expériences bloquées uniquement pour ce domaine ou pour [ALL_ESTATES] ?
+ <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
+ </notification>
+ <notification label="Sélectionner un domaine" name="EstateTrustedExperienceAdd">
+ Ajouter à la liste des clés uniquement pour ce domaine ou pour [ALL_ESTATES] ?
+ <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
+ </notification>
+ <notification label="Sélectionner un domaine" name="EstateTrustedExperienceRemove">
+ Supprimer de la liste des clés uniquement pour ce domaine ou pour [ALL_ESTATES] ?
+ <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
+ </notification>
<notification label="Confirmer" name="EstateKickUser">
Éjecter [EVIL_USER] de ce domaine ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
@@ -1836,6 +1953,9 @@ Cette action modifiera des milliers de régions et sera difficile à digérer po
La région que vous essayez de visiter comporte du contenu dont le niveau dépasse celui de vos préférences actuelles. Vous pouvez modifier vos préférences en accédant à Moi &gt; Préférences &gt; Général.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="SLM_UPDATE_FOLDER">
+ [MESSAGE]
+ </notification>
<notification name="RegionEntryAccessBlocked_AdultsOnlyContent">
La région que vous essayez de visiter comporte du contenu [REGIONMATURITY] uniquement accessible aux adultes.
<url name="url">
@@ -1898,6 +2018,10 @@ Cette action modifiera des milliers de régions et sera difficile à digérer po
Nous rencontrons des difficultés techniques au niveau de votre téléportation car vos préférences ne sont pas synchronisées avec le serveur.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="RegionTPSpecialUsageBlocked">
+ Impossible de pénétrer dans la région. « [REGION_NAME] » est une région de jeux d&apos;adresse et vous devez satisfaire à certains critères pour y pénétrer. Pour en savoir plus, consultez la page [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life FAQ sur les jeux d&apos;adresse].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="PreferredMaturityChanged">
Aucune autre notification vous informant que vous allez visiter une région au contenu [RATING] ne vous sera envoyée. Vous pouvez modifier vos préférences de contenu à l&apos;avenir en accédant à Moi &gt; Préférences &gt; Général, à partir de la barre de menus.
<usetemplate name="okbutton" yestext="OK"/>
@@ -2120,6 +2244,10 @@ Déplacer les objets de l&apos;inventaire ?
<ignore name="ignore" text="Je définis l&apos;action du clic Payer l&apos;objet lorsque je construis un objet sans le script money()"/>
</form>
</notification>
+ <notification name="PayConfirmation">
+ Confirmez que vous voulez payer [AMOUNT] L$ à [TARGET].
+ <usetemplate ignoretext="Confirmez avant de payer (sommes supérieures à 200 L$)" name="okcancelignore" notext="Annuler" yestext="Payer"/>
+ </notification>
<notification name="OpenObjectCannotCopy">
Vous n&apos;êtes autorisé à copier aucun élément dans cet objet.
</notification>
@@ -2205,6 +2333,9 @@ Voulez-vous le remplacer par l&apos;objet sélectionné ?
<button ignore="Ne jamais remplacer" name="No" text="Annuler"/>
</form>
</notification>
+ <notification name="TooManyWearables">
+ Vous ne pouvez pas porter un dossier contenant plus de [AMOUNT] articles. Vous pouvez modifier cette limite dans Avancé &gt; Afficher les paramètres de débogage &gt; WearFolderLimit.
+ </notification>
<notification label="Avertissement de mode Ne pas déranger" name="DoNotDisturbModePay">
Vous avez activé Ne pas déranger. Vous ne recevrez aucun article proposé en échange de ce paiement.
@@ -2657,9 +2788,6 @@ Veuillez réessayer dans quelques minutes.
<notification name="NoValidCircuit">
Aucun code de circuit valide.
</notification>
- <notification name="NoValidTimestamp">
- Timestamp non valide.
- </notification>
<notification name="NoPendingConnection">
Impossible de créer la connexion en attente.
</notification>
@@ -2814,7 +2942,7 @@ Si vous restez dans cette région, vous serez déconnecté(e).
[MESSAGE]
-Venant de l&apos;objet : &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, propriétaire : [NAME] ?
+Venant de l&apos;objet : &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, propriétaire : [NAME]
<form name="form">
<button name="Gotopage" text="Charger"/>
<button name="Cancel" text="Annuler"/>
@@ -2840,6 +2968,72 @@ Acceptez-vous ?
<button name="Mute" text="Interdire"/>
</form>
</notification>
+ <notification name="ExperienceAcquireFailed">
+ Impossible d&apos;acquérir une nouvelle expérience :
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NotInGroupExperienceProfileMessage">
+ Une modification du groupe de l&apos;expérience a été ignorée, car le propriétaire n&apos;est pas membre du groupe sélectionné.
+ </notification>
+ <notification name="UneditableExperienceProfileMessage">
+ Le champ non modifiable « [field] » a été ignoré lors de la mise à jour du profil de l&apos;expérience.
+ </notification>
+ <notification name="RestrictedToOwnerExperienceProfileMessage">
+ Modifications du champ « [field] » ignorées, car il ne peut être défini que par le propriétaire de l&apos;expérience.
+ </notification>
+ <notification name="MaturityRatingExceedsOwnerExperienceProfileMessage">
+ Vous ne pouvez pas définir une catégorie de contenu plus élevée pour une expérience que pour son propriétaire.
+ </notification>
+ <notification name="RestrictedTermExperienceProfileMessage">
+ Les termes suivants ont empêché la mise à jour du nom et/ou de la description du profil de l&apos;expérience : [extra_info]
+ </notification>
+ <notification name="TeleportedHomeExperienceRemoved">
+ Vous avez été téléporté(e) hors de la région [region_name], car vous avez supprimé l&apos;expérience secondlife:///app/experience/[public_id]/profile et n&apos;êtes plus autorisé(e) dans cette région.
+ <form name="form">
+ <ignore name="ignore" text="Éjecté(e) de la région pour cause de suppression d&apos;une expérience"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperienceEntry">
+ Vous avez été autorisé(e) à pénétrer dans la région [region_name] en participant à l&apos;expérience avec clé secondlife:///app/experience/[public_id]/profile. Si vous supprimez cette expérience, vous risquez d&apos;être éjecté(e) de cette région.
+ <form name="form">
+ <ignore name="ignore" text="Autorisé(e) dans une région par une expérience"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperiencesAvailable">
+ Vous n&apos;avez pas accès à cette destination. Vous pouvez être autorisé(e) à pénétrer dans la région en acceptant une expérience ci-dessous :
+
+[EXPERIENCE_LIST]
+
+Il est possible que d&apos;autres expériences avec clé soient disponibles.
+ </notification>
+ <notification name="ExperienceEvent">
+ Un objet a été autorisé à [EventType] par l&apos;expérience secondlife:///app/experience/[public_id]/profile.
+ Propriétaire : secondlife:///app/agent/[OwnerID]/inspect
+ Nom de l&apos;objet : [ObjectName]
+ Nom de la parcelle : [ParcelName]
+ </notification>
+ <notification name="ExperienceEventAttachment">
+ Une pièce jointe a été autorisée à [EventType] par l&apos;expérience secondlife:///app/experience/[public_id]/profile.
+ Propriétaire : secondlife:///app/agent/[OwnerID]/inspect
+ </notification>
+ <notification name="ScriptQuestionExperience">
+ « &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt; », un objet appartenant à « [NAME] », demande votre participation à l&apos;expérience [GRID_WIDE] :
+
+[EXPERIENCE]
+
+Une fois l&apos;autorisation accordée, vous ne verrez plus ce message pour cette expérience, sauf si elle est révoquée dans le profil de l&apos;expérience.
+
+Les scripts associés à cette expérience pourront effectuer les actions suivantes dans les régions dans lesquelles l&apos;expérience est active :
+
+[QUESTIONS]Acceptez-vous ?
+ <form name="form">
+ <button name="BlockExperience" text="Bloquer l&apos;expérience"/>
+ <button name="Mute" text="Ignorer l&apos;objet"/>
+ <button name="Yes" text="Oui"/>
+ <button name="No" text="Non"/>
+ </form>
+ </notification>
<notification name="ScriptQuestionCaution">
Avertissement : l&apos;objet &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt; souhaite un accès total à votre compte en Linden dollars. Si vous autorisez cet accès, il pourra supprimer des fonds de votre compte à tout moment ou le vider entièrement de façon continue sans avis préalable.
@@ -3159,6 +3353,10 @@ Texture figée de [RESOLUTION] chargée pour [BODYREGION] au bout de [TIME] seco
([EXISTENCE] secondes d&apos;existence)
Texture figée de [RESOLUTION] mise à jour localement pour [BODYREGION] au bout de [TIME] secondes.
</notification>
+ <notification name="CannotUploadTexture">
+ Chargement de la texture impossible.
+[REASON]
+ </notification>
<notification name="LivePreviewUnavailable">
Impossible d&apos;afficher un aperçu de cette texture car il s&apos;agit d&apos;une texture sans copie et/ou transfert.
<usetemplate ignoretext="M&apos;avertir que le mode Aperçu en direct n&apos;est pas disponible pour les textures sans copie et/ou transfert" name="okignore" yestext="OK"/>
@@ -3733,9 +3931,11 @@ Veuillez réessayer dans une minute.
</notification>
<notification name="TeleportedByAttachment">
Vous avez été téléporté par un élément sur [ITEM_ID]
+ <usetemplate ignoretext="Téléportation : vous avez été téléporté par un attachement." name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOnParcel">
Vous avez été téléporté par l&apos;objet [OBJECT_NAME] sur la parcelle [PARCEL_NAME].
+ <usetemplate ignoretext="Téléportation : vous avez été téléporté par un objet sur une parcelle" name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOwnedBy">
Vous avez été téléporté par l&apos;objet [OBJECT_NAME] appartenant à [OWNER_ID].
@@ -4067,7 +4267,7 @@ Veuillez sélectionner un terrain plus petit.
<usetemplate ignoretext="Impossible de déplacer les fichiers. Chemin précédent rétabli." name="okignore" yestext="OK"/>
</notification>
<notification name="DefaultObjectPermissions">
- Une erreur est survenue lors de l&apos;enregistrement des droits par défaut, suite au problème suivant : [REASON]. Réessayez de définir les droits par défaut ultérieurement.
+ Problème lors de l&apos;enregistrement des droits d&apos;objet par défaut : [REASON]. Réessayez de définir les droits par défaut ultérieurement.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ChatHistoryIsBusyAlert">
diff --git a/indra/newview/skins/default/xui/fr/panel_experience_info.xml b/indra/newview/skins/default/xui/fr/panel_experience_info.xml
new file mode 100644
index 0000000000..e830ce1ba6
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_experience_info.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_experience_info">
+ <text name="title" value="Profil de l&apos;expérience"/>
+ <scroll_container name="xp_scroll">
+ <panel name="scrolling_panel">
+ <layout_stack>
+ <layout_panel>
+ <text name="experience_title" value="Kyle&apos;s Superhero RPG"/>
+ </layout_panel>
+ <layout_panel name="location panel">
+ <text name="Location">
+ Endroit :
+ </text>
+ <text name="LocationTextText">
+ quelque part
+ </text>
+ <button label="Téléporter" name="teleport_btn"/>
+ <button label="Carte" name="map_btn"/>
+ </layout_panel>
+ <layout_panel name="marketplace panel">
+ <text name="Location">
+ Boutique de la Place du marché :
+ </text>
+ <text name="LocationTextText">
+ quelque part
+ </text>
+ </layout_panel>
+ <layout_panel>
+ <text name="ContentRating">
+ Catégorie :
+ </text>
+ <text name="ContentRatingText">
+ Adulte
+ </text>
+ <text name="Owner">
+ Propriétaire :
+ </text>
+ <text name="OwnerText">
+ Kyle
+ </text>
+ <button label="Modifier" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_experience_list_editor.xml b/indra/newview/skins/default/xui/fr/panel_experience_list_editor.xml
new file mode 100644
index 0000000000..d1c448b425
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_experience_list_editor.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="experince_list_editor">
+ <panel.string name="loading">
+ en cours de chargement...
+ </panel.string>
+ <panel.string name="panel_allowed">
+ Expériences autorisées :
+ </panel.string>
+ <panel.string name="panel_blocked">
+ Expériences bloquées :
+ </panel.string>
+ <panel.string name="panel_trusted">
+ Expériences avec clé :
+ </panel.string>
+ <panel.string name="no_results">
+ (vide)
+ </panel.string>
+ <text name="text_name">
+ Liste des expériences
+ </text>
+ <scroll_list name="experience_list">
+ <columns label="Nom" name="experience_name"/>
+ </scroll_list>
+ <button label="Ajouter..." name="btn_add"/>
+ <button label="Supprimer" name="btn_remove"/>
+ <button label="Profil..." name="btn_profile"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_experience_list_item.xml b/indra/newview/skins/default/xui/fr/panel_experience_list_item.xml
new file mode 100644
index 0000000000..c28f85f5eb
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_experience_list_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiences">
+ <text name="experience_name">
+ Dummy Name
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_experience_log.xml b/indra/newview/skins/default/xui/fr/panel_experience_log.xml
new file mode 100644
index 0000000000..cc9eb3dbe3
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_experience_log.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="EVENTS">
+ <string name="no_events" value="Aucun événement."/>
+ <string name="loading" value="en cours de chargement..."/>
+ <layout_stack>
+ <layout_panel>
+ <scroll_list name="experience_log_list">
+ <columns label="Durée" name="time"/>
+ <columns label="Événement" name="event"/>
+ <columns label="Expérience" name="experience_name"/>
+ <columns label="Objet" name="object_name"/>
+ </scroll_list>
+ <button label="Prévenir" name="btn_notify"/>
+ <button label="Profil" name="btn_profile_xp"/>
+ <button label="Signaler" name="btn_report_xp"/>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <check_box label="Prévenir de tous les événements jours" name="notify_all"/>
+ <button label="Effacer" name="btn_clear"/>
+ <button label="&lt;" name="btn_prev"/>
+ <button label="&gt;" name="btn_next"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_experience_search.xml b/indra/newview/skins/default/xui/fr/panel_experience_search.xml
new file mode 100644
index 0000000000..13495057d4
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_experience_search.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="SEARCH">
+ <string name="not_found">
+ &apos;[TEXT]&apos; introuvable
+ </string>
+ <string name="no_results">
+ Aucun résultat
+ </string>
+ <string name="searching">
+ Recherche...
+ </string>
+ <string name="loading">
+ Chargement...
+ </string>
+ <string name="maturity_icon_general">
+ &quot;Parcel_PG_Light&quot;
+ </string>
+ <string name="maturity_icon_moderate">
+ &quot;Parcel_M_Light&quot;
+ </string>
+ <string name="maturity_icon_adult">
+ &quot;Parcel_R_Light&quot;
+ </string>
+ <panel name="search_panel">
+ <button label="OK" name="find"/>
+ <icons_combo_box label="Modéré" name="maturity">
+ <icons_combo_box.item label="Adulte" name="Adult" value="42"/>
+ <icons_combo_box.item label="Modéré" name="Mature" value="21"/>
+ <icons_combo_box.item label="Général" name="PG" value="13"/>
+ </icons_combo_box>
+ <scroll_list name="search_results">
+ <columns label="Nom" name="experience_name"/>
+ <columns label="Propriétaire" name="owner"/>
+ </scroll_list>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="Annuler" name="cancel_btn"/>
+ <button label="Voir le profil" name="profile_btn"/>
+ <button label="&lt;" name="left_btn"/>
+ <button label="&gt;" name="right_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_experiences.xml b/indra/newview/skins/default/xui/fr/panel_experiences.xml
new file mode 100644
index 0000000000..f95a664531
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_experiences.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiences">
+ <string name="loading_experiences" value="Chargement des expériences..."/>
+ <string name="no_experiences" value="Aucune expérience."/>
+ <string name="acquire" value="Acquérir une expérience"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_facebook_friends.xml b/indra/newview/skins/default/xui/fr/panel_facebook_friends.xml
index 3ac0ce229c..319737a2af 100644
--- a/indra/newview/skins/default/xui/fr/panel_facebook_friends.xml
+++ b/indra/newview/skins/default/xui/fr/panel_facebook_friends.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_friends">
<string name="facebook_friends_empty" value="Vous n&apos;avez actuellement aucun ami Facebook qui est également résident de Second Life. Invitez vos amis Facebook à rejoindre Second Life !"/>
- <string name="facebook_friends_no_connected" value="Vous n&apos;êtes pas connecté(e) à Facebook. Allez à l&apos;onglet Compte pour vous connecter et activer cette fonctionnalité."/>
+ <string name="facebook_friends_no_connected" value="Vous n&apos;êtes pas connecté(e) à Facebook. Allez à l&apos;onglet Statut pour vous connecter et activer cette fonctionnalité."/>
<accordion name="friends_accordion">
<accordion_tab name="tab_second_life_friends" title="Amis SL"/>
<accordion_tab name="tab_suggested_friends" title="Ajouter ces personnes en tant qu&apos;amis SL"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_facebook_photo.xml b/indra/newview/skins/default/xui/fr/panel_facebook_photo.xml
index c5b09c4bcc..3236f35b55 100644
--- a/indra/newview/skins/default/xui/fr/panel_facebook_photo.xml
+++ b/indra/newview/skins/default/xui/fr/panel_facebook_photo.xml
@@ -1,26 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Résolution d’image">
- <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
- <combo_box.item label="640 x 480" name="640x480"/>
- <combo_box.item label="800 x 600" name="800x600"/>
- <combo_box.item label="1 024 x 768" name="1024x768"/>
- <combo_box.item label="1 200 x 630" name="1200x630"/>
- </combo_box>
- <combo_box name="filters_combobox" tool_tip="Filtres d&apos;image">
- <combo_box.item label="Aucun filtre" name="NoFilter"/>
- </combo_box>
- <button label="Actualiser" name="new_snapshot_btn" tool_tip="Cliquer pour actualiser"/>
- <button label="Aperçu" name="big_preview_btn" tool_tip="Cliquer pour activer/désactiver l&apos;aperçu"/>
- <text name="caption_label">
- Commentaire (facultatif) :
- </text>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Publier" name="post_photo_btn"/>
- <button label="Annuler" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <combo_box name="resolution_combobox" tool_tip="Résolution d’image">
+ <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
+ <combo_box.item label="640 x 480" name="640x480"/>
+ <combo_box.item label="800 x 600" name="800x600"/>
+ <combo_box.item label="1 024 x 768" name="1024x768"/>
+ <combo_box.item label="1 200 x 630" name="1200x630"/>
+ </combo_box>
+ <combo_box name="filters_combobox" tool_tip="Filtres d&apos;image">
+ <combo_box.item label="Aucun filtre" name="NoFilter"/>
+ </combo_box>
+ <button label="Actualiser" name="new_snapshot_btn" tool_tip="Cliquer pour actualiser"/>
+ <button label="Aperçu" name="big_preview_btn" tool_tip="Cliquer pour activer/désactiver l&apos;aperçu"/>
+ <text name="caption_label">
+ Commentaire (facultatif) :
+ </text>
+ <button label="Publier" name="post_photo_btn"/>
+ <button label="Annuler" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_facebook_place.xml b/indra/newview/skins/default/xui/fr/panel_facebook_place.xml
index 0eaea66ad4..f8e597450b 100644
--- a/indra/newview/skins/default/xui/fr/panel_facebook_place.xml
+++ b/indra/newview/skins/default/xui/fr/panel_facebook_place.xml
@@ -1,17 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_place">
- <layout_stack name="stack_place">
- <layout_panel name="place_detail_panel">
- <text name="place_caption_label">
- Dites quelque chose au sujet du lieu où vous vous trouvez :
- </text>
- </layout_panel>
- <layout_panel name="place_map_panel">
- <check_box initial_value="false" label="" name="add_place_view_cb"/>
- </layout_panel>
- <layout_panel name="place_button_panel">
- <button label="Publier" name="post_place_btn"/>
- <button label="Annuler" name="cancel_place_btn"/>
- </layout_panel>
- </layout_stack>
+ <text name="place_caption_label">
+ Dites quelque chose au sujet du lieu où vous vous trouvez :
+ </text>
+ <check_box initial_value="false" label="Inclure la vue aérienne du lieu" name="add_place_view_cb"/>
+ <button label="Publier" name="post_place_btn"/>
+ <button label="Annuler" name="cancel_place_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_facebook_status.xml b/indra/newview/skins/default/xui/fr/panel_facebook_status.xml
index 260378978b..9afa42d2aa 100644
--- a/indra/newview/skins/default/xui/fr/panel_facebook_status.xml
+++ b/indra/newview/skins/default/xui/fr/panel_facebook_status.xml
@@ -1,14 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_status">
- <layout_stack name="stack_status">
- <layout_panel name="status_detail_panel">
- <text name="status_caption_label">
- À quoi pensez-vous ?
- </text>
- </layout_panel>
- <layout_panel name="status_button_panel">
- <button label="Publier" name="post_status_btn"/>
- <button label="Annuler" name="cancel_status_btn"/>
- </layout_panel>
- </layout_stack>
+ <string name="facebook_connected" value="Vous êtes connecté(e) à Facebook en tant que :"/>
+ <string name="facebook_disconnected" value="Pas connecté(e) à Facebook"/>
+ <text name="account_caption_label">
+ Pas connecté(e) à Facebook.
+ </text>
+ <panel name="panel_buttons">
+ <button label="Connexion..." name="connect_btn"/>
+ <button label="Déconnexion" name="disconnect_btn"/>
+ <text name="account_learn_more_label">
+ [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 Apprenez comment publier sur Facebook]
+ </text>
+ </panel>
+ <text name="status_caption_label">
+ À quoi pensez-vous ?
+ </text>
+ <button label="Publier" name="post_status_btn"/>
+ <button label="Annuler" name="cancel_status_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_flickr_photo.xml b/indra/newview/skins/default/xui/fr/panel_flickr_photo.xml
index 63738a773a..7b3a176703 100644
--- a/indra/newview/skins/default/xui/fr/panel_flickr_photo.xml
+++ b/indra/newview/skins/default/xui/fr/panel_flickr_photo.xml
@@ -1,41 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_flickr_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Résolution d’image">
- <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
- <combo_box.item label="640 x 480" name="640x480"/>
- <combo_box.item label="800 x 600" name="800x600"/>
- <combo_box.item label="1 024 x 768" name="1024x768"/>
- </combo_box>
- <combo_box name="filters_combobox" tool_tip="Filtres d&apos;image">
- <combo_box.item label="Aucun filtre" name="NoFilter"/>
- </combo_box>
- <button label="Actualiser" name="new_snapshot_btn" tool_tip="Cliquer pour actualiser"/>
- <button label="Aperçu" name="big_preview_btn" tool_tip="Cliquer pour activer/désactiver l&apos;aperçu"/>
- <text name="title_label">
- Titre :
- </text>
- <text name="description_label">
- Description :
- </text>
- <check_box initial_value="true" label="Inclure l&apos;emplacement SL à la fin de la description" name="add_location_cb"/>
- <text name="tags_label">
- Balises :
- </text>
- <text name="tags_help_label">
- Séparer les balises par des espaces
+ <combo_box name="resolution_combobox" tool_tip="Résolution d’image">
+ <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
+ <combo_box.item label="640 x 480" name="640x480"/>
+ <combo_box.item label="800 x 600" name="800x600"/>
+ <combo_box.item label="1 024 x 768" name="1024x768"/>
+ </combo_box>
+ <combo_box name="filters_combobox" tool_tip="Filtres d&apos;image">
+ <combo_box.item label="Aucun filtre" name="NoFilter"/>
+ </combo_box>
+ <button label="Actualiser" name="new_snapshot_btn" tool_tip="Cliquer pour actualiser"/>
+ <button label="Aperçu" name="big_preview_btn" tool_tip="Cliquer pour activer/désactiver l&apos;aperçu"/>
+ <text name="title_label">
+ Titre :
+ </text>
+ <text name="description_label">
+ Description :
+ </text>
+ <check_box initial_value="true" label="Inclure l&apos;emplacement SL à la fin de la description" name="add_location_cb"/>
+ <text name="tags_label">
+ Balises :
+ </text>
+ <text name="tags_help_label">
+ Séparer les balises par des espaces
Utiliser &quot;&quot; pour les balises contenant plusieurs mots
- </text>
- <combo_box name="rating_combobox" tool_tip="Catégorie de contenu Flickr">
- <combo_box.item label="Catégorie de contenu Flickr sûr" name="SafeRating"/>
- <combo_box.item label="Catégorie de contenu Flickr modéré" name="ModerateRating"/>
- <combo_box.item label="Catégorie de contenu Flickr réservé aux adultes" name="RestrictedRating"/>
- </combo_box>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Charger" name="post_photo_btn"/>
- <button label="Annuler" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ </text>
+ <combo_box name="rating_combobox" tool_tip="Catégorie de contenu Flickr">
+ <combo_box.item label="Catégorie de contenu Flickr sûr" name="SafeRating"/>
+ <combo_box.item label="Catégorie de contenu Flickr modéré" name="ModerateRating"/>
+ <combo_box.item label="Catégorie de contenu Flickr réservé aux adultes" name="RestrictedRating"/>
+ </combo_box>
+ <button label="Charger" name="post_photo_btn"/>
+ <button label="Annuler" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml
index 7c3b852de1..bea114af6c 100755
--- a/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml
@@ -23,6 +23,7 @@
<accordion_tab name="group_roles_tab" title="Rôles et membres"/>
<accordion_tab name="group_notices_tab" title="Notices"/>
<accordion_tab name="group_land_tab" title="Terrain/Actifs"/>
+ <accordion_tab name="group_experiences_tab" title="Expériences"/>
</accordion>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml
index b39920fe13..2b8249c8a9 100755
--- a/indra/newview/skins/default/xui/fr/panel_login.xml
+++ b/indra/newview/skins/default/xui/fr/panel_login.xml
@@ -1,27 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_login">
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=fr
- </panel.string>
+ <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=fr</panel.string>
<layout_stack name="ui_stack">
<layout_panel name="ui_container">
<combo_box label="Nom d&apos;utilisateur" name="username_combo" tool_tip="Nom d&apos;utilisateur que vous avez choisi lors de votre inscription (par exemple, bobsmith12 ou Steller Sunshine)."/>
<line_editor label="Mot de passe" name="password_edit"/>
- <check_box label="Mémoriser mes informations" name="remember_check"/>
- <text name="forgot_password_text">
- Mot de passe oublié
- </text>
- <button label="Connexion" name="connect_btn"/>
- <text name="At_My_Last_Location_Label" font="SansSerifSmall" width="140">
- au dernier emplacement
- </text>
<combo_box label="Mes lieux préférés" name="start_location_combo">
+ <combo_box.item label="Dernier emplacement" name="MyLastLocation"/>
<combo_box.item label="Domicile" name="MyHome"/>
</combo_box>
- <button label="Connexion" name="connect_favorite_btn"/>
- <line_editor label="Tapez un emplacement" name="location_edit"/>
- <button label="Connexion" name="connect_location_btn"/>
- <combo_box label="Sélectionner la grille" name="server_combo"/>
+ <button label="Connexion" name="connect_btn"/>
+ <check_box label="Mémoriser mes informations" name="remember_check"/>
+ <text name="forgot_password_text">Mot de passe oublié</text>
+ <combo_box label="Sélectionner la grille" name="server_combo" left_pad="20"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_marketplace_listings.xml b/indra/newview/skins/default/xui/fr/panel_marketplace_listings.xml
new file mode 100644
index 0000000000..46578182da
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_marketplace_listings.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Place du marché" name="Marketplace Panel">
+ <panel name="tool_panel">
+ <menu_button name="sort_btn" tool_tip="Options d&apos;affichage/de tri"/>
+ <button name="add_btn" tool_tip="Créer un nouveau dossier d&apos;annonces"/>
+ <button label="Consulter les erreurs" name="audit_btn" tool_tip="Consulter vos annonces de Place du marché"/>
+ </panel>
+ <panel name="tab_container_panel">
+ <filter_editor label="Filtrer les annonces de Place du marché" name="filter_editor"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_marketplace_listings_inventory.xml b/indra/newview/skins/default/xui/fr/panel_marketplace_listings_inventory.xml
new file mode 100644
index 0000000000..fdee447a29
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_marketplace_listings_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="TOUT" name="All Items" tool_tip="Faire glisser les objets et les déposer ici pour les publier"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_marketplace_listings_listed.xml b/indra/newview/skins/default/xui/fr/panel_marketplace_listings_listed.xml
new file mode 100644
index 0000000000..d3d476af6e
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_marketplace_listings_listed.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="PUBLIÉS" name="Active Items"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_marketplace_listings_unassociated.xml b/indra/newview/skins/default/xui/fr/panel_marketplace_listings_unassociated.xml
new file mode 100644
index 0000000000..95018e339f
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_marketplace_listings_unassociated.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="DÉSASSOCIÉE" name="Unassociated Items"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_marketplace_listings_unlisted.xml b/indra/newview/skins/default/xui/fr/panel_marketplace_listings_unlisted.xml
new file mode 100644
index 0000000000..5d811af914
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_marketplace_listings_unlisted.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="NON PUBLIÉS" name="Inactive Items"/>
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 945a5e0272..eebf84c0d0 100755
--- a/indra/newview/skins/default/xui/fr/panel_postcard_settings.xml
+++ b/indra/newview/skins/default/xui/fr/panel_postcard_settings.xml
@@ -7,17 +7,7 @@
<combo_box.item label="1 024 x 768" name="1024x768"/>
<combo_box.item label="Personnalisée" name="Custom"/>
</combo_box>
- <layout_stack name="postcard_image_params_ls">
- <layout_panel name="postcard_image_size_lp">
- <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é image" name="image_quality_slider"/>
- <text name="image_quality_level">
- ([QLVL])
- </text>
- </layout_panel>
- </layout_stack>
+ <spinner label="Largeur x Hauteur" name="postcard_snapshot_width"/>
+ <check_box label="Conserver les proportions" name="postcard_keep_aspect_check"/>
+ <slider label="Qualité :" name="image_quality_slider"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
index 50f4a49bd0..e2f9b9567c 100755
--- a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
@@ -14,9 +14,9 @@
<text name="Web:">
Web :
</text>
- <radio_group name="use_external_browser">
- <radio_item label="Utiliser mon navigateur (IE, Firefox, Safari)" name="external" tool_tip="Utiliser le navigateur web système par défaut pour l&apos;aide, les liens etc. Non recommandé en mode plein écran." value="true"/>
- <radio_item label="Utiliser le navigateur intégré" name="internal" tool_tip="Utilisez le navigateur intégré pour obtenir de l&apos;aide, ouvrir des liens, etc. Ce navigateur s&apos;ouvre dans [APP_NAME]." value=""/>
+ <radio_group name="preferred_browser_behavior">
+ <radio_item label="Utiliser mon navigateur (Chrome, Firefox, IE) pour tous les liens" name="internal" tool_tip="Utiliser le navigateur web système par défaut pour l&apos;aide, les liens, etc. Non recommandé en mode plein écran." value="0"/>
+ <radio_item label="Utiliser le navigateur intégré pour les liens Second Life uniquement" name="external" tool_tip="Utilisez le navigateur web système par défaut pour l&apos;aide, les liens Web, etc. Le navigateur intégré sera uniquement utilisé pour les liens LindenLab/SecondLife." value="1"/>
</radio_group>
<check_box initial_value="true" label="Activer les plugins" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Accepter les cookies" name="cookies_enabled"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_experiences.xml b/indra/newview/skins/default/xui/fr/panel_region_experiences.xml
new file mode 100644
index 0000000000..be9c99b009
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_region_experiences.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Expériences" name="Experiences">
+ <panel.string name="trusted_estate_text">
+ Toute expérience peut être une expérience avec clé.
+
+Les expériences avec clé peuvent s&apos;exécuter dans ce domaine.
+
+En outre, si le domaine n&apos;autorise pas l&apos;accès public, les résidents participant à une expérience avec clé peuvent pénétrer dans ce domaine et y rester tant qu&apos;ils participent à ladite expérience.
+ </panel.string>
+ <panel.string name="allowed_estate_text">
+ Seules les expériences à l&apos;échelle des terrains peuvent être autorisées.
+
+Les expériences autorisées peuvent s&apos;exécuter dans ce domaine.
+ </panel.string>
+ <panel.string name="blocked_estate_text">
+ Seules les expériences à l&apos;échelle de la grille peuvent être bloquées.
+
+Les expériences bloquées ne peuvent pas s&apos;exécuter dans ce domaine.
+ </panel.string>
+ <panel.string name="estate_caption">
+ Les modifications des paramètres de cet onglet affecteront toutes les régions du domaine.
+ </panel.string>
+ <panel.string name="allowed_parcel_text">
+ Seules les expériences à l&apos;échelle des terrains peuvent être autorisées.
+
+Les expériences autorisées peuvent s&apos;exécuter sur cette parcelle si elles ne sont pas bloquées par le domaine.
+ </panel.string>
+ <panel.string name="blocked_parcel_text">
+ Toute expérience de résident peut être bloquée.
+
+Les expériences bloquées ne peuvent pas s&apos;exécuter dans cette parcelle.
+ </panel.string>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_script_experience.xml b/indra/newview/skins/default/xui/fr/panel_script_experience.xml
new file mode 100644
index 0000000000..dde84ed845
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_script_experience.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel name="script_experience" title="EXPÉRIENCE">
+ <button label="Expérience" name="Expand Experience"/>
+ <check_box label="Utilise la ou les expériences :" name="enable_xp"/>
+ <layout_stack name="xp_details">
+ <layout_panel>
+ <combo_box label="Choisir une expérience..." name="Experiences..."/>
+ </layout_panel>
+ </layout_stack>
+ <text name="No Experiences">
+ Vous ne contribuez à aucune expérience.
+ </text>
+</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 472c4a5e8f..a560ff8d5e 100755
--- a/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_inventory">
<text name="title">
- Enregistrer dans l&apos;inventaire
+ Inventaire
</text>
<text name="hint_lbl">
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é.
@@ -13,8 +13,8 @@
<combo_box.item label="Grande (512 x 512)" name="Large(512x512)"/>
<combo_box.item label="Personnalisée" name="Custom"/>
</combo_box>
- <spinner label="Largeur" name="inventory_snapshot_width"/>
- <spinner label="Hauteur" name="inventory_snapshot_height"/>
+ <spinner label="Largeur x Hauteur" name="inventory_snapshot_width"/>
+ <spinner label="" name="inventory_snapshot_height"/>
<check_box label="Conserver les proportions" name="inventory_keep_aspect_check"/>
<button label="Annuler" name="cancel_btn"/>
<button label="Enregistrer" name="save_btn"/>
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 97dc3e7e2b..8d361f0605 100755
--- a/indra/newview/skins/default/xui/fr/panel_snapshot_local.xml
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_local.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_local">
<text name="title">
- Enregistrer sur l&apos;ordinateur
+ Disque
</text>
<combo_box label="Résolution" name="local_size_combo">
<combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
@@ -13,24 +13,17 @@
<combo_box.item label="1 600 x 1 200" name="1600x1200"/>
<combo_box.item label="Personnalisée" name="Custom"/>
</combo_box>
- <layout_stack name="local_image_params_ls">
- <layout_panel name="local_image_size_lp">
- <spinner label="Largeur" name="local_snapshot_width"/>
- <spinner label="Hauteur" name="local_snapshot_height"/>
- <check_box label="Conserver les proportions" name="local_keep_aspect_check"/>
- </layout_panel>
- <layout_panel name="local_image_format_quality_lp">
- <combo_box label="Format" name="local_format_combo">
- <combo_box.item label="PNG (sans perte)" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP (sans perte)" name="BMP"/>
- </combo_box>
- <slider label="Qualité image" name="image_quality_slider"/>
- <text name="image_quality_level">
- ([QLVL])
- </text>
- </layout_panel>
- </layout_stack>
+ <spinner label="Largeur x Hauteur" name="local_snapshot_width"/>
+ <check_box label="Conserver les proportions" name="local_keep_aspect_check"/>
+ <text name="local_format_label">
+ Format :
+ </text>
+ <combo_box label="Format" name="local_format_combo">
+ <combo_box.item label="PNG (sans perte)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (sans perte)" name="BMP"/>
+ </combo_box>
+ <slider label="Qualité :" name="image_quality_slider"/>
<button label="Annuler" name="cancel_btn"/>
<flyout_button label="Enregistrer" name="save_btn" tool_tip="Enregistrer l&apos;image dans un fichier.">
<flyout_button.item label="Enregistrer" name="save_item"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml
index bb858d5d23..eb724f4bd1 100755
--- a/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml
@@ -1,16 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_options">
- <button label="Publier sur le flux de mon profil" name="save_to_profile_btn"/>
- <button label="Envoyer par e-mail" name="save_to_email_btn"/>
+ <button label="Enreg. sur le disque" name="save_to_computer_btn"/>
<button label="Enreg. dans l&apos;inventaire ([AMOUNT] L$)" name="save_to_inventory_btn"/>
- <button label="Enreg. sur l&apos;ordinateur" name="save_to_computer_btn"/>
- <text name="send_to_facebook_textbox">
- Envoyer à : [secondlife:/// Facebook]
- </text>
- <text name="send_to_twitter_textbox">
- [secondlife:/// Twitter]
- </text>
- <text name="send_to_flickr_textbox">
- [secondlife:/// Flickr]
- </text>
+ <button label="Charger dans le profil" name="save_to_profile_btn"/>
+ <button label="Charger sur Facebook" name="send_to_facebook_btn"/>
+ <button label="Charger sur Twitter" name="send_to_twitter_btn"/>
+ <button label="Charger sur Flickr" name="send_to_flickr_btn"/>
+ <button label="Envoyer par e-mail" name="save_to_email_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml
index 82a4815144..067fa091d8 100755..100644
--- a/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml
@@ -12,6 +12,10 @@
<text name="title">
E-mail
</text>
- <button label="Message" name="message_btn"/>
- <button label="Paramètres" name="settings_btn"/>
+ <tab_container name="postcard_tabs">
+ <panel label="Message" name="panel_postcard_message"/>
+ <panel label="Paramètres" name="panel_postcard_settings"/>
+ </tab_container>
+ <button label="Annuler" name="cancel_btn"/>
+ <button label="Envoyer" name="send_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_profile.xml
index 427ffe2113..b87d62bedd 100755
--- a/indra/newview/skins/default/xui/fr/panel_snapshot_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_profile.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_profile">
<text name="title">
- Publier sur le flux de mon profil
+ Profil
</text>
<combo_box label="Résolution" name="profile_size_combo">
<combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
@@ -10,19 +10,12 @@
<combo_box.item label="1 024 x 768" name="1024x768"/>
<combo_box.item label="Personnalisée" name="Custom"/>
</combo_box>
- <layout_stack name="profile_image_params_ls">
- <layout_panel name="profile_image_size_lp">
- <spinner label="Largeur" name="profile_snapshot_width"/>
- <spinner label="Hauteur" name="profile_snapshot_height"/>
- <check_box label="Conserver les proportions" name="profile_keep_aspect_check"/>
- </layout_panel>
- <layout_panel name="profile_image_metadata_lp">
- <text name="caption_label">
- Légende :
- </text>
- <check_box initial_value="true" label="Inclure l&apos;endroit" name="add_location_cb"/>
- </layout_panel>
- </layout_stack>
+ <spinner label="Largeur x Hauteur" name="profile_snapshot_width"/>
+ <check_box label="Conserver les proportions" name="profile_keep_aspect_check"/>
+ <text name="caption_label">
+ Légende :
+ </text>
+ <check_box initial_value="true" label="Inclure l&apos;endroit" name="add_location_cb"/>
<button label="Annuler" name="cancel_btn"/>
<button label="Publier" name="post_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_status_bar.xml b/indra/newview/skins/default/xui/fr/panel_status_bar.xml
index ba36a7d299..e2f05a525e 100755
--- a/indra/newview/skins/default/xui/fr/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_status_bar.xml
@@ -1,28 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <panel.string name="packet_loss_tooltip">
- Perte de paquets
- </panel.string>
- <panel.string name="bandwidth_tooltip">
- Bande passante
- </panel.string>
- <panel.string name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string name="timeTooltip">
- [weekday, datetime, slt] [sday, datetime, slt] [month, datetime, slt] [year, datetime, slt]
- </panel.string>
- <panel.string name="buycurrencylabel">
- [AMT] L$
- </panel.string>
+ <panel.string name="packet_loss_tooltip">Perte de paquets</panel.string>
+ <panel.string name="bandwidth_tooltip">Bande passante</panel.string>
+ <panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>
+ <panel.string name="timeTooltip">[weekday, datetime, slt] [sday, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>
+ <panel.string name="buycurrencylabel">[AMT] L$</panel.string>
<panel left="-405" name="balance_bg" width="195">
- <text name="balance" tool_tip="Cliquer sur ce bouton pour actualiser votre solde en L$." value="20 L$"/>
+ <text name="balance" tool_tip="Cliquer sur ce bouton pour actualiser votre solde en L$." value="L$ ??"/>
<button label="Acheter L$" name="buyL" tool_tip="Cliquer pour acheter plus de L$."/>
<button label="Achats" name="goShop" tool_tip="Ouvrir la Place du marché Second Life." width="75"/>
</panel>
- <text name="TimeText" tool_tip="Heure actuelle (Pacifique)">
- 00h00 PST
- </text>
+ <text name="TimeText" tool_tip="Heure actuelle (Pacifique)">00h00 PST</text>
<button name="media_toggle_btn" tool_tip="Arrêter tous les médias (musique, vidéo, pages web)."/>
<button name="volume_btn" tool_tip="Régler le volume global."/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_twitter_photo.xml b/indra/newview/skins/default/xui/fr/panel_twitter_photo.xml
index 2d3888f4c2..3e23e5d577 100644
--- a/indra/newview/skins/default/xui/fr/panel_twitter_photo.xml
+++ b/indra/newview/skins/default/xui/fr/panel_twitter_photo.xml
@@ -1,32 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_twitter_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="text_panel">
- <text name="status_label">
- Que se passe-t-il ?
- </text>
- <text name="status_counter_label">
- 140
- </text>
- <check_box initial_value="true" label="Inclure l&apos;emplacement SL" name="add_location_cb"/>
- <check_box initial_value="true" label="Inclure une photo" name="add_photo_cb"/>
- </layout_panel>
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Résolution d’image">
- <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
- <combo_box.item label="640 x 480" name="640x480"/>
- <combo_box.item label="800 x 600" name="800x600"/>
- <combo_box.item label="1 024 x 768" name="1024x768"/>
- </combo_box>
- <combo_box name="filters_combobox" tool_tip="Filtres d&apos;image">
- <combo_box.item label="Aucun filtre" name="NoFilter"/>
- </combo_box>
- <button label="Actualiser" name="new_snapshot_btn" tool_tip="Cliquer pour actualiser"/>
- <button label="Aperçu" name="big_preview_btn" tool_tip="Cliquer pour activer/désactiver l&apos;aperçu"/>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Envoyer tweet" name="post_photo_btn"/>
- <button label="Annuler" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <text name="status_label">
+ Que se passe-t-il ?
+ </text>
+ <text name="status_counter_label">
+ 140
+ </text>
+ <check_box initial_value="true" label="Inclure l&apos;emplacement SL" name="add_location_cb"/>
+ <check_box initial_value="true" label="Inclure une photo" name="add_photo_cb"/>
+ <combo_box name="resolution_combobox" tool_tip="Résolution d’image">
+ <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
+ <combo_box.item label="640 x 480" name="640x480"/>
+ <combo_box.item label="800 x 600" name="800x600"/>
+ <combo_box.item label="1 024 x 768" name="1024x768"/>
+ </combo_box>
+ <combo_box name="filters_combobox" tool_tip="Filtres d&apos;image">
+ <combo_box.item label="Aucun filtre" name="NoFilter"/>
+ </combo_box>
+ <button label="Actualiser" name="new_snapshot_btn" tool_tip="Cliquer pour actualiser"/>
+ <button label="Aperçu" name="big_preview_btn" tool_tip="Cliquer pour activer/désactiver l&apos;aperçu"/>
+ <button label="Envoyer tweet" name="post_photo_btn"/>
+ <button label="Annuler" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/role_actions.xml b/indra/newview/skins/default/xui/fr/role_actions.xml
index 25920da4c3..966e3440e5 100755
--- a/indra/newview/skins/default/xui/fr/role_actions.xml
+++ b/indra/newview/skins/default/xui/fr/role_actions.xml
@@ -71,4 +71,8 @@
<action description="Participer au chat vocal" longdescription="Participez au chat vocal du groupe. Remarque : vous devez au préalable avoir le pouvoir de participer aux chats." name="join voice chat" value="27"/>
<action description="Modérer les chats" longdescription="Contrôlez l&apos;accès et la participation aux chats de groupe écrits et vocaux." name="moderate group chat" value="37"/>
</action_set>
+ <action_set description="Ces pouvoirs incluent la possibilité de modifier les expériences appartenant à ce groupe." name="experience_tools_experience">
+ <action description="Administrateur des expériences" longdescription="Les membres dotés d&apos;un rôle avec ce pouvoir peuvent modifier les métadonnées pour cette expérience." name="experience admin" value="49"/>
+ <action description="Contributeur aux expériences" longdescription="Les membres dotés d&apos;un rôle avec ce pouvoir peuvent contribuer des scripts pour une expérience." name="experience contributor" value="50"/>
+ </action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml
index e7fc7859c9..ede5ec08af 100755
--- a/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="item properties" title="Profil de l&apos;article">
+ <panel.string name="loading_experience">
+ (chargement)
+ </panel.string>
<panel.string name="unknown">
(inconnu)
</panel.string>
@@ -43,6 +46,9 @@
<text name="LabelAcquiredTitle">
Acquis le :
</text>
+ <text name="LabelItemExperienceTitle">
+ Expérience :
+ </text>
<panel name="perms_inv">
<text name="perm_modify">
Vous pouvez :
@@ -66,8 +72,9 @@
<check_box label="Transférer" name="CheckNextOwnerTransfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet."/>
</panel>
<check_box label="À vendre" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
+ <combo_box name="ComboBoxSaleType">
<combo_box.item label="Copier" name="Copy"/>
+ <combo_box.item label="Contenu" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
<spinner label="Prix : L$" name="Edit Cost"/>
diff --git a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
index 896dd932e3..f6b4f28046 100755
--- a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
@@ -1,71 +1,31 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="object properties" title="Profil de l&apos;objet">
- <panel.string name="text deed continued">
- Céder
- </panel.string>
- <panel.string name="text deed">
- Céder
- </panel.string>
- <panel.string name="text modify info 1">
- Vous pouvez modifier cet objet
- </panel.string>
- <panel.string name="text modify info 2">
- Vous pouvez modifier ces objets
- </panel.string>
- <panel.string name="text modify info 3">
- Vous ne pouvez pas modifier cet objet
- </panel.string>
- <panel.string name="text modify info 4">
- Vous ne pouvez pas modifier ces objets
- </panel.string>
- <panel.string name="text modify info 5">
- Impossible de modifier cet objet au-delà de la frontière d&apos;une région
- </panel.string>
- <panel.string name="text modify info 6">
- Impossible de modifier ces objets au-delà de la frontière d&apos;une région
- </panel.string>
- <panel.string name="text modify warning">
- Cet objet comprend des parties liées
- </panel.string>
- <panel.string name="Cost Default">
- Prix : L$
- </panel.string>
- <panel.string name="Cost Total">
- Prix total : L$
- </panel.string>
- <panel.string name="Cost Per Unit">
- Prix par : L$
- </panel.string>
- <panel.string name="Cost Mixed">
- Prix mixte
- </panel.string>
- <panel.string name="Sale Mixed">
- Vente mixte
- </panel.string>
+ <panel.string name="text deed continued">Céder</panel.string>
+ <panel.string name="text deed">Céder</panel.string>
+ <panel.string name="text modify info 1">Vous pouvez modifier cet objet</panel.string>
+ <panel.string name="text modify info 2">Vous pouvez modifier ces objets</panel.string>
+ <panel.string name="text modify info 3">Vous ne pouvez pas modifier cet objet</panel.string>
+ <panel.string name="text modify info 4">Vous ne pouvez pas modifier ces objets</panel.string>
+ <panel.string name="text modify info 5">Impossible de modifier cet objet au-delà de la frontière d&apos;une région</panel.string>
+ <panel.string name="text modify info 6">Impossible de modifier ces objets au-delà de la frontière d&apos;une région</panel.string>
+ <panel.string name="text modify warning">Cet objet comprend des parties liées</panel.string>
+ <panel.string name="Cost Default">Prix : L$</panel.string>
+ <panel.string name="Cost Total">Prix total : L$</panel.string>
+ <panel.string name="Cost Per Unit">Prix par : L$</panel.string>
+ <panel.string name="Cost Mixed">Prix mixte</panel.string>
+ <panel.string name="Sale Mixed">Vente mixte</panel.string>
<text name="title" value="Profil de l&apos;objet"/>
<text name="where" value="(dans Second Life)"/>
<panel label="" name="properties_panel">
- <text name="Name:">
- Nom :
- </text>
- <text name="Description:">
- Description :
- </text>
- <text name="CreatorNameLabel">
- Créateur :
- </text>
- <text name="Owner:">
- Propriétaire :
- </text>
- <text name="Group_label">
- Groupe :
- </text>
+ <text name="Name:">Nom :</text>
+ <text name="Description:">Description :</text>
+ <text name="CreatorNameLabel">Créateur :</text>
+ <text name="Owner:">Propriétaire :</text>
+ <text name="Group_label">Groupe :</text>
<button name="button set group" tool_tip="Choisir un groupe pour partager les droits relatifs à cet objet"/>
<name_box initial_value="Chargement…" name="Group Name Proxy"/>
<button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les droits au prochain propriétaire. Seul un officier peut céder les objets partagés d&apos;un groupe."/>
- <text name="label click action">
- Cliquer pour :
- </text>
+ <text name="label click action">Cliquer pour :</text>
<combo_box name="clickaction">
<combo_box.item label="Toucher (défaut)" name="Touch/grab(default)"/>
<combo_box.item label="S&apos;asseoir sur l&apos;objet" name="Sitonobject"/>
@@ -75,21 +35,13 @@
<combo_box.item label="Zoom" name="Zoom"/>
</combo_box>
<panel name="perms_inv">
- <text name="perm_modify">
- Vous pouvez modifier cet objet
- </text>
- <text name="Anyone can:">
- N&apos;importe qui :
- </text>
+ <text name="perm_modify">Vous pouvez modifier cet objet</text>
+ <text name="Anyone can:">N&apos;importe qui :</text>
<check_box label="Copier" name="checkbox allow everyone copy"/>
<check_box label="Bouger" name="checkbox allow everyone move"/>
- <text name="GroupLabel">
- Groupe :
- </text>
+ <text name="GroupLabel">Groupe :</text>
<check_box label="Partager" name="checkbox share with group" tool_tip="Autoriser tous les membres du groupe choisi à partager vos droits de modification pour cet objet. Pour activer les restrictions de rôles, vous devez d&apos;abord cliquer sur Céder."/>
- <text name="NextOwnerLabel">
- Le prochain propriétaire :
- </text>
+ <text name="NextOwnerLabel">Le prochain propriétaire :</text>
<check_box label="Modifier" name="checkbox next owner can modify"/>
<check_box label="Copier" name="checkbox next owner can copy"/>
<check_box label="Transférer" name="checkbox next owner can transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/>
@@ -102,27 +54,13 @@
</combo_box>
<spinner label="Prix : L$" name="Edit Cost"/>
<check_box label="Afficher avec la recherche" name="search_check" tool_tip="Permettre aux autres résidents de voir cet objet dans les résultats de recherche"/>
- <text name="pathfinding_attributes_label">
- Attributs de recherche de chemin :
- </text>
- <text name="B:">
- B :
- </text>
- <text name="O:">
- O :
- </text>
- <text name="G:">
- G :
- </text>
- <text name="E:">
- E :
- </text>
- <text name="N:">
- N :
- </text>
- <text name="F:">
- F :
- </text>
+ <text name="pathfinding_attributes_label">Attributs de recherche de chemin :</text>
+ <text name="B:">B :</text>
+ <text name="O:">O :</text>
+ <text name="G:">G :</text>
+ <text name="E:">E :</text>
+ <text name="N:">N :</text>
+ <text name="F:">F :</text>
</panel>
<panel name="button_panel">
<button label="Ouvrir" name="open_btn"/>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index b3ce171633..e462b805e3 100755
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -449,30 +449,51 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="TooltipMustSingleDrop">
Impossible de faire glisser plus d&apos;un objet ici
</string>
+ <string name="TooltipTooManyWearables">
+ Vous ne pouvez pas porter un dossier contenant plus de [AMOUNT] articles. Vous pouvez modifier cette limite dans Avancé &gt; Afficher les paramètres de débogage &gt; WearFolderLimit.
+ </string>
<string name="TooltipPrice" value="[AMOUNT] L$ :"/>
<string name="TooltipOutboxDragToWorld">
- Impossible de rezzer des articles dans la boîte d&apos;envoi vendeur
+ Vous ne pouvez pas rezzer (charger) des articles du dossier Annonces de la Place de marché
+ </string>
+ <string name="TooltipOutboxWorn">
+ Vous ne pouvez pas mettre d&apos;articles que vous portez dans le dossier Annonces de la Place du marché
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ Le niveau de dossiers imbriqués dépasse [AMOUNT]. Diminuez le nombre de niveaux de dossiers imbriqués dans d&apos;autres dossiers. Si nécessaire, placez certains articles dans une boîte.
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Le nombre de sous-dossiers dépasse [AMOUNT]. Diminuez le nombre de sous-dossiers dans votre annonce. Si nécessaire, placez certains articles dans une boîte.
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Le nombre d&apos;articles dépasse [AMOUNT]. Pour pouvoir vendre plus de [AMOUNT] articles au sein d&apos;une même annonce, vous devez placer certains de ces articles dans une boîte.
+ </string>
+ <string name="TooltipOutboxTooManyStockItems">
+ Le nombre d&apos;articles de stock dépasse [AMOUNT].
+ </string>
+ <string name="TooltipOutboxCannotDropOnRoot">
+ Vous ne pouvez déposer des articles ou des dossiers que dans l&apos;onglet TOUT. Veuillez activer cet onglet et déplacer à nouveau article(s) et dossier(s).
</string>
<string name="TooltipOutboxNoTransfer">
- Impossible de vendre ou de transférer un ou plusieurs de ces objets.
+ 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.
+ Vous ne pouvez mettre sur la Place du marché que des articles de votre inventaire
</string>
- <string name="TooltipOutboxWorn">
- Impossible de placer des articles que vous portez dans votre boîte d&apos;envoi vendeur
+ <string name="TooltipOutboxLinked">
+ Vous ne pouvez pas mettre des articles ou dossiers liés sur la Place du marché
</string>
<string name="TooltipOutboxCallingCard">
- Impossible de placer des cartes de visite dans votre boîte d&apos;envoi vendeur
+ Vous ne pouvez pas mettre des cartes de visite sur la Place du marché
</string>
- <string name="TooltipOutboxFolderLevels">
- Il existe plus de 3 niveaux de dossiers imbriqués.
+ <string name="TooltipOutboxDragActive">
+ vous ne pouvez pas déplacer une annonce publiée
</string>
- <string name="TooltipOutboxTooManyFolders">
- Le dossier de niveau supérieur contient plus de 20 sous-dossiers.
+ <string name="TooltipOutboxCannotMoveRoot">
+ Vous ne pouvez pas déplacer le dossier racine des annonces de la Place du marché
</string>
- <string name="TooltipOutboxTooManyObjects">
- Le dossier de niveau supérieur contient plus de 200 articles.
+ <string name="TooltipOutboxMixedStock">
+ tous les articles d&apos;un dossier de stock doivent avoir le même type et droit
</string>
<string name="TooltipDragOntoOwnChild">
Impossible de déplacer un dossier vers son enfant
@@ -1060,9 +1081,7 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="AgentNameSubst">
(Vous)
</string>
- <string name="JoinAnExperience">
- Rejoindre une expérience
- </string>
+ <string name="JoinAnExperience"/><!-- intentionally blank -->
<string name="SilentlyManageEstateAccess">
Supprimer les alertes lors de la gestion des listes d&apos;accès aux domaines
</string>
@@ -1129,6 +1148,12 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="bitmap_image_files">
Images Bitmap
</string>
+ <string name="png_image_files">
+ Images PNG
+ </string>
+ <string name="save_texture_image_files">
+ Images Targa ou PNG
+ </string>
<string name="avi_movie_file">
Fichier de film AVI
</string>
@@ -1378,6 +1403,9 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="FavoritesNoMatchingItems">
Faites glisser un repère ici pour l&apos;ajouter à vos Favoris.
</string>
+ <string name="MarketplaceNoMatchingItems">
+ Aucun article trouvé. Vérifiez l&apos;orthographe de votre chaîne de recherche et réessayez.
+ </string>
<string name="InventoryNoTexture">
Vous n&apos;avez pas de copie de cette texture dans votre inventaire
</string>
@@ -1425,29 +1453,95 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="InventoryOutboxError">
La [[MARKETPLACE_CREATE_STORE_URL] boutique de la Place du marché] renvoie des erreurs.
</string>
+ <string name="InventoryMarketplaceError">
+ Cette fonctionnalité est en version bêta. Veuillez ajouter votre nom à ce [http://goo.gl/forms/FCQ7UXkakz formulaire Google] si vous souhaitez participer.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItemsTitle">
+ Votre dossier Annonces de la Place du marché est vide.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItems">
+ Pour mettre des dossiers en vente sur la [[MARKETPLACE_DASHBOARD_URL] Place du marché], faites-les glisser vers cette zone.
+ </string>
+ <string name="Marketplace Validation Warning Stock">
+ le dossier de stock doit être contenu dans un dossier de version
+ </string>
+ <string name="Marketplace Validation Error Mixed Stock">
+ : Erreur : tous les articles d&apos;un dossier de stock doivent être non reproductibles et de même type
+ </string>
+ <string name="Marketplace Validation Error Subfolder In Stock">
+ : Erreur : un dossier de stock ne peut pas contenir de sous-dossiers
+ </string>
+ <string name="Marketplace Validation Warning Empty">
+ : Avertissement : le dossier ne contient aucun article
+ </string>
+ <string name="Marketplace Validation Warning Create Stock">
+ : Avertissement : création du dossier de stock
+ </string>
+ <string name="Marketplace Validation Warning Create Version">
+ : Avertissement : création du dossier de version
+ </string>
+ <string name="Marketplace Validation Warning Move">
+ : Avertissement : déplacement d&apos;articles
+ </string>
+ <string name="Marketplace Validation Warning Delete">
+ : Avertissement : contenu du dossier transféré vers le dossier de stock, suppression du dossier vide
+ </string>
+ <string name="Marketplace Validation Error Stock Item">
+ : Erreur : les articles non reproductibles doivent être contenus dans un dossier de stock
+ </string>
+ <string name="Marketplace Validation Warning Unwrapped Item">
+ : Avertissement : les articles doivent être contenus dans un dossier de version
+ </string>
+ <string name="Marketplace Validation Error">
+ : Erreur :
+ </string>
+ <string name="Marketplace Validation Warning">
+ : Avertissement :
+ </string>
+ <string name="Marketplace Validation Error Empty Version">
+ : Avertissement : le dossier de version doit contenir au moins 1 article
+ </string>
+ <string name="Marketplace Validation Error Empty Stock">
+ : Avertissement : le dossier de stock doit contenir au moins 1 article
+ </string>
+ <string name="Marketplace Validation No Error">
+ Pas d&apos;erreur ni d&apos;avertissement à signaler
+ </string>
<string name="Marketplace Error None">
Aucune erreur
</string>
+ <string name="Marketplace Error Prefix">
+ 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).
+ 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 name="Marketplace Error Not Accepted">
+ Impossible de déplacer l&apos;article dans ce dossier.
</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 name="Marketplace Error Unsellable Item">
+ Cet article ne peut pas être vendu sur la Place du marché.
</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 name="MarketplaceNoID">
+ no Mkt ID
</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 name="MarketplaceLive">
+ publié
</string>
- <string name="Marketplace Error Unsellable Item">
- Erreur : cet article ne peut pas être vendu sur la Place du marché.
+ <string name="MarketplaceActive">
+ actif
</string>
- <string name="Marketplace Error Internal Import">
- Erreur : un problème est survenu concernant cet article. Veuillez réessayer ultérieurement.
+ <string name="MarketplaceMax">
+ max.
+ </string>
+ <string name="MarketplaceStock">
+ stock
+ </string>
+ <string name="MarketplaceNoStock">
+ rupture de stock
+ </string>
+ <string name="MarketplaceUpdating">
+ mise à jour...
</string>
<string name="Open landmarks">
Ouvrir les repères
@@ -1468,6 +1562,7 @@ Veuillez réessayer de vous connecter dans une minute.
Aucun contenu
</string>
<string name="WornOnAttachmentPoint" value=" (porté sur [ATTACHMENT_POINT])"/>
+ <string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/>
<string name="ActiveGesture" value="[GESLABEL] (actif)"/>
<string name="PermYes">
Oui
@@ -1738,6 +1833,15 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="Invalid Attachment">
Point d&apos;attache non valide
</string>
+ <string name="ATTACHMENT_MISSING_ITEM">
+ Erreur : article manquant
+ </string>
+ <string name="ATTACHMENT_MISSING_BASE_ITEM">
+ Erreur : article de base manquant
+ </string>
+ <string name="ATTACHMENT_NOT_ATTACHED">
+ Erreur : l&apos;objet est dans une tenue actuelle, mais il n&apos;est pas attaché
+ </string>
<string name="YearsMonthsOld">
[AGEYEARS] [AGEMONTHS]
</string>
@@ -1906,6 +2010,9 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="SaveComplete">
Enregistrement terminé.
</string>
+ <string name="UploadFailed">
+ Échec du chargement de fichier :
+ </string>
<string name="ObjectOutOfRange">
Script (objet hors de portée)
</string>
@@ -1915,6 +2022,9 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="GroupsNone">
aucun
</string>
+ <string name="CompileNoExperiencePerm">
+ En train d&apos;ignorer le script [SCRIPT] avec l&apos;expérience [EXPERIENCE].
+ </string>
<string name="Group" value=" (groupe)"/>
<string name="Unknown">
(Inconnu)
@@ -5066,6 +5176,9 @@ Essayez avec le chemin d&apos;accès à l&apos;éditeur entre guillemets doubles
<string name="Command_Marketplace_Label">
Place du marché
</string>
+ <string name="Command_MarketplaceListings_Label">
+ Place du marché
+ </string>
<string name="Command_MiniMap_Label">
Mini-carte
</string>
@@ -5153,6 +5266,9 @@ Essayez avec le chemin d&apos;accès à l&apos;éditeur entre guillemets doubles
<string name="Command_Marketplace_Tooltip">
Faire du shopping
</string>
+ <string name="Command_MarketplaceListings_Tooltip">
+ Vendez votre création
+ </string>
<string name="Command_MiniMap_Tooltip">
Afficher les personnes près de vous
</string>
@@ -5276,4 +5392,85 @@ Essayez avec le chemin d&apos;accès à l&apos;éditeur entre guillemets doubles
<string name="loading_chat_logs">
Chargement...
</string>
+ <string name="experience_tools_experience">
+ Expérience
+ </string>
+ <string name="ExperienceNameNull">
+ (aucune expérience)
+ </string>
+ <string name="ExperienceNameUntitled">
+ (expérience sans titre)
+ </string>
+ <string name="Land-Scope">
+ À l&apos;échelle des terrains
+ </string>
+ <string name="Grid-Scope">
+ À l&apos;échelle de la grille
+ </string>
+ <string name="Allowed_Experiences_Tab">
+ AUTORISÉE
+ </string>
+ <string name="Blocked_Experiences_Tab">
+ BLOQUÉE
+ </string>
+ <string name="Contrib_Experiences_Tab">
+ CONTRIBUTEUR
+ </string>
+ <string name="Admin_Experiences_Tab">
+ ADMIN
+ </string>
+ <string name="Recent_Experiences_Tab">
+ RÉCENTE
+ </string>
+ <string name="Owned_Experiences_Tab">
+ AVEC PROPRIÉTAIRE
+ </string>
+ <string name="ExperiencesCounter">
+ ([EXPERIENCES], [MAXEXPERIENCES] max.)
+ </string>
+ <string name="ExperiencePermission1">
+ assumer vos contrôles
+ </string>
+ <string name="ExperiencePermission3">
+ déclencher des animations pour votre avatar
+ </string>
+ <string name="ExperiencePermission4">
+ attacher à votre avatar
+ </string>
+ <string name="ExperiencePermission9">
+ suivre votre caméra
+ </string>
+ <string name="ExperiencePermission10">
+ contrôler votre caméra
+ </string>
+ <string name="ExperiencePermission11">
+ vous téléporter
+ </string>
+ <string name="ExperiencePermission12">
+ accepter automatiquement les permissions d&apos;expérience
+ </string>
+ <string name="ExperiencePermissionShortUnknown">
+ a effectué une opération inconnue : [Permission]
+ </string>
+ <string name="ExperiencePermissionShort1">
+ Prendre le contrôle
+ </string>
+ <string name="ExperiencePermissionShort3">
+ Déclencher des animations
+ </string>
+ <string name="ExperiencePermissionShort4">
+ Attacher
+ </string>
+ <string name="ExperiencePermissionShort9">
+ Suivre la caméra
+ </string>
+ <string name="ExperiencePermissionShort10">
+ Contrôler la caméra
+ </string>
+ <string name="ExperiencePermissionShort11">
+ Téléporter
+ </string>
+ <string name="ExperiencePermissionShort12">
+ Permission
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/fr/teleport_strings.xml b/indra/newview/skins/default/xui/fr/teleport_strings.xml
index 6065fa2966..f4499d46f8 100755
--- a/indra/newview/skins/default/xui/fr/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/fr/teleport_strings.xml
@@ -48,6 +48,9 @@ Pour recommencer le didacticiel, accédez à Welcome Island Public.
<message name="MustGetAgeRegion">
Pour accéder à cette région, vous devez avoir au moins 18 ans.
</message>
+ <message name="RegionTPSpecialUsageBlocked">
+ Impossible de pénétrer dans la région. « [REGION_NAME] » est une région de jeux d&apos;adresse et vous devez satisfaire à certains critères pour y pénétrer. Pour en savoir plus, consultez la page [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life FAQ sur les jeux d&apos;adresse].
+ </message>
</message_set>
<message_set name="progress">
<message name="sending_dest">
diff --git a/indra/newview/skins/default/xui/it/floater_about.xml b/indra/newview/skins/default/xui/it/floater_about.xml
index 6f09eca90c..f3b7effdaa 100755
--- a/indra/newview/skins/default/xui/it/floater_about.xml
+++ b/indra/newview/skins/default/xui/it/floater_about.xml
@@ -1,82 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="INFO [CAPITALIZED_APP_NAME]">
- <floater.string name="AboutHeader">
- [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
-[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
- </floater.string>
- <floater.string name="AboutCompiler">
- Generato con [COMPILER] versione [COMPILER_VERSION]
- </floater.string>
- <floater.string name="AboutPosition">
- Tu sei a [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] che si trova a &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
-SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
-(coordinate globali [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
-[SERVER_VERSION]
-[SERVER_RELEASE_NOTES_URL]
- </floater.string>
- <floater.string name="AboutSystem">
- CPU: [CPU]
-Memoria: [MEMORY_MB] MB
-Versione sistema operativo: [OS_VERSION]
-Venditore scheda grafica: [GRAPHICS_CARD_VENDOR]
-Scheda grafica: [GRAPHICS_CARD]
- </floater.string>
- <floater.string name="AboutDriver">
- Versione driver Windows per grafica: [GRAPHICS_DRIVER_VERSION]
- </floater.string>
- <floater.string name="AboutLibs">
- Versione OpenGL: [OPENGL_VERSION]
-
-Versione libcurl: [LIBCURL_VERSION]
-Versione J2C Decoder: [J2C_VERSION]
-Versione Driver audio: [AUDIO_DRIVER_VERSION]
-Versione Qt Webkit: [QT_WEBKIT_VERSION]
-Versione Server voice: [VOICE_VERSION]
- </floater.string>
- <floater.string name="none">
- (nessuno)
- </floater.string>
- <floater.string name="AboutTraffic">
- Pacchetti perduti: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) Informazioni
- </floater.string>
- <floater.string name="ErrorFetchingServerReleaseNotesURL">
- Errore nel recupero URL note rilascio versione
- </floater.string>
<tab_container name="about_tab">
<panel label="Informazioni" name="support_panel">
<button label="Copia negli appunti" name="copy_btn"/>
</panel>
<panel label="Ringraziamenti" name="credits_panel">
- <text name="linden_intro">
- Second Life vi è offerto dai Linden:
- </text>
- <text_editor name="linden_names">
- Philip, Andrew, Doug, Richard, Phoenix, Ian, Mark, Robin, Dan, Char, Ryan, Eric, Jim, Lee, Jeff, Michael, Kelly, Steve, Catherine, Bub, Ramzi, Jill, Jeska, Don, Kona, Callum, Charity, Jack, Shawn, babbage, James, Lauren, Blue, Brent, Reuben, Pathfinder, Jesse, Patsy, Torley, Bo, Cyn, Jonathan, Gia, Annette, Ginsu, Harry, Lex, Runitai, Guy, Cornelius, Beth, Swiss, Thumper, Wendy, Teeple, Seth, Dee, Mia, Sally, Liana, Aura, Beez, Milo, Red, Gulliver, Marius, Joe, Jose, Dore, Justin, Nora, Morpheus, Lexie, Amber, Chris, Xan, Leyla, Walker, Sabin, Joshua, Hiromi, Tofu, Fritz, June, Jean, Ivy, Dez, Ken, Betsy, Which, Spike, Rob, Zee, Dustin, George, Claudia, del, Matthew, jane, jay, Adrian, Yool, Rika, Yoz, siobhan, Qarl, Benjamin, Beast, Everett, madhavi, Christopher, Izzy, stephany, Jeremy, sean, adreanne, Pramod, Tobin, sejong, Iridium, maurice, kj, Meta, kari, JP, bert, kyle, Jon, Socrates, Bridie, Ivan, maria, Aric, Coco, Periapse, sandy, Storrs, Lotte, Colossus, Brad, Pastrami, Zen, BigPapi, Banzai, Sardonyx, Mani, Garry, Jaime, Neuro, Samuel, Niko, CeeLo, Austin, Soft, Poppy, emma, tessa, angelo, kurz, alexa, Sue, CG, Blake, Erica, Brett, Bevis, kristen, Q, simon, Enus, MJ, laurap, Kip, Scouse, Ron, Ram, kend, Marty, Prospero, melissa, kraft, Nat, Seraph, Hamilton, Lordan, Green, miz, Ashlei, Trinity, Ekim, Echo, Charlie, Rowan, Rome, Jt, Doris, benoc, Christy, Bao, Kate, Tj, Patch, Cheah, Johan, Brandy, Angela, Oreh, Cogsworth, Lan, Mitchell, Space, Bambers, Einstein, Bender, Malbers, Matias, Maggie, Rothman, Milton, Niall, Marin, Allison, Mango, Andrea, Katt, Yi, Ambroff, Rico, Raymond, Gail, Christa, William, Dawn, Usi, Dynamike, M, Corr, Dante, Molly, kaylee, Danica, Kelv, Lil, jacob, Nya, Rodney, elsie, Blondin, Grant, Nyx, Devin, Monty, Minerva, Keira, Katie, Jenn, Makai, Clare, Joy, Cody, Gayathri, FJ, spider, Oskar, Landon, Jarv, Noelle, Al, Doc, Gray, Vir, t, Maestro, Simone, Shannon, yang, Courtney, Scott, charlene, Quixote, Susan, Zed, Amanda, Katelin, Esbee, JoRoan, Enkidu, roxie, Scarlet, Merov, Kevin, Judy, Rand, Newell, Les, Dessie, Galen, Michon, Geo, Siz, Calyle, Pete, Praveen, Callen, Sheldon, Pink, Nelson, jenelle, Terrence, Nathan, Juan, Sascha, Huseby, Karina, Kaye, Kotler, Lis, Darv, Charrell, Dakota, Kimmora, Theeba, Taka, Mae, Perry, Ducot, dana, Esther, Dough, gisele, Doten, Viale, Fisher, jessieann, ashley, Torres, delby, rountree, kurt, Slaton, Madison, Rue, Gino, Wen, Casssandra, Brodesky, Squid, Gez, Rakesh, Gecko, Ladan, Tony, Tatem, Squire, Falcon, BK, Crimp, Tiggs, Bacon, Coyot, Carmilla, Webb, Sea, Arch, Jillian, Jason, Bernard, Vogt, Peggy, dragon, Pup, xandix, Wallace, Bewest, Inoshiro, Rhett, AG, Aimee, Ghengis, Itiaes, Eli, Steffan, Epic, Grapes, Stone, Prep, Scobu, Robert, Alain, Carla, Vicky, Tia, Alec, Taras, Lisa, Oz, Ariane, Log, House, Kazu, Kim, Drofnas, Tyler, Campbell, Michele, Madeline, Nelly, Baron, Thor, Lori, Hele, Fredrik, Teddy, Pixie, Berry, Gabrielle, Alfonso, Brooke, Wolf, Ringo, Cru, Charlar, Rodvik, Gibson, Elise, Bagman, Greger, Leonidas, Jerm, Leslie, CB, Brenda, Durian, Carlo, mm, Zeeshan, Caleb, Max, Elikak, Mercille, Steph, Chase
- </text_editor>
- <text name="contrib_intro">
- con contributi open source da:
- </text>
- <text_editor name="contrib_names">
- Dummy Name sostituito all&apos;avvio
- </text_editor>
- <text name="trans_intro">
- e le traduzioni da:
- </text>
- <text_editor name="trans_names">
- Dummy Name sostituito all&apos;avvio
- </text_editor>
+ <text name="linden_intro">Second Life vi è offerto dai Linden,
+con contributi open source da:</text>
+ <text_editor name="contrib_names">Dummy Name sostituito all&apos;avvio</text_editor>
</panel>
<panel label="Licenze" name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
+ <text_editor name="licenses_editor">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.
+ FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm e 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.
+ GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University e 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)
@@ -87,7 +29,7 @@ Versione Server voice: [VOICE_VERSION]
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.
+ zlib Copyright (C) 1995-2012 Jean-loup Gailly e Mark Adler.
Il Viewer Second Life utilizza Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (e licenziatari). Tutti i diritti riservati. Per informazioni dettagliate, vedere www.havok.com.
@@ -95,8 +37,7 @@ Versione Server voice: [VOICE_VERSION]
Tutti i diritti riservati. Per informazioni dettagliate, vedere licenses.txt.
- Codifica audio chat vocale: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
+ Codifica audio chat vocale: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)</text_editor>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_about_land.xml b/indra/newview/skins/default/xui/it/floater_about_land.xml
index fe3e59b0bd..0c0d05308b 100755
--- a/indra/newview/skins/default/xui/it/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_about_land.xml
@@ -313,9 +313,6 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
<panel.string name="push_restrict_region_text">
Nessuna spinta (Impostazione regionale)
</panel.string>
- <panel.string name="see_avs_text">
- Gli avatar in altri lotti possono vedere
- </panel.string>
<text name="allow_label">
Permetti ad altri residenti di:
</text>
@@ -341,22 +338,6 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
<check_box label="Sicuro (senza danno)" name="check safe" tool_tip="Se spuntato, imposta il terreno su &apos;sicuro&apos;, disabilitando i danni da combattimento. Se non spuntato, viene abilitato il combattimento con danni."/>
<check_box label="Nessuna spinta" name="PushRestrictCheck" tool_tip="Previeni i colpi. Selezionare questa opzione può essere utile per prevenire comportamenti dannosi sul tuo terreno."/>
<check_box label="Mostra luogo nella ricerca (30 L$/settimana)" name="ShowDirectoryCheck" tool_tip="Consenti che il lotto sia visto nei risultati di ricerca"/>
- <combo_box name="land category with adult">
- <combo_box.item label="Tutte le categorie" name="item0"/>
- <combo_box.item label="Luogo dei Linden" name="item1"/>
- <combo_box.item label="Adulti" name="item2"/>
- <combo_box.item label="Arte e cultura" name="item3"/>
- <combo_box.item label="Affari" name="item4"/>
- <combo_box.item label="Istruzione" name="item5"/>
- <combo_box.item label="Gioco" name="item6"/>
- <combo_box.item label="Divertimento" name="item7"/>
- <combo_box.item label="Accoglienza nuovi residenti" name="item8"/>
- <combo_box.item label="Parchi &amp; Natura" name="item9"/>
- <combo_box.item label="Residenziale" name="item10"/>
- <combo_box.item label="Shopping" name="item11"/>
- <combo_box.item label="Affitto" name="item13"/>
- <combo_box.item label="Altro" name="item12"/>
- </combo_box>
<combo_box name="land category">
<combo_box.item label="Tutte le categorie" name="item0"/>
<combo_box.item label="Luogo dei Linden" name="item1"/>
@@ -456,15 +437,9 @@ Media:
<panel.string name="access_estate_defined">
(Definito dalla proprietà)
</panel.string>
- <panel.string name="allow_public_access">
- Consenti accesso pubblico ([MATURITY]) (Nota: se si rimuove la selezione vengono create linee di espulsione)
- </panel.string>
<panel.string name="estate_override">
Una o più di queste impostazioni sono già impostate a livello regionale
</panel.string>
- <text name="Limit access to this parcel to:">
- Accesso a questo terreno
- </text>
<check_box label="Consenti l&apos;accesso pubblico (se si rimuove la selezione vengono create linee di espulsione)" name="public_access"/>
<text name="Only Allow">
Consenti l&apos;accesso solo ai Residenti che:
@@ -496,5 +471,6 @@ Media:
<button label="Rimuovi" label_selected="Rimuovi" name="remove_banned"/>
</panel>
</panel>
+ <panel label="ESPERIENZE" name="land_experiences_panel"/>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_associate_listing.xml b/indra/newview/skins/default/xui/it/floater_associate_listing.xml
new file mode 100644
index 0000000000..2d7e1f9d3b
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_associate_listing.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="associate listing" title="ASSOCIA ANNUNCIO">
+ <text name="message">ID annuncio:</text>
+ <line_editor name="listing_id">Digita qui l&apos;ID</line_editor>
+ <button label="OK" name="OK"/>
+ <button label="Annulla" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_edit_hover_height.xml b/indra/newview/skins/default/xui/it/floater_edit_hover_height.xml
new file mode 100644
index 0000000000..a395b247ed
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_edit_hover_height.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="HoverHeight" title="IMPOSTA ALTEZZA DI VOLO">
+ <slider label="Altezza" name="HoverHeightSlider"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_experience_search.xml b/indra/newview/skins/default/xui/it/floater_experience_search.xml
new file mode 100644
index 0000000000..a31e7aa76f
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_experience_search.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="experiencepicker" title="SCEGLI ESPERIENZA"/>
diff --git a/indra/newview/skins/default/xui/it/floater_experienceprofile.xml b/indra/newview/skins/default/xui/it/floater_experienceprofile.xml
new file mode 100644
index 0000000000..031900825d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_experienceprofile.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater title="EXPERIENCE PROFILE">
+ <floater.string name="empty_slurl">
+ (nessuno)
+ </floater.string>
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Light&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Light&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Light&quot;
+ </floater.string>
+ <text name="edit_title" value="Profilo esperienza"/>
+ <tab_container name="tab_container">
+ <panel name="panel_experience_info">
+ <scroll_container name="xp_scroll">
+ <panel name="scrolling_panel">
+ <layout_stack>
+ <layout_panel name="top panel">
+ <button label="Modifica" name="edit_btn"/>
+ </layout_panel>
+ <layout_panel name="maturity panel">
+ <text name="ContentRating">
+ Categoria:
+ </text>
+ </layout_panel>
+ <layout_panel name="location panel">
+ <text name="Location">
+ Luogo:
+ </text>
+ </layout_panel>
+ <layout_panel>
+ <text name="Owner">
+ Proprietario:
+ </text>
+ </layout_panel>
+ <layout_panel name="group_panel">
+ <text name="Group">
+ Gruppo:
+ </text>
+ </layout_panel>
+ <layout_panel name="perm panel">
+ <button label="Consenti" name="allow_btn"/>
+ <button label="Dimentica" name="forget_btn"/>
+ <button label="Blocca" name="block_btn"/>
+ <text name="privileged">
+ Questa esperienza è attivata per tutti i residenti.
+ </text>
+ <button label="Segnala abuso" name="report_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ </panel>
+ <panel name="edit_panel_experience_info">
+ <scroll_container name="edit_xp_scroll">
+ <panel name="edit_scrolling_panel">
+ <text name="edit_experience_title_label" value="Nome:"/>
+ <text name="edit_experience_desc_label" value="Descrizione:"/>
+ <button label="Gruppo" name="Group_btn"/>
+ <text name="edit_ContentRating">
+ Categoria:
+ </text>
+ <icons_combo_box label="Moderato" name="edit_ContentRatingText" tool_tip="Se si aumenta la categoria di accesso di un&apos;esperienza, vengono ripristinate le autorizzazioni per tutti i residenti che hanno consentito l&apos;esperienza.">
+ <icons_combo_box.item label="Adulti" name="Adult" value="42"/>
+ <icons_combo_box.item label="Moderato" name="Mature" value="21"/>
+ <icons_combo_box.item label="Generale" name="PG" value="13"/>
+ </icons_combo_box>
+ <text name="edit_Location">
+ Luogo:
+ </text>
+ <button label="Imposta come attuale" name="location_btn"/>
+ <button label="Cancella luogo" name="clear_btn"/>
+ <check_box label="Attiva esperienza" name="edit_enable_btn" tool_tip=""/>
+ <check_box label="Nascondi nella ricerca" name="edit_private_btn"/>
+ <text name="changes" value="Le modifiche apportate alle esperienze potrebbero essere visibili su tutte le regioni solo dopo alcuni minuti."/>
+ <button label="Indietro" name="cancel_btn"/>
+ <button label="Salva" name="save_btn"/>
+ </panel>
+ </scroll_container>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_experiences.xml b/indra/newview/skins/default/xui/it/floater_experiences.xml
new file mode 100644
index 0000000000..7cd19783a3
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_experiences.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_experiences" title="ESPERIENZE"/>
diff --git a/indra/newview/skins/default/xui/it/floater_facebook.xml b/indra/newview/skins/default/xui/it/floater_facebook.xml
index 89d58f4e67..cb700f00e1 100644
--- a/indra/newview/skins/default/xui/it/floater_facebook.xml
+++ b/indra/newview/skins/default/xui/it/floater_facebook.xml
@@ -1,20 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_facebook" title="PUBBLICA SU FACEBOOK">
- <panel name="background">
- <tab_container name="tabs">
- <panel label="STATO" name="panel_facebook_status"/>
- <panel label="FOTO" name="panel_facebook_photo"/>
- <panel label="REGISTRATI" name="panel_facebook_place"/>
- <panel label="AMICI" name="panel_facebook_friends"/>
- <panel label="ACCOUNT" name="panel_facebook_account"/>
- </tab_container>
- <panel name="connection_status_panel">
- <text name="connection_error_text">
- Errore
- </text>
- <text name="connection_loading_text">
- Caricamento...
- </text>
- </panel>
- </panel>
+ <tab_container name="tabs">
+ <panel label="STATO" name="panel_facebook_status"/>
+ <panel label="FOTO" name="panel_facebook_photo"/>
+ <panel label="REGISTRATI" name="panel_facebook_place"/>
+ <panel label="AMICI" name="panel_facebook_friends"/>
+ </tab_container>
+ <text name="connection_error_text">
+ Errore
+ </text>
+ <text name="connection_loading_text">
+ Caricamento in corso...
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml
index 7ed3486b9b..8cf680b3f0 100755
--- a/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml
@@ -1,67 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="item properties" title="CARATTERISTICHE DELL&apos;ARTICOLO IN INVENTARIO">
- <floater.string name="unknown">
- (sconosciuto)
- </floater.string>
- <floater.string name="public">
- (pubblico)
- </floater.string>
- <floater.string name="you_can">
- Tu puoi:
- </floater.string>
- <floater.string name="owner_can">
- Il proprietario può:
- </floater.string>
- <floater.string name="acquiredDate">
- [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
- </floater.string>
- <text name="LabelItemNameTitle">
- Nome:
- </text>
- <text name="LabelItemDescTitle">
- Descrizione:
- </text>
- <text name="LabelCreatorTitle">
- Creatore:
- </text>
+ <floater.string name="unknown">(sconosciuto)</floater.string>
+ <floater.string name="public">(pubblico)</floater.string>
+ <floater.string name="you_can">Tu puoi:</floater.string>
+ <floater.string name="owner_can">Il proprietario può:</floater.string>
+ <floater.string name="acquiredDate">[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]</floater.string>
+ <text name="LabelItemNameTitle">Nome:</text>
+ <text name="LabelItemDescTitle">Descrizione:</text>
+ <text name="LabelCreatorTitle">Creatore:</text>
<button label="Profilo..." label_selected="" name="BtnCreator"/>
- <text name="LabelOwnerTitle">
- proprietario:
- </text>
+ <text name="LabelOwnerTitle">proprietario:</text>
<button label="Profilo..." label_selected="" name="BtnOwner"/>
- <text name="LabelAcquiredTitle">
- Acquisito:
- </text>
- <text name="LabelAcquiredDate">
- Wed May 24 12:50:46 2006
- </text>
- <text name="OwnerLabel">
- Tu:
- </text>
+ <text name="LabelAcquiredTitle">Acquisito:</text>
+ <text name="LabelAcquiredDate">Wed May 24 12:50:46 2006</text>
+ <text name="OwnerLabel">Tu:</text>
<check_box label="Modifica" name="CheckOwnerModify"/>
<check_box label="Copiare" left_delta="88" name="CheckOwnerCopy"/>
<check_box label="Rivendi" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">
- Chiunque:
- </text>
+ <text name="AnyoneLabel">Chiunque:</text>
<check_box label="Copia" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">
- Gruppo:
- </text>
+ <text name="GroupLabel">Gruppo:</text>
<check_box label="Condividi" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel" width="230">
- Proprietario successivo:
- </text>
+ <text name="NextOwnerLabel" width="230">Proprietario successivo:</text>
<check_box label="Modifica" name="CheckNextOwnerModify"/>
<check_box label="Copiare" left_delta="88" name="CheckNextOwnerCopy"/>
<check_box label="Rivendi" name="CheckNextOwnerTransfer"/>
<check_box label="In vendita" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
+ <combo_box name="ComboBoxSaleType">
<combo_box.item label="Copia" name="Copy"/>
+ <combo_box.item label="Contenuti" name="Contents"/>
<combo_box.item label="Originale" name="Original"/>
</combo_box>
<spinner label="Prezzo:" name="Edit Cost"/>
- <text name="CurrencySymbol">
- L$
- </text>
+ <text name="CurrencySymbol">L$</text>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml
index cf790ee62e..e5543c741f 100755
--- a/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml
@@ -5,8 +5,8 @@
<check_box label="Abiti" name="check_clothing"/>
<check_box label="Gesture" name="check_gesture"/>
<check_box label="Landmark" name="check_landmark"/>
- <check_box label="Reticoli" name="check_mesh"/>
<check_box label="Notecard" name="check_notecard"/>
+ <check_box label="Reticoli" name="check_mesh"/>
<check_box label="Oggetti" name="check_object"/>
<check_box label="Script" name="check_script"/>
<check_box label="Suoni" name="check_sound"/>
@@ -19,6 +19,10 @@
<text name="- OR -">
- Oppure -
</text>
+ <radio_group name="date_search_direction">
+ <radio_item label="Più recenti del" name="newer"/>
+ <radio_item label="Precedenti al" name="older"/>
+ </radio_group>
<spinner label="Ore fa" name="spin_hours_ago"/>
<spinner label="Giorni fa" name="spin_days_ago"/>
<button label="Chiudi" label_selected="Chiudi" name="Close"/>
diff --git a/indra/newview/skins/default/xui/it/floater_item_properties.xml b/indra/newview/skins/default/xui/it/floater_item_properties.xml
new file mode 100644
index 0000000000..ba57e27b45
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_item_properties.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Item Properties" title="CARATTERISTICHE DELL&apos;ARTICOLO"/>
diff --git a/indra/newview/skins/default/xui/it/floater_lagmeter.xml b/indra/newview/skins/default/xui/it/floater_lagmeter.xml
index f7b2b1ab4a..13f54eabcc 100644
--- a/indra/newview/skins/default/xui/it/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/it/floater_lagmeter.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_lagmeter" title="MISURATORE LAG">
<floater.string name="max_title_msg">
- Misuratore del lag
+ Misuratore lag
</floater.string>
<floater.string name="max_width_px">
360
@@ -13,7 +13,7 @@
90
</floater.string>
<floater.string name="client_text_msg">
- Programma in locale
+ Client
</floater.string>
<floater.string name="client_frame_rate_critical_fps">
10
@@ -22,31 +22,31 @@
15
</floater.string>
<floater.string name="client_frame_time_window_bg_msg">
- Normale, finestra sullo sfondo
+ Normale, finestra in background
</floater.string>
<floater.string name="client_frame_time_critical_msg">
- Velocità dei frame al di sotto di [CLIENT_FRAME_RATE_CRITICAL]
+ Frame rate del client inferiore a [CLIENT_FRAME_RATE_CRITICAL]
</floater.string>
<floater.string name="client_frame_time_warning_msg">
- Velocità dei frame tra [CLIENT_FRAME_RATE_CRITICAL] e [CLIENT_FRAME_RATE_WARNING]
+ Frame rate del client tra [CLIENT_FRAME_RATE_CRITICAL] e [CLIENT_FRAME_RATE_WARNING]
</floater.string>
<floater.string name="client_frame_time_normal_msg">
Normale
</floater.string>
<floater.string name="client_draw_distance_cause_msg">
- Possibile causa: Campo visivo impostato troppo alto
+ Causa possibile: Distanza di visualizzazione impostata su un valore troppo alto
</floater.string>
<floater.string name="client_texture_loading_cause_msg">
- Possibile causa: Caricamento immagini
+ Causa possibile: Caricamento immagini in corso
</floater.string>
<floater.string name="client_texture_memory_cause_msg">
- Possibile causa: Troppe immagini in memoria
+ Causa possibile: Troppe immagini in memoria
</floater.string>
<floater.string name="client_complex_objects_cause_msg">
- Possibile causa: Troppi oggetti complessi intorno
+ Causa possibile: Troppi oggetti complessi in una scena
</floater.string>
<floater.string name="network_text_msg">
- Network
+ Rete
</floater.string>
<floater.string name="network_packet_loss_critical_pct">
10
@@ -55,10 +55,10 @@
5
</floater.string>
<floater.string name="network_packet_loss_critical_msg">
- La connessione sta calando al di sotto del [NETWORK_PACKET_LOSS_CRITICAL]% di pacchetti
+ Il collegamento perde più del [NETWORK_PACKET_LOSS_CRITICAL]% dei pacchetti
</floater.string>
<floater.string name="network_packet_loss_warning_msg">
- La connessione sta calando tra il [NETWORK_PACKET_LOSS_WARNING]% e il [NETWORK_PACKET_LOSS_CRITICAL]% di pacchetti
+ Il collegamento perde [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% dei pacchetti
</floater.string>
<floater.string name="network_performance_normal_msg">
Normale
@@ -70,16 +70,16 @@
300
</floater.string>
<floater.string name="network_ping_critical_msg">
- Il tempo di ping della connessione è al di sopra di [NETWORK_PING_CRITICAL] ms
+ Tempo di ping del collegamento superiore a [NETWORK_PING_CRITICAL] ms
</floater.string>
<floater.string name="network_ping_warning_msg">
- Il tempo di ping della connessione è tra [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
+ Tempo di ping del collegamento pari a [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
</floater.string>
<floater.string name="network_packet_loss_cause_msg">
- Possibile cattiva connessione o la larghezza di banda impostata nelle preferenze troppo alta.
+ Collegamento scadente oppure valore della larghezza di banda troppo alto.
</floater.string>
<floater.string name="network_ping_cause_msg">
- Possibile cattiva connessione o l&apos;apertura di un programma di scambio files.
+ Collegamento scadente oppure problemi di app di condivisione file.
</floater.string>
<floater.string name="server_text_msg">
Server
@@ -94,31 +94,31 @@
20
</floater.string>
<floater.string name="server_frame_time_critical_msg">
- Velocità dei frame al di sotto di [SERVER_FRAME_RATE_CRITICAL]
+ Frame rate del simulatore inferiore a [SERVER_FRAME_RATE_CRITICAL]
</floater.string>
<floater.string name="server_frame_time_warning_msg">
- Velocità dei frame tra [SERVER_FRAME_RATE_CRITICAL] e [SERVER_FRAME_RATE_WARNING]
+ Frame rate del simulatore tra [SERVER_FRAME_RATE_CRITICAL] e [SERVER_FRAME_RATE_WARNING]
</floater.string>
<floater.string name="server_frame_time_normal_msg">
Normale
</floater.string>
<floater.string name="server_physics_cause_msg">
- Possibile causa: troppi oggetti fisici
+ Causa possibile: Troppi oggetti fisici
</floater.string>
<floater.string name="server_scripts_cause_msg">
- Possibile causa: troppi oggetti scriptati
+ Causa possibile: Troppi oggetti scriptati
</floater.string>
<floater.string name="server_net_cause_msg">
- Possibile causa: eccessivo traffico sulla rete
+ Causa possibile: Troppo traffico di rete
</floater.string>
<floater.string name="server_agent_cause_msg">
- Possibile causa: troppi residenti in movimento nella regione
+ Causa possibile: Troppe persone in movimento nella regione
</floater.string>
<floater.string name="server_images_cause_msg">
- Possibile causa: troppe elaborazioni di immagini
+ Causa possibile: Troppi calcoli delle immagini
</floater.string>
<floater.string name="server_generic_cause_msg">
- Possibile causa: carico eccessivo del simulatore
+ Causa possibile: Carico eccessivo del simulatore
</floater.string>
<floater.string name="smaller_label">
&gt;&gt;
@@ -126,7 +126,7 @@
<floater.string name="bigger_label">
&lt;&lt;
</floater.string>
- <button label="" label_selected="" name="client_lagmeter" tool_tip="Stato del lag del programma in locale"/>
+ <button label="" label_selected="" name="client_lagmeter" tool_tip="Stato del lag del client"/>
<text name="client">
Client
</text>
@@ -134,7 +134,7 @@
Normale
</text>
<text left="30" name="client_lag_cause" right="-10"/>
- <button label="" label_selected="" name="network_lagmeter" tool_tip="Stato del lag del network"/>
+ <button label="" label_selected="" name="network_lagmeter" tool_tip="Stato del lag della rete"/>
<text name="network">
Rete
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml
index 0bd2b02323..c28df6c12e 100755
--- a/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml
@@ -9,7 +9,24 @@
<floater.string name="Title">
SCRIPT: [NAME]
</floater.string>
+ <floater.string name="experience_enabled">
+ Rimuovi il segno di spunta per rimuovere l&apos;esperienza corrente
+ </floater.string>
+ <floater.string name="no_experiences">
+ Non hai l&apos;autorizzazione necessaria per alcuna esperienza
+ </floater.string>
+ <floater.string name="add_experiences">
+ Seleziona per aggiungere un&apos;esperienza
+ </floater.string>
+ <floater.string name="show_experience_profile">
+ Clicca per vedere il profilo dell&apos;esperienza
+ </floater.string>
+ <floater.string name="loading">
+ Caricamento in corso...
+ </floater.string>
<button label="Ripristina" label_selected="Ripristina" name="Reset"/>
<check_box initial_value="true" label="In esecuzione" left="4" name="running"/>
<check_box initial_value="true" label="Mono" left="106" name="mono"/>
+ <check_box label="Usa le esperienze:" name="enable_xp"/>
+ <button label="&gt;" name="view_profile"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_marketplace_listings.xml b/indra/newview/skins/default/xui/it/floater_marketplace_listings.xml
new file mode 100644
index 0000000000..bff5189ea4
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_marketplace_listings.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_listings" title="ANNUNCI NEL MARKETPLACE">
+ <panel name="marketplace_listings_panel">
+ <panel>
+ <panel name="marketplace_listings_inventory_placeholder_panel">
+ <text name="marketplace_listings_inventory_placeholder_title">Caricamento in corso...</text>
+ </panel>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_marketplace_validation.xml b/indra/newview/skins/default/xui/it/floater_marketplace_validation.xml
new file mode 100644
index 0000000000..45805a3232
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_marketplace_validation.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_validation" title="Verifica annunci Marketplace">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <text_editor name="validation_text">MARKETPLACE_VALIDATION_TEXT</text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_openobject.xml b/indra/newview/skins/default/xui/it/floater_openobject.xml
index d8144c7cd5..0d313602b5 100755
--- a/indra/newview/skins/default/xui/it/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/it/floater_openobject.xml
@@ -3,6 +3,11 @@
<text name="object_name">
[DESC]:
</text>
- <button label="Copia nell&apos;inventario" label_selected="Copia nell&apos;inventario" name="copy_to_inventory_button"/>
- <button label="Copia ed indossa" label_selected="Copia ed indossa" name="copy_and_wear_button"/>
+ <text name="border_note">
+ Copia nell&apos;inventario e indossa
+ </text>
+ <button label="Aggiungi al vestiario" label_selected="Aggiungi al vestiario" name="copy_and_wear_button"/>
+ <button label="Sostituisci vestiario" label_selected="Sostituisci vestiario" name="copy_and_replace_button"/>
+ <button label="Crea solo la copia nell&apos;inventario" label_selected="Crea solo la copia nell&apos;inventario" name="copy_to_inventory_button"/>
+ <button label="Annulla" label_selected="Annulla" name="cancel_button"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_pay.xml b/indra/newview/skins/default/xui/it/floater_pay.xml
index 5753c8c765..ef24fc850d 100755
--- a/indra/newview/skins/default/xui/it/floater_pay.xml
+++ b/indra/newview/skins/default/xui/it/floater_pay.xml
@@ -1,26 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <string name="payee_group">
- Paga gruppo
- </string>
- <string name="payee_resident">
- Paga residente
- </string>
- <text left="5" name="payee_label" width="105">
- Paga:
- </text>
- <icon name="icon_person" tool_tip="Persona"/>
- <text left="115" name="payee_name">
- Nome di test che è troppo lungo per controllare il taglio
- </text>
- <button label="1 L$" label_selected="1 L$" left="118" name="fastpay 1" width="80"/>
- <button label="5 L$" label_selected="5 L$" left="210" name="fastpay 5"/>
- <button label="10 L$" label_selected="10 L$" left="118" name="fastpay 10" width="80"/>
- <button label="20 L$" label_selected="20 L$" left="210" name="fastpay 20"/>
- <text left="4" name="amount text">
- Oppure, scegli importo:
- </text>
- <line_editor left="70" name="amount" width="49"/>
- <button label="Paga" label_selected="Paga" left="127" name="pay btn"/>
- <button label="Annulla" label_selected="Annulla" left="210" name="cancel btn"/>
+ <string name="payee_group">Paga gruppo</string>
+ <string name="payee_resident">Paga residente</string>
+ <text name="paying_text">Stai pagando:</text>
+ <text left="115" name="payee_name">Nome di test che è troppo lungo per controllare il taglio</text>
+ <panel label="Cerca" name="PatternsPanel">
+ <button label="Paga 1 L$" label_selected="Paga 1 L$" name="fastpay 1"/>
+ <button label="Paga 5 L$" label_selected="Paga 5 L$" name="fastpay 5"/>
+ <button label="Paga 10 L$" label_selected="Paga 10 L$" name="fastpay 10"/>
+ <button label="Paga 20 L$" label_selected="Paga 20 L$" name="fastpay 20"/>
+ </panel>
+ <panel label="Cerca" name="InputPanel">
+ <text name="amount text">Altro importo:</text>
+ <button label="Paga" label_selected="Paga" name="pay btn"/>
+ <button label="Annulla" label_selected="Annulla" name="cancel btn"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_pay_object.xml b/indra/newview/skins/default/xui/it/floater_pay_object.xml
index 8805f3208e..8e6fd37c2d 100755
--- a/indra/newview/skins/default/xui/it/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/it/floater_pay_object.xml
@@ -1,30 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <string halign="left" name="payee_group" width="100">
- Paga gruppo
- </string>
- <string halign="left" name="payee_resident" width="120">
- Paga residente
- </string>
- <icon name="icon_person" tool_tip="Persona"/>
- <text left="120" name="payee_name">
- Ericacita Moostopolison
- </text>
- <text halign="left" left="5" name="object_name_label" width="110">
- Mediante l&apos;oggetto:
- </text>
+ <string halign="left" name="payee_group" width="100">Paga gruppo</string>
+ <string halign="left" name="payee_resident" width="120">Paga residente</string>
+ <text name="paying_text">Stai pagando:</text>
+ <text left="120" name="payee_name">Ericacita Moostopolison</text>
+ <text halign="left" left="5" name="object_name_label" width="110">Mediante l&apos;oggetto:</text>
<icon name="icon_object" tool_tip="Oggetti"/>
- <text left="120" name="object_name_text">
- Il mio oggetto con un nome veramente lungo
- </text>
- <button label="1 L$" label_selected="1 L$" left="125" name="fastpay 1" width="70"/>
- <button label="5 L$" label_selected="5 L$" left="200" name="fastpay 5" width="70"/>
- <button label="10 L$" label_selected="10 L$" left="125" name="fastpay 10" width="70"/>
- <button label="20 L$" label_selected="20 L$" left="200" name="fastpay 20" width="70"/>
- <text halign="left" left="5" name="amount text">
- Oppure, scegli importo:
- </text>
- <line_editor left="74" name="amount" width="50"/>
- <button label="Paga" label_selected="Paga" name="pay btn"/>
- <button label="Cancella" label_selected="Cancella" name="cancel btn"/>
+ <text left="120" name="object_name_text">Il mio oggetto con un nome veramente lungo</text>
+ <panel label="Cerca" name="PatternsPanel">
+ <button label="Paga 1 L$" label_selected="Paga 1 L$" name="fastpay 1"/>
+ <button label="Paga 5 L$" label_selected="Paga 5 L$" name="fastpay 5"/>
+ <button label="Paga 10 L$" label_selected="Paga 10 L$" name="fastpay 10"/>
+ <button label="Paga 20 L$" label_selected="Paga 20 L$" name="fastpay 20"/>
+ </panel>
+ <panel label="Cerca" name="InputPanel">
+ <text name="amount text">Altro importo:</text>
+ <button label="Paga" label_selected="Paga" name="pay btn"/>
+ <button label="Annulla" label_selected="Annulla" name="cancel btn"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_report_abuse.xml b/indra/newview/skins/default/xui/it/floater_report_abuse.xml
index 728d089205..f74d84fb8f 100755
--- a/indra/newview/skins/default/xui/it/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/it/floater_report_abuse.xml
@@ -76,7 +76,7 @@
<combo_box.item label="Terreno &gt; Invasione &gt; Oggetti o texture" name="Land__Encroachment__Objects_textures"/>
<combo_box.item label="Terreno &gt; Invasione &gt; Particelle" name="Land__Encroachment__Particles"/>
<combo_box.item label="Terreno &gt; Invasione &gt; Alberi/piante" name="Land__Encroachment__Trees_plants"/>
- <combo_box.item label="Scommesse o gioco d&apos;azzardo" name="Wagering_gambling"/>
+ <combo_box.item label="Violazione regole del gioco" name="Wagering_gambling"/>
<combo_box.item label="Altro" name="Other"/>
</combo_box>
<text name="abuser_name_title">
diff --git a/indra/newview/skins/default/xui/it/floater_snapshot.xml b/indra/newview/skins/default/xui/it/floater_snapshot.xml
index 16289ac7af..d21c206f6f 100755
--- a/indra/newview/skins/default/xui/it/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/it/floater_snapshot.xml
@@ -39,17 +39,8 @@
<string name="local_failed_str">
Non salvato sul computer.
</string>
- <button name="advanced_options_btn" tool_tip="Opzioni Avanzate"/>
- <text name="image_res_text">
- [WIDTH] x [HEIGHT] px
- </text>
- <text name="file_size_label">
- [SIZE] KB
- </text>
+ <button label="AGGIORNA" name="new_snapshot_btn"/>
<panel name="advanced_options_panel">
- <text name="advanced_options_label">
- OPZIONI AVANZATE
- </text>
<text name="layer_type_label">
Cattura:
</text>
@@ -68,4 +59,10 @@
<combo_box.item label="Nessun filtro" name="NoFilter"/>
</combo_box>
</panel>
+ <text name="image_res_text">
+ [WIDTH] px (larghezza) x [HEIGHT] px (altezza)
+ </text>
+ <text name="file_size_label">
+ [SIZE] KB
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_stats.xml b/indra/newview/skins/default/xui/it/floater_stats.xml
index 7516af957e..7ef13aa37f 100755
--- a/indra/newview/skins/default/xui/it/floater_stats.xml
+++ b/indra/newview/skins/default/xui/it/floater_stats.xml
@@ -72,7 +72,7 @@
<stat_view label="Pathfinding" name="simpathfinding">
<stat_bar label="Tempo passaggio AI" name="simsimaistepmsec"/>
<stat_bar label="Passaggi silhouette saltati" name="simsimskippedsilhouettesteps"/>
- <stat_bar label="Personaggi aggiornati" name="simsimpctsteppedcharacters"/>
+ <stat_bar label="Caratteri aggiornati" name="simsimpctsteppedcharacters"/>
</stat_view>
<stat_bar label="Totale dati non confermati (unacked)" name="simtotalunackedbytes"/>
<stat_view label="Orario" name="simperf">
diff --git a/indra/newview/skins/default/xui/it/floater_top_objects.xml b/indra/newview/skins/default/xui/it/floater_top_objects.xml
index d8ca7f4438..afd6a87646 100755
--- a/indra/newview/skins/default/xui/it/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/it/floater_top_objects.xml
@@ -21,6 +21,12 @@
<floater.string name="none_descriptor">
Nulla di rilevato.
</floater.string>
+ <floater.string name="URLs">
+ URL
+ </floater.string>
+ <floater.string name="memory">
+ Memoria (KB)
+ </floater.string>
<text name="title_text">
In caricamento...
</text>
@@ -30,7 +36,7 @@
<scroll_list.columns label="Proprietario" name="owner" width="84"/>
<scroll_list.columns label="Ubicazione" name="location" width="84"/>
<scroll_list.columns label="Lotto" name="parcel"/>
- <scroll_list.columns label="Ora" name="time" width="84"/>
+ <scroll_list.columns label="Data" name="time" width="84"/>
<scroll_list.columns label="URL" name="URLs"/>
<scroll_list.columns label="Memoria (KB)" name="memory"/>
</scroll_list>
diff --git a/indra/newview/skins/default/xui/it/floater_twitter.xml b/indra/newview/skins/default/xui/it/floater_twitter.xml
index c903705e69..a34052a620 100644
--- a/indra/newview/skins/default/xui/it/floater_twitter.xml
+++ b/indra/newview/skins/default/xui/it/floater_twitter.xml
@@ -1,17 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_twitter" title="TWITTER">
- <panel name="background">
- <tab_container name="tabs">
- <panel label="COMPONI" name="panel_twitter_photo"/>
- <panel label="ACCOUNT" name="panel_twitter_account"/>
- </tab_container>
- <panel name="connection_status_panel">
- <text name="connection_error_text">
- Errore
- </text>
- <text name="connection_loading_text">
- Caricamento...
- </text>
- </panel>
- </panel>
+ <tab_container name="tabs">
+ <panel label="COMPONI" name="panel_twitter_photo"/>
+ <panel label="ACCOUNT" name="panel_twitter_account"/>
+ </tab_container>
+ <text name="connection_error_text">
+ Errore
+ </text>
+ <text name="connection_loading_text">
+ Caricamento in corso...
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/it/menu_attachment_self.xml b/indra/newview/skins/default/xui/it/menu_attachment_self.xml
index b28137262f..1539fbafa1 100755
--- a/indra/newview/skins/default/xui/it/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/it/menu_attachment_self.xml
@@ -8,6 +8,7 @@
<menu_item_call label="Il mio aspetto" name="Change Outfit"/>
<menu_item_call label="Modifica il mio vestiario" name="Edit Outfit"/>
<menu_item_call label="Modifica la figura corporea" name="Edit My Shape"/>
+ <menu_item_call label="Altezza di volo" name="Hover Height"/>
<menu_item_call label="I miei amici..." name="Friends..."/>
<menu_item_call label="I miei gruppi" name="Groups..."/>
<menu_item_call label="Il mio profilo" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/it/menu_avatar_self.xml b/indra/newview/skins/default/xui/it/menu_avatar_self.xml
index 3666571065..0c9663fd4c 100755
--- a/indra/newview/skins/default/xui/it/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/it/menu_avatar_self.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Il mio aspetto" name="Chenge Outfit"/>
<menu_item_call label="Modifica il mio vestiario" name="Edit Outfit"/>
<menu_item_call label="Modifica la figura corporea" name="Edit My Shape"/>
+ <menu_item_call label="Altezza di volo" name="Hover Height"/>
<menu_item_call label="I miei amici..." name="Friends..."/>
<menu_item_call label="I miei gruppi" name="Groups..."/>
<menu_item_call label="Il mio profilo" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/it/menu_inventory.xml b/indra/newview/skins/default/xui/it/menu_inventory.xml
index c8042f4253..2cd0d2c078 100755
--- a/indra/newview/skins/default/xui/it/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/it/menu_inventory.xml
@@ -1,5 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
+ <menu_item_call label="Crea annuncio" name="Marketplace Create Listing"/>
+ <menu_item_call label="Associa annuncio" name="Marketplace Associate Listing"/>
+ <menu_item_call label="Visualizza (aggiorna) annuncio" name="Marketplace Get Listing"/>
+ <menu_item_call label="Controlla che non ci siano errori" name="Marketplace Check Listing"/>
+ <menu_item_call label="Modifica annuncio" name="Marketplace Edit Listing"/>
+ <menu_item_call label="Elenca" name="Marketplace List"/>
+ <menu_item_call label="Rimuovi annuncio" name="Marketplace Unlist"/>
+ <menu_item_call label="Attiva" name="Marketplace Activate"/>
+ <menu_item_call label="Disattiva" name="Marketplace Deactivate"/>
<menu_item_call label="Condividi" name="Share"/>
<menu_item_call label="Compra" name="Task Buy"/>
<menu_item_call label="Apri" name="Task Open"/>
@@ -87,6 +96,7 @@
<menu_item_call label="Aggiungi" name="Wearable Add"/>
<menu_item_call label="Togli" name="Take Off"/>
<menu_item_call label="Copia nella casella venditore in uscita" name="Merchant Copy"/>
- <menu_item_call label="Invia a Marketplace" name="Marketplace Send"/>
+ <menu_item_call label="Copia negli annunci Marketplace" name="Marketplace Copy"/>
+ <menu_item_call label="Sposta negli annunci Marketplace" name="Marketplace Move"/>
<menu_item_call label="--nessuna opzione--" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml
index 3d64e4da4e..403f5da5fe 100755
--- a/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml
@@ -5,7 +5,7 @@
<menu_item_check label="Mostra prima i più recenti" name="sort_by_recent"/>
<menu_item_check label="Ordina le cartelle sempre in base al nome" name="sort_folders_by_name"/>
<menu_item_check label="Ordina cartelle di sistema all&apos;inizio" name="sort_system_folders_to_top"/>
- <menu_item_call label="Mostra filtri" name="show_filters"/>
+ <menu_item_call label="Mostra filtri..." name="show_filters"/>
<menu_item_call label="Ripristina filtri" name="reset_filters"/>
<menu_item_call label="Chiudi tutte le cartelle" name="close_folders"/>
<menu_item_call label="Svuota oggetti smarriti" name="empty_lostnfound"/>
diff --git a/indra/newview/skins/default/xui/it/menu_marketplace_view.xml b/indra/newview/skins/default/xui/it/menu_marketplace_view.xml
new file mode 100644
index 0000000000..63f0b7fc50
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_marketplace_view.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_marketplace_sort">
+ <menu_item_check label="Ordina per quantità in magazzino (da bassa ad alta)" name="sort_by_stock_amount"/>
+ <menu_item_check label="Mostra solo cartelle annunci" name="show_only_listing_folders"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_experience.xml b/indra/newview/skins/default/xui/it/menu_url_experience.xml
new file mode 100644
index 0000000000..d6ea3f352b
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_url_experience.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index d25e11e7a4..18ddad5ee8 100755
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -8,13 +8,14 @@
<menu_item_call label="Nuova finestra inventario" name="NewInventoryWindow"/>
<menu_item_call label="Luoghi..." name="Places"/>
<menu_item_call label="Preferiti..." name="Picks"/>
+ <menu_item_call label="Esperienze..." name="Experiences"/>
<menu_item_call label="Controlli fotocamera..." name="Camera Controls"/>
<menu label="Spostamento" name="Movement">
<menu_item_call label="Siedi" name="Sit Down Here"/>
<menu_item_check label="Vola" name="Fly"/>
<menu_item_check label="Corri sempre" name="Always Run"/>
<menu_item_call label="Ferma animazione" name="Stop Animating My Avatar"/>
- <menu_item_call label="Cammina / corri / vola..." name="Walk / run / fly"/>
+ <menu_item_call label="Cammina / corri / vola..." name="WalkRunFly"/>
</menu>
<menu label="Stato" name="Status">
<menu_item_check label="Assente" name="Away"/>
@@ -22,6 +23,7 @@
</menu>
<menu_item_call label="Acquista L$..." name="Buy and Sell L$"/>
<menu_item_call label="Casella venditore in uscita..." name="MerchantOutbox"/>
+ <menu_item_call label="Annunci Marketplace..." name="MarketplaceListings"/>
<menu_item_call label="Dashboard dell&apos;account..." name="Manage My Account">
<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=it"/>
</menu_item_call>
@@ -48,7 +50,7 @@
<menu_item_check label="Amici" name="My Friends"/>
<menu_item_check label="Gruppi" name="My Groups"/>
<menu_item_check label="Persone vicine" name="Active Speakers"/>
- <menu_item_call label="Blocca lista" name="Block List"/>
+ <menu_item_check label="Blocca lista" name="Block List"/>
<menu_item_check label="Non disturbare" name="Do Not Disturb"/>
</menu>
<menu label="Mondo" name="World">
@@ -62,7 +64,7 @@
<menu_item_call label="Istantanea" name="Take Snapshot"/>
<menu_item_call label="Profilo del luogo" name="Place Profile"/>
<menu_item_call label="Informazioni sul terreno" name="About Land"/>
- <menu_item_call label="Regione/proprietà immobiliare" name="Region/Estate"/>
+ <menu_item_call label="Regione/proprietà immobiliare" name="RegionEstate"/>
<menu_item_call label="Terreni posseduti..." name="My Land"/>
<menu_item_call label="Acquista questo terreno" name="Buy Land"/>
<menu label="Mostra" name="LandShow">
@@ -249,6 +251,7 @@
<menu_item_check label="Console texture" name="Texture Console"/>
<menu_item_check label="Console di Debug" name="Debug Console"/>
<menu_item_call label="Console notifiche" name="Notifications"/>
+ <menu_item_check label="Console di debug regione" name="Region Debug Console"/>
<menu_item_check label="Timer veloci" name="Fast Timers"/>
<menu_item_check label="Memoria" name="Memory"/>
<menu_item_check label="Statistiche scena" name="Scene Statistics"/>
@@ -324,7 +327,7 @@
<menu label="Rete" name="Network">
<menu_item_check label="Metti in pausa" name="AgentPause"/>
<menu_item_call label="Lascia un pacchetto" name="Drop a Packet"/>
- </menu>
+ </menu>
<menu label="Mondo" name="DevelopWorld">
<menu_item_check label="Esclusione al sole della simulazione" name="Sim Sun Override"/>
<menu_item_check label="Clima fisso" name="Fixed Weather"/>
diff --git a/indra/newview/skins/default/xui/it/mime_types.xml b/indra/newview/skins/default/xui/it/mime_types.xml
index 5eda7a5752..df119263b7 100755
--- a/indra/newview/skins/default/xui/it/mime_types.xml
+++ b/indra/newview/skins/default/xui/it/mime_types.xml
@@ -24,10 +24,10 @@
</widgetset>
<widgetset name="none">
<label name="none_label">
- Senza Contenuti
+ Nessun contenuto
</label>
<tooltip name="none_tooltip">
- Nessun video qui
+ Nessun contenuto multimediale qui
</tooltip>
</widgetset>
<widgetset name="image">
diff --git a/indra/newview/skins/default/xui/it/mime_types_linux.xml b/indra/newview/skins/default/xui/it/mime_types_linux.xml
index 3bc30b507a..1ed1fd6b1d 100755
--- a/indra/newview/skins/default/xui/it/mime_types_linux.xml
+++ b/indra/newview/skins/default/xui/it/mime_types_linux.xml
@@ -44,6 +44,14 @@
Riproduci l&apos;audio di questo luogo
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ Nessun contenuto
+ </label>
+ <tooltip name="none_tooltip">
+ Nessun contenuto multimediale qui
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Streaming in tempo reale
diff --git a/indra/newview/skins/default/xui/it/mime_types_mac.xml b/indra/newview/skins/default/xui/it/mime_types_mac.xml
index 3bc30b507a..1ed1fd6b1d 100755
--- a/indra/newview/skins/default/xui/it/mime_types_mac.xml
+++ b/indra/newview/skins/default/xui/it/mime_types_mac.xml
@@ -44,6 +44,14 @@
Riproduci l&apos;audio di questo luogo
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ Nessun contenuto
+ </label>
+ <tooltip name="none_tooltip">
+ Nessun contenuto multimediale qui
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Streaming in tempo reale
diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml
index 11211e01fe..61131b09c3 100755
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -73,6 +73,10 @@ Dettagli errore: La notifica denominata &apos;[_NAME]&apos; non è stata trovata
[MESSAGE]
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="Si"/>
</notification>
+ <notification name="GenericAlertOK">
+ [MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="BadInstallation">
Il programma [APP_NAME] ha riscontrato un&apos;errore durante il tentativo di aggiornamento. [http://get.secondlife.com Scarica l&apos;ultima versione] del Viewer.
<usetemplate name="okbutton" yestext="OK"/>
@@ -125,6 +129,88 @@ Nessuna cartella è stata inviata a Marketplace, a causa di un errore di sistema
L&apos;inizializzazione con il Marketplace non ha avuto successo a causa di un errore di sistema o di rete. Riprova più tardi.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="StockPasteFailed">
+ Impossibile copiare o spostare la cartella di magazzino a causa dell&apos;errore seguente:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantPasteFailed">
+ Impossibile copiare o spostare gli annunci Marketplace a causa dell&apos;errore seguente:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantTransactionFailed">
+ La transazione in Marketplace non è riuscita a causa dell&apos;errore seguente:
+
+ Motivo: &apos;[ERROR_REASON]&apos;
+ [ERROR_DESCRIPTION]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantUnprocessableEntity">
+ Non siamo in grado di creare un annuncio per questo prodotto o di attivare la cartella di versione. Di solito la causa è la mancanza di informazioni nel modulo di descrizione dell&apos;annuncio, ma potrebbero esserci errori nella struttura delle cartelle. Modifica l&apos;annuncio oppure verifica che non ci siano problemi legati alla cartella dell&apos;annuncio.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantListingFailed">
+ Aggiunta annuncio a Marketplace non riuscita a causa dell&apos;errore seguente:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantFolderActivationFailed">
+ L&apos;attivazione di questa cartella di versione non è riuscita a causa dell&apos;errore:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantActiveChange">
+ Questa azione cambierà il contenuto attivo di questo annuncio. Vuoi continuare?
+ <usetemplate ignoretext="Conferma prima di modificare un annuncio attivo su Marketplace" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantMoveInventory">
+ Gli articoli trascinati nella finestra degli annunci di Marketplace vengono spostati dalle posizioni iniziali e non vengono copiati. Vuoi continuare?
+ <usetemplate ignoretext="Conferma prima di spostare un articolo dall&apos;inventario a Marketplace" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmListingCutOrDelete">
+ Se sposti o elimini la cartella dell&apos;annuncio, l&apos;annuncio su Marketplace verrà eliminato. Per mantenere l&apos;annuncio su Marketplace, sposta o elimina i contenuti della cartella di versione da modificare. Vuoi continuare?
+ <usetemplate ignoretext="Conferma prima di spostare o eliminare un annuncio da Marketplace" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmCopyToMarketplace">
+ Non hai l&apos;autorizzazione necessaria per copiare uno o più di questi articoli su Marketplace. Puoi spostarli o lasciarli dove si trovano.
+ <usetemplate canceltext="Annulla" ignoretext="Conferma prima di copiare nel Marketplace una selezione che contiene articoli per i quali non è consentita la copia" name="yesnocancelbuttons" notext="Non spostare gli articoli" yestext="Sposta articoli"/>
+ </notification>
+ <notification name="ConfirmMerchantUnlist">
+ Questa azione causa la rimozione dell&apos;annuncio. Vuoi continuare?
+ <usetemplate ignoretext="Conferma prima di rimuovere un annuncio attivo da Marketplace" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantClearVersion">
+ Questa azione disattiverà la cartella di versione per l&apos;annuncio corrente. Vuoi continuare?
+ <usetemplate ignoretext="Conferma prima di disattivare la cartella di versione di un annuncio su Marketplace" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantListingNotUpdated">
+ Impossibile aggiornare l&apos;annuncio.
+[[URL] Fai clic qui] per modificarlo in Marketplace.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantListingCannotWear">
+ Non puoi indossare vestiario o parti del corpo che sono nella cartella degli annunci di Marketplace.
+ </notification>
+ <notification name="AlertMerchantListingInvalidID">
+ ID annuncio non valido.
+ </notification>
+ <notification name="AlertMerchantListingActivateRequired">
+ Ci sono svariate cartelle di versione oppure nessuna cartella di versione in questo annuncio. In seguito dovrai selezionarne e attivarne una separatamente.
+ <usetemplate ignoretext="Avvisa riguardo all&apos;attivazione della cartella di versione quando creo un annuncio con varie cartelle di versione" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderSplit">
+ Abbiamo diviso gli articoli in magazzino di tipo diverso in cartelle di magazzino separate. In questo modo la tua cartella è ordinata per la pubblicazione nell&apos;annuncio.
+ <usetemplate ignoretext="Avverti quando la cartella di magazzino viene suddivisa prima della pubblicazione dell&apos;annuncio" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderEmpty">
+ L&apos;annuncio è stato rimosso perché il magazzino è esaurito. Aggiungi altre unità alla cartella di magazzino prima di pubblicare nuovamente l&apos;annuncio.
+ <usetemplate ignoretext="Avverti quando un annuncio viene rimosso perché la cartella di magazzino è vuota" name="okignore" yestext="OK"/>
+ </notification>
<notification name="CompileQueueSaveText">
C&apos;è stato un problema importando il testo di uno script per la seguente ragione: [REASON]. Riprova più tardi.
</notification>
@@ -466,6 +552,10 @@ Nota: questa operazione cancellerà la cache.
Salva le modifiche?
<usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Non salvare" yestext="Salva"/>
</notification>
+ <notification name="DeleteNotecard">
+ Vuoi eliminare il biglietto?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
<notification name="GestureSaveFailedTooManySteps">
Il salvataggio della Gesture è fallito.
La gesture ha troppi passi.
@@ -572,6 +662,9 @@ La qualità grafica può essere aumentata in Preferenze &gt; Grafica.
<notification name="RegionNoTerraforming">
La regione [REGION] non consente di terraformare.
</notification>
+ <notification name="ParcelNoTerraforming">
+ Non ti è consentito terraformare il lotto [PARCEL].
+ </notification>
<notification name="CannotCopyWarning">
Non hai l&apos;autorizzazione a copiare i seguenti oggetti:
[ITEMS]
@@ -1829,6 +1922,30 @@ Cambierà migliaia di regioni e produrrà seri problemi ai vari server.
Rimuovi come gestore della proprietà solo per questa proprietà oppure per [ALL_ESTATES]?
<usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/>
</notification>
+ <notification label="Seleziona proprietà immobiliare" name="EstateAllowedExperienceAdd">
+ Aggiungi all&apos;elenco di elementi consentiti per questa proprietà immobiliare oppure per [ALL_ESTATES]?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà immobiliari" yestext="Questa proprietà immobiliare"/>
+ </notification>
+ <notification label="Seleziona proprietà immobiliare" name="EstateAllowedExperienceRemove">
+ Rimuovi dall&apos;elenco di elementi consentiti per questa proprietà immobiliare oppure per [ALL_ESTATES]?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà immobiliari" yestext="Questa proprietà immobiliare"/>
+ </notification>
+ <notification label="Seleziona proprietà immobiliare" name="EstateBlockedExperienceAdd">
+ Aggiungi all&apos;elenco di elementi bloccati per questa proprietà immobiliare oppure per [ALL_ESTATES]?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà immobiliari" yestext="Questa proprietà immobiliare"/>
+ </notification>
+ <notification label="Seleziona proprietà immobiliare" name="EstateBlockedExperienceRemove">
+ Rimuovi dall&apos;elenco di elementi bloccati per questa proprietà immobiliare oppure per [ALL_ESTATES]?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà immobiliari" yestext="Questa proprietà immobiliare"/>
+ </notification>
+ <notification label="Seleziona proprietà immobiliare" name="EstateTrustedExperienceAdd">
+ Aggiungi all&apos;elenco di elementi chiave per questa proprietà immobiliare oppure per [ALL_ESTATES]?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà immobiliari" yestext="Questa proprietà immobiliare"/>
+ </notification>
+ <notification label="Seleziona proprietà immobiliare" name="EstateTrustedExperienceRemove">
+ Rimuovi dall&apos;elenco di elementi chiave per questa proprietà immobiliare oppure per [ALL_ESTATES]?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà immobiliari" yestext="Questa proprietà immobiliare"/>
+ </notification>
<notification label="Conferma espulsione" name="EstateKickUser">
Espelli [EVIL_USER] da questa proprietà?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
@@ -1841,6 +1958,9 @@ Cambierà migliaia di regioni e produrrà seri problemi ai vari server.
La regione che cerchi di visitare include contenuti che non corripondono al livello selezionato nelle preferenze. Per cambiare le preferenze seleziona Io &gt; Preferenze &gt; Generale.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="SLM_UPDATE_FOLDER">
+ [MESSAGE]
+ </notification>
<notification name="RegionEntryAccessBlocked_AdultsOnlyContent">
La regione che cerchi di visitare include contenuti [REGIONMATURITY] accessibili solo ad adulti.
<url name="url">
@@ -1903,6 +2023,10 @@ Cambierà migliaia di regioni e produrrà seri problemi ai vari server.
Si è verificato un problema con il teleport a causa di un errore di sincronizzazione delle preferenze con il server.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="RegionTPSpecialUsageBlocked">
+ Impossibile entrare nella regione. &apos;[REGION_NAME]&apos; è una regione per giochi di abilità e per entrare è necessario soddisfare alcuni requisiti. Per dettagli, leggi le [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life domande frequenti sui giochi di abilità].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="PreferredMaturityChanged">
Non riceverai più notifiche se stai per visitare una regione con contenuti [RATING]. In futuro potrai modificare le preferenze relative ai contenuti selezionando Io &gt; Preferenze &gt; Generale nella barra del menu.
<usetemplate name="okbutton" yestext="OK"/>
@@ -2126,6 +2250,10 @@ Trasferisci gli elementi nell&apos;inventario?
<ignore name="ignore" text="Ho impostato l&apos;azione Paga oggetto costruendo un oggetto senza uno script money()"/>
</form>
</notification>
+ <notification name="PayConfirmation">
+ Conferma che desideri pagare [AMOUNT] L$ a [TARGET].
+ <usetemplate ignoretext="Conferma prima di pagare (somme superiori a 200 L$)" name="okcancelignore" notext="Annulla" yestext="Paga"/>
+ </notification>
<notification name="OpenObjectCannotCopy">
Non ci sono elementi in questo oggetto che tu possa copiare.
</notification>
@@ -2211,6 +2339,9 @@ Vuoi sostituirlo con l&apos;oggetto selezionato?
<button ignore="Never Replace" name="No" text="Annulla"/>
</form>
</notification>
+ <notification name="TooManyWearables">
+ Non puoi indossare una cartella che contiene più di [AMOUNT] elementi. Per modificare questo limite, accedi ad Avanzate &gt; Mostra impostazioni di debug &gt; WearFolderLimit.
+ </notification>
<notification label="Avviso modalità Non disturbare" name="DoNotDisturbModePay">
Hai attivato la modalità Non disturbare. Non riceverai alcun oggetto offerto in cambio di questo pagamento.
@@ -2662,9 +2793,6 @@ Riprova tra qualche istante.
<notification name="NoValidCircuit">
Nessun codice circuito valido.
</notification>
- <notification name="NoValidTimestamp">
- Nessuna data/timestamp valido.
- </notification>
<notification name="NoPendingConnection">
Impossibile creare la connessione in sospeso.
</notification>
@@ -2819,7 +2947,7 @@ Se rimani qui verrai scollegato da Second Life.
[MESSAGE]
-Dall&apos;oggetto: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, proprietario: [NAME]?
+Dall&apos;oggetto: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, proprietario: [NAME]
<form name="form">
<button name="Gotopage" text="Caricare"/>
<button name="Cancel" text="Annulla"/>
@@ -2845,6 +2973,72 @@ OK?
<button name="Mute" text="Blocca"/>
</form>
</notification>
+ <notification name="ExperienceAcquireFailed">
+ Impossibile acquisire una nuova esperienza:
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NotInGroupExperienceProfileMessage">
+ Una modifica apportata al gruppo esperienza è stata ignorata perché il proprietario non è un membro del gruppo selezionato.
+ </notification>
+ <notification name="UneditableExperienceProfileMessage">
+ Il campo non modificabile &apos;[field]&apos; è stato ignorato durante l&apos;aggiornamento del profilo esperienza.
+ </notification>
+ <notification name="RestrictedToOwnerExperienceProfileMessage">
+ Ignorate le modifiche apportate al campo &apos;[field]&apos;, che può essere impostato solo dal proprietario dell&apos;esperienza.
+ </notification>
+ <notification name="MaturityRatingExceedsOwnerExperienceProfileMessage">
+ Non puoi impostare la categoria di accesso di un&apos;esperienza a un livello maggiore di quello del proprietario.
+ </notification>
+ <notification name="RestrictedTermExperienceProfileMessage">
+ I termini seguenti hanno impedito l&apos;aggiornamento del nome o della descrizione del profilo dell&apos;esperienza: [extra_info]
+ </notification>
+ <notification name="TeleportedHomeExperienceRemoved">
+ Sei stato teleportato dalla regione [region_name] per aver rimosso l&apos;esperienza secondlife:///app/experience/[public_id]/profile e non puoi più accedere alla regione.
+ <form name="form">
+ <ignore name="ignore" text="Espulso dalla regione per aver rimosso un&apos;esperienza"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperienceEntry">
+ Ti è stato consentito l&apos;accesso alla regione [region_name] grazie alla partecipazione all&apos;esperienza chiave secondlife:///app/experience/[public_id]/profile. Se rimuovi l&apos;esperienza, sarai passibile di espulsione dalla regione.
+ <form name="form">
+ <ignore name="ignore" text="Può accedere a una regione grazie a un&apos;esperienza"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperiencesAvailable">
+ Non puoi accedere a questa destinazione. Potresti accedere alla regione accettando un&apos;esperienza nell&apos;elenco seguente:
+
+[EXPERIENCE_LIST]
+
+Potrebbero essere disponibili altre esperienze chiave.
+ </notification>
+ <notification name="ExperienceEvent">
+ L&apos;esperienza secondlife:///app/experience/[public_id]/profile ha consentito un oggetto la seguente azione: [EventType].
+ Proprietario: secondlife:///app/agent/[OwnerID]/inspect
+ Nome oggetto: [ObjectName]
+ Nome lotto: [ParcelName]
+ </notification>
+ <notification name="ExperienceEventAttachment">
+ L&apos;esperienza secondlife:///app/experience/[public_id]/profile ha consentito un elemento collegato la seguente azione: [EventType].
+ Proprietario: secondlife:///app/agent/[OwnerID]/inspect
+ </notification>
+ <notification name="ScriptQuestionExperience">
+ &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, un oggetto posseduto da &apos;[NAME]&apos;, richiede la tua partecipazione all&apos;esperienza [GRID_WIDE]:
+
+[EXPERIENCE]
+
+Una volta concessa l&apos;autorizzazione, questo messaggio non verrà più visualizzato per questa esperienza, a meno che l&apos;autorizzazione non venga revocata nel profilo dell&apos;esperienza.
+
+Gli script associati a questa esperienza potranno fare quanto segue nelle regioni in cui è attiva l&apos;esperienza:
+
+[QUESTIONS]OK?
+ <form name="form">
+ <button name="BlockExperience" text="Blocca esperienza"/>
+ <button name="Mute" text="Blocca oggetto"/>
+ <button name="Yes" text="Sì"/>
+ <button name="No" text="No"/>
+ </form>
+ </notification>
<notification name="ScriptQuestionCaution">
Avviso: L&apos;oggetto &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; ha richiesto accesso completo al tuo account in Dollari Linden. Se consenti l&apos;accesso, potrà rimuovere fondi dal tuo account in qualunque momento e anche svuotare completamente l&apos;account, per un periodo illimitato e senza ulteriori avvisi.
@@ -3164,6 +3358,10 @@ Hai caricato una texture [RESOLUTION] completata per &apos;[BODYREGION]&apos; do
( In esistenza da [EXISTENCE] secondi)
Hai aggiornato localmente una texture [RESOLUTION] completata per &apos;[BODYREGION]&apos; dopo [TIME] secondi.
</notification>
+ <notification name="CannotUploadTexture">
+ Impossibile caricare la texture.
+[REASON]
+ </notification>
<notification name="LivePreviewUnavailable">
Non possiamo mostrare un&apos;anteprima di questa texture perché non ne è consentita la copia e/o il trasferimento.
<usetemplate ignoretext="Avvisami se la modalità Anteprima dal vivo non è disponibile per texture per cui non è consentita la copia e/o il trasferimento." name="okignore" yestext="OK"/>
@@ -3739,9 +3937,11 @@ Riprova tra un minuto.
</notification>
<notification name="TeleportedByAttachment">
Sei stato teletrasportato da un elemento collegato a [ITEM_ID]
+ <usetemplate ignoretext="Teleport: sei stato teleportato da un elemento accessorio" name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOnParcel">
Sei stato teleportato dall&apos;oggetto &apos;[OBJECT_NAME]&apos; sul lotto &apos;[PARCEL_NAME]&apos;
+ <usetemplate ignoretext="Teleport: sei stato teleportato su un lotto da un oggetto" name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOwnedBy">
Sei stato teleportato dall&apos;oggetto &apos;[OBJECT_NAME]&apos; di proprietà di [OWNER_ID]
@@ -4073,7 +4273,7 @@ Prova a selezionare un pezzo di terreno più piccolo.
<usetemplate ignoretext="Impossibile spostare i file. Il percorso precedente è stato ripristinato." name="okignore" yestext="OK"/>
</notification>
<notification name="DefaultObjectPermissions">
- Si è verificato un problema nel salvare i diritti predefiniti per il motivo seguente: [REASON]. Riprova più tardi.
+ Si è verificato un problema nel salvare le autorizzazioni predefinite dell&apos;oggetto: [REASON]. Riprova più tardi.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ChatHistoryIsBusyAlert">
diff --git a/indra/newview/skins/default/xui/it/panel_experience_info.xml b/indra/newview/skins/default/xui/it/panel_experience_info.xml
new file mode 100644
index 0000000000..706f139bcc
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_experience_info.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_experience_info">
+ <text name="title" value="Profilo esperienza"/>
+ <scroll_container name="xp_scroll">
+ <panel name="scrolling_panel">
+ <layout_stack>
+ <layout_panel>
+ <text name="experience_title" value="Kyle&apos;s Superhero RPG"/>
+ </layout_panel>
+ <layout_panel name="location panel">
+ <text name="Location">
+ Luogo:
+ </text>
+ <text name="LocationTextText">
+ in qualche posto
+ </text>
+ <button label="Teleport" name="teleport_btn"/>
+ <button label="Mappa" name="map_btn"/>
+ </layout_panel>
+ <layout_panel name="marketplace panel">
+ <text name="Location">
+ Negozio Marketplace:
+ </text>
+ <text name="LocationTextText">
+ in qualche posto
+ </text>
+ </layout_panel>
+ <layout_panel>
+ <text name="ContentRating">
+ Categoria:
+ </text>
+ <text name="ContentRatingText">
+ Adulti
+ </text>
+ <text name="Owner">
+ Proprietario:
+ </text>
+ <text name="OwnerText">
+ Kyle
+ </text>
+ <button label="Modifica" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_experience_list_editor.xml b/indra/newview/skins/default/xui/it/panel_experience_list_editor.xml
new file mode 100644
index 0000000000..46d39eabdd
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_experience_list_editor.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="experince_list_editor">
+ <panel.string name="loading">
+ caricamento in corso...
+ </panel.string>
+ <panel.string name="panel_allowed">
+ Esperienze consentite:
+ </panel.string>
+ <panel.string name="panel_blocked">
+ Esperienze bloccate:
+ </panel.string>
+ <panel.string name="panel_trusted">
+ Esperienze chiave:
+ </panel.string>
+ <panel.string name="no_results">
+ (vuoto)
+ </panel.string>
+ <text name="text_name">
+ Elenco esperienze
+ </text>
+ <scroll_list name="experience_list">
+ <columns label="Nome" name="experience_name"/>
+ </scroll_list>
+ <button label="Aggiungi..." name="btn_add"/>
+ <button label="Rimuovi" name="btn_remove"/>
+ <button label="Profilo..." name="btn_profile"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_experience_list_item.xml b/indra/newview/skins/default/xui/it/panel_experience_list_item.xml
new file mode 100644
index 0000000000..f99c71c22e
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_experience_list_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiences">
+ <text name="experience_name">
+ Nome fittizio
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_experience_log.xml b/indra/newview/skins/default/xui/it/panel_experience_log.xml
new file mode 100644
index 0000000000..a03e8410b1
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_experience_log.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="EVENTS">
+ <string name="no_events" value="Nessun evento."/>
+ <string name="loading" value="caricamento in corso..."/>
+ <layout_stack>
+ <layout_panel>
+ <scroll_list name="experience_log_list">
+ <columns label="Giorno/ora" name="time"/>
+ <columns label="Evento" name="event"/>
+ <columns label="Esperienza" name="experience_name"/>
+ <columns label="Oggetto" name="object_name"/>
+ </scroll_list>
+ <button label="Notifica" name="btn_notify"/>
+ <button label="Profilo" name="btn_profile_xp"/>
+ <button label="Segnalazione" name="btn_report_xp"/>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <check_box label="Notifica tutti gli eventi Giorni" name="notify_all"/>
+ <button label="Cancella" name="btn_clear"/>
+ <button label="&lt;" name="btn_prev"/>
+ <button label="&gt;" name="btn_next"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_experience_search.xml b/indra/newview/skins/default/xui/it/panel_experience_search.xml
new file mode 100644
index 0000000000..124b060f20
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_experience_search.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="SEARCH">
+ <string name="not_found">
+ &apos;[TEXT]&apos; non trovato
+ </string>
+ <string name="no_results">
+ Nessun risultato
+ </string>
+ <string name="searching">
+ Ricerca in corso...
+ </string>
+ <string name="loading">
+ Caricamento in corso...
+ </string>
+ <string name="maturity_icon_general">
+ &quot;Parcel_PG_Light&quot;
+ </string>
+ <string name="maturity_icon_moderate">
+ &quot;Parcel_M_Light&quot;
+ </string>
+ <string name="maturity_icon_adult">
+ &quot;Parcel_R_Light&quot;
+ </string>
+ <panel name="search_panel">
+ <button label="Vai" name="find"/>
+ <icons_combo_box label="Moderato" name="maturity">
+ <icons_combo_box.item label="Adulti" name="Adult" value="42"/>
+ <icons_combo_box.item label="Moderato" name="Mature" value="21"/>
+ <icons_combo_box.item label="Generale" name="PG" value="13"/>
+ </icons_combo_box>
+ <scroll_list name="search_results">
+ <columns label="Nome" name="experience_name"/>
+ <columns label="Proprietario" name="owner"/>
+ </scroll_list>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="Annulla" name="cancel_btn"/>
+ <button label="Visualizza profilo" name="profile_btn"/>
+ <button label="&lt;" name="left_btn"/>
+ <button label="&gt;" name="right_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_experiences.xml b/indra/newview/skins/default/xui/it/panel_experiences.xml
new file mode 100644
index 0000000000..a305860f8f
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_experiences.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiences">
+ <string name="loading_experiences" value="Caricamento esperienze in corso..."/>
+ <string name="no_experiences" value="Nessuna esperienza."/>
+ <string name="acquire" value="Acquisisci un&apos;esperienza"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_facebook_friends.xml b/indra/newview/skins/default/xui/it/panel_facebook_friends.xml
index 917dbec4d9..c1c0489f88 100644
--- a/indra/newview/skins/default/xui/it/panel_facebook_friends.xml
+++ b/indra/newview/skins/default/xui/it/panel_facebook_friends.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_friends">
<string name="facebook_friends_empty" value="Attualmente non hai amici su Facebook che sono anche residenti in Second Life. Invita i tuoi amici di Facebook a partecipare a Second Life!"/>
- <string name="facebook_friends_no_connected" value="Attualmente non sei in collegamento con Facebook. Accedi alla scheda Account per collegarti e attivare questa funzionalità."/>
+ <string name="facebook_friends_no_connected" value="Attualmente non sei in collegamento con Facebook. Accedi alla scheda Stato per collegarti e attivare questa funzionalità."/>
<accordion name="friends_accordion">
<accordion_tab name="tab_second_life_friends" title="Amici SL"/>
<accordion_tab name="tab_suggested_friends" title="Aggiungi queste persone come amici SL"/>
diff --git a/indra/newview/skins/default/xui/it/panel_facebook_photo.xml b/indra/newview/skins/default/xui/it/panel_facebook_photo.xml
index 20ec7f0a70..044b8b6164 100644
--- a/indra/newview/skins/default/xui/it/panel_facebook_photo.xml
+++ b/indra/newview/skins/default/xui/it/panel_facebook_photo.xml
@@ -1,26 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Risoluzione immagini">
- <combo_box.item label="Finestra attuale" 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="1200x630" name="1200x630"/>
- </combo_box>
- <combo_box name="filters_combobox" tool_tip="Filtri immagini">
- <combo_box.item label="Nessun filtro" name="NoFilter"/>
- </combo_box>
- <button label="Aggiorna" name="new_snapshot_btn" tool_tip="Fai clic per aggiornare"/>
- <button label="Anteprima" name="big_preview_btn" tool_tip="Fai clic per alternare l&apos;anteprima"/>
- <text name="caption_label">
- Commento (facoltativo):
- </text>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Pubblica" name="post_photo_btn"/>
- <button label="Annulla" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <combo_box name="resolution_combobox" tool_tip="Risoluzione immagini">
+ <combo_box.item label="Finestra attuale" 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="1200x630" name="1200x630"/>
+ </combo_box>
+ <combo_box name="filters_combobox" tool_tip="Filtri immagini">
+ <combo_box.item label="Nessun filtro" name="NoFilter"/>
+ </combo_box>
+ <button label="Aggiorna" name="new_snapshot_btn" tool_tip="Fai clic per aggiornare"/>
+ <button label="Anteprima" name="big_preview_btn" tool_tip="Fai clic per alternare l&apos;anteprima"/>
+ <text name="caption_label">
+ Commento (facoltativo):
+ </text>
+ <button label="Post" name="post_photo_btn"/>
+ <button label="Annulla" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_facebook_place.xml b/indra/newview/skins/default/xui/it/panel_facebook_place.xml
index 297f0caccc..3f1365f12c 100644
--- a/indra/newview/skins/default/xui/it/panel_facebook_place.xml
+++ b/indra/newview/skins/default/xui/it/panel_facebook_place.xml
@@ -1,17 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_place">
- <layout_stack name="stack_place">
- <layout_panel name="place_detail_panel">
- <text name="place_caption_label">
- Racconta dove ti trovi:
- </text>
- </layout_panel>
- <layout_panel name="place_map_panel">
- <check_box initial_value="false" label="" name="add_place_view_cb"/>
- </layout_panel>
- <layout_panel name="place_button_panel">
- <button label="Pubblica" name="post_place_btn"/>
- <button label="Annulla" name="cancel_place_btn"/>
- </layout_panel>
- </layout_stack>
+ <text name="place_caption_label">
+ Racconta dove ti trovi:
+ </text>
+ <check_box initial_value="false" label="Includi vista dall&apos;alto del luogo" name="add_place_view_cb"/>
+ <button label="Post" name="post_place_btn"/>
+ <button label="Annulla" name="cancel_place_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_facebook_status.xml b/indra/newview/skins/default/xui/it/panel_facebook_status.xml
index d373fb0717..9b5171043a 100644
--- a/indra/newview/skins/default/xui/it/panel_facebook_status.xml
+++ b/indra/newview/skins/default/xui/it/panel_facebook_status.xml
@@ -1,14 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_status">
- <layout_stack name="stack_status">
- <layout_panel name="status_detail_panel">
- <text name="status_caption_label">
- A cosa stai pensando?
- </text>
- </layout_panel>
- <layout_panel name="status_button_panel">
- <button label="Pubblica" name="post_status_btn"/>
- <button label="Annulla" name="cancel_status_btn"/>
- </layout_panel>
- </layout_stack>
+ <string name="facebook_connected" value="Sei in collegamento con Facebook come:"/>
+ <string name="facebook_disconnected" value="Non in collegamento con Facebook"/>
+ <text name="account_caption_label">
+ Non in collegamento con Facebook.
+ </text>
+ <panel name="panel_buttons">
+ <button label="Collegamento..." name="connect_btn"/>
+ <button label="Interrompi collegamento" name="disconnect_btn"/>
+ <text name="account_learn_more_label">
+ [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 Come pubblicare su Facebook]
+ </text>
+ </panel>
+ <text name="status_caption_label">
+ A cosa stai pensando?
+ </text>
+ <button label="Post" name="post_status_btn"/>
+ <button label="Annulla" name="cancel_status_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_flickr_photo.xml b/indra/newview/skins/default/xui/it/panel_flickr_photo.xml
index 064c302b14..e989fb2081 100644
--- a/indra/newview/skins/default/xui/it/panel_flickr_photo.xml
+++ b/indra/newview/skins/default/xui/it/panel_flickr_photo.xml
@@ -1,41 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_flickr_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Risoluzione immagini">
- <combo_box.item label="Finestra attuale" 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>
- <combo_box name="filters_combobox" tool_tip="Filtri immagini">
- <combo_box.item label="Nessun filtro" name="NoFilter"/>
- </combo_box>
- <button label="Aggiorna" name="new_snapshot_btn" tool_tip="Fai clic per aggiornare"/>
- <button label="Anteprima" name="big_preview_btn" tool_tip="Fai clic per alternare l&apos;anteprima"/>
- <text name="title_label">
- Titolo:
- </text>
- <text name="description_label">
- Descrizione:
- </text>
- <check_box initial_value="true" label="Includi l&apos;ubicazione SL al termine della descrizione" name="add_location_cb"/>
- <text name="tags_label">
- Tag:
- </text>
- <text name="tags_help_label">
- Separa tag con spazi
+ <combo_box name="resolution_combobox" tool_tip="Risoluzione immagini">
+ <combo_box.item label="Finestra attuale" 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>
+ <combo_box name="filters_combobox" tool_tip="Filtri immagini">
+ <combo_box.item label="Nessun filtro" name="NoFilter"/>
+ </combo_box>
+ <button label="Aggiorna" name="new_snapshot_btn" tool_tip="Fai clic per aggiornare"/>
+ <button label="Anteprima" name="big_preview_btn" tool_tip="Fai clic per alternare l&apos;anteprima"/>
+ <text name="title_label">
+ Titolo:
+ </text>
+ <text name="description_label">
+ Descrizione:
+ </text>
+ <check_box initial_value="true" label="Includi il luogo SL al termine della descrizione" name="add_location_cb"/>
+ <text name="tags_label">
+ Tag:
+ </text>
+ <text name="tags_help_label">
+ Separa tag con spazi
Usa &quot;&quot; per tag con più di una parola
- </text>
- <combo_box name="rating_combobox" tool_tip="Categoria del contenuto di Flickr">
- <combo_box.item label="Categoria Flickr Sicuro" name="SafeRating"/>
- <combo_box.item label="Categoria Flickr Moderato" name="ModerateRating"/>
- <combo_box.item label="Categoria Flickr Censurato" name="RestrictedRating"/>
- </combo_box>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Carica" name="post_photo_btn"/>
- <button label="Annulla" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ </text>
+ <combo_box name="rating_combobox" tool_tip="Categoria del contenuto di Flickr">
+ <combo_box.item label="Categoria Flickr Sicuro" name="SafeRating"/>
+ <combo_box.item label="Categoria Flickr Moderato" name="ModerateRating"/>
+ <combo_box.item label="Categoria Flickr Censurato" name="RestrictedRating"/>
+ </combo_box>
+ <button label="Carica" name="post_photo_btn"/>
+ <button label="Annulla" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/it/panel_group_info_sidetray.xml
index 138edc3a26..fb51febc58 100755
--- a/indra/newview/skins/default/xui/it/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_info_sidetray.xml
@@ -23,6 +23,7 @@
<accordion_tab name="group_roles_tab" title="Ruoli e membri"/>
<accordion_tab name="group_notices_tab" title="Avvisi"/>
<accordion_tab name="group_land_tab" title="Terra/Beni"/>
+ <accordion_tab name="group_experiences_tab" title="Esperienze"/>
</accordion>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/it/panel_login.xml b/indra/newview/skins/default/xui/it/panel_login.xml
index 1ce38ac40c..6c1777163c 100755
--- a/indra/newview/skins/default/xui/it/panel_login.xml
+++ b/indra/newview/skins/default/xui/it/panel_login.xml
@@ -1,26 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_login">
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=it
- </panel.string>
+ <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=it</panel.string>
<layout_stack name="ui_stack">
<layout_panel name="ui_container">
<combo_box label="Nome utente" name="username_combo" tool_tip="Il nome utente che hai scelto durante la registrazione, come roby12 o Stella Solare"/>
<line_editor label="Password" name="password_edit"/>
- <check_box label="Ricordami" name="remember_check"/>
- <text name="forgot_password_text">
- Password dimenticata
- </text>
- <button label="Accedi" name="connect_btn"/>
- <text name="At_My_Last_Location_Label">
- all&apos;ultima ubicazione
- </text>
<combo_box label="I miei luoghi preferiti" name="start_location_combo">
+ <combo_box.item label="La mia ultima ubicazione" name="MyLastLocation"/>
<combo_box.item label="Casa mia" name="MyHome"/>
</combo_box>
- <button label="Accedi" name="connect_favorite_btn"/>
- <line_editor label="Digita un&apos;ubicazione" name="location_edit"/>
- <button label="Accedi" name="connect_location_btn"/>
+ <button label="Accedi" name="connect_btn"/>
+ <check_box label="Ricordami" name="remember_check"/>
+ <text name="forgot_password_text">Password dimenticata</text>
<combo_box label="Seleziona griglia" name="server_combo"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/it/panel_marketplace_listings.xml b/indra/newview/skins/default/xui/it/panel_marketplace_listings.xml
new file mode 100644
index 0000000000..d28dfadf45
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_marketplace_listings.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Marketplace" name="Marketplace Panel">
+ <panel name="tool_panel">
+ <menu_button name="sort_btn" tool_tip="Visualizza/ordina opzioni"/>
+ <button name="add_btn" tool_tip="Crea una nuova cartella annunci"/>
+ <button label="Controlla che non ci siano errori" name="audit_btn" tool_tip="Controlla i tuoi annunci su Marketplace"/>
+ </panel>
+ <panel name="tab_container_panel">
+ <filter_editor label="Filtra annunci Marketplace" name="filter_editor"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_marketplace_listings_inventory.xml b/indra/newview/skins/default/xui/it/panel_marketplace_listings_inventory.xml
new file mode 100644
index 0000000000..4902442d2b
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_marketplace_listings_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="TUTTO" name="All Items" tool_tip="Trascina e rilascia qui gli articoli da elencare"/>
diff --git a/indra/newview/skins/default/xui/it/panel_marketplace_listings_listed.xml b/indra/newview/skins/default/xui/it/panel_marketplace_listings_listed.xml
new file mode 100644
index 0000000000..3fb0d5645c
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_marketplace_listings_listed.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="IN ELENCO" name="Active Items"/>
diff --git a/indra/newview/skins/default/xui/it/panel_marketplace_listings_unassociated.xml b/indra/newview/skins/default/xui/it/panel_marketplace_listings_unassociated.xml
new file mode 100644
index 0000000000..ac6b2952fc
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_marketplace_listings_unassociated.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="NON ASSOCIATO" name="Unassociated Items"/>
diff --git a/indra/newview/skins/default/xui/it/panel_marketplace_listings_unlisted.xml b/indra/newview/skins/default/xui/it/panel_marketplace_listings_unlisted.xml
new file mode 100644
index 0000000000..6c9fae7ddc
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_marketplace_listings_unlisted.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="RIMOSSI" name="Inactive Items"/>
diff --git a/indra/newview/skins/default/xui/it/panel_postcard_settings.xml b/indra/newview/skins/default/xui/it/panel_postcard_settings.xml
index 6a586c4415..374e6a07e5 100755
--- a/indra/newview/skins/default/xui/it/panel_postcard_settings.xml
+++ b/indra/newview/skins/default/xui/it/panel_postcard_settings.xml
@@ -7,17 +7,7 @@
<combo_box.item label="1024x768" name="1024x768"/>
<combo_box.item label="Personalizza" name="Custom"/>
</combo_box>
- <layout_stack name="postcard_image_params_ls">
- <layout_panel name="postcard_image_size_lp">
- <spinner label="Larghezza" name="postcard_snapshot_width"/>
- <spinner label="Altezza" name="postcard_snapshot_height"/>
- <check_box label="Mantieni le proporzioni" name="postcard_keep_aspect_check"/>
- </layout_panel>
- <layout_panel name="postcard_image_format_quality_lp">
- <slider label="Qualità dell&apos;immagine" name="image_quality_slider"/>
- <text name="image_quality_level">
- ([QLVL])
- </text>
- </layout_panel>
- </layout_stack>
+ <spinner label="Larghezza x altezza" name="postcard_snapshot_width"/>
+ <check_box label="Mantieni le proporzioni" name="postcard_keep_aspect_check"/>
+ <slider label="Qualità:" name="image_quality_slider"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
index fcc9661d03..e204d70b03 100755
--- a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
@@ -14,9 +14,9 @@
<text name="Web:">
Web:
</text>
- <radio_group name="use_external_browser">
- <radio_item label="Usa il mio browser (IE, Firefox, Safari)" name="external" tool_tip="Utilizza il browser Web predefinito di sistema per l&apos;aiuto, per i link Web e così via. Sconsigliato durante l&apos;esecuzione a tutto schermo." value="true"/>
- <radio_item label="Utilizza il browser Web integrato" name="internal" tool_tip="Utilizza il browser Web integrato per l&apos;aiuto, per i link Web e così via. Questo browser si apre in una nuova finestra in [APP_NAME]." value=""/>
+ <radio_group name="preferred_browser_behavior">
+ <radio_item label="Usa il mio browser (Chrome, Firefox, IE) per tutti i link" name="internal" tool_tip="Utilizza il browser Web predefinito di sistema per l&apos;aiuto, per i link Web e così via. Sconsigliato durante l&apos;esecuzione a tutto schermo." value="0"/>
+ <radio_item label="Usa il browser incorporato solo per i link di Second Life" name="external" tool_tip="Utilizza il browser Web predefinito di sistema per l&apos;aiuto, per i link Web e così via. Il browser incorporato verrà usato solo per i link LindenLab/SecondLife." value="1"/>
</radio_group>
<check_box initial_value="true" label="Abilita plugin" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Accetta cookie" name="cookies_enabled"/>
diff --git a/indra/newview/skins/default/xui/it/panel_region_experiences.xml b/indra/newview/skins/default/xui/it/panel_region_experiences.xml
new file mode 100644
index 0000000000..e19650553a
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_region_experiences.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Esperienze" name="Experiences">
+ <panel.string name="trusted_estate_text">
+ Qualunque esperienza può essere un&apos;esperienza chiave.
+
+Le esperienze chiave dispongono di autorizzazione per l&apos;esecuzione in questa proprietà immobiliare.
+
+Inoltre, se la proprietà immobiliare non consente l&apos;accesso pubblico, i Residenti che partecipano a un&apos;esperienza chiave possono accedere alla proprietà e restarvi per tutto il tempo durante il quale partecipano all&apos;esperienza chiave.
+ </panel.string>
+ <panel.string name="allowed_estate_text">
+ Sono consentite solo le esperienze a livello di terreno.
+
+Le esperienze consentite dispongono di autorizzazione per l&apos;esecuzione in questa proprietà immobiliare.
+ </panel.string>
+ <panel.string name="blocked_estate_text">
+ Possono essere bloccate solo le esperienze a livello di griglia.
+
+Le esperienze bloccate non possono essere eseguite su questa proprietà immobiliare.
+ </panel.string>
+ <panel.string name="estate_caption">
+ Le modifiche apportate in questa scheda saranno valide per tutte le regioni in questa proprietà.
+ </panel.string>
+ <panel.string name="allowed_parcel_text">
+ Sono consentite solo le esperienze a livello di terreno.
+
+Le esperienze consentite dispongono di autorizzazione per l&apos;esecuzione su questo lotto se non sono bloccate a livello di proprietà immobiliare.
+ </panel.string>
+ <panel.string name="blocked_parcel_text">
+ Qualsiasi esperienza residente può essere bloccata.
+
+Le esperienze bloccate non possono essere eseguite su questo lotto.
+ </panel.string>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_script_experience.xml b/indra/newview/skins/default/xui/it/panel_script_experience.xml
new file mode 100644
index 0000000000..0f9e2fb9c5
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_script_experience.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel name="script_experience" title="ESPERIENZA">
+ <button label="Esperienza" name="Expand Experience"/>
+ <check_box label="Usa le esperienze" name="enable_xp"/>
+ <layout_stack name="xp_details">
+ <layout_panel>
+ <combo_box label="Scegli esperienza..." name="Experiences..."/>
+ </layout_panel>
+ </layout_stack>
+ <text name="No Experiences">
+ Non sei il fornitore di alcuna esperienza.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml
index c9245029b7..e6fba8e3bf 100755
--- a/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_inventory">
<text name="title">
- Salva nell&apos;inventario
+ Inventario
</text>
<text name="hint_lbl">
Salvare un&apos;immagine nell&apos;inventario costa L$[UPLOAD_COST]. Per salvare l&apos;immagine come texture, selezionare uno dei formati quadrati.
@@ -13,8 +13,8 @@
<combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
<combo_box.item label="Personalizza" name="Custom"/>
</combo_box>
- <spinner label="Larghezza" name="inventory_snapshot_width"/>
- <spinner label="Altezza" name="inventory_snapshot_height"/>
+ <spinner label="Larghezza x altezza" name="inventory_snapshot_width"/>
+ <spinner label="" name="inventory_snapshot_height"/>
<check_box label="Mantieni le proporzioni" name="inventory_keep_aspect_check"/>
<button label="Annulla" name="cancel_btn"/>
<button label="Salva" name="save_btn"/>
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_local.xml b/indra/newview/skins/default/xui/it/panel_snapshot_local.xml
index 4b725b68f9..f76c19d27b 100755
--- a/indra/newview/skins/default/xui/it/panel_snapshot_local.xml
+++ b/indra/newview/skins/default/xui/it/panel_snapshot_local.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_local">
<text name="title">
- Salva sul mio computer
+ Disco
</text>
<combo_box label="Risoluzione" name="local_size_combo">
<combo_box.item label="Finestra attuale" name="CurrentWindow"/>
@@ -13,24 +13,17 @@
<combo_box.item label="1600x1200" name="1600x1200"/>
<combo_box.item label="Personalizza" name="Custom"/>
</combo_box>
- <layout_stack name="local_image_params_ls">
- <layout_panel name="local_image_size_lp">
- <spinner label="Larghezza" name="local_snapshot_width"/>
- <spinner label="Altezza" name="local_snapshot_height"/>
- <check_box label="Mantieni le proporzioni" name="local_keep_aspect_check"/>
- </layout_panel>
- <layout_panel name="local_image_format_quality_lp">
- <combo_box label="Formato" name="local_format_combo">
- <combo_box.item label="PNG (senza perdite)" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP (senza perdite)" name="BMP"/>
- </combo_box>
- <slider label="Qualità dell&apos;immagine" name="image_quality_slider"/>
- <text name="image_quality_level">
- ([QLVL])
- </text>
- </layout_panel>
- </layout_stack>
+ <spinner label="Larghezza x altezza" name="local_snapshot_width"/>
+ <check_box label="Mantieni le proporzioni" name="local_keep_aspect_check"/>
+ <text name="local_format_label">
+ Formato:
+ </text>
+ <combo_box label="Formato" name="local_format_combo">
+ <combo_box.item label="PNG (senza perdite)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (senza perdite)" name="BMP"/>
+ </combo_box>
+ <slider label="Qualità:" name="image_quality_slider"/>
<button label="Annulla" name="cancel_btn"/>
<flyout_button label="Salva" name="save_btn" tool_tip="Salva immagine come file">
<flyout_button.item label="Salva" name="save_item"/>
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_options.xml b/indra/newview/skins/default/xui/it/panel_snapshot_options.xml
index a043e5add6..ba56499987 100755
--- a/indra/newview/skins/default/xui/it/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/it/panel_snapshot_options.xml
@@ -1,16 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_options">
- <button label="Invia post al feed del mio profilo" name="save_to_profile_btn"/>
- <button label="E-mail" name="save_to_email_btn"/>
+ <button label="Salva sul disco" name="save_to_computer_btn"/>
<button label="Salva nell&apos;inventario (L$[AMOUNT])" name="save_to_inventory_btn"/>
- <button label="Salva sul mio computer" name="save_to_computer_btn"/>
- <text name="send_to_facebook_textbox">
- Invia a: [secondlife:/// Facebook]
- </text>
- <text name="send_to_twitter_textbox">
- [secondlife:/// Twitter]
- </text>
- <text name="send_to_flickr_textbox">
- [secondlife:/// Flickr]
- </text>
+ <button label="Carica sul profilo" name="save_to_profile_btn"/>
+ <button label="Carica su Facebook" name="send_to_facebook_btn"/>
+ <button label="Carica su Twitter" name="send_to_twitter_btn"/>
+ <button label="Carica su Flickr" name="send_to_flickr_btn"/>
+ <button label="Invia tramite e-mail" name="save_to_email_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml
index 3703b97e6c..be7d8763b6 100755..100644
--- a/indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml
+++ b/indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml
@@ -12,6 +12,10 @@
<text name="title">
E-mail
</text>
- <button label="Messaggio" name="message_btn"/>
- <button label="Impostazioni" name="settings_btn"/>
+ <tab_container name="postcard_tabs">
+ <panel label="Messaggio" name="panel_postcard_message"/>
+ <panel label="Impostazioni" name="panel_postcard_settings"/>
+ </tab_container>
+ <button label="Annulla" name="cancel_btn"/>
+ <button label="Invia" name="send_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/it/panel_snapshot_profile.xml
index 2cdbf97049..3de12c959c 100755
--- a/indra/newview/skins/default/xui/it/panel_snapshot_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_snapshot_profile.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_profile">
<text name="title">
- Invia post al feed del mio profilo
+ Profilo
</text>
<combo_box label="Risoluzione" name="profile_size_combo">
<combo_box.item label="Finestra attuale" name="CurrentWindow"/>
@@ -10,19 +10,12 @@
<combo_box.item label="1024x768" name="1024x768"/>
<combo_box.item label="Personalizza" name="Custom"/>
</combo_box>
- <layout_stack name="profile_image_params_ls">
- <layout_panel name="profile_image_size_lp">
- <spinner label="Larghezza" name="profile_snapshot_width"/>
- <spinner label="Altezza" name="profile_snapshot_height"/>
- <check_box label="Mantieni le proporzioni" name="profile_keep_aspect_check"/>
- </layout_panel>
- <layout_panel name="profile_image_metadata_lp">
- <text name="caption_label">
- Didascalia:
- </text>
- <check_box initial_value="true" label="Includi luogo" name="add_location_cb"/>
- </layout_panel>
- </layout_stack>
+ <spinner label="Larghezza x altezza" name="profile_snapshot_width"/>
+ <check_box label="Mantieni le proporzioni" name="profile_keep_aspect_check"/>
+ <text name="caption_label">
+ Didascalia:
+ </text>
+ <check_box initial_value="true" label="Includi luogo" name="add_location_cb"/>
<button label="Annulla" name="cancel_btn"/>
<button label="Post" name="post_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_status_bar.xml b/indra/newview/skins/default/xui/it/panel_status_bar.xml
index 0aaf89d8c8..83d2ae5bab 100755
--- a/indra/newview/skins/default/xui/it/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/it/panel_status_bar.xml
@@ -1,28 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <panel.string name="packet_loss_tooltip">
- Perdita di pacchetti
- </panel.string>
- <panel.string name="bandwidth_tooltip">
- Larghezza di banda
- </panel.string>
- <panel.string name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string name="timeTooltip">
- [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
- </panel.string>
- <panel.string name="buycurrencylabel">
- L$ [AMT]
- </panel.string>
+ <panel.string name="packet_loss_tooltip">Perdita di pacchetti</panel.string>
+ <panel.string name="bandwidth_tooltip">Larghezza di banda</panel.string>
+ <panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>
+ <panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>
+ <panel.string name="buycurrencylabel">L$ [AMT]</panel.string>
<panel left="-405" name="balance_bg" width="195">
- <text name="balance" tool_tip="Clicca per aggiornare il tuo saldo in L$" value="L$ 20"/>
+ <text name="balance" tool_tip="Clicca per aggiornare il tuo saldo in L$" value="L$ ??"/>
<button label="Acquista L$" name="buyL" tool_tip="Clicca per acquistare più L$"/>
<button label="Acquisti" name="goShop" tool_tip="Apri Mercato Second Life" width="75"/>
</panel>
- <text name="TimeText" tool_tip="Orario attuale (Pacifico)">
- 24:00, ora del Pacifico
- </text>
+ <text name="TimeText" tool_tip="Orario attuale (Pacifico)">24:00, ora del Pacifico</text>
<button name="media_toggle_btn" tool_tip="Attiva/ferma tutti i media (musica, video, pagine Web)"/>
<button name="volume_btn" tool_tip="Regolazione del volume globale"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_twitter_photo.xml b/indra/newview/skins/default/xui/it/panel_twitter_photo.xml
index 740ec3961f..69596784bd 100644
--- a/indra/newview/skins/default/xui/it/panel_twitter_photo.xml
+++ b/indra/newview/skins/default/xui/it/panel_twitter_photo.xml
@@ -1,32 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_twitter_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="text_panel">
- <text name="status_label">
- Cosa sta succedendo?
- </text>
- <text name="status_counter_label">
- 140
- </text>
- <check_box initial_value="true" label="Includi l&apos;ubicazione in SL" name="add_location_cb"/>
- <check_box initial_value="true" label="Includi una foto" name="add_photo_cb"/>
- </layout_panel>
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Risoluzione immagini">
- <combo_box.item label="Finestra attuale" 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>
- <combo_box name="filters_combobox" tool_tip="Filtri immagini">
- <combo_box.item label="Nessun filtro" name="NoFilter"/>
- </combo_box>
- <button label="Aggiorna" name="new_snapshot_btn" tool_tip="Fai clic per aggiornare"/>
- <button label="Anteprima" name="big_preview_btn" tool_tip="Fai clic per alternare l&apos;anteprima"/>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Tweetta" name="post_photo_btn"/>
- <button label="Annulla" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <text name="status_label">
+ Cosa sta succedendo?
+ </text>
+ <text name="status_counter_label">
+ 140
+ </text>
+ <check_box initial_value="true" label="Includi il luogo in SL" name="add_location_cb"/>
+ <check_box initial_value="true" label="Includi una foto" name="add_photo_cb"/>
+ <combo_box name="resolution_combobox" tool_tip="Risoluzione immagini">
+ <combo_box.item label="Finestra attuale" 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>
+ <combo_box name="filters_combobox" tool_tip="Filtri immagini">
+ <combo_box.item label="Nessun filtro" name="NoFilter"/>
+ </combo_box>
+ <button label="Aggiorna" name="new_snapshot_btn" tool_tip="Fai clic per aggiornare"/>
+ <button label="Anteprima" name="big_preview_btn" tool_tip="Fai clic per alternare l&apos;anteprima"/>
+ <button label="Tweetta" name="post_photo_btn"/>
+ <button label="Annulla" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/role_actions.xml b/indra/newview/skins/default/xui/it/role_actions.xml
index 80d65a9c74..b53eca4f78 100755
--- a/indra/newview/skins/default/xui/it/role_actions.xml
+++ b/indra/newview/skins/default/xui/it/role_actions.xml
@@ -71,4 +71,8 @@
<action description="Partecipa alla Chat vocale di gruppo" longdescription=" I membri con questo ruolo e abilità possono partecipare alle sessioni di Chat vocale nel gruppo. NOTA: per poter partecipare alla Chat di gruppo è necessario accedere alla sessione di chat vocale." name="join voice chat" value="27"/>
<action description="Moderare la Chat di gruppo" longdescription="I membri con questo ruolo e abilità possono gestire l&apos;accesso e la partecipazione alle sessioni di chat scritta e di chat vocale nel gruppo." name="moderate group chat" value="37"/>
</action_set>
+ <action_set description="Queste Abilità includono la capacità di modificare le esperienze che appartengono al gruppo." name="experience_tools_experience">
+ <action description="Amministratore esperienza" longdescription="I membri di un ruolo che include questa abilità possono modificare i metadati di un&apos;esperienza." name="experience admin" value="49"/>
+ <action description="Fornitore esperienza" longdescription="I membri di un ruolo che include questa abilità possono fornire script per un&apos;esperienza." name="experience contributor" value="50"/>
+ </action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml
index 2b3ea0fb83..14c1c43816 100755
--- a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="item properties" title="Profilo articolo">
+ <panel.string name="loading_experience">
+ (caricamento in corso)
+ </panel.string>
<panel.string name="unknown">
(sconosciuto)
</panel.string>
@@ -43,6 +46,9 @@
<text name="LabelAcquiredTitle">
Acquisito:
</text>
+ <text name="LabelItemExperienceTitle">
+ Esperienza:
+ </text>
<panel name="perms_inv">
<text name="perm_modify">
Tu puoi:
@@ -66,8 +72,9 @@
<check_box label="Trasferisci" name="CheckNextOwnerTransfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/>
</panel>
<check_box label="In vendita" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
+ <combo_box name="ComboBoxSaleType">
<combo_box.item label="Copia" name="Copy"/>
+ <combo_box.item label="Contenuti" name="Contents"/>
<combo_box.item label="Originale" name="Original"/>
</combo_box>
<spinner label="Prezzo: L$" name="Edit Cost"/>
diff --git a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml
index 5f912dd126..aabefd7d3c 100755
--- a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml
@@ -1,71 +1,31 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="object properties" title="Profilo dell&apos;oggetto">
- <panel.string name="text deed continued">
- Cessione
- </panel.string>
- <panel.string name="text deed">
- Cessione
- </panel.string>
- <panel.string name="text modify info 1">
- Tu puoi modificare questo oggetto
- </panel.string>
- <panel.string name="text modify info 2">
- Tu puoi modificare questi oggetti
- </panel.string>
- <panel.string name="text modify info 3">
- Non puoi modificare questo oggetto
- </panel.string>
- <panel.string name="text modify info 4">
- Non puoi modificare questi oggetti
- </panel.string>
- <panel.string name="text modify info 5">
- Questo oggetto non può essere modificato attraverso il confine di una regione
- </panel.string>
- <panel.string name="text modify info 6">
- Questi oggetti non possono essere modificati attraverso il confine di una regione
- </panel.string>
- <panel.string name="text modify warning">
- Questo oggetto ha parti collegate
- </panel.string>
- <panel.string name="Cost Default">
- Prezzo: L$
- </panel.string>
- <panel.string name="Cost Total">
- Prezzo totale: L$
- </panel.string>
- <panel.string name="Cost Per Unit">
- Prezzo per: L$
- </panel.string>
- <panel.string name="Cost Mixed">
- Prezzo misto
- </panel.string>
- <panel.string name="Sale Mixed">
- Vendita mista
- </panel.string>
+ <panel.string name="text deed continued">Cessione</panel.string>
+ <panel.string name="text deed">Cessione</panel.string>
+ <panel.string name="text modify info 1">Tu puoi modificare questo oggetto</panel.string>
+ <panel.string name="text modify info 2">Tu puoi modificare questi oggetti</panel.string>
+ <panel.string name="text modify info 3">Non puoi modificare questo oggetto</panel.string>
+ <panel.string name="text modify info 4">Non puoi modificare questi oggetti</panel.string>
+ <panel.string name="text modify info 5">Questo oggetto non può essere modificato attraverso il confine di una regione</panel.string>
+ <panel.string name="text modify info 6">Questi oggetti non possono essere modificati attraverso il confine di una regione</panel.string>
+ <panel.string name="text modify warning">Questo oggetto ha parti collegate</panel.string>
+ <panel.string name="Cost Default">Prezzo: L$</panel.string>
+ <panel.string name="Cost Total">Prezzo totale: L$</panel.string>
+ <panel.string name="Cost Per Unit">Prezzo per: L$</panel.string>
+ <panel.string name="Cost Mixed">Prezzo misto</panel.string>
+ <panel.string name="Sale Mixed">Vendita mista</panel.string>
<text name="title" value="Profilo dell&apos;oggetto"/>
<text name="where" value="(in Second Life)"/>
<panel label="" name="properties_panel">
- <text name="Name:">
- Nome:
- </text>
- <text name="Description:">
- Descrizione:
- </text>
- <text name="CreatorNameLabel">
- Ideatore:
- </text>
- <text name="Owner:">
- Proprietario:
- </text>
- <text name="Group_label">
- Gruppo:
- </text>
+ <text name="Name:">Nome:</text>
+ <text name="Description:">Descrizione:</text>
+ <text name="CreatorNameLabel">Ideatore:</text>
+ <text name="Owner:">Proprietario:</text>
+ <text name="Group_label">Gruppo:</text>
<button name="button set group" tool_tip="Scegli un gruppo con cui condividere i diritti relativi all&apos;oggetto"/>
<name_box initial_value="Caricamento in corso..." name="Group Name Proxy"/>
<button label="Cessione" label_selected="Cessione" name="button deed" tool_tip="Con una cessione si trasferisce il bene con i diritti al proprietario successivo Gli oggetti in proprietà condivisa di gruppo possono essere ceduti soltanto da un funzionario del gruppo."/>
- <text name="label click action">
- Fai clic per:
- </text>
+ <text name="label click action">Fai clic per:</text>
<combo_box name="clickaction">
<combo_box.item label="Tocca (predefinito)" name="Touch/grab(default)"/>
<combo_box.item label="Siediti sull&apos;oggetto" name="Sitonobject"/>
@@ -75,21 +35,13 @@
<combo_box.item label="Ingrandisci" name="Zoom"/>
</combo_box>
<panel name="perms_inv">
- <text name="perm_modify">
- Tu puoi modificare questo oggetto
- </text>
- <text name="Anyone can:">
- Chiunque:
- </text>
+ <text name="perm_modify">Tu puoi modificare questo oggetto</text>
+ <text name="Anyone can:">Chiunque:</text>
<check_box label="Copia" name="checkbox allow everyone copy"/>
<check_box label="Sposta" name="checkbox allow everyone move"/>
- <text name="GroupLabel">
- Gruppo:
- </text>
+ <text name="GroupLabel">Gruppo:</text>
<check_box label="Condividi" name="checkbox share with group" tool_tip="Consenti a tutti i membri del gruppo selezionato di condividere i tuoi diritti di modifica di questo oggetto. Per attivare le restrizioni per ruolo devi prima effettuare la cessione."/>
- <text name="NextOwnerLabel">
- Proprietario successivo:
- </text>
+ <text name="NextOwnerLabel">Proprietario successivo:</text>
<check_box label="Modifica" name="checkbox next owner can modify"/>
<check_box label="Copia" name="checkbox next owner can copy"/>
<check_box label="Trasferisci" name="checkbox next owner can transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/>
@@ -102,27 +54,13 @@
</combo_box>
<spinner label="Prezzo: L$" name="Edit Cost"/>
<check_box label="Mostra nella ricerca" name="search_check" tool_tip="Permetti alle persone di vedere questo oggetto nei risultati della ricerca"/>
- <text name="pathfinding_attributes_label">
- Attributi pathfinding:
- </text>
- <text name="B:">
- B:
- </text>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
+ <text name="pathfinding_attributes_label">Attributi pathfinding:</text>
+ <text name="B:">B:</text>
+ <text name="O:">O:</text>
+ <text name="G:">G:</text>
+ <text name="E:">E:</text>
+ <text name="N:">N:</text>
+ <text name="F:">F:</text>
</panel>
<panel name="button_panel">
<button label="Apri" name="open_btn"/>
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index 17ce8aaf5e..b9a87a1527 100755
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -446,30 +446,51 @@ Prova ad accedere nuovamente tra un minuto.
<string name="TooltipMustSingleDrop">
Solo un singolo oggetto può essere creato qui
</string>
+ <string name="TooltipTooManyWearables">
+ Non puoi indossare una cartella che contiene più di [AMOUNT] elementi. Per modificare questo limite, accedi ad Avanzate &gt; Mostra impostazioni di debug &gt; WearFolderLimit.
+ </string>
<string name="TooltipPrice" value="L$ [AMOUNT]:"/>
<string name="TooltipOutboxDragToWorld">
- Non puoi rezzare elementi nella tua casella in uscita del rivenditore
+ Non puoi rezzare articoli dalla cartella degli annunci di Marketplace
+ </string>
+ <string name="TooltipOutboxWorn">
+ Non puoi inserire nella cartella degli annunci in Marketplace gli articoli che indossi
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ La profondità delle caselle nidificate è maggiore di [AMOUNT]. Diminuisci la profondità delle cartelle nidificate; se necessario, raggruppa gli articoli.
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Il numero di sottocartelle è maggiore di [AMOUNT]. Diminuisci il numero delle cartelle nel tuo annuncio; se necessario, raggruppa gli articoli.
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Il numero di articoli è maggiore di [AMOUNT]. Per vendere più di [AMOUNT] articoli in un annuncio, devi raggruppare alcuni di essi.
+ </string>
+ <string name="TooltipOutboxTooManyStockItems">
+ Il numero di articoli in magazzino è maggiore di [AMOUNT].
+ </string>
+ <string name="TooltipOutboxCannotDropOnRoot">
+ Puoi trascinare articoli o cartelle solo nella scheda TUTTI. Seleziona la scheda e sposta nuovamente gli articoli o le cartelle.
</string>
<string name="TooltipOutboxNoTransfer">
- Almeno uno di questi oggetti non può essere venduto o trasferito.
+ 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
+ Puoi aggiungere a Marketplace solo gli articoli nel tuo inventario
</string>
- <string name="TooltipOutboxWorn">
- Non puoi mettere gli elementi che indossi nella casella in uscita del rivenditore
+ <string name="TooltipOutboxLinked">
+ Non puoi inserire cartelle o articoli collegati tramite link nel Marketplace
</string>
<string name="TooltipOutboxCallingCard">
- Non puoi inserire il tuo biglietto da visita nella tua casella in uscita del rivenditore
+ Non puoi inserire biglietti da visita in Marketplace
</string>
- <string name="TooltipOutboxFolderLevels">
- La profondità delle caselle nidificate è maggiore di 3
+ <string name="TooltipOutboxDragActive">
+ non puoi muovere un annuncio attivo
</string>
- <string name="TooltipOutboxTooManyFolders">
- Il numero di sottocartelle nella cartella al livello più alto è maggiore di 20
+ <string name="TooltipOutboxCannotMoveRoot">
+ Non puoi spostare la cartella principale degli annunci di Marketplace
</string>
- <string name="TooltipOutboxTooManyObjects">
- Il numero di elementi nella cartella al livello più alto è maggiore di 200
+ <string name="TooltipOutboxMixedStock">
+ Tutti gli articoli in una cartella di magazzino devono essere dello stesso tipo e con le stesse autorizzazioni
</string>
<string name="TooltipDragOntoOwnChild">
Non puoi spostare una cartella nella relativa cartella secondaria
@@ -1051,9 +1072,7 @@ Prova ad accedere nuovamente tra un minuto.
<string name="AgentNameSubst">
(Tu)
</string>
- <string name="JoinAnExperience">
- Partecipa a un&apos;esperienza
- </string>
+ <string name="JoinAnExperience"/><!-- intentionally blank -->
<string name="SilentlyManageEstateAccess">
Omette gli avvisi durante la gestione degli elenchi di accesso alle proprietà immobiliari
</string>
@@ -1120,6 +1139,12 @@ Prova ad accedere nuovamente tra un minuto.
<string name="bitmap_image_files">
Immagini Bitmap
</string>
+ <string name="png_image_files">
+ Immagini PNG
+ </string>
+ <string name="save_texture_image_files">
+ Immagini Targa o PNG
+ </string>
<string name="avi_movie_file">
File video AVI
</string>
@@ -1369,6 +1394,9 @@ Prova ad accedere nuovamente tra un minuto.
<string name="FavoritesNoMatchingItems">
Trascina qui un punto di riferimento per aggiungerlo ai Preferiti.
</string>
+ <string name="MarketplaceNoMatchingItems">
+ Nessun articolo trovato. Controlla di aver digitato la stringa di ricerca correttamente e riprova.
+ </string>
<string name="InventoryNoTexture">
Non hai una copia di questa texture nel tuo inventario
</string>
@@ -1416,29 +1444,95 @@ Prova ad accedere nuovamente tra un minuto.
<string name="InventoryOutboxError">
Il [[MARKETPLACE_CREATE_STORE_URL] negozio nel Marketplace] ha riportato errori.
</string>
+ <string name="InventoryMarketplaceError">
+ Questa funzione è al momento in versione beta. Per partecipare, aggiungi il tuo nome a questo [http://goo.gl/forms/FCQ7UXkakz modulo Google].
+ </string>
+ <string name="InventoryMarketplaceListingsNoItemsTitle">
+ La cartella degli annunci di Marketplace è vuota.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItems">
+ Trascina le cartelle in questa area per metterle in vendita su [[MARKETPLACE_DASHBOARD_URL] Marketplace].
+ </string>
+ <string name="Marketplace Validation Warning Stock">
+ la cartella di magazzino deve essere inclusa in una cartella di versione
+ </string>
+ <string name="Marketplace Validation Error Mixed Stock">
+ : Errore: tutti gli articoli un una cartella di magazzino devono essere non copiabili e dello stesso tipo
+ </string>
+ <string name="Marketplace Validation Error Subfolder In Stock">
+ : Errore: la cartella di magazzino non può contenere sottocartelle
+ </string>
+ <string name="Marketplace Validation Warning Empty">
+ : Avviso: la cartella non contiene alcun articolo
+ </string>
+ <string name="Marketplace Validation Warning Create Stock">
+ : Avviso: creazione cartella di magazzino in corso
+ </string>
+ <string name="Marketplace Validation Warning Create Version">
+ : Avviso: creazione cartella di versione in corso
+ </string>
+ <string name="Marketplace Validation Warning Move">
+ : Avviso: spostamento articoli in corso
+ </string>
+ <string name="Marketplace Validation Warning Delete">
+ : Avviso: il contenuto della cartella è stato trasferito alla cartella di magazzino e la cartella vuota sta per essere rimossa
+ </string>
+ <string name="Marketplace Validation Error Stock Item">
+ : Errore: gli articoli di cui non è permessa la copia devono essere all&apos;interno di una cartella di magazzino
+ </string>
+ <string name="Marketplace Validation Warning Unwrapped Item">
+ : Avviso: gli articoli devono essere inclusi in una cartella di versione
+ </string>
+ <string name="Marketplace Validation Error">
+ : Errore:
+ </string>
+ <string name="Marketplace Validation Warning">
+ : Avviso:
+ </string>
+ <string name="Marketplace Validation Error Empty Version">
+ : Avviso: la cartella di versione deve contenere almeno 1 articolo
+ </string>
+ <string name="Marketplace Validation Error Empty Stock">
+ : Avviso: la cartella di magazzino deve contenere almeno 1 articolo
+ </string>
+ <string name="Marketplace Validation No Error">
+ Nessun errore o avviso da segnalare
+ </string>
<string name="Marketplace Error None">
Nessun errore
</string>
+ <string name="Marketplace Error Prefix">
+ Errore:
+ </string>
<string name="Marketplace Error Not Merchant">
- Errore: Prima di inviare elementi al Marketplace devi essere impostato come rivenditore (gratis).
+ Prima di inviare gli articoli al Marketplace devi essere impostato come rivenditore (gratis).
</string>
- <string name="Marketplace Error Empty Folder">
- Errore: questa cartella non include alcun contenuto.
+ <string name="Marketplace Error Not Accepted">
+ L&apos;articolo non può essere spostato in quella cartella.
</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 name="Marketplace Error Unsellable Item">
+ Questo articolo non può essere venduto nel Marketplace.
</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 name="MarketplaceNoID">
+ no Mkt ID
</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 name="MarketplaceLive">
+ in elenco
</string>
- <string name="Marketplace Error Unsellable Item">
- Errore: Questo elemento non può essere venduto nel Marketplace.
+ <string name="MarketplaceActive">
+ attivi
+ </string>
+ <string name="MarketplaceMax">
+ massimo
+ </string>
+ <string name="MarketplaceStock">
+ magazzino
</string>
- <string name="Marketplace Error Internal Import">
- Errore: problema con questo elemento. Riprova più tardi.
+ <string name="MarketplaceNoStock">
+ non in magazzino
+ </string>
+ <string name="MarketplaceUpdating">
+ in aggiornamento...
</string>
<string name="Open landmarks">
Apri luoghi di riferimento
@@ -1459,6 +1553,7 @@ Prova ad accedere nuovamente tra un minuto.
Nessun contenuto
</string>
<string name="WornOnAttachmentPoint" value="(indossato su [ATTACHMENT_POINT])"/>
+ <string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/>
<string name="ActiveGesture" value="[GESLABEL] (attivo)"/>
<string name="Chat Message" value="Chat:"/>
<string name="Sound" value="Suono :"/>
@@ -1723,6 +1818,15 @@ Prova ad accedere nuovamente tra un minuto.
<string name="Invalid Attachment">
Punto di collegamento non valido
</string>
+ <string name="ATTACHMENT_MISSING_ITEM">
+ Errore: articolo mancante
+ </string>
+ <string name="ATTACHMENT_MISSING_BASE_ITEM">
+ Errore: articolo di base mancante
+ </string>
+ <string name="ATTACHMENT_NOT_ATTACHED">
+ Errore: l&apos;oggetto è nel vestiario corrente ma non è collegato
+ </string>
<string name="YearsMonthsOld">
Nato da [AGEYEARS] [AGEMONTHS]
</string>
@@ -1891,6 +1995,9 @@ Prova ad accedere nuovamente tra un minuto.
<string name="SaveComplete">
Salvataggio completato.
</string>
+ <string name="UploadFailed">
+ Caricamento file non riuscito:
+ </string>
<string name="ObjectOutOfRange">
Script (oggetto fuori portata)
</string>
@@ -1900,6 +2007,9 @@ Prova ad accedere nuovamente tra un minuto.
<string name="GroupsNone">
nessuno
</string>
+ <string name="CompileNoExperiencePerm">
+ Saltato lo script [SCRIPT] con l&apos;esperienza [EXPERIENCE].
+ </string>
<string name="Group" value="(gruppo)"/>
<string name="Unknown">
(Sconosciuto)
@@ -4979,6 +5089,9 @@ Prova a racchiudere il percorso dell&apos;editor in doppie virgolette.
<string name="Command_Marketplace_Label">
Mercato
</string>
+ <string name="Command_MarketplaceListings_Label">
+ Marketplace
+ </string>
<string name="Command_MiniMap_Label">
Mini mappa
</string>
@@ -5066,6 +5179,9 @@ Prova a racchiudere il percorso dell&apos;editor in doppie virgolette.
<string name="Command_Marketplace_Tooltip">
Vai allo shopping
</string>
+ <string name="Command_MarketplaceListings_Tooltip">
+ Vendi le tue creazioni
+ </string>
<string name="Command_MiniMap_Tooltip">
Mostra le persone vicine
</string>
@@ -5189,4 +5305,85 @@ Prova a racchiudere il percorso dell&apos;editor in doppie virgolette.
<string name="loading_chat_logs">
Caricamento in corso...
</string>
+ <string name="experience_tools_experience">
+ Esperienza
+ </string>
+ <string name="ExperienceNameNull">
+ (nessuna esperienza)
+ </string>
+ <string name="ExperienceNameUntitled">
+ (esperienza senza titolo)
+ </string>
+ <string name="Land-Scope">
+ A livello di terreno
+ </string>
+ <string name="Grid-Scope">
+ A livello di griglia
+ </string>
+ <string name="Allowed_Experiences_Tab">
+ CONSENTITO
+ </string>
+ <string name="Blocked_Experiences_Tab">
+ BLOCCATO
+ </string>
+ <string name="Contrib_Experiences_Tab">
+ FORNITORE
+ </string>
+ <string name="Admin_Experiences_Tab">
+ AMMINISTRATORE
+ </string>
+ <string name="Recent_Experiences_Tab">
+ RECENTE
+ </string>
+ <string name="Owned_Experiences_Tab">
+ DI PROPRIETÀ
+ </string>
+ <string name="ExperiencesCounter">
+ ([EXPERIENCES], massimo [MAXEXPERIENCES])
+ </string>
+ <string name="ExperiencePermission1">
+ gestione dei tuoi comandi
+ </string>
+ <string name="ExperiencePermission3">
+ attivazione di animazioni per il tuo avatar
+ </string>
+ <string name="ExperiencePermission4">
+ collegamento al tuo avatar
+ </string>
+ <string name="ExperiencePermission9">
+ monitoraggio della tua videocamera
+ </string>
+ <string name="ExperiencePermission10">
+ controllo della tua videocamera
+ </string>
+ <string name="ExperiencePermission11">
+ ti teletrasporta
+ </string>
+ <string name="ExperiencePermission12">
+ accettazione automaticamente delle autorizzazioni per le esperienze
+ </string>
+ <string name="ExperiencePermissionShortUnknown">
+ ha eseguito un&apos;operazione sconosciuta: [Permission]
+ </string>
+ <string name="ExperiencePermissionShort1">
+ Gestione dei comandi
+ </string>
+ <string name="ExperiencePermissionShort3">
+ Attivazione di animazioni
+ </string>
+ <string name="ExperiencePermissionShort4">
+ Collegamento
+ </string>
+ <string name="ExperiencePermissionShort9">
+ Monitoraggio videocamera
+ </string>
+ <string name="ExperiencePermissionShort10">
+ Controllo videocamera
+ </string>
+ <string name="ExperiencePermissionShort11">
+ Teleport
+ </string>
+ <string name="ExperiencePermissionShort12">
+ Autorizzazione
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/it/teleport_strings.xml b/indra/newview/skins/default/xui/it/teleport_strings.xml
index bd967ebcc4..e4c4dda889 100755
--- a/indra/newview/skins/default/xui/it/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/it/teleport_strings.xml
@@ -46,6 +46,9 @@ Per ripetere l&apos;esercitazione, visita &apos;Welcome Island Public&apos;.
<message name="MustGetAgeRegion">
Per poter entrare in questa regione devi avere almeno 18 anni.
</message>
+ <message name="RegionTPSpecialUsageBlocked">
+ Impossibile entrare nella regione. &apos;[REGION_NAME]&apos; è una regione per giochi di abilità e per entrare è necessario soddisfare alcuni requisiti. Per dettagli, leggi le [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life domande frequenti sui giochi di abilità].
+ </message>
</message_set>
<message_set name="progress">
<message name="sending_dest">
diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml
index 63a4e69c10..91a61ab225 100755
--- a/indra/newview/skins/default/xui/ja/floater_about.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about.xml
@@ -1,74 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="[CAPITALIZED_APP_NAME] について">
- <floater.string name="AboutHeader">
- [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
-[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
- </floater.string>
- <floater.string name="AboutCompiler">
- コンパイラー [COMPILER] [COMPILER_VERSION] バージョン
- </floater.string>
- <floater.string name="AboutPosition">
- あなたの現在地は、[POSITION_LOCAL_0,number,1]、[POSITION_LOCAL_1,number,1]、[POSITION_LOCAL_2,number,1] の [REGION] です。位置は &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; です。([HOSTIP])
-SLURL:&lt;nolink&gt;[SLURL]&lt;/nolink&gt;
-(グローバル座標 [POSITION_0,number,1]、[POSITION_1,number,1]、[POSITION_2,number,1])
-[SERVER_VERSION]
-[SERVER_RELEASE_NOTES_URL]
- </floater.string>
- <floater.string name="AboutSystem">
- CPU: [CPU]
-メモリ: [MEMORY_MB] MB
-OS バージョン: [OS_VERSION]
-グラフィックカード製造元: [GRAPHICS_CARD_VENDOR]
-グラフィックカード: [GRAPHICS_CARD]
- </floater.string>
- <floater.string name="AboutDriver">
- Windows グラフィックドライババージョン: [GRAPHICS_DRIVER_VERSION]
- </floater.string>
- <floater.string name="AboutLibs">
- OpenGL バージョン: [OPENGL_VERSION]
-
-libcurl バージョン: [LIBCURL_VERSION]
-J2C デコーダバージョン: [J2C_VERSION]
-オーディオドライババージョン: [AUDIO_DRIVER_VERSION]
-Qt Webkit バージョン: [QT_WEBKIT_VERSION]
-ボイスサーバーバージョン: [VOICE_VERSION]
- </floater.string>
- <floater.string name="none">
- (なし)
- </floater.string>
- <floater.string name="AboutTraffic">
- パケットロス: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
- </floater.string>
- <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 name="linden_intro">
- Second Life の提供元: Lindens の:
- </text>
- <text_editor name="linden_names">
- Philip, Andrew, Doug, Richard, Phoenix, Ian, Mark, Robin, Dan, Char, Ryan, Eric, Jim, Lee, Jeff, Michael, Kelly, Steve, Catherine, Bub, Ramzi, Jill, Jeska, Don, Kona, Callum, Charity, Jack, Shawn, babbage, James, Lauren, Blue, Brent, Reuben, Pathfinder, Jesse, Patsy, Torley, Bo, Cyn, Jonathan, Gia, Annette, Ginsu, Harry, Lex, Runitai, Guy, Cornelius, Beth, Swiss, Thumper, Wendy, Teeple, Seth, Dee, Mia, Sally, Liana, Aura, Beez, Milo, Red, Gulliver, Marius, Joe, Jose, Dore, Justin, Nora, Morpheus, Lexie, Amber, Chris, Xan, Leyla, Walker, Sabin, Joshua, Hiromi, Tofu, Fritz, June, Jean, Ivy, Dez, Ken, Betsy, Which, Spike, Rob, Zee, Dustin, George, Claudia, del, Matthew, jane, jay, Adrian, Yool, Rika, Yoz, siobhan, Qarl, Benjamin, Beast, Everett, madhavi, Christopher, Izzy, stephany, Jeremy, sean, adreanne, Pramod, Tobin, sejong, Iridium, maurice, kj, Meta, kari, JP, bert, kyle, Jon, Socrates, Bridie, Ivan, maria, Aric, Coco, Periapse, sandy, Storrs, Lotte, Colossus, Brad, Pastrami, Zen, BigPapi, Banzai, Sardonyx, Mani, Garry, Jaime, Neuro, Samuel, Niko, CeeLo, Austin, Soft, Poppy, emma, tessa, angelo, kurz, alexa, Sue, CG, Blake, Erica, Brett, Bevis, kristen, Q, simon, Enus, MJ, laurap, Kip, Scouse, Ron, Ram, kend, Marty, Prospero, melissa, kraft, Nat, Seraph, Hamilton, Lordan, Green, miz, Ashlei, Trinity, Ekim, Echo, Charlie, Rowan, Rome, Jt, Doris, benoc, Christy, Bao, Kate, Tj, Patch, Cheah, Johan, Brandy, Angela, Oreh, Cogsworth, Lan, Mitchell, Space, Bambers, Einstein, Bender, Malbers, Matias, Maggie, Rothman, Milton, Niall, Marin, Allison, Mango, Andrea, Katt, Yi, Ambroff, Rico, Raymond, Gail, Christa, William, Dawn, Usi, Dynamike, M, Corr, Dante, Molly, kaylee, Danica, Kelv, Lil, jacob, Nya, Rodney, elsie, Blondin, Grant, Nyx, Devin, Monty, Minerva, Keira, Katie, Jenn, Makai, Clare, Joy, Cody, Gayathri, FJ, spider, Oskar, Landon, Jarv, Noelle, Al, Doc, Gray, Vir, t, Maestro, Simone, Shannon, yang, Courtney, Scott, charlene, Quixote, Susan, Zed, Amanda, Katelin, Esbee, JoRoan, Enkidu, roxie, Scarlet, Merov, Kevin, Judy, Rand, Newell, Les, Dessie, Galen, Michon, Geo, Siz, Calyle, Pete, Praveen, Callen, Sheldon, Pink, Nelson, jenelle, Terrence, Nathan, Juan, Sascha, Huseby, Karina, Kaye, Kotler, Lis, Darv, Charrell, Dakota, Kimmora, Theeba, Taka, Mae, Perry, Ducot, dana, Esther, Dough, gisele, Doten, Viale, Fisher, jessieann, ashley, Torres, delby, rountree, kurt, Slaton, Madison, Rue, Gino, Wen, Casssandra, Brodesky, Squid, Gez, Rakesh, Gecko, Ladan, Tony, Tatem, Squire, Falcon, BK, Crimp, Tiggs, Bacon, Coyot, Carmilla, Webb, Sea, Arch, Jillian, Jason, Bernard, Vogt, Peggy, dragon, Pup, xandix, Wallace, Bewest, Inoshiro, Rhett, AG, Aimee, Ghengis, Itiaes, Eli, Steffan, Epic, Grapes, Stone, Prep, Scobu, Robert, Alain, Carla, Vicky, Tia, Alec, Taras, Lisa, Oz, Ariane, Log, House, Kazu, Kim, Drofnas, Tyler, Campbell, Michele, Madeline, Nelly, Baron, Thor, Lori, Hele, Fredrik, Teddy, Pixie, Berry, Gabrielle, Alfonso, Brooke, Wolf, Ringo, Cru, Charlar, Rodvik, Gibson, Elise, Bagman, Greger, Leonidas, Jerm, Leslie, CB, Brenda, Durian, Carlo, mm, Zeeshan, Caleb, Max, Elikak, Mercille, Steph, Chase
- </text_editor>
- <text name="contrib_intro">
- オープンソースの提供:
- </text>
- <text_editor name="contrib_names">
- Dummy Name は実行時間に置き換え
- </text_editor>
- <text name="trans_intro">
- 翻訳会社:
- </text>
- <text_editor name="trans_names">
- Dummy Name は実行時間に置き換え
- </text_editor>
+ <text name="linden_intro">Second Life の提供元: Lindens の、
+オープンソースの提供:</text>
+ <text_editor name="contrib_names">Dummy Name は実行時間に置き換え</text_editor>
</panel>
<panel label="ライセンス" name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
+ <text_editor name="licenses_editor">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)
@@ -95,8 +37,7 @@ Second Life ビューワでは Havok (TM) Physics が使用されています。
無断複写・複製・転載を禁じます。詳細については licenses.txt をご参照ください。
-ボイスチャットのオーディオコーディング:Polycom(R) Siren14(TM) (ITU-T Rec.G.722.1 Annex C)
- </text_editor>
+ボイスチャットのオーディオコーディング:Polycom(R) Siren14(TM) (ITU-T Rec.G.722.1 Annex C)</text_editor>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml
index 3b4b5ed070..fc1ed5554a 100755
--- a/indra/newview/skins/default/xui/ja/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml
@@ -310,9 +310,6 @@
<panel.string name="push_restrict_region_text">
プッシュ禁止 (地域設定優先)
</panel.string>
- <panel.string name="see_avs_text">
- 他の区画にいるアバターは、
- </panel.string>
<text name="allow_label">
他の住人への許可:
</text>
@@ -338,22 +335,6 @@
<check_box label="安全(ダメージなし)" name="check safe" tool_tip="チェックを入れるとこの土地でのダメージコンバットが無効になり、「安全」に設定されます。 チェックを外すとダメージコンバットが有効になります。"/>
<check_box label="プッシュ禁止" name="PushRestrictCheck" tool_tip="スクリプトによるプッシュを禁止します。 このオプションを選択することにより、あなたの土地での破壊的行動を防ぐことができます。"/>
<check_box label="検索に区画を表示(週 L$ 30)" name="ShowDirectoryCheck" tool_tip="この区画を検索結果に表示します"/>
- <combo_box name="land category with adult">
- <combo_box.item label="全カテゴリ" name="item0"/>
- <combo_box.item label="Linden 所在地" name="item1"/>
- <combo_box.item label="Adult" name="item2"/>
- <combo_box.item label="アートとカルチャー" name="item3"/>
- <combo_box.item label="ビジネス" name="item4"/>
- <combo_box.item label="教育的" name="item5"/>
- <combo_box.item label="ゲーム" name="item6"/>
- <combo_box.item label="たまり場" name="item7"/>
- <combo_box.item label="新住人に好意的" name="item8"/>
- <combo_box.item label="公園と自然" name="item9"/>
- <combo_box.item label="住宅用" name="item10"/>
- <combo_box.item label="ショッピング" name="item11"/>
- <combo_box.item label="レンタル" name="item13"/>
- <combo_box.item label="その他" name="item12"/>
- </combo_box>
<combo_box name="land category">
<combo_box.item label="全カテゴリ" name="item0"/>
<combo_box.item label="Linden 所在地" name="item1"/>
@@ -450,15 +431,9 @@
<panel.string name="access_estate_defined">
(エステートに限定)
</panel.string>
- <panel.string name="allow_public_access">
- パブリックアクセスを許可 ([MATURITY])(注意:このオプションをオフにすると立入禁止ラインが作成されます)
- </panel.string>
<panel.string name="estate_override">
1 つ以上のオプションが、不動産レベルで設定されています。
</panel.string>
- <text name="Limit access to this parcel to:">
- この区画へのアクセス
- </text>
<check_box label="パブリックアクセスを許可(このオプションをオフにすると立入禁止ラインが作成されます)" name="public_access"/>
<text name="Only Allow">
次の住人にのみアクセスを許可:
@@ -490,5 +465,6 @@
<button label="削除" label_selected="削除" name="remove_banned"/>
</panel>
</panel>
+ <panel label="経験" name="land_experiences_panel"/>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_associate_listing.xml b/indra/newview/skins/default/xui/ja/floater_associate_listing.xml
new file mode 100644
index 0000000000..b106750a6f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_associate_listing.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="associate listing" title="リストを関連付ける">
+ <text name="message">リスト ID:</text>
+ <line_editor name="listing_id">ここに ID を入力</line_editor>
+ <button label="OK" name="OK"/>
+ <button label="取り消し" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_edit_hover_height.xml b/indra/newview/skins/default/xui/ja/floater_edit_hover_height.xml
new file mode 100644
index 0000000000..ac5b2839d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_edit_hover_height.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="HoverHeight" title="ホバー高さの設定">
+ <slider label="高さ" name="HoverHeightSlider"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_experience_search.xml b/indra/newview/skins/default/xui/ja/floater_experience_search.xml
new file mode 100644
index 0000000000..37f3da7d73
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_experience_search.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="experiencepicker" title="体験を選択"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_experienceprofile.xml b/indra/newview/skins/default/xui/ja/floater_experienceprofile.xml
new file mode 100644
index 0000000000..7819b887db
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_experienceprofile.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater title="EXPERIENCE PROFILE">
+ <floater.string name="empty_slurl">
+ (なし)
+ </floater.string>
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Light&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Light&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Light&quot;
+ </floater.string>
+ <text name="edit_title" value="体験プロフィール"/>
+ <tab_container name="tab_container">
+ <panel name="panel_experience_info">
+ <scroll_container name="xp_scroll">
+ <panel name="scrolling_panel">
+ <layout_stack>
+ <layout_panel name="top panel">
+ <button label="編集" name="edit_btn"/>
+ </layout_panel>
+ <layout_panel name="maturity panel">
+ <text name="ContentRating">
+ 評価:
+ </text>
+ </layout_panel>
+ <layout_panel name="location panel">
+ <text name="Location">
+ 場所:
+ </text>
+ </layout_panel>
+ <layout_panel>
+ <text name="Owner">
+ 所有者:
+ </text>
+ </layout_panel>
+ <layout_panel name="group_panel">
+ <text name="Group">
+ グループ:
+ </text>
+ </layout_panel>
+ <layout_panel name="perm panel">
+ <button label="許可" name="allow_btn"/>
+ <button label="無視" name="forget_btn"/>
+ <button label="ブロック" name="block_btn"/>
+ <text name="privileged">
+ この体験はすべての住人に対して有効です。
+ </text>
+ <button label="嫌がらせの報告" name="report_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ </panel>
+ <panel name="edit_panel_experience_info">
+ <scroll_container name="edit_xp_scroll">
+ <panel name="edit_scrolling_panel">
+ <text name="edit_experience_title_label" value="名前:"/>
+ <text name="edit_experience_desc_label" value="説明:"/>
+ <button label="グループ" name="Group_btn"/>
+ <text name="edit_ContentRating">
+ 評価:
+ </text>
+ <icons_combo_box label="Moderate" name="edit_ContentRatingText" tool_tip="体験のレーティング区分を上げると、体験を許可したすべての住人の権限がリセットされます。">
+ <icons_combo_box.item label="Adult" name="Adult" value="42"/>
+ <icons_combo_box.item label="Moderate" name="Mature" value="21"/>
+ <icons_combo_box.item label="全般" name="PG" value="13"/>
+ </icons_combo_box>
+ <text name="edit_Location">
+ 場所:
+ </text>
+ <button label="現在に設定" name="location_btn"/>
+ <button label="場所をクリア" name="clear_btn"/>
+ <check_box label="体験を有効にする" name="edit_enable_btn" tool_tip=""/>
+ <check_box label="検索で表示しない" name="edit_private_btn"/>
+ <text name="changes" value="体験がすべてのリージョンに表示されるには数分かかる場合があります。"/>
+ <button label="戻る" name="cancel_btn"/>
+ <button label="保存" name="save_btn"/>
+ </panel>
+ </scroll_container>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_experiences.xml b/indra/newview/skins/default/xui/ja/floater_experiences.xml
new file mode 100644
index 0000000000..5186f8ee38
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_experiences.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_experiences" title="体験"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_facebook.xml b/indra/newview/skins/default/xui/ja/floater_facebook.xml
index d99841f0de..76149a875e 100644
--- a/indra/newview/skins/default/xui/ja/floater_facebook.xml
+++ b/indra/newview/skins/default/xui/ja/floater_facebook.xml
@@ -1,20 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_facebook" title="FACEBOOK に投稿">
- <panel name="background">
- <tab_container name="tabs">
- <panel label="ステータス" name="panel_facebook_status"/>
- <panel label="写真" name="panel_facebook_photo"/>
- <panel label="チェックイン" name="panel_facebook_place"/>
- <panel label="フレンド" name="panel_facebook_friends"/>
- <panel label="アカウント" name="panel_facebook_account"/>
- </tab_container>
- <panel name="connection_status_panel">
- <text name="connection_error_text">
- エラー
- </text>
- <text name="connection_loading_text">
- ロード中...
- </text>
- </panel>
- </panel>
+ <tab_container name="tabs">
+ <panel label="ステータス" name="panel_facebook_status"/>
+ <panel label="写真" name="panel_facebook_photo"/>
+ <panel label="チェックイン" name="panel_facebook_place"/>
+ <panel label="フレンド" name="panel_facebook_friends"/>
+ </tab_container>
+ <text name="connection_error_text">
+ エラー
+ </text>
+ <text name="connection_loading_text">
+ ロード中...
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml
index c01c46211e..8d3a655a06 100755
--- a/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml
@@ -1,67 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="item properties" title="インベントリアイテムのプロパティ">
- <floater.string name="unknown">
- (不明)
- </floater.string>
- <floater.string name="public">
- (公共)
- </floater.string>
- <floater.string name="you_can">
- できること:
- </floater.string>
- <floater.string name="owner_can">
- オーナーは次のことができます:
- </floater.string>
- <floater.string name="acquiredDate">
- [year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
- </floater.string>
- <text name="LabelItemNameTitle">
- 名前:
- </text>
- <text name="LabelItemDescTitle">
- 説明:
- </text>
- <text name="LabelCreatorTitle">
- クリエーター
- </text>
+ <floater.string name="unknown">(不明)</floater.string>
+ <floater.string name="public">(公共)</floater.string>
+ <floater.string name="you_can">できること:</floater.string>
+ <floater.string name="owner_can">オーナーは次のことができます:</floater.string>
+ <floater.string name="acquiredDate">[year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]</floater.string>
+ <text name="LabelItemNameTitle">名前:</text>
+ <text name="LabelItemDescTitle">説明:</text>
+ <text name="LabelCreatorTitle">クリエーター</text>
<button label="プロフィール..." label_selected="" name="BtnCreator"/>
- <text name="LabelOwnerTitle">
- オーナー:
- </text>
+ <text name="LabelOwnerTitle">オーナー:</text>
<button label="プロフィール..." label_selected="" name="BtnOwner"/>
- <text name="LabelAcquiredTitle">
- 入手日時:
- </text>
- <text name="LabelAcquiredDate">
- 2006年5月24日水曜日12:50:46
- </text>
- <text name="OwnerLabel">
- あなた:
- </text>
+ <text name="LabelAcquiredTitle">入手日時:</text>
+ <text name="LabelAcquiredDate">2006年5月24日水曜日12:50:46</text>
+ <text name="OwnerLabel">あなた:</text>
<check_box label="編集" name="CheckOwnerModify"/>
<check_box label="コピー" name="CheckOwnerCopy"/>
<check_box label="再販・プレゼント" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">
- 全員:
- </text>
+ <text name="AnyoneLabel">全員:</text>
<check_box label="コピー" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">
- グループ:
- </text>
+ <text name="GroupLabel">グループ:</text>
<check_box label="共有" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel" width="158">
- 次の所有者:
- </text>
+ <text name="NextOwnerLabel" width="158">次の所有者:</text>
<check_box label="編集" name="CheckNextOwnerModify"/>
<check_box label="コピー" name="CheckNextOwnerCopy"/>
<check_box label="再販・プレゼント" name="CheckNextOwnerTransfer"/>
<check_box label="売り出し中" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
+ <combo_box name="ComboBoxSaleType">
<combo_box.item label="コピー" name="Copy"/>
+ <combo_box.item label="コンテンツ" name="Contents"/>
<combo_box.item label="オリジナル" name="Original"/>
</combo_box>
<spinner label="価格:" name="Edit Cost"/>
- <text name="CurrencySymbol">
- L$
- </text>
+ <text name="CurrencySymbol">L$</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
index af96edda79..19d767ab57 100755
--- a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
@@ -5,8 +5,8 @@
<check_box label="服" name="check_clothing"/>
<check_box label="ジェスチャー" name="check_gesture"/>
<check_box label="ランドマーク" name="check_landmark"/>
- <check_box label="メッシュ" name="check_mesh"/>
<check_box label="ノートカード" name="check_notecard"/>
+ <check_box label="メッシュ" name="check_mesh"/>
<check_box label="オブジェクト" name="check_object"/>
<check_box label="スクリプト" name="check_script"/>
<check_box label="サウンド" name="check_sound"/>
@@ -19,6 +19,10 @@
<text name="- OR -">
-または-
</text>
+ <radio_group name="date_search_direction">
+ <radio_item label="より新しい" name="newer"/>
+ <radio_item label="より古い" name="older"/>
+ </radio_group>
<spinner label="経過時間" name="spin_hours_ago"/>
<spinner label="経過日数" name="spin_days_ago"/>
<button label="閉じる" label_selected="閉じる" name="Close"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_item_properties.xml b/indra/newview/skins/default/xui/ja/floater_item_properties.xml
new file mode 100644
index 0000000000..c8648503d7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_item_properties.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Item Properties" title="アイテムのプロパティ"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_lagmeter.xml b/indra/newview/skins/default/xui/ja/floater_lagmeter.xml
index e3546cd837..dd51d64ed2 100644
--- a/indra/newview/skins/default/xui/ja/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/ja/floater_lagmeter.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_lagmeter" title="ラグメーター">
<floater.string name="max_title_msg">
- ラグ メーター
+ ラグ計測器
</floater.string>
<floater.string name="max_width_px">
- 350
+ 360
</floater.string>
<floater.string name="min_title_msg">
ラグ
@@ -22,28 +22,28 @@
15
</floater.string>
<floater.string name="client_frame_time_window_bg_msg">
- ノーマル、ウィンドウは背景に
+ 標準、ウィンドウは背景に
</floater.string>
<floater.string name="client_frame_time_critical_msg">
- クライアント フレームレート < [CLIENT_FRAME_RATE_CRITICAL]
+ クライアントのフレームレートが [CLIENT_FRAME_RATE_CRITICAL] 以下
</floater.string>
<floater.string name="client_frame_time_warning_msg">
- クライアント フレームレート: [CLIENT_FRAME_RATE_CRITICAL] ~ [CLIENT_FRAME_RATE_WARNING]
+ クライアントのフレーム レートが [CLIENT_FRAME_RATE_CRITICAL] と [CLIENT_FRAME_RATE_WARNING] の間
</floater.string>
<floater.string name="client_frame_time_normal_msg">
- ノーマル
+ 標準
</floater.string>
<floater.string name="client_draw_distance_cause_msg">
- 考えられる原因: 描画距離の設定が大きすぎる
+ 考えられる原因:描画距離の設定が高すぎる
</floater.string>
<floater.string name="client_texture_loading_cause_msg">
- 考えられる原因: 画像のロード中
+ 考えられる原因:画像のロード中
</floater.string>
<floater.string name="client_texture_memory_cause_msg">
- 考えられる原因: メモリ内の画像数が多すぎる
+ 考えられる原因:メモリ内に画像が多すぎる
</floater.string>
<floater.string name="client_complex_objects_cause_msg">
- 考えられる原因: 画面に含まれる複雑なオブジェクトが多すぎる
+ 考えられる原因:シーンに複雑なオブジェクトが多すぎる
</floater.string>
<floater.string name="network_text_msg">
ネットワーク
@@ -55,13 +55,13 @@
5
</floater.string>
<floater.string name="network_packet_loss_critical_msg">
- 接続でドロップされるパケットの割合: > [NETWORK_PACKET_LOSS_CRITICAL]
+ 接続で [NETWORK_PACKET_LOSS_CRITICAL]% を超えるパケットが脱落しています
</floater.string>
<floater.string name="network_packet_loss_warning_msg">
- 接続でドロップされるパケットの割合:[NETWORK_PACKET_LOSS_WARNING] ~ [NETWORK_PACKET_LOSS_CRITICAL]
+ 接続で [NETWORK_PACKET_LOSS_WARNING]%~[NETWORK_PACKET_LOSS_CRITICAL]% のパケットが脱落しています
</floater.string>
<floater.string name="network_performance_normal_msg">
- ノーマル
+ 標準
</floater.string>
<floater.string name="network_ping_critical_ms">
600
@@ -70,16 +70,16 @@
300
</floater.string>
<floater.string name="network_ping_critical_msg">
- 接続の ping 時間: > [NETWORK_PING_CRITICAL] ミリ秒
+ 接続の ping 時間が [NETWORK_PING_CRITICAL] ms 以上です
</floater.string>
<floater.string name="network_ping_warning_msg">
- 接続の ping 時間: [NETWORK_PING_WARNING] ~ [NETWORK_PING_CRITICAL] ミリ秒
+ 接続の ping 時間が [NETWORK_PING_WARNING]~[NETWORK_PING_CRITICAL] ms です
</floater.string>
<floater.string name="network_packet_loss_cause_msg">
- 接続不良になっているか、帯域幅設定が高すぎます。
+ 接続不良または &apos;帯域幅&apos; の設定が高すぎる可能性があります
</floater.string>
<floater.string name="network_ping_cause_msg">
- 接続不良になっているか、ファイル共有アプリケーションに問題があります。
+ 接続不良またはファイル共有アプリの可能性があります。
</floater.string>
<floater.string name="server_text_msg">
サーバー
@@ -94,31 +94,31 @@
20
</floater.string>
<floater.string name="server_frame_time_critical_msg">
- シミュレーターのフレームレート: < [SERVER_FRAME_RATE_CRITICAL]
+ シミュレータのフレームレートが [SERVER_FRAME_RATE_CRITICAL] 以下
</floater.string>
<floater.string name="server_frame_time_warning_msg">
- シミュレーターのフレームレート: [SERVER_FRAME_RATE_CRITICAL] ~ [SERVER_FRAME_RATE_WARNING]
+ シミュレータのフレームレートが [SERVER_FRAME_RATE_CRITICAL] ~ [SERVER_FRAME_RATE_WARNING] の間
</floater.string>
<floater.string name="server_frame_time_normal_msg">
- ノーマル
+ 標準
</floater.string>
<floater.string name="server_physics_cause_msg">
- 考えられる原因: 物理的オブジェクトが多すぎる
+ 考えられる原因:物理オブジェクトが多すぎる
</floater.string>
<floater.string name="server_scripts_cause_msg">
- 考えられる原因: スクリプトを含むオブジェクトが多すぎる
+ 考えられる原因:スクリプトオブジェクトが多すぎる
</floater.string>
<floater.string name="server_net_cause_msg">
- 考えられる原因: ネットワーク トラフィック過大
+ 考えられる原因:ネットワークトラフィックが多すぎる
</floater.string>
<floater.string name="server_agent_cause_msg">
- 考えられる原因: 地域内にて動いているアバターが多すぎる
+ 考えられる原因:リージョン内の人の移動が多すぎる
</floater.string>
<floater.string name="server_images_cause_msg">
- 考えられる原因: 画像計算が多すぎる
+ 考えられる原因:画像計算が多すぎる
</floater.string>
<floater.string name="server_generic_cause_msg">
- 考えられる原因: シミュレーターの過負荷
+ 考えられる原因:シミュレータのロードが重すぎる
</floater.string>
<floater.string name="smaller_label">
&gt;&gt;
@@ -131,21 +131,21 @@
クライアント
</text>
<text name="client_text">
- ノーマル
+ 標準
</text>
<button name="network_lagmeter" tool_tip="ネットワーク ラグ ステータス"/>
<text name="network">
ネットワーク
</text>
<text name="network_text">
- ノーマル
+ 標準
</text>
<button name="server_lagmeter" tool_tip="サーバー ラグ ステータス"/>
<text name="server">
サーバー
</text>
<text name="server_text">
- ノーマル
+ 標準
</text>
- <button label="&gt;&gt; " name="minimize" tool_tip="フローターのサイズをトグル"/>
+ <button label="&gt;&gt;" name="minimize" tool_tip="フローターのサイズをトグル"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml
index 5a155c9f12..864feef8cc 100755
--- a/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml
@@ -9,7 +9,24 @@
<floater.string name="Title">
スクリプト: [NAME]
</floater.string>
+ <floater.string name="experience_enabled">
+ オフにして、現在の体験を削除する
+ </floater.string>
+ <floater.string name="no_experiences">
+ どの体験にも権限がありません
+ </floater.string>
+ <floater.string name="add_experiences">
+ 選択して、体験を追加する
+ </floater.string>
+ <floater.string name="show_experience_profile">
+ クリックして、体験プロフィールを表示する
+ </floater.string>
+ <floater.string name="loading">
+ ロード中...
+ </floater.string>
<button label="リセット" label_selected="リセット" name="Reset"/>
<check_box initial_value="true" label="実行中" name="running"/>
<check_box initial_value="true" label="Mono" name="mono"/>
+ <check_box label="次の体験を使用:" name="enable_xp"/>
+ <button label="&gt;" name="view_profile"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_marketplace_listings.xml b/indra/newview/skins/default/xui/ja/floater_marketplace_listings.xml
new file mode 100644
index 0000000000..f6b8e2928e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_marketplace_listings.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_listings" title="マーケットプレイスのリスト">
+ <panel name="marketplace_listings_panel">
+ <panel>
+ <panel name="marketplace_listings_inventory_placeholder_panel">
+ <text name="marketplace_listings_inventory_placeholder_title">ロード中...</text>
+ </panel>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_marketplace_validation.xml b/indra/newview/skins/default/xui/ja/floater_marketplace_validation.xml
new file mode 100644
index 0000000000..164864ed4e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_marketplace_validation.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_validation" title="マーケットプレイスのリストの監査">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <text_editor name="validation_text">MARKETPLACE_VALIDATION_TEXT</text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_openobject.xml b/indra/newview/skins/default/xui/ja/floater_openobject.xml
index af02ffedda..3f2f71511b 100755
--- a/indra/newview/skins/default/xui/ja/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/ja/floater_openobject.xml
@@ -3,6 +3,11 @@
<text name="object_name">
[DESC]:
</text>
- <button label="インベントリにコピー" label_selected="インベントリにコピー" name="copy_to_inventory_button"/>
- <button label="コピーして装着" label_selected="コピーして装着" name="copy_and_wear_button"/>
+ <text name="border_note">
+ インベントリおよびウェアにコピー
+ </text>
+ <button label="アウトフィットに追加" label_selected="アウトフィットに追加" name="copy_and_wear_button"/>
+ <button label="アウトフィットを交換" label_selected="アウトフィットを交換" name="copy_and_replace_button"/>
+ <button label="インベントリにコピーするだけ" label_selected="インベントリにコピーするだけ" name="copy_to_inventory_button"/>
+ <button label="取り消し" label_selected="取り消し" name="cancel_button"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_pay.xml b/indra/newview/skins/default/xui/ja/floater_pay.xml
index 17965fb60a..0ca0990bd4 100755
--- a/indra/newview/skins/default/xui/ja/floater_pay.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pay.xml
@@ -1,25 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <string name="payee_group">
- グループに支払う
- </string>
- <string name="payee_resident">
- 住人に支払う
- </string>
- <text name="payee_label">
- 支払う:
- </text>
- <icon name="icon_person" tool_tip="住人"/>
- <text name="payee_name">
- 非常に長い名前が途中で切れていないかをテストして確認
- </text>
- <button label="L$1" label_selected="L$1" name="fastpay 1"/>
- <button label="L$5" label_selected="L$5" name="fastpay 5"/>
- <button label="L$10" label_selected="L$10" name="fastpay 10"/>
- <button label="L$20" label_selected="L$20" name="fastpay 20"/>
- <text name="amount text">
- 金額を指定:
- </text>
- <button label="支払う" label_selected="支払う" name="pay btn"/>
- <button label="取り消し" label_selected="取り消し" name="cancel btn"/>
+ <string name="payee_group">グループに支払う</string>
+ <string name="payee_resident">住人に支払う</string>
+ <text name="paying_text">支払中:</text>
+ <text name="payee_name">非常に長い名前が途中で切れていないかをテストして確認</text>
+ <panel label="検索" name="PatternsPanel">
+ <button label="L$ 1 支払う" label_selected="L$ 1 支払う" name="fastpay 1"/>
+ <button label="L$ 5 支払う" label_selected="L$ 5 支払う" name="fastpay 5"/>
+ <button label="L$ 10 支払う" label_selected="L$ 10 支払う" name="fastpay 10"/>
+ <button label="L$ 20 支払う" label_selected="L$ 20 支払う" name="fastpay 20"/>
+ </panel>
+ <panel label="検索" name="InputPanel">
+ <text name="amount text">その他の金額:</text>
+ <button label="支払い" label_selected="支払い" name="pay btn"/>
+ <button label="取り消し" label_selected="取り消し" name="cancel btn"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_pay_object.xml b/indra/newview/skins/default/xui/ja/floater_pay_object.xml
index 637ad496ef..3331cee0e0 100755
--- a/indra/newview/skins/default/xui/ja/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pay_object.xml
@@ -1,29 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <string name="payee_group">
- グループに支払う
- </string>
- <string name="payee_resident">
- 住人に支払う
- </string>
- <icon name="icon_person" tool_tip="住人"/>
- <text name="payee_name">
- Ericacita Moostopolison
- </text>
- <text name="object_name_label">
- オブジェクトを介して:
- </text>
+ <string name="payee_group">グループに支払う</string>
+ <string name="payee_resident">住人に支払う</string>
+ <text name="paying_text">支払中:</text>
+ <text name="payee_name">Ericacita Moostopolison</text>
+ <text name="object_name_label">オブジェクトを介して:</text>
<icon name="icon_object" tool_tip="オブジェクト"/>
- <text name="object_name_text">
- ...
- </text>
- <button label="L$1" label_selected="L$1" name="fastpay 1"/>
- <button label="L$5" label_selected="L$5" name="fastpay 5"/>
- <button label="L$10" label_selected="L$10" name="fastpay 10"/>
- <button label="L$20" label_selected="L$20" name="fastpay 20"/>
- <text name="amount text">
- 金額を指定:
- </text>
- <button label="支払い" label_selected="支払い" name="pay btn"/>
- <button label="取り消し" label_selected="取り消し" name="cancel btn"/>
+ <text name="object_name_text">...</text>
+ <panel label="検索" name="PatternsPanel">
+ <button label="L$ 1 支払う" label_selected="L$ 1 支払う" name="fastpay 1"/>
+ <button label="L$ 5 支払う" label_selected="L$ 5 支払う" name="fastpay 5"/>
+ <button label="L$ 10 支払う" label_selected="L$ 10 支払う" name="fastpay 10"/>
+ <button label="L$ 20 支払う" label_selected="L$ 20 支払う" name="fastpay 20"/>
+ </panel>
+ <panel label="検索" name="InputPanel">
+ <text name="amount text">その他の金額:</text>
+ <button label="支払い" label_selected="支払い" name="pay btn"/>
+ <button label="取り消し" label_selected="取り消し" name="cancel btn"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_report_abuse.xml b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
index 9021be5dda..7631cd7aba 100755
--- a/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
@@ -76,7 +76,7 @@
<combo_box.item label="土地 &gt; 不法侵入 &gt; オブジェクトまたはテクスチャ" name="Land__Encroachment__Objects_textures"/>
<combo_box.item label="土地>不法侵入>パーティクル" name="Land__Encroachment__Particles"/>
<combo_box.item label="土地>不法侵入>樹木/植物" name="Land__Encroachment__Trees_plants"/>
- <combo_box.item label="賭けまたはギャンブル" name="Wagering_gambling"/>
+ <combo_box.item label="ゲーミング ポリシー違反" name="Wagering_gambling"/>
<combo_box.item label="その他" name="Other"/>
</combo_box>
<text name="abuser_name_title">
diff --git a/indra/newview/skins/default/xui/ja/floater_snapshot.xml b/indra/newview/skins/default/xui/ja/floater_snapshot.xml
index 7d0fb27932..f04193d034 100755
--- a/indra/newview/skins/default/xui/ja/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/ja/floater_snapshot.xml
@@ -39,17 +39,8 @@
<string name="local_failed_str">
コンピュータに保存できませんでした。
</string>
- <button name="advanced_options_btn" tool_tip="詳しい設定"/>
- <text name="image_res_text">
- [WIDTH] x [HEIGHT] px
- </text>
- <text name="file_size_label">
- [SIZE] キロバイト
- </text>
+ <button label="更新" name="new_snapshot_btn"/>
<panel name="advanced_options_panel">
- <text name="advanced_options_label">
- 詳しい設定
- </text>
<text name="layer_type_label">
キャプチャ:
</text>
@@ -68,4 +59,10 @@
<combo_box.item label="フィルターなし" name="NoFilter"/>
</combo_box>
</panel>
+ <text name="image_res_text">
+ [WIDTH]px (横幅) x [HEIGHT]px (高さ)
+ </text>
+ <text name="file_size_label">
+ [SIZE] キロバイト
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_top_objects.xml b/indra/newview/skins/default/xui/ja/floater_top_objects.xml
index c44f409d4e..cc81ead116 100755
--- a/indra/newview/skins/default/xui/ja/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/ja/floater_top_objects.xml
@@ -21,6 +21,12 @@
<floater.string name="none_descriptor">
何も見つかりませんでした。
</floater.string>
+ <floater.string name="URLs">
+ URL
+ </floater.string>
+ <floater.string name="memory">
+ メモリ(KB)
+ </floater.string>
<text name="title_text">
ロード中...
</text>
@@ -30,7 +36,7 @@
<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="日付" name="time"/>
<scroll_list.columns label="URL" name="URLs"/>
<scroll_list.columns label="メモリ(KB)" name="memory"/>
</scroll_list>
diff --git a/indra/newview/skins/default/xui/ja/floater_twitter.xml b/indra/newview/skins/default/xui/ja/floater_twitter.xml
index 7cd71df800..6df2045554 100644
--- a/indra/newview/skins/default/xui/ja/floater_twitter.xml
+++ b/indra/newview/skins/default/xui/ja/floater_twitter.xml
@@ -1,17 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_twitter" title="TWITTER">
- <panel name="background">
- <tab_container name="tabs">
- <panel label="作成" name="panel_twitter_photo"/>
- <panel label="アカウント" name="panel_twitter_account"/>
- </tab_container>
- <panel name="connection_status_panel">
- <text name="connection_error_text">
- エラー
- </text>
- <text name="connection_loading_text">
- ロード中...
- </text>
- </panel>
- </panel>
+ <tab_container name="tabs">
+ <panel label="作成" name="panel_twitter_photo"/>
+ <panel label="アカウント" name="panel_twitter_account"/>
+ </tab_container>
+ <text name="connection_error_text">
+ エラー
+ </text>
+ <text name="connection_loading_text">
+ ロード中...
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
index d87ef8e2a0..e7aa3cfc30 100755
--- a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
@@ -8,6 +8,7 @@
<menu_item_call label="容姿" name="Change Outfit"/>
<menu_item_call label="アウトフィットの編集" name="Edit Outfit"/>
<menu_item_call label="シェイプの編集" name="Edit My Shape"/>
+ <menu_item_call label="ホバー高さ" name="Hover Height"/>
<menu_item_call label="フレンド" name="Friends..."/>
<menu_item_call label="グループ" name="Groups..."/>
<menu_item_call label="プロフィール" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
index eb8e98059a..a14cfd5876 100755
--- a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
@@ -25,6 +25,7 @@
<menu_item_call label="容姿" name="Chenge Outfit"/>
<menu_item_call label="アウトフィットを編集" name="Edit Outfit"/>
<menu_item_call label="シェイプを編集" name="Edit My Shape"/>
+ <menu_item_call label="ホバー高さ" name="Hover Height"/>
<menu_item_call label="フレンド" name="Friends..."/>
<menu_item_call label="グループ" name="Groups..."/>
<menu_item_call label="プロフィール" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory.xml b/indra/newview/skins/default/xui/ja/menu_inventory.xml
index 8d6c983aa7..9a68ed8a6b 100755
--- a/indra/newview/skins/default/xui/ja/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml
@@ -1,5 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
+ <menu_item_call label="リストを作成" name="Marketplace Create Listing"/>
+ <menu_item_call label="リストを関連付け" name="Marketplace Associate Listing"/>
+ <menu_item_call label="リストを取得 (更新)" name="Marketplace Get Listing"/>
+ <menu_item_call label="エラーを確認" name="Marketplace Check Listing"/>
+ <menu_item_call label="リストを編集" name="Marketplace Edit Listing"/>
+ <menu_item_call label="リスト" name="Marketplace List"/>
+ <menu_item_call label="リストから取り除く" name="Marketplace Unlist"/>
+ <menu_item_call label="有効にする" name="Marketplace Activate"/>
+ <menu_item_call label="無効にする" name="Marketplace Deactivate"/>
<menu_item_call label="共有" name="Share"/>
<menu_item_call label="購入" name="Task Buy"/>
<menu_item_call label="開く" name="Task Open"/>
@@ -87,6 +96,7 @@
<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="Marketplace Copy"/>
+ <menu_item_call label="マーケットプレイスのリストに移動" name="Marketplace Move"/>
<menu_item_call label="--オプションなし--" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml
index f38dbc71a8..18478b5711 100755
--- a/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml
@@ -5,7 +5,7 @@
<menu_item_check label="新しい順に並べ替え" name="sort_by_recent"/>
<menu_item_check label="フォルダを常に名前順に並べる" name="sort_folders_by_name"/>
<menu_item_check label="システムフォルダを上にソートする" name="sort_system_folders_to_top"/>
- <menu_item_call label="フィルターを表示" name="show_filters"/>
+ <menu_item_call label="フィルターを表示..." name="show_filters"/>
<menu_item_call label="フィルターをリセット" name="reset_filters"/>
<menu_item_call label="すべてのフォルダを閉じる" name="close_folders"/>
<menu_item_call label="紛失物を空にする" name="empty_lostnfound"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml b/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml
new file mode 100644
index 0000000000..ad36aa3f77
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_marketplace_sort">
+ <menu_item_check label="在庫高順に並べ替え (低から高へ)" name="sort_by_stock_amount"/>
+ <menu_item_check label="リストフォルダのみ表示" name="show_only_listing_folders"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_experience.xml b/indra/newview/skins/default/xui/ja/menu_url_experience.xml
new file mode 100644
index 0000000000..582784c2f0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_url_experience.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index 0b85c693f0..0384dc1efc 100755
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -8,13 +8,14 @@
<menu_item_call label="新しいインベントリウィンドウ" name="NewInventoryWindow"/>
<menu_item_call label="場所..." name="Places"/>
<menu_item_call label="ピック..." name="Picks"/>
+ <menu_item_call label="体験..." name="Experiences"/>
<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_item_call label="歩行/走行/飛行..." name="WalkRunFly"/>
</menu>
<menu label="ログイン" name="Status">
<menu_item_check label="一時退席中" name="Away"/>
@@ -22,6 +23,7 @@
</menu>
<menu_item_call label="L$ の購入..." name="Buy and Sell L$"/>
<menu_item_call label="マーチャントアウトボックス..." name="MerchantOutbox"/>
+ <menu_item_call label="マーケティングプレイスのリスト..." name="MarketplaceListings"/>
<menu_item_call label="マイアカウント..." name="Manage My Account">
<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=ja"/>
</menu_item_call>
@@ -48,7 +50,7 @@
<menu_item_check label="フレンド" name="My Friends"/>
<menu_item_check label="グループ" name="My Groups"/>
<menu_item_check label="近くにいる人" name="Active Speakers"/>
- <menu_item_call label="リストをブロック" name="Block List"/>
+ <menu_item_check label="リストをブロック" name="Block List"/>
<menu_item_check label="着信拒否" name="Do Not Disturb"/>
</menu>
<menu label="世界" name="World">
@@ -62,7 +64,7 @@
<menu_item_call label="スナップショット" name="Take Snapshot"/>
<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="RegionEstate"/>
<menu_item_call label="保有地..." name="My Land"/>
<menu_item_call label="この土地を購入" name="Buy Land"/>
<menu label="表示" name="LandShow">
@@ -250,6 +252,7 @@
<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="Region Debug Console"/>
<menu_item_check label="ファーストタイマー" name="Fast Timers"/>
<menu_item_check label="メモリ" name="Memory"/>
<menu_item_check label="風景の統計" name="Scene Statistics"/>
@@ -353,7 +356,7 @@
<menu_item_check label="挿入されたオブジェクトの位置の Ping" name="Ping Interpolate Object Positions"/>
<menu_item_call label="パケットドロップ" name="Drop a Packet"/>
</menu>
- <menu_item_call label="スクリプト付きカメラをダンプ" name="Dump Scripted Camera"/>
+ <menu_item_call label="スクリプト付きカメラをダンプ" name="Dump Scripted Camera"/>
<menu label="レコーダー" name="Recorder">
<menu_item_call label="再生開始" name="Start Playback"/>
<menu_item_call label="再生停止" name="Stop Playback"/>
diff --git a/indra/newview/skins/default/xui/ja/mime_types.xml b/indra/newview/skins/default/xui/ja/mime_types.xml
index 54663a0367..bfc8d0b724 100755
--- a/indra/newview/skins/default/xui/ja/mime_types.xml
+++ b/indra/newview/skins/default/xui/ja/mime_types.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<mimetypes name="default">
<widgetset name="web">
<label name="web_label">
@@ -27,7 +27,7 @@
コンテンツなし
</label>
<tooltip name="none_tooltip">
- メディアなし
+ ここにメディアなし
</tooltip>
</widgetset>
<widgetset name="image">
diff --git a/indra/newview/skins/default/xui/ja/mime_types_linux.xml b/indra/newview/skins/default/xui/ja/mime_types_linux.xml
index 0ec1030113..cb1e48148f 100755
--- a/indra/newview/skins/default/xui/ja/mime_types_linux.xml
+++ b/indra/newview/skins/default/xui/ja/mime_types_linux.xml
@@ -44,6 +44,14 @@
このロケーションのオーディオを再生する
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ コンテンツなし
+ </label>
+ <tooltip name="none_tooltip">
+ ここにメディアなし
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
リアルタイム・ストリーミング
diff --git a/indra/newview/skins/default/xui/ja/mime_types_mac.xml b/indra/newview/skins/default/xui/ja/mime_types_mac.xml
index 0ec1030113..cb1e48148f 100755
--- a/indra/newview/skins/default/xui/ja/mime_types_mac.xml
+++ b/indra/newview/skins/default/xui/ja/mime_types_mac.xml
@@ -44,6 +44,14 @@
このロケーションのオーディオを再生する
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ コンテンツなし
+ </label>
+ <tooltip name="none_tooltip">
+ ここにメディアなし
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
リアルタイム・ストリーミング
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index 1d52b42039..5f0ce7a73b 100755
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -72,6 +72,10 @@
[MESSAGE]
<usetemplate name="okcancelbuttons" notext="取り消し" yestext="はい"/>
</notification>
+ <notification name="GenericAlertOK">
+ [MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="BadInstallation">
[APP_NAME] をアップデート中にエラーが発生しました。 ビューワの [http://get.secondlife.com 最新バージョンをダウンロード] してください。
<usetemplate name="okbutton" yestext="OK"/>
@@ -124,6 +128,88 @@
システムまたはネットワークのエラーのため、マーケットプレイスの初期化に失敗しました。後でもう一度お試しください。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="StockPasteFailed">
+ 在庫フォルダへのコピーまたは移動がエラーにより失敗しました:
+
+&apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantPasteFailed">
+ マーケットプレイスのリストへのコピーまたは移動がエラーにより失敗しました:
+
+&apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantTransactionFailed">
+ マーケットプレイスによる取引が次のエラーにより失敗しました:
+
+理由:&apos;[ERROR_REASON]&apos;
+[ERROR_DESCRIPTION]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantUnprocessableEntity">
+ この製品をリストに表示できないか、バージョンフォルダを有効にできません。通常、これはリスト説明フォームに情報が不足しているために起こりますが、フォルダ構造のエラーが原因の場合もあります。リストを編集するか、リストフォルダにエラーがないか確認してください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantListingFailed">
+ マーケットプレイスへのリスト表示が次のエラーで失敗しました :
+
+&apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantFolderActivationFailed">
+ このバージョンフォルダの有効化が次のエラーにより失敗しました :
+
+&apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantActiveChange">
+ この操作により、このリストの有効な内容が変更されます。続けますか?
+ <usetemplate ignoretext="マーケットプレイスで有効なリストを変更する前に確認する" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantMoveInventory">
+ マーケットプレイスのリストウィンドウにドラッグしたアイテムは元の場所からコピーされるのではなく、移動します。続けますか?
+ <usetemplate ignoretext="アイテムをインベントリからマーケットプレイスに移動する前に確認する" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmListingCutOrDelete">
+ リストフォルダを移動または削除すると、マーケットプレイスのリストが削除されます。マーケットプレイスのリストを維持する場合は、変更するバージョンフォルダの中身を移動または削除してください。続けますか?
+ <usetemplate ignoretext="マーケットプレイスからリストを移動または削除する前に確認する" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmCopyToMarketplace">
+ これらのアイテムの 1 つまたは複数をマーケットプレイスにコピーする権限がありません。移動するか、置き去りにすることはできます。
+ <usetemplate canceltext="取り消し" ignoretext="コピー付加アイテムを含む選択内容をマーケットプレイスへコピーする前に確認する" name="yesnocancelbuttons" notext="アイテムを移動しない" yestext="アイテムを移動"/>
+ </notification>
+ <notification name="ConfirmMerchantUnlist">
+ この操作により、このリストが削除されます。続けますか?
+ <usetemplate ignoretext="マーケットプレイスで有効なリストを削除する前に確認する" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantClearVersion">
+ この操作により、現在のリストのバージョンフォルダが無効になります。続けますか?
+ <usetemplate ignoretext="マーケットプレイスでリストのバージョンフォルダを無効にする前に確認する" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantListingNotUpdated">
+ このリストをアップデートできませんでした。
+[[URL] ここをクリック] してマーケットプレイスで編集します。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantListingCannotWear">
+ マーケットプレイスのリストフォルダにある衣服やボディパーツを着用できません。
+ </notification>
+ <notification name="AlertMerchantListingInvalidID">
+ リスト ID が無効です。
+ </notification>
+ <notification name="AlertMerchantListingActivateRequired">
+ このリストには複数のバージョンフォルダがあるか、バージョンフォルダがありません。後で、単独でバージョンフォルダを選択して有効にする必要があります。
+ <usetemplate ignoretext="複数のバージョンフォルダのあるリストを作成するときに、バージョンフォルダの有効化に関する警告が表示されます" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderSplit">
+ 各種の在庫品目を別々の在庫フォルダに分けたため、フォルダはリストに表示できるように配置されています。
+ <usetemplate ignoretext="リストに表示する前に在庫フォルダが分割されると、警告が表示されます" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderEmpty">
+ 在庫が空のため、リストを削除しました。もう一度リストを表示するには、在庫フォルダにユニットを追加する必要があります。
+ <usetemplate ignoretext="在庫フォルダが空のためにリストが表示されないと警告が表示されます" name="okignore" yestext="OK"/>
+ </notification>
<notification name="CompileQueueSaveText">
次の理由で、スクリプト用テキストのアップロード時に問題が起こりました。
[REASON]
@@ -491,6 +577,10 @@ L$ が不足しているのでこのグループに参加することができ
変更を保存しますか?
<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="保存しない" yestext="保存"/>
</notification>
+ <notification name="DeleteNotecard">
+ ノートカードを削除しますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
<notification name="GestureSaveFailedTooManySteps">
ジェスチャーの保存に失敗しました。
ステップが多すぎます。
@@ -597,6 +687,9 @@ L$ が不足しているのでこのグループに参加することができ
<notification name="RegionNoTerraforming">
[REGION] では、地形の変更ができません。
</notification>
+ <notification name="ParcelNoTerraforming">
+ あなたには [PARCEL] 区画を地形編集する許可がありません。
+ </notification>
<notification name="CannotCopyWarning">
あなたには[ITEMS]というアイテムをコピーする許可がありません。他の住人に提供すると、そのアイテムはあなたのインベントリから削除されます。本当にこれらのアイテムを譲りますか?
<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
@@ -1863,6 +1956,30 @@ http://wiki.secondlife.com/wiki/Setting_your_display_name を参照してくだ
不動産マネージャーを、この不動産限定、または [ALL_ESTATES] から、削除しますか?
<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
</notification>
+ <notification label="不動産を選択" name="EstateAllowedExperienceAdd">
+ この不動産の許可リストにのみ追加しますか、それとも [ALL_ESTATES] の許可リストに追加しますか?
+ <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateAllowedExperienceRemove">
+ この不動産の許可リストからのみ削除しますか、それとも [ALL_ESTATES] の許可リストから削除しますか?
+ <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateBlockedExperienceAdd">
+ この不動産のブロックされたリストにのみ追加しますか、それとも [ALL_ESTATES] のブロックされたリストに追加しますか?
+ <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateBlockedExperienceRemove">
+ この不動産のブロックされたリストからのみ削除しますか、それとも [ALL_ESTATES] のブロックされたリストから削除しますか?
+ <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateTrustedExperienceAdd">
+ この不動産のキー体験リストにのみ追加しますか、それとも [ALL_ESTATES] のキー体験リストに追加しますか?
+ <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateTrustedExperienceRemove">
+ この不動産の信頼済み体験リストからのみ削除しますか、それとも [ALL_ESTATES] の信頼済みリストから削除しますか?
+ <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
<notification label="キックを確認" name="EstateKickUser">
この不動産から [EVIL_USER] を追い出しますか?
<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
@@ -1875,6 +1992,9 @@ http://wiki.secondlife.com/wiki/Setting_your_display_name を参照してくだ
訪問しようとしている地域(リージョン)には現在の環境設定を超えるコンテンツが含まれています。「ミー」 &gt; 「環境設定」 &gt; 「一般」を選択して、環境設定を変更できます。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="SLM_UPDATE_FOLDER">
+ [MESSAGE]
+ </notification>
<notification name="RegionEntryAccessBlocked_AdultsOnlyContent">
訪問しようとしている地域(リージョン)には、成人のみアクセスできる [REGIONMATURITY] コンテンツが含まれています。
<url name="url">
@@ -1937,6 +2057,10 @@ http://wiki.secondlife.com/wiki/Setting_your_display_name を参照してくだ
あなたの環境設定がサーバーと同期していないため、テレポートに技術的な問題が発生しています。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="RegionTPSpecialUsageBlocked">
+ リージョンに入ることができません。&apos;[REGION_NAME]&apos; はスキル ゲーミング リージョンであり、あなたはこのリージョンに入るための特定の基準を満たす必要があります。詳しくは、[http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life スキル ゲーミングのよくある質問] を参照してください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="PreferredMaturityChanged">
今後、[RATING] コンテンツ付きの地域(リージョン)を訪問しようとしているという通知を受け取りません。後でメニューバーの「ミー」 &gt; 「環境設定」 &gt; 「一般」を使用して、コンテンツの環境設定を変更できます。
<usetemplate name="okbutton" yestext="OK"/>
@@ -2163,6 +2287,10 @@ L$ [AMOUNT] で、このクラシファイド広告を今すぐ公開します
<ignore name="ignore" text="オブジェクトを作成中に、money() スクリプトを入れずに「オブジェクトに支払う」アクションを設定したとき"/>
</form>
</notification>
+ <notification name="PayConfirmation">
+ L$[AMOUNT] を [TARGET] に支払うことを確認してください。
+ <usetemplate ignoretext="支払い前に確認 (合計金額が L$200 以上の場合)" name="okcancelignore" notext="取り消し" yestext="支払い"/>
+ </notification>
<notification name="OpenObjectCannotCopy">
このオブジェクトには、あなたがコピーできるアイテムはありません。
</notification>
@@ -2251,6 +2379,9 @@ Linden Lab
<button ignore="交換しない" name="No" text="キャンセル"/>
</form>
</notification>
+ <notification name="TooManyWearables">
+ [AMOUNT] 以上のアイテムを含むフォルダを装着できません。「詳細設定」 &gt; 「デバッグ設定を表示」 &gt; 「WearFolderLimit」でこの制限を変更できます。
+ </notification>
<notification label="「通知を受けない」モードの警告" name="DoNotDisturbModePay">
「通知を受けない」をオンにします。この支払との交換で提供されるアイテムが受信されなくなります。
@@ -2705,9 +2836,6 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
<notification name="NoValidCircuit">
回路コードが無効です。
</notification>
- <notification name="NoValidTimestamp">
- タイムスタンプが無効です。
- </notification>
<notification name="NoPendingConnection">
接続を生成できません。
</notification>
@@ -2862,7 +2990,7 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
[MESSAGE]
-送信元のオブジェクト:&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;、所有者:[NAME]?
+送信元のオブジェクト:&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;、所有者:[NAME]
<form name="form">
<button name="Gotopage" text="ページに移動"/>
<button name="Cancel" text="取り消し"/>
@@ -2888,6 +3016,72 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
<button name="Mute" text="ブロック"/>
</form>
</notification>
+ <notification name="ExperienceAcquireFailed">
+ 新しい体験を取得できません:
+[ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NotInGroupExperienceProfileMessage">
+ 所有者が選択されたグループのメンバーでないため、体験グループへの変更が無視されました。
+ </notification>
+ <notification name="UneditableExperienceProfileMessage">
+ 体験プロフィールを更新するときに、編集不可の &apos;[field]&apos; フィールドが無視されました。
+ </notification>
+ <notification name="RestrictedToOwnerExperienceProfileMessage">
+ 体験の所有者のみが設定できる &apos;[field]&apos;フィールドへの変更を無視しました。
+ </notification>
+ <notification name="MaturityRatingExceedsOwnerExperienceProfileMessage">
+ 所有者のレーティング区分より高いレーティング区分の体験を設定できません。
+ </notification>
+ <notification name="RestrictedTermExperienceProfileMessage">
+ 次の条件により、体験プロフィール名および説明の更新ができませんでした: [extra_info]
+ </notification>
+ <notification name="TeleportedHomeExperienceRemoved">
+ 体験 secondlife:///app/experience/[public_id]/profile を削除するために、[region_name] リージョンからテレポートされ、このリージョンに入ることはできなくなりました。
+ <form name="form">
+ <ignore name="ignore" text="体験を削除するために、リージョンから追放されました"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperienceEntry">
+ キー体験 secondlife:///app/experience/[public_id]/profile に参加することにより、[region_name] リージョンに入ることを許可されました。この体験を削除すると、このリージョンから追放される可能性があります。
+ <form name="form">
+ <ignore name="ignore" text="体験によりリージョンに入ることを許可されました"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperiencesAvailable">
+ この目的地へのアクセス権がありません。下の体験を受け入れることにより、このリージョンに入ることができます:
+
+[EXPERIENCE_LIST]
+
+その他のキー体験を利用できます。
+ </notification>
+ <notification name="ExperienceEvent">
+ [EventType] by the secondlife:///app/experience/[public_id]/profile experience により、オブジェクトでアクション ([EventType]) を実行することが許可されました。
+所有者:secondlife:///app/agent/[OwnerID]/inspect
+オブジェクト名:[ObjectName]
+区画名:[ParcelName]
+ </notification>
+ <notification name="ExperienceEventAttachment">
+ [EventType] by the secondlife:///app/experience/[public_id]/profile experience により、添付ファイルでアクション ([EventType]) を実行することが許可されました。
+所有者:secondlife:///app/agent/[OwnerID]/inspect
+ </notification>
+ <notification name="ScriptQuestionExperience">
+ [NAME] が所有する「&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;」 というオブジェクトが、[GRID_WIDE] 体験への参加を要求しています:
+
+[EXPERIENCE]
+
+権限が許可されると、体験プロフィールから呼び出さない限り、この体験にこのメッセージが再び表示されることはありません。
+
+この体験に関連付けられたスクリプトにより、この体験が有効なリージョンで以下のことを実行できます:
+
+[QUESTIONS]よろしいですか?
+ <form name="form">
+ <button name="BlockExperience" text="体験をブロック"/>
+ <button name="Mute" text="オブジェクトをブロックする"/>
+ <button name="Yes" text="はい"/>
+ <button name="No" text="いいえ"/>
+ </form>
+ </notification>
<notification name="ScriptQuestionCaution">
警告:オブジェクト &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; は、あなたのリンデンドルアカウントへのフルアクセスを要求しています。アクセスを許可すると、このオブジェクトは、特に警告を発せずに単発で、随時アカウントから資金を削除するか、アカウントを完全に空にします。
@@ -3204,6 +3398,10 @@ M キーを押して変更します。
( 作成後[EXISTENCE]秒経過)
&apos;[BODYREGION]&apos;の[RESOLUTION]のベークドテクスチャは[TIME]秒後にローカルに更新されました。
</notification>
+ <notification name="CannotUploadTexture">
+ テクスチャをアップロードできません。
+[REASON]
+ </notification>
<notification name="LivePreviewUnavailable">
コピー不可および/または転送不可のため、このテクスチャを表示できません。
<usetemplate ignoretext="コピー不可および/または転送不可テクスチャでライブプレビューモードを使用できないことを警告する" name="okignore" yestext="OK"/>
@@ -3773,9 +3971,11 @@ M キーを押して変更します。
</notification>
<notification name="TeleportedByAttachment">
[ITEM_ID] へのアタッチメントによって、あなたはテレポートされています。
+ <usetemplate ignoretext="テレポート:アタッチメントによりテレポートされました" name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOnParcel">
区画 &apos;[PARCEL_NAME]&apos; のオブジェクト &apos;[OBJECT_NAME]&apos; によって、あなたはテレポートされています。
+ <usetemplate ignoretext="テレポート:区画上のオブジェクトによりテレポートされました" name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOwnedBy">
[OWNER_ID] が所有しているオブジェクト &apos;[OBJECT_NAME]&apos; によって、あなたはテレポートされています。
@@ -4107,7 +4307,7 @@ M キーを押して変更します。
<usetemplate ignoretext="ファイルを移動できません。以前のパスがリストアされました。" name="okignore" yestext="OK"/>
</notification>
<notification name="DefaultObjectPermissions">
- 次の理由により、デフォルト権限を保存するときに問題がありました: [REASON]。後でデフォルト権限を設定してください。
+ デフォルトのオブジェクト権限を保存するときに問題が発生しました: [REASON]。後でデフォルトの権限を設定してください。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ChatHistoryIsBusyAlert">
diff --git a/indra/newview/skins/default/xui/ja/panel_experience_info.xml b/indra/newview/skins/default/xui/ja/panel_experience_info.xml
new file mode 100644
index 0000000000..b3a17fcb56
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_experience_info.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_experience_info">
+ <text name="title" value="体験プロフィール"/>
+ <scroll_container name="xp_scroll">
+ <panel name="scrolling_panel">
+ <layout_stack>
+ <layout_panel>
+ <text name="experience_title" value="Kyle&apos;s Superhero RPG"/>
+ </layout_panel>
+ <layout_panel name="location panel">
+ <text name="Location">
+ 場所:
+ </text>
+ <text name="LocationTextText">
+ どこか
+ </text>
+ <button label="テレポート" name="teleport_btn"/>
+ <button label="地図" name="map_btn"/>
+ </layout_panel>
+ <layout_panel name="marketplace panel">
+ <text name="Location">
+ マーケットプレイスストア:
+ </text>
+ <text name="LocationTextText">
+ どこか
+ </text>
+ </layout_panel>
+ <layout_panel>
+ <text name="ContentRating">
+ 評価:
+ </text>
+ <text name="ContentRatingText">
+ Adult
+ </text>
+ <text name="Owner">
+ 所有者:
+ </text>
+ <text name="OwnerText">
+ Kyle
+ </text>
+ <button label="編集" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_experience_list_editor.xml b/indra/newview/skins/default/xui/ja/panel_experience_list_editor.xml
new file mode 100644
index 0000000000..84e60aea56
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_experience_list_editor.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="experince_list_editor">
+ <panel.string name="loading">
+ ローディング...
+ </panel.string>
+ <panel.string name="panel_allowed">
+ 許可された体験:
+ </panel.string>
+ <panel.string name="panel_blocked">
+ ブロックされた体験:
+ </panel.string>
+ <panel.string name="panel_trusted">
+ キー体験:
+ </panel.string>
+ <panel.string name="no_results">
+ (空)
+ </panel.string>
+ <text name="text_name">
+ 体験リスト
+ </text>
+ <scroll_list name="experience_list">
+ <columns label="名前" name="experience_name"/>
+ </scroll_list>
+ <button label="追加..." name="btn_add"/>
+ <button label="削除" name="btn_remove"/>
+ <button label="プロフィール..." name="btn_profile"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_experience_list_item.xml b/indra/newview/skins/default/xui/ja/panel_experience_list_item.xml
new file mode 100644
index 0000000000..d72d2bebf6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_experience_list_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiences">
+ <text name="experience_name">
+ ダミー名
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_experience_log.xml b/indra/newview/skins/default/xui/ja/panel_experience_log.xml
new file mode 100644
index 0000000000..39e0e27b05
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_experience_log.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="EVENTS">
+ <string name="no_events" value="イベントなし。"/>
+ <string name="loading" value="ローディング..."/>
+ <layout_stack>
+ <layout_panel>
+ <scroll_list name="experience_log_list">
+ <columns label="時間" name="time"/>
+ <columns label="イベント" name="event"/>
+ <columns label="体験" name="experience_name"/>
+ <columns label="オブジェクト" name="object_name"/>
+ </scroll_list>
+ <button label="知らせる" name="btn_notify"/>
+ <button label="プロフィール" name="btn_profile_xp"/>
+ <button label="報告" name="btn_report_xp"/>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <check_box label="すべてのイベントを通知 日数" name="notify_all"/>
+ <button label="クリア" name="btn_clear"/>
+ <button label="&lt;" name="btn_prev"/>
+ <button label="&gt;" name="btn_next"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_experience_search.xml b/indra/newview/skins/default/xui/ja/panel_experience_search.xml
new file mode 100644
index 0000000000..9ab84e7d18
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_experience_search.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="SEARCH">
+ <string name="not_found">
+ 「[TEXT]」は見つかりませんでした
+ </string>
+ <string name="no_results">
+ 検索結果:ゼロ
+ </string>
+ <string name="searching">
+ 検索中...
+ </string>
+ <string name="loading">
+ ロード中...
+ </string>
+ <string name="maturity_icon_general">
+ &quot;Parcel_PG_Light&quot;
+ </string>
+ <string name="maturity_icon_moderate">
+ &quot;Parcel_M_Light&quot;
+ </string>
+ <string name="maturity_icon_adult">
+ &quot;Parcel_R_Light&quot;
+ </string>
+ <panel name="search_panel">
+ <button label="進む" name="find"/>
+ <icons_combo_box label="Moderate" name="maturity">
+ <icons_combo_box.item label="Adult" name="Adult" value="42"/>
+ <icons_combo_box.item label="Moderate" name="Mature" value="21"/>
+ <icons_combo_box.item label="全般" name="PG" value="13"/>
+ </icons_combo_box>
+ <scroll_list name="search_results">
+ <columns label="名前" name="experience_name"/>
+ <columns label="所有者" name="owner"/>
+ </scroll_list>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="取り消し" name="cancel_btn"/>
+ <button label="プロフィールを表示" name="profile_btn"/>
+ <button label="&lt;" name="left_btn"/>
+ <button label="&gt;" name="right_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_experiences.xml b/indra/newview/skins/default/xui/ja/panel_experiences.xml
new file mode 100644
index 0000000000..ab0d2a97a4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_experiences.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiences">
+ <string name="loading_experiences" value="体験をロード中..."/>
+ <string name="no_experiences" value="体験がありません。"/>
+ <string name="acquire" value="体験を取得"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_facebook_friends.xml b/indra/newview/skins/default/xui/ja/panel_facebook_friends.xml
index 18ae4f9295..17c628a190 100644
--- a/indra/newview/skins/default/xui/ja/panel_facebook_friends.xml
+++ b/indra/newview/skins/default/xui/ja/panel_facebook_friends.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_friends">
<string name="facebook_friends_empty" value="Second Life の住人にもなっている Facebook の友だちがいません。今すぐ Facebook の友だちに Second Life に参加してもらいましょう!"/>
- <string name="facebook_friends_no_connected" value="現在 Facebook に接続されていません。「アカウント」タブに進んで、この機能を有効にしてください。"/>
+ <string name="facebook_friends_no_connected" value="現在 Facebook に接続されていません。「ステータス」タブに進んで、この機能を有効にしてください。"/>
<accordion name="friends_accordion">
<accordion_tab name="tab_second_life_friends" title="SL の友だち"/>
<accordion_tab name="tab_suggested_friends" title="これらの人を SL の友だちとして追加"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_facebook_photo.xml b/indra/newview/skins/default/xui/ja/panel_facebook_photo.xml
index f6d920bd5e..c48f13456b 100644
--- a/indra/newview/skins/default/xui/ja/panel_facebook_photo.xml
+++ b/indra/newview/skins/default/xui/ja/panel_facebook_photo.xml
@@ -1,26 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="画像解像度">
- <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="1200x630" name="1200x630"/>
- </combo_box>
- <combo_box name="filters_combobox" tool_tip="画像フィルター">
- <combo_box.item label="フィルターなし" name="NoFilter"/>
- </combo_box>
- <button label="更新" name="new_snapshot_btn" tool_tip="クリックして更新"/>
- <button label="プレビュー" name="big_preview_btn" tool_tip="クリックしてプレビューを切り替える"/>
- <text name="caption_label">
- コメント (オプション):
- </text>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="投稿" name="post_photo_btn"/>
- <button label="取り消し" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <combo_box name="resolution_combobox" tool_tip="画像解像度">
+ <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="1200x630" name="1200x630"/>
+ </combo_box>
+ <combo_box name="filters_combobox" tool_tip="画像フィルター">
+ <combo_box.item label="フィルターなし" name="NoFilter"/>
+ </combo_box>
+ <button label="更新" name="new_snapshot_btn" tool_tip="クリックして更新"/>
+ <button label="プレビュー" name="big_preview_btn" tool_tip="クリックしてプレビューを切り替える"/>
+ <text name="caption_label">
+ コメント (オプション):
+ </text>
+ <button label="投稿" name="post_photo_btn"/>
+ <button label="取り消し" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_facebook_place.xml b/indra/newview/skins/default/xui/ja/panel_facebook_place.xml
index e29f69101f..61138f90c1 100644
--- a/indra/newview/skins/default/xui/ja/panel_facebook_place.xml
+++ b/indra/newview/skins/default/xui/ja/panel_facebook_place.xml
@@ -1,17 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_place">
- <layout_stack name="stack_place">
- <layout_panel name="place_detail_panel">
- <text name="place_caption_label">
- 自分がいる場所について何か言ってください:
- </text>
- </layout_panel>
- <layout_panel name="place_map_panel">
- <check_box initial_value="false" label="" name="add_place_view_cb"/>
- </layout_panel>
- <layout_panel name="place_button_panel">
- <button label="投稿" name="post_place_btn"/>
- <button label="取り消し" name="cancel_place_btn"/>
- </layout_panel>
- </layout_stack>
+ <text name="place_caption_label">
+ 自分がいる場所について何か言ってください:
+ </text>
+ <check_box initial_value="false" label="場所の俯瞰図を含める" name="add_place_view_cb"/>
+ <button label="投稿" name="post_place_btn"/>
+ <button label="取り消し" name="cancel_place_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_facebook_status.xml b/indra/newview/skins/default/xui/ja/panel_facebook_status.xml
index 84e5ae0474..9d962c9d62 100644
--- a/indra/newview/skins/default/xui/ja/panel_facebook_status.xml
+++ b/indra/newview/skins/default/xui/ja/panel_facebook_status.xml
@@ -1,14 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_status">
- <layout_stack name="stack_status">
- <layout_panel name="status_detail_panel">
- <text name="status_caption_label">
- 今、何を考えている?
- </text>
- </layout_panel>
- <layout_panel name="status_button_panel">
- <button label="投稿" name="post_status_btn"/>
- <button label="取り消し" name="cancel_status_btn"/>
- </layout_panel>
- </layout_stack>
+ <string name="facebook_connected" value="次のユーザーとして Facebook に接続:"/>
+ <string name="facebook_disconnected" value="Facebook に接続していません"/>
+ <text name="account_caption_label">
+ Facebook に接続していません。
+ </text>
+ <panel name="panel_buttons">
+ <button label="接続..." name="connect_btn"/>
+ <button label="切断" name="disconnect_btn"/>
+ <text name="account_learn_more_label">
+ [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 Facebook への投稿について]]
+ </text>
+ </panel>
+ <text name="status_caption_label">
+ 今、何を考えている?
+ </text>
+ <button label="投稿" name="post_status_btn"/>
+ <button label="取り消し" name="cancel_status_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_flickr_photo.xml b/indra/newview/skins/default/xui/ja/panel_flickr_photo.xml
index 0deadad91d..16d873a8b1 100644
--- a/indra/newview/skins/default/xui/ja/panel_flickr_photo.xml
+++ b/indra/newview/skins/default/xui/ja/panel_flickr_photo.xml
@@ -1,41 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_flickr_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="画像解像度">
- <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>
- <combo_box name="filters_combobox" tool_tip="画像フィルター">
- <combo_box.item label="フィルターなし" name="NoFilter"/>
- </combo_box>
- <button label="更新" name="new_snapshot_btn" tool_tip="クリックして更新"/>
- <button label="プレビュー" name="big_preview_btn" tool_tip="クリックしてプレビューを切り替える"/>
- <text name="title_label">
- タイトル:
- </text>
- <text name="description_label">
- 説明:
- </text>
- <check_box initial_value="true" label="SL の場所を説明の最後に含める" name="add_location_cb"/>
- <text name="tags_label">
- タグ:
- </text>
- <text name="tags_help_label">
- タグをスペースで区切る
+ <combo_box name="resolution_combobox" tool_tip="画像解像度">
+ <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>
+ <combo_box name="filters_combobox" tool_tip="画像フィルター">
+ <combo_box.item label="フィルターなし" name="NoFilter"/>
+ </combo_box>
+ <button label="更新" name="new_snapshot_btn" tool_tip="クリックして更新"/>
+ <button label="プレビュー" name="big_preview_btn" tool_tip="クリックしてプレビューを切り替える"/>
+ <text name="title_label">
+ タイトル:
+ </text>
+ <text name="description_label">
+ 説明:
+ </text>
+ <check_box initial_value="true" label="SL の場所を説明の最後に含める" name="add_location_cb"/>
+ <text name="tags_label">
+ タグ:
+ </text>
+ <text name="tags_help_label">
+ タグをスペースで区切る
複数単語のタグに &quot;&quot; を使用
- </text>
- <combo_box name="rating_combobox" tool_tip="Flickr コンテンツのレーティング区分">
- <combo_box.item label="Flickr レーティング区分「Safe」" name="SafeRating"/>
- <combo_box.item label="Flickr レーティング区分「Moderate」" name="ModerateRating"/>
- <combo_box.item label="Flickr レーティング区分「Restricted」" name="RestrictedRating"/>
- </combo_box>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="アップロード" name="post_photo_btn"/>
- <button label="取り消し" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ </text>
+ <combo_box name="rating_combobox" tool_tip="Flickr コンテンツのレーティング区分">
+ <combo_box.item label="Flickr レーティング区分「Safe」" name="SafeRating"/>
+ <combo_box.item label="Flickr レーティング区分「Moderate」" name="ModerateRating"/>
+ <combo_box.item label="Flickr レーティング区分「Restricted」" name="RestrictedRating"/>
+ </combo_box>
+ <button label="アップロード" name="post_photo_btn"/>
+ <button label="取り消し" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml
index ebcb36d950..bd1013d6ca 100755
--- a/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml
@@ -23,6 +23,7 @@
<accordion_tab name="group_roles_tab" title="役割 &amp; メンバー"/>
<accordion_tab name="group_notices_tab" title="通知"/>
<accordion_tab name="group_land_tab" title="土地・資産"/>
+ <accordion_tab name="group_experiences_tab" title="体験"/>
</accordion>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml
index c5d5330eb4..5f2007e0da 100755
--- a/indra/newview/skins/default/xui/ja/panel_login.xml
+++ b/indra/newview/skins/default/xui/ja/panel_login.xml
@@ -1,26 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_login">
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=ja
- </panel.string>
+ <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=ja</panel.string>
<layout_stack name="ui_stack">
<layout_panel name="ui_container">
<combo_box label="ユーザー名" name="username_combo" tool_tip="登録時に自分で選んだユーザー名(例:bobsmith12、Steller Sunshineなど)"/>
<line_editor label="パスワード" name="password_edit"/>
- <check_box label="記憶する" name="remember_check"/>
- <text name="forgot_password_text">
- パスワードを忘れた場合
- </text>
- <button label="ログイン" name="connect_btn"/>
- <text name="At_My_Last_Location_Label">
- 前回の場所
- </text>
<combo_box label="お気に入りの場所" name="start_location_combo">
+ <combo_box.item label="最後にログアウトした場所" name="MyLastLocation"/>
<combo_box.item label="ホーム" name="MyHome"/>
</combo_box>
- <button label="ログイン" name="connect_favorite_btn"/>
- <line_editor label="場所を入力" name="location_edit"/>
- <button label="ログイン" name="connect_location_btn"/>
+ <button label="ログイン" name="connect_btn"/>
+ <check_box label="記憶する" name="remember_check"/>
+ <text name="forgot_password_text">パスワードを忘れた場合</text>
<combo_box label="グリッドを選択" name="server_combo"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/ja/panel_marketplace_listings.xml b/indra/newview/skins/default/xui/ja/panel_marketplace_listings.xml
new file mode 100644
index 0000000000..a9218bebff
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_marketplace_listings.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="マーケットプレイス" name="Marketplace Panel">
+ <panel name="tool_panel">
+ <menu_button name="sort_btn" tool_tip="表示/並べ替えオプション"/>
+ <button name="add_btn" tool_tip="新規リストフォルダの作成"/>
+ <button label="エラーを確認" name="audit_btn" tool_tip="マーケットプレイスのリストを確認"/>
+ </panel>
+ <panel name="tab_container_panel">
+ <filter_editor label="マーケットプレイスのリストをフィルタ" name="filter_editor"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_marketplace_listings_inventory.xml b/indra/newview/skins/default/xui/ja/panel_marketplace_listings_inventory.xml
new file mode 100644
index 0000000000..43cb64d6ba
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_marketplace_listings_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="すべて" name="All Items" tool_tip="ここにアイテムをドラッグ&ドロップしてリストに表示します"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_marketplace_listings_listed.xml b/indra/newview/skins/default/xui/ja/panel_marketplace_listings_listed.xml
new file mode 100644
index 0000000000..7f27231cbd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_marketplace_listings_listed.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="リストに掲載" name="Active Items"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_marketplace_listings_unassociated.xml b/indra/newview/skins/default/xui/ja/panel_marketplace_listings_unassociated.xml
new file mode 100644
index 0000000000..215be9ae6d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_marketplace_listings_unassociated.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="関連付けされていない" name="Unassociated Items"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_marketplace_listings_unlisted.xml b/indra/newview/skins/default/xui/ja/panel_marketplace_listings_unlisted.xml
new file mode 100644
index 0000000000..04530477f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_marketplace_listings_unlisted.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="リストから削除済み" name="Inactive Items"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml b/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml
index 314aaef7fd..f34fdc6b67 100755
--- a/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml
+++ b/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml
@@ -7,17 +7,7 @@
<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>
+ <spinner label="横幅 x 高さ" name="postcard_snapshot_width"/>
+ <check_box label="縦横比の固定" name="postcard_keep_aspect_check"/>
+ <slider label="品質:" name="image_quality_slider"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
index 2c0359cb15..c1ddf08465 100755
--- a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
@@ -14,9 +14,10 @@
<text name="Web:">
Web:
</text>
- <radio_group name="use_external_browser">
- <radio_item label="指定のブラウザ(IE や Firefox)を使用" name="external" tool_tip="デフォルトのシステム Web ブラウザでヘルプや Web リンク先などを見ます。全画面で起動中にはおすすめしません。" value="true"/>
- <radio_item label="内蔵ブラウザを使用" name="internal" tool_tip="内蔵ブラウザでヘルプや Web リンクなどを見ます。[APP_NAME] 内に新しいウィンドウでこのブラウザが開きます。" value=""/>
+ <radio_group name="preferred_browser_behavior">
+ <radio_item label="すべてのリンクにマイ ブラウザ (Chrome、Firefox、IE) を使用" name="internal" tool_tip="デフォルトのシステム Web ブラウザでヘルプや Web リンク先などを見ます。全画面で起動中にはおすすめしません。" value="0"/>
+ <radio_item label="Second Life リンクにのみ内蔵ブラウザを使用" name="external" tool_tip="ヘルプ、Web リンクなどにはデフォルトシステムのブラウザを使用します。
+内蔵ブラウザは LindenLab/SecondLife リンクにのみ使用されます。" value="1"/>
</radio_group>
<check_box initial_value="true" label="プラグインを有効にする" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Cookie を受け入れる" name="cookies_enabled"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_experiences.xml b/indra/newview/skins/default/xui/ja/panel_region_experiences.xml
new file mode 100644
index 0000000000..f13c7bea4d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_region_experiences.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="体験" name="Experiences">
+ <panel.string name="trusted_estate_text">
+ どんな体験でもキーになる可能性があります。
+
+キー体験には、この不動産で動作する権限があります。
+
+さらに、不動産でパブリックアクセスが許可されない場合、キー体験に参加する住人は不動産に入って、キー体験にいる間滞在することができます。
+ </panel.string>
+ <panel.string name="allowed_estate_text">
+ ランドスコープとなる体験のみ許可されます。
+
+許可される体験には、この不動産で実行する権限があります。
+ </panel.string>
+ <panel.string name="blocked_estate_text">
+ グリッドスコープ体験のみブロックできます。
+
+ブロックされた体験は、この不動産では実行できません。
+ </panel.string>
+ <panel.string name="estate_caption">
+ このタブの設定への変更は、不動産内のすべての地域に影響されます。
+ </panel.string>
+ <panel.string name="allowed_parcel_text">
+ ランドスコープとなる体験のみ許可されます。
+
+許可された体験には、この不動産でブロックされていない場合、この区画で実行する権限があります。
+ </panel.string>
+ <panel.string name="blocked_parcel_text">
+ 住人の体験をブロックできます。
+
+ブロックされた体験は、この区画では実行できません。
+ </panel.string>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_script_experience.xml b/indra/newview/skins/default/xui/ja/panel_script_experience.xml
new file mode 100644
index 0000000000..1c5ea2958b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_script_experience.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel name="script_experience" title="体験">
+ <button label="体験" name="Expand Experience"/>
+ <check_box label="次の体験を使用:" name="enable_xp"/>
+ <layout_stack name="xp_details">
+ <layout_panel>
+ <combo_box label="体験を選択..." name="Experiences..."/>
+ </layout_panel>
+ </layout_stack>
+ <text name="No Experiences">
+ 体験の貢献者ではありません。
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml
index e496e6602b..a42dd12a9c 100755
--- a/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?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] の費用がかかります。画像をテクスチャとして保存するには平方形式の 1 つを選択してください。
@@ -13,8 +13,8 @@
<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"/>
+ <spinner label="横幅 x 高さ" 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"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_local.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_local.xml
index cb658fb6c9..d23056a3d5 100755
--- a/indra/newview/skins/default/xui/ja/panel_snapshot_local.xml
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_local.xml
@@ -1,7 +1,7 @@
<?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"/>
@@ -13,24 +13,17 @@
<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>
+ <spinner label="横幅 x 高さ" name="local_snapshot_width"/>
+ <check_box label="縦横比の固定" name="local_keep_aspect_check"/>
+ <text name="local_format_label">
+ フォーマット:
+ </text>
+ <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"/>
<button label="取り消し" name="cancel_btn"/>
<flyout_button label="保存" name="save_btn" tool_tip="画像をファイルに保存">
<flyout_button.item label="保存" name="save_item"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml
index 6ce492476b..492115bec0 100755
--- a/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml
@@ -1,16 +1,10 @@
<?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"/>
- <text name="send_to_facebook_textbox">
- 宛先: [secondlife:/// Facebook]
- </text>
- <text name="send_to_twitter_textbox">
- [secondlife:/// Twitter]
- </text>
- <text name="send_to_flickr_textbox">
- [secondlife:/// Flickr]
- </text>
+ <button label="ディスクに保存" name="save_to_computer_btn"/>
+ <button label="持ち物に保存(L$[Amount])" name="save_to_inventory_btn"/>
+ <button label="プロフィールにアップロード" name="save_to_profile_btn"/>
+ <button label="Facebook にアップロード" name="send_to_facebook_btn"/>
+ <button label="Twitter にアップロード" name="send_to_twitter_btn"/>
+ <button label="Flickr にアップロード" name="send_to_flickr_btn"/>
+ <button label="メールにより送信" name="save_to_email_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml
index 1ddd723840..569c07ad47 100755..100644
--- a/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml
@@ -10,8 +10,12 @@
送信中...
</string>
<text name="title">
- メール
+ E メール
</text>
- <button label="メッセージ" name="message_btn"/>
- <button label="設定" name="settings_btn"/>
+ <tab_container name="postcard_tabs">
+ <panel label="メッセージ" name="panel_postcard_message"/>
+ <panel label="設定" name="panel_postcard_settings"/>
+ </tab_container>
+ <button label="取り消し" name="cancel_btn"/>
+ <button label="送信" name="send_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_profile.xml
index b860a6afe9..80d400c846 100755
--- a/indra/newview/skins/default/xui/ja/panel_snapshot_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_profile.xml
@@ -1,7 +1,7 @@
<?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"/>
@@ -10,19 +10,12 @@
<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>
+ <spinner label="横幅 x 高さ" name="profile_snapshot_width"/>
+ <check_box label="縦横比の固定" name="profile_keep_aspect_check"/>
+ <text name="caption_label">
+ キャプション:
+ </text>
+ <check_box initial_value="true" label="場所を含む" name="add_location_cb"/>
<button label="取り消し" name="cancel_btn"/>
<button label="投稿" name="post_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
index f09643d562..2e1446d450 100755
--- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
@@ -1,28 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <panel.string name="packet_loss_tooltip">
- パケット損失
- </panel.string>
- <panel.string name="bandwidth_tooltip">
- 帯域幅
- </panel.string>
- <panel.string name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string name="timeTooltip">
- [year, datetime, slt] [month, datetime, slt] [day, datetime, slt] ([weekday, datetime, slt])
- </panel.string>
- <panel.string name="buycurrencylabel">
- L$ [AMT]
- </panel.string>
+ <panel.string name="packet_loss_tooltip">パケット損失</panel.string>
+ <panel.string name="bandwidth_tooltip">帯域幅</panel.string>
+ <panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>
+ <panel.string name="timeTooltip">[year, datetime, slt] [month, datetime, slt] [day, datetime, slt] ([weekday, datetime, slt])</panel.string>
+ <panel.string name="buycurrencylabel">L$ [AMT]</panel.string>
<panel left="-370" name="balance_bg" width="160">
- <text name="balance" tool_tip="クリックして L$ 残高を更新" value="L$20"/>
+ <text name="balance" tool_tip="クリックして L$ 残高を更新" value="L$??"/>
<button label="L$ の購入" name="buyL" tool_tip="クリックして L$ を購入します"/>
- <button label="店" name="goShop" tool_tip="Second Life マーケットプレイスを開く" width="40"/>
+ <button label="店" name="goShop" tool_tip="Second Life マーケットプレイスを開く" width="40"/>
</panel>
- <text name="TimeText" tool_tip="現在時刻(太平洋)">
- 24:00 AM PST
- </text>
+ <text name="TimeText" tool_tip="現在時刻(太平洋)">24:00 AM PST</text>
<button name="media_toggle_btn" tool_tip="すべてのメディアを開始・停止(音楽、ビデオ、Web ページ)"/>
<button name="volume_btn" tool_tip="グローバル音量設定"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_twitter_photo.xml b/indra/newview/skins/default/xui/ja/panel_twitter_photo.xml
index 8e67d8fd19..cdb45e1853 100644
--- a/indra/newview/skins/default/xui/ja/panel_twitter_photo.xml
+++ b/indra/newview/skins/default/xui/ja/panel_twitter_photo.xml
@@ -1,32 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_twitter_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="text_panel">
- <text name="status_label">
- 何が起きているのでしょうか?
- </text>
- <text name="status_counter_label">
- 140
- </text>
- <check_box initial_value="true" label="SL の場所を含む" name="add_location_cb"/>
- <check_box initial_value="true" label="写真を掲載する" name="add_photo_cb"/>
- </layout_panel>
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="画像解像度">
- <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>
- <combo_box name="filters_combobox" tool_tip="画像フィルター">
- <combo_box.item label="フィルターなし" name="NoFilter"/>
- </combo_box>
- <button label="更新" name="new_snapshot_btn" tool_tip="クリックして更新"/>
- <button label="プレビュー" name="big_preview_btn" tool_tip="クリックしてプレビューを切り替える"/>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="ツイート" name="post_photo_btn"/>
- <button label="取り消し" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <text name="status_label">
+ 何が起きているのでしょうか?
+ </text>
+ <text name="status_counter_label">
+ 140
+ </text>
+ <check_box initial_value="true" label="SL の場所を含む" name="add_location_cb"/>
+ <check_box initial_value="true" label="写真を含める" name="add_photo_cb"/>
+ <combo_box name="resolution_combobox" tool_tip="画像解像度">
+ <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>
+ <combo_box name="filters_combobox" tool_tip="画像フィルター">
+ <combo_box.item label="フィルターなし" name="NoFilter"/>
+ </combo_box>
+ <button label="更新" name="new_snapshot_btn" tool_tip="クリックして更新"/>
+ <button label="プレビュー" name="big_preview_btn" tool_tip="クリックしてプレビューを切り替える"/>
+ <button label="ツイート" name="post_photo_btn"/>
+ <button label="取り消し" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/role_actions.xml b/indra/newview/skins/default/xui/ja/role_actions.xml
index e64460470c..eb2c12accc 100755
--- a/indra/newview/skins/default/xui/ja/role_actions.xml
+++ b/indra/newview/skins/default/xui/ja/role_actions.xml
@@ -71,4 +71,8 @@
<action description="グループボイスチャットに参加する" longdescription=" この能力を持つ役割のメンバーは、グループボイスチャットセッションに参加できます。 注: ボイスチャットセッションにアクセスするには、グループチャットに参加する能力が必要です。 " name="join voice chat" value="27"/>
<action description="グループチャットを管理する" longdescription=" この能力を持つ役割のメンバーは、グループボイスチャットセッションおよびグループテキストチャットセッションへのアクセスや参加をコントロールすることができます。 " name="moderate group chat" value="37"/>
</action_set>
+ <action_set description="これらの機能には、このグループにより所有される体験を変更する機能が含まれます。" name="experience_tools_experience">
+ <action description="体験管理者" longdescription="この機能を持つ役割のメンバーは、体験のメタデータを編集できます。" name="experience admin" value="49"/>
+ <action description="体験貢献者" longdescription="この機能を持つ役割のメンバーは、体験のスクリプトを提供できます。" name="experience contributor" value="50"/>
+ </action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml
index e70d91d258..d888470846 100755
--- a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="item properties" title="アイテムのプロフィール">
+ <panel.string name="loading_experience">
+ (ローディング)
+ </panel.string>
<panel.string name="unknown">
(不明)
</panel.string>
@@ -43,6 +46,9 @@
<text name="LabelAcquiredTitle">
取得:
</text>
+ <text name="LabelItemExperienceTitle">
+ 体験:
+ </text>
<panel name="perms_inv">
<text name="perm_modify">
あなたができること:
@@ -66,8 +72,9 @@
<check_box label="再販・プレゼント" name="CheckNextOwnerTransfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販できます"/>
</panel>
<check_box label="販売中" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
+ <combo_box name="ComboBoxSaleType">
<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"/>
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
index 4f65c8477b..858307800b 100755
--- a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
@@ -1,71 +1,31 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="object properties" title="オブジェクトのプロフィール">
- <panel.string name="text deed continued">
- 譲渡
- </panel.string>
- <panel.string name="text deed">
- 譲渡
- </panel.string>
- <panel.string name="text modify info 1">
- このオブジェクトを修正できます
- </panel.string>
- <panel.string name="text modify info 2">
- これらのオブジェクトを修正できます
- </panel.string>
- <panel.string name="text modify info 3">
- このオブジェクトを修正できません
- </panel.string>
- <panel.string name="text modify info 4">
- これらのオブジェクトを修正できません
- </panel.string>
- <panel.string name="text modify info 5">
- 地域(リージョン)の境界を越えてこのオブジェクトを修正できません
- </panel.string>
- <panel.string name="text modify info 6">
- 地域(リージョン)の境界を越えてこれらのオブジェクトを修正できません
- </panel.string>
- <panel.string name="text modify warning">
- このオブジェクトには、パーツがリンクされています
- </panel.string>
- <panel.string name="Cost Default">
- 価格: L$
- </panel.string>
- <panel.string name="Cost Total">
- 合計: L$
- </panel.string>
- <panel.string name="Cost Per Unit">
- Price Per: L$
- </panel.string>
- <panel.string name="Cost Mixed">
- Mixed Price
- </panel.string>
- <panel.string name="Sale Mixed">
- Mixed Sale
- </panel.string>
+ <panel.string name="text deed continued">譲渡</panel.string>
+ <panel.string name="text deed">譲渡</panel.string>
+ <panel.string name="text modify info 1">このオブジェクトを修正できます</panel.string>
+ <panel.string name="text modify info 2">これらのオブジェクトを修正できます</panel.string>
+ <panel.string name="text modify info 3">このオブジェクトを修正できません</panel.string>
+ <panel.string name="text modify info 4">これらのオブジェクトを修正できません</panel.string>
+ <panel.string name="text modify info 5">地域(リージョン)の境界を越えてこのオブジェクトを修正できません</panel.string>
+ <panel.string name="text modify info 6">地域(リージョン)の境界を越えてこれらのオブジェクトを修正できません</panel.string>
+ <panel.string name="text modify warning">このオブジェクトには、パーツがリンクされています</panel.string>
+ <panel.string name="Cost Default">価格: L$</panel.string>
+ <panel.string name="Cost Total">合計価格: L$</panel.string>
+ <panel.string name="Cost Per Unit">Price Per: L$</panel.string>
+ <panel.string name="Cost Mixed">Mixed Price</panel.string>
+ <panel.string name="Sale Mixed">Mixed Sale</panel.string>
<text name="title" value="オブジェクトのプロフィール"/>
<text name="where" value="(インワールド)"/>
<panel label="" name="properties_panel">
- <text name="Name:">
- 名前:
- </text>
- <text name="Description:">
- 説明:
- </text>
- <text name="CreatorNameLabel">
- 制作者:
- </text>
- <text name="Owner:">
- 所有者:
- </text>
- <text name="Group_label">
- グループ:
- </text>
+ <text name="Name:">名前:</text>
+ <text name="Description:">説明:</text>
+ <text name="CreatorNameLabel">制作者:</text>
+ <text name="Owner:">所有者:</text>
+ <text name="Group_label">グループ:</text>
<button name="button set group" tool_tip="このオブジェクト権限を共有するグループを選択します"/>
<name_box initial_value="ローディング..." name="Group Name Proxy"/>
<button label="譲渡" label_selected="譲渡" name="button deed" tool_tip="このアイテムを譲渡すると「次の所有者」の権限が適用されます。 グループ共有オブジェクトは、グループのオフィサーが譲渡できます。"/>
- <text name="label click action">
- クリックで:
- </text>
+ <text name="label click action">クリックで:</text>
<combo_box name="clickaction">
<combo_box.item label="触る(デフォルト)" name="Touch/grab(default)"/>
<combo_box.item label="オブジェクトに座る" name="Sitonobject"/>
@@ -75,21 +35,13 @@
<combo_box.item label="ズーム" name="Zoom"/>
</combo_box>
<panel name="perms_inv">
- <text name="perm_modify">
- このオブジェクトを修正できます
- </text>
- <text name="Anyone can:">
- 全員:
- </text>
+ <text name="perm_modify">このオブジェクトを修正できます</text>
+ <text name="Anyone can:">全員:</text>
<check_box label="コピー" name="checkbox allow everyone copy"/>
<check_box label="移動" name="checkbox allow everyone move"/>
- <text name="GroupLabel">
- グループ:
- </text>
+ <text name="GroupLabel">グループ:</text>
<check_box label="共有" name="checkbox share with group" tool_tip="設定したグループのメンバー全員にこのオブジェクトの修正権限を与えます。 譲渡しない限り、役割制限を有効にはできません。"/>
- <text name="NextOwnerLabel">
- 次の所有者:
- </text>
+ <text name="NextOwnerLabel">次の所有者:</text>
<check_box label="修正" name="checkbox next owner can modify"/>
<check_box label="コピー" name="checkbox next owner can copy"/>
<check_box label="再販・プレゼント" name="checkbox next owner can transfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販できます"/>
@@ -102,27 +54,13 @@
</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>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
+ <text name="pathfinding_attributes_label">パスファインディング属性:</text>
+ <text name="B:">B.</text>
+ <text name="O:">O:</text>
+ <text name="G:">G:</text>
+ <text name="E:">E:</text>
+ <text name="N:">N:</text>
+ <text name="F:">F:</text>
</panel>
<panel name="button_panel">
<button label="開く" name="open_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index d046e11571..22eb9ce888 100755
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -448,30 +448,51 @@ support@secondlife.com にお問い合わせください。
<string name="TooltipMustSingleDrop">
アイテムは 1 つだけここにドラッグできます
</string>
+ <string name="TooltipTooManyWearables">
+ [AMOUNT] 以上のアイテムを含むフォルダを装着できません。「詳細設定」 &gt; 「デバッグ設定を表示」 &gt; 「WearFolderLimit」でこの制限を変更できます。
+ </string>
<string name="TooltipPrice" value="L$[AMOUNT]:"/>
<string name="TooltipOutboxDragToWorld">
- マーチャントボックス内のアイテムを Rez することはできません
+ マーケットプレイスのリストフォルダからアイテムを Rez できません
+ </string>
+ <string name="TooltipOutboxWorn">
+ 着ているアイテムをマーケットプレイスのリストフォルダに置くことはできません
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ ネスト入りフォルダの深さが [AMOUNT] 階層を超えています必要に応じてアイテムを箱に入れ、フォルダの階層を減らします。
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ サブフォルダ数が [AMOUNT] 個を超えています。必要に応じてアイテムを箱に入れ、リストのフォルダ階層を減らします。
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ アイテム数が [AMOUNT] 個を超えています。1 つのリスト内で [AMOUNT] 個を超えるアイテムを販売するためには、いくつかのアイテムを箱に入れる必要があります。
+ </string>
+ <string name="TooltipOutboxTooManyStockItems">
+ 在庫アイテム数が [AMOUNT] 個を超えています。
+ </string>
+ <string name="TooltipOutboxCannotDropOnRoot">
+ アイテムまたはフォルダは「すべて」タブによってのみドロップできます。このタブを選択してから、もう一度アイテムまたはフォルダを選択してください。
</string>
<string name="TooltipOutboxNoTransfer">
- これらオブジェクトの 1 つまたは複数は売り渡したり譲渡したりできないものです。
+ これらのオブジェクトの 1 つまたは複数は売り渡したり譲渡したりできないものです
</string>
<string name="TooltipOutboxNotInInventory">
- マーチャントアウトボックスでは、ご自分のインベントリからのアイテムしか受け入れることができません
+ アイテムはインベントリからマーケットプレイスへの移動のみできます
</string>
- <string name="TooltipOutboxWorn">
- 着用しているアイテムをマーチャントアウトボックスに入れることはできません
+ <string name="TooltipOutboxLinked">
+ リンクされた相手またはフォルダをマーケットプレイスに置くことはできません
</string>
<string name="TooltipOutboxCallingCard">
- コーリングカードをマーチャントアウトボックスに入れることはできません
+ コーリングカードをマーケットプレイスに置くことはできません
</string>
- <string name="TooltipOutboxFolderLevels">
- ネスト入りフォルダの深さが 3 を超えています
+ <string name="TooltipOutboxDragActive">
+ 表示されているリストを移動できません
</string>
- <string name="TooltipOutboxTooManyFolders">
- 最上位フォルダ内のサブフォルダ数が 20 を超えています
+ <string name="TooltipOutboxCannotMoveRoot">
+ ルートフォルダをリストに表示するマーケットプレイスを移動できません
</string>
- <string name="TooltipOutboxTooManyObjects">
- 最上位フォルダ内のアイテム数が 200 を超えています
+ <string name="TooltipOutboxMixedStock">
+ 在庫フォルダ内のアイテムはすべて同じ種類と権限でなければなりません
</string>
<string name="TooltipDragOntoOwnChild">
フォルダをその子フォルダに移動することはできません
@@ -1059,9 +1080,7 @@ support@secondlife.com にお問い合わせください。
<string name="AgentNameSubst">
(あなた)
</string>
- <string name="JoinAnExperience">
- 体験に参加する
- </string>
+ <string name="JoinAnExperience"/><!-- intentionally blank -->
<string name="SilentlyManageEstateAccess">
土地のアクセスリストを管理するときにアラートを表示しない
</string>
@@ -1128,6 +1147,12 @@ support@secondlife.com にお問い合わせください。
<string name="bitmap_image_files">
ビットマップ画像
</string>
+ <string name="png_image_files">
+ PNG 画像
+ </string>
+ <string name="save_texture_image_files">
+ Targa または PNG 画像
+ </string>
<string name="avi_movie_file">
AVI ムービーファイル
</string>
@@ -1377,6 +1402,9 @@ support@secondlife.com にお問い合わせください。
<string name="FavoritesNoMatchingItems">
ここにランドマークをドラッグしてお気に入りに追加します。
</string>
+ <string name="MarketplaceNoMatchingItems">
+ アイテムが見つかりませんでした。検索文字列のスペルを確認して、もう一度やり直してください。
+ </string>
<string name="InventoryNoTexture">
インベントリ内にこのテクスチャのコピーがありません
</string>
@@ -1424,29 +1452,95 @@ support@secondlife.com にお問い合わせください。
<string name="InventoryOutboxError">
[[MARKETPLACE_CREATE_STORE_URL] マーケットプレイス ストア] がエラーを返しています。
</string>
+ <string name="InventoryMarketplaceError">
+ この機能は、現在、ベータ版の機能です。参加するには、この [http://goo.gl/forms/FCQ7UXkakz Google form] に名前を追加してください。
+ </string>
+ <string name="InventoryMarketplaceListingsNoItemsTitle">
+ マーケットプレイスのリストフォルダが空です。
+ </string>
+ <string name="InventoryMarketplaceListingsNoItems">
+ [[MARKETPLACE_DASHBOARD_URL] マーケットプレイス]に販売するアイテムを一覧するには、フォルダをこのエリアにドラッグします。
+ </string>
+ <string name="Marketplace Validation Warning Stock">
+ バージョンフォルダに在庫フォルダが含まれなければなりません
+ </string>
+ <string name="Marketplace Validation Error Mixed Stock">
+ : エラー:在庫フォルダ内のすべてのアイテムはコピー不可で同じ種類でなければなりません
+ </string>
+ <string name="Marketplace Validation Error Subfolder In Stock">
+ : エラー:在庫フォルダにサブフォルダを含めることはできません
+ </string>
+ <string name="Marketplace Validation Warning Empty">
+ : 警告:フォルダにアイテムが含まれていません
+ </string>
+ <string name="Marketplace Validation Warning Create Stock">
+ : 警告:在庫フォルダを作成しています
+ </string>
+ <string name="Marketplace Validation Warning Create Version">
+ : 警告:バージョンフォルダ作成中
+ </string>
+ <string name="Marketplace Validation Warning Move">
+ : 警告:アイテム移動中
+ </string>
+ <string name="Marketplace Validation Warning Delete">
+ : 警告:フォルダの中身が在庫フォルダに移されました。空のフォルダを削除します
+ </string>
+ <string name="Marketplace Validation Error Stock Item">
+ : エラー:在庫フォルダにコピー不可アイテムを含める必要があります
+ </string>
+ <string name="Marketplace Validation Warning Unwrapped Item">
+ : 警告:バージョンフォルダにアイテムが含まれていなければなりません
+ </string>
+ <string name="Marketplace Validation Error">
+ : エラー:
+ </string>
+ <string name="Marketplace Validation Warning">
+ : 警告:
+ </string>
+ <string name="Marketplace Validation Error Empty Version">
+ : 警告:バージョンフォルダには、最低 1 アイテムが含まれなければなりません
+ </string>
+ <string name="Marketplace Validation Error Empty Stock">
+ : 警告:在庫フォルダには、最低 1 アイテムが含まれていなければなりません
+ </string>
+ <string name="Marketplace Validation No Error">
+ 報告するエラーまたは警告はありません
+ </string>
<string name="Marketplace Error None">
エラーなし
</string>
+ <string name="Marketplace Error Prefix">
+ エラー:
+ </string>
<string name="Marketplace Error Not Merchant">
- エラー:マーケットプレイスにアイテムを送る前に、あなた自身をマーチャント登録する必要があります(登録は無料です)。
+ マーケットプレイスに商品を送る前に、あなた自身をマーチャント登録する必要があります(登録は無料です)。
</string>
- <string name="Marketplace Error Empty Folder">
- エラー:このフォルダは空です。
+ <string name="Marketplace Error Not Accepted">
+ アイテムをそのフォルダに移動できません。
</string>
- <string name="Marketplace Error Unassociated Products">
- エラー:あなたのマーチャントアカウントには、商品に関連付けられていないアイテムが多すぎるため、このアイテムをアップロードできませんでした。このエラーを解消するには、マーケットプレイスの Web サイトにログインし、関連付けられていないアイテムの数を減らしてください。
+ <string name="Marketplace Error Unsellable Item">
+ このアイテムをマーケットプレイスで販売することはできません。
</string>
- <string name="Marketplace Error Object Limit">
- エラー:このアイテムに含まれるオブジェクトが多すぎます。オブジェクトをいくつかボックスにまとめ、オブジェクト数を200以下に減らしてください。
+ <string name="MarketplaceNoID">
+ Mkt ID なし
</string>
- <string name="Marketplace Error Folder Depth">
- エラー:このアイテムはネスト入りフォルダの階層が多すぎます。ネスト入りフォルダを 3 階層以内にまとめ直してください。
+ <string name="MarketplaceLive">
+ リスト掲載済み
</string>
- <string name="Marketplace Error Unsellable Item">
- エラー:このアイテムをマーケットプレイスで販売することはできません。
+ <string name="MarketplaceActive">
+ 有効
+ </string>
+ <string name="MarketplaceMax">
+ 最大
+ </string>
+ <string name="MarketplaceStock">
+ 在庫
</string>
- <string name="Marketplace Error Internal Import">
- エラー:このアイテムに関して問題が発生しました。しばらくしてからお試しください。
+ <string name="MarketplaceNoStock">
+ 在庫なし
+ </string>
+ <string name="MarketplaceUpdating">
+ アップデート中...
</string>
<string name="Open landmarks">
ランドマークを開く
@@ -1467,6 +1561,7 @@ support@secondlife.com にお問い合わせください。
コンテンツなし
</string>
<string name="WornOnAttachmentPoint" value=" ([ATTACHMENT_POINT] に装着中)"/>
+ <string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/>
<string name="ActiveGesture" value="[GESLABEL] (アクティブ)"/>
<string name="PermYes">
はい
@@ -1737,6 +1832,15 @@ support@secondlife.com にお問い合わせください。
<string name="Invalid Attachment">
装着先が正しくありません
</string>
+ <string name="ATTACHMENT_MISSING_ITEM">
+ エラー:アイテムが見つかりません
+ </string>
+ <string name="ATTACHMENT_MISSING_BASE_ITEM">
+ エラー:ベースアイテムが見つかりません
+ </string>
+ <string name="ATTACHMENT_NOT_ATTACHED">
+ エラー:オブジェクトは現在のアウトフィット内にありますが、添付されていません
+ </string>
<string name="YearsMonthsOld">
[AGEYEARS] [AGEMONTHS]
</string>
@@ -1905,6 +2009,9 @@ support@secondlife.com にお問い合わせください。
<string name="SaveComplete">
保存完了。
</string>
+ <string name="UploadFailed">
+ ファイルのアップロードが失敗しました:
+ </string>
<string name="ObjectOutOfRange">
スクリプト(オブジェクトが範囲外にあります)
</string>
@@ -1914,6 +2021,9 @@ support@secondlife.com にお問い合わせください。
<string name="GroupsNone">
なし
</string>
+ <string name="CompileNoExperiencePerm">
+ [EXPERIENCE] 体験による [SCRIPT] スクリプトのスキップ。
+ </string>
<string name="Group" value=" (グループ)"/>
<string name="Unknown">
(不明)
@@ -5065,6 +5175,9 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="Command_Marketplace_Label">
マーケットプレイス
</string>
+ <string name="Command_MarketplaceListings_Label">
+ マーケットプレイス
+ </string>
<string name="Command_MiniMap_Label">
ミニマップ
</string>
@@ -5152,6 +5265,9 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="Command_Marketplace_Tooltip">
ショッピングに出掛ける
</string>
+ <string name="Command_MarketplaceListings_Tooltip">
+ 創作アイテムを販売します
+ </string>
<string name="Command_MiniMap_Tooltip">
近くの人を表示する
</string>
@@ -5275,4 +5391,85 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="loading_chat_logs">
ロード中...
</string>
+ <string name="experience_tools_experience">
+ 体験
+ </string>
+ <string name="ExperienceNameNull">
+ (体験なし)
+ </string>
+ <string name="ExperienceNameUntitled">
+ (タイトルのない体験)
+ </string>
+ <string name="Land-Scope">
+ ランドスコープ
+ </string>
+ <string name="Grid-Scope">
+ グリッドスコープ
+ </string>
+ <string name="Allowed_Experiences_Tab">
+ 許可
+ </string>
+ <string name="Blocked_Experiences_Tab">
+ 停止
+ </string>
+ <string name="Contrib_Experiences_Tab">
+ 貢献者
+ </string>
+ <string name="Admin_Experiences_Tab">
+ 管理
+ </string>
+ <string name="Recent_Experiences_Tab">
+ 最新
+ </string>
+ <string name="Owned_Experiences_Tab">
+ 所有
+ </string>
+ <string name="ExperiencesCounter">
+ ([EXPERIENCES], max [MAXEXPERIENCES])
+ </string>
+ <string name="ExperiencePermission1">
+ コントロールを引き継ぐ
+ </string>
+ <string name="ExperiencePermission3">
+ アバターでアニメーションをトリガー
+ </string>
+ <string name="ExperiencePermission4">
+ アバターに装着
+ </string>
+ <string name="ExperiencePermission9">
+ カメラ追従
+ </string>
+ <string name="ExperiencePermission10">
+ カメラのコントロール
+ </string>
+ <string name="ExperiencePermission11">
+ あなたをテレポート
+ </string>
+ <string name="ExperiencePermission12">
+ 体験の権限を自動的に承諾
+ </string>
+ <string name="ExperiencePermissionShortUnknown">
+ が不明な操作を実行しました: [Permission]
+ </string>
+ <string name="ExperiencePermissionShort1">
+ コントロールする
+ </string>
+ <string name="ExperiencePermissionShort3">
+ アニメーションをトリガー
+ </string>
+ <string name="ExperiencePermissionShort4">
+ 取り付ける
+ </string>
+ <string name="ExperiencePermissionShort9">
+ カメラを追跡
+ </string>
+ <string name="ExperiencePermissionShort10">
+ カメラを制御
+ </string>
+ <string name="ExperiencePermissionShort11">
+ テレポート
+ </string>
+ <string name="ExperiencePermissionShort12">
+ 権限
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/ja/teleport_strings.xml b/indra/newview/skins/default/xui/ja/teleport_strings.xml
index 7868c25807..4555420ba8 100755
--- a/indra/newview/skins/default/xui/ja/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/ja/teleport_strings.xml
@@ -50,6 +50,9 @@
<message name="MustGetAgeRegion">
この地域(リージョン)に入るには 18 才以上である必要があります。
</message>
+ <message name="RegionTPSpecialUsageBlocked">
+ リージョンに入ることができません。&apos;[REGION_NAME]&apos; はスキル ゲーミング リージョンであり、あなたはこのリージョンに入るための特定の基準を満たす必要があります。詳しくは、[http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life スキル ゲーミングのよくある質問] を参照してください。
+ </message>
</message_set>
<message_set name="progress">
<message name="sending_dest">
diff --git a/indra/newview/skins/default/xui/pl/floater_associate_listing.xml b/indra/newview/skins/default/xui/pl/floater_associate_listing.xml
new file mode 100644
index 0000000000..b5464dd59b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_associate_listing.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="associate listing" title="PRZYPISANE PRZEDMIOTY">
+ <text name="message">ID przedmiotu:</text>
+ <line_editor name="listing_id">Wpisz tutaj ID</line_editor>
+ <button label="OK" name="OK"/>
+ <button label="Anuluj" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_font_test.xml b/indra/newview/skins/default/xui/pl/floater_font_test.xml
index 8542cafd16..7bf6c11d21 100755
--- a/indra/newview/skins/default/xui/pl/floater_font_test.xml
+++ b/indra/newview/skins/default/xui/pl/floater_font_test.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floatername="contents" title="TEST CZCIONKI" />
+<floater name="contents" title="TEST CZCIONKI" />
diff --git a/indra/newview/skins/default/xui/pl/floater_item_properties.xml b/indra/newview/skins/default/xui/pl/floater_item_properties.xml
new file mode 100644
index 0000000000..8b0cf31a9a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_item_properties.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Item Properties" title="WŁAŚCIWOŚCI"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_marketplace_listings.xml b/indra/newview/skins/default/xui/pl/floater_marketplace_listings.xml
new file mode 100644
index 0000000000..1917a4985b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_marketplace_listings.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_listings" title="RZECZY NA MARKETPLACE">
+ <panel name="marketplace_listings_panel">
+ <panel>
+ <panel name="marketplace_listings_inventory_placeholder_panel">
+ <text name="marketplace_listings_inventory_placeholder_title">Wczytywanie...</text>
+ </panel>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_marketplace_validation.xml b/indra/newview/skins/default/xui/pl/floater_marketplace_validation.xml
new file mode 100644
index 0000000000..826c72f2cd
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_marketplace_validation.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_validation" title="Sprawdź przedmioty na Marketplace">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <text_editor name="validation_text">MARKETPLACE_VALIDATION_TEXT</text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/menu_marketplace_view.xml b/indra/newview/skins/default/xui/pl/menu_marketplace_view.xml
new file mode 100644
index 0000000000..b948074501
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_marketplace_view.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_marketplace_sort">
+ <menu_item_check label="Sortuj według ilości (rosnąco)" name="sort_by_stock_amount"/>
+ <menu_item_check label="Pokaż tylko foldery" name="show_only_listing_folders"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml
index 2ffce083f1..e6ad1faee6 100755
--- a/indra/newview/skins/default/xui/pl/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml
@@ -58,7 +58,7 @@
<menu_item_call label="Zrób zdjęcie" name="Take Snapshot" />
<menu_item_call label="Profil miejsca" name="Place Profile" />
<menu_item_call label="O działce" name="About Land" />
- <menu_item_call label="Region / Majątek" name="Region/Estate" />
+ <menu_item_call label="Region/Majątek" name="RegionEstate"/>
<menu_item_call label="Moje działki..." name="My Land" />
<menu_item_call label="Kup działkę" name="Buy Land" />
<menu label="Pokaż więcej" name="LandShow">
diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml
index 68ce94ea47..0092fe09d2 100755
--- a/indra/newview/skins/default/xui/pl/notifications.xml
+++ b/indra/newview/skins/default/xui/pl/notifications.xml
@@ -2501,9 +2501,6 @@ Spróbuj ponownie za kilka minut.
<notification name="NoValidCircuit">
Brak poprawnego obwodu kodowania.
</notification>
- <notification name="NoValidTimestamp">
- Brak poprawnego znacznika czasu.
- </notification>
<notification name="NoPendingConnection">
Brak możliwości wykonania połączenia.
</notification>
diff --git a/indra/newview/skins/default/xui/pl/panel_marketplace_listings.xml b/indra/newview/skins/default/xui/pl/panel_marketplace_listings.xml
new file mode 100644
index 0000000000..7db98a106d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_marketplace_listings.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Marketplace" name="Marketplace Panel">
+ <panel name="tool_panel">
+ <menu_button name="sort_btn" tool_tip="Opcje widoku/sortowania"/>
+ <button name="add_btn" tool_tip="Utwórz nowy folder"/>
+ <button label="Zweryfikuj" name="audit_btn" tool_tip="Sprawdź swoje przedmioty na Marketplace"/>
+ </panel>
+ <panel name="tab_container_panel">
+ <filter_editor label="Filtruj przedmioty" name="filter_editor"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_marketplace_listings_inventory.xml b/indra/newview/skins/default/xui/pl/panel_marketplace_listings_inventory.xml
new file mode 100644
index 0000000000..be4be5b80f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_marketplace_listings_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="WSZYSTKO" name="All Items" tool_tip="Przeciągnij tutaj przedmioty, aby je wylistować"/>
diff --git a/indra/newview/skins/default/xui/pl/panel_marketplace_listings_listed.xml b/indra/newview/skins/default/xui/pl/panel_marketplace_listings_listed.xml
new file mode 100644
index 0000000000..3b17298742
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_marketplace_listings_listed.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="NA LIŚCIE" name="Active Items"/>
diff --git a/indra/newview/skins/default/xui/pl/panel_marketplace_listings_unassociated.xml b/indra/newview/skins/default/xui/pl/panel_marketplace_listings_unassociated.xml
new file mode 100644
index 0000000000..f818da6821
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_marketplace_listings_unassociated.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="NIEPRZYPISANE" name="Unassociated Items"/>
diff --git a/indra/newview/skins/default/xui/pl/panel_marketplace_listings_unlisted.xml b/indra/newview/skins/default/xui/pl/panel_marketplace_listings_unlisted.xml
new file mode 100644
index 0000000000..8031fe78f7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_marketplace_listings_unlisted.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="UKRYTE" name="Inactive Items"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_about.xml b/indra/newview/skins/default/xui/pt/floater_about.xml
index 47975a6386..1e2edd7a2f 100755
--- a/indra/newview/skins/default/xui/pt/floater_about.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about.xml
@@ -1,73 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="SOBRE [CAPITALIZED_APP_NAME]">
- <floater.string name="AboutHeader">
- [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
- </floater.string>
- <floater.string name="AboutCompiler">
- Construído com [COMPILER] versão [COMPILER_VERSION]
- </floater.string>
- <floater.string name="AboutPosition">
- Você está em [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] em [REGION] localizado em &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
-SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
-(coordenadas globais [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
-[SERVER_VERSION]
-[SERVER_RELEASE_NOTES_URL]
- </floater.string>
- <floater.string name="AboutSystem">
- CPU: [CPU]
-Memória: [MEMORY_MB] MBs
-Versão OS: [OS_VERSION]
-Placa de vídeo: [GRAPHICS_CARD_VENDOR]
-Placa gráfica: [GRAPHICS_CARD]
- </floater.string>
- <floater.string name="AboutDriver">
- Versão do driver de vídeo Windows: [GRAPHICS_CARD_VENDOR]
- </floater.string>
- <floater.string name="AboutLibs">
- Versão OpenGL: [OPENGL_VERSION]
-
-Versão libcurl: [LIBCURL_VERSION]
-Versão J2C Decoder: [J2C_VERSION]
-Versão do driver de áudio: [AUDIO_DRIVER_VERSION]
-Versão Qt Webkit: [QT_WEBKIT_VERSION]
-Versão do servidor de voz: [VOICE_VERSION]
- </floater.string>
- <floater.string name="none">
- (nenhum)
- </floater.string>
- <floater.string name="AboutTraffic">
- Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
- </floater.string>
- <floater.string name="ErrorFetchingServerReleaseNotesURL">
- Erro ao obter URL de notas de versão do servidor.
- </floater.string>
<tab_container name="about_tab">
<panel label="Info" name="support_panel">
<button label="Copiar" name="copy_btn"/>
</panel>
<panel label="Créditos" name="credits_panel">
- <text name="linden_intro">
- O Second Life é trazido a você pela Lindens:
- </text>
- <text_editor name="linden_names">
- Philip, Andrew, Doug, Richard, Phoenix, Ian, Mark, Robin, Dan, Char, Ryan, Eric, Jim, Lee, Jeff, Michael, Kelly, Steve, Catherine, Bub, Ramzi, Jill, Jeska, Don, Kona, Callum, Charity, Jack, Shawn, babbage, James, Lauren, Blue, Brent, Reuben, Pathfinder, Jesse, Patsy, Torley, Bo, Cyn, Jonathan, Gia, Annette, Ginsu, Harry, Lex, Runitai, Guy, Cornelius, Beth, Swiss, Thumper, Wendy, Teeple, Seth, Dee, Mia, Sally, Liana, Aura, Beez, Milo, Red, Gulliver, Marius, Joe, Jose, Dore, Justin, Nora, Morpheus, Lexie, Amber, Chris, Xan, Leyla, Walker, Sabin, Joshua, Hiromi, Tofu, Fritz, June, Jean, Ivy, Dez, Ken, Betsy, Which, Spike, Rob, Zee, Dustin, George, Claudia, del, Matthew, jane, jay, Adrian, Yool, Rika, Yoz, siobhan, Qarl, Benjamin, Beast, Everett, madhavi, Christopher, Izzy, stephany, Jeremy, sean, adreanne, Pramod, Tobin, sejong, Iridium, maurice, kj, Meta, kari, JP, bert, kyle, Jon, Socrates, Bridie, Ivan, maria, Aric, Coco, Periapse, sandy, Storrs, Lotte, Colossus, Brad, Pastrami, Zen, BigPapi, Banzai, Sardonyx, Mani, Garry, Jaime, Neuro, Samuel, Niko, CeeLo, Austin, Soft, Poppy, emma, tessa, angelo, kurz, alexa, Sue, CG, Blake, Erica, Brett, Bevis, kristen, Q, simon, Enus, MJ, laurap, Kip, Scouse, Ron, Ram, kend, Marty, Prospero, melissa, kraft, Nat, Seraph, Hamilton, Lordan, Green, miz, Ashlei, Trinity, Ekim, Echo, Charlie, Rowan, Rome, Jt, Doris, benoc, Christy, Bao, Kate, Tj, Patch, Cheah, Johan, Brandy, Angela, Oreh, Cogsworth, Lan, Mitchell, Space, Bambers, Einstein, Bender, Malbers, Matias, Maggie, Rothman, Milton, Niall, Marin, Allison, Mango, Andrea, Katt, Yi, Ambroff, Rico, Raymond, Gail, Christa, William, Dawn, Usi, Dynamike, M, Corr, Dante, Molly, kaylee, Danica, Kelv, Lil, jacob, Nya, Rodney, elsie, Blondin, Grant, Nyx, Devin, Monty, Minerva, Keira, Katie, Jenn, Makai, Clare, Joy, Cody, Gayathri, FJ, spider, Oskar, Landon, Jarv, Noelle, Al, Doc, Gray, Vir, t, Maestro, Simone, Shannon, yang, Courtney, Scott, charlene, Quixote, Susan, Zed, Amanda, Katelin, Esbee, JoRoan, Enkidu, roxie, Scarlet, Merov, Kevin, Judy, Rand, Newell, Les, Dessie, Galen, Michon, Geo, Siz, Calyle, Pete, Praveen, Callen, Sheldon, Pink, Nelson, jenelle, Terrence, Nathan, Juan, Sascha, Huseby, Karina, Kaye, Kotler, Lis, Darv, Charrell, Dakota, Kimmora, Theeba, Taka, Mae, Perry, Ducot, dana, Esther, Dough, gisele, Doten, Viale, Fisher, jessieann, ashley, Torres, delby, rountree, kurt, Slaton, Madison, Rue, Gino, Wen, Casssandra, Brodesky, Squid, Gez, Rakesh, Gecko, Ladan, Tony, Tatem, Squire, Falcon, BK, Crimp, Tiggs, Bacon, Coyot, Carmilla, Webb, Sea, Arch, Jillian, Jason, Bernard, Vogt, Peggy, dragon, Pup, xandix, Wallace, Bewest, Inoshiro, Rhett, AG, Aimee, Ghengis, Itiaes, Eli, Steffan, Epic, Grapes, Stone, Prep, Scobu, Robert, Alain, Carla, Vicky, Tia, Alec, Taras, Lisa, Oz, Ariane, Log, House, Kazu, Kim, Drofnas, Tyler, Campbell, Michele, Madeline, Nelly, Baron, Thor, Lori, Hele, Fredrik, Teddy, Pixie, Berry, Gabrielle, Alfonso, Brooke, Wolf, Ringo, Cru, Charlar, Rodvik, Gibson, Elise, Bagman, Greger, Leonidas, Jerm, Leslie, CB, Brenda, Durian, Carlo, mm, Zeeshan, Caleb, Max, Elikak, Mercille, Steph, Chase
- </text_editor>
- <text name="contrib_intro">
- com contribuições de código aberto de:
- </text>
- <text_editor name="contrib_names">
- Dummy Name substituído durante a execução
- </text_editor>
- <text name="trans_intro">
- e traduções de:
- </text>
- <text_editor name="trans_names">
- Dummy Name substituído durante a execução
- </text_editor>
+ <text name="linden_intro">O Second Life é trazido a você pela Lindens,
+com contribuições de código aberto de:</text>
+ <text_editor name="contrib_names">Dummy Name substituído durante a execução</text_editor>
</panel>
<panel label="Licenças" name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
+ <text_editor name="licenses_editor">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)
@@ -94,8 +37,7 @@ Versão do servidor de voz: [VOICE_VERSION]
Todos os direitos reservados. Consulte licenses.txt para obter detalhes.
- Codificação de áudio da conversa com voz: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
+ Codificação de áudio da conversa com voz: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)</text_editor>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml
index f48280840c..fee939ab46 100755
--- a/indra/newview/skins/default/xui/pt/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml
@@ -308,9 +308,6 @@ Apenas lotes maiores podem ser listados na busca.
<panel.string name="push_restrict_region_text">
Proibido empurrar (regulamento da região)
</panel.string>
- <panel.string name="see_avs_text">
- Avatares em outros lotes podem ver
- </panel.string>
<text name="allow_label">
Autorizar outros residentes a:
</text>
@@ -336,22 +333,6 @@ Apenas lotes maiores podem ser listados na busca.
<check_box label="Seguro (sem danos)" name="check safe" tool_tip="Se ativado, ajusta o terreno para Seguro, impedindo lutas com danos. Se não ativado, lutas com danos é habilitado."/>
<check_box label="Proibido empurrar" name="PushRestrictCheck" tool_tip="Evita scripts que empurram. Ativar essa opção ajuda a prevenir comportamentos desordeiros no seu terreno."/>
<check_box label="Mostrar terreno nos resultados de busca (L$30/semana)" name="ShowDirectoryCheck" tool_tip="Permitir que as pessoas vejam este terreno nos resultados de busca"/>
- <combo_box name="land category with adult">
- <combo_box.item label="Qualquer categoria" name="item0"/>
- <combo_box.item label="Locação Linden" name="item1"/>
- <combo_box.item label="Adulto" name="item2"/>
- <combo_box.item label="Artes e cultura" name="item3"/>
- <combo_box.item label="Negócios" name="item4"/>
- <combo_box.item label="Educacional" name="item5"/>
- <combo_box.item label="Jogos" name="item6"/>
- <combo_box.item label="Moradia" name="item7"/>
- <combo_box.item label="Amigável a novos usuários" name="item8"/>
- <combo_box.item label="Parques &amp; Natureza" name="item9"/>
- <combo_box.item label="Residencial" name="item10"/>
- <combo_box.item label="Compras" name="item11"/>
- <combo_box.item label="Aluguel" name="item13"/>
- <combo_box.item label="Outros" name="item12"/>
- </combo_box>
<combo_box name="land category">
<combo_box.item label="Qualquer categoria" name="item0"/>
<combo_box.item label="Locação Linden" name="item1"/>
@@ -451,15 +432,9 @@ Mídia:
<panel.string name="access_estate_defined">
(Definições do terreno)
</panel.string>
- <panel.string name="allow_public_access">
- Acesso para público: [MATURITY]) (Desmarcar esse item cria limites)
- </panel.string>
<panel.string name="estate_override">
Uma ou mais destas opções está definida no nível de propriedade.
</panel.string>
- <text name="Limit access to this parcel to:">
- Acesso a este lote
- </text>
<check_box label="Permitir acesso público (Desmarcar esse item cria limites)" name="public_access"/>
<text name="Only Allow">
Permitir acesso apenas para residentes que:
@@ -491,5 +466,6 @@ Mídia:
<button label="Tirar" label_selected="Tirar" name="remove_banned"/>
</panel>
</panel>
+ <panel label="EXPERIÊNCIAS" name="land_experiences_panel"/>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_associate_listing.xml b/indra/newview/skins/default/xui/pt/floater_associate_listing.xml
new file mode 100644
index 0000000000..1fac5643b0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_associate_listing.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="associate listing" title="ASSOCIAR LISTAGEM">
+ <text name="message">ID de listagem:</text>
+ <line_editor name="listing_id">Digite a ID aqui</line_editor>
+ <button label="OK" name="OK"/>
+ <button label="Cancelar" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_edit_hover_height.xml b/indra/newview/skins/default/xui/pt/floater_edit_hover_height.xml
new file mode 100644
index 0000000000..163ab440ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_edit_hover_height.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="HoverHeight" title="DEFINIR ALTURA DE FOCO">
+ <slider label="Altura" name="HoverHeightSlider"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_experience_search.xml b/indra/newview/skins/default/xui/pt/floater_experience_search.xml
new file mode 100644
index 0000000000..cf87717b45
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_experience_search.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="experiencepicker" title="ESCOLHER EXPERIÊNCIA"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_experienceprofile.xml b/indra/newview/skins/default/xui/pt/floater_experienceprofile.xml
new file mode 100644
index 0000000000..97f8576b16
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_experienceprofile.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater title="EXPERIENCE PROFILE">
+ <floater.string name="empty_slurl">
+ (none)
+ </floater.string>
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Light&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Light&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Light&quot;
+ </floater.string>
+ <text name="edit_title" value="Perfil de experiência"/>
+ <tab_container name="tab_container">
+ <panel name="panel_experience_info">
+ <scroll_container name="xp_scroll">
+ <panel name="scrolling_panel">
+ <layout_stack>
+ <layout_panel name="top panel">
+ <button label="Editar" name="edit_btn"/>
+ </layout_panel>
+ <layout_panel name="maturity panel">
+ <text name="ContentRating">
+ Classificação:
+ </text>
+ </layout_panel>
+ <layout_panel name="location panel">
+ <text name="Location">
+ Localização:
+ </text>
+ </layout_panel>
+ <layout_panel>
+ <text name="Owner">
+ Proprietário:
+ </text>
+ </layout_panel>
+ <layout_panel name="group_panel">
+ <text name="Group">
+ Grupo:
+ </text>
+ </layout_panel>
+ <layout_panel name="perm panel">
+ <button label="Permitir" name="allow_btn"/>
+ <button label="Ignorar" name="forget_btn"/>
+ <button label="Bloquear" name="block_btn"/>
+ <text name="privileged">
+ Essa experiência está disponível para todos os residentes.
+ </text>
+ <button label="Denunciar abuso" name="report_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ </panel>
+ <panel name="edit_panel_experience_info">
+ <scroll_container name="edit_xp_scroll">
+ <panel name="edit_scrolling_panel">
+ <text name="edit_experience_title_label" value="Nome:"/>
+ <text name="edit_experience_desc_label" value="Descrição:"/>
+ <button label="Grupo" name="Group_btn"/>
+ <text name="edit_ContentRating">
+ Classificação:
+ </text>
+ <icons_combo_box label="Moderado" name="edit_ContentRatingText" tool_tip="Aumentar a classificação de maturidade sobre uma experiência redefinirá a permissão para todos os residentes que permitiram a experiência.">
+ <icons_combo_box.item label="Adulto" name="Adult" value="42"/>
+ <icons_combo_box.item label="Moderado" name="Mature" value="21"/>
+ <icons_combo_box.item label="Geral" name="PG" value="13"/>
+ </icons_combo_box>
+ <text name="edit_Location">
+ Localização:
+ </text>
+ <button label="Definir como atual" name="location_btn"/>
+ <button label="Limpar localização" name="clear_btn"/>
+ <check_box label="Ativar experiência" name="edit_enable_btn" tool_tip=""/>
+ <check_box label="Ocultar nos resultados de pesquisa" name="edit_private_btn"/>
+ <text name="changes" value="As alterações de experiência podem levar vários minutos para ser visualizadas em todas as regiões."/>
+ <button label="Retornar" name="cancel_btn"/>
+ <button label="Salvar" name="save_btn"/>
+ </panel>
+ </scroll_container>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_experiences.xml b/indra/newview/skins/default/xui/pt/floater_experiences.xml
new file mode 100644
index 0000000000..53be98e3f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_experiences.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_experiences" title="EXPERIÊNCIAS"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_facebook.xml b/indra/newview/skins/default/xui/pt/floater_facebook.xml
index c211d75e9b..af30582237 100644
--- a/indra/newview/skins/default/xui/pt/floater_facebook.xml
+++ b/indra/newview/skins/default/xui/pt/floater_facebook.xml
@@ -1,20 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_facebook" title="PUBLICAR NO FACEBOOK">
- <panel name="background">
- <tab_container name="tabs">
- <panel label="STATUS" name="panel_facebook_status"/>
- <panel label="FOTO" name="panel_facebook_photo"/>
- <panel label="FAZER CHECK IN" name="panel_facebook_place"/>
- <panel label="AMIGOS" name="panel_facebook_friends"/>
- <panel label="CONTA" name="panel_facebook_account"/>
- </tab_container>
- <panel name="connection_status_panel">
- <text name="connection_error_text">
- Erro
- </text>
- <text name="connection_loading_text">
- Carregando...
- </text>
- </panel>
- </panel>
+ <tab_container name="tabs">
+ <panel label="STATUS" name="panel_facebook_status"/>
+ <panel label="FOTO" name="panel_facebook_photo"/>
+ <panel label="FAZER CHECK IN" name="panel_facebook_place"/>
+ <panel label="AMIGOS" name="panel_facebook_friends"/>
+ </tab_container>
+ <text name="connection_error_text">
+ Erro
+ </text>
+ <text name="connection_loading_text">
+ Carregando...
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml
index 8a8f1f5b34..5f04c08531 100755
--- a/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml
@@ -1,67 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="item properties" title="PROPRIEDADES DE ITEM NO INVENTÁRIO">
- <floater.string name="unknown">
- (desconhecido)
- </floater.string>
- <floater.string name="public">
- (público)
- </floater.string>
- <floater.string name="you_can">
- Você pode:
- </floater.string>
- <floater.string name="owner_can">
- Proprietário pode :
- </floater.string>
- <floater.string name="acquiredDate">
- [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
- </floater.string>
- <text name="LabelItemNameTitle">
- Nome:
- </text>
- <text name="LabelItemDescTitle">
- Descrição:
- </text>
- <text name="LabelCreatorTitle">
- Criador:
- </text>
+ <floater.string name="unknown">(desconhecido)</floater.string>
+ <floater.string name="public">(público)</floater.string>
+ <floater.string name="you_can">Você pode:</floater.string>
+ <floater.string name="owner_can">Proprietário pode :</floater.string>
+ <floater.string name="acquiredDate">[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]</floater.string>
+ <text name="LabelItemNameTitle">Nome:</text>
+ <text name="LabelItemDescTitle">Descrição:</text>
+ <text name="LabelCreatorTitle">Criador:</text>
<button label="Perfil..." label_selected="" name="BtnCreator"/>
- <text name="LabelOwnerTitle">
- Dono:
- </text>
+ <text name="LabelOwnerTitle">Dono:</text>
<button label="Perfil..." label_selected="" name="BtnOwner"/>
- <text name="LabelAcquiredTitle">
- Adquirido:
- </text>
- <text name="LabelAcquiredDate">
- Qua Mai 24 12:50:46 2006
- </text>
- <text name="OwnerLabel">
- Você:
- </text>
+ <text name="LabelAcquiredTitle">Adquirido:</text>
+ <text name="LabelAcquiredDate">Qua Mai 24 12:50:46 2006</text>
+ <text name="OwnerLabel">Você:</text>
<check_box label="Editar" name="CheckOwnerModify"/>
<check_box label="Copiar" name="CheckOwnerCopy"/>
<check_box label="Revender" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">
- Todos:
- </text>
+ <text name="AnyoneLabel">Todos:</text>
<check_box label="Cortar" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">
- Grupo:
- </text>
+ <text name="GroupLabel">Grupo:</text>
<check_box label="Compartilhar" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel" width="230">
- Próximo proprietário:
- </text>
+ <text name="NextOwnerLabel" width="230">Próximo proprietário:</text>
<check_box label="Editar" name="CheckNextOwnerModify"/>
<check_box label="Copiar" name="CheckNextOwnerCopy"/>
<check_box label="Revender" name="CheckNextOwnerTransfer"/>
<check_box label="À venda" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
+ <combo_box name="ComboBoxSaleType">
<combo_box.item label="Cortar" name="Copy"/>
+ <combo_box.item label="Conteúdo" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
<spinner label="Preço:" name="Edit Cost"/>
- <text name="CurrencySymbol">
- L$
- </text>
+ <text name="CurrencySymbol">L$</text>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml
index 71759abdc2..2bb95a5605 100755
--- a/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml
@@ -5,8 +5,8 @@
<check_box label="Roupas" name="check_clothing"/>
<check_box label="Gestos" name="check_gesture"/>
<check_box label="Landmarks" name="check_landmark"/>
- <check_box label="Meshes:" name="check_mesh"/>
<check_box label="Anotações" name="check_notecard"/>
+ <check_box label="Meshes:" name="check_mesh"/>
<check_box label="Objetos" name="check_object"/>
<check_box label="Scripts" name="check_script"/>
<check_box label="Sons" name="check_sound"/>
@@ -19,6 +19,10 @@
<text name="- OR -">
- OU -
</text>
+ <radio_group name="date_search_direction">
+ <radio_item label="Antes de" name="newer"/>
+ <radio_item label="Depois de" name="older"/>
+ </radio_group>
<spinner label="Horas Atrás" name="spin_hours_ago"/>
<spinner label="Dias Atrás" name="spin_days_ago"/>
<button label="Fechar" label_selected="Fechar" name="Close"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_item_properties.xml b/indra/newview/skins/default/xui/pt/floater_item_properties.xml
new file mode 100644
index 0000000000..400196c3c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_item_properties.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Item Properties" title="PROPRIEDADES DO ITEM"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_lagmeter.xml b/indra/newview/skins/default/xui/pt/floater_lagmeter.xml
index 9932318293..cdaec96c86 100644
--- a/indra/newview/skins/default/xui/pt/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/pt/floater_lagmeter.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_lagmeter" title="LAG - Índice">
<floater.string name="max_title_msg">
- Medidor de Atraso
+ Lag Meter
</floater.string>
<floater.string name="max_width_px">
360
</floater.string>
<floater.string name="min_title_msg">
- Atraso
+ Lag
</floater.string>
<floater.string name="min_width_px">
90
@@ -22,28 +22,28 @@
15
</floater.string>
<floater.string name="client_frame_time_window_bg_msg">
- Normal, janela por baixo
+ Normal, janela em segundo plano
</floater.string>
<floater.string name="client_frame_time_critical_msg">
- Taxa de quadros do Cliente abaixo de [CLIENT_FRAME_RATE_CRITICAL]
+ Taxa de quadros do cliente menor que [CLIENT_FRAME_RATE_CRITICAL]
</floater.string>
<floater.string name="client_frame_time_warning_msg">
- Taxa de quadros do Cliente entre [CLIENT_FRAME_RATE_CRITICAL] e [CLIENT_FRAME_RATE_WARNING]
+ Taxa de quadros do cliente entre [CLIENT_FRAME_RATE_CRITICAL] e [CLIENT_FRAME_RATE_WARNING]
</floater.string>
<floater.string name="client_frame_time_normal_msg">
Normal
</floater.string>
<floater.string name="client_draw_distance_cause_msg">
- Causa possível: Distância de desenho ajustada muito alta
+ Possível causa: distância de desenho definida com um valor muito alto
</floater.string>
<floater.string name="client_texture_loading_cause_msg">
- Causa possível: Carregamento de Imagens
+ Possível causa: imagens em carregamento
</floater.string>
<floater.string name="client_texture_memory_cause_msg">
- Causa possível: Muitas imagens na memória
+ Possível causa: muitas imagens na memória
</floater.string>
<floater.string name="client_complex_objects_cause_msg">
- Causa possível: Muitos objetos complexos na cena
+ Possível causa: muitos objetos complexos na cena
</floater.string>
<floater.string name="network_text_msg">
Rede
@@ -55,10 +55,10 @@
5
</floater.string>
<floater.string name="network_packet_loss_critical_msg">
- Conexão está caindo para cerca de [NETWORK_PACKET_LOSS_CRITICAL]% de pacotes
+ A conexão está caindo devido a [NETWORK_PACKET_LOSS_CRITICAL]% de pacotes
</floater.string>
<floater.string name="network_packet_loss_warning_msg">
- Conexão está caindo [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% de pacotes
+ A conexão está caindo devido a [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% de pacotes
</floater.string>
<floater.string name="network_performance_normal_msg">
Normal
@@ -70,16 +70,16 @@
300
</floater.string>
<floater.string name="network_ping_critical_msg">
- Tempo de conexão de ping é cerca de [NETWORK_PING_CRITICAL] ms
+ Ping time da conexão com mais de [NETWORK_PING_CRITICAL] ms
</floater.string>
<floater.string name="network_ping_warning_msg">
- Tempo de conexão de ping é [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
+ Ping time da conexão com mais de [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
</floater.string>
<floater.string name="network_packet_loss_cause_msg">
- Possível conexão ruim ou &apos;Largura de Banda&apos; escolhida muito alta.
+ Possível conexão ruim ou pref de &apos;Banda larga&apos; muito alta
</floater.string>
<floater.string name="network_ping_cause_msg">
- Possível conexão ruim ou aplicativos compartilhando arquivos.
+ Possível conexão ruim ou app de compartilhamento de arquivo
</floater.string>
<floater.string name="server_text_msg">
Servidor
@@ -94,31 +94,31 @@
20
</floater.string>
<floater.string name="server_frame_time_critical_msg">
- Taxa de quadros abaixo de [SERVER_FRAME_RATE_CRITICAL]
+ Taxa de quadros de simulador abaixo de [SERVER_FRAME_RATE_CRITICAL]
</floater.string>
<floater.string name="server_frame_time_warning_msg">
- Taxa de quadros entre [SERVER_FRAME_RATE_CRITICAL] e [SERVER_FRAME_RATE_WARNING]
+ Taxa de quadros de simulador entre [SERVER_FRAME_RATE_CRITICAL] e [SERVER_FRAME_RATE_WARNING]
</floater.string>
<floater.string name="server_frame_time_normal_msg">
Normal
</floater.string>
<floater.string name="server_physics_cause_msg">
- Causa possível: Muitos objetos físicos
+ Possível causa: muitos objetos físicos
</floater.string>
<floater.string name="server_scripts_cause_msg">
- Causa possível: Muitos objetos com scripts
+ Possível causa: muitos objetos de script
</floater.string>
<floater.string name="server_net_cause_msg">
- Causa possível: Muito tráfego na rede
+ Possível causa: tráfego de rede intenso
</floater.string>
<floater.string name="server_agent_cause_msg">
- Causa possível: Muitas pessoas se movendo na região
+ Possível causa: muitas pessoas se movendo na região
</floater.string>
<floater.string name="server_images_cause_msg">
- Causa possível: Muitos cálculos de imagem
+ Possível causa: muitos cálculos de imagem
</floater.string>
<floater.string name="server_generic_cause_msg">
- Causa possível: Carga no simulador muito pesada
+ Possível causa: carga do simulador muito pesada
</floater.string>
<floater.string name="smaller_label">
&gt;&gt;
@@ -126,7 +126,7 @@
<floater.string name="bigger_label">
&lt;&lt;
</floater.string>
- <button label="" label_selected="" name="client_lagmeter" tool_tip="Status de atraso no Cliente"/>
+ <button label="" label_selected="" name="client_lagmeter" tool_tip="Status do lag do cliente"/>
<text name="client">
Cliente
</text>
@@ -134,7 +134,7 @@
Normal
</text>
<text left="30" name="client_lag_cause" right="-10"/>
- <button label="" label_selected="" name="network_lagmeter" tool_tip="Status de atraso na rede"/>
+ <button label="" label_selected="" name="network_lagmeter" tool_tip="Status do lag da rede"/>
<text name="network">
Rede
</text>
@@ -142,7 +142,7 @@
Normal
</text>
<text left="30" name="network_lag_cause" right="-10"/>
- <button label="" label_selected="" name="server_lagmeter" tool_tip="Status de atraso no servidor"/>
+ <button label="" label_selected="" name="server_lagmeter" tool_tip="Status do lag do servidor"/>
<text name="server">
Servidor
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml
index 5ad116ac8a..635bc2d34b 100755
--- a/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml
@@ -9,7 +9,24 @@
<floater.string name="Title">
SCRIPT: [NAME]
</floater.string>
+ <floater.string name="experience_enabled">
+ Desmarque para remover a experiência atual
+ </floater.string>
+ <floater.string name="no_experiences">
+ Você não está autorizado a nenhuma experiência
+ </floater.string>
+ <floater.string name="add_experiences">
+ Selecione para adicionar uma experiência
+ </floater.string>
+ <floater.string name="show_experience_profile">
+ Clique para visualizar o perfil da experiência
+ </floater.string>
+ <floater.string name="loading">
+ Carregando...
+ </floater.string>
<button label="Resetar" label_selected="Resetar" name="Reset"/>
<check_box initial_value="true" label="Correndo" name="running"/>
<check_box initial_value="true" label="Mono" left="86" name="mono"/>
+ <check_box label="Usar experiência:" name="enable_xp"/>
+ <button label="&gt;" name="view_profile"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_marketplace_listings.xml b/indra/newview/skins/default/xui/pt/floater_marketplace_listings.xml
new file mode 100644
index 0000000000..fa4ac50ab0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_marketplace_listings.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_listings" title="LISTAGENS DO MARKETPLACE">
+ <panel name="marketplace_listings_panel">
+ <panel>
+ <panel name="marketplace_listings_inventory_placeholder_panel">
+ <text name="marketplace_listings_inventory_placeholder_title">Carregando...</text>
+ </panel>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_marketplace_validation.xml b/indra/newview/skins/default/xui/pt/floater_marketplace_validation.xml
new file mode 100644
index 0000000000..39e59a687f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_marketplace_validation.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_validation" title="Auditar Listagens do Marketplace">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <text_editor name="validation_text">MARKETPLACE_VALIDATION_TEXT</text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_openobject.xml b/indra/newview/skins/default/xui/pt/floater_openobject.xml
index 0dc2852bac..e8b72700c9 100755
--- a/indra/newview/skins/default/xui/pt/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/pt/floater_openobject.xml
@@ -3,6 +3,11 @@
<text name="object_name">
[DESC]:
</text>
- <button label="Copiar para Inventário" label_selected="Copiar para Inventário" name="copy_to_inventory_button" width="132"/>
- <button label="Copiar e Vestir" label_selected="Copiar e Vestir" left="152" name="copy_and_wear_button"/>
+ <text name="border_note">
+ Copiar para inventário e vestir
+ </text>
+ <button label="Adicionar ao look" label_selected="Adicionar ao look" left="152" name="copy_and_wear_button"/>
+ <button label="Substituir look" label_selected="Substituir look" name="copy_and_replace_button"/>
+ <button label="Apenas copiar para inventário" label_selected="Apenas copiar para inventário" name="copy_to_inventory_button" width="132"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel_button"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_pay.xml b/indra/newview/skins/default/xui/pt/floater_pay.xml
index 8094ad376c..77e814b575 100755
--- a/indra/newview/skins/default/xui/pt/floater_pay.xml
+++ b/indra/newview/skins/default/xui/pt/floater_pay.xml
@@ -1,25 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <string name="payee_group">
- Pagar grupo
- </string>
- <string name="payee_resident">
- Pagar residente
- </string>
- <text left="5" name="payee_label">
- Pagar:
- </text>
- <icon name="icon_person" tool_tip="Pessoa"/>
- <text name="payee_name">
- Test Name That Is Extremely Long To Check Clipping
- </text>
- <button label="L$1" label_selected="L$1" name="fastpay 1"/>
- <button label="L$5" label_selected="L$5" name="fastpay 5"/>
- <button label="L$10" label_selected="L$10" name="fastpay 10"/>
- <button label="L$20" label_selected="L$20" name="fastpay 20"/>
- <text name="amount text">
- Outro valor:
- </text>
- <button label="Pagar" label_selected="Pagar" name="pay btn"/>
- <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
+ <string name="payee_group">Pagar grupo</string>
+ <string name="payee_resident">Pagar residente</string>
+ <text name="paying_text">Você está pagando:</text>
+ <text name="payee_name">Test Name That Is Extremely Long To Check Clipping</text>
+ <panel label="Buscar" name="PatternsPanel">
+ <button label="Pagar L$ 1" label_selected="Pagar L$ 1" name="fastpay 1"/>
+ <button label="Pagar L$ 5" label_selected="Pagar L$ 5" name="fastpay 5"/>
+ <button label="Pagar L$ 10" label_selected="Pagar L$ 10" name="fastpay 10"/>
+ <button label="Pagar L$ 20" label_selected="Pagar L$ 20" name="fastpay 20"/>
+ </panel>
+ <panel label="Buscar" name="InputPanel">
+ <text name="amount text">Outro valor:</text>
+ <button label="Pagar" label_selected="Pagar" name="pay btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_pay_object.xml b/indra/newview/skins/default/xui/pt/floater_pay_object.xml
index a5579f03bf..4f7fa6ca67 100755
--- a/indra/newview/skins/default/xui/pt/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/pt/floater_pay_object.xml
@@ -1,30 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <string halign="left" name="payee_group" width="100">
- Pagar grupo
- </string>
- <string halign="left" name="payee_resident" width="120">
- Pagar residente
- </string>
- <icon name="icon_person" tool_tip="Pessoa"/>
- <text left="105" name="payee_name">
- Ericacita Moostopolison
- </text>
- <text halign="left" left="5" name="object_name_label" width="95">
- Via objeto:
- </text>
+ <string halign="left" name="payee_group" width="100">Pagar grupo</string>
+ <string halign="left" name="payee_resident" width="120">Pagar residente</string>
+ <text name="paying_text">Você está pagando:</text>
+ <text left="105" name="payee_name">Ericacita Moostopolison</text>
+ <text halign="left" left="5" name="object_name_label" width="95">Via objeto:</text>
<icon name="icon_object" tool_tip="Objects"/>
- <text left="105" name="object_name_text">
- Meu objeto maravilho, fantástico e com nome comprido e imaginativo
- </text>
- <button label="L$1" label_selected="L$1" left="125" name="fastpay 1" width="70"/>
- <button label="L$5" label_selected="L$5" left="200" name="fastpay 5" width="70"/>
- <button label="L$10" label_selected="L$10" left="125" name="fastpay 10" width="70"/>
- <button label="L$20" label_selected="L$20" left="200" name="fastpay 20" width="70"/>
- <text halign="left" left="5" name="amount text">
- Outro valor:
- </text>
- <line_editor left="60" name="amount" width="50"/>
- <button label="Pagar" label_selected="Pagar" name="pay btn"/>
- <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
+ <text left="105" name="object_name_text">Meu objeto maravilho, fantástico e com nome comprido e imaginativo</text>
+ <panel label="Buscar" name="PatternsPanel">
+ <button label="Pagar L$ 1" label_selected="Pagar L$ 1" name="fastpay 1"/>
+ <button label="Pagar L$ 5" label_selected="Pagar L$ 5" name="fastpay 5"/>
+ <button label="Pagar L$ 10" label_selected="Pagar L$ 10" name="fastpay 10"/>
+ <button label="Pagar L$ 20" label_selected="Pagar L$ 20" name="fastpay 20"/>
+ </panel>
+ <panel label="Buscar" name="InputPanel">
+ <text name="amount text">Outro valor:</text>
+ <button label="Pagar" label_selected="Pagar" name="pay btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_report_abuse.xml b/indra/newview/skins/default/xui/pt/floater_report_abuse.xml
index e6d9961d0b..f30201fc33 100755
--- a/indra/newview/skins/default/xui/pt/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/pt/floater_report_abuse.xml
@@ -76,7 +76,7 @@
<combo_box.item label="Terreno &gt; Invasão &gt; Objetos ou texturas" name="Land__Encroachment__Objects_textures"/>
<combo_box.item label="Terra &gt; Invasão &gt; Partículas" name="Land__Encroachment__Particles"/>
<combo_box.item label="Terra &gt; Violação &gt; Árvores/plantas" name="Land__Encroachment__Trees_plants"/>
- <combo_box.item label="Apostas ou jogos de azar" name="Wagering_gambling"/>
+ <combo_box.item label="Violação da política sobre jogos" name="Wagering_gambling"/>
<combo_box.item label="Outro" name="Other"/>
</combo_box>
<text name="abuser_name_title">
diff --git a/indra/newview/skins/default/xui/pt/floater_snapshot.xml b/indra/newview/skins/default/xui/pt/floater_snapshot.xml
index 3dd7f69d50..e3812ed708 100755
--- a/indra/newview/skins/default/xui/pt/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/pt/floater_snapshot.xml
@@ -39,17 +39,8 @@
<string name="local_failed_str">
Falha ao salvar no computador.
</string>
- <button name="advanced_options_btn" tool_tip="Opções avançadas"/>
- <text name="image_res_text">
- [WIDTH] x [HEIGHT] px
- </text>
- <text name="file_size_label">
- [TAMANHO] KB
- </text>
+ <button label="ATUALIZAR" name="new_snapshot_btn"/>
<panel name="advanced_options_panel">
- <text name="advanced_options_label">
- OPÇÕES AVANÇADAS
- </text>
<text name="layer_type_label">
Capturar:
</text>
@@ -68,4 +59,10 @@
<combo_box.item label="Sem filtro" name="NoFilter"/>
</combo_box>
</panel>
+ <text name="image_res_text">
+ [WIDTH]px (largura) x [HEIGHT]px (altura)
+ </text>
+ <text name="file_size_label">
+ [TAMANHO] KB
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_top_objects.xml b/indra/newview/skins/default/xui/pt/floater_top_objects.xml
index ef682714c6..f37b5be23f 100755
--- a/indra/newview/skins/default/xui/pt/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/pt/floater_top_objects.xml
@@ -21,6 +21,12 @@
<floater.string name="none_descriptor">
Nenhum encontrado.
</floater.string>
+ <floater.string name="URLs">
+ URLs
+ </floater.string>
+ <floater.string name="memory">
+ Memória (KB)
+ </floater.string>
<text name="title_text">
Carregando...
</text>
@@ -30,7 +36,7 @@
<scroll_list.columns label="Proprietário" name="owner"/>
<scroll_list.columns label="Local" name="location"/>
<scroll_list.columns label="Lote" name="parcel"/>
- <scroll_list.columns label="Tempo" name="time"/>
+ <scroll_list.columns label="Data" name="time"/>
<scroll_list.columns label="URLs" name="URLs"/>
<scroll_list.columns label="Memória (KB)" name="memory"/>
</scroll_list>
diff --git a/indra/newview/skins/default/xui/pt/floater_twitter.xml b/indra/newview/skins/default/xui/pt/floater_twitter.xml
index 4d7f9e323c..14bee3ffc3 100644
--- a/indra/newview/skins/default/xui/pt/floater_twitter.xml
+++ b/indra/newview/skins/default/xui/pt/floater_twitter.xml
@@ -1,17 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_twitter" title="TWITTER">
- <panel name="background">
- <tab_container name="tabs">
- <panel label="REDIGIR" name="panel_twitter_photo"/>
- <panel label="CONTA" name="panel_twitter_account"/>
- </tab_container>
- <panel name="connection_status_panel">
- <text name="connection_error_text">
- Erro
- </text>
- <text name="connection_loading_text">
- Carregando...
- </text>
- </panel>
- </panel>
+ <tab_container name="tabs">
+ <panel label="REDIGIR" name="panel_twitter_photo"/>
+ <panel label="CONTA" name="panel_twitter_account"/>
+ </tab_container>
+ <text name="connection_error_text">
+ Erro
+ </text>
+ <text name="connection_loading_text">
+ Carregando...
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/menu_attachment_self.xml b/indra/newview/skins/default/xui/pt/menu_attachment_self.xml
index 2d4cd670e6..ac79422110 100755
--- a/indra/newview/skins/default/xui/pt/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/pt/menu_attachment_self.xml
@@ -8,6 +8,7 @@
<menu_item_call label="Minha aparência" name="Change Outfit"/>
<menu_item_call label="Editar meu look" name="Edit Outfit"/>
<menu_item_call label="Editar meu corpo" name="Edit My Shape"/>
+ <menu_item_call label="Altura de foco" name="Hover Height"/>
<menu_item_call label="Meus amigos" name="Friends..."/>
<menu_item_call label="Meus grupos" name="Groups..."/>
<menu_item_call label="Meu perfil" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/pt/menu_avatar_self.xml b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml
index 447b77657b..a0ac71e018 100755
--- a/indra/newview/skins/default/xui/pt/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Minha aparência" name="Chenge Outfit"/>
<menu_item_call label="Editar meu look" name="Edit Outfit"/>
<menu_item_call label="Editar meu corpo" name="Edit My Shape"/>
+ <menu_item_call label="Altura de foco" name="Hover Height"/>
<menu_item_call label="Meus amigos" name="Friends..."/>
<menu_item_call label="Meus grupos" name="Groups..."/>
<menu_item_call label="Meu perfil" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/pt/menu_inventory.xml b/indra/newview/skins/default/xui/pt/menu_inventory.xml
index 636b356c8b..79261ceb1f 100755
--- a/indra/newview/skins/default/xui/pt/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/menu_inventory.xml
@@ -1,5 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
+ <menu_item_call label="Criar listagem" name="Marketplace Create Listing"/>
+ <menu_item_call label="Associar listagem" name="Marketplace Associate Listing"/>
+ <menu_item_call label="Obter listagem (Atualizar)" name="Marketplace Get Listing"/>
+ <menu_item_call label="Verificar erros" name="Marketplace Check Listing"/>
+ <menu_item_call label="Editar listagem" name="Marketplace Edit Listing"/>
+ <menu_item_call label="Listar" name="Marketplace List"/>
+ <menu_item_call label="Parar de oferecer" name="Marketplace Unlist"/>
+ <menu_item_call label="Ativar" name="Marketplace Activate"/>
+ <menu_item_call label="Desativar" name="Marketplace Deactivate"/>
<menu_item_call label="Compartilhar" name="Share"/>
<menu_item_call label="Comprar" name="Task Buy"/>
<menu_item_call label="Abrir" name="Task Open"/>
@@ -87,6 +96,7 @@
<menu_item_call label="Adicionar" name="Wearable Add"/>
<menu_item_call label="Tirar" name="Take Off"/>
<menu_item_call label="Copiar para Caixa de saída do lojista" name="Merchant Copy"/>
- <menu_item_call label="Enviar para Mercado" name="Marketplace Send"/>
+ <menu_item_call label="Copiar para Listagens do Marketplace" name="Marketplace Copy"/>
+ <menu_item_call label="Mover para Listagens do Marketplace" name="Marketplace Move"/>
<menu_item_call label="--Sem opções--" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml
index 6faea517fe..d3e6534912 100755
--- a/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml
@@ -5,7 +5,7 @@
<menu_item_check label="Ordenar por mais recente" name="sort_by_recent"/>
<menu_item_check label="Sempre ordenar pastas por nome" name="sort_folders_by_name"/>
<menu_item_check label="Pastas do sistema no topo" name="sort_system_folders_to_top"/>
- <menu_item_call label="Mostrar filtros" name="show_filters"/>
+ <menu_item_call label="Mostrar filtros..." name="show_filters"/>
<menu_item_call label="Restabelecer filtros" name="reset_filters"/>
<menu_item_call label="Fechar todas as pastas" name="close_folders"/>
<menu_item_call label="Esvaziar achados e perdidos" name="empty_lostnfound"/>
diff --git a/indra/newview/skins/default/xui/pt/menu_marketplace_view.xml b/indra/newview/skins/default/xui/pt/menu_marketplace_view.xml
new file mode 100644
index 0000000000..2236df5c87
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_marketplace_view.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_marketplace_sort">
+ <menu_item_check label="Ordenar por quantidade em estoque stock (baixo a alto)" name="sort_by_stock_amount"/>
+ <menu_item_check label="Exibir apenas pastas da listagem" name="show_only_listing_folders"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_experience.xml b/indra/newview/skins/default/xui/pt/menu_url_experience.xml
new file mode 100644
index 0000000000..1bbc27f267
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_experience.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml
index 0bbb9683a0..3d5d9eccc6 100755
--- a/indra/newview/skins/default/xui/pt/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml
@@ -8,13 +8,14 @@
<menu_item_call label="Nova janela de inventário" name="NewInventoryWindow"/>
<menu_item_call label="Lugares..." name="Places"/>
<menu_item_call label="Destaques..." name="Picks"/>
+ <menu_item_call label="Experiências..." name="Experiences"/>
<menu_item_call label="Controles da câmera..." name="Camera Controls"/>
<menu label="Movimentos" name="Movement">
<menu_item_call label="Sentar" name="Sit Down Here"/>
<menu_item_check label="Voar" name="Fly"/>
<menu_item_check label="Correr sempre" name="Always Run"/>
<menu_item_call label="Parar minha animação" name="Stop Animating My Avatar"/>
- <menu_item_call label="Andar/correr/voar..." name="Walk / run / fly"/>
+ <menu_item_call label="Andar/correr/voar..." name="WalkRunFly"/>
</menu>
<menu label="Status" name="Status">
<menu_item_check label="Ausente" name="Away"/>
@@ -22,6 +23,7 @@
</menu>
<menu_item_call label="Comprar L$..." name="Buy and Sell L$"/>
<menu_item_call label="Caixa de saída do lojista..." name="MerchantOutbox"/>
+ <menu_item_call label="Listagens do Marketplace..." name="MarketplaceListings"/>
<menu_item_call label="Painel da conta..." name="Manage My Account">
<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=pt"/>
</menu_item_call>
@@ -48,7 +50,7 @@
<menu_item_check label="Amigos" name="My Friends"/>
<menu_item_check label="Grupos" name="My Groups"/>
<menu_item_check label="Pessoas próximas" name="Active Speakers"/>
- <menu_item_call label="Lista de bloqueados" name="Block List"/>
+ <menu_item_check label="Lista de bloqueados" name="Block List"/>
<menu_item_check label="Não perturbe" name="Do Not Disturb"/>
</menu>
<menu label="Mundo" name="World">
@@ -62,7 +64,7 @@
<menu_item_call label="Foto" name="Take Snapshot"/>
<menu_item_call label="Perfil da região" name="Place Profile"/>
<menu_item_call label="Sobre terrenos" name="About Land"/>
- <menu_item_call label="Região/Propriedade" name="Region/Estate"/>
+ <menu_item_call label="Região/Propriedade" name="RegionEstate"/>
<menu_item_call label="Meus terrenos..." name="My Land"/>
<menu_item_call label="Comprar este terreno" name="Buy Land"/>
<menu label="Mostrar" name="LandShow">
@@ -176,7 +178,7 @@
<menu_item_call label="Blogs do [SECOND_LIFE]" name="Second Life Blogs"/>
<menu_item_call label="Denunciar abuso" name="Report Abuse"/>
<menu_item_call label="Relatar bug" name="Report Bug"/>
- <menu_item_call label="Empurrões, trombadas e tapas" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu_item_call label="Bumps, Pushes &amp; Hits" name="Bumps, Pushes &amp;amp; Hits"/>
<menu_item_call label="Sobre [APP_NAME]" name="About Second Life"/>
</menu>
<menu label="Avançado" name="Advanced">
@@ -249,6 +251,7 @@
<menu_item_check label="Painel de textura" name="Texture Console"/>
<menu_item_check label="Console de depuração" name="Debug Console"/>
<menu_item_call label="Painel de avisos" name="Notifications"/>
+ <menu_item_check label="Console de depuração de região" name="Region Debug Console"/>
<menu_item_check label="Tempos" name="Fast Timers"/>
<menu_item_check label="Memória" name="Memory"/>
<menu_item_check label="Estatísticas da cena" name="Scene Statistics"/>
@@ -324,7 +327,7 @@
<menu label="Rede" name="Network">
<menu_item_check label="Pausar avatar" name="AgentPause"/>
<menu_item_call label="Drop a Packet" name="Drop a Packet"/>
- </menu>
+ </menu>
<menu label="Mundo" name="DevelopWorld">
<menu_item_check label="Impor sobre sol de simulação" name="Sim Sun Override"/>
<menu_item_check label="Clima fixo" name="Fixed Weather"/>
diff --git a/indra/newview/skins/default/xui/pt/mime_types.xml b/indra/newview/skins/default/xui/pt/mime_types.xml
index f9c0496eea..be387088bd 100755
--- a/indra/newview/skins/default/xui/pt/mime_types.xml
+++ b/indra/newview/skins/default/xui/pt/mime_types.xml
@@ -24,10 +24,10 @@
</widgetset>
<widgetset name="none">
<label name="none_label">
- Sem conteúdo disponível
+ Sem conteúdo
</label>
<tooltip name="none_tooltip">
- Não há mídia disponível aqui.
+ Sem mídia aqui
</tooltip>
</widgetset>
<widgetset name="image">
@@ -64,7 +64,7 @@
</mimetype>
<mimetype name="none/none">
<label name="none/none_label">
- - Nenhum -
+ - Nenhum -
</label>
</mimetype>
<mimetype name="audio/*">
diff --git a/indra/newview/skins/default/xui/pt/mime_types_linux.xml b/indra/newview/skins/default/xui/pt/mime_types_linux.xml
index 789843cbba..70dd03feab 100755
--- a/indra/newview/skins/default/xui/pt/mime_types_linux.xml
+++ b/indra/newview/skins/default/xui/pt/mime_types_linux.xml
@@ -44,6 +44,14 @@
Tocar clipe
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ Sem conteúdo
+ </label>
+ <tooltip name="none_tooltip">
+ Sem mídia aqui
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Stream em tempo real
diff --git a/indra/newview/skins/default/xui/pt/mime_types_mac.xml b/indra/newview/skins/default/xui/pt/mime_types_mac.xml
index 34b40e94ab..17cb5f7093 100755
--- a/indra/newview/skins/default/xui/pt/mime_types_mac.xml
+++ b/indra/newview/skins/default/xui/pt/mime_types_mac.xml
@@ -44,6 +44,14 @@
Tocar o áudio desta localização
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ Sem conteúdo
+ </label>
+ <tooltip name="none_tooltip">
+ Sem mídia aqui
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Real Time Streaming
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index 00c0b13670..a264495404 100755
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -72,6 +72,10 @@ Detalhes do erro: O aviso &apos;[_NAME]&apos; não foi localizado no arquivo not
[MESSAGE]
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sim"/>
</notification>
+ <notification name="GenericAlertOK">
+ [MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="BadInstallation">
Um erro ocorreu ao atualizar o [APP_NAME]. [http://get.secondlife.com Baixe a versão atual] do Visualizador.
<usetemplate name="okbutton" yestext="OK"/>
@@ -124,6 +128,88 @@ Nenhuma pasta foi enviada ao Marketplace devido a um erro do sistema ou da rede.
Ocorreu uma falha na inicialização do Marketplace devido a um erro do sistema ou da rede. Tente novamente mais tarde.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="StockPasteFailed">
+ Copiar ou mover para Pasta de estoque com falha com o erro:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantPasteFailed">
+ Copiar ou mover para Listagens do Marketplace com falha com o erro:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantTransactionFailed">
+ Ocorreu uma falha na transação com o Marketplace com o seguinte erro:
+
+ Motivo: &apos;[ERROR_REASON]&apos;
+ [ERROR_DESCRIPTION]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantUnprocessableEntity">
+ Não foi possível listar este produto ou ativar a pasta de versões. Geralmente, isso é causado por ausência de informações no formulário de descrição da listagem, mas pode ser causado por erros na estrutura de pastas. Edite a listagem ou verifique se há erros na pasta de listagem.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantListingFailed">
+ Falha ao listar no Marketplace com erro:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantFolderActivationFailed">
+ Falha ao ativar esta pasta de versões com erro:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantActiveChange">
+ Esta ação alterará o conteúdo ativo desta listagem. Deseja continuar?
+ <usetemplate ignoretext="Confirmar antes de alterar uma listagem ativa no Marketplace" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantMoveInventory">
+ Os itens arrastados para a janela Listagens do Marketplace são movidos de seus locais originais e não copiados. Deseja continuar?
+ <usetemplate ignoretext="Confirmar antes de mover um item do inventário para o Marketplace" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmListingCutOrDelete">
+ Mover ou excluir uma pasta de listagem excluirá sua listagem do Marketplace. Se você deseja manter a listagem do Marketplace, mova ou exclua o conteúdo da pasta de versões que você deseja modificar. Deseja continuar?
+ <usetemplate ignoretext="Confirmar antes de mover ou excluir uma listagem do Marketplace" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmCopyToMarketplace">
+ Você não tem permissão para copiar um ou mais deste itens para o Marketplace. Você pode movê-los ou deixá-los para trás.
+ <usetemplate canceltext="Cancelar" ignoretext="Confirmar antes de tentar copiar uma seleção que contenha itens de cópia proibida para o Marketplace" name="yesnocancelbuttons" notext="Não mover item(ns)" yestext="Mover item(ns)"/>
+ </notification>
+ <notification name="ConfirmMerchantUnlist">
+ Esta ação removerá esta listagem. Deseja continuar?
+ <usetemplate ignoretext="Confirmar antes de remover uma listagem ativa no Marketplace" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantClearVersion">
+ Esta ação desativará a pasta de versões da listagem atual. Deseja continuar?
+ <usetemplate ignoretext="Confirmar antes de desativar a pasta de versões de uma listagem no Marketplace" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantListingNotUpdated">
+ A listagem não pode ser atualizada.
+[[URL] Clique aqui] para editá-la no Marketplace.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantListingCannotWear">
+ Não é possível usar roupas ou partes do corpo que estejam na pasta Listagens do Marketplace.
+ </notification>
+ <notification name="AlertMerchantListingInvalidID">
+ ID de listagem inválida.
+ </notification>
+ <notification name="AlertMerchantListingActivateRequired">
+ Há várias pastas sem versão ou com várias versões nesta listagem. Você precisará selecionar e ativar uma delas separadamente mais tarde.
+ <usetemplate ignoretext="Alertar sobre a ativação da pasta de versões quando criar uma listagem com várias pastas de versões" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderSplit">
+ Separamos itens de estoque de tipos diferentes em pastas de estoque diferentes para que sua pasta fique organizada de maneira que possamos listá-la.
+ <usetemplate ignoretext="Alertar quando a pasta de estoque for dividida antes de ser listada" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderEmpty">
+ Removemos sua listagem porque o estoque está vazio. Você precisa adicionar mais unidades à pasta de estoque para que a listagem seja exibida novamente.
+ <usetemplate ignoretext="Alertar quando uma listagem não for listada porque a pasta de estoque está vazia" name="okignore" yestext="OK"/>
+ </notification>
<notification name="CompileQueueSaveText">
Houve um problema com o carregamento do texto para um script devido à seguinte razão: [REASON]. Por favor, tente novamente mais tarde.
</notification>
@@ -463,6 +549,10 @@ Nota: Este procedimento limpa o cache.
Salvar alterações?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Não Salvar" yestext="Salvar"/>
</notification>
+ <notification name="DeleteNotecard">
+ Excluir nota?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="GestureSaveFailedTooManySteps">
Falha ao salvar Gesto.
Este gesto possui muitos passos.
@@ -569,6 +659,9 @@ Para aumentar a qualidade do vídeo, vá para Preferências &gt; Vídeo.
<notification name="RegionNoTerraforming">
A região [REGION] não permite ser aplainada.
</notification>
+ <notification name="ParcelNoTerraforming">
+ Você não está autorizado a terraplanar o terreno [PARCEL].
+ </notification>
<notification name="CannotCopyWarning">
Você não tem autorização para copiar os itens abaixo:
[ITEMS]
@@ -1817,6 +1910,30 @@ Isto mudará milhares de regiões e fará o spaceserver soluçar.
Remover o gerente da propriedade desta propriedade apenas ou para [ALL_ESTATES]?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todas as Propriedades" yestext="Esta Propriedade"/>
</notification>
+ <notification label="Selecionar propriedade" name="EstateAllowedExperienceAdd">
+ Adicionar à lista de permitidos apenas para essa propriedade ou para [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todas as propriedades" yestext="Esta propriedade"/>
+ </notification>
+ <notification label="Selecionar propriedade" name="EstateAllowedExperienceRemove">
+ Remover da lista de permitidos apenas para essa propriedade ou para [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todas as propriedades" yestext="Esta propriedade"/>
+ </notification>
+ <notification label="Selecionar propriedade" name="EstateBlockedExperienceAdd">
+ Adicionar à lista de bloqueados dessa propriedade apenas ou de [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todas as propriedades" yestext="Esta propriedade"/>
+ </notification>
+ <notification label="Selecionar propriedade" name="EstateBlockedExperienceRemove">
+ Remover da lista de bloqueados para essa propriedade somente ou para [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todas as propriedades" yestext="Esta propriedade"/>
+ </notification>
+ <notification label="Selecionar propriedade" name="EstateTrustedExperienceAdd">
+ Adicionar à lista-chave dessa propriedade apenas ou de [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todas as propriedades" yestext="Esta propriedade"/>
+ </notification>
+ <notification label="Selecionar propriedade" name="EstateTrustedExperienceRemove">
+ Remover da lista-chave para essa propriedade somente ou para [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todas as propriedades" yestext="Esta propriedade"/>
+ </notification>
<notification label="Confirmar expulsão" name="EstateKickUser">
Expulsar [EVIL_USER] desta propriedade?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar"/>
@@ -1829,6 +1946,9 @@ Isto mudará milhares de regiões e fará o spaceserver soluçar.
A região que você está tentando visitar tem conteúdo que excede suas preferências atuais. Você pode alterar suas preferências acessando Eu &gt; Preferências &gt; Geral.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="SLM_UPDATE_FOLDER">
+ [MESSAGE]
+ </notification>
<notification name="RegionEntryAccessBlocked_AdultsOnlyContent">
A região que você está tentando visitar tem conteúdo [REGIONMATURITY], acessível apenas para adultos.
<url name="url">
@@ -1891,6 +2011,10 @@ Isto mudará milhares de regiões e fará o spaceserver soluçar.
Estamos tendo dificuldades técnicas com seu teletransporte, pois suas preferências estão dessincronizadas com o servidor.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="RegionTPSpecialUsageBlocked">
+ Não é possível inserir a região. &apos;[REGION_NAME]&apos; é uma Região de Skill Gaming, portanto você deve atender certos critérios para poder entrar. Para maiores detalhes, consulte as [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="PreferredMaturityChanged">
Você não receberá mais notificações de que está prestes a visitar uma região com conteúdo [RATING]. Posteriormente você poderá alterar suas preferências de conteúdo acessando Eu &gt; Preferências &gt; Geral da barra do menu.
<usetemplate name="okbutton" yestext="OK"/>
@@ -2113,6 +2237,10 @@ Mover para o inventário o(s) item(s)?
<ignore name="ignore" text="Definir &apos;Pagar por objeto&apos; ao construir um objeto sem script money()"/>
</form>
</notification>
+ <notification name="PayConfirmation">
+ Confirme que você deseja pagar L$[AMOUNT] a [TARGET].
+ <usetemplate ignoretext="Confirmar antes de pagar (somas acima de L$ 200)" name="okcancelignore" notext="Cancelar" yestext="Pagar"/>
+ </notification>
<notification name="OpenObjectCannotCopy">
Não há itens neste objeto que você está autorizado a copiar.
</notification>
@@ -2198,6 +2326,9 @@ Você deseja substituí-lo pelo objeto selecionado?
<button ignore="Never Replace" name="No" text="Não"/>
</form>
</notification>
+ <notification name="TooManyWearables">
+ Você não pode usar uma pasta que contenha mais de [AMOUNT] itens. Você pode mudar esse limite em Avançado &gt; Mostrar configurações de depuração &gt; WearFolderLimit.
+ </notification>
<notification label="Aviso de modo Não perturbe" name="DoNotDisturbModePay">
Você ativou o Não perturbe. Você não receberá qualquer item oferecido em troca deste pagamento.
@@ -2646,9 +2777,6 @@ Por favor, tente novamente em alguns instantes.
<notification name="NoValidCircuit">
Código de circuito inválido.
</notification>
- <notification name="NoValidTimestamp">
- Hora inválida.
- </notification>
<notification name="NoPendingConnection">
Impossível criar a conexão pendente.
</notification>
@@ -2803,7 +2931,7 @@ Se permanecer aqui, você será desconectado.
[MESSAGE]
-Do objeto: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, de: [NAME]?
+Do objeto: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, de: [NAME]
<form name="form">
<button name="Gotopage" text="Carregar"/>
<button name="Cancel" text="Cancelar"/>
@@ -2829,6 +2957,72 @@ OK?
<button name="Mute" text="Bloquear"/>
</form>
</notification>
+ <notification name="ExperienceAcquireFailed">
+ Não foi possível adquirir uma nova experiência:
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NotInGroupExperienceProfileMessage">
+ Uma alteração do grupo de experiência foi ignorada porque o proprietário não é membro do grupo selecionado.
+ </notification>
+ <notification name="UneditableExperienceProfileMessage">
+ O campo não editável &apos;[field]&apos; foi ignorado ao atualizar o perfil de experiência.
+ </notification>
+ <notification name="RestrictedToOwnerExperienceProfileMessage">
+ Alterações ignoradas para o campo &apos;[field]&apos; que só podem ser definidas pelo proprietário da experiência.
+ </notification>
+ <notification name="MaturityRatingExceedsOwnerExperienceProfileMessage">
+ Você não pode definir a classificação de maturidade de uma experiência como sendo mais alta que a do proprietário.
+ </notification>
+ <notification name="RestrictedTermExperienceProfileMessage">
+ Os seguintes termos impediram a atualização do nome e/ou descrição do perfil de experiência: [extra_info]
+ </notification>
+ <notification name="TeleportedHomeExperienceRemoved">
+ Você foi teletransportado da região [region_name] por remover a experiência secondlife:///app/experience/[public_id]/profile e não tem mais permissão na região.
+ <form name="form">
+ <ignore name="ignore" text="Ejetar da região por remover uma experiência"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperienceEntry">
+ Você recebeu permissão para a região [region_name] ao participar da experiência-chave secondlife:///app/experience/[public_id]/profile Remover essa experiência pode ejetá-lo da região.
+ <form name="form">
+ <ignore name="ignore" text="Permitido em uma região devido a uma experiência"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperiencesAvailable">
+ Você não está autorizado a acessar esse destino. Você pode ser permitido na região aceitando uma das experiências abaixo:
+
+[EXPERIENCE_LIST]
+
+Outras experiências chave podem estar disponíveis.
+ </notification>
+ <notification name="ExperienceEvent">
+ Um objeto foi permitido para [EventType] pelo secondlife:///app/experience/[public_id]/profile experience.
+ Proprietário: secondlife:///app/agent/[OwnerID]/inspect
+ Nome do objeto: [ObjectName]
+ Nome do Terreno: [ParcelName]
+ </notification>
+ <notification name="ExperienceEventAttachment">
+ Um anexo teve permissão para executar [EventType] pelo secondlife:///app/experience/[public_id]/profile experience.
+ Proprietário: secondlife:///app/agent/[OwnerID]/inspect
+ </notification>
+ <notification name="ScriptQuestionExperience">
+ &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, um objeto de propriedade de &apos;[NAME]&apos;, solicita a sua participação na experiência [GRID_WIDE]:
+
+[EXPERIENCE]
+
+Quando a permissão for dada, você não irá mais visualizar essa mensagem novamente a não ser que seja revogada do perfil de experiência.
+
+Os scripts associados a essa experiência serão capazes de realizar o seguinte nas regiões onde a experiência esteja ativa:
+
+[QUESTIONS]Isso está bem?
+ <form name="form">
+ <button name="BlockExperience" text="Bloquear experiência"/>
+ <button name="Mute" text="Bloquear objeto"/>
+ <button name="Yes" text="Sim"/>
+ <button name="No" text="Não"/>
+ </form>
+ </notification>
<notification name="ScriptQuestionCaution">
Aviso: O objeto &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; deseja obter acesso total à sua conta de dólares Linden. Se você conceder acesso, ele poderá remover fundos de sua conta a qualquer momento ou esvaziar sua conta completamente, continuamente e sem avisos adicionais.
@@ -3148,6 +3342,10 @@ Você carregou uma textura com [RESOLUTION] para o(a) &apos;[BODYREGION]&apos; e
( [EXISTENCE] segundos de vida )
Você carregou uma textura com [RESOLUTION] para o(a) &apos;[BODYREGION]&apos; em [TIME] segundos.
</notification>
+ <notification name="CannotUploadTexture">
+ Não foi possível carregar textura.
+[REASON]
+ </notification>
<notification name="LivePreviewUnavailable">
Não podemos exibir uma visualização desta textura, pois ela é cópia proibida e/ou transferência proibida.
<usetemplate ignoretext="Avise-me quando o modo Visualização em Tempo Real estiver indisponível para texturas de cópia proibida e/ou transferência proibida" name="okignore" yestext="OK"/>
@@ -3721,9 +3919,11 @@ Tente novamente em instantes.
</notification>
<notification name="TeleportedByAttachment">
Você foi teletransportado por um anexo em [ITEM_ID]
+ <usetemplate ignoretext="Teletransportar: Você foi teletransportado por um anexo" name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOnParcel">
Você foi teletransportado pelo objeto &apos;[OBJECT_NAME]&apos; no lote &apos;[PARCEL_NAME]&apos;
+ <usetemplate ignoretext="Teletransportar: Você foi teletransportado por um objeto em um lote" name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOwnedBy">
Você foi teletransportado pelo objeto &apos;[OBJECT_NAME]&apos; de propriedade de [OWNER_ID]
@@ -4055,7 +4255,7 @@ Tente selecionar uma quantidade menor de terreno.
<usetemplate ignoretext="Não foi possível mover arquivos. Caminho anterior restaurado." name="okignore" yestext="OK"/>
</notification>
<notification name="DefaultObjectPermissions">
- Ocorreu um problema ao salvar as permissões padrão devido ao seguinte motivo: [REASON]. Tente definir as permissões padrão mais tarde.
+ Ocorreu um problema ao salvar as permissões padrão do objeto: [REASON]. Tente definir as permissões padrão mais tarde.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ChatHistoryIsBusyAlert">
diff --git a/indra/newview/skins/default/xui/pt/panel_experience_info.xml b/indra/newview/skins/default/xui/pt/panel_experience_info.xml
new file mode 100644
index 0000000000..7fad25dad6
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_experience_info.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_experience_info">
+ <text name="title" value="Perfil de experiência"/>
+ <scroll_container name="xp_scroll">
+ <panel name="scrolling_panel">
+ <layout_stack>
+ <layout_panel>
+ <text name="experience_title" value="Kyle&apos;s Superhero RPG"/>
+ </layout_panel>
+ <layout_panel name="location panel">
+ <text name="Location">
+ Localização:
+ </text>
+ <text name="LocationTextText">
+ qualquer lugar
+ </text>
+ <button label="Teletransportar" name="teleport_btn"/>
+ <button label="Mapa" name="map_btn"/>
+ </layout_panel>
+ <layout_panel name="marketplace panel">
+ <text name="Location">
+ Loja do Marketplace
+ </text>
+ <text name="LocationTextText">
+ qualquer lugar
+ </text>
+ </layout_panel>
+ <layout_panel>
+ <text name="ContentRating">
+ Classificação:
+ </text>
+ <text name="ContentRatingText">
+ Adulto
+ </text>
+ <text name="Owner">
+ Proprietário:
+ </text>
+ <text name="OwnerText">
+ Kyle
+ </text>
+ <button label="Editar" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_experience_list_editor.xml b/indra/newview/skins/default/xui/pt/panel_experience_list_editor.xml
new file mode 100644
index 0000000000..6e10cc583c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_experience_list_editor.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="experince_list_editor">
+ <panel.string name="loading">
+ Carregando...
+ </panel.string>
+ <panel.string name="panel_allowed">
+ Experiências permitidas:
+ </panel.string>
+ <panel.string name="panel_blocked">
+ Experiências bloqueadas:
+ </panel.string>
+ <panel.string name="panel_trusted">
+ Experiências-chave:
+ </panel.string>
+ <panel.string name="no_results">
+ (vazio)
+ </panel.string>
+ <text name="text_name">
+ Lista de experiências
+ </text>
+ <scroll_list name="experience_list">
+ <columns label="Nome" name="experience_name"/>
+ </scroll_list>
+ <button label="Adicionar..." name="btn_add"/>
+ <button label="Remover" name="btn_remove"/>
+ <button label="Perfil..." name="btn_profile"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_experience_list_item.xml b/indra/newview/skins/default/xui/pt/panel_experience_list_item.xml
new file mode 100644
index 0000000000..24022faeae
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_experience_list_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiences">
+ <text name="experience_name">
+ Nome fictício
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_experience_log.xml b/indra/newview/skins/default/xui/pt/panel_experience_log.xml
new file mode 100644
index 0000000000..97ef760716
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_experience_log.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="EVENTS">
+ <string name="no_events" value="Sem eventos."/>
+ <string name="loading" value="Carregando..."/>
+ <layout_stack>
+ <layout_panel>
+ <scroll_list name="experience_log_list">
+ <columns label="Hora" name="time"/>
+ <columns label="Evento" name="event"/>
+ <columns label="Experiência" name="experience_name"/>
+ <columns label="Objeto" name="object_name"/>
+ </scroll_list>
+ <button label="Avisar" name="btn_notify"/>
+ <button label="Perfil" name="btn_profile_xp"/>
+ <button label="Denunciar" name="btn_report_xp"/>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <check_box label="Avisar sobre todos os eventos Dias" name="notify_all"/>
+ <button label="Limpar" name="btn_clear"/>
+ <button label="&lt;" name="btn_prev"/>
+ <button label="&gt;" name="btn_next"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_experience_search.xml b/indra/newview/skins/default/xui/pt/panel_experience_search.xml
new file mode 100644
index 0000000000..e8d5ba63d5
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_experience_search.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="SEARCH">
+ <string name="not_found">
+ &apos;[TEXT]&apos; não encontrado
+ </string>
+ <string name="no_results">
+ Sem resultados
+ </string>
+ <string name="searching">
+ Pesquisando...
+ </string>
+ <string name="loading">
+ Carregando...
+ </string>
+ <string name="maturity_icon_general">
+ &quot;Parcel_PG_Light&quot;
+ </string>
+ <string name="maturity_icon_moderate">
+ &quot;Parcel_M_Light&quot;
+ </string>
+ <string name="maturity_icon_adult">
+ &quot;Parcel_R_Light&quot;
+ </string>
+ <panel name="search_panel">
+ <button label="Ir" name="find"/>
+ <icons_combo_box label="Moderado" name="maturity">
+ <icons_combo_box.item label="Adulto" name="Adult" value="42"/>
+ <icons_combo_box.item label="Moderado" name="Mature" value="21"/>
+ <icons_combo_box.item label="Geral" name="PG" value="13"/>
+ </icons_combo_box>
+ <scroll_list name="search_results">
+ <columns label="Nome" name="experience_name"/>
+ <columns label="Proprietário" name="owner"/>
+ </scroll_list>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Exibir perfil" name="profile_btn"/>
+ <button label="&lt;" name="left_btn"/>
+ <button label="&gt;" name="right_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_experiences.xml b/indra/newview/skins/default/xui/pt/panel_experiences.xml
new file mode 100644
index 0000000000..cdf1a760d8
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_experiences.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiences">
+ <string name="loading_experiences" value="Carregando experiências..."/>
+ <string name="no_experiences" value="Nenhuma experiência."/>
+ <string name="acquire" value="Adquirir uma experiência"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_facebook_friends.xml b/indra/newview/skins/default/xui/pt/panel_facebook_friends.xml
index 9cb7a8b7d1..8c5c24d08b 100644
--- a/indra/newview/skins/default/xui/pt/panel_facebook_friends.xml
+++ b/indra/newview/skins/default/xui/pt/panel_facebook_friends.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_friends">
<string name="facebook_friends_empty" value="No momento, você não tem amigos do Facebook que também são residentes do Second Life. Convide seus amigos do Facebook para ingressar no Second Life hoje mesmo!"/>
- <string name="facebook_friends_no_connected" value="No momento, você não está conectado ao Facebook. Vá para a aba Conta para se conectar e ativar esse recurso."/>
+ <string name="facebook_friends_no_connected" value="No momento, você não está conectado ao Facebook. Vá para a aba Status para se conectar e ativar esse recurso."/>
<accordion name="friends_accordion">
<accordion_tab name="tab_second_life_friends" title="Amigos do SL"/>
<accordion_tab name="tab_suggested_friends" title="Adicionar essas pessoas como amigos do SL"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_facebook_photo.xml b/indra/newview/skins/default/xui/pt/panel_facebook_photo.xml
index 22615e0769..cdf3222092 100644
--- a/indra/newview/skins/default/xui/pt/panel_facebook_photo.xml
+++ b/indra/newview/skins/default/xui/pt/panel_facebook_photo.xml
@@ -1,26 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Resolução da imagem">
- <combo_box.item label="Janela atual" name="CurrentWindow"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="1200x630" name="1200x630"/>
- </combo_box>
- <combo_box name="filters_combobox" tool_tip="Filtros de imagem">
- <combo_box.item label="Sem filtro" name="NoFilter"/>
- </combo_box>
- <button label="Atualizar" name="new_snapshot_btn" tool_tip="Clique para atualizar"/>
- <button label="Visualizar" name="big_preview_btn" tool_tip="Clique para alternar entre visualizações"/>
- <text name="caption_label">
- Comentário (opcional):
- </text>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Postar" name="post_photo_btn"/>
- <button label="Cancelar" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <combo_box name="resolution_combobox" tool_tip="Resolução da imagem">
+ <combo_box.item label="Janela atual" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1200x630" name="1200x630"/>
+ </combo_box>
+ <combo_box name="filters_combobox" tool_tip="Filtros de imagem">
+ <combo_box.item label="Sem filtro" name="NoFilter"/>
+ </combo_box>
+ <button label="Atualizar" name="new_snapshot_btn" tool_tip="Clique para atualizar"/>
+ <button label="Visualizar" name="big_preview_btn" tool_tip="Clique para alternar entre visualizações"/>
+ <text name="caption_label">
+ Comentário (opcional):
+ </text>
+ <button label="Postar" name="post_photo_btn"/>
+ <button label="Cancelar" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_facebook_place.xml b/indra/newview/skins/default/xui/pt/panel_facebook_place.xml
index 97596d64c6..aa8b51d64b 100644
--- a/indra/newview/skins/default/xui/pt/panel_facebook_place.xml
+++ b/indra/newview/skins/default/xui/pt/panel_facebook_place.xml
@@ -1,17 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_place">
- <layout_stack name="stack_place">
- <layout_panel name="place_detail_panel">
- <text name="place_caption_label">
- Diga algo sobre onde você está:
- </text>
- </layout_panel>
- <layout_panel name="place_map_panel">
- <check_box initial_value="false" label="" name="add_place_view_cb"/>
- </layout_panel>
- <layout_panel name="place_button_panel">
- <button label="Postar" name="post_place_btn"/>
- <button label="Cancelar" name="cancel_place_btn"/>
- </layout_panel>
- </layout_stack>
+ <text name="place_caption_label">
+ Diga algo sobre onde você está:
+ </text>
+ <check_box initial_value="false" label="Incluir vista abstrata da localização" name="add_place_view_cb"/>
+ <button label="Postar" name="post_place_btn"/>
+ <button label="Cancelar" name="cancel_place_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_facebook_status.xml b/indra/newview/skins/default/xui/pt/panel_facebook_status.xml
index 251580666e..0bbaf1086c 100644
--- a/indra/newview/skins/default/xui/pt/panel_facebook_status.xml
+++ b/indra/newview/skins/default/xui/pt/panel_facebook_status.xml
@@ -1,14 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_status">
- <layout_stack name="stack_status">
- <layout_panel name="status_detail_panel">
- <text name="status_caption_label">
- No que você está pensando?
- </text>
- </layout_panel>
- <layout_panel name="status_button_panel">
- <button label="Postar" name="post_status_btn"/>
- <button label="Cancelar" name="cancel_status_btn"/>
- </layout_panel>
- </layout_stack>
+ <string name="facebook_connected" value="Você está conectado ao Facebook como:"/>
+ <string name="facebook_disconnected" value="Não conectado ao Facebook"/>
+ <text name="account_caption_label">
+ Não conectado ao Facebook.
+ </text>
+ <panel name="panel_buttons">
+ <button label="Conectar..." name="connect_btn"/>
+ <button label="Desconectar" name="disconnect_btn"/>
+ <text name="account_learn_more_label">
+ [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 Aprenda a publicar no Facebook]
+ </text>
+ </panel>
+ <text name="status_caption_label">
+ No que você está pensando?
+ </text>
+ <button label="Postar" name="post_status_btn"/>
+ <button label="Cancelar" name="cancel_status_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_flickr_photo.xml b/indra/newview/skins/default/xui/pt/panel_flickr_photo.xml
index 77d8afb47c..cbb3e362fe 100644
--- a/indra/newview/skins/default/xui/pt/panel_flickr_photo.xml
+++ b/indra/newview/skins/default/xui/pt/panel_flickr_photo.xml
@@ -1,41 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_flickr_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Resolução da imagem">
- <combo_box.item label="Janela atual" name="CurrentWindow"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- </combo_box>
- <combo_box name="filters_combobox" tool_tip="Filtros de imagem">
- <combo_box.item label="Sem filtro" name="NoFilter"/>
- </combo_box>
- <button label="Atualizar" name="new_snapshot_btn" tool_tip="Clique para atualizar"/>
- <button label="Visualizar" name="big_preview_btn" tool_tip="Clique para alternar entre visualizações"/>
- <text name="title_label">
- Título:
- </text>
- <text name="description_label">
- Descrição:
- </text>
- <check_box initial_value="true" label="Incluir localização do SL no final da descrição" name="add_location_cb"/>
- <text name="tags_label">
- Tags:
- </text>
- <text name="tags_help_label">
- Separe as tags com espaços
+ <combo_box name="resolution_combobox" tool_tip="Resolução da imagem">
+ <combo_box.item label="Janela atual" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ </combo_box>
+ <combo_box name="filters_combobox" tool_tip="Filtros de imagem">
+ <combo_box.item label="Sem filtro" name="NoFilter"/>
+ </combo_box>
+ <button label="Atualizar" name="new_snapshot_btn" tool_tip="Clique para atualizar"/>
+ <button label="Visualizar" name="big_preview_btn" tool_tip="Clique para alternar entre visualizações"/>
+ <text name="title_label">
+ Título:
+ </text>
+ <text name="description_label">
+ Descrição:
+ </text>
+ <check_box initial_value="true" label="Incluir localização do SL no final da descrição" name="add_location_cb"/>
+ <text name="tags_label">
+ Tags:
+ </text>
+ <text name="tags_help_label">
+ Separe as tags com espaços
Use &quot;&quot; para tags com várias palavras
- </text>
- <combo_box name="rating_combobox" tool_tip="Classificação de conteúdo do Flickr">
- <combo_box.item label="Classificação segura do Flickr" name="SafeRating"/>
- <combo_box.item label="Classificação moderada do Flickr" name="ModerateRating"/>
- <combo_box.item label="Classificação restrita do Flickr" name="RestrictedRating"/>
- </combo_box>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Enviar" name="post_photo_btn"/>
- <button label="Cancelar" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ </text>
+ <combo_box name="rating_combobox" tool_tip="Classificação de conteúdo do Flickr">
+ <combo_box.item label="Classificação segura do Flickr" name="SafeRating"/>
+ <combo_box.item label="Classificação moderada do Flickr" name="ModerateRating"/>
+ <combo_box.item label="Classificação restrita do Flickr" name="RestrictedRating"/>
+ </combo_box>
+ <button label="Enviar" name="post_photo_btn"/>
+ <button label="Cancelar" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/pt/panel_group_info_sidetray.xml
index 7d8531a482..d322c60ec0 100755
--- a/indra/newview/skins/default/xui/pt/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/pt/panel_group_info_sidetray.xml
@@ -23,6 +23,7 @@
<accordion_tab name="group_roles_tab" title="Funções e membros"/>
<accordion_tab name="group_notices_tab" title="Avisos"/>
<accordion_tab name="group_land_tab" title="Terrenos/Bens"/>
+ <accordion_tab name="group_experiences_tab" title="Experiências"/>
</accordion>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/pt/panel_login.xml b/indra/newview/skins/default/xui/pt/panel_login.xml
index 8ac3e57c4c..ffcf72b1b4 100755
--- a/indra/newview/skins/default/xui/pt/panel_login.xml
+++ b/indra/newview/skins/default/xui/pt/panel_login.xml
@@ -1,26 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_login">
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=pt
- </panel.string>
+ <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=pt</panel.string>
<layout_stack name="ui_stack">
<layout_panel name="ui_container">
<combo_box label="Nome de usuário" name="username_combo" tool_tip="O nome de usuário que você escolheu ao fazer seu cadastro, como zecazc12 ou Magia Solar"/>
<line_editor label="Senha" name="password_edit"/>
- <check_box label="Lembrar-me" name="remember_check"/>
- <text name="forgot_password_text">
- Senha esquecida
- </text>
- <button label="Login" name="connect_btn"/>
- <text name="At_My_Last_Location_Label">
- no último local
- </text>
<combo_box label="Meus locais favoritos" name="start_location_combo">
+ <combo_box.item label="Última posição" name="MyLastLocation"/>
<combo_box.item label="Minha casa" name="MyHome"/>
</combo_box>
- <button label="Login" name="connect_favorite_btn"/>
- <line_editor label="Digite um local" name="location_edit"/>
- <button label="Login" name="connect_location_btn"/>
+ <button label="Login" name="connect_btn"/>
+ <check_box label="Lembrar-me" name="remember_check"/>
+ <text name="forgot_password_text">Senha esquecida</text>
<combo_box label="Selecionar grade" name="server_combo"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/pt/panel_marketplace_listings.xml b/indra/newview/skins/default/xui/pt/panel_marketplace_listings.xml
new file mode 100644
index 0000000000..cfa0e10038
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_marketplace_listings.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Marketplace" name="Marketplace Panel">
+ <panel name="tool_panel">
+ <menu_button name="sort_btn" tool_tip="Opções de exibição/ordenação"/>
+ <button name="add_btn" tool_tip="Cria uma nova pasta de listagem"/>
+ <button label="Verificar erros" name="audit_btn" tool_tip="Verificar suas listagens do Marketplace"/>
+ </panel>
+ <panel name="tab_container_panel">
+ <filter_editor label="Filtrar listagens do Marketplace" name="filter_editor"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_marketplace_listings_inventory.xml b/indra/newview/skins/default/xui/pt/panel_marketplace_listings_inventory.xml
new file mode 100644
index 0000000000..5967f24628
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_marketplace_listings_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="TUDO" name="All Items" tool_tip="Arraste e solte os itens aqui para listá-los"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_marketplace_listings_listed.xml b/indra/newview/skins/default/xui/pt/panel_marketplace_listings_listed.xml
new file mode 100644
index 0000000000..6549f82b5c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_marketplace_listings_listed.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="PUBLICADA" name="Active Items"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_marketplace_listings_unassociated.xml b/indra/newview/skins/default/xui/pt/panel_marketplace_listings_unassociated.xml
new file mode 100644
index 0000000000..1797be5ae8
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_marketplace_listings_unassociated.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="DESASSOCIADA" name="Unassociated Items"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_marketplace_listings_unlisted.xml b/indra/newview/skins/default/xui/pt/panel_marketplace_listings_unlisted.xml
new file mode 100644
index 0000000000..79b8557ec3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_marketplace_listings_unlisted.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="NÃO PUBLICADA" name="Inactive Items"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_postcard_settings.xml b/indra/newview/skins/default/xui/pt/panel_postcard_settings.xml
index 3088b9a996..3608c96c6a 100755
--- a/indra/newview/skins/default/xui/pt/panel_postcard_settings.xml
+++ b/indra/newview/skins/default/xui/pt/panel_postcard_settings.xml
@@ -7,17 +7,7 @@
<combo_box.item label="1024x768" name="1024x768"/>
<combo_box.item label="Customizado" name="Custom"/>
</combo_box>
- <layout_stack name="postcard_image_params_ls">
- <layout_panel name="postcard_image_size_lp">
- <spinner label="Largura" name="postcard_snapshot_width"/>
- <spinner label="Altura" name="postcard_snapshot_height"/>
- <check_box label="Limitar proporções" name="postcard_keep_aspect_check"/>
- </layout_panel>
- <layout_panel name="postcard_image_format_quality_lp">
- <slider label="Qualidade da imagem" name="image_quality_slider"/>
- <text name="image_quality_level">
- ([QLVL])
- </text>
- </layout_panel>
- </layout_stack>
+ <spinner label="Largura X Altura" name="postcard_snapshot_width"/>
+ <check_box label="Limitar proporções" name="postcard_keep_aspect_check"/>
+ <slider label="Qualidade:" name="image_quality_slider"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
index 1279e74e21..87f2a9bc8f 100755
--- a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
@@ -14,9 +14,9 @@
<text name="Web:">
Web:
</text>
- <radio_group name="use_external_browser">
- <radio_item label="Usar meu navegador (IE, Firefox, Safari)" name="external" tool_tip="Use o navegador incluso para consultar a ajuda, abrir links da web, etc. Uso em tela inteira não recomendado." value="true"/>
- <radio_item label="Usar navegador incluso" name="internal" tool_tip="Use este navegador para consultar a ajuda, abrir links da web, etc. As janelas abrem dentro do [APP_NAME]." value=""/>
+ <radio_group name="preferred_browser_behavior">
+ <radio_item label="Usar meu navegador (Chrome, Firefox, IE) para todos os links" name="internal" tool_tip="Use o navegador padrão do sistema para consultar a ajuda, abrir links da web etc. Uso em tela inteira não recomendado." value="0"/>
+ <radio_item label="Usar o navegador incorporado somente para links do SecondLife" name="external" tool_tip="Usar o navegador padrão do sistema para consultar a ajuda, abrir links da web etc. O navegador incorporado será usado somente para os links da LindenLab/SecondLife." value="1"/>
</radio_group>
<check_box initial_value="true" label="Habilitar plugins" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Aceitar cookies" name="cookies_enabled"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_region_experiences.xml b/indra/newview/skins/default/xui/pt/panel_region_experiences.xml
new file mode 100644
index 0000000000..c7e252cd6f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_region_experiences.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiências" name="Experiences">
+ <panel.string name="trusted_estate_text">
+ Qualquer experiência pode ser chave.
+
+Experiências-chave têm permissão para serem executadas nessa propriedade.
+
+Além disso, se a propriedade não permitir acesso público, os residentes participantes de qualquer experiência-chave podem entrar e permanecer na propriedade, desde que estejam na experiência-chave.
+ </panel.string>
+ <panel.string name="allowed_estate_text">
+ Somente experiências dentro do terreno podem ser permitidas.
+
+Experiências permitidas têm permissão para ser executadas nessa propriedade.
+ </panel.string>
+ <panel.string name="blocked_estate_text">
+ Somente experiências dentro da grade podem ser bloqueadas.
+
+É possível que as experiências bloqueadas não sejam executadas nessa propriedade.
+ </panel.string>
+ <panel.string name="estate_caption">
+ Mudar as opções desta guia afeta todas as regiões desta propriedade.
+ </panel.string>
+ <panel.string name="allowed_parcel_text">
+ Somente experiências dentro do terreno podem ser permitidas.
+
+Experiências permitidas têm permissão para ser executadas nesse terreno se não estiverem bloqueadas pela propriedade.
+ </panel.string>
+ <panel.string name="blocked_parcel_text">
+ Qualquer experiência de residente pode ser bloqueada.
+
+É possível que as experiências bloqueadas não sejam executadas neste terreno.
+ </panel.string>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_script_experience.xml b/indra/newview/skins/default/xui/pt/panel_script_experience.xml
new file mode 100644
index 0000000000..8366306581
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_script_experience.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel name="script_experience" title="EXPERIÊNCIA">
+ <button label="Experiência" name="Expand Experience"/>
+ <check_box label="Usa experiência(s)" name="enable_xp"/>
+ <layout_stack name="xp_details">
+ <layout_panel>
+ <combo_box label="Escolher experiência..." name="Experiences..."/>
+ </layout_panel>
+ </layout_stack>
+ <text name="No Experiences">
+ Você não é colaborador de nenhuma experiência.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml
index 3c4bb18687..b038c628bc 100755
--- a/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_inventory">
<text name="title">
- Salvar no meu inventário
+ Inventário
</text>
<text name="hint_lbl">
Salvar uma imagem em seu inventário custa L$[UPLOAD_COST]. Para salvar sua imagem como uma textura, selecione um dos formatos quadrados.
@@ -13,8 +13,8 @@
<combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
<combo_box.item label="Customizado" name="Custom"/>
</combo_box>
- <spinner label="Largura" name="inventory_snapshot_width"/>
- <spinner label="Altura" name="inventory_snapshot_height"/>
+ <spinner label="Largura X Altura" name="inventory_snapshot_width"/>
+ <spinner label="" name="inventory_snapshot_height"/>
<check_box label="Limitar proporções" name="inventory_keep_aspect_check"/>
<button label="Cancelar" name="cancel_btn"/>
<button label="Salvar" name="save_btn"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_local.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_local.xml
index 36b5b0cbe6..c6dbec189d 100755
--- a/indra/newview/skins/default/xui/pt/panel_snapshot_local.xml
+++ b/indra/newview/skins/default/xui/pt/panel_snapshot_local.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_local">
<text name="title">
- Salvar no meu PC
+ Disco
</text>
<combo_box label="Resolução" name="local_size_combo">
<combo_box.item label="Janela atual" name="CurrentWindow"/>
@@ -13,24 +13,17 @@
<combo_box.item label="1600x1200" name="1600x1200"/>
<combo_box.item label="Customizado" name="Custom"/>
</combo_box>
- <layout_stack name="local_image_params_ls">
- <layout_panel name="local_image_size_lp">
- <spinner label="Largura" name="local_snapshot_width"/>
- <spinner label="Altura" name="local_snapshot_height"/>
- <check_box label="Limitar proporções" name="local_keep_aspect_check"/>
- </layout_panel>
- <layout_panel name="local_image_format_quality_lp">
- <combo_box label="Formato" name="local_format_combo">
- <combo_box.item label="PNG (sem perda)" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP (sem perda)" name="BMP"/>
- </combo_box>
- <slider label="Qualidade da imagem" name="image_quality_slider"/>
- <text name="image_quality_level">
- ([QLVL])
- </text>
- </layout_panel>
- </layout_stack>
+ <spinner label="Largura X Altura" name="local_snapshot_width"/>
+ <check_box label="Limitar proporções" name="local_keep_aspect_check"/>
+ <text name="local_format_label">
+ Formato:
+ </text>
+ <combo_box label="Formato" name="local_format_combo">
+ <combo_box.item label="PNG (sem perda)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (sem perda)" name="BMP"/>
+ </combo_box>
+ <slider label="Qualidade:" name="image_quality_slider"/>
<button label="Cancelar" name="cancel_btn"/>
<flyout_button label="Salvar" name="save_btn" tool_tip="Salvar imagem em um arquivo">
<flyout_button.item label="Salvar" name="save_item"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml
index bce44d2ed6..d588e59f6d 100755
--- a/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml
@@ -1,16 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_options">
- <button label="Postar no feed do meu perfil" name="save_to_profile_btn"/>
- <button label="E-mail" name="save_to_email_btn"/>
- <button label="Salvar em Meu inventário (L$[AMOUNT])" name="save_to_inventory_btn"/>
- <button label="Salvar no meu PC" name="save_to_computer_btn"/>
- <text name="send_to_facebook_textbox">
- Enviar para: [secondlife:/// Facebook]
- </text>
- <text name="send_to_twitter_textbox">
- [secondlife:/// Twitter]
- </text>
- <text name="send_to_flickr_textbox">
- [secondlife:/// Flickr]
- </text>
+ <button label="Salvar no disco" name="save_to_computer_btn"/>
+ <button label="Salvar em inventário (L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="Carregar no perfil" name="save_to_profile_btn"/>
+ <button label="Carregar no Facebook" name="send_to_facebook_btn"/>
+ <button label="Carregar no Twitter" name="send_to_twitter_btn"/>
+ <button label="Carregar no Flickr" name="send_to_flickr_btn"/>
+ <button label="Enviar por email" name="save_to_email_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml
index 12a648f600..ab1545a231 100755..100644
--- a/indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml
+++ b/indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml
@@ -10,8 +10,12 @@
Enviando...
</string>
<text name="title">
- E-mail
+ Email
</text>
- <button label="Mensagem" name="message_btn"/>
- <button label="Configurações" name="settings_btn"/>
+ <tab_container name="postcard_tabs">
+ <panel label="Mensagem" name="panel_postcard_message"/>
+ <panel label="Configurações" name="panel_postcard_settings"/>
+ </tab_container>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Enviar" name="send_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_profile.xml
index 095b8fc75d..f1d7334752 100755
--- a/indra/newview/skins/default/xui/pt/panel_snapshot_profile.xml
+++ b/indra/newview/skins/default/xui/pt/panel_snapshot_profile.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_profile">
<text name="title">
- Postar no feed do meu perfil
+ Perfil
</text>
<combo_box label="Resolução" name="profile_size_combo">
<combo_box.item label="Janela atual" name="CurrentWindow"/>
@@ -10,19 +10,12 @@
<combo_box.item label="1024x768" name="1024x768"/>
<combo_box.item label="Customizado" name="Custom"/>
</combo_box>
- <layout_stack name="profile_image_params_ls">
- <layout_panel name="profile_image_size_lp">
- <spinner label="Largura" name="profile_snapshot_width"/>
- <spinner label="Altura" name="profile_snapshot_height"/>
- <check_box label="Limitar proporções" name="profile_keep_aspect_check"/>
- </layout_panel>
- <layout_panel name="profile_image_metadata_lp">
- <text name="caption_label">
- Legenda:
- </text>
- <check_box initial_value="true" label="Incluir local" name="add_location_cb"/>
- </layout_panel>
- </layout_stack>
+ <spinner label="Largura X Altura" name="profile_snapshot_width"/>
+ <check_box label="Limitar proporções" name="profile_keep_aspect_check"/>
+ <text name="caption_label">
+ Legenda:
+ </text>
+ <check_box initial_value="true" label="Incluir local" name="add_location_cb"/>
<button label="Cancelar" name="cancel_btn"/>
<button label="Postar" name="post_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_status_bar.xml b/indra/newview/skins/default/xui/pt/panel_status_bar.xml
index cb9a6eb757..cfe52ff404 100755
--- a/indra/newview/skins/default/xui/pt/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/pt/panel_status_bar.xml
@@ -1,28 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <panel.string name="packet_loss_tooltip">
- Perda de pacote
- </panel.string>
- <panel.string name="bandwidth_tooltip">
- Banda
- </panel.string>
- <panel.string name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string name="timeTooltip">
- [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
- </panel.string>
- <panel.string name="buycurrencylabel">
- L$ [AMT]
- </panel.string>
+ <panel.string name="packet_loss_tooltip">Perda de pacote</panel.string>
+ <panel.string name="bandwidth_tooltip">Banda</panel.string>
+ <panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>
+ <panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>
+ <panel.string name="buycurrencylabel">L$ [AMT]</panel.string>
<panel left="-410" name="balance_bg" width="200">
- <text name="balance" tool_tip="Atualizar saldo de L$" value="L$20"/>
+ <text name="balance" tool_tip="Atualizar saldo de L$" value="L$??"/>
<button label="Comprar L$" name="buyL" tool_tip="Comprar mais L$"/>
<button label="Comprar" name="goShop" tool_tip="Abrir Mercado do Second Life" width="80"/>
</panel>
- <text name="TimeText" tool_tip="Hora atual (Pacífico)">
- 24:00 AM PST
- </text>
+ <text name="TimeText" tool_tip="Hora atual (Pacífico)">24:00 AM PST</text>
<button name="media_toggle_btn" tool_tip="Tocar/Pausar todas mídias (música, vídeo, páginas web)"/>
<button name="volume_btn" tool_tip="Volume geral"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_twitter_photo.xml b/indra/newview/skins/default/xui/pt/panel_twitter_photo.xml
index 3958d5f0f9..7c4990f71e 100644
--- a/indra/newview/skins/default/xui/pt/panel_twitter_photo.xml
+++ b/indra/newview/skins/default/xui/pt/panel_twitter_photo.xml
@@ -1,32 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_twitter_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="text_panel">
- <text name="status_label">
- Próximas etapas?
- </text>
- <text name="status_counter_label">
- 140
- </text>
- <check_box initial_value="true" label="Incluir localização do SL" name="add_location_cb"/>
- <check_box initial_value="true" label="Incluir uma foto" name="add_photo_cb"/>
- </layout_panel>
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Resolução da imagem">
- <combo_box.item label="Janela atual" name="CurrentWindow"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- </combo_box>
- <combo_box name="filters_combobox" tool_tip="Filtros de imagem">
- <combo_box.item label="Sem filtro" name="NoFilter"/>
- </combo_box>
- <button label="Atualizar" name="new_snapshot_btn" tool_tip="Clique para atualizar"/>
- <button label="Visualizar" name="big_preview_btn" tool_tip="Clique para alternar entre visualizações"/>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Enviar tweet" name="post_photo_btn"/>
- <button label="Cancelar" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <text name="status_label">
+ Próximas etapas?
+ </text>
+ <text name="status_counter_label">
+ 140
+ </text>
+ <check_box initial_value="true" label="Incluir localização do SL" name="add_location_cb"/>
+ <check_box initial_value="true" label="Incluir uma foto" name="add_photo_cb"/>
+ <combo_box name="resolution_combobox" tool_tip="Resolução da imagem">
+ <combo_box.item label="Janela atual" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ </combo_box>
+ <combo_box name="filters_combobox" tool_tip="Filtros de imagem">
+ <combo_box.item label="Sem filtro" name="NoFilter"/>
+ </combo_box>
+ <button label="Atualizar" name="new_snapshot_btn" tool_tip="Clique para atualizar"/>
+ <button label="Visualizar" name="big_preview_btn" tool_tip="Clique para alternar entre visualizações"/>
+ <button label="Enviar tweet" name="post_photo_btn"/>
+ <button label="Cancelar" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/role_actions.xml b/indra/newview/skins/default/xui/pt/role_actions.xml
index 90e2264940..8d5bc061f9 100755
--- a/indra/newview/skins/default/xui/pt/role_actions.xml
+++ b/indra/newview/skins/default/xui/pt/role_actions.xml
@@ -66,4 +66,8 @@
<action description="Enviar aviso" longdescription="Membros que exercem cargos com esta função podem enviar avisos na seção Avisos." name="notices send" value="42"/>
<action description="Receber novos avisos e ver os anteriores" longdescription="Membros que exercem cargos com esta função podem receber e ler avisos antigos na seção Avisos." name="notices receive" value="43"/>
</action_set>
+ <action_set description="Estas funções incluem o poder de modificar as experiências desse grupo." name="experience_tools_experience">
+ <action description="Administrador de experiência" longdescription="Os membros em uma função com essa permissão podem editar os metadados de uma experiência." name="experience admin" value="49"/>
+ <action description="Colaborador de experiência" longdescription="Os membros em uma função com essa permissão podem contribuir com scripts para uma experiência." name="experience contributor" value="50"/>
+ </action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml
index d3cb087108..47ffffaf15 100755
--- a/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="item properties" title="Perfil do item">
+ <panel.string name="loading_experience">
+ (carregando)
+ </panel.string>
<panel.string name="unknown">
(desconhecido)
</panel.string>
@@ -43,6 +46,9 @@
<text name="LabelAcquiredTitle">
Adquirido:
</text>
+ <text name="LabelItemExperienceTitle">
+ Experiência:
+ </text>
<panel name="perms_inv">
<text name="perm_modify">
Você pode:
@@ -66,8 +72,9 @@
<check_box label="Transferir" name="CheckNextOwnerTransfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/>
</panel>
<check_box label="À venda" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
- <combo_box.item label="Copiar" name="Copy"/>
+ <combo_box name="ComboBoxSaleType">
+ <combo_box.item label="Cortar" name="Copy"/>
+ <combo_box.item label="Conteúdo" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
<spinner label="Preço: L$" name="Edit Cost"/>
diff --git a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml
index f0fd438cef..bbfaa4a4f5 100755
--- a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml
@@ -1,71 +1,31 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="object properties" title="Perfil do objeto">
- <panel.string name="text deed continued">
- Doar
- </panel.string>
- <panel.string name="text deed">
- Doar
- </panel.string>
- <panel.string name="text modify info 1">
- Você pode modificar este objeto
- </panel.string>
- <panel.string name="text modify info 2">
- Você pode modificar estes objetos
- </panel.string>
- <panel.string name="text modify info 3">
- Você não pode modificar este objeto
- </panel.string>
- <panel.string name="text modify info 4">
- Você não pode modificar estes objetos
- </panel.string>
- <panel.string name="text modify info 5">
- Não é possível modificar este objeto através de uma demarcação da região
- </panel.string>
- <panel.string name="text modify info 6">
- Não é possível modificar estes objetos através de uma demarcação da região
- </panel.string>
- <panel.string name="text modify warning">
- O objeto contém links ligando suas partes
- </panel.string>
- <panel.string name="Cost Default">
- Preço: L$
- </panel.string>
- <panel.string name="Cost Total">
- Preço total: L$
- </panel.string>
- <panel.string name="Cost Per Unit">
- Preço unitário: L$
- </panel.string>
- <panel.string name="Cost Mixed">
- Preço misto
- </panel.string>
- <panel.string name="Sale Mixed">
- Venda mista
- </panel.string>
+ <panel.string name="text deed continued">Doar</panel.string>
+ <panel.string name="text deed">Doar</panel.string>
+ <panel.string name="text modify info 1">Você pode modificar este objeto</panel.string>
+ <panel.string name="text modify info 2">Você pode modificar estes objetos</panel.string>
+ <panel.string name="text modify info 3">Você não pode modificar este objeto</panel.string>
+ <panel.string name="text modify info 4">Você não pode modificar estes objetos</panel.string>
+ <panel.string name="text modify info 5">Não é possível modificar este objeto através de uma demarcação da região</panel.string>
+ <panel.string name="text modify info 6">Não é possível modificar estes objetos através de uma demarcação da região</panel.string>
+ <panel.string name="text modify warning">O objeto contém links ligando suas partes</panel.string>
+ <panel.string name="Cost Default">Preço: L$</panel.string>
+ <panel.string name="Cost Total">Preço total: L$</panel.string>
+ <panel.string name="Cost Per Unit">Preço unitário: L$</panel.string>
+ <panel.string name="Cost Mixed">Preço misto</panel.string>
+ <panel.string name="Sale Mixed">Venda mista</panel.string>
<text name="title" value="Perfil do objeto"/>
<text name="where" value="(Inworld)"/>
<panel label="" name="properties_panel">
- <text name="Name:">
- Nome:
- </text>
- <text name="Description:">
- Descrição:
- </text>
- <text name="CreatorNameLabel">
- Criador:
- </text>
- <text name="Owner:">
- Proprietário:
- </text>
- <text name="Group_label">
- Grupo:
- </text>
+ <text name="Name:">Nome:</text>
+ <text name="Description:">Descrição:</text>
+ <text name="CreatorNameLabel">Criador:</text>
+ <text name="Owner:">Proprietário:</text>
+ <text name="Group_label">Grupo:</text>
<button name="button set group" tool_tip="Selecione o grupo que terá acesso à autorização do objeto"/>
<name_box initial_value="Carregando..." name="Group Name Proxy"/>
<button label="Doar" label_selected="Doar" name="button deed" tool_tip="Ao doar este item, o próximo dono terá permissões de próximo dono. Objetos de grupos podem ser doados por um oficial do grupo."/>
- <text name="label click action">
- Clique para:
- </text>
+ <text name="label click action">Clique para:</text>
<combo_box name="clickaction">
<combo_box.item label="Tocar (padrão)" name="Touch/grab(default)"/>
<combo_box.item label="Sentar em objeto" name="Sitonobject"/>
@@ -75,21 +35,13 @@
<combo_box.item label="Zoom" name="Zoom"/>
</combo_box>
<panel name="perms_inv">
- <text name="perm_modify">
- Você pode modificar este objeto
- </text>
- <text name="Anyone can:">
- Todos:
- </text>
+ <text name="perm_modify">Você pode modificar este objeto</text>
+ <text name="Anyone can:">Todos:</text>
<check_box label="Copiar" name="checkbox allow everyone copy"/>
<check_box label="Movimentar" name="checkbox allow everyone move"/>
- <text name="GroupLabel">
- Grupo:
- </text>
+ <text name="GroupLabel">Grupo:</text>
<check_box label="Compartilhar" name="checkbox share with group" tool_tip="Permitir que todos os membros do grupo tenham o seu nível de modificação para este objeto. Faça uma doação para ativar restrições de função."/>
- <text name="NextOwnerLabel">
- Próximo proprietário:
- </text>
+ <text name="NextOwnerLabel">Próximo proprietário:</text>
<check_box label="Modificar" name="checkbox next owner can modify"/>
<check_box label="Copiar" name="checkbox next owner can copy"/>
<check_box label="Transferir" name="checkbox next owner can transfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/>
@@ -102,27 +54,13 @@
</combo_box>
<spinner label="Preço: L$" name="Edit Cost"/>
<check_box label="Mostrar nos resultados de busca" name="search_check" tool_tip="Incluir o objeto nos resultados de busca"/>
- <text name="pathfinding_attributes_label">
- Atributos do pathfinding:
- </text>
- <text name="B:">
- B:
- </text>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
+ <text name="pathfinding_attributes_label">Atributos do pathfinding:</text>
+ <text name="B:">B:</text>
+ <text name="O:">O:</text>
+ <text name="G:">G:</text>
+ <text name="E:">E:</text>
+ <text name="N:">N:</text>
+ <text name="F:">F:</text>
</panel>
<panel name="button_panel">
<button label="Abrir" name="open_btn"/>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 577143b0dc..3eef691d8d 100755
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -401,30 +401,51 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
<string name="TooltipMustSingleDrop">
Apenas um item único pode ser arrastado para este local
</string>
+ <string name="TooltipTooManyWearables">
+ Você não pode usar uma pasta que contenha mais de [AMOUNT] itens. Você pode mudar esse limite em Avançado &gt; Mostrar configurações de depuração &gt; WearFolderLimit.
+ </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
+ Não é possível fazer rez de itens da pasta Listagens do Marketplace
+ </string>
+ <string name="TooltipOutboxWorn">
+ Não é possível colocar itens que você estiver usando na pasta Listagens do Marketplace
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ A profundidade das pastas aninhadas excede [AMOUNT]. Diminua a profundidade das pastas dentro de pastas. Agrupe os itens se necessário.
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ O número de subpastas excede [AMOUNT]. Diminua a o número de pastas em sua listagem. Agrupe os itens se necessário.
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ O número de itens excede [AMOUNT]. Para vender mais que [AMOUNT] itens em uma listagem, você deve agrupar alguns deles.
+ </string>
+ <string name="TooltipOutboxTooManyStockItems">
+ O número de itens de estoque excede [AMOUNT].
+ </string>
+ <string name="TooltipOutboxCannotDropOnRoot">
+ Você pode soltar somente itens ou pastas na aba TUDO. Selecione essa aba e mova seus itens ou pastas novamente.
</string>
<string name="TooltipOutboxNoTransfer">
- Um ou mais destes objetos não podem ser vendidos ou transferidos.
+ Um ou mais 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
+ É possível colocar somente itens do seu inventário no Marketplace
</string>
- <string name="TooltipOutboxWorn">
- Você não pode colocar os itens que está vestindo na sua caixa de saída do lojista
+ <string name="TooltipOutboxLinked">
+ Não é possível colocar itens ou pastas vinculadas no Marketplace
</string>
<string name="TooltipOutboxCallingCard">
- Não é possível colocar cartões de visita em sua caixa de saída do lojista
+ Não é possível colocar cartões de visitas no Marketplace
</string>
- <string name="TooltipOutboxFolderLevels">
- A profundidade das pastas aninhadas excede 3
+ <string name="TooltipOutboxDragActive">
+ Não é possível mover uma listagem publicada
</string>
- <string name="TooltipOutboxTooManyFolders">
- A contagem de subpastas na pasta de nível superior excede 20
+ <string name="TooltipOutboxCannotMoveRoot">
+ Não é possível mover a pasta raiz das listagens do Marketplace
</string>
- <string name="TooltipOutboxTooManyObjects">
- A contagem de itens na pasta de nível superior excede 200
+ <string name="TooltipOutboxMixedStock">
+ Todos os itens em uma pasta de estoque têm o mesmo tipo e permissão
</string>
<string name="TooltipDragOntoOwnChild">
Não é possível mover uma pasta para seu filho
@@ -1006,9 +1027,7 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
<string name="AgentNameSubst">
(Você)
</string>
- <string name="JoinAnExperience">
- Participar de uma experiência
- </string>
+ <string name="JoinAnExperience"/><!-- intentionally blank -->
<string name="SilentlyManageEstateAccess">
Suprimir alertas ao gerenciar listas de acesso ao terreno
</string>
@@ -1075,6 +1094,12 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
<string name="bitmap_image_files">
Imagens Bitmap
</string>
+ <string name="png_image_files">
+ Imagens PNG
+ </string>
+ <string name="save_texture_image_files">
+ Imagens targa ou PNG
+ </string>
<string name="avi_movie_file">
Arquivo de vídeo AVI
</string>
@@ -1324,6 +1349,9 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
<string name="FavoritesNoMatchingItems">
Arraste um marco para adicioná-lo aos seus favoritos.
</string>
+ <string name="MarketplaceNoMatchingItems">
+ Nenhum item correspondente encontrado. Verifique a ortografia de sua cadeia de pesquisa e tente novamente.
+ </string>
<string name="InventoryNoTexture">
Você não possui uma cópia desta textura no seu inventário
</string>
@@ -1371,29 +1399,95 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
<string name="InventoryOutboxError">
A loja [[MARKETPLACE_CREATE_STORE_URL] no Marketplace] está retornando erros.
</string>
+ <string name="InventoryMarketplaceError">
+ Esse recurso está em beta. Inscreva-se neste [http://goo.gl/forms/FCQ7UXkakz formulário do Google] se você deseja participar.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItemsTitle">
+ Sua pasta Listagens do Marketplace está vazia.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItems">
+ Arraste pastas para esta área para listá-las para venda no [Marketplace [MARKETPLACE_DASHBOARD_URL]].
+ </string>
+ <string name="Marketplace Validation Warning Stock">
+ a pasta de estoque deve estar em uma pasta de versões
+ </string>
+ <string name="Marketplace Validation Error Mixed Stock">
+ : Erro: todos os itens em uma pasta de estoque devem ser de cópia proibida e todos do mesmo tipo
+ </string>
+ <string name="Marketplace Validation Error Subfolder In Stock">
+ : Erro: a pasta de estoque não pode ter subpastas
+ </string>
+ <string name="Marketplace Validation Warning Empty">
+ : Aviso: a pasta não contém itens
+ </string>
+ <string name="Marketplace Validation Warning Create Stock">
+ : Aviso: criando pasta de estoque
+ </string>
+ <string name="Marketplace Validation Warning Create Version">
+ : Aviso: criando pasta de versões
+ </string>
+ <string name="Marketplace Validation Warning Move">
+ : Aviso: movendo itens
+ </string>
+ <string name="Marketplace Validation Warning Delete">
+ : Aviso: conteúdo da pasta transferido para pasta de estoque, removendo pasta vazia
+ </string>
+ <string name="Marketplace Validation Error Stock Item">
+ : Erro: itens de cópia proibida devem estar em uma pasta de estoque
+ </string>
+ <string name="Marketplace Validation Warning Unwrapped Item">
+ : Aviso: os itens devem estar em uma pasta de versões
+ </string>
+ <string name="Marketplace Validation Error">
+ : Erro:
+ </string>
+ <string name="Marketplace Validation Warning">
+ : Aviso:
+ </string>
+ <string name="Marketplace Validation Error Empty Version">
+ : Aviso: a pasta de versões deve conter pelo menos 1 item
+ </string>
+ <string name="Marketplace Validation Error Empty Stock">
+ : Aviso: a pasta de estoque deve conter pelo menos 1 item
+ </string>
+ <string name="Marketplace Validation No Error">
+ Não há erros ou avisos
+ </string>
<string name="Marketplace Error None">
Sem erros
</string>
+ <string name="Marketplace Error Prefix">
+ Erro:
+ </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).
+ antes de enviar os itens para o Marketplace, é necessário que você se defina como um lojista (sem custos).
</string>
- <string name="Marketplace Error Empty Folder">
- Erro: esta pasta está vazia.
+ <string name="Marketplace Error Not Accepted">
+ Não é possível mover o item nessa pasta.
</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 name="Marketplace Error Unsellable Item">
+ Este item não pode ser vendido no Marketplace.
</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 name="MarketplaceNoID">
+ no Mkt ID
</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 name="MarketplaceLive">
+ publicada
</string>
- <string name="Marketplace Error Unsellable Item">
- Erro: este item não pode ser vendido no mercado.
+ <string name="MarketplaceActive">
+ ativo
+ </string>
+ <string name="MarketplaceMax">
+ máx
+ </string>
+ <string name="MarketplaceStock">
+ estoque
</string>
- <string name="Marketplace Error Internal Import">
- Erro: ocorreu um problema com este item. Tente novamente mais tarde.
+ <string name="MarketplaceNoStock">
+ esgotado
+ </string>
+ <string name="MarketplaceUpdating">
+ atualizando...
</string>
<string name="Open landmarks">
Marcos abertos
@@ -1414,6 +1508,7 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
Nenhum conteúdo
</string>
<string name="WornOnAttachmentPoint" value="(vestido em [ATTACHMENT_POINT])"/>
+ <string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/>
<string name="ActiveGesture" value="[GESLABEL] (ativado)"/>
<string name="Chat Message" value="Bate-papo:"/>
<string name="Sound" value="Som"/>
@@ -1678,6 +1773,15 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
<string name="Invalid Attachment">
Ponto de encaixe inválido
</string>
+ <string name="ATTACHMENT_MISSING_ITEM">
+ Erro: item ausente
+ </string>
+ <string name="ATTACHMENT_MISSING_BASE_ITEM">
+ Erro: item base ausente
+ </string>
+ <string name="ATTACHMENT_NOT_ATTACHED">
+ Erro: o objeto está no look atual, mas não foi anexado
+ </string>
<string name="YearsMonthsOld">
[AGEYEARS] [AGEMONTHS] de idade
</string>
@@ -1846,6 +1950,9 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
<string name="SaveComplete">
Salvo.
</string>
+ <string name="UploadFailed">
+ Falha ao carregar arquivo:
+ </string>
<string name="ObjectOutOfRange">
Script (objeto fora de alcance)
</string>
@@ -1855,6 +1962,9 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
<string name="GroupsNone">
nenhum
</string>
+ <string name="CompileNoExperiencePerm">
+ Pulando script [SCRIPT] com experiência [EXPERIENCE]
+ </string>
<string name="Group" value="(grupo)"/>
<string name="Unknown">
(Desconhecido)
@@ -4936,6 +5046,9 @@ Tente colocar o caminho do editor entre aspas.
<string name="Command_Marketplace_Label">
Mercado
</string>
+ <string name="Command_MarketplaceListings_Label">
+ Marketplace
+ </string>
<string name="Command_MiniMap_Label">
Mini Mapa
</string>
@@ -5023,6 +5136,9 @@ Tente colocar o caminho do editor entre aspas.
<string name="Command_Marketplace_Tooltip">
Faça compras
</string>
+ <string name="Command_MarketplaceListings_Tooltip">
+ Venda suas criações
+ </string>
<string name="Command_MiniMap_Tooltip">
Mostrar quem está aqui
</string>
@@ -5146,4 +5262,85 @@ Tente colocar o caminho do editor entre aspas.
<string name="loading_chat_logs">
Carregando...
</string>
+ <string name="experience_tools_experience">
+ Experiência
+ </string>
+ <string name="ExperienceNameNull">
+ (nenhuma experiência)
+ </string>
+ <string name="ExperienceNameUntitled">
+ (experiência sem título)
+ </string>
+ <string name="Land-Scope">
+ Dentro do terreno
+ </string>
+ <string name="Grid-Scope">
+ Dentro da grade
+ </string>
+ <string name="Allowed_Experiences_Tab">
+ PERMITIDO
+ </string>
+ <string name="Blocked_Experiences_Tab">
+ BLOQUEADA
+ </string>
+ <string name="Contrib_Experiences_Tab">
+ COLABORADOR
+ </string>
+ <string name="Admin_Experiences_Tab">
+ ADMIN
+ </string>
+ <string name="Recent_Experiences_Tab">
+ RECENTES
+ </string>
+ <string name="Owned_Experiences_Tab">
+ PRÓPRIAS
+ </string>
+ <string name="ExperiencesCounter">
+ ([EXPERIENCES], máx. [MAXEXPERIENCES])
+ </string>
+ <string name="ExperiencePermission1">
+ assumir seus controles
+ </string>
+ <string name="ExperiencePermission3">
+ botão animações no seu avatar
+ </string>
+ <string name="ExperiencePermission4">
+ anexar ao avatar
+ </string>
+ <string name="ExperiencePermission9">
+ rastrear sua câmera
+ </string>
+ <string name="ExperiencePermission10">
+ controlar sua câmera
+ </string>
+ <string name="ExperiencePermission11">
+ teletransportar você
+ </string>
+ <string name="ExperiencePermission12">
+ aceitar automaticamente permissões de experiência
+ </string>
+ <string name="ExperiencePermissionShortUnknown">
+ realizar uma operação desconhecida: [Permission]
+ </string>
+ <string name="ExperiencePermissionShort1">
+ Assumir o controle
+ </string>
+ <string name="ExperiencePermissionShort3">
+ Botão animações
+ </string>
+ <string name="ExperiencePermissionShort4">
+ Anexar
+ </string>
+ <string name="ExperiencePermissionShort9">
+ Rastrear câmera
+ </string>
+ <string name="ExperiencePermissionShort10">
+ Câmera de controle
+ </string>
+ <string name="ExperiencePermissionShort11">
+ Teletransportar
+ </string>
+ <string name="ExperiencePermissionShort12">
+ Autorização
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/pt/teleport_strings.xml b/indra/newview/skins/default/xui/pt/teleport_strings.xml
index 40fb4caebf..9e1fd593ef 100755
--- a/indra/newview/skins/default/xui/pt/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/pt/teleport_strings.xml
@@ -46,6 +46,9 @@ Vá para a &apos;Ilha Welcome Pública&apos; para repetir o tutorial.
<message name="MustGetAgeRegion">
Você deve ter 18 anos ou mais para acessar esta região.
</message>
+ <message name="RegionTPSpecialUsageBlocked">
+ Não é possível inserir a região. &apos;[REGION_NAME]&apos; é uma Região de Skill Gaming, portanto você deve atender certos critérios para poder entrar. Para maiores detalhes, consulte as [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ].
+ </message>
</message_set>
<message_set name="progress">
<message name="sending_dest">
diff --git a/indra/newview/skins/default/xui/ru/floater_about.xml b/indra/newview/skins/default/xui/ru/floater_about.xml
index 9494106e96..0f75856a91 100755
--- a/indra/newview/skins/default/xui/ru/floater_about.xml
+++ b/indra/newview/skins/default/xui/ru/floater_about.xml
@@ -1,70 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="О [CAPITALIZED_APP_NAME]">
- <floater.string name="AboutHeader">
- [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
-[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
- </floater.string>
- <floater.string name="AboutCompiler">
- Использован компилятор [COMPILER], версия [COMPILER_VERSION]
- </floater.string>
- <floater.string name="AboutPosition">
- Вы в точке [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] в регионе «[REGION]», расположенном на &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
-SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
-(глобальные координаты [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
-[SERVER_VERSION]
-[SERVER_RELEASE_NOTES_URL]
- </floater.string>
- <floater.string name="AboutSystem">
- ЦП: [CPU]
-Память: [MEMORY_MB] МБ
-Версия ОС: [OS_VERSION]
-Производитель графической платы: [GRAPHICS_CARD_VENDOR]
-Графическая плата: [GRAPHICS_CARD]
- </floater.string>
- <floater.string name="AboutDriver">
- Версия графического драйвера Windows: [GRAPHICS_DRIVER_VERSION]
- </floater.string>
- <floater.string name="AboutLibs">
- Версия OpenGL: [OPENGL_VERSION]
-Версия libcurl: [LIBCURL_VERSION]
-Версия декодера J2C: [J2C_VERSION]
-Версия драйвера звука: [AUDIO_DRIVER_VERSION]
-Версия Qt Webkit: [QT_WEBKIT_VERSION]
-Версия голосового сервера: [VOICE_VERSION]
- </floater.string>
- <floater.string name="none">
- (нет)
- </floater.string>
- <floater.string name="AboutTraffic">
- Потеряно пакетов: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
- </floater.string>
- <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 name="linden_intro">
- Игра Second Life разработана лабораторией Lindens:
- </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>
+ <text name="linden_intro">Игра Second Life разработана лабораторией Lindens,
+в написании открытого кода участвовали:</text>
+ <text_editor name="contrib_names">Псевдо-имя изменено при запуске</text_editor>
</panel>
<panel label="Лицензии" name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK (C) 1992-2009 3Dconnexion
+ <text_editor name="licenses_editor">3Dconnexion SDK (C) 1992-2009 3Dconnexion
APR (C) 2011 The Apache Software Foundation
Collada DOM (C) 2006 Sony Computer Entertainment Inc.
cURL (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se)
@@ -91,8 +37,7 @@ SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
Все права защищены. Подробные сведения см. в файле licenses.txt.
- Кодирование звука для голосового чата: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
+ Кодирование звука для голосового чата: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)</text_editor>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_about_land.xml b/indra/newview/skins/default/xui/ru/floater_about_land.xml
index 12691df684..86428da3ef 100755
--- a/indra/newview/skins/default/xui/ru/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ru/floater_about_land.xml
@@ -331,22 +331,6 @@
<check_box label="Безопасно (нет повреждений)" name="check safe" tool_tip="Если отмечено, то земля считается безопасной, отключены боевые повреждения. Если не отмечено, то боевые повреждения включены."/>
<check_box label="Не толкать" name="PushRestrictCheck" tool_tip="Запрещает скриптам функцию толкания. Этот параметр может оказаться полезным для предотвращения нежелательного поведения на вашей земле."/>
<check_box label="Показать место в поиске (L$30/неделя)" name="ShowDirectoryCheck" tool_tip="Позволить людям видеть участок в результатах поиска"/>
- <combo_box name="land category with adult">
- <combo_box.item label="Любая категория" name="item0"/>
- <combo_box.item label="Место Linden" name="item1"/>
- <combo_box.item label="Взрослый" name="item2"/>
- <combo_box.item label="Искусство и культура" name="item3"/>
- <combo_box.item label="Бизнес" name="item4"/>
- <combo_box.item label="Образование" name="item5"/>
- <combo_box.item label="Игры" name="item6"/>
- <combo_box.item label="Места встреч" name="item7"/>
- <combo_box.item label="Для новичков" name="item8"/>
- <combo_box.item label="Парки и природа" name="item9"/>
- <combo_box.item label="Проживание" name="item10"/>
- <combo_box.item label="Покупки" name="item11"/>
- <combo_box.item label="Аренда" name="item13"/>
- <combo_box.item label="Другое" name="item12"/>
- </combo_box>
<combo_box name="land category">
<combo_box.item label="Любая категория" name="item0"/>
<combo_box.item label="Место Linden" name="item1"/>
@@ -477,5 +461,6 @@
<button label="Удалить" label_selected="Удалить" name="remove_banned"/>
</panel>
</panel>
+ <panel label="ПРИКЛЮЧЕНИЯ" name="land_experiences_panel"/>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_associate_listing.xml b/indra/newview/skins/default/xui/ru/floater_associate_listing.xml
new file mode 100644
index 0000000000..fc9a19730b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_associate_listing.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="associate listing" title="СВЯЗАТЬ СПИСОК">
+ <text name="message">ID списка:</text>
+ <line_editor name="listing_id">Введите ID</line_editor>
+ <button label="OK" name="OK"/>
+ <button label="Отмена" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_edit_hover_height.xml b/indra/newview/skins/default/xui/ru/floater_edit_hover_height.xml
new file mode 100644
index 0000000000..292128d295
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_edit_hover_height.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="HoverHeight" title="ЗАДАЙТЕ ВЫСОТУ ПАРЕНИЯ">
+ <slider label="Высота" name="HoverHeightSlider"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_experience_search.xml b/indra/newview/skins/default/xui/ru/floater_experience_search.xml
new file mode 100644
index 0000000000..77e3784b68
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_experience_search.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="experiencepicker" title="ВЫБЕРИТЕ ПРИКЛЮЧЕНИЕ"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_experienceprofile.xml b/indra/newview/skins/default/xui/ru/floater_experienceprofile.xml
new file mode 100644
index 0000000000..c72d8b59b9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_experienceprofile.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater title="EXPERIENCE PROFILE">
+ <floater.string name="empty_slurl">
+ (нет)
+ </floater.string>
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Light&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Light&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Light&quot;
+ </floater.string>
+ <text name="edit_title" value="Профиль приключения"/>
+ <tab_container name="tab_container">
+ <panel name="panel_experience_info">
+ <scroll_container name="xp_scroll">
+ <panel name="scrolling_panel">
+ <layout_stack>
+ <layout_panel name="top panel">
+ <button label="Изменить" name="edit_btn"/>
+ </layout_panel>
+ <layout_panel name="maturity panel">
+ <text name="ContentRating">
+ Рейтинг:
+ </text>
+ </layout_panel>
+ <layout_panel name="location panel">
+ <text name="Location">
+ Место:
+ </text>
+ </layout_panel>
+ <layout_panel>
+ <text name="Owner">
+ Владелец:
+ </text>
+ </layout_panel>
+ <layout_panel name="group_panel">
+ <text name="Group">
+ Группа:
+ </text>
+ </layout_panel>
+ <layout_panel name="perm panel">
+ <button label="Разрешить" name="allow_btn"/>
+ <button label="Забыть" name="forget_btn"/>
+ <button label="Заблокировать" name="block_btn"/>
+ <text name="privileged">
+ Это приключение включено для всех жителей.
+ </text>
+ <button label="Жалоба" name="report_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ </panel>
+ <panel name="edit_panel_experience_info">
+ <scroll_container name="edit_xp_scroll">
+ <panel name="edit_scrolling_panel">
+ <text name="edit_experience_title_label" value="Название:"/>
+ <text name="edit_experience_desc_label" value="Описание:"/>
+ <button label="Группа" name="Group_btn"/>
+ <text name="edit_ContentRating">
+ Рейтинг:
+ </text>
+ <icons_combo_box label="Умеренный" name="edit_ContentRatingText" tool_tip="При повышении рейтинга зрелости для приключения сбрасывается разрешение для всех жителей, которые разрешили приключение.">
+ <icons_combo_box.item label="Для взрослых" name="Adult" value="42"/>
+ <icons_combo_box.item label="Умеренный" name="Mature" value="21"/>
+ <icons_combo_box.item label="Общий" name="PG" value="13"/>
+ </icons_combo_box>
+ <text name="edit_Location">
+ Место:
+ </text>
+ <button label="Поставить текущее место" name="location_btn"/>
+ <button label="Очистить место" name="clear_btn"/>
+ <check_box label="Включить приключение" name="edit_enable_btn" tool_tip=""/>
+ <check_box label="Скрыть при поиске" name="edit_private_btn"/>
+ <text name="changes" value="Отображение изменений приключения во всех регионах может занять несколько минут."/>
+ <button label="Назад" name="cancel_btn"/>
+ <button label="Сохранить" name="save_btn"/>
+ </panel>
+ </scroll_container>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_experiences.xml b/indra/newview/skins/default/xui/ru/floater_experiences.xml
new file mode 100644
index 0000000000..f6fedfccc7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_experiences.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_experiences" title="ПРИКЛЮЧЕНИЯ"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_facebook.xml b/indra/newview/skins/default/xui/ru/floater_facebook.xml
index 20b9e4e151..cbf32cb682 100644
--- a/indra/newview/skins/default/xui/ru/floater_facebook.xml
+++ b/indra/newview/skins/default/xui/ru/floater_facebook.xml
@@ -1,20 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_facebook" title="ОПУБЛИКОВАТЬ В FACEBOOK">
- <panel name="background">
- <tab_container name="tabs">
- <panel label="СТАТУС" name="panel_facebook_status"/>
- <panel label="ФОТО" name="panel_facebook_photo"/>
- <panel label="ВХОД" name="panel_facebook_place"/>
- <panel label="ДРУЗЬЯ" name="panel_facebook_friends"/>
- <panel label="АККАУНТ" name="panel_facebook_account"/>
- </tab_container>
- <panel name="connection_status_panel">
- <text name="connection_error_text">
- Ошибка
- </text>
- <text name="connection_loading_text">
- Загрузка...
- </text>
- </panel>
- </panel>
+ <tab_container name="tabs">
+ <panel label="СТАТУС" name="panel_facebook_status"/>
+ <panel label="ФОТО" name="panel_facebook_photo"/>
+ <panel label="ВХОД" name="panel_facebook_place"/>
+ <panel label="ДРУЗЬЯ" name="panel_facebook_friends"/>
+ </tab_container>
+ <text name="connection_error_text">
+ Ошибка
+ </text>
+ <text name="connection_loading_text">
+ Загрузка...
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/ru/floater_inventory_item_properties.xml
index 9021b71fe2..c988825756 100755
--- a/indra/newview/skins/default/xui/ru/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/ru/floater_inventory_item_properties.xml
@@ -1,67 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="item properties" title="СВОЙСТВА ПРЕДМЕТА">
- <floater.string name="unknown">
- (неизвестно)
- </floater.string>
- <floater.string name="public">
- (публичное)
- </floater.string>
- <floater.string name="you_can">
- Вы можете:
- </floater.string>
- <floater.string name="owner_can">
- Владелец может:
- </floater.string>
- <floater.string name="acquiredDate">
- [wkday,datetime,local], [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
- </floater.string>
- <text name="LabelItemNameTitle">
- Название:
- </text>
- <text name="LabelItemDescTitle">
- Описание:
- </text>
- <text name="LabelCreatorTitle">
- Создатель:
- </text>
+ <floater.string name="unknown">(неизвестно)</floater.string>
+ <floater.string name="public">(публичное)</floater.string>
+ <floater.string name="you_can">Вы можете:</floater.string>
+ <floater.string name="owner_can">Владелец может:</floater.string>
+ <floater.string name="acquiredDate">[wkday,datetime,local], [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]</floater.string>
+ <text name="LabelItemNameTitle">Название:</text>
+ <text name="LabelItemDescTitle">Описание:</text>
+ <text name="LabelCreatorTitle">Создатель:</text>
<button label="Профиль…" name="BtnCreator"/>
- <text name="LabelOwnerTitle">
- Владелец:
- </text>
+ <text name="LabelOwnerTitle">Владелец:</text>
<button label="Профиль…" name="BtnOwner"/>
- <text name="LabelAcquiredTitle">
- Приобретено:
- </text>
- <text name="LabelAcquiredDate">
- Ср 24 Май 12:50:46 2006
- </text>
- <text name="OwnerLabel">
- Вы:
- </text>
+ <text name="LabelAcquiredTitle">Приобретено:</text>
+ <text name="LabelAcquiredDate">Ср 24 Май 12:50:46 2006</text>
+ <text name="OwnerLabel">Вы:</text>
<check_box label="Изменить" name="CheckOwnerModify"/>
<check_box label="Копировать" name="CheckOwnerCopy"/>
<check_box label="Перепродать" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">
- Все:
- </text>
+ <text name="AnyoneLabel">Все:</text>
<check_box label="Копировать" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">
- Группа:
- </text>
+ <text name="GroupLabel">Группа:</text>
<check_box label="Поделиться" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel">
- Следующий владелец:
- </text>
+ <text name="NextOwnerLabel">Следующий владелец:</text>
<check_box label="Изменить" name="CheckNextOwnerModify"/>
<check_box label="Копировать" name="CheckNextOwnerCopy"/>
<check_box label="Перепродать" name="CheckNextOwnerTransfer"/>
<check_box label="Для продажи" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
+ <combo_box name="ComboBoxSaleType">
<combo_box.item label="Копировать" name="Copy"/>
+ <combo_box.item label="Содержимое" name="Contents"/>
<combo_box.item label="Оригинал" name="Original"/>
</combo_box>
<spinner label="Цена:" name="Edit Cost"/>
- <text name="CurrencySymbol">
- L$
- </text>
+ <text name="CurrencySymbol">L$</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/ru/floater_inventory_view_finder.xml
index 02068c57b8..aa0184fe34 100755
--- a/indra/newview/skins/default/xui/ru/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/ru/floater_inventory_view_finder.xml
@@ -5,8 +5,8 @@
<check_box label="Одежда" name="check_clothing"/>
<check_box label="Жесты" name="check_gesture"/>
<check_box label="Закладки" name="check_landmark"/>
- <check_box label="Меши" name="check_mesh"/>
<check_box label="Заметки" name="check_notecard"/>
+ <check_box label="Меши" name="check_mesh"/>
<check_box label="Объекты" name="check_object"/>
<check_box label="Скрипты" name="check_script"/>
<check_box label="Звуки" name="check_sound"/>
@@ -19,6 +19,10 @@
<text name="- OR -">
- ИЛИ -
</text>
+ <radio_group name="date_search_direction">
+ <radio_item label="Новее, чем" name="newer"/>
+ <radio_item label="Старше, чем" name="older"/>
+ </radio_group>
<spinner label="Часов назад" name="spin_hours_ago"/>
<spinner label="Дней назад" name="spin_days_ago"/>
<button label="Закрыть" label_selected="Закрыть" name="Close"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_item_properties.xml b/indra/newview/skins/default/xui/ru/floater_item_properties.xml
new file mode 100644
index 0000000000..abd75902fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_item_properties.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Item Properties" title="СВОЙСТВА ПРЕДМЕТА"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_lagmeter.xml b/indra/newview/skins/default/xui/ru/floater_lagmeter.xml
index c420006a03..0cc9e56ff7 100644
--- a/indra/newview/skins/default/xui/ru/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/ru/floater_lagmeter.xml
@@ -31,7 +31,7 @@
Частота кадров клиента от [CLIENT_FRAME_RATE_CRITICAL] до [CLIENT_FRAME_RATE_WARNING]
</floater.string>
<floater.string name="client_frame_time_normal_msg">
- Нормально
+ Нормальный
</floater.string>
<floater.string name="client_draw_distance_cause_msg">
Возможная причина: дальность отрисовки слишком велика
@@ -61,7 +61,7 @@
Сеть теряет [NETWORK_PACKET_LOSS_WARNING]–[NETWORK_PACKET_LOSS_CRITICAL]% пакетов
</floater.string>
<floater.string name="network_performance_normal_msg">
- Нормально
+ Нормальный
</floater.string>
<floater.string name="network_ping_critical_ms">
600
@@ -100,7 +100,7 @@
Частота кадров сервера [SERVER_FRAME_RATE_CRITICAL]–[SERVER_FRAME_RATE_WARNING]
</floater.string>
<floater.string name="server_frame_time_normal_msg">
- Нормально
+ Нормальный
</floater.string>
<floater.string name="server_physics_cause_msg">
Возможная причина: слишком много физических объектов
@@ -131,21 +131,21 @@
Клиент
</text>
<text name="client_text">
- Нормально
+ Нормальный
</text>
<button name="network_lagmeter" tool_tip="Уровень лагов сети"/>
<text name="network">
Сеть
</text>
<text name="network_text">
- Нормально
+ Нормальный
</text>
<button name="server_lagmeter" tool_tip="Уровень лагов сервера"/>
<text name="server">
Сервер
</text>
<text name="server_text">
- Нормально
+ Нормальный
</text>
<button label="&gt;&gt;" name="minimize" tool_tip="Переключение размера"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml
index fb6e747592..30a196b1ca 100755
--- a/indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml
@@ -9,7 +9,24 @@
<floater.string name="Title">
СКРИПТ: [NAME]
</floater.string>
+ <floater.string name="experience_enabled">
+ Снимите флажок для удаления текущего приключения
+ </floater.string>
+ <floater.string name="no_experiences">
+ Вам не разрешено пользоваться приключениями
+ </floater.string>
+ <floater.string name="add_experiences">
+ Выберите, чтобы добавить приключение
+ </floater.string>
+ <floater.string name="show_experience_profile">
+ Щелкните для просмотра профиля приключения
+ </floater.string>
+ <floater.string name="loading">
+ Загрузка...
+ </floater.string>
<button label="Сброс" label_selected="Сброс" name="Reset"/>
<check_box initial_value="true" label="Выполняется" name="running"/>
<check_box initial_value="true" label="Моно" name="mono"/>
+ <check_box label="Использовать приключение:" name="enable_xp"/>
+ <button label="&gt;" name="view_profile"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_marketplace_listings.xml b/indra/newview/skins/default/xui/ru/floater_marketplace_listings.xml
new file mode 100644
index 0000000000..b231997307
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_marketplace_listings.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_listings" title="СПИСКИ ТОВАРОВ В ТОРГОВОМ ЦЕНТРЕ">
+ <panel name="marketplace_listings_panel">
+ <panel>
+ <panel name="marketplace_listings_inventory_placeholder_panel">
+ <text name="marketplace_listings_inventory_placeholder_title">Загрузка...</text>
+ </panel>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_marketplace_validation.xml b/indra/newview/skins/default/xui/ru/floater_marketplace_validation.xml
new file mode 100644
index 0000000000..6b293014bc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_marketplace_validation.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_validation" title="Проверить списки товаров в торговом центре">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <text_editor name="validation_text">MARKETPLACE_VALIDATION_TEXT</text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_openobject.xml b/indra/newview/skins/default/xui/ru/floater_openobject.xml
index 5da308eecb..a4b6e2af11 100755
--- a/indra/newview/skins/default/xui/ru/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/ru/floater_openobject.xml
@@ -3,6 +3,11 @@
<text name="object_name">
[DESC]:
</text>
- <button label="Копировать в инвентарь" label_selected="Копировать в инвентарь" name="copy_to_inventory_button"/>
- <button label="Копировать и надеть" label_selected="Копировать и надеть" name="copy_and_wear_button"/>
+ <text name="border_note">
+ Копировать в инвентарь и надеть
+ </text>
+ <button label="Добавить в костюм" label_selected="Добавить в костюм" name="copy_and_wear_button"/>
+ <button label="Заменить костюм" label_selected="Заменить костюм" name="copy_and_replace_button"/>
+ <button label="Только копировать в инвентарь" label_selected="Только копировать в инвентарь" name="copy_to_inventory_button"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel_button"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_pay.xml b/indra/newview/skins/default/xui/ru/floater_pay.xml
index 1471a7e133..0a269b9e00 100755
--- a/indra/newview/skins/default/xui/ru/floater_pay.xml
+++ b/indra/newview/skins/default/xui/ru/floater_pay.xml
@@ -1,21 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money">
- <string name="payee_group">
- Заплатить группе
- </string>
- <string name="payee_resident">
- Заплатить жителю
- </string>
- <text name="payee_name">
- Слишком длинное тестовое имя для проверки обрезания
- </text>
- <button label="L$1" label_selected="L$1" name="fastpay 1"/>
- <button label="L$5" label_selected="L$5" name="fastpay 5"/>
- <button label="L$10" label_selected="L$10" name="fastpay 10"/>
- <button label="L$20" label_selected="L$20" name="fastpay 20"/>
- <text name="amount text">
- Или введите количество:
- </text>
- <button label="Заплатить" label_selected="Заплатить" name="pay btn"/>
- <button label="Отмена" label_selected="Отмена" name="cancel btn"/>
+ <string name="payee_group">Заплатить группе</string>
+ <string name="payee_resident">Заплатить жителю</string>
+ <text name="paying_text">Вы платите:</text>
+ <text name="payee_name">Слишком длинное тестовое имя для проверки обрезания</text>
+ <panel label="Поиск" name="PatternsPanel">
+ <button label="Оплатить L$ 1" label_selected="Оплатить L$ 1" name="fastpay 1"/>
+ <button label="Оплатить L$ 5" label_selected="Оплатить L$ 5" name="fastpay 5"/>
+ <button label="Оплатить L$ 10" label_selected="Оплатить L$ 10" name="fastpay 10"/>
+ <button label="Оплатить L$ 20" label_selected="Оплатить L$ 20" name="fastpay 20"/>
+ </panel>
+ <panel label="Поиск" name="InputPanel">
+ <text name="amount text">Другая сумма:</text>
+ <button label="Оплатить" label_selected="Оплатить" name="pay btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel btn"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_pay_object.xml b/indra/newview/skins/default/xui/ru/floater_pay_object.xml
index 7d2da44ac1..9a7b233ca2 100755
--- a/indra/newview/skins/default/xui/ru/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/ru/floater_pay_object.xml
@@ -1,28 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money">
- <string name="payee_group">
- Заплатить группе
- </string>
- <string name="payee_resident">
- Заплатить жителю
- </string>
- <text name="payee_name">
- Ericacita Moostopolison
- </text>
- <text name="object_name_label">
- Через объект:
- </text>
+ <string name="payee_group">Заплатить группе</string>
+ <string name="payee_resident">Заплатить жителю</string>
+ <text name="paying_text">Вы платите:</text>
+ <text name="payee_name">Ericacita Moostopolison</text>
+ <text name="object_name_label">Через объект:</text>
<icon name="icon_object" tool_tip="Объекты"/>
- <text name="object_name_text">
- Мой офигенный объект с неэпически длинным названием
- </text>
- <button label="L$1" label_selected="L$1" name="fastpay 1"/>
- <button label="L$5" label_selected="L$5" name="fastpay 5"/>
- <button label="L$10" label_selected="L$10" name="fastpay 10"/>
- <button label="L$20" label_selected="L$20" name="fastpay 20"/>
- <text name="amount text">
- Или введите количество:
- </text>
- <button label="Заплатить" label_selected="Заплатить" name="pay btn"/>
- <button label="Отмена" label_selected="Отмена" name="cancel btn"/>
+ <text name="object_name_text">Мой офигенный объект с неэпически длинным названием</text>
+ <panel label="Поиск" name="PatternsPanel">
+ <button label="Оплатить L$ 1" label_selected="Оплатить L$ 1" name="fastpay 1"/>
+ <button label="Оплатить L$ 5" label_selected="Оплатить L$ 5" name="fastpay 5"/>
+ <button label="Оплатить L$ 10" label_selected="Оплатить L$ 10" name="fastpay 10"/>
+ <button label="Оплатить L$ 20" label_selected="Оплатить L$ 20" name="fastpay 20"/>
+ </panel>
+ <panel label="Поиск" name="InputPanel">
+ <text name="amount text">Другая сумма:</text>
+ <button label="Оплатить" label_selected="Оплатить" name="pay btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel btn"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_report_abuse.xml b/indra/newview/skins/default/xui/ru/floater_report_abuse.xml
index abbdeca180..67d847aa6b 100755
--- a/indra/newview/skins/default/xui/ru/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/ru/floater_report_abuse.xml
@@ -67,7 +67,7 @@
<combo_box.item label="Земля &gt; Посягательство &gt; Объекты или текстуры" name="Land__Encroachment__Objects_textures"/>
<combo_box.item label="Земля &gt; Посягательство &gt; Частицы" name="Land__Encroachment__Particles"/>
<combo_box.item label="Земля &gt; Посягательство &gt; Деревья/растения" name="Land__Encroachment__Trees_plants"/>
- <combo_box.item label="Пари или азартные игры" name="Wagering_gambling"/>
+ <combo_box.item label="Нарушение политики игр" name="Wagering_gambling"/>
<combo_box.item label="Другое" name="Other"/>
</combo_box>
<text name="abuser_name_title">
diff --git a/indra/newview/skins/default/xui/ru/floater_snapshot.xml b/indra/newview/skins/default/xui/ru/floater_snapshot.xml
index 8933f94c0b..97de279b8f 100755
--- a/indra/newview/skins/default/xui/ru/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/ru/floater_snapshot.xml
@@ -39,17 +39,8 @@
<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] КБ
- </text>
+ <button label="ОБНОВИТЬ" name="new_snapshot_btn"/>
<panel name="advanced_options_panel">
- <text name="advanced_options_label">
- ДОПОЛНИТЕЛЬНЫЕ ПАРАМЕТРЫ
- </text>
<text name="layer_type_label">
Захват:
</text>
@@ -68,4 +59,10 @@
<combo_box.item label="Без фильтра" name="NoFilter"/>
</combo_box>
</panel>
+ <text name="image_res_text">
+ [WIDTH] (ширина) x [HEIGHT] (высота) пикс.
+ </text>
+ <text name="file_size_label">
+ [SIZE] КБ
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_top_objects.xml b/indra/newview/skins/default/xui/ru/floater_top_objects.xml
index c7ece5c9c9..b045c5bff3 100755
--- a/indra/newview/skins/default/xui/ru/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/ru/floater_top_objects.xml
@@ -21,6 +21,12 @@
<floater.string name="none_descriptor">
Не найдено.
</floater.string>
+ <floater.string name="URLs">
+ URL-адреса
+ </floater.string>
+ <floater.string name="memory">
+ Память (КБ)
+ </floater.string>
<text name="title_text">
Загрузка...
</text>
@@ -30,7 +36,7 @@
<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="Дата" name="time"/>
<scroll_list.columns label="URL-адреса" name="URLs"/>
<scroll_list.columns label="Память (КБ)" name="memory"/>
</scroll_list>
diff --git a/indra/newview/skins/default/xui/ru/floater_twitter.xml b/indra/newview/skins/default/xui/ru/floater_twitter.xml
index 748092ff1f..3b9493ce98 100644
--- a/indra/newview/skins/default/xui/ru/floater_twitter.xml
+++ b/indra/newview/skins/default/xui/ru/floater_twitter.xml
@@ -1,17 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_twitter" title="TWITTER">
- <panel name="background">
- <tab_container name="tabs">
- <panel label="НАПИСАТЬ" name="panel_twitter_photo"/>
- <panel label="АККАУНТ" name="panel_twitter_account"/>
- </tab_container>
- <panel name="connection_status_panel">
- <text name="connection_error_text">
- Ошибка
- </text>
- <text name="connection_loading_text">
- Загрузка...
- </text>
- </panel>
- </panel>
+ <tab_container name="tabs">
+ <panel label="НАПИСАТЬ" name="panel_twitter_photo"/>
+ <panel label="АККАУНТ" name="panel_twitter_account"/>
+ </tab_container>
+ <text name="connection_error_text">
+ Ошибка
+ </text>
+ <text name="connection_loading_text">
+ Загрузка...
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/ru/menu_attachment_self.xml b/indra/newview/skins/default/xui/ru/menu_attachment_self.xml
index 2b1291a8d5..033d36484b 100755
--- a/indra/newview/skins/default/xui/ru/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/ru/menu_attachment_self.xml
@@ -8,6 +8,7 @@
<menu_item_call label="Мой внешний вид" name="Change Outfit"/>
<menu_item_call label="Изменить костюм" name="Edit Outfit"/>
<menu_item_call label="Изменить фигуру" name="Edit My Shape"/>
+ <menu_item_call label="Высота парения" name="Hover Height"/>
<menu_item_call label="Мои друзья" name="Friends..."/>
<menu_item_call label="Мои группы" name="Groups..."/>
<menu_item_call label="Мой профиль" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/ru/menu_avatar_self.xml b/indra/newview/skins/default/xui/ru/menu_avatar_self.xml
index e09117226c..8feaa3b99a 100755
--- a/indra/newview/skins/default/xui/ru/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/ru/menu_avatar_self.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Мой внешний вид" name="Chenge Outfit"/>
<menu_item_call label="Изменить костюм" name="Edit Outfit"/>
<menu_item_call label="Изменить фигуру" name="Edit My Shape"/>
+ <menu_item_call label="Высота парения" name="Hover Height"/>
<menu_item_call label="Мои друзья" name="Friends..."/>
<menu_item_call label="Мои группы" name="Groups..."/>
<menu_item_call label="Мой профиль" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/ru/menu_inventory.xml b/indra/newview/skins/default/xui/ru/menu_inventory.xml
index 308549c254..b8cbef8246 100755
--- a/indra/newview/skins/default/xui/ru/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/ru/menu_inventory.xml
@@ -1,5 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
+ <menu_item_call label="Создать список" name="Marketplace Create Listing"/>
+ <menu_item_call label="Связать список" name="Marketplace Associate Listing"/>
+ <menu_item_call label="Получить (обновить) список" name="Marketplace Get Listing"/>
+ <menu_item_call label="Проверка на ошибки" name="Marketplace Check Listing"/>
+ <menu_item_call label="Изменить список" name="Marketplace Edit Listing"/>
+ <menu_item_call label="Опубликовать" name="Marketplace List"/>
+ <menu_item_call label="Отменить публикацию" name="Marketplace Unlist"/>
+ <menu_item_call label="Активировать" name="Marketplace Activate"/>
+ <menu_item_call label="Деактивировать" name="Marketplace Deactivate"/>
<menu_item_call label="Поделиться" name="Share"/>
<menu_item_call label="Купить" name="Task Buy"/>
<menu_item_call label="Открыть" name="Task Open"/>
@@ -87,6 +96,7 @@
<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="Marketplace Copy"/>
+ <menu_item_call label="Переместить в списки товаров торгового центра" name="Marketplace Move"/>
<menu_item_call label="- нет действий -" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml
index 9fc0b6d44e..967374f8f5 100755
--- a/indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml
@@ -5,7 +5,7 @@
<menu_item_check label="Сортировать по времени" name="sort_by_recent"/>
<menu_item_check label="Всегда сортировать папки по имени" name="sort_folders_by_name"/>
<menu_item_check label="Показывать системные папки вверху" name="sort_system_folders_to_top"/>
- <menu_item_call label="Показать фильтры" name="show_filters"/>
+ <menu_item_call label="Показать фильтры..." name="show_filters"/>
<menu_item_call label="Сбросить фильтры" name="reset_filters"/>
<menu_item_call label="Закрыть все папки" name="close_folders"/>
<menu_item_call label="Очистить бюро находок" name="empty_lostnfound"/>
diff --git a/indra/newview/skins/default/xui/ru/menu_marketplace_view.xml b/indra/newview/skins/default/xui/ru/menu_marketplace_view.xml
new file mode 100644
index 0000000000..b299c8202f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_marketplace_view.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_marketplace_sort">
+ <menu_item_check label="Сортировать по объему запасов (от малых к большим)" name="sort_by_stock_amount"/>
+ <menu_item_check label="Показывать только папки списков" name="show_only_listing_folders"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_experience.xml b/indra/newview/skins/default/xui/ru/menu_url_experience.xml
new file mode 100644
index 0000000000..59af594c10
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_experience.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Копировать URL-адрес SL в буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml
index 266a1fb877..d22ca845f9 100755
--- a/indra/newview/skins/default/xui/ru/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml
@@ -8,13 +8,14 @@
<menu_item_call label="Новое окно инвентаря" name="NewInventoryWindow"/>
<menu_item_call label="Места..." name="Places"/>
<menu_item_call label="Подборка..." name="Picks"/>
+ <menu_item_call label="Приключения..." name="Experiences"/>
<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_item_call label="Ходьба / бег / полет..." name="WalkRunFly"/>
</menu>
<menu label="Статус" name="Status">
<menu_item_check label="Нет на месте" name="Away"/>
@@ -22,6 +23,7 @@
</menu>
<menu_item_call label="Купить L$..." name="Buy and Sell L$"/>
<menu_item_call label="Торговые исходящие..." name="MerchantOutbox"/>
+ <menu_item_call label="Списки товаров торгового центра..." name="MarketplaceListings"/>
<menu_item_call label="Информационная панель аккаунта..." name="Manage My Account"/>
<menu_item_call label="Настройки..." name="Preferences"/>
<menu_item_call label="Кнопки панели инструментов..." name="Toolbars"/>
@@ -46,7 +48,7 @@
<menu_item_check label="Друзья" name="My Friends"/>
<menu_item_check label="Группы" name="My Groups"/>
<menu_item_check label="Люди неподалеку" name="Active Speakers"/>
- <menu_item_call label="Черный список" name="Block List"/>
+ <menu_item_check label="Черный список" name="Block List"/>
<menu_item_check label="Не беспокоить" name="Do Not Disturb"/>
</menu>
<menu label="Мир" name="World">
@@ -60,7 +62,7 @@
<menu_item_call label="Снимок" name="Take Snapshot"/>
<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="RegionEstate"/>
<menu_item_call label="Мои владения..." name="My Land"/>
<menu_item_call label="Купить эту землю" name="Buy Land"/>
<menu label="Показать" name="LandShow">
@@ -247,6 +249,7 @@
<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="Region Debug Console"/>
<menu_item_check label="Оперативные таймеры" name="Fast Timers"/>
<menu_item_check label="Память" name="Memory"/>
<menu_item_check label="Статистика по сцене" name="Scene Statistics"/>
@@ -350,7 +353,7 @@
<menu_item_check label="Прикрепить объекты для интерполяции" name="Ping Interpolate Object Positions"/>
<menu_item_call label="Опустить пакет" name="Drop a Packet"/>
</menu>
- <menu_item_call label="Дамп камеры со скриптами" name="Dump Scripted Camera"/>
+ <menu_item_call label="Дамп камеры со скриптами" name="Dump Scripted Camera"/>
<menu label="Диктофон" name="Recorder">
<menu_item_call label="Начать воспроизведение" name="Start Playback"/>
<menu_item_call label="Остановить воспроизведение" name="Stop Playback"/>
diff --git a/indra/newview/skins/default/xui/ru/mime_types.xml b/indra/newview/skins/default/xui/ru/mime_types.xml
index 7ed23b5d53..9b120f2f40 100755
--- a/indra/newview/skins/default/xui/ru/mime_types.xml
+++ b/indra/newview/skins/default/xui/ru/mime_types.xml
@@ -44,6 +44,14 @@
Воспроизвести звук для этого места
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ Нет контента
+ </label>
+ <tooltip name="none_tooltip">
+ Здесь нет медиа
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Поток RealTime
diff --git a/indra/newview/skins/default/xui/ru/mime_types_linux.xml b/indra/newview/skins/default/xui/ru/mime_types_linux.xml
index a42b0bb9cc..6feb64679c 100755
--- a/indra/newview/skins/default/xui/ru/mime_types_linux.xml
+++ b/indra/newview/skins/default/xui/ru/mime_types_linux.xml
@@ -44,6 +44,14 @@
Воспроизвести звук для этого места
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ Нет контента
+ </label>
+ <tooltip name="none_tooltip">
+ Здесь нет медиа
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Поток RealTime
diff --git a/indra/newview/skins/default/xui/ru/mime_types_mac.xml b/indra/newview/skins/default/xui/ru/mime_types_mac.xml
index 7ed23b5d53..9b120f2f40 100755
--- a/indra/newview/skins/default/xui/ru/mime_types_mac.xml
+++ b/indra/newview/skins/default/xui/ru/mime_types_mac.xml
@@ -44,6 +44,14 @@
Воспроизвести звук для этого места
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ Нет контента
+ </label>
+ <tooltip name="none_tooltip">
+ Здесь нет медиа
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Поток RealTime
diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml
index c312bcbef4..70b9a25590 100755
--- a/indra/newview/skins/default/xui/ru/notifications.xml
+++ b/indra/newview/skins/default/xui/ru/notifications.xml
@@ -73,6 +73,10 @@
[MESSAGE]
<usetemplate name="okcancelbuttons" notext="Отмена" yestext="Да"/>
</notification>
+ <notification name="GenericAlertOK">
+ [MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="BadInstallation">
Произошла ошибка при обновлении [APP_NAME]. [http://get.secondlife.com Загрузите последнюю версию] клиента.
<usetemplate name="okbutton" yestext="OK"/>
@@ -125,6 +129,88 @@
Не удалось инициализировать торговый центр из-за ошибки системы или сети. Повторите попытку позже.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="StockPasteFailed">
+ Не удалось скопировать или переместить в папку запасов, ошибка:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantPasteFailed">
+ Не удалось скопировать или переместить в списки товаров торгового центра, ошибка:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantTransactionFailed">
+ Не удалось выполнить транзакцию с торговым центром, ошибка:
+
+ Причина: &apos;[ERROR_REASON]&apos;
+ [ERROR_DESCRIPTION]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantUnprocessableEntity">
+ Не удалось опубликовать этот продукт или активировать папку версии. Обычно это происходит из-за отсутствия информации в форме описания списка, но также может быть связано с ошибками в структуре папки. Отредактируйте список или проверьте папку списка на отсутствие ошибок.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantListingFailed">
+ Не удалось опубликовать в торговом центре, ошибка:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantFolderActivationFailed">
+ Не удалось активировать эту папку версии, ошибка:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantActiveChange">
+ Это действие вызовет изменение активного содержимого данного списка. Продолжить?
+ <usetemplate ignoretext="Подтверждать смену активного списка в торговом центре" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantMoveInventory">
+ При перетаскивании в окно списков товаров торгового центра предметы перемещаются со своего исходного места, а не копируются. Продолжить?
+ <usetemplate ignoretext="Подтверждать перемещение предмета из инвентаря в торговый центр" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmListingCutOrDelete">
+ В результате перемещения или удаления папки списка будет удален ваш список товаров в торговом центре. Если требуется сохранить список в торговом центре, переместите или удалите содержимое папки версии, которое необходимо изменить. Продолжить?
+ <usetemplate ignoretext="Подтверждать перемещение или удаление списка из торгового центра" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmCopyToMarketplace">
+ У вас нет прав на копирование этих предметов в торговый центр. Переместите их или оставьте здесь.
+ <usetemplate canceltext="Отмена" ignoretext="Подтверждать попытку копирования некопируемых предметов в торговый центр" name="yesnocancelbuttons" notext="Не перемещать предмет(ы)" yestext="Переместить предмет(ы)"/>
+ </notification>
+ <notification name="ConfirmMerchantUnlist">
+ Это действие вызовет отмену публикации списка. Продолжить?
+ <usetemplate ignoretext="Подтверждать отмену публикации активного списка в торговом центре" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantClearVersion">
+ Это действие вызовет деактивацию папки версии текущего списка. Продолжить?
+ <usetemplate ignoretext="Подтверждать деактивирование папки версии списка в торговом центре" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantListingNotUpdated">
+ Не удалось обновить этот список.
+[[URL] Щелкните здесь], чтобы изменить его в торговом центре.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantListingCannotWear">
+ Нельзя надеть одежду или часть тела, если они находятся в папке списков товаров торгового центра.
+ </notification>
+ <notification name="AlertMerchantListingInvalidID">
+ Неверный идентификатор списка.
+ </notification>
+ <notification name="AlertMerchantListingActivateRequired">
+ В этом списке несколько папок версий или нет ни одной. Самостоятельно выберите и активируйте одну папку позже.
+ <usetemplate ignoretext="Предупреждать об активировании папки версии, если создан список с несколькими папками версий" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderSplit">
+ Предметы разных типов распределены по отдельным папкам запасов, поэтому папка систематизирована так, чтобы ее можно было опубликовать.
+ <usetemplate ignoretext="Предупреждать о разделении папки запасов перед публикацией" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderEmpty">
+ Публикация вашего списка прекращена, так как папка запасов пуста. Добавьте предметы в папку запасов, чтобы опубликовать список снова.
+ <usetemplate ignoretext="Оповещать о неудавшейся публикации списка из-за того, что папка запасов пуста" name="okignore" yestext="OK"/>
+ </notification>
<notification name="CompileQueueSaveText">
Ошибка при передаче текста скрипта по следующей причине: [REASON]. Повторите попытку позже.
</notification>
@@ -469,6 +555,10 @@
Сохранить изменения?
<usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Не сохранять" yestext="Сохранить"/>
</notification>
+ <notification name="DeleteNotecard">
+ Удалить заметку?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
<notification name="GestureSaveFailedTooManySteps">
Не удалось сохранить жест.
Жест содержит слишком много этапов.
@@ -575,6 +665,9 @@
<notification name="RegionNoTerraforming">
В регионе [REGION] не разрешен терраформинг.
</notification>
+ <notification name="ParcelNoTerraforming">
+ Вам не разрешено терраформировать участок [PARCEL].
+ </notification>
<notification name="CannotCopyWarning">
У вас нет разрешения на копирование следующих предметов:
[ITEMS]
@@ -1825,6 +1918,30 @@ http://secondlife.com/download.
Удалить менеджера только для этого землевладения или для [ALL_ESTATES]?
<usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Для всех землевладений" yestext="Для этого землевладения"/>
</notification>
+ <notification label="Выбрать землевладение" name="EstateAllowedExperienceAdd">
+ Внести в список допущенных только для этого землевладения или для [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Для всех землевладений" yestext="Для этого землевладения"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateAllowedExperienceRemove">
+ Удалить из списка допущенных только для этого землевладения или для [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Для всех землевладений" yestext="Для этого землевладения"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateBlockedExperienceAdd">
+ Внести в список заблокированных только для этого землевладения или для [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Для всех землевладений" yestext="Для этого землевладения"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateBlockedExperienceRemove">
+ Удалить из списка заблокированных только для этого землевладения или для [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Для всех землевладений" yestext="Для этого землевладения"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateTrustedExperienceAdd">
+ Внести в ключевой список только для этого землевладения или для [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Для всех землевладений" yestext="Для этого землевладения"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateTrustedExperienceRemove">
+ Удалить из ключевой список только для этого землевладения или для [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Для всех землевладений" yestext="Для этого землевладения"/>
+ </notification>
<notification label="Подтвердить выбрасывание" name="EstateKickUser">
Выбросить пользователя [EVIL_USER] из этого землевладения?
<usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
@@ -1837,6 +1954,9 @@ http://secondlife.com/download.
Вы пытаетесь посетить регион, контент в котором не соответствует вашим настройкам. Попробуйте изменить настройки в меню «Я &gt; Настройки &gt; Общие».
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="SLM_UPDATE_FOLDER">
+ [MESSAGE]
+ </notification>
<notification name="RegionEntryAccessBlocked_AdultsOnlyContent">
Вы пытаетесь посетить регион, контент в котором имеет рейтинг [REGIONMATURITY] и предназначен только для взрослых.
<url name="url">
@@ -1899,6 +2019,10 @@ http://secondlife.com/download.
При телепортации возникли технические проблемы, так как ваши настройки не синхронизированы с сервером.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="RegionTPSpecialUsageBlocked">
+ Не удалось войти в регион. «[REGION_NAME]» – это регион развивающих игр, и для входа в него надо соответствовать определенным условиям. Подробнее см. на странице [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="PreferredMaturityChanged">
Вы больше не будете получать уведомлений о посещении региона с контентом рейтинга [RATING]. Настройки для контента можно изменить на будущее с помощью команд меню «Я &gt; Настройки &gt; Общие».
<usetemplate name="okbutton" yestext="OK"/>
@@ -2120,6 +2244,10 @@ http://secondlife.com/download.
<ignore name="ignore" text="Установлено действие «Заплатить за объект» при построении объекта без скрипта money()"/>
</form>
</notification>
+ <notification name="PayConfirmation">
+ Подтвердите оплату L$[AMOUNT] для [TARGET].
+ <usetemplate ignoretext="Подтверждать перед оплатой (для сумм более L$200)" name="okcancelignore" notext="Отмена" yestext="Оплатить"/>
+ </notification>
<notification name="OpenObjectCannotCopy">
В этом объекте нет вещей, которые вам разрешено копировать.
</notification>
@@ -2205,6 +2333,9 @@ http://secondlife.com/download.
<button ignore="Не заменять" name="No" text="Отмена"/>
</form>
</notification>
+ <notification name="TooManyWearables">
+ Нельзя носить папку, содержащую более [AMOUNT] вещей. Это ограничение можно изменить в меню «Дополнительно &gt; Настройки отладки &gt; WearFolderLimit.
+ </notification>
<notification label="Предупреждение режима «Не беспокоить»" name="DoNotDisturbModePay">
Включен режим «Не беспокоить». Вы не будете получать никаких предметов, предлагаемых в обмен за этот платеж.
@@ -2657,9 +2788,6 @@ http://secondlife.com/download.
<notification name="NoValidCircuit">
Нет подходящего кода канала.
</notification>
- <notification name="NoValidTimestamp">
- Нет подходящей метки времени.
- </notification>
<notification name="NoPendingConnection">
Невозможно создать отложенное соединение.
</notification>
@@ -2814,7 +2942,7 @@ http://secondlife.com/download.
[MESSAGE]
-Из объекта: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, владелец: [NAME]?
+Из объекта: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, владелец: [NAME]
<form name="form">
<button name="Gotopage" text="Перейти на страницу"/>
<button name="Cancel" text="Отмена"/>
@@ -2840,6 +2968,72 @@ http://secondlife.com/download.
<button name="Mute" text="Заблокировать"/>
</form>
</notification>
+ <notification name="ExperienceAcquireFailed">
+ Невозможно приобрести новое приключение:
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NotInGroupExperienceProfileMessage">
+ Изменение в группе приключения игнорируется, так как владелец не принадлежит к выбранной группе.
+ </notification>
+ <notification name="UneditableExperienceProfileMessage">
+ Нередактируемое поле «[field]» игнорируется при обновлении профиля приключения.
+ </notification>
+ <notification name="RestrictedToOwnerExperienceProfileMessage">
+ Игнорируются изменения в поле «[field]», которые может вносить только владелец приключения.
+ </notification>
+ <notification name="MaturityRatingExceedsOwnerExperienceProfileMessage">
+ Вы не можете устанавливать для приключения рейтинг зрелости выше, чем у владельца.
+ </notification>
+ <notification name="RestrictedTermExperienceProfileMessage">
+ Следующие условия не допускают обновление названия и (или) описания профиля приключения: [extra_info]
+ </notification>
+ <notification name="TeleportedHomeExperienceRemoved">
+ Вы были телепортированы из региона [region_name] за удаление приключения secondlife:///app/experience/[public_id]/profile. Вам больше не разрешено пребывание в этом регионе.
+ <form name="form">
+ <ignore name="ignore" text="Выброшен из региона за удаление приключения"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperienceEntry">
+ Вам был разрешен вход в регион [region_name] путем участия в ключевом приключении secondlife:///app/experience/[public_id]/profile. При удалении этого приключения вы можете быть выброшены из региона.
+ <form name="form">
+ <ignore name="ignore" text="Приключение разрешило вход в регион"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperiencesAvailable">
+ У вас нет доступа к этому месту назначения. Вам может быть разрешен вход в этот регион при принятии следующего приключения:
+
+[EXPERIENCE_LIST]
+
+Могут быть доступны следующие ключевые приключения.
+ </notification>
+ <notification name="ExperienceEvent">
+ Разрешен объект для события [EventType] приключением secondlife:///app/experience/[public_id]/profile.
+ Владелец: secondlife:///app/agent/[OwnerID]/inspect
+ Название объекта: [ObjectName]
+ Название участка: [ParcelName]
+ </notification>
+ <notification name="ExperienceEventAttachment">
+ Разрешено присоединение для события [EventType] приключением secondlife:///app/experience/[public_id]/profile.
+ Владелец: secondlife:///app/agent/[OwnerID]/inspect
+ </notification>
+ <notification name="ScriptQuestionExperience">
+ Объект «&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;», владелец которого – «[NAME]», требует вашего участия в приключении [GRID_WIDE]:
+
+[EXPERIENCE]
+
+После получения разрешения это сообщение больше не будет отображаться для данного приключения, пока оно не будет отозвано из профиля приключения.
+
+Скрипты, связанные с данным приключением, смогут выполнять следующие действия в регионах, где активно приключение:
+
+[QUESTIONS]Это правильно?
+ <form name="form">
+ <button name="BlockExperience" text="Заблокировать приключение"/>
+ <button name="Mute" text="Заблокировать объект"/>
+ <button name="Yes" text="Да"/>
+ <button name="No" text="Нет"/>
+ </form>
+ </notification>
<notification name="ScriptQuestionCaution">
Предупреждение. Объект «&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;» требует полного доступа к вашему аккаунту для Linden-долларов. Если разрешить такой доступ, объект сможет в любое время снимать средства с вашего аккаунта или полностью опустошать его неоднократно и без предупреждения.
@@ -3159,6 +3353,10 @@ http://secondlife.com/download.
( [EXISTENCE] сек. жизни )
Вы локально обновили готовую текстуру [RESOLUTION] для «[BODYREGION]» через [TIME] сек.
</notification>
+ <notification name="CannotUploadTexture">
+ Невозможно загрузить текстуру.
+[REASON]
+ </notification>
<notification name="LivePreviewUnavailable">
Просмотр этой текстуры невозможен, так как запрещено ее копирование и/или перенос.
<usetemplate ignoretext="Предупреждать, если режим просмотра вживую недоступен для текстур с запрещенным копированием и/или переносом" name="okignore" yestext="OK"/>
@@ -3733,9 +3931,11 @@ http://secondlife.com/download.
</notification>
<notification name="TeleportedByAttachment">
Вы были телепортированы прикрепленным объектом [ITEM_ID]
+ <usetemplate ignoretext="Телепортация: вы были телепортированы прикрепленным объектом" name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOnParcel">
Вы были телепортированы объектом «[OBJECT_NAME]» на участке «[PARCEL_NAME]»
+ <usetemplate ignoretext="Телепортация: вы были телепортированы объектом на участке" name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOwnedBy">
Вы были телепортированы объектом «[OBJECT_NAME]», владелец – [OWNER_ID]
@@ -4067,7 +4267,7 @@ http://secondlife.com/download.
<usetemplate ignoretext="Невозможно переместить файлы. Восстановлен прежний путь." name="okignore" yestext="OK"/>
</notification>
<notification name="DefaultObjectPermissions">
- Ошибка при сохранении стандартных разрешений по следующей причине: [REASON]. Попробуйте задать стандартные разрешения через некоторое время.
+ Ошибка при сохранении стандартных разрешений на объект: [REASON]. Попробуйте задать стандартные разрешения через некоторое время.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ChatHistoryIsBusyAlert">
diff --git a/indra/newview/skins/default/xui/ru/panel_experience_info.xml b/indra/newview/skins/default/xui/ru/panel_experience_info.xml
new file mode 100644
index 0000000000..bd5f81506e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_experience_info.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_experience_info">
+ <text name="title" value="Профиль приключения"/>
+ <scroll_container name="xp_scroll">
+ <panel name="scrolling_panel">
+ <layout_stack>
+ <layout_panel>
+ <text name="experience_title" value="Kyle&apos;s Superhero RPG"/>
+ </layout_panel>
+ <layout_panel name="location panel">
+ <text name="Location">
+ Место:
+ </text>
+ <text name="LocationTextText">
+ какое-то место
+ </text>
+ <button label="Телепортация" name="teleport_btn"/>
+ <button label="Карта" name="map_btn"/>
+ </layout_panel>
+ <layout_panel name="marketplace panel">
+ <text name="Location">
+ Магазин торгового центра:
+ </text>
+ <text name="LocationTextText">
+ какое-то место
+ </text>
+ </layout_panel>
+ <layout_panel>
+ <text name="ContentRating">
+ Рейтинг:
+ </text>
+ <text name="ContentRatingText">
+ Для взрослых
+ </text>
+ <text name="Owner">
+ Владелец:
+ </text>
+ <text name="OwnerText">
+ Kyle
+ </text>
+ <button label="Изменить" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_experience_list_editor.xml b/indra/newview/skins/default/xui/ru/panel_experience_list_editor.xml
new file mode 100644
index 0000000000..fdf3ec8188
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_experience_list_editor.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="experince_list_editor">
+ <panel.string name="loading">
+ загрузка…
+ </panel.string>
+ <panel.string name="panel_allowed">
+ Разрешенные приключения:
+ </panel.string>
+ <panel.string name="panel_blocked">
+ Заблокированные приключения:
+ </panel.string>
+ <panel.string name="panel_trusted">
+ Ключевые приключения:
+ </panel.string>
+ <panel.string name="no_results">
+ (пусто)
+ </panel.string>
+ <text name="text_name">
+ Список приключений
+ </text>
+ <scroll_list name="experience_list">
+ <columns label="Название" name="experience_name"/>
+ </scroll_list>
+ <button label="Добавить..." name="btn_add"/>
+ <button label="Удалить" name="btn_remove"/>
+ <button label="Профиль…" name="btn_profile"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_experience_list_item.xml b/indra/newview/skins/default/xui/ru/panel_experience_list_item.xml
new file mode 100644
index 0000000000..1af9915bf2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_experience_list_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiences">
+ <text name="experience_name">
+ Псевдо-имя
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_experience_log.xml b/indra/newview/skins/default/xui/ru/panel_experience_log.xml
new file mode 100644
index 0000000000..043dd4db17
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_experience_log.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="EVENTS">
+ <string name="no_events" value="Нет событий."/>
+ <string name="loading" value="загрузка…"/>
+ <layout_stack>
+ <layout_panel>
+ <scroll_list name="experience_log_list">
+ <columns label="Время" name="time"/>
+ <columns label="Событие" name="event"/>
+ <columns label="Приключение" name="experience_name"/>
+ <columns label="Объект" name="object_name"/>
+ </scroll_list>
+ <button label="Уведомить" name="btn_notify"/>
+ <button label="Профиль" name="btn_profile_xp"/>
+ <button label="Пожаловаться" name="btn_report_xp"/>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <check_box label="Уведомлять обо всех событиях дн." name="notify_all"/>
+ <button label="Очистить" name="btn_clear"/>
+ <button label="&lt;" name="btn_prev"/>
+ <button label="&gt;" name="btn_next"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_experience_search.xml b/indra/newview/skins/default/xui/ru/panel_experience_search.xml
new file mode 100644
index 0000000000..38d047f509
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_experience_search.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="SEARCH">
+ <string name="not_found">
+ Текст «[TEXT]» не найден
+ </string>
+ <string name="no_results">
+ Нет результатов
+ </string>
+ <string name="searching">
+ Поиск...
+ </string>
+ <string name="loading">
+ Загрузка...
+ </string>
+ <string name="maturity_icon_general">
+ &quot;Parcel_PG_Light&quot;
+ </string>
+ <string name="maturity_icon_moderate">
+ &quot;Parcel_M_Light&quot;
+ </string>
+ <string name="maturity_icon_adult">
+ &quot;Parcel_R_Light&quot;
+ </string>
+ <panel name="search_panel">
+ <button label="Перейти" name="find"/>
+ <icons_combo_box label="Умеренный" name="maturity">
+ <icons_combo_box.item label="Для взрослых" name="Adult" value="42"/>
+ <icons_combo_box.item label="Умеренный" name="Mature" value="21"/>
+ <icons_combo_box.item label="Общий" name="PG" value="13"/>
+ </icons_combo_box>
+ <scroll_list name="search_results">
+ <columns label="Название" name="experience_name"/>
+ <columns label="Владелец" name="owner"/>
+ </scroll_list>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+ <button label="Посмотреть профиль" name="profile_btn"/>
+ <button label="&lt;" name="left_btn"/>
+ <button label="&gt;" name="right_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_experiences.xml b/indra/newview/skins/default/xui/ru/panel_experiences.xml
new file mode 100644
index 0000000000..56b962a77f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_experiences.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiences">
+ <string name="loading_experiences" value="Загрузка приключений..."/>
+ <string name="no_experiences" value="Нет приключений."/>
+ <string name="acquire" value="Приобрести приключение"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_facebook_friends.xml b/indra/newview/skins/default/xui/ru/panel_facebook_friends.xml
index 518452953d..746da8d523 100644
--- a/indra/newview/skins/default/xui/ru/panel_facebook_friends.xml
+++ b/indra/newview/skins/default/xui/ru/panel_facebook_friends.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_friends">
<string name="facebook_friends_empty" value="Сейчас у вас нет друзей по Facebook, которые также были бы жителями Second Life. Предложите своим друзьям по Facebook присоединиться к Second Life!"/>
- <string name="facebook_friends_no_connected" value="Сейчас вы не подключены к Facebook. Перейдите на вкладку «Аккаунт», чтобы подключиться и включить эту функцию."/>
+ <string name="facebook_friends_no_connected" value="Сейчас вы не подключены к Facebook. Перейдите на вкладку «Статус», чтобы подключиться и включить эту функцию."/>
<accordion name="friends_accordion">
<accordion_tab name="tab_second_life_friends" title="Друзья по SL"/>
<accordion_tab name="tab_suggested_friends" title="Добавить этих людей как друзей по SL"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_facebook_photo.xml b/indra/newview/skins/default/xui/ru/panel_facebook_photo.xml
index 783294be86..143a57fec7 100644
--- a/indra/newview/skins/default/xui/ru/panel_facebook_photo.xml
+++ b/indra/newview/skins/default/xui/ru/panel_facebook_photo.xml
@@ -1,26 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Разрешение изображения">
- <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="1200x630" name="1200x630"/>
- </combo_box>
- <combo_box name="filters_combobox" tool_tip="Фильтры изображений">
- <combo_box.item label="Без фильтра" name="NoFilter"/>
- </combo_box>
- <button label="Обновить" name="new_snapshot_btn" tool_tip="Щелкните для обновления"/>
- <button label="Просмотр" name="big_preview_btn" tool_tip="Щелкните для смены вида"/>
- <text name="caption_label">
- Комментарий (не обязательно):
- </text>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Опубликовать" name="post_photo_btn"/>
- <button label="Отмена" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <combo_box name="resolution_combobox" tool_tip="Разрешение изображения">
+ <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="1200x630" name="1200x630"/>
+ </combo_box>
+ <combo_box name="filters_combobox" tool_tip="Фильтры изображений">
+ <combo_box.item label="Без фильтра" name="NoFilter"/>
+ </combo_box>
+ <button label="Обновить" name="new_snapshot_btn" tool_tip="Щелкните для обновления"/>
+ <button label="Просмотр" name="big_preview_btn" tool_tip="Щелкните для смены вида"/>
+ <text name="caption_label">
+ Комментарий (не обязательно):
+ </text>
+ <button label="Опубликовать" name="post_photo_btn"/>
+ <button label="Отмена" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_facebook_place.xml b/indra/newview/skins/default/xui/ru/panel_facebook_place.xml
index 913d327e92..7d0917a43a 100644
--- a/indra/newview/skins/default/xui/ru/panel_facebook_place.xml
+++ b/indra/newview/skins/default/xui/ru/panel_facebook_place.xml
@@ -1,17 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_place">
- <layout_stack name="stack_place">
- <layout_panel name="place_detail_panel">
- <text name="place_caption_label">
- Напишите о том, где вы:
- </text>
- </layout_panel>
- <layout_panel name="place_map_panel">
- <check_box initial_value="false" label="" name="add_place_view_cb"/>
- </layout_panel>
- <layout_panel name="place_button_panel">
- <button label="Опубликовать" name="post_place_btn"/>
- <button label="Отмена" name="cancel_place_btn"/>
- </layout_panel>
- </layout_stack>
+ <text name="place_caption_label">
+ Напишите о том, где вы:
+ </text>
+ <check_box initial_value="false" label="Включить вид места сверху" name="add_place_view_cb"/>
+ <button label="Опубликовать" name="post_place_btn"/>
+ <button label="Отмена" name="cancel_place_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_facebook_status.xml b/indra/newview/skins/default/xui/ru/panel_facebook_status.xml
index a59f132a01..c651a8087c 100644
--- a/indra/newview/skins/default/xui/ru/panel_facebook_status.xml
+++ b/indra/newview/skins/default/xui/ru/panel_facebook_status.xml
@@ -1,14 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_status">
- <layout_stack name="stack_status">
- <layout_panel name="status_detail_panel">
- <text name="status_caption_label">
- О чем вы думаете?
- </text>
- </layout_panel>
- <layout_panel name="status_button_panel">
- <button label="Опубликовать" name="post_status_btn"/>
- <button label="Отмена" name="cancel_status_btn"/>
- </layout_panel>
- </layout_stack>
+ <string name="facebook_connected" value="Вы подключились к Facebook как:"/>
+ <string name="facebook_disconnected" value="Не подключено к Facebook"/>
+ <text name="account_caption_label">
+ Не подключено к Facebook.
+ </text>
+ <panel name="panel_buttons">
+ <button label="Подключение..." name="connect_btn"/>
+ <button label="Отключить" name="disconnect_btn"/>
+ <text name="account_learn_more_label">
+ [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 О публикации в Facebook]
+ </text>
+ </panel>
+ <text name="status_caption_label">
+ О чем вы думаете?
+ </text>
+ <button label="Опубликовать" name="post_status_btn"/>
+ <button label="Отмена" name="cancel_status_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_flickr_photo.xml b/indra/newview/skins/default/xui/ru/panel_flickr_photo.xml
index 0c93e28911..9dd68699ca 100644
--- a/indra/newview/skins/default/xui/ru/panel_flickr_photo.xml
+++ b/indra/newview/skins/default/xui/ru/panel_flickr_photo.xml
@@ -1,40 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_flickr_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Разрешение изображения">
- <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>
- <combo_box name="filters_combobox" tool_tip="Фильтры изображений">
- <combo_box.item label="Без фильтра" name="NoFilter"/>
- </combo_box>
- <button label="Обновить" name="new_snapshot_btn" tool_tip="Щелкните для обновления"/>
- <button label="Просмотр" name="big_preview_btn" tool_tip="Щелкните для смены вида"/>
- <text name="title_label">
- Название:
- </text>
- <text name="description_label">
- Описание:
- </text>
- <check_box initial_value="true" label="Добавить в конец описания расположение в SL" name="add_location_cb"/>
- <text name="tags_label">
- Теги:
- </text>
- <text name="tags_help_label">
- Разделяйте теги пробелами. Теги из нескольких слов заключайте в кавычки.
- </text>
- <combo_box name="rating_combobox" tool_tip="Рейтинг контента Flickr">
- <combo_box.item label="Безопасный рейтинг Flickr" name="SafeRating"/>
- <combo_box.item label="Умеренный рейтинг Flickr" name="ModerateRating"/>
- <combo_box.item label="Ограниченный рейтинг Flickr" name="RestrictedRating"/>
- </combo_box>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Передать" name="post_photo_btn"/>
- <button label="Отмена" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <combo_box name="resolution_combobox" tool_tip="Разрешение изображения">
+ <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>
+ <combo_box name="filters_combobox" tool_tip="Фильтры изображений">
+ <combo_box.item label="Без фильтра" name="NoFilter"/>
+ </combo_box>
+ <button label="Обновить" name="new_snapshot_btn" tool_tip="Щелкните для обновления"/>
+ <button label="Просмотр" name="big_preview_btn" tool_tip="Щелкните для смены вида"/>
+ <text name="title_label">
+ Название:
+ </text>
+ <text name="description_label">
+ Описание:
+ </text>
+ <check_box initial_value="true" label="Добавить в конец описания расположение в SL" name="add_location_cb"/>
+ <text name="tags_label">
+ Теги:
+ </text>
+ <text name="tags_help_label">
+ Разделяйте теги пробелами. Теги из нескольких слов заключайте в кавычки.
+ </text>
+ <combo_box name="rating_combobox" tool_tip="Рейтинг контента Flickr">
+ <combo_box.item label="Безопасный рейтинг Flickr" name="SafeRating"/>
+ <combo_box.item label="Умеренный рейтинг Flickr" name="ModerateRating"/>
+ <combo_box.item label="Ограниченный рейтинг Flickr" name="RestrictedRating"/>
+ </combo_box>
+ <button label="Передать" name="post_photo_btn"/>
+ <button label="Отмена" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/ru/panel_group_info_sidetray.xml
index 16aaa71268..0ec667e3b2 100755
--- a/indra/newview/skins/default/xui/ru/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/ru/panel_group_info_sidetray.xml
@@ -23,6 +23,7 @@
<accordion_tab name="group_roles_tab" title="Роли и участники"/>
<accordion_tab name="group_notices_tab" title="Уведомления"/>
<accordion_tab name="group_land_tab" title="Земля/активы"/>
+ <accordion_tab name="group_experiences_tab" title="Приключения"/>
</accordion>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/ru/panel_login.xml b/indra/newview/skins/default/xui/ru/panel_login.xml
index a19304f2fd..2e0ae89b28 100755
--- a/indra/newview/skins/default/xui/ru/panel_login.xml
+++ b/indra/newview/skins/default/xui/ru/panel_login.xml
@@ -1,26 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_login">
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php
- </panel.string>
+ <panel.string name="forgot_password_url">http://secondlife.com/account/request.php</panel.string>
<layout_stack name="ui_stack">
<layout_panel name="ui_container">
<combo_box label="Имя пользователя" name="username_combo" tool_tip="Имя пользователя, которое вы выбрали при регистрации, например, «bobsmith12» или «Steller Sunshine»"/>
<line_editor label="Пароль" name="password_edit"/>
- <check_box label="Запомнить меня" name="remember_check"/>
- <text name="forgot_password_text">
- Забыли пароль?
- </text>
- <button label="Войти" name="connect_btn"/>
- <text name="At_My_Last_Location_Label" font="SansSerifSmall">
- В последнее место
- </text>
<combo_box label="Мои любимые места" name="start_location_combo">
+ <combo_box.item label="Последнее местоположение" name="MyLastLocation"/>
<combo_box.item label="Мой дом" name="MyHome"/>
</combo_box>
- <button label="Войти" name="connect_favorite_btn"/>
- <line_editor label="Введите местоположение" name="location_edit" font="SansSerifSmall" />
- <button label="Войти" name="connect_location_btn"/>
+ <button label="Войти" name="connect_btn"/>
+ <check_box label="Запомнить меня" name="remember_check"/>
+ <text name="forgot_password_text">Забыли пароль?</text>
<combo_box label="Выберите сетку" name="server_combo"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/ru/panel_marketplace_listings.xml b/indra/newview/skins/default/xui/ru/panel_marketplace_listings.xml
new file mode 100644
index 0000000000..1f903b1046
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_marketplace_listings.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Торговый центр" name="Marketplace Panel">
+ <panel name="tool_panel">
+ <menu_button name="sort_btn" tool_tip="Параметры просмотра/сортировки"/>
+ <button name="add_btn" tool_tip="Создать новую папку списка"/>
+ <button label="Проверка на ошибки" name="audit_btn" tool_tip="Проверьте свои списки товаров в торговом центре"/>
+ </panel>
+ <panel name="tab_container_panel">
+ <filter_editor label="Фильтровать списки товаров в торговом центре" name="filter_editor"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_marketplace_listings_inventory.xml b/indra/newview/skins/default/xui/ru/panel_marketplace_listings_inventory.xml
new file mode 100644
index 0000000000..ff7b30188f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_marketplace_listings_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="ВСЕ" name="All Items" tool_tip="Перетащите сюда предметы, чтобы внести их в список"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_marketplace_listings_listed.xml b/indra/newview/skins/default/xui/ru/panel_marketplace_listings_listed.xml
new file mode 100644
index 0000000000..b42a82084f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_marketplace_listings_listed.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="ОПУБЛИКОВАННЫЕ" name="Active Items"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_marketplace_listings_unassociated.xml b/indra/newview/skins/default/xui/ru/panel_marketplace_listings_unassociated.xml
new file mode 100644
index 0000000000..fc69e3c362
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_marketplace_listings_unassociated.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="НЕ СВЯЗАННЫЕ" name="Unassociated Items"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_marketplace_listings_unlisted.xml b/indra/newview/skins/default/xui/ru/panel_marketplace_listings_unlisted.xml
new file mode 100644
index 0000000000..c630129d44
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_marketplace_listings_unlisted.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="НЕОПУБЛИКОВАННЫЕ" name="Inactive Items"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_postcard_settings.xml b/indra/newview/skins/default/xui/ru/panel_postcard_settings.xml
index dc9d59008f..d95cdbcf0a 100755
--- a/indra/newview/skins/default/xui/ru/panel_postcard_settings.xml
+++ b/indra/newview/skins/default/xui/ru/panel_postcard_settings.xml
@@ -7,17 +7,7 @@
<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>
+ <spinner label="Ширина x Высота" name="postcard_snapshot_width"/>
+ <check_box label="Сохранять пропорции" name="postcard_keep_aspect_check"/>
+ <slider label="Качество:" name="image_quality_slider"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml
index 1741397a84..d00f58dbff 100755
--- a/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml
@@ -14,9 +14,9 @@
<text name="Web:">
Браузер:
</text>
- <radio_group name="use_external_browser">
- <radio_item label="Использовать мой браузер (IE, Firefox, Safari)" name="external" tool_tip="Будет использоваться браузер, заданный в системе по умолчанию. Не рекомендуется, если [APP_NAME] работает в полноэкранном режиме." value="true"/>
- <radio_item label="Использовать встроенный браузер" name="internal" tool_tip="Для просмотра справки, ссылок на веб-страницы и т. д. будет использоваться встроенный браузер. Этот браузер открывается как новое окно в [APP_NAME]." value=""/>
+ <radio_group name="preferred_browser_behavior">
+ <radio_item label="Использовать мой браузер (Chrome, Firefox, IE) для всех ссылок" name="internal" tool_tip="Будет использоваться браузер, заданный в системе по умолчанию. Не рекомендуется, если [APP_NAME] работает в полноэкранном режиме." value="0"/>
+ <radio_item label="Использовать встроенный браузер только для ссылок Second Life" name="external" tool_tip="Стандартный браузер системы будет использоваться для справки, ссылок Интернета и т.д. Встроенный браузер будет использоваться только для ссылок LindenLab/SecondLife." value="1"/>
</radio_group>
<check_box initial_value="true" label="Разрешить плагины" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Принимать файлы cookie" name="cookies_enabled"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_region_experiences.xml b/indra/newview/skins/default/xui/ru/panel_region_experiences.xml
new file mode 100644
index 0000000000..4fd70b5650
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_region_experiences.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Приключения" name="Experiences">
+ <panel.string name="trusted_estate_text">
+ Любое приключение может быть ключевым.
+
+У ключевых приключений есть разрешение на запуск в этом землевладении.
+
+Кроме того, если в землевладении не разрешен публичный доступ, то жители, участвующие в любом ключевом приключении, могут входить в землевладение и оставаться в нем до тех пор, пока они находятся в ключевом приключении.
+ </panel.string>
+ <panel.string name="allowed_estate_text">
+ Могут быть разрешены только приключения, привязанные к земле.
+
+У разрешенных приключений есть разрешение на запуск в этом землевладении.
+ </panel.string>
+ <panel.string name="blocked_estate_text">
+ Блокировать можно только привязанные к сетке приключения.
+
+Запуск заблокированных приключений в этом землевладении невозможен.
+ </panel.string>
+ <panel.string name="estate_caption">
+ Изменение параметров на этой вкладке повлияет на все регионы этого землевладения.
+ </panel.string>
+ <panel.string name="allowed_parcel_text">
+ Могут быть разрешены только приключения, привязанные к земле.
+
+У разрешенных приключений есть разрешение на запуск на этом участке, если они не заблокированы землевладением.
+ </panel.string>
+ <panel.string name="blocked_parcel_text">
+ Любое приключение жителя может быть заблокировано.
+
+Запуск заблокированных приключений на этом участке невозможен.
+ </panel.string>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_script_experience.xml b/indra/newview/skins/default/xui/ru/panel_script_experience.xml
new file mode 100644
index 0000000000..f798884c6b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_script_experience.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel name="script_experience" title="ПРИКЛЮЧЕНИЕ">
+ <button label="Приключение" name="Expand Experience"/>
+ <check_box label="Используется приключение" name="enable_xp"/>
+ <layout_stack name="xp_details">
+ <layout_panel>
+ <combo_box label="Выбрать приключение..." name="Experiences..."/>
+ </layout_panel>
+ </layout_stack>
+ <text name="No Experiences">
+ Вы не являетесь автором приключений.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml
index 53a150c9f9..adc612dfd8 100755
--- a/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml
@@ -1,7 +1,7 @@
<?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]. Чтобы сохранить его как текстуру, выберите один из квадратных форматов.
@@ -13,8 +13,8 @@
<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"/>
+ <spinner label="Ширина x Высота" 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"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_local.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_local.xml
index 446b9bb2fd..80ad8f7703 100755
--- a/indra/newview/skins/default/xui/ru/panel_snapshot_local.xml
+++ b/indra/newview/skins/default/xui/ru/panel_snapshot_local.xml
@@ -1,7 +1,7 @@
<?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"/>
@@ -13,24 +13,17 @@
<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>
+ <spinner label="Ширина x Высота" name="local_snapshot_width"/>
+ <check_box label="Сохранять пропорции" name="local_keep_aspect_check"/>
+ <text name="local_format_label">
+ Формат:
+ </text>
+ <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"/>
<button label="Отмена" name="cancel_btn"/>
<flyout_button label="Сохранить" name="save_btn" tool_tip="Сохранить изображение в файл">
<flyout_button.item label="Сохранить" name="save_item"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml
index 8cd69951ca..9a5bbf3bac 100755
--- a/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml
@@ -1,16 +1,10 @@
<?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_computer_btn"/>
+ <button label="Сохранить в инвентаре (L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="Загрузить в профиль" name="save_to_profile_btn"/>
+ <button label="Загрузить в Facebook" name="send_to_facebook_btn"/>
+ <button label="Загрузить в Twitter" name="send_to_twitter_btn"/>
+ <button label="Загрузить на Flickr" name="send_to_flickr_btn"/>
<button label="Отправить по почте" name="save_to_email_btn"/>
- <button label="Сохранить в моем инвентаре (L$[AMOUNT])" name="save_to_inventory_btn"/>
- <button label="Сохранить на моем компьютере" name="save_to_computer_btn"/>
- <text name="send_to_facebook_textbox">
- Отправить: [secondlife:/// Facebook]
- </text>
- <text name="send_to_twitter_textbox">
- [secondlife:/// Twitter]
- </text>
- <text name="send_to_flickr_textbox">
- [secondlife:/// Flickr]
- </text>
</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml
index 47f4caf8e3..8f6ab612ff 100755..100644
--- a/indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml
+++ b/indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml
@@ -10,8 +10,12 @@
Отправка...
</string>
<text name="title">
- Электронное письмо
+ Почта
</text>
- <button label="Сообщение" name="message_btn"/>
- <button label="Настройки" name="settings_btn"/>
+ <tab_container name="postcard_tabs">
+ <panel label="Сообщение" name="panel_postcard_message"/>
+ <panel label="Настройки" name="panel_postcard_settings"/>
+ </tab_container>
+ <button label="Отмена" name="cancel_btn"/>
+ <button label="Отправить" name="send_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_profile.xml
index 79a9ef58d0..6b3401aa5c 100755
--- a/indra/newview/skins/default/xui/ru/panel_snapshot_profile.xml
+++ b/indra/newview/skins/default/xui/ru/panel_snapshot_profile.xml
@@ -1,7 +1,7 @@
<?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"/>
@@ -10,19 +10,12 @@
<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>
+ <spinner label="Ширина x Высота" name="profile_snapshot_width"/>
+ <check_box label="Сохранять пропорции" name="profile_keep_aspect_check"/>
+ <text name="caption_label">
+ Подпись:
+ </text>
+ <check_box initial_value="true" label="Включить расположение" name="add_location_cb"/>
<button label="Отмена" name="cancel_btn"/>
<button label="Опубликовать" name="post_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_status_bar.xml b/indra/newview/skins/default/xui/ru/panel_status_bar.xml
index 9c84ff1fd8..630925fa60 100755
--- a/indra/newview/skins/default/xui/ru/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/ru/panel_status_bar.xml
@@ -1,28 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <panel.string name="packet_loss_tooltip">
- Потери пакетов
- </panel.string>
- <panel.string name="bandwidth_tooltip">
- Ширина канала
- </panel.string>
- <panel.string name="time">
- [hour, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string name="timeTooltip">
- [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
- </panel.string>
- <panel.string name="buycurrencylabel">
- L$ [AMT]
- </panel.string>
+ <panel.string name="packet_loss_tooltip">Потери пакетов</panel.string>
+ <panel.string name="bandwidth_tooltip">Ширина канала</panel.string>
+ <panel.string name="time">[hour, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt]</panel.string>
+ <panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>
+ <panel.string name="buycurrencylabel">L$ [AMT]</panel.string>
<panel left="-450" name="balance_bg" width="240">
- <text name="balance" tool_tip="Щелкните для обновления вашего баланса L$" value="L$20"/>
+ <text name="balance" tool_tip="Щелкните для обновления вашего баланса L$" value="L$??"/>
<button label="Купить L$" name="buyL" tool_tip="Щелкните для покупки L$"/>
<button label="Торговый центр" name="goShop" tool_tip="Открыть торговый центр Second Life" width="121"/>
</panel>
- <text name="TimeText" tool_tip="Текущее время (тихоокеанское)">
- 00:00 (тихоокеанское время)
- </text>
+ <text name="TimeText" tool_tip="Текущее время (тихоокеанское)">00:00 (тихоокеанское время)</text>
<button name="media_toggle_btn" tool_tip="Запуск/остановка всех медиа (музыка, видео, веб-страницы)"/>
<button name="volume_btn" tool_tip="Регулятор громкости"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_twitter_photo.xml b/indra/newview/skins/default/xui/ru/panel_twitter_photo.xml
index 564d02411d..6c9035323a 100644
--- a/indra/newview/skins/default/xui/ru/panel_twitter_photo.xml
+++ b/indra/newview/skins/default/xui/ru/panel_twitter_photo.xml
@@ -1,32 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_twitter_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="text_panel">
- <text name="status_label">
- Что случилось?
- </text>
- <text name="status_counter_label">
- 140
- </text>
- <check_box initial_value="true" label="Включить расположение в SL" name="add_location_cb"/>
- <check_box initial_value="true" label="Включить фото" name="add_photo_cb"/>
- </layout_panel>
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Разрешение изображения">
- <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>
- <combo_box name="filters_combobox" tool_tip="Фильтры изображений">
- <combo_box.item label="Без фильтра" name="NoFilter"/>
- </combo_box>
- <button label="Обновить" name="new_snapshot_btn" tool_tip="Щелкните для обновления"/>
- <button label="Просмотр" name="big_preview_btn" tool_tip="Щелкните для смены вида"/>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Твит" name="post_photo_btn"/>
- <button label="Отмена" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <text name="status_label">
+ Что случилось?
+ </text>
+ <text name="status_counter_label">
+ 140
+ </text>
+ <check_box initial_value="true" label="Включить расположение в SL" name="add_location_cb"/>
+ <check_box initial_value="true" label="Включить фото" name="add_photo_cb"/>
+ <combo_box name="resolution_combobox" tool_tip="Разрешение изображения">
+ <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>
+ <combo_box name="filters_combobox" tool_tip="Фильтры изображений">
+ <combo_box.item label="Без фильтра" name="NoFilter"/>
+ </combo_box>
+ <button label="Обновить" name="new_snapshot_btn" tool_tip="Щелкните для обновления"/>
+ <button label="Просмотр" name="big_preview_btn" tool_tip="Щелкните для смены вида"/>
+ <button label="Твит" name="post_photo_btn"/>
+ <button label="Отмена" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ru/role_actions.xml b/indra/newview/skins/default/xui/ru/role_actions.xml
index a4ac7411a3..c29cd6d0f4 100755
--- a/indra/newview/skins/default/xui/ru/role_actions.xml
+++ b/indra/newview/skins/default/xui/ru/role_actions.xml
@@ -71,4 +71,8 @@
<action description="Присоединение к голосовому чату группы" longdescription="Участники роли с этой способностью могут присоединяться к сеансам голосового чата группы. ПРИМЕЧАНИЕ. Способность «Присоединение к чату группы» необходима для доступа к сеансам голосового чата." name="join voice chat" value="27"/>
<action description="Moderate-чат группы" longdescription="Участники роли с этой способностью могут контролировать доступ и участие в сеансах текстового и голосового чата группы." name="moderate group chat" value="37"/>
</action_set>
+ <action_set description="Эти способности включают право изменять приключения, которыми владеет эта группа." name="experience_tools_experience">
+ <action description="Администратор приключения" longdescription="Участники роли с этой способностью могут редактировать метаданные приключения." name="experience admin" value="49"/>
+ <action description="Автор приключения" longdescription="Участники роли с этой способностью могут создавать скрипты для приключения." name="experience contributor" value="50"/>
+ </action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml b/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml
index 0106ed50ac..c434dcd6a8 100755
--- a/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="item properties" title="Профиль объекта">
+ <panel.string name="loading_experience">
+ (загрузка)
+ </panel.string>
<panel.string name="unknown">
(неизвестно)
</panel.string>
@@ -43,6 +46,9 @@
<text name="LabelAcquiredTitle">
Приобретено:
</text>
+ <text name="LabelItemExperienceTitle">
+ Приключение:
+ </text>
<panel name="perms_inv">
<text name="perm_modify">
Вы можете:
@@ -66,8 +72,9 @@
<check_box label="Передать" name="CheckNextOwnerTransfer" tool_tip="Следующий владелец может отдать или перепродать объект"/>
</panel>
<check_box label="Для продажи" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
+ <combo_box name="ComboBoxSaleType">
<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"/>
diff --git a/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml
index 5502530ca4..4059a800f0 100755
--- a/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml
@@ -1,71 +1,31 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="object properties" title="Профиль объекта">
- <panel.string name="text deed continued">
- Сделка
- </panel.string>
- <panel.string name="text deed">
- Сделка
- </panel.string>
- <panel.string name="text modify info 1">
- Этот объект можно изменять
- </panel.string>
- <panel.string name="text modify info 2">
- Эти объекты можно изменять
- </panel.string>
- <panel.string name="text modify info 3">
- Этот объект нельзя изменять
- </panel.string>
- <panel.string name="text modify info 4">
- Эти объекты нельзя изменять
- </panel.string>
- <panel.string name="text modify info 5">
- Этот объект нельзя изменять через границу региона
- </panel.string>
- <panel.string name="text modify info 6">
- Эти объекты нельзя изменять через границу региона
- </panel.string>
- <panel.string name="text modify warning">
- Этот объект содержит объединенные части
- </panel.string>
- <panel.string name="Cost Default">
- Цена: L$
- </panel.string>
- <panel.string name="Cost Total">
- Всего: L$
- </panel.string>
- <panel.string name="Cost Per Unit">
- Цена за: L$
- </panel.string>
- <panel.string name="Cost Mixed">
- Смешанная цена
- </panel.string>
- <panel.string name="Sale Mixed">
- Смешанная продажа
- </panel.string>
+ <panel.string name="text deed continued">Сделка</panel.string>
+ <panel.string name="text deed">Сделка</panel.string>
+ <panel.string name="text modify info 1">Этот объект можно изменять</panel.string>
+ <panel.string name="text modify info 2">Эти объекты можно изменять</panel.string>
+ <panel.string name="text modify info 3">Этот объект нельзя изменять</panel.string>
+ <panel.string name="text modify info 4">Эти объекты нельзя изменять</panel.string>
+ <panel.string name="text modify info 5">Этот объект нельзя изменять через границу региона</panel.string>
+ <panel.string name="text modify info 6">Эти объекты нельзя изменять через границу региона</panel.string>
+ <panel.string name="text modify warning">Этот объект содержит объединенные части</panel.string>
+ <panel.string name="Cost Default">Цена: L$</panel.string>
+ <panel.string name="Cost Total">Итоговая цена: L$</panel.string>
+ <panel.string name="Cost Per Unit">Цена за: L$</panel.string>
+ <panel.string name="Cost Mixed">Смешанная цена</panel.string>
+ <panel.string name="Sale Mixed">Смешанная продажа</panel.string>
<text name="title" value="Профиль объекта"/>
<text name="where" value="(в мире)"/>
<panel label="" name="properties_panel">
- <text name="Name:">
- Название:
- </text>
- <text name="Description:">
- Описание:
- </text>
- <text name="CreatorNameLabel">
- Создатель:
- </text>
- <text name="Owner:">
- Владелец:
- </text>
- <text name="Group_label">
- Группа:
- </text>
+ <text name="Name:">Название:</text>
+ <text name="Description:">Описание:</text>
+ <text name="CreatorNameLabel">Создатель:</text>
+ <text name="Owner:">Владелец:</text>
+ <text name="Group_label">Группа:</text>
<button name="button set group" tool_tip="Выберите группу для передачи ей прав доступа к объекту"/>
<name_box initial_value="Загрузка..." name="Group Name Proxy"/>
<button label="Сделка" label_selected="Сделка" name="button deed" tool_tip="В результате сделки объект передается группе, при этом права на него будут соответствовать правам следующего владельца. Переданный группе объект может передаваться должностным лицом группы."/>
- <text name="label click action">
- Действие по щелчку:
- </text>
+ <text name="label click action">Действие по щелчку:</text>
<combo_box name="clickaction">
<combo_box.item label="Коснуться (по умолчанию)" name="Touch/grab(default)"/>
<combo_box.item label="Сесть на объект" name="Sitonobject"/>
@@ -75,21 +35,13 @@
<combo_box.item label="Приблизить" name="Zoom"/>
</combo_box>
<panel name="perms_inv">
- <text name="perm_modify">
- Этот объект можно изменять
- </text>
- <text name="Anyone can:">
- Все:
- </text>
+ <text name="perm_modify">Этот объект можно изменять</text>
+ <text name="Anyone can:">Все:</text>
<check_box label="Копировать" name="checkbox allow everyone copy"/>
<check_box label="Переместить" name="checkbox allow everyone move"/>
- <text name="GroupLabel">
- Группа:
- </text>
+ <text name="GroupLabel">Группа:</text>
<check_box label="Поделиться" name="checkbox share with group" tool_tip="Позволить всем участникам выбранной группы получить установленные вам права на этот объект. Для включения ролевых ограничений необходимо произвести сделку."/>
- <text name="NextOwnerLabel">
- Следующий владелец:
- </text>
+ <text name="NextOwnerLabel">Следующий владелец:</text>
<check_box label="Изменять" name="checkbox next owner can modify"/>
<check_box label="Копировать" name="checkbox next owner can copy"/>
<check_box label="Передать" name="checkbox next owner can transfer" tool_tip="Следующий владелец может отдать или перепродать объект"/>
@@ -102,27 +54,13 @@
</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:">
- Н:
- </text>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- В:
- </text>
- <text name="N:">
- С:
- </text>
- <text name="F:">
- F:
- </text>
+ <text name="pathfinding_attributes_label">Атрибуты поиска пути:</text>
+ <text name="B:">Н:</text>
+ <text name="O:">O:</text>
+ <text name="G:">G:</text>
+ <text name="E:">В:</text>
+ <text name="N:">С:</text>
+ <text name="F:">F:</text>
</panel>
<panel name="button_panel">
<button label="Открыть" name="open_btn"/>
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
index b7daab33a9..0d64b2cae9 100755
--- a/indra/newview/skins/default/xui/ru/strings.xml
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -449,30 +449,51 @@ support@secondlife.com.
<string name="TooltipMustSingleDrop">
Сюда можно перетащить только одну вещь
</string>
+ <string name="TooltipTooManyWearables">
+ Нельзя носить папку, содержащую более [AMOUNT] вещей. Это ограничение можно изменить в меню «Дополнительно &gt; Настройки отладки &gt; WearFolderLimit.
+ </string>
<string name="TooltipPrice" value="L$[AMOUNT]:"/>
<string name="TooltipOutboxDragToWorld">
- Нельзя выложить предметы из папке «Торговые исходящие»
+ Нельзя выложить предметы из папки списков товаров торгового центра
+ </string>
+ <string name="TooltipOutboxWorn">
+ Нельзя поместить предметы, которые вы носите, в папку списков товаров торгового центра
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ Глубина вложения папок превышает [AMOUNT]. Уменьшите глубину вложения; при необходимости сгруппируйте предметы.
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Количество подпапок не может превышать [AMOUNT]. Уменьшите количество папок в списке; при необходимости сгруппируйте предметы.
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Количество предметов не может превышать [AMOUNT]. Для продажи более чем [AMOUNT] предм. в одном списке некоторые из них следует сгруппировать.
+ </string>
+ <string name="TooltipOutboxTooManyStockItems">
+ Количество предметов не может превышать [AMOUNT].
+ </string>
+ <string name="TooltipOutboxCannotDropOnRoot">
+ Можно перетаскивать предметы или папки только на вкладку «ВСЕ». Выберите эту вкладку и переместите предметы или папки снова.
</string>
<string name="TooltipOutboxNoTransfer">
- Часть этих объектов нельзя продать или передать.
+ Часть этих объектов нельзя продать или передать
</string>
<string name="TooltipOutboxNotInInventory">
- Ваша папка «Торговые исходящие» может получать вещи только непосредственно из вашего инвентаря
+ В торговый центр можно поместить только предметы из своего инвентаря
</string>
- <string name="TooltipOutboxWorn">
- Носимые предметы нельзя поместить в папку «Торговые исходящие»
+ <string name="TooltipOutboxLinked">
+ Привязанные предметы или папки нельзя поместить в торговый центр
</string>
<string name="TooltipOutboxCallingCard">
- Визитки нельзя поместить в папку «Торговые исходящие»
+ Нельзя поместить визитки в торговый центр
</string>
- <string name="TooltipOutboxFolderLevels">
- Глубина вложения папок превышает 3
+ <string name="TooltipOutboxDragActive">
+ Опубликованный список нельзя переместить
</string>
- <string name="TooltipOutboxTooManyFolders">
- В папке верхнего уровня более 20 подпапок
+ <string name="TooltipOutboxCannotMoveRoot">
+ Корневую папку списков товаров торгового центра нельзя перемещать
</string>
- <string name="TooltipOutboxTooManyObjects">
- В папке верхнего уровня более 200 предметов
+ <string name="TooltipOutboxMixedStock">
+ У всех предметов в папке запасов должен быть один и тот же тип и разрешение
</string>
<string name="TooltipDragOntoOwnChild">
Папку нельзя переместить в ее подпапку
@@ -1057,9 +1078,7 @@ support@secondlife.com.
<string name="AgentNameSubst">
(Вы)
</string>
- <string name="JoinAnExperience">
- Присоединитесь
- </string>
+ <string name="JoinAnExperience"/><!-- intentionally blank -->
<string name="SilentlyManageEstateAccess">
Отключить извещения при управлении списками доступа к землевладениям
</string>
@@ -1126,6 +1145,12 @@ support@secondlife.com.
<string name="bitmap_image_files">
Изображения BMP
</string>
+ <string name="png_image_files">
+ Изображения PNG
+ </string>
+ <string name="save_texture_image_files">
+ Изображения Targa или PNG
+ </string>
<string name="avi_movie_file">
Видео AVI
</string>
@@ -1375,6 +1400,9 @@ support@secondlife.com.
<string name="FavoritesNoMatchingItems">
Перетащите сюда закладку, чтобы добавить ее в список избранного.
</string>
+ <string name="MarketplaceNoMatchingItems">
+ Предметы не найдены. Проверьте правильность строки поиска и повторите попытку.
+ </string>
<string name="InventoryNoTexture">
В вашем инвентаре нет копии этой текстуры
</string>
@@ -1422,29 +1450,95 @@ support@secondlife.com.
<string name="InventoryOutboxError">
[[MARKETPLACE_CREATE_STORE_URL] Магазин] возвращает ошибки.
</string>
+ <string name="InventoryMarketplaceError">
+ Это бета-версия функции. Если вы хотите участвовать в ее тестировании, заполните эту [http://goo.gl/forms/FCQ7UXkakz форму Google].
+ </string>
+ <string name="InventoryMarketplaceListingsNoItemsTitle">
+ Папка списков товаров торгового центра пуста.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItems">
+ Перетащите папки в эту область, чтобы выставить их на продажу в [[MARKETPLACE_DASHBOARD_URL] Торговом центре].
+ </string>
+ <string name="Marketplace Validation Warning Stock">
+ В папке версии должна быть папка запасов
+ </string>
+ <string name="Marketplace Validation Error Mixed Stock">
+ : Ошибка: все предметы в папке запасов должны быть некопируемыми и одного типа
+ </string>
+ <string name="Marketplace Validation Error Subfolder In Stock">
+ : Ошибка: папка запасов не может содержать подпапки
+ </string>
+ <string name="Marketplace Validation Warning Empty">
+ : Предупреждение: папка не содержит предметов
+ </string>
+ <string name="Marketplace Validation Warning Create Stock">
+ : Предупреждение: создается папка запасов
+ </string>
+ <string name="Marketplace Validation Warning Create Version">
+ : Предупреждение: создается папка версии
+ </string>
+ <string name="Marketplace Validation Warning Move">
+ : Предупреждение: перемещаются предметы
+ </string>
+ <string name="Marketplace Validation Warning Delete">
+ : Предупреждение: содержимое папки переносится в папку запасов, пустая папка удаляется
+ </string>
+ <string name="Marketplace Validation Error Stock Item">
+ : Ошибка: в папке запасов должны содержаться некопируемые предметы
+ </string>
+ <string name="Marketplace Validation Warning Unwrapped Item">
+ : Предупреждение: в папке версии должны быть предметы
+ </string>
+ <string name="Marketplace Validation Error">
+ : Ошибка:
+ </string>
+ <string name="Marketplace Validation Warning">
+ : Предупреждение:
+ </string>
+ <string name="Marketplace Validation Error Empty Version">
+ : Предупреждение: папка версии должна содержать хотя бы 1 предмет
+ </string>
+ <string name="Marketplace Validation Error Empty Stock">
+ : Предупреждение: папка запасов должна содержать хотя бы 1 предмет
+ </string>
+ <string name="Marketplace Validation No Error">
+ Нет ошибок и предупреждений
+ </string>
<string name="Marketplace Error None">
Ошибок нет
</string>
+ <string name="Marketplace Error Prefix">
+ Ошибка:
+ </string>
<string name="Marketplace Error Not Merchant">
- Ошибка. Прежде чем отправлять вещи в магазин, необходимо зарегистрироваться как торговец (бесплатно).
+ Прежде чем отправлять предметы в торговый центр, необходимо зарегистрироваться как торговец (бесплатно).
</string>
- <string name="Marketplace Error Empty Folder">
- Ошибка. В этой папке нет контента.
+ <string name="Marketplace Error Not Accepted">
+ Невозможно переместить предмет в эту папку.
</string>
- <string name="Marketplace Error Unassociated Products">
- Ошибка. Не удается передать эту вещь, поскольку в вашем торговом аккаунте слишком много вещей, не связанных с продуктами. Чтобы исправить эту ошибку, войдите на веб-сайт торгового центра и уменьшите число своих вещей, которые ни с чем не связаны.
+ <string name="Marketplace Error Unsellable Item">
+ Этот предмет нельзя продать в торговом центре.
</string>
- <string name="Marketplace Error Object Limit">
- Ошибка. Эта вещь содержит слишком много объектов. Исправьте эту ошибку, сложив объекты в коробки и уменьшив их общее число (должно быть меньше 200).
+ <string name="MarketplaceNoID">
+ нет ID торг. центра
</string>
- <string name="Marketplace Error Folder Depth">
- Ошибка. Эта вещь содержит слишком много уровней вложенных папок. Измените структуру так, чтобы уровней вложенных папок было не более 3.
+ <string name="MarketplaceLive">
+ опубликовано
</string>
- <string name="Marketplace Error Unsellable Item">
- Ошибка. Эту вещь нельзя продать в магазине.
+ <string name="MarketplaceActive">
+ активно
</string>
- <string name="Marketplace Error Internal Import">
- Ошибка. Эта вещь создает проблему. Повторите попытку позже.
+ <string name="MarketplaceMax">
+ макс.
+ </string>
+ <string name="MarketplaceStock">
+ запас
+ </string>
+ <string name="MarketplaceNoStock">
+ нет в запасе
+ </string>
+ <string name="MarketplaceUpdating">
+ обновление...
</string>
<string name="Open landmarks">
Открыть закладки
@@ -1465,6 +1559,7 @@ support@secondlife.com.
Нет контента
</string>
<string name="WornOnAttachmentPoint" value="(где носится: [ATTACHMENT_POINT])"/>
+ <string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/>
<string name="ActiveGesture" value="[GESLABEL] (активно)"/>
<string name="PermYes">
Да
@@ -1735,6 +1830,15 @@ support@secondlife.com.
<string name="Invalid Attachment">
Неверная точка присоединения
</string>
+ <string name="ATTACHMENT_MISSING_ITEM">
+ Ошибка: отсутствует предмет
+ </string>
+ <string name="ATTACHMENT_MISSING_BASE_ITEM">
+ Ошибка: отсутствует базовый предмет
+ </string>
+ <string name="ATTACHMENT_NOT_ATTACHED">
+ Ошибка: объект входит в текущий костюм, но не прикреплен
+ </string>
<string name="YearsMonthsOld">
[AGEYEARS] [AGEMONTHS]
</string>
@@ -1903,6 +2007,9 @@ support@secondlife.com.
<string name="SaveComplete">
Сохранение завершено.
</string>
+ <string name="UploadFailed">
+ Не удалось загрузить файл:
+ </string>
<string name="ObjectOutOfRange">
Скрипт (объект вне области)
</string>
@@ -1912,6 +2019,9 @@ support@secondlife.com.
<string name="GroupsNone">
нет
</string>
+ <string name="CompileNoExperiencePerm">
+ Пропуск скрипта [SCRIPT] с приключением [EXPERIENCE].
+ </string>
<string name="Group" value="(группа)"/>
<string name="Unknown">
(Неизвестно)
@@ -5072,6 +5182,9 @@ support@secondlife.com.
<string name="Command_Marketplace_Label">
Торговый центр
</string>
+ <string name="Command_MarketplaceListings_Label">
+ Торговый центр
+ </string>
<string name="Command_MiniMap_Label">
Миникарта
</string>
@@ -5159,6 +5272,9 @@ support@secondlife.com.
<string name="Command_Marketplace_Tooltip">
Покупки
</string>
+ <string name="Command_MarketplaceListings_Tooltip">
+ Продайте свои творения
+ </string>
<string name="Command_MiniMap_Tooltip">
Показать людей поблизости
</string>
@@ -5282,4 +5398,85 @@ support@secondlife.com.
<string name="loading_chat_logs">
Загрузка...
</string>
+ <string name="experience_tools_experience">
+ Приключение
+ </string>
+ <string name="ExperienceNameNull">
+ (без приключения)
+ </string>
+ <string name="ExperienceNameUntitled">
+ (приключение без названия)
+ </string>
+ <string name="Land-Scope">
+ Привязано к земле
+ </string>
+ <string name="Grid-Scope">
+ Привязано к сетке
+ </string>
+ <string name="Allowed_Experiences_Tab">
+ РАЗРЕШЕННЫЕ
+ </string>
+ <string name="Blocked_Experiences_Tab">
+ БЛОКИРОВАННЫЕ
+ </string>
+ <string name="Contrib_Experiences_Tab">
+ АВТОР
+ </string>
+ <string name="Admin_Experiences_Tab">
+ АДМИНИСТРАТОР
+ </string>
+ <string name="Recent_Experiences_Tab">
+ НЕДАВНИЕ
+ </string>
+ <string name="Owned_Experiences_Tab">
+ СОБСТВЕННОСТЬ
+ </string>
+ <string name="ExperiencesCounter">
+ ([EXPERIENCES], максимум: [MAXEXPERIENCES])
+ </string>
+ <string name="ExperiencePermission1">
+ взять управление на себя
+ </string>
+ <string name="ExperiencePermission3">
+ запускать анимации на вашем аватаре
+ </string>
+ <string name="ExperiencePermission4">
+ прикрепить к аватару
+ </string>
+ <string name="ExperiencePermission9">
+ следить за камерой
+ </string>
+ <string name="ExperiencePermission10">
+ управлять камерой
+ </string>
+ <string name="ExperiencePermission11">
+ телепортировать вас
+ </string>
+ <string name="ExperiencePermission12">
+ автоматически принимать разрешения приключения
+ </string>
+ <string name="ExperiencePermissionShortUnknown">
+ выполнил неизвестную операцию: [Permission]
+ </string>
+ <string name="ExperiencePermissionShort1">
+ Взять на себя
+ </string>
+ <string name="ExperiencePermissionShort3">
+ Запуск анимаций
+ </string>
+ <string name="ExperiencePermissionShort4">
+ Присоединить
+ </string>
+ <string name="ExperiencePermissionShort9">
+ Слежение за камерой
+ </string>
+ <string name="ExperiencePermissionShort10">
+ Управление камерой
+ </string>
+ <string name="ExperiencePermissionShort11">
+ Телепортация
+ </string>
+ <string name="ExperiencePermissionShort12">
+ Разрешение
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/ru/teleport_strings.xml b/indra/newview/skins/default/xui/ru/teleport_strings.xml
index 40c9267408..fc6cb2cf92 100755
--- a/indra/newview/skins/default/xui/ru/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/ru/teleport_strings.xml
@@ -48,6 +48,9 @@
<message name="MustGetAgeRegion">
Входить в этот регион могут только жители 18 лет и старше.
</message>
+ <message name="RegionTPSpecialUsageBlocked">
+ Не удалось войти в регион. «[REGION_NAME]» – это регион развивающих игр, и для входа в него надо соответствовать определенным условиям. Подробнее см. на странице [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ].
+ </message>
</message_set>
<message_set name="progress">
<message name="sending_dest">
diff --git a/indra/newview/skins/default/xui/tr/floater_about.xml b/indra/newview/skins/default/xui/tr/floater_about.xml
index 7b925e8830..7034de64c9 100755
--- a/indra/newview/skins/default/xui/tr/floater_about.xml
+++ b/indra/newview/skins/default/xui/tr/floater_about.xml
@@ -1,71 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="[CAPITALIZED_APP_NAME] HAKKINDA">
- <floater.string name="AboutHeader">
- [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
-[[VIEWER_RELEASE_NOTES_URL] [Sürüm Notları]]
- </floater.string>
- <floater.string name="AboutCompiler">
- [COMPILER] [COMPILER_VERSION] sürümü ile oluşturuldu
- </floater.string>
- <floater.string name="AboutPosition">
- &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP]) üzerinde bulunan [REGION] içerisinde [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] konumundasınız
-SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
-(küresel koordinatlar [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
-[SERVER_VERSION]
-[SERVER_RELEASE_NOTES_URL]
- </floater.string>
- <floater.string name="AboutSystem">
- CPU: [CPU]
-Bellek: [MEMORY_MB] MB
-İşl. Sis. Sürümü: [OS_VERSION]
-Grafik Kartı Üreticisi: [GRAPHICS_CARD_VENDOR]
-Grafik Kartı: [GRAPHICS_CARD]
- </floater.string>
- <floater.string name="AboutDriver">
- Windows Grafik Sürücüsü Sürümü: [GRAPHICS_DRIVER_VERSION]
- </floater.string>
- <floater.string name="AboutLibs">
- OpenGL Sürümü: [OPENGL_VERSION]
-
-libcurl Sürümü: [LIBCURL_VERSION]
-J2C Kod Çözücü Sürümü: [J2C_VERSION]
-Ses Sürücüsü Sürümü: [AUDIO_DRIVER_VERSION]
-Qt Web Kit Sürümü: [QT_WEBKIT_VERSION]
-Ses Sunucusu Sürümü: [VOICE_VERSION]
- </floater.string>
- <floater.string name="none">
- (hiçbiri)
- </floater.string>
- <floater.string name="AboutTraffic">
- Kaybolan Paketler: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
- </floater.string>
- <floater.string name="ErrorFetchingServerReleaseNotesURL">
- Sunucu sürümü notları URL&apos;si alınırken hata oluştu.
- </floater.string>
<tab_container name="about_tab">
<panel label="Bilgi" name="support_panel">
<button label="Panoya Kopyala" name="copy_btn"/>
</panel>
<panel label="Katkıda Bulunanlar" name="credits_panel">
- <text name="linden_intro">
- Second Life, Linden&apos;lar tarafından geliştirilmiştir:
- </text>
- <text name="contrib_intro">
- Açık kaynak kod katkısında bulunanlar:
- </text>
- <text_editor name="contrib_names">
- Geçici Ad çalıştırma sırasında değiştirilir
- </text_editor>
- <text name="trans_intro">
- Çevirileri yapanlar:
- </text>
- <text_editor name="trans_names">
- Geçici Ad çalıştırma sırasında değiştirilir
- </text_editor>
+ <text name="linden_intro">Second Life, Lindens tarafından geliştirilmiştir ve
+açık kaynak kod katkısında bulunanlar şunlardır:</text>
+ <text_editor name="contrib_names">Geçici Ad çalıştırma sırasında değiştirilir</text_editor>
</panel>
<panel label="Lisanslar" name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK Telif Hakkı (C) 1992-2009 3Dconnexion
+ <text_editor name="licenses_editor">3Dconnexion SDK Telif Hakkı (C) 1992-2009 3Dconnexion
APR Telif Hakkı (C) 2011 The Apache Software Foundation
Collada DOM Telif Hakkı 2006 Sony Computer Entertainment Inc.
cURL Telif Hakkı (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se)
@@ -92,8 +37,7 @@ Ses Sunucusu Sürümü: [VOICE_VERSION]
Tüm hakları saklıdır. Ayrıntılı bilgi için bkz. licenses.txt
- Sesli sohbet için Ses kodlaması: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
+ Sesli sohbet için Ses kodlaması: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)</text_editor>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_about_land.xml b/indra/newview/skins/default/xui/tr/floater_about_land.xml
index 481fc540d0..090e135b3b 100755
--- a/indra/newview/skins/default/xui/tr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/tr/floater_about_land.xml
@@ -331,22 +331,6 @@ Sadece büyük parseller aramada görünür.
<check_box label="Güvenli (hasar yok)" name="check safe" tool_tip="İşaretliyse, araziyi Güvenli moda getirerek hasar çarpışmasını etkinsizleştirir İşaretli değilse hasar çarpışması etkinleşir."/>
<check_box label="İtme Yok" name="PushRestrictCheck" tool_tip="Komut dosyalarının itmesini önler Bu seçeneğin işaretlenmesi arazinizdeki bozucu davranışları önlemeye yardımcı olabilir."/>
<check_box label="Konumu Arama sonuçlarında göster (L$30/hafta)" name="ShowDirectoryCheck" tool_tip="Arama sonuçlarında bu parsel görünsün"/>
- <combo_box name="land category with adult">
- <combo_box.item label="Herh. Bir Kategori" name="item0"/>
- <combo_box.item label="Linden Konumu" name="item1"/>
- <combo_box.item label="Yetişkin" name="item2"/>
- <combo_box.item label="Sanat ve Kültür" name="item3"/>
- <combo_box.item label="İş" name="item4"/>
- <combo_box.item label="Eğitim" name="item5"/>
- <combo_box.item label="Oyun" name="item6"/>
- <combo_box.item label="Uğrak Mekan" name="item7"/>
- <combo_box.item label="Yeni Gelenlere Yardım Sunan" name="item8"/>
- <combo_box.item label="Park ve Doğa" name="item9"/>
- <combo_box.item label="Yerleşim" name="item10"/>
- <combo_box.item label="Alışveriş" name="item11"/>
- <combo_box.item label="Kiralık" name="item13"/>
- <combo_box.item label="Diğer" name="item12"/>
- </combo_box>
<combo_box name="land category">
<combo_box.item label="Herh. Bir Kategori" name="item0"/>
<combo_box.item label="Linden Konumu" name="item1"/>
@@ -477,5 +461,6 @@ Sadece büyük parseller aramada görünür.
<button label="Kaldır" label_selected="Kaldır" name="remove_banned"/>
</panel>
</panel>
+ <panel label="DENEYİMLER" name="land_experiences_panel"/>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_associate_listing.xml b/indra/newview/skins/default/xui/tr/floater_associate_listing.xml
new file mode 100644
index 0000000000..bf78929931
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_associate_listing.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="associate listing" title="İLANI İLİŞKİLENDİR">
+ <text name="message">İlan Kimliği:</text>
+ <line_editor name="listing_id">Kimliği buraya girin</line_editor>
+ <button label="Tamam" name="OK"/>
+ <button label="İptal" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_edit_hover_height.xml b/indra/newview/skins/default/xui/tr/floater_edit_hover_height.xml
new file mode 100644
index 0000000000..237d886c45
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_edit_hover_height.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="HoverHeight" title="KONUM YÜKSEKLİĞİNİ AYARLA">
+ <slider label="Yükseklik" name="HoverHeightSlider"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_experience_search.xml b/indra/newview/skins/default/xui/tr/floater_experience_search.xml
new file mode 100644
index 0000000000..0a025115d5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_experience_search.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="experiencepicker" title="DENEYİM SEÇİN"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_experienceprofile.xml b/indra/newview/skins/default/xui/tr/floater_experienceprofile.xml
new file mode 100644
index 0000000000..641d61b8f3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_experienceprofile.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater title="EXPERIENCE PROFILE">
+ <floater.string name="empty_slurl">
+ (hiçbiri)
+ </floater.string>
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Light&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Light&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Light&quot;
+ </floater.string>
+ <text name="edit_title" value="Deneyim Profili"/>
+ <tab_container name="tab_container">
+ <panel name="panel_experience_info">
+ <scroll_container name="xp_scroll">
+ <panel name="scrolling_panel">
+ <layout_stack>
+ <layout_panel name="top panel">
+ <button label="Düzenle" name="edit_btn"/>
+ </layout_panel>
+ <layout_panel name="maturity panel">
+ <text name="ContentRating">
+ Seviye:
+ </text>
+ </layout_panel>
+ <layout_panel name="location panel">
+ <text name="Location">
+ Konum:
+ </text>
+ </layout_panel>
+ <layout_panel>
+ <text name="Owner">
+ Sahip:
+ </text>
+ </layout_panel>
+ <layout_panel name="group_panel">
+ <text name="Group">
+ Grup:
+ </text>
+ </layout_panel>
+ <layout_panel name="perm panel">
+ <button label="İzin Ver" name="allow_btn"/>
+ <button label="Unut" name="forget_btn"/>
+ <button label="Engelle" name="block_btn"/>
+ <text name="privileged">
+ Bu deneyim tüm sakinler için etkindir.
+ </text>
+ <button label="Kötüye Kullanımı Bildir" name="report_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ </panel>
+ <panel name="edit_panel_experience_info">
+ <scroll_container name="edit_xp_scroll">
+ <panel name="edit_scrolling_panel">
+ <text name="edit_experience_title_label" value="Ad:"/>
+ <text name="edit_experience_desc_label" value="Açıklama:"/>
+ <button label="Grup" name="Group_btn"/>
+ <text name="edit_ContentRating">
+ Seviye:
+ </text>
+ <icons_combo_box label="Orta" name="edit_ContentRatingText" tool_tip="Bir deneyimin erişkinlik seviyesi artınca, o deneyime izin veren tüm sakinler için izinler sıfırlanır.">
+ <icons_combo_box.item label="Yetişkin" name="Adult" value="42"/>
+ <icons_combo_box.item label="Orta" name="Mature" value="21"/>
+ <icons_combo_box.item label="Genel" name="PG" value="13"/>
+ </icons_combo_box>
+ <text name="edit_Location">
+ Konum:
+ </text>
+ <button label="Mevcut Olana Ayarla" name="location_btn"/>
+ <button label="Konumu Temizle" name="clear_btn"/>
+ <check_box label="Deneyimi Etkinleştir" name="edit_enable_btn" tool_tip=""/>
+ <check_box label="Aramalarda Gizle" name="edit_private_btn"/>
+ <text name="changes" value="Deneyim değişikliklerinin tüm bölgelerde görünmesi birkaç dakika alabilir."/>
+ <button label="Geri" name="cancel_btn"/>
+ <button label="Kaydet" name="save_btn"/>
+ </panel>
+ </scroll_container>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_experiences.xml b/indra/newview/skins/default/xui/tr/floater_experiences.xml
new file mode 100644
index 0000000000..eae3638cad
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_experiences.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_experiences" title="DENEYİMLER"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_facebook.xml b/indra/newview/skins/default/xui/tr/floater_facebook.xml
index 87f69fc731..656a4a81c9 100644
--- a/indra/newview/skins/default/xui/tr/floater_facebook.xml
+++ b/indra/newview/skins/default/xui/tr/floater_facebook.xml
@@ -1,20 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_facebook" title="FACEBOOK&apos;TA YAYINLA">
- <panel name="background">
- <tab_container name="tabs">
- <panel label="DURUM" name="panel_facebook_status"/>
- <panel label="FOTOĞRAF" name="panel_facebook_photo"/>
- <panel label="KONUMA GİRİŞ YAPIN" name="panel_facebook_place"/>
- <panel label="ARKADAŞLAR" name="panel_facebook_friends"/>
- <panel label="HESAP" name="panel_facebook_account"/>
- </tab_container>
- <panel name="connection_status_panel">
- <text name="connection_error_text">
- Hata
- </text>
- <text name="connection_loading_text">
- Yükleniyor...
- </text>
- </panel>
- </panel>
+ <tab_container name="tabs">
+ <panel label="DURUM" name="panel_facebook_status"/>
+ <panel label="FOTOĞRAF" name="panel_facebook_photo"/>
+ <panel label="KONUMA GİRİŞ YAPIN" name="panel_facebook_place"/>
+ <panel label="ARKADAŞLAR" name="panel_facebook_friends"/>
+ </tab_container>
+ <text name="connection_error_text">
+ Hata
+ </text>
+ <text name="connection_loading_text">
+ Yükleniyor...
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/tr/floater_inventory_item_properties.xml
index e49fef1f46..c6a5515c6e 100755
--- a/indra/newview/skins/default/xui/tr/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/tr/floater_inventory_item_properties.xml
@@ -1,67 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="item properties" title="ENVANTER ÖGESİ ÖZELLİKLERİ">
- <floater.string name="unknown">
- (bilinmiyor)
- </floater.string>
- <floater.string name="public">
- (kamuya açık)
- </floater.string>
- <floater.string name="you_can">
- Şunu yapabilirsiniz:
- </floater.string>
- <floater.string name="owner_can">
- Sahip şunu yapabilir:
- </floater.string>
- <floater.string name="acquiredDate">
- [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
- </floater.string>
- <text name="LabelItemNameTitle">
- Ad:
- </text>
- <text name="LabelItemDescTitle">
- Açıklama:
- </text>
- <text name="LabelCreatorTitle">
- Oluşturan:
- </text>
+ <floater.string name="unknown">(bilinmiyor)</floater.string>
+ <floater.string name="public">(kamuya açık)</floater.string>
+ <floater.string name="you_can">Şunu yapabilirsiniz:</floater.string>
+ <floater.string name="owner_can">Sahip şunu yapabilir:</floater.string>
+ <floater.string name="acquiredDate">[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]</floater.string>
+ <text name="LabelItemNameTitle">Ad:</text>
+ <text name="LabelItemDescTitle">Açıklama:</text>
+ <text name="LabelCreatorTitle">Oluşturan:</text>
<button label="Profil..." name="BtnCreator"/>
- <text name="LabelOwnerTitle">
- Sahip:
- </text>
+ <text name="LabelOwnerTitle">Sahip:</text>
<button label="Profil..." name="BtnOwner"/>
- <text name="LabelAcquiredTitle">
- Alınan:
- </text>
- <text name="LabelAcquiredDate">
- 24 Mayıs Çarş 12:50:46 2006
- </text>
- <text name="OwnerLabel">
- Siz:
- </text>
+ <text name="LabelAcquiredTitle">Alınan:</text>
+ <text name="LabelAcquiredDate">24 Mayıs Çarş 12:50:46 2006</text>
+ <text name="OwnerLabel">Siz:</text>
<check_box label="Düzenle" name="CheckOwnerModify"/>
<check_box label="Kopyala" name="CheckOwnerCopy"/>
<check_box label="Tekrar Sat" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">
- Herkes:
- </text>
+ <text name="AnyoneLabel">Herkes:</text>
<check_box label="Kopyala" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">
- Grup:
- </text>
+ <text name="GroupLabel">Grup:</text>
<check_box label="Paylaş" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel">
- Sonraki sahip:
- </text>
+ <text name="NextOwnerLabel">Sonraki sahip:</text>
<check_box label="Düzenle" name="CheckNextOwnerModify"/>
<check_box label="Kopyala" name="CheckNextOwnerCopy"/>
<check_box label="Tekrar Sat" name="CheckNextOwnerTransfer"/>
<check_box label="Satılık" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
+ <combo_box name="ComboBoxSaleType">
<combo_box.item label="Kopyala" name="Copy"/>
+ <combo_box.item label="İçerik" name="Contents"/>
<combo_box.item label="Orijinal" name="Original"/>
</combo_box>
<spinner label="Fiyat:" name="Edit Cost"/>
- <text name="CurrencySymbol">
- L$
- </text>
+ <text name="CurrencySymbol">L$</text>
</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/tr/floater_inventory_view_finder.xml
index 9d1a556751..35f30f47cc 100755
--- a/indra/newview/skins/default/xui/tr/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/tr/floater_inventory_view_finder.xml
@@ -5,8 +5,8 @@
<check_box label="Giysiler" name="check_clothing"/>
<check_box label="Mimikler" name="check_gesture"/>
<check_box label="Yer İmleri" name="check_landmark"/>
- <check_box label="Örgüler" name="check_mesh"/>
<check_box label="Not Kartları" name="check_notecard"/>
+ <check_box label="Örgüler" name="check_mesh"/>
<check_box label="Nesneler" name="check_object"/>
<check_box label="Komut Dosyaları" name="check_script"/>
<check_box label="Sesler" name="check_sound"/>
@@ -19,6 +19,10 @@
<text name="- OR -">
- VEYA -
</text>
+ <radio_group name="date_search_direction">
+ <radio_item label="Şundan daha yeni:" name="newer"/>
+ <radio_item label="Şundan daha eski:" name="older"/>
+ </radio_group>
<spinner label="Saat Önce" name="spin_hours_ago"/>
<spinner label="Gün Önce" name="spin_days_ago"/>
<button label="Kapat" label_selected="Kapat" name="Close"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_item_properties.xml b/indra/newview/skins/default/xui/tr/floater_item_properties.xml
new file mode 100644
index 0000000000..3146384b33
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_item_properties.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Item Properties" title="ÖĞE ÖZELLİKLERİ"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_lagmeter.xml b/indra/newview/skins/default/xui/tr/floater_lagmeter.xml
index 736c50be90..a373a95b0c 100644
--- a/indra/newview/skins/default/xui/tr/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/tr/floater_lagmeter.xml
@@ -28,7 +28,7 @@
İstemci kare hızı [CLIENT_FRAME_RATE_CRITICAL] altında
</floater.string>
<floater.string name="client_frame_time_warning_msg">
- İstemci kare hızı [CLIENT_FRAME_RATE_CRITICAL] ile [CLIENT_FRAME_RATE_WARNING] arasınad
+ İstemci kare hızı [CLIENT_FRAME_RATE_CRITICAL] ile [CLIENT_FRAME_RATE_WARNING] arasında
</floater.string>
<floater.string name="client_frame_time_normal_msg">
Normal
diff --git a/indra/newview/skins/default/xui/tr/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/tr/floater_live_lsleditor.xml
index 34c3e28a0b..760948edae 100755
--- a/indra/newview/skins/default/xui/tr/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/tr/floater_live_lsleditor.xml
@@ -9,7 +9,24 @@
<floater.string name="Title">
KOMUT DOSYASI: [NAME]
</floater.string>
+ <floater.string name="experience_enabled">
+ Mevcut deneyimi kaldırmak için kutunun işaretini kaldırın
+ </floater.string>
+ <floater.string name="no_experiences">
+ Hiçbir deneyim için yetkiniz yok
+ </floater.string>
+ <floater.string name="add_experiences">
+ Ekleyeceğiniz deneyimi seçin
+ </floater.string>
+ <floater.string name="show_experience_profile">
+ Deneyim profilini görmek için tıklayın
+ </floater.string>
+ <floater.string name="loading">
+ Yükleniyor...
+ </floater.string>
<button label="Sıfırla" label_selected="Sıfırla" name="Reset"/>
<check_box initial_value="true" label="Çalışıyor" name="running"/>
<check_box initial_value="true" label="Mono" name="mono"/>
+ <check_box label="Deneyimi Kullanın:" name="enable_xp"/>
+ <button label="&gt;" name="view_profile"/>
</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_marketplace_listings.xml b/indra/newview/skins/default/xui/tr/floater_marketplace_listings.xml
new file mode 100644
index 0000000000..f4837a300f
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_marketplace_listings.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_listings" title="PAZARYERİ İLANLARI">
+ <panel name="marketplace_listings_panel">
+ <panel>
+ <panel name="marketplace_listings_inventory_placeholder_panel">
+ <text name="marketplace_listings_inventory_placeholder_title">Yükleniyor...</text>
+ </panel>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_marketplace_validation.xml b/indra/newview/skins/default/xui/tr/floater_marketplace_validation.xml
new file mode 100644
index 0000000000..ec563535d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_marketplace_validation.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_validation" title="Pazaryeri İlanlarını Denetle">
+ <button label="Tamam" label_selected="Tamam" name="OK"/>
+ <text_editor name="validation_text">MARKETPLACE_VALIDATION_TEXT</text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_openobject.xml b/indra/newview/skins/default/xui/tr/floater_openobject.xml
index 9980aee97f..3876439428 100755
--- a/indra/newview/skins/default/xui/tr/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/tr/floater_openobject.xml
@@ -3,6 +3,11 @@
<text name="object_name">
[DESC]:
</text>
- <button label="Envantere Kopyala" label_selected="Envantere Kopyala" name="copy_to_inventory_button"/>
- <button label="Kopyala ve Giy" label_selected="Kopyala ve Giy" name="copy_and_wear_button"/>
+ <text name="border_note">
+ Envantere kopyala ve giy
+ </text>
+ <button label="Dış görünüme ekle" label_selected="Dış görünüme ekle" name="copy_and_wear_button"/>
+ <button label="Dış görünümü değiştir" label_selected="Dış görünümü değiştir" name="copy_and_replace_button"/>
+ <button label="Sadece envantere kopyala" label_selected="Sadece envantere kopyala" name="copy_to_inventory_button"/>
+ <button label="İptal" label_selected="İptal" name="cancel_button"/>
</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_pay.xml b/indra/newview/skins/default/xui/tr/floater_pay.xml
index 6604e5c37a..63334db910 100755
--- a/indra/newview/skins/default/xui/tr/floater_pay.xml
+++ b/indra/newview/skins/default/xui/tr/floater_pay.xml
@@ -1,21 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money">
- <string name="payee_group">
- Gruba Öde
- </string>
- <string name="payee_resident">
- Sakine Öde
- </string>
- <text name="payee_name">
- Kırpmayı Kontrol İçin Test Adı Çok Uzun
- </text>
- <button label="L$1" label_selected="L$1" name="fastpay 1"/>
- <button label="L$5" label_selected="L$5" name="fastpay 5"/>
- <button label="L$10" label_selected="L$10" name="fastpay 10"/>
- <button label="L$20" label_selected="L$20" name="fastpay 20"/>
- <text name="amount text">
- veya tutarı seç:
- </text>
- <button label="Öde" label_selected="Öde" name="pay btn"/>
- <button label="İptal" label_selected="İptal" name="cancel btn"/>
+ <string name="payee_group">Gruba Öde</string>
+ <string name="payee_resident">Sakine Öde</string>
+ <text name="paying_text">Ödeyeceğiniz miktar:</text>
+ <text name="payee_name">Kırpmayı Kontrol İçin Test Adı Çok Uzun</text>
+ <panel label="Ara" name="PatternsPanel">
+ <button label="1 L$ Öde" label_selected="1 L$ Öde" name="fastpay 1"/>
+ <button label="5 L$ Öde" label_selected="5 L$ Öde" name="fastpay 5"/>
+ <button label="10 L$ Öde" label_selected="10 L$ Öde" name="fastpay 10"/>
+ <button label="20 L$ Öde" label_selected="20 L$ Öde" name="fastpay 20"/>
+ </panel>
+ <panel label="Ara" name="InputPanel">
+ <text name="amount text">Diğer bir tutar:</text>
+ <button label="Öde" label_selected="Öde" name="pay btn"/>
+ <button label="İptal" label_selected="İptal" name="cancel btn"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_pay_object.xml b/indra/newview/skins/default/xui/tr/floater_pay_object.xml
index 7772d3b101..d736ededfd 100755
--- a/indra/newview/skins/default/xui/tr/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/tr/floater_pay_object.xml
@@ -1,28 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money">
- <string name="payee_group">
- Gruba Öde
- </string>
- <string name="payee_resident">
- Sakine Öde
- </string>
- <text name="payee_name">
- Ericacita Moostopolison
- </text>
- <text name="object_name_label">
- Nesne yoluyla:
- </text>
+ <string name="payee_group">Gruba Öde</string>
+ <string name="payee_resident">Sakine Öde</string>
+ <text name="paying_text">Ödeyeceğiniz miktar:</text>
+ <text name="payee_name">Ericacita Moostopolison</text>
+ <text name="object_name_label">Nesne yoluyla:</text>
<icon name="icon_object" tool_tip="Nesneler"/>
- <text name="object_name_text">
- Harika nesnem gerçekten uzun bir adla
- </text>
- <button label="L$1" label_selected="L$1" name="fastpay 1"/>
- <button label="L$5" label_selected="L$5" name="fastpay 5"/>
- <button label="L$10" label_selected="L$10" name="fastpay 10"/>
- <button label="L$20" label_selected="L$20" name="fastpay 20"/>
- <text name="amount text">
- veya tutarı seç:
- </text>
- <button label="Öde" label_selected="Öde" name="pay btn"/>
- <button label="İptal" label_selected="İptal" name="cancel btn"/>
+ <text name="object_name_text">Harika nesnem gerçekten uzun bir adla</text>
+ <panel label="Ara" name="PatternsPanel">
+ <button label="1 L$ Öde" label_selected="1 L$ Öde" name="fastpay 1"/>
+ <button label="5 L$ Öde" label_selected="5 L$ Öde" name="fastpay 5"/>
+ <button label="10 L$ Öde" label_selected="10 L$ Öde" name="fastpay 10"/>
+ <button label="20 L$ Öde" label_selected="20 L$ Öde" name="fastpay 20"/>
+ </panel>
+ <panel label="Ara" name="InputPanel">
+ <text name="amount text">Diğer bir tutar:</text>
+ <button label="Öde" label_selected="Öde" name="pay btn"/>
+ <button label="İptal" label_selected="İptal" name="cancel btn"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_report_abuse.xml b/indra/newview/skins/default/xui/tr/floater_report_abuse.xml
index ea598a5669..28bacca763 100755
--- a/indra/newview/skins/default/xui/tr/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/tr/floater_report_abuse.xml
@@ -67,7 +67,7 @@
<combo_box.item label="Arazi &gt; Tecavüz &gt; Nesneler veya dokular" name="Land__Encroachment__Objects_textures"/>
<combo_box.item label="Arazi &gt; Tecavvüz &gt; Parçacıklar" name="Land__Encroachment__Particles"/>
<combo_box.item label="Arazi &gt; Tecavvüz &gt; Ağaçlar/bitkiler" name="Land__Encroachment__Trees_plants"/>
- <combo_box.item label="Bahis veya Kumar" name="Wagering_gambling"/>
+ <combo_box.item label="Oyun Politikası İhlali" name="Wagering_gambling"/>
<combo_box.item label="Diğer" name="Other"/>
</combo_box>
<text name="abuser_name_title">
diff --git a/indra/newview/skins/default/xui/tr/floater_snapshot.xml b/indra/newview/skins/default/xui/tr/floater_snapshot.xml
index 3f588522eb..be6c58e8cf 100755
--- a/indra/newview/skins/default/xui/tr/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/tr/floater_snapshot.xml
@@ -39,17 +39,8 @@
<string name="local_failed_str">
Bilgisayara kaydedilemedi.
</string>
- <button name="advanced_options_btn" tool_tip="Gelişmiş seçenekler"/>
- <text name="image_res_text">
- [WIDTH] x [HEIGHT] px
- </text>
- <text name="file_size_label">
- [SIZE] KB
- </text>
+ <button label="YENİLE" name="new_snapshot_btn"/>
<panel name="advanced_options_panel">
- <text name="advanced_options_label">
- GELİŞMİŞ SEÇENEKLER
- </text>
<text name="layer_type_label">
Yakala:
</text>
@@ -68,4 +59,10 @@
<combo_box.item label="Filtre Yok" name="NoFilter"/>
</combo_box>
</panel>
+ <text name="image_res_text">
+ [WIDTH] px (genişlik) x [HEIGHT] px (yükseklik)
+ </text>
+ <text name="file_size_label">
+ [SIZE] KB
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_top_objects.xml b/indra/newview/skins/default/xui/tr/floater_top_objects.xml
index 19420c68e3..013e8d7ce1 100755
--- a/indra/newview/skins/default/xui/tr/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/tr/floater_top_objects.xml
@@ -21,6 +21,12 @@
<floater.string name="none_descriptor">
Hiçbiri bulunamadı.
</floater.string>
+ <floater.string name="URLs">
+ URL&apos;ler
+ </floater.string>
+ <floater.string name="memory">
+ Bellek (KB)
+ </floater.string>
<text name="title_text">
Yükleniyor...
</text>
@@ -30,7 +36,7 @@
<scroll_list.columns label="Sahip" name="owner"/>
<scroll_list.columns label="Konum" name="location"/>
<scroll_list.columns label="Parsel" name="parcel"/>
- <scroll_list.columns label="Süre" name="time"/>
+ <scroll_list.columns label="Tarih" name="time"/>
<scroll_list.columns label="URL&apos;ler" name="URLs"/>
<scroll_list.columns label="Bellek (KB)" name="memory"/>
</scroll_list>
diff --git a/indra/newview/skins/default/xui/tr/floater_twitter.xml b/indra/newview/skins/default/xui/tr/floater_twitter.xml
index 3060bd1c84..93c1b0b073 100644
--- a/indra/newview/skins/default/xui/tr/floater_twitter.xml
+++ b/indra/newview/skins/default/xui/tr/floater_twitter.xml
@@ -1,17 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_twitter" title="TWITTER">
- <panel name="background">
- <tab_container name="tabs">
- <panel label="OLUŞTUR" name="panel_twitter_photo"/>
- <panel label="HESAP" name="panel_twitter_account"/>
- </tab_container>
- <panel name="connection_status_panel">
- <text name="connection_error_text">
- Hata
- </text>
- <text name="connection_loading_text">
- Yükleniyor...
- </text>
- </panel>
- </panel>
+ <tab_container name="tabs">
+ <panel label="OLUŞTUR" name="panel_twitter_photo"/>
+ <panel label="HESAP" name="panel_twitter_account"/>
+ </tab_container>
+ <text name="connection_error_text">
+ Hata
+ </text>
+ <text name="connection_loading_text">
+ Yükleniyor...
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/tr/menu_attachment_self.xml b/indra/newview/skins/default/xui/tr/menu_attachment_self.xml
index ff7c718979..c49f817a45 100755
--- a/indra/newview/skins/default/xui/tr/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/tr/menu_attachment_self.xml
@@ -8,6 +8,7 @@
<menu_item_call label="Görünümüm" name="Change Outfit"/>
<menu_item_call label="Dış Görünümümü Düzenle" name="Edit Outfit"/>
<menu_item_call label="Şeklimi Düzenle" name="Edit My Shape"/>
+ <menu_item_call label="Konum Yüksekliği" name="Hover Height"/>
<menu_item_call label="Arkadaşlarım" name="Friends..."/>
<menu_item_call label="Gruplarım" name="Groups..."/>
<menu_item_call label="Profilim" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/tr/menu_avatar_self.xml b/indra/newview/skins/default/xui/tr/menu_avatar_self.xml
index 6996dc612f..4dfa42c347 100755
--- a/indra/newview/skins/default/xui/tr/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/tr/menu_avatar_self.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Görünümüm" name="Chenge Outfit"/>
<menu_item_call label="Dış Görünümümü Düzenle" name="Edit Outfit"/>
<menu_item_call label="Şeklimi Düzenle" name="Edit My Shape"/>
+ <menu_item_call label="Konum Yüksekliği" name="Hover Height"/>
<menu_item_call label="Arkadaşlarım" name="Friends..."/>
<menu_item_call label="Gruplarım" name="Groups..."/>
<menu_item_call label="Profilim" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/tr/menu_inventory.xml b/indra/newview/skins/default/xui/tr/menu_inventory.xml
index 7239c4be06..784e4d18a4 100755
--- a/indra/newview/skins/default/xui/tr/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/tr/menu_inventory.xml
@@ -1,5 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
+ <menu_item_call label="İlan oluştur" name="Marketplace Create Listing"/>
+ <menu_item_call label="İlanı ilişkilendir" name="Marketplace Associate Listing"/>
+ <menu_item_call label="İlanı al (yenile)" name="Marketplace Get Listing"/>
+ <menu_item_call label="Hata kontrolü yap" name="Marketplace Check Listing"/>
+ <menu_item_call label="İlanı düzenle" name="Marketplace Edit Listing"/>
+ <menu_item_call label="Listele" name="Marketplace List"/>
+ <menu_item_call label="Listeden kaldır" name="Marketplace Unlist"/>
+ <menu_item_call label="Etkinleştir" name="Marketplace Activate"/>
+ <menu_item_call label="Devre Dışı Bırak" name="Marketplace Deactivate"/>
<menu_item_call label="Paylaş" name="Share"/>
<menu_item_call label="Satın Al" name="Task Buy"/>
<menu_item_call label="Aç" name="Task Open"/>
@@ -87,6 +96,7 @@
<menu_item_call label="Ekle" name="Wearable Add"/>
<menu_item_call label="Çıkar" name="Take Off"/>
<menu_item_call label="Satıcı Giden Kutusuna Kopyala" name="Merchant Copy"/>
- <menu_item_call label="Pazaryerine Gönder" name="Marketplace Send"/>
+ <menu_item_call label="Pazaryeri İlanlarına Kopyala" name="Marketplace Copy"/>
+ <menu_item_call label="Pazaryeri İlanlarına Taşı" name="Marketplace Move"/>
<menu_item_call label="--seçenek yok--" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/tr/menu_inventory_gear_default.xml
index 5f3e4e8789..ca66bc98c7 100755
--- a/indra/newview/skins/default/xui/tr/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/tr/menu_inventory_gear_default.xml
@@ -5,7 +5,7 @@
<menu_item_check label="En Sonunculara Göre Sırala" name="sort_by_recent"/>
<menu_item_check label="Klasörleri Her Zaman Ada Göre Sırala" name="sort_folders_by_name"/>
<menu_item_check label="Sistem Klasörlerini Üste Sırala" name="sort_system_folders_to_top"/>
- <menu_item_call label="Filtreleri Göster" name="show_filters"/>
+ <menu_item_call label="Filtreleri Göster..." name="show_filters"/>
<menu_item_call label="Filtreleri Sıfırla" name="reset_filters"/>
<menu_item_call label="Tüm Klasörleri Kapat" name="close_folders"/>
<menu_item_call label="Kaybedip Bulduklarımı Boşalt" name="empty_lostnfound"/>
diff --git a/indra/newview/skins/default/xui/tr/menu_marketplace_view.xml b/indra/newview/skins/default/xui/tr/menu_marketplace_view.xml
new file mode 100644
index 0000000000..c114f50c92
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_marketplace_view.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_marketplace_sort">
+ <menu_item_check label="Stok miktarına göre sırala (düşükten yükseğe)" name="sort_by_stock_amount"/>
+ <menu_item_check label="Sadece ilan klasörlerini göster" name="show_only_listing_folders"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_experience.xml b/indra/newview/skins/default/xui/tr/menu_url_experience.xml
new file mode 100644
index 0000000000..70ea4e6950
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_experience.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml
index a488a0916f..cea57011dd 100755
--- a/indra/newview/skins/default/xui/tr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml
@@ -8,13 +8,14 @@
<menu_item_call label="Yeni Envanter Penceresi" name="NewInventoryWindow"/>
<menu_item_call label="Yerler..." name="Places"/>
<menu_item_call label="Favoriler..." name="Picks"/>
+ <menu_item_call label="Deneyimler..." name="Experiences"/>
<menu_item_call label="Kamera Denetimleri..." name="Camera Controls"/>
<menu label="Hareket" name="Movement">
<menu_item_call label="Otur" name="Sit Down Here"/>
<menu_item_check label="Uç" name="Fly"/>
<menu_item_check label="Daima Koş" name="Always Run"/>
<menu_item_call label="Beni Anime Etmeyi Durdur" name="Stop Animating My Avatar"/>
- <menu_item_call label="Yürü / koş / uç..." name="Walk / run / fly"/>
+ <menu_item_call label="Yürü / koş / uç..." name="WalkRunFly"/>
</menu>
<menu label="Durum" name="Status">
<menu_item_check label="Uzakta" name="Away"/>
@@ -22,6 +23,7 @@
</menu>
<menu_item_call label="L$ Satın Al..." name="Buy and Sell L$"/>
<menu_item_call label="Satıcı Giden Kutusu..." name="MerchantOutbox"/>
+ <menu_item_call label="Pazaryeri ilanları..." name="MarketplaceListings"/>
<menu_item_call label="Hesap kontrol paneli..." name="Manage My Account"/>
<menu_item_call label="Tercihler..." name="Preferences"/>
<menu_item_call label="Araç çubuğu düğmeleri..." name="Toolbars"/>
@@ -46,7 +48,7 @@
<menu_item_check label="Arkadaşlar" name="My Friends"/>
<menu_item_check label="Gruplar" name="My Groups"/>
<menu_item_check label="Yakındaki kişiler" name="Active Speakers"/>
- <menu_item_call label="Engelleme Listesi" name="Block List"/>
+ <menu_item_check label="Engelleme Listesi" name="Block List"/>
<menu_item_check label="Rahatsız Etme" name="Do Not Disturb"/>
</menu>
<menu label="Dünya" name="World">
@@ -60,7 +62,7 @@
<menu_item_call label="Anlık Görüntü" name="Take Snapshot"/>
<menu_item_call label="Profili yerleştir" name="Place Profile"/>
<menu_item_call label="Arazi hakkında" name="About Land"/>
- <menu_item_call label="Bölge / Gayrimenkul" name="Region/Estate"/>
+ <menu_item_call label="Bölge / Gayrimenkul" name="RegionEstate"/>
<menu_item_call label="Sahip olduğum arazi parçaları..." name="My Land"/>
<menu_item_call label="Bu araziyi satın al" name="Buy Land"/>
<menu label="Göster" name="LandShow">
@@ -248,6 +250,7 @@
<menu_item_check label="Doku Konsolu" name="Texture Console"/>
<menu_item_check label="Hata Ayıklama Konsolu" name="Debug Console"/>
<menu_item_call label="Bildirimler Konsolu" name="Notifications"/>
+ <menu_item_check label="Bölge Hata Ayıklama Konsolu" name="Region Debug Console"/>
<menu_item_check label="Hızlı Zamanlayıcılar" name="Fast Timers"/>
<menu_item_check label="Bellek" name="Memory"/>
<menu_item_check label="Sahne İstatistikleri" name="Scene Statistics"/>
@@ -351,7 +354,7 @@
<menu_item_check label="Nesne Konumlarını Ping İle İnterpole Edin" name="Ping Interpolate Object Positions"/>
<menu_item_call label="Paket Bırakın" name="Drop a Packet"/>
</menu>
- <menu_item_call label="Komut Dosyalı Kameranın Dökümünü Al" name="Dump Scripted Camera"/>
+ <menu_item_call label="Komut Dosyalı Kameranın Dökümünü Al" name="Dump Scripted Camera"/>
<menu label="Kaydedici" name="Recorder">
<menu_item_call label="Oynatmayı Başlat" name="Start Playback"/>
<menu_item_call label="Oynatmayı Durdur" name="Stop Playback"/>
diff --git a/indra/newview/skins/default/xui/tr/mime_types.xml b/indra/newview/skins/default/xui/tr/mime_types.xml
index c37f872a65..fa554d34fc 100755
--- a/indra/newview/skins/default/xui/tr/mime_types.xml
+++ b/indra/newview/skins/default/xui/tr/mime_types.xml
@@ -44,6 +44,14 @@
Bu konumdaki sesi çal
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ İçerik Yok
+ </label>
+ <tooltip name="none_tooltip">
+ Burada ortam öğesi yok
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Gerçek Zamanlı Akış
diff --git a/indra/newview/skins/default/xui/tr/mime_types_linux.xml b/indra/newview/skins/default/xui/tr/mime_types_linux.xml
index c37f872a65..fa554d34fc 100755
--- a/indra/newview/skins/default/xui/tr/mime_types_linux.xml
+++ b/indra/newview/skins/default/xui/tr/mime_types_linux.xml
@@ -44,6 +44,14 @@
Bu konumdaki sesi çal
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ İçerik Yok
+ </label>
+ <tooltip name="none_tooltip">
+ Burada ortam öğesi yok
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Gerçek Zamanlı Akış
diff --git a/indra/newview/skins/default/xui/tr/mime_types_mac.xml b/indra/newview/skins/default/xui/tr/mime_types_mac.xml
index c37f872a65..fa554d34fc 100755
--- a/indra/newview/skins/default/xui/tr/mime_types_mac.xml
+++ b/indra/newview/skins/default/xui/tr/mime_types_mac.xml
@@ -44,6 +44,14 @@
Bu konumdaki sesi çal
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ İçerik Yok
+ </label>
+ <tooltip name="none_tooltip">
+ Burada ortam öğesi yok
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Gerçek Zamanlı Akış
diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml
index 2364bd5acf..df22251b3d 100755
--- a/indra/newview/skins/default/xui/tr/notifications.xml
+++ b/indra/newview/skins/default/xui/tr/notifications.xml
@@ -73,6 +73,10 @@ Hata ayrıntıları: &apos;[_NAME]&apos; adlı bildirim notifications.xml içind
[MESSAGE]
<usetemplate name="okcancelbuttons" notext="İptal" yestext="Evet"/>
</notification>
+ <notification name="GenericAlertOK">
+ [MESSAGE]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
<notification name="BadInstallation">
[APP_NAME] güncellenirken bir hata oluştu. Lütfen Görüntüleyici&apos;nin [http://get.secondlife.com son sürümünü karşıdan yükleyin].
<usetemplate name="okbutton" yestext="Tamam"/>
@@ -125,6 +129,88 @@ Bir sistem veya ağ hatası nedeniyle Pazaryerine hiçbir klasör gönderilemedi
Bir sistem veya ağ hatası nedeniyle Pazaryeri başlatılamadı. Daha sonra tekrar deneyin.
<usetemplate name="okbutton" yestext="Tamam"/>
</notification>
+ <notification name="StockPasteFailed">
+ Stok Klasörüne kopyalama ya da taşıma başarısız oldu. Hata kodu:
+
+ &quot;[ERROR_CODE]&quot;
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="MerchantPasteFailed">
+ Pazaryeri İlanlarına kopyalama ya da taşıma başarısız oldu. Hata kodu:
+
+ &quot;[ERROR_CODE]&quot;
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="MerchantTransactionFailed">
+ Pazaryerinde yapılan işlem başarısız oldu. Hata kodu:
+
+ Neden: &quot;[ERROR_REASON]&quot;
+ [ERROR_DESCRIPTION]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="MerchantUnprocessableEntity">
+ Bu ürünü listeleyemiyoruz ya da sürüm klasörünü etkinleştiremiyoruz. Bu sorun genellikle ilan açıklama formunda eksik bilgi olmasından kaynaklanır ama klasör yapısındaki hatalar yüzünden de gerçekleşmiş olabilir. İlanı düzenleyin ya da ilan klasöründe hata olup olmadığını kontrol edin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="MerchantListingFailed">
+ İlan Pazaryerinde yayınlanamadı. Hata kodu:
+
+ &quot;[ERROR_CODE]&quot;
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="MerchantFolderActivationFailed">
+ Bu sürüm klasörünü etkinleştirilemedi. Hata kodu:
+
+ &quot;[ERROR_CODE]&quot;
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmMerchantActiveChange">
+ Bu eylem, bu ilanın etkin içeriğini değiştirecek. Devam etmek istiyor musunuz?
+ <usetemplate ignoretext="Pazaryerindeki etkin bir ilanı değiştirmek istediğimde doğrulama iste" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmMerchantMoveInventory">
+ Pazaryeri İlanları penceresine sürüklenen öğeler kopyalanmaz, orijinal konumlarından buraya taşınırlar. Devam etmek istiyor musunuz?
+ <usetemplate ignoretext="Bir öğeyi envanterden Pazaryerine taşımak istediğimde doğrulama iste" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmListingCutOrDelete">
+ Bir ilan klasörü taşınır veya silinirse, Pazaryerindeki ilanınız silinir. Pazaryeri ilanını saklamak isterseniz, değiştirmek istediğiniz sürüm klasörünün içeriğini taşıyın veya silin. Devam etmek istiyor musunuz?
+ <usetemplate ignoretext="Bir ilanı Pazaryerine taşımak ya da Pazaryerinden silmek istediğim zaman doğrulama iste" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmCopyToMarketplace">
+ Bu öğelerden birini ya da birden fazlasını Pazaryerine kopyalama izniniz yok. Bunları taşıyabilir veya bırakabilirsiniz.
+ <usetemplate canceltext="İptal" ignoretext="Kopyalanamaz öğeler içeren bir seçimi Pazaryerine kopyalamaya çalıştığım zaman doğrulama iste" name="yesnocancelbuttons" notext="Öğeleri taşıma" yestext="Öğeleri taşı"/>
+ </notification>
+ <notification name="ConfirmMerchantUnlist">
+ Bu eylem ilanı listeden kaldıracak. Devam etmek istiyor musunuz?
+ <usetemplate ignoretext="Pazaryerindeki etkin bir ilanı listeden kaldırmak istediğimde doğrulama iste" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmMerchantClearVersion">
+ Bu eylem, mevcut ilanın sürüm klasörünü devre dışı bırakacak. Devam etmek istiyor musunuz?
+ <usetemplate ignoretext="Pazaryerindeki bir ilanın sürüm klasörünü devre dışı bırakmak istediğimde doğrulama iste" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="AlertMerchantListingNotUpdated">
+ Bu ilan güncellenemedi.
+Bu öğeyi Pazaryeri üzerinde düzenlemek için [[URL] buraya tıklayın].
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="AlertMerchantListingCannotWear">
+ Pazaryeri İlanları klasöründe bulunan giysileri ve vücut bölümlerini kullanamazsınız.
+ </notification>
+ <notification name="AlertMerchantListingInvalidID">
+ Geçersiz ilan kimliği.
+ </notification>
+ <notification name="AlertMerchantListingActivateRequired">
+ Bu ilanda ya birden fazla sürüm klasörü var ya da hiç sürüm klasörü yok. Daha sonra bir sürüm klasörünü bağımsız olarak seçip etkinleştirmeniz gerekiyor.
+ <usetemplate ignoretext="Birden fazla sürüm klasörü içeren bir ilan oluşturduğum zaman sürüm klasörünün etkinleştirilmesi hakkında uyar" name="okignore" yestext="Tamam"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderSplit">
+ Farklı türdeki stok öğelerini ayrı stok klasörlerine yerleştirdik. Böylece klasörünüz listeleyebileceğimiz bir şekilde düzenlenir.
+ <usetemplate ignoretext="Stok klasörü listelenmeden önce bölündüğünde uyar" name="okignore" yestext="Tamam"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderEmpty">
+ Stok boş olduğu için ilanınızı yayından kaldırdık. İlanı yeniden yayınlamak için stok klasörüne daha fazla birim eklemeniz gerekir.
+ <usetemplate ignoretext="Bir ilan, stok klasörü boş olduğu için listeden kaldırılınca uyar" name="okignore" yestext="Tamam"/>
+ </notification>
<notification name="CompileQueueSaveText">
Aşağıdaki nedenden dolayı, bir komut dosyası için metin karşıya yüklenirken bir sorun oluştu: [REASON]. Lütfen daha sonra tekrar deneyin.
</notification>
@@ -469,6 +555,10 @@ Not: Bu işlem önbelleği temizleyecek.
Değişiklikler Kaydedilsin mi?
<usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Kaydetme" yestext="Kaydet"/>
</notification>
+ <notification name="DeleteNotecard">
+ Not kartı silinsin mi?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
<notification name="GestureSaveFailedTooManySteps">
Mimik kaydedilemedi.
Bu mimikte çok fazla adım var.
@@ -575,6 +665,9 @@ Grafik Kalitesi, Tercihler &gt; Grafikler sekmesinden yükseltilebilir.
<notification name="RegionNoTerraforming">
[REGION] bölgesi yer şekillendirmeye izin vermiyor.
</notification>
+ <notification name="ParcelNoTerraforming">
+ [PARCEL] parseli üzerinde yer şekillendirmesi yapma izniniz bulunmuyor.
+ </notification>
<notification name="CannotCopyWarning">
Aşağıdaki öğeleri kopyalamak için gerekli izne sahip değilsiniz:
[ITEMS]
@@ -1825,6 +1918,30 @@ Binlerce bölgeyi değiştirecek ve alan sunucusunu kesintiye uğratacaktır.
Sadece bu gayrimenkul için mi gayrimenkul yöneticiliğinden çıkarılsın, yoksa [ALL_ESTATES] için mi?
<usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
</notification>
+ <notification label="Gayrimenkul seç" name="EstateAllowedExperienceAdd">
+ Sadece bu gayrimenkul için mi izin verilenler listesine eklensin, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateAllowedExperienceRemove">
+ Yalnızca bu gayrimenkul için mi izin verilenler listesinden çıkarılsın, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateBlockedExperienceAdd">
+ Yalnızca bu gayrimenkul için mi engellenenler listesine eklensin, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateBlockedExperienceRemove">
+ Yalnızca bu gayrimenkul için mi engellenenler listesinden çıkarılsın, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateTrustedExperienceAdd">
+ Yalnızca bu gayrimenkul için mi anahtar listesine eklensin, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateTrustedExperienceRemove">
+ Yalnızca bu gayrimenkul için mi anahtar listesine çıkarılsın, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
<notification label="Çıkarmayı Onayla" name="EstateKickUser">
[EVIL_USER] bu gayrimenkulden çıkarılsın mı?
<usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
@@ -1837,6 +1954,9 @@ Binlerce bölgeyi değiştirecek ve alan sunucusunu kesintiye uğratacaktır.
Ziyaret etmeye çalıştığınız bölge, mevcut tercihlerinizi aşan içeriğe sahip. Ben &gt; Tercihler &gt; Genel sekmesini kullanarak tercihlerinizi değiştirebilirsiniz.
<usetemplate name="okbutton" yestext="Tamam"/>
</notification>
+ <notification name="SLM_UPDATE_FOLDER">
+ [MESSAGE]
+ </notification>
<notification name="RegionEntryAccessBlocked_AdultsOnlyContent">
Ziyaret etmeye çalıştığınız bölge [REGIONMATURITY] içeriğe sahip, buna sadece yetişkinler erişebilir.
<url name="url">
@@ -1899,6 +2019,10 @@ Binlerce bölgeyi değiştirecek ve alan sunucusunu kesintiye uğratacaktır.
Tercihleriniz ile sunucu arasında senkronizasyon eksikliği olduğu için ışınlama işleminizde teknik sorunlar yaşanıyoruz.
<usetemplate name="okbutton" yestext="Tamam"/>
</notification>
+ <notification name="RegionTPSpecialUsageBlocked">
+ Bölgeye girilemiyor. &quot;[REGION_NAME]&quot; bir Yetenek Oyunu Bölgesi. Buraya girebilmek için bazı ölçütleri karşılamanız gerekiyor. Ayrıntılar için lütfen [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ] adresini ziyaret edin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
<notification name="PreferredMaturityChanged">
[RATING] içeriğine sahip bir bölgeyi ziyaret edeceğiniz hakkında başka bildirim almayacaksınız. Daha sonra menü çubuğunda Ben &gt; Tercihler &gt; Genel sekmesini kullanarak tercihlerinizi değiştirebilirsiniz.
<usetemplate name="okbutton" yestext="Tamam"/>
@@ -2120,6 +2244,10 @@ Envanter öğesi/öğeleri taşınsın mı?
<ignore name="ignore" text="Para() komut dosyası içermeyen bir nesne oluştururken &apos;Nesne için ödeme yap&apos; eylemi ayarladım"/>
</form>
</notification>
+ <notification name="PayConfirmation">
+ [TARGET] hedefine [AMOUNT]L$ ödemek istediğinizi doğrulayın.
+ <usetemplate ignoretext="Ödeme yapılmadan önce doğrulama iste (200L$ üzerinde tutarlar için)" name="okcancelignore" notext="İptal" yestext="Öde"/>
+ </notification>
<notification name="OpenObjectCannotCopy">
Bu nesne içinde kopyalama izniniz olan bir öğe yok.
</notification>
@@ -2205,6 +2333,9 @@ Bu nesneyi seçilen nesne ile değiştirmek istiyor musunuz?
<button ignore="Hiçbir Zaman Değiştirme" name="No" text="İptal"/>
</form>
</notification>
+ <notification name="TooManyWearables">
+ [AMOUNT] öğeden fazlasını içeren bir klasörü kullanamazsınız. Bu limiti Gelişmiş &gt; Hata Ayıklama Ayarlarını Göster &gt; KullanılabilirKlasörLimiti öğesinden değiştirebilirsiniz.
+ </notification>
<notification label="Rahatsız Etme Modu Uyarısı" name="DoNotDisturbModePay">
Rahatsız Etme seçeneğini devreye aldınız. Bu ödemenin karşılığında sunulan hiçbir öğeyi almayacaksınız.
@@ -2657,9 +2788,6 @@ Lütfen biraz sonra tekrar deneyin.
<notification name="NoValidCircuit">
Geçerli bir devre kodu yok.
</notification>
- <notification name="NoValidTimestamp">
- Geçerli bir zaman damgası yok.
- </notification>
<notification name="NoPendingConnection">
Beklemedeki bağlantı oluşturulamıyor.
</notification>
@@ -2814,7 +2942,7 @@ Bu bölgede kalmaya devam ederseniz oturumunuz sonlandırılacak.
[MESSAGE]
-Şu nesneden: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, sahibi: [NAME]?
+Kaynak nesne: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, sahibi: [NAME]
<form name="form">
<button name="Gotopage" text="Sayfaya git"/>
<button name="Cancel" text="İptal"/>
@@ -2840,6 +2968,72 @@ Kabul ediyor musunuz?
<button name="Mute" text="Engelle"/>
</form>
</notification>
+ <notification name="ExperienceAcquireFailed">
+ Yeni bir deneyim edinilemiyor:
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="NotInGroupExperienceProfileMessage">
+ Deneyimin sahibi seçili grubun bir üyesi olmadığı için, deneyim grubunda yapılan bir değişiklik göz ardı edildi.
+ </notification>
+ <notification name="UneditableExperienceProfileMessage">
+ Deneyim profili güncellenirken, düzenlenebilir olmayan &quot;[field]&quot; alanı göz ardı edildi.
+ </notification>
+ <notification name="RestrictedToOwnerExperienceProfileMessage">
+ Yalnızca deneyimin sahibi tarafından ayarlanabilecek olan &quot;[field]&quot; alanında yapılan değişiklikler göz ardı edildi.
+ </notification>
+ <notification name="MaturityRatingExceedsOwnerExperienceProfileMessage">
+ Bir deneyimin erişkinlik seviyesini deneyimin sahibinin seviyesinden daha yüksek bir seviyeye ayarlayamazsınız.
+ </notification>
+ <notification name="RestrictedTermExperienceProfileMessage">
+ Aşağıdaki koşullar deneyim profili adının ve/veya açıklamasının güncellenmesini engelledi: [extra_info]
+ </notification>
+ <notification name="TeleportedHomeExperienceRemoved">
+ secondlife:///app/experience/[public_id]/profile deneyimini kaldırdığınız için [region_name] bölgesinden dışarı ışınlandınız ve artık bu bölgeye girme hakkınız yok.
+ <form name="form">
+ <ignore name="ignore" text="Bir deneyim kaldırıldığı için bölgeden çıkarıldı"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperienceEntry">
+ secondlife:///app/experience/[public_id]/profile anahtar deneyimine katılarak [region_name] bölgesine giriş izni aldınız. Bu deneyimin kaldırılması bu bölgeden çıkarılmanıza neden olabilir.
+ <form name="form">
+ <ignore name="ignore" text="Bir deneyim bir bölgeye girme izni verdi"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperiencesAvailable">
+ Bu hedef konuma erişim izniniz yok. Aşağıdaki bir deneyimi kabul ederek bölgeye giriş izni kazanabilirsiniz:
+
+[EXPERIENCE_LIST]
+
+Başka Anahtar Deneyimler de olabilir.
+ </notification>
+ <notification name="ExperienceEvent">
+ secondlife:///app/experience/[public_id]/profile deneyimiyle [EventType] için bir nesneye izin verildi.
+ Sahibi: secondlife:///app/agent/[OwnerID]/inspect
+ Nesne Adı: [ObjectName]
+ Parsel Adı: [ParcelName]
+ </notification>
+ <notification name="ExperienceEventAttachment">
+ secondlife:///app/experience/[public_id]/profile deneyimiyle [EventType] için bir eke izin verildi.
+ Sahibi: secondlife:///app/agent/[OwnerID]/inspect
+ </notification>
+ <notification name="ScriptQuestionExperience">
+ &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, &quot;[NAME]&quot; adlı kişiye ait bir nesne, [GRID_WIDE] deneyimine katılmanızı istiyor:
+
+[EXPERIENCE]
+
+İzin verildikten sonra, deneyim profilinden iptal edilmedikçe, bu deneyim için bu iletiyi bir daha görmezsiniz.
+
+Bu deneyimle ilişkili komut dosyaları deneyimin etkin olduğu bölgelerde aşağıdaki eylemleri gerçekleştirebilecek:
+
+[QUESTIONS]Kabul ediyor musunuz?
+ <form name="form">
+ <button name="BlockExperience" text="Deneyimi Engelle"/>
+ <button name="Mute" text="Nesneyi Engelle"/>
+ <button name="Yes" text="Evet"/>
+ <button name="No" text="Hayır"/>
+ </form>
+ </notification>
<notification name="ScriptQuestionCaution">
Uyarı: &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; nesnesi, Linden Dolar hesabınıza tam erişim istiyor. Eğer erişime izin verirseniz, süregelen bir şekilde, ilave uyarı olmaksızın, hesabınızdan herhangi bir zamanda fon çekebilir veya hesabınızı tamamen boşaltabilir.
@@ -3159,6 +3353,10 @@ Lütfen ağ ve güvenlik duvarı ayarlarınızı kontrol edin.
( [EXISTENCE] saniyedir hayatta )
&apos;[BODYREGION]&apos; için [RESOLUTION] çözünürlükte kaydedilmiş bir dokuyu [TIME] saniye sonra yerel olarak güncellediniz.
</notification>
+ <notification name="CannotUploadTexture">
+ Doku karşıya yüklenemiyor.
+[REASON]
+ </notification>
<notification name="LivePreviewUnavailable">
Kopyalanamaz ve/veya aktarılamaz olduğu için bu dokunun bir önizlemesini görüntüleyemiyoruz.
<usetemplate ignoretext="Kopyalanamayan ve/veya aktarılamayan dokular için Canlı Önizleme modu mevcut olmayınca beni uyar" name="okignore" yestext="Tamam"/>
@@ -3727,9 +3925,11 @@ Lütfen bir dakika sonra tekrar deneyin.
</notification>
<notification name="TeleportedByAttachment">
You have been teleported by an attachment on [ITEM_ID]
+ <usetemplate ignoretext="Işınlama: Bir ek tarafından ışınlandınız" name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOnParcel">
&apos;[PARCEL_NAME]&apos; parseli üzerindeki &apos;[OBJECT_NAME]&apos; nesnesi tarafından ışınlandınız
+ <usetemplate ignoretext="Işınlama: Bir parsel üzerindeki bir nesne tarafından ışınlandınız" name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOwnedBy">
Sahibi [OWNER_ID] olan &apos;[OBJECT_NAME]&apos; nesnesi tarafından ışınlandınız
@@ -4061,7 +4261,7 @@ Daha küçük bir arazi parçası seçmeyi deneyin.
<usetemplate ignoretext="Dosyalar taşınamıyor. Önceki yol geri yüklendi." name="okignore" yestext="Tamam"/>
</notification>
<notification name="DefaultObjectPermissions">
- Aşağıdaki nedenden dolayı, varsayılan izinler kaydedilirken bir sorun oluştu: [REASON]. Varsayılan izinleri ayarlamayı lütfen daha sonra tekrar deneyin.
+ Varsayılan nesne izinleri kaydedilirken bir sorun oluştu: [REASON]. Varsayılan izinleri kaydetmeyi lütfen daha sonra tekrar deneyin.
<usetemplate name="okbutton" yestext="Tamam"/>
</notification>
<notification name="ChatHistoryIsBusyAlert">
diff --git a/indra/newview/skins/default/xui/tr/panel_experience_info.xml b/indra/newview/skins/default/xui/tr/panel_experience_info.xml
new file mode 100644
index 0000000000..0bce4fea8f
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_experience_info.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_experience_info">
+ <text name="title" value="Deneyim Profili"/>
+ <scroll_container name="xp_scroll">
+ <panel name="scrolling_panel">
+ <layout_stack>
+ <layout_panel>
+ <text name="experience_title" value="Kyle&apos;s Superhero RPG"/>
+ </layout_panel>
+ <layout_panel name="location panel">
+ <text name="Location">
+ Konum:
+ </text>
+ <text name="LocationTextText">
+ bir yer
+ </text>
+ <button label="Işınla" name="teleport_btn"/>
+ <button label="Harita" name="map_btn"/>
+ </layout_panel>
+ <layout_panel name="marketplace panel">
+ <text name="Location">
+ Pazar yeri mağazası:
+ </text>
+ <text name="LocationTextText">
+ bir yer
+ </text>
+ </layout_panel>
+ <layout_panel>
+ <text name="ContentRating">
+ Seviye:
+ </text>
+ <text name="ContentRatingText">
+ Yetişkin
+ </text>
+ <text name="Owner">
+ Sahip:
+ </text>
+ <text name="OwnerText">
+ Kyle
+ </text>
+ <button label="Düzenle" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_experience_list_editor.xml b/indra/newview/skins/default/xui/tr/panel_experience_list_editor.xml
new file mode 100644
index 0000000000..5379fe4548
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_experience_list_editor.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="experince_list_editor">
+ <panel.string name="loading">
+ yükleniyor...
+ </panel.string>
+ <panel.string name="panel_allowed">
+ İzin Verilen Deneyimler:
+ </panel.string>
+ <panel.string name="panel_blocked">
+ Engellenen Deneyimler:
+ </panel.string>
+ <panel.string name="panel_trusted">
+ Anahtar Deneyimler:
+ </panel.string>
+ <panel.string name="no_results">
+ (boş)
+ </panel.string>
+ <text name="text_name">
+ Deneyim Listesi
+ </text>
+ <scroll_list name="experience_list">
+ <columns label="Ad" name="experience_name"/>
+ </scroll_list>
+ <button label="Ekle..." name="btn_add"/>
+ <button label="Kaldır" name="btn_remove"/>
+ <button label="Profil..." name="btn_profile"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_experience_list_item.xml b/indra/newview/skins/default/xui/tr/panel_experience_list_item.xml
new file mode 100644
index 0000000000..b904295f97
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_experience_list_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiences">
+ <text name="experience_name">
+ Geçici Ad
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_experience_log.xml b/indra/newview/skins/default/xui/tr/panel_experience_log.xml
new file mode 100644
index 0000000000..600530cf2d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_experience_log.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="EVENTS">
+ <string name="no_events" value="Olay yok."/>
+ <string name="loading" value="yükleniyor..."/>
+ <layout_stack>
+ <layout_panel>
+ <scroll_list name="experience_log_list">
+ <columns label="Süre" name="time"/>
+ <columns label="Etkinlik" name="event"/>
+ <columns label="Deneyim" name="experience_name"/>
+ <columns label="Nesne" name="object_name"/>
+ </scroll_list>
+ <button label="Bildir" name="btn_notify"/>
+ <button label="Profil" name="btn_profile_xp"/>
+ <button label="Raporla" name="btn_report_xp"/>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <check_box label="Tüm Olayları Bildir Gün" name="notify_all"/>
+ <button label="Temizle" name="btn_clear"/>
+ <button label="&lt;" name="btn_prev"/>
+ <button label="&gt;" name="btn_next"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_experience_search.xml b/indra/newview/skins/default/xui/tr/panel_experience_search.xml
new file mode 100644
index 0000000000..7cc2bd1223
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_experience_search.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="SEARCH">
+ <string name="not_found">
+ &quot;[TEXT]&quot; bulunamadı
+ </string>
+ <string name="no_results">
+ Sonuç yok
+ </string>
+ <string name="searching">
+ Arıyor...
+ </string>
+ <string name="loading">
+ Yükleniyor...
+ </string>
+ <string name="maturity_icon_general">
+ &quot;Parcel_PG_Light&quot;
+ </string>
+ <string name="maturity_icon_moderate">
+ &quot;Parcel_M_Light&quot;
+ </string>
+ <string name="maturity_icon_adult">
+ &quot;Parcel_R_Light&quot;
+ </string>
+ <panel name="search_panel">
+ <button label="Git" name="find"/>
+ <icons_combo_box label="Orta" name="maturity">
+ <icons_combo_box.item label="Yetişkin" name="Adult" value="42"/>
+ <icons_combo_box.item label="Orta" name="Mature" value="21"/>
+ <icons_combo_box.item label="Genel" name="PG" value="13"/>
+ </icons_combo_box>
+ <scroll_list name="search_results">
+ <columns label="Ad" name="experience_name"/>
+ <columns label="Sahip" name="owner"/>
+ </scroll_list>
+ <button label="Tamam" label_selected="Tamam" name="ok_btn"/>
+ <button label="İptal" name="cancel_btn"/>
+ <button label="Profili Görüntüle" name="profile_btn"/>
+ <button label="&lt;" name="left_btn"/>
+ <button label="&gt;" name="right_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_experiences.xml b/indra/newview/skins/default/xui/tr/panel_experiences.xml
new file mode 100644
index 0000000000..15be61aad2
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_experiences.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiences">
+ <string name="loading_experiences" value="Deneyimler yükleniyor..."/>
+ <string name="no_experiences" value="Deneyim yok."/>
+ <string name="acquire" value="Bir Deneyim Edin"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_facebook_friends.xml b/indra/newview/skins/default/xui/tr/panel_facebook_friends.xml
index 0a6b9ac600..8184d6d7cf 100644
--- a/indra/newview/skins/default/xui/tr/panel_facebook_friends.xml
+++ b/indra/newview/skins/default/xui/tr/panel_facebook_friends.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_friends">
<string name="facebook_friends_empty" value="Şu an için aynı zamanda bir Second Life sakini olan hiçbir Facebook arkadaşınız yok. Facebook arkadaşlarınızı bugün Second Life&apos;a katılmaya davet edin!"/>
- <string name="facebook_friends_no_connected" value="Şu anda Facebook&apos;a bağlı değilsiniz. Bağlanmak ve bu özelliği etkinleştirmek için lütfen Hesap sekmesine gidin."/>
+ <string name="facebook_friends_no_connected" value="Şu anda Facebook&apos;a bağlı değilsiniz. Bağlanmak ve bu özelliği etkinleştirmek için lütfen Durum sekmesine gidin."/>
<accordion name="friends_accordion">
<accordion_tab name="tab_second_life_friends" title="SL arkadaşları"/>
<accordion_tab name="tab_suggested_friends" title="Bu kişileri SL arkadaşları olarak ekle"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_facebook_photo.xml b/indra/newview/skins/default/xui/tr/panel_facebook_photo.xml
index 64732c5fc7..d772aff937 100644
--- a/indra/newview/skins/default/xui/tr/panel_facebook_photo.xml
+++ b/indra/newview/skins/default/xui/tr/panel_facebook_photo.xml
@@ -1,26 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Görüntü çözünürlüğü">
- <combo_box.item label="Mevcut Pencere" 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="1200x630" name="1200x630"/>
- </combo_box>
- <combo_box name="filters_combobox" tool_tip="Görüntü filtreleri">
- <combo_box.item label="Filtre Yok" name="NoFilter"/>
- </combo_box>
- <button label="Yenile" name="new_snapshot_btn" tool_tip="Yenilemek için tıklayın"/>
- <button label="Önizleme" name="big_preview_btn" tool_tip="Önizleme ayarları arasında geçiş yapmak için tıklayın"/>
- <text name="caption_label">
- Yorum (isteğe bağlı):
- </text>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Yayınla" name="post_photo_btn"/>
- <button label="İptal" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <combo_box name="resolution_combobox" tool_tip="Görüntü çözünürlüğü">
+ <combo_box.item label="Mevcut Pencere" 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="1200x630" name="1200x630"/>
+ </combo_box>
+ <combo_box name="filters_combobox" tool_tip="Görüntü filtreleri">
+ <combo_box.item label="Filtre Yok" name="NoFilter"/>
+ </combo_box>
+ <button label="Yenile" name="new_snapshot_btn" tool_tip="Yenilemek için tıklayın"/>
+ <button label="Önizleme" name="big_preview_btn" tool_tip="Önizleme ayarları arasında geçiş yapmak için tıklayın"/>
+ <text name="caption_label">
+ Yorum (isteğe bağlı):
+ </text>
+ <button label="Yayınla" name="post_photo_btn"/>
+ <button label="İptal" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_facebook_place.xml b/indra/newview/skins/default/xui/tr/panel_facebook_place.xml
index 54c392c9d8..85b401a1a0 100644
--- a/indra/newview/skins/default/xui/tr/panel_facebook_place.xml
+++ b/indra/newview/skins/default/xui/tr/panel_facebook_place.xml
@@ -1,17 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_place">
- <layout_stack name="stack_place">
- <layout_panel name="place_detail_panel">
- <text name="place_caption_label">
- Bulunduğunuz yer hakkında bir şeyler söyleyin:
- </text>
- </layout_panel>
- <layout_panel name="place_map_panel">
- <check_box initial_value="false" label="" name="add_place_view_cb"/>
- </layout_panel>
- <layout_panel name="place_button_panel">
- <button label="Yayınla" name="post_place_btn"/>
- <button label="İptal" name="cancel_place_btn"/>
- </layout_panel>
- </layout_stack>
+ <text name="place_caption_label">
+ Bulunduğunuz yer hakkında bir şeyler söyleyin:
+ </text>
+ <check_box initial_value="false" label="Konumun üstten görünümünü ekle" name="add_place_view_cb"/>
+ <button label="Yayınla" name="post_place_btn"/>
+ <button label="İptal" name="cancel_place_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_facebook_status.xml b/indra/newview/skins/default/xui/tr/panel_facebook_status.xml
index 9b95fe3a35..e6feff5949 100644
--- a/indra/newview/skins/default/xui/tr/panel_facebook_status.xml
+++ b/indra/newview/skins/default/xui/tr/panel_facebook_status.xml
@@ -1,14 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_status">
- <layout_stack name="stack_status">
- <layout_panel name="status_detail_panel">
- <text name="status_caption_label">
- Ne düşünüyorsunuz?
- </text>
- </layout_panel>
- <layout_panel name="status_button_panel">
- <button label="Yayınla" name="post_status_btn"/>
- <button label="İptal" name="cancel_status_btn"/>
- </layout_panel>
- </layout_stack>
+ <string name="facebook_connected" value="Facebook&apos;a şu kimlikle bağlandınız:"/>
+ <string name="facebook_disconnected" value="Facebook&apos;a bağlanılmadı"/>
+ <text name="account_caption_label">
+ Facebook&apos;a bağlanılmadı.
+ </text>
+ <panel name="panel_buttons">
+ <button label="Bağlan..." name="connect_btn"/>
+ <button label="Bağlantıyı kes" name="disconnect_btn"/>
+ <text name="account_learn_more_label">
+ [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 Facebook&apos;ta içerik yayınlama hakkında bilgi edinin]
+ </text>
+ </panel>
+ <text name="status_caption_label">
+ Ne düşünüyorsunuz?
+ </text>
+ <button label="Yayınla" name="post_status_btn"/>
+ <button label="İptal" name="cancel_status_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_flickr_photo.xml b/indra/newview/skins/default/xui/tr/panel_flickr_photo.xml
index 9ebc70c67c..cab1b24621 100644
--- a/indra/newview/skins/default/xui/tr/panel_flickr_photo.xml
+++ b/indra/newview/skins/default/xui/tr/panel_flickr_photo.xml
@@ -1,41 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_flickr_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Görüntü çözünürlüğü">
- <combo_box.item label="Mevcut Pencere" 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>
- <combo_box name="filters_combobox" tool_tip="Görüntü filtreleri">
- <combo_box.item label="Filtre Yok" name="NoFilter"/>
- </combo_box>
- <button label="Yenile" name="new_snapshot_btn" tool_tip="Yenilemek için tıklayın"/>
- <button label="Önizleme" name="big_preview_btn" tool_tip="Önizleme ayarları arasında geçiş yapmak için tıklayın"/>
- <text name="title_label">
- Başlık:
- </text>
- <text name="description_label">
- Açıklama:
- </text>
- <check_box initial_value="true" label="Açıklamanın sonuna SL konumunu ekle" name="add_location_cb"/>
- <text name="tags_label">
- Etiketler:
- </text>
- <text name="tags_help_label">
- Etiketleri boşlukla ayır
+ <combo_box name="resolution_combobox" tool_tip="Görüntü çözünürlüğü">
+ <combo_box.item label="Mevcut Pencere" 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>
+ <combo_box name="filters_combobox" tool_tip="Görüntü filtreleri">
+ <combo_box.item label="Filtre Yok" name="NoFilter"/>
+ </combo_box>
+ <button label="Yenile" name="new_snapshot_btn" tool_tip="Yenilemek için tıklayın"/>
+ <button label="Önizleme" name="big_preview_btn" tool_tip="Önizleme ayarları arasında geçiş yapmak için tıklayın"/>
+ <text name="title_label">
+ Başlık:
+ </text>
+ <text name="description_label">
+ Açıklama:
+ </text>
+ <check_box initial_value="true" label="Açıklamanın sonuna SL konumunu ekle" name="add_location_cb"/>
+ <text name="tags_label">
+ Etiketler:
+ </text>
+ <text name="tags_help_label">
+ Etiketleri boşlukla ayır
Birden çok kelime içeren etiketler için &quot;&quot; kullan
- </text>
- <combo_box name="rating_combobox" tool_tip="Filckr içerik seviyesi">
- <combo_box.item label="Güvenli Flickr seviyesi" name="SafeRating"/>
- <combo_box.item label="Orta Flickr seviyesi" name="ModerateRating"/>
- <combo_box.item label="Kısıtlı Flickr seviyesi" name="RestrictedRating"/>
- </combo_box>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Karşıya Yükle" name="post_photo_btn"/>
- <button label="İptal" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ </text>
+ <combo_box name="rating_combobox" tool_tip="Filckr içerik seviyesi">
+ <combo_box.item label="Güvenli Flickr seviyesi" name="SafeRating"/>
+ <combo_box.item label="Orta Flickr seviyesi" name="ModerateRating"/>
+ <combo_box.item label="Kısıtlı Flickr seviyesi" name="RestrictedRating"/>
+ </combo_box>
+ <button label="Karşıya Yükle" name="post_photo_btn"/>
+ <button label="İptal" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/tr/panel_group_info_sidetray.xml
index e4697eaa21..d72bb2cf31 100755
--- a/indra/newview/skins/default/xui/tr/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/tr/panel_group_info_sidetray.xml
@@ -23,6 +23,7 @@
<accordion_tab name="group_roles_tab" title="Roller ve Üyeler"/>
<accordion_tab name="group_notices_tab" title="Bildirimler"/>
<accordion_tab name="group_land_tab" title="Arazi/Varlıklar"/>
+ <accordion_tab name="group_experiences_tab" title="Deneyimler"/>
</accordion>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/tr/panel_login.xml b/indra/newview/skins/default/xui/tr/panel_login.xml
index ce1519be89..8b320ce9aa 100755
--- a/indra/newview/skins/default/xui/tr/panel_login.xml
+++ b/indra/newview/skins/default/xui/tr/panel_login.xml
@@ -1,26 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_login">
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php
- </panel.string>
+ <panel.string name="forgot_password_url">http://secondlife.com/account/request.php</panel.string>
<layout_stack name="ui_stack">
<layout_panel name="ui_container">
<combo_box label="Kullanıcı Adı" name="username_combo" tool_tip="Kaydolduğunuzda seçtiğiniz kullanıcı adı, örn. mustafayalcin12 veya Faruk Gungoren"/>
<line_editor label="Parola" name="password_edit"/>
- <check_box label="Beni hatırla" name="remember_check"/>
- <text name="forgot_password_text">
- Parolamı unuttum
- </text>
- <button label="Oturum Aç" name="connect_btn"/>
- <text name="At_My_Last_Location_Label">
- son konumum
- </text>
<combo_box label="Sık kullandığım yerler" name="start_location_combo">
+ <combo_box.item label="Son konumum" name="MyLastLocation"/>
<combo_box.item label="Ana konumum" name="MyHome"/>
</combo_box>
- <button label="Oturum Aç" name="connect_favorite_btn"/>
- <line_editor label="Bir yer adı yazın" name="location_edit"/>
- <button label="Oturum Aç" name="connect_location_btn"/>
+ <button label="Oturum Aç" name="connect_btn"/>
+ <check_box label="Beni hatırla" name="remember_check"/>
+ <text name="forgot_password_text">Parolamı unuttum</text>
<combo_box label="Ağ seç" name="server_combo"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/tr/panel_marketplace_listings.xml b/indra/newview/skins/default/xui/tr/panel_marketplace_listings.xml
new file mode 100644
index 0000000000..50acc0f92a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_marketplace_listings.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Pazaryeri" name="Marketplace Panel">
+ <panel name="tool_panel">
+ <menu_button name="sort_btn" tool_tip="Seçenekleri görüntüleyin/sıralayın"/>
+ <button name="add_btn" tool_tip="Yeni bir ilan klasörü oluşturun"/>
+ <button label="Hatalara Karşı Kontrol Et" name="audit_btn" tool_tip="Pazaryeri ilanlarınızı kontrol edin"/>
+ </panel>
+ <panel name="tab_container_panel">
+ <filter_editor label="Pazaryeri İlanlarını Filtrele" name="filter_editor"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_marketplace_listings_inventory.xml b/indra/newview/skins/default/xui/tr/panel_marketplace_listings_inventory.xml
new file mode 100644
index 0000000000..8d857d20f0
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_marketplace_listings_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="TÜMÜ" name="All Items" tool_tip="Öğeleri listelemek için buraya sürükleyin ve bırakın"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_marketplace_listings_listed.xml b/indra/newview/skins/default/xui/tr/panel_marketplace_listings_listed.xml
new file mode 100644
index 0000000000..c647a11246
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_marketplace_listings_listed.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="LİSTELENMİŞ" name="Active Items"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_marketplace_listings_unassociated.xml b/indra/newview/skins/default/xui/tr/panel_marketplace_listings_unassociated.xml
new file mode 100644
index 0000000000..ec9213ff35
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_marketplace_listings_unassociated.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="İLİŞKİLENDİRİLMEMİŞ" name="Unassociated Items"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_marketplace_listings_unlisted.xml b/indra/newview/skins/default/xui/tr/panel_marketplace_listings_unlisted.xml
new file mode 100644
index 0000000000..d8c1b0a6d0
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_marketplace_listings_unlisted.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="LİSTELENMEMİŞ" name="Inactive Items"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_postcard_settings.xml b/indra/newview/skins/default/xui/tr/panel_postcard_settings.xml
index bce0b21b9a..e1443217e8 100755
--- a/indra/newview/skins/default/xui/tr/panel_postcard_settings.xml
+++ b/indra/newview/skins/default/xui/tr/panel_postcard_settings.xml
@@ -7,17 +7,7 @@
<combo_box.item label="1024x768" name="1024x768"/>
<combo_box.item label="Özel" name="Custom"/>
</combo_box>
- <layout_stack name="postcard_image_params_ls">
- <layout_panel name="postcard_image_size_lp">
- <spinner label="Genişlik" name="postcard_snapshot_width"/>
- <spinner label="Yükseklik" name="postcard_snapshot_height"/>
- <check_box label="Oranları koru" name="postcard_keep_aspect_check"/>
- </layout_panel>
- <layout_panel name="postcard_image_format_quality_lp">
- <slider label="Görüntü kalitesi" name="image_quality_slider"/>
- <text name="image_quality_level">
- ([QLVL])
- </text>
- </layout_panel>
- </layout_stack>
+ <spinner label="Genişlik x Yükseklik" name="postcard_snapshot_width"/>
+ <check_box label="Oranları koru" name="postcard_keep_aspect_check"/>
+ <slider label="Kalite:" name="image_quality_slider"/>
</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml
index 2039761748..acb20595f7 100755
--- a/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml
@@ -14,9 +14,9 @@
<text name="Web:">
Web:
</text>
- <radio_group name="use_external_browser">
- <radio_item label="Tarayıcımı kullan (IE, Firefox, Safari)" name="external" tool_tip="Yardım, web bağlantıları vs. için sistemin varsayılan web tarayıcısını kullanın. Tam ekran çalıştırılıyorsa tavsiye edilmez." value="true"/>
- <radio_item label="Yerleşik tarayıcıyı kullan" name="internal" tool_tip="Yardım, web bağlantıları vs. için dahili web tarayıcısını kullanın. Bu tarayıcı [APP_NAME] içerisinde yeni bir pencere olarak açılır." value=""/>
+ <radio_group name="preferred_browser_behavior">
+ <radio_item label="Tüm bağlantılar için kendi tarayıcımı kullan (Chrome, Firefox, IE)" name="internal" tool_tip="Yardım, web bağlantıları vb. için sistemin varsayılan web tarayıcısını kullanın. Tam ekran çalıştırılıyorsa tavsiye edilmez." value="0"/>
+ <radio_item label="Yerleşik tarayıcıyı yalnızca Second Life bağlantıları için kullan" name="external" tool_tip="Yardım, web bağlantıları vb. için sistemin varsayılan web tarayıcısını kullanın. Yerleşik tarayıcı yalnızca LindenLab/SecondLife bağlantıları için kullanılır." value="1"/>
</radio_group>
<check_box initial_value="true" label="Eklentileri etkinleştir" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Çerezleri kabul et" name="cookies_enabled"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_region_experiences.xml b/indra/newview/skins/default/xui/tr/panel_region_experiences.xml
new file mode 100644
index 0000000000..406995c359
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_region_experiences.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Deneyimler" name="Experiences">
+ <panel.string name="trusted_estate_text">
+ Her Deneyim bir Anahtar olabilir.
+
+Bu gayrimenkul üzerinde Anahtar Deneyimlerin çalıştırılma izni var.
+
+Ek olarak, gayrimenkul genel erişime izin vermiyorsa, herhangi bir Anahtar Deneyime katılan Sakinler gayrimenkule girebilir ve bir Anahtar Deneyime dahil oldukları sürece burada kalabilirler.
+ </panel.string>
+ <panel.string name="allowed_estate_text">
+ Yalnızca Arazi Kapsamındaki Deneyimlere İzin Verilebilir.
+
+Bu gayrimenkul üzerinde İzin Verilen Deneyimlerin çalıştırılma izni var.
+ </panel.string>
+ <panel.string name="blocked_estate_text">
+ Yalnızca Ağ Kapsamındaki Deneyimler Engellenebilir.
+
+Bu gayrimenkul üzerinde Engellenmiş Deneyimler çalıştırılamaz.
+ </panel.string>
+ <panel.string name="estate_caption">
+ Bu sekmedeki ayarlarda yapılan değişiklikler gayrimenkul içerisindeki tüm bölgeleri etkiler.
+ </panel.string>
+ <panel.string name="allowed_parcel_text">
+ Yalnızca Arazi Kapsamındaki Deneyimlere İzin Verilebilir.
+
+Gayrimenkul tarafından engellenmemişlerse, İzin Verilen Deneyimlerin bu parsel üzerinde çalıştırılma izni vardır.
+ </panel.string>
+ <panel.string name="blocked_parcel_text">
+ Sakinlerin Tüm Deneyimleri Engellenebilir.
+
+Engellenmiş Deneyimler bu parselde çalıştırılamaz.
+ </panel.string>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_script_experience.xml b/indra/newview/skins/default/xui/tr/panel_script_experience.xml
new file mode 100644
index 0000000000..1e7054c310
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_script_experience.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel name="script_experience" title="DENEYİM">
+ <button label="Deneyim" name="Expand Experience"/>
+ <check_box label="Deneyimi Kullanır" name="enable_xp"/>
+ <layout_stack name="xp_details">
+ <layout_panel>
+ <combo_box label="Deneyimi Seç..." name="Experiences..."/>
+ </layout_panel>
+ </layout_stack>
+ <text name="No Experiences">
+ Hiçbir deneyimde katkınız yok.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml
index e3b22c639a..160cba8700 100755
--- a/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_inventory">
<text name="title">
- Envanterime Kaydet
+ Envanter
</text>
<text name="hint_lbl">
Bir görüntüyü envanterinize kaydetmenin maliyeti L$[UPLOAD_COST] olur. Görüntünüzü bir doku olarak kaydetmek için kare formatlardan birini seçin.
@@ -13,8 +13,8 @@
<combo_box.item label="Büyük (512x512)" name="Large(512x512)"/>
<combo_box.item label="Özel" name="Custom"/>
</combo_box>
- <spinner label="Genişlik" name="inventory_snapshot_width"/>
- <spinner label="Yükseklik" name="inventory_snapshot_height"/>
+ <spinner label="Genişlik x Yükseklik" name="inventory_snapshot_width"/>
+ <spinner label="" name="inventory_snapshot_height"/>
<check_box label="Oranları koru" name="inventory_keep_aspect_check"/>
<button label="İptal" name="cancel_btn"/>
<button label="Kaydet" name="save_btn"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_local.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_local.xml
index 87d7677d73..a28e390ee5 100755
--- a/indra/newview/skins/default/xui/tr/panel_snapshot_local.xml
+++ b/indra/newview/skins/default/xui/tr/panel_snapshot_local.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_local">
<text name="title">
- Bilgisayarıma Kaydet
+ Disk
</text>
<combo_box label="Çözünürlük" name="local_size_combo">
<combo_box.item label="Mevcut Pencere" name="CurrentWindow"/>
@@ -13,24 +13,17 @@
<combo_box.item label="1600x1200" name="1600x1200"/>
<combo_box.item label="Özel" name="Custom"/>
</combo_box>
- <layout_stack name="local_image_params_ls">
- <layout_panel name="local_image_size_lp">
- <spinner label="Genişlik" name="local_snapshot_width"/>
- <spinner label="Yükseklik" name="local_snapshot_height"/>
- <check_box label="Oranları koru" name="local_keep_aspect_check"/>
- </layout_panel>
- <layout_panel name="local_image_format_quality_lp">
- <combo_box label="Format" name="local_format_combo">
- <combo_box.item label="PNG (Kayıpsız)" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP (Kayıpsız)" name="BMP"/>
- </combo_box>
- <slider label="Görüntü kalitesi" name="image_quality_slider"/>
- <text name="image_quality_level">
- ([QLVL])
- </text>
- </layout_panel>
- </layout_stack>
+ <spinner label="Genişlik x Yükseklik" name="local_snapshot_width"/>
+ <check_box label="Oranları koru" name="local_keep_aspect_check"/>
+ <text name="local_format_label">
+ Format:
+ </text>
+ <combo_box label="Format" name="local_format_combo">
+ <combo_box.item label="PNG (Kayıpsız)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (Kayıpsız)" name="BMP"/>
+ </combo_box>
+ <slider label="Kalite:" name="image_quality_slider"/>
<button label="İptal" name="cancel_btn"/>
<flyout_button label="Kaydet" name="save_btn" tool_tip="Görüntüyü bir dosyaya kaydet">
<flyout_button.item label="Kaydet" name="save_item"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml
index 4bc1098ce9..db29e6908c 100755
--- a/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml
@@ -1,16 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_options">
- <button label="Profil Akışımda Yayınla" name="save_to_profile_btn"/>
- <button label="E-posta" name="save_to_email_btn"/>
- <button label="Envanterime Kaydet (L$[AMOUNT])" name="save_to_inventory_btn"/>
- <button label="Bilgisayarıma Kaydet" name="save_to_computer_btn"/>
- <text name="send_to_facebook_textbox">
- Gönder: [secondlife:/// Facebook]
- </text>
- <text name="send_to_twitter_textbox">
- [secondlife:/// Twitter]
- </text>
- <text name="send_to_flickr_textbox">
- [secondlife:/// Flickr]
- </text>
+ <button label="Diske Kaydet" name="save_to_computer_btn"/>
+ <button label="Envantere Kaydet (L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="Profile Yükle" name="save_to_profile_btn"/>
+ <button label="Facebook&apos;a Yükle" name="send_to_facebook_btn"/>
+ <button label="Twitter&apos;a Yükle" name="send_to_twitter_btn"/>
+ <button label="Flickr&apos;a Yükle" name="send_to_flickr_btn"/>
+ <button label="E-postayla Gönder" name="save_to_email_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml
index e999678a0d..ecb47b2218 100755..100644
--- a/indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml
+++ b/indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml
@@ -12,6 +12,10 @@
<text name="title">
E-posta
</text>
- <button label="İleti" name="message_btn"/>
- <button label="Ayarlar" name="settings_btn"/>
+ <tab_container name="postcard_tabs">
+ <panel label="İleti" name="panel_postcard_message"/>
+ <panel label="Ayarlar" name="panel_postcard_settings"/>
+ </tab_container>
+ <button label="İptal" name="cancel_btn"/>
+ <button label="Gönder" name="send_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_profile.xml
index 334fd52a48..ed8f25f255 100755
--- a/indra/newview/skins/default/xui/tr/panel_snapshot_profile.xml
+++ b/indra/newview/skins/default/xui/tr/panel_snapshot_profile.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_profile">
<text name="title">
- Profil Akışımda Yayınla
+ Profil
</text>
<combo_box label="Çözünürlük" name="profile_size_combo">
<combo_box.item label="Mevcut Pencere" name="CurrentWindow"/>
@@ -10,19 +10,12 @@
<combo_box.item label="1024x768" name="1024x768"/>
<combo_box.item label="Özel" name="Custom"/>
</combo_box>
- <layout_stack name="profile_image_params_ls">
- <layout_panel name="profile_image_size_lp">
- <spinner label="Genişlik" name="profile_snapshot_width"/>
- <spinner label="Yükseklik" name="profile_snapshot_height"/>
- <check_box label="Oranları koru" name="profile_keep_aspect_check"/>
- </layout_panel>
- <layout_panel name="profile_image_metadata_lp">
- <text name="caption_label">
- Resim yazısı:
- </text>
- <check_box initial_value="true" label="Konumu dahil et" name="add_location_cb"/>
- </layout_panel>
- </layout_stack>
+ <spinner label="Genişlik x Yükseklik" name="profile_snapshot_width"/>
+ <check_box label="Oranları koru" name="profile_keep_aspect_check"/>
+ <text name="caption_label">
+ Resim yazısı:
+ </text>
+ <check_box initial_value="true" label="Konumu dahil et" name="add_location_cb"/>
<button label="İptal" name="cancel_btn"/>
<button label="Yayınla" name="post_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_status_bar.xml b/indra/newview/skins/default/xui/tr/panel_status_bar.xml
index 178cbda4a2..9e2669ec2b 100755
--- a/indra/newview/skins/default/xui/tr/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/tr/panel_status_bar.xml
@@ -1,28 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <panel.string name="packet_loss_tooltip">
- Paket Kaybı
- </panel.string>
- <panel.string name="bandwidth_tooltip">
- Bant genişliği
- </panel.string>
- <panel.string name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string name="timeTooltip">
- [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
- </panel.string>
- <panel.string name="buycurrencylabel">
- L$ [AMT]
- </panel.string>
+ <panel.string name="packet_loss_tooltip">Paket Kaybı</panel.string>
+ <panel.string name="bandwidth_tooltip">Bant genişliği</panel.string>
+ <panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>
+ <panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>
+ <panel.string name="buycurrencylabel">L$ [AMT]</panel.string>
<panel left="-425" name="balance_bg" width="215">
- <text name="balance" tool_tip="L$ bakiyenizi yenilemek için buraya tıklayın" value="L$20"/>
+ <text name="balance" tool_tip="L$ bakiyenizi yenilemek için buraya tıklayın" value="L$??"/>
<button label="L$ Satın Al" name="buyL" tool_tip="Daha fazla L$ satın almak için tıklayın"/>
<button label="Alışveriş yap" name="goShop" tool_tip="Second Life Pazaryeri Aç" width="95"/>
</panel>
- <text name="TimeText" tool_tip="Geçerli zaman (Pasifik)">
- 24:00 AM PST
- </text>
+ <text name="TimeText" tool_tip="Geçerli zaman (Pasifik)">24:00 AM PST</text>
<button name="media_toggle_btn" tool_tip="Tüm Ortam Öğelerini Başlat/Durdur (Müzik, Video, Web sayfaları)"/>
<button name="volume_btn" tool_tip="Küresel Ses Kontrolü"/>
</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_twitter_photo.xml b/indra/newview/skins/default/xui/tr/panel_twitter_photo.xml
index 966e9b906d..511ecb690d 100644
--- a/indra/newview/skins/default/xui/tr/panel_twitter_photo.xml
+++ b/indra/newview/skins/default/xui/tr/panel_twitter_photo.xml
@@ -1,32 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_twitter_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="text_panel">
- <text name="status_label">
- Neler oluyor?
- </text>
- <text name="status_counter_label">
- 140
- </text>
- <check_box initial_value="true" label="SL konumunu dahil et" name="add_location_cb"/>
- <check_box initial_value="true" label="Fotoğraf ekle" name="add_photo_cb"/>
- </layout_panel>
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="Görüntü çözünürlüğü">
- <combo_box.item label="Mevcut Pencere" 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>
- <combo_box name="filters_combobox" tool_tip="Görüntü filtreleri">
- <combo_box.item label="Filtre Yok" name="NoFilter"/>
- </combo_box>
- <button label="Yenile" name="new_snapshot_btn" tool_tip="Yenilemek için tıklayın"/>
- <button label="Önizleme" name="big_preview_btn" tool_tip="Önizleme ayarları arasında geçiş yapmak için tıklayın"/>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="Tweet" name="post_photo_btn"/>
- <button label="İptal" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <text name="status_label">
+ Neler oluyor?
+ </text>
+ <text name="status_counter_label">
+ 140
+ </text>
+ <check_box initial_value="true" label="SL konumunu dahil et" name="add_location_cb"/>
+ <check_box initial_value="true" label="Fotoğraf ekle" name="add_photo_cb"/>
+ <combo_box name="resolution_combobox" tool_tip="Görüntü çözünürlüğü">
+ <combo_box.item label="Mevcut Pencere" 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>
+ <combo_box name="filters_combobox" tool_tip="Görüntü filtreleri">
+ <combo_box.item label="Filtre Yok" name="NoFilter"/>
+ </combo_box>
+ <button label="Yenile" name="new_snapshot_btn" tool_tip="Yenilemek için tıklayın"/>
+ <button label="Önizleme" name="big_preview_btn" tool_tip="Önizleme ayarları arasında geçiş yapmak için tıklayın"/>
+ <button label="Tweet" name="post_photo_btn"/>
+ <button label="İptal" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/tr/role_actions.xml b/indra/newview/skins/default/xui/tr/role_actions.xml
index 8f063122dc..a7e381d6a0 100755
--- a/indra/newview/skins/default/xui/tr/role_actions.xml
+++ b/indra/newview/skins/default/xui/tr/role_actions.xml
@@ -71,4 +71,8 @@
<action description="Grup Sesli Sohbetine Katıl" longdescription="Bu Yeteneğe sahip bir Roldeki Üyeler grup sesli sohbet oturumlarına katılabilir. NOT: Sesli sohbet oturumuna erişim için Grup Sohbetine Katıl yeteneği gereklidir." name="join voice chat" value="27"/>
<action description="Grup Sohbetini Yönet" longdescription="Bu Yeteneğe sahip bir Roldeki Üyeler grup sesli ve yazılı sohbet oturumlarına errişimi ve katılımı kontrol edebilir." name="moderate group chat" value="37"/>
</action_set>
+ <action_set description="Bu Yetenekler&apos;e, grubun sahip olduğu deneyimleri değiştirme gücü de dahildir." name="experience_tools_experience">
+ <action description="Deneyim Yöneticisi" longdescription="Bu yeteneğe sahip bir roldeki üyeler bir deneyimin meta verilerini düzenleyebilirler." name="experience admin" value="49"/>
+ <action description="Deneyim Yardımcısı" longdescription="Bu yeteneğe sahip bir roldeki üyeler bir deneyimin komut dizilerine katkıda bulunabilirler." name="experience contributor" value="50"/>
+ </action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml b/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml
index 86b684c497..92d57deb12 100755
--- a/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="item properties" title="Öğe Profili">
+ <panel.string name="loading_experience">
+ (yükleniyor)
+ </panel.string>
<panel.string name="unknown">
(bilinmiyor)
</panel.string>
@@ -43,6 +46,9 @@
<text name="LabelAcquiredTitle">
Alınan:
</text>
+ <text name="LabelItemExperienceTitle">
+ Deneyim:
+ </text>
<panel name="perms_inv">
<text name="perm_modify">
Şunu yapabilirsiniz:
@@ -66,8 +72,9 @@
<check_box label="Aktar" name="CheckNextOwnerTransfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/>
</panel>
<check_box label="Satılık" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
+ <combo_box name="ComboBoxSaleType">
<combo_box.item label="Kopyala" name="Copy"/>
+ <combo_box.item label="İçerik" name="Contents"/>
<combo_box.item label="Orijinal" name="Original"/>
</combo_box>
<spinner label="Fiyat: L$" name="Edit Cost"/>
diff --git a/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml
index 9a4cf54fa7..ddb4bbf160 100755
--- a/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml
@@ -1,71 +1,31 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="object properties" title="Nesne Profili">
- <panel.string name="text deed continued">
- Devret
- </panel.string>
- <panel.string name="text deed">
- Devret
- </panel.string>
- <panel.string name="text modify info 1">
- Bu nesneyi değiştirebilirsiniz
- </panel.string>
- <panel.string name="text modify info 2">
- Bu nesneleri değiştirebilirsiniz
- </panel.string>
- <panel.string name="text modify info 3">
- Bu nesneyi değiştiremezsiniz
- </panel.string>
- <panel.string name="text modify info 4">
- Bu nesneleri değiştiremezsiniz
- </panel.string>
- <panel.string name="text modify info 5">
- Bir bölge sınırı üzerinden bu nesneyi değiştiremezsiniz
- </panel.string>
- <panel.string name="text modify info 6">
- Bir bölge sınırı üzerinden bu nesneleri değiştiremezsiniz
- </panel.string>
- <panel.string name="text modify warning">
- Bu nesne bağlantılı parçalara sahip
- </panel.string>
- <panel.string name="Cost Default">
- Fiyat: L$
- </panel.string>
- <panel.string name="Cost Total">
- Toplam Fiyat: L$
- </panel.string>
- <panel.string name="Cost Per Unit">
- Birim Fiyatı: L$
- </panel.string>
- <panel.string name="Cost Mixed">
- Karma Fiyat
- </panel.string>
- <panel.string name="Sale Mixed">
- Karma Satış
- </panel.string>
+ <panel.string name="text deed continued">Devret</panel.string>
+ <panel.string name="text deed">Devret</panel.string>
+ <panel.string name="text modify info 1">Bu nesneyi değiştirebilirsiniz</panel.string>
+ <panel.string name="text modify info 2">Bu nesneleri değiştirebilirsiniz</panel.string>
+ <panel.string name="text modify info 3">Bu nesneyi değiştiremezsiniz</panel.string>
+ <panel.string name="text modify info 4">Bu nesneleri değiştiremezsiniz</panel.string>
+ <panel.string name="text modify info 5">Bir bölge sınırı üzerinden bu nesneyi değiştiremezsiniz</panel.string>
+ <panel.string name="text modify info 6">Bir bölge sınırı üzerinden bu nesneleri değiştiremezsiniz</panel.string>
+ <panel.string name="text modify warning">Bu nesne bağlantılı parçalara sahip</panel.string>
+ <panel.string name="Cost Default">Fiyat: L$</panel.string>
+ <panel.string name="Cost Total">Toplam Fiyat: L$</panel.string>
+ <panel.string name="Cost Per Unit">Birim Fiyatı: L$</panel.string>
+ <panel.string name="Cost Mixed">Karma Fiyat</panel.string>
+ <panel.string name="Sale Mixed">Karma Satış</panel.string>
<text name="title" value="Nesne Profili"/>
<text name="where" value="(SL Dünyası)"/>
<panel label="" name="properties_panel">
- <text name="Name:">
- Ad:
- </text>
- <text name="Description:">
- Açıklama:
- </text>
- <text name="CreatorNameLabel">
- Oluşturan:
- </text>
- <text name="Owner:">
- Sahip:
- </text>
- <text name="Group_label">
- Grup:
- </text>
+ <text name="Name:">Ad:</text>
+ <text name="Description:">Açıklama:</text>
+ <text name="CreatorNameLabel">Oluşturan:</text>
+ <text name="Owner:">Sahip:</text>
+ <text name="Group_label">Grup:</text>
<button name="button set group" tool_tip="Bu nesnenin izinlerini paylaşmak için bir grup seçin"/>
<name_box initial_value="Yükleniyor..." name="Group Name Proxy"/>
<button label="Devret" label_selected="Devret" name="button deed" tool_tip="Bu nesne devredilerek verildiğinde, nesnenin sonraki sahibi için izinler geçerli olur. Grup içerisinde paylaşılan nesneler bir grup yetkilisi tarafından devredilebilir."/>
- <text name="label click action">
- Şu eylem için tıklayın:
- </text>
+ <text name="label click action">Şu eylem için tıklayın:</text>
<combo_box name="clickaction">
<combo_box.item label="Dokun (varsayılan)" name="Touch/grab(default)"/>
<combo_box.item label="Nesnenin üzerine otur" name="Sitonobject"/>
@@ -75,21 +35,13 @@
<combo_box.item label="Yakınlaştır" name="Zoom"/>
</combo_box>
<panel name="perms_inv">
- <text name="perm_modify">
- Bu nesneyi değiştirebilirsiniz
- </text>
- <text name="Anyone can:">
- Herkes:
- </text>
+ <text name="perm_modify">Bu nesneyi değiştirebilirsiniz</text>
+ <text name="Anyone can:">Herkes:</text>
<check_box label="Kopyala" name="checkbox allow everyone copy"/>
<check_box label="Hareket Et" name="checkbox allow everyone move"/>
- <text name="GroupLabel">
- Grup:
- </text>
+ <text name="GroupLabel">Grup:</text>
<check_box label="Paylaş" name="checkbox share with group" tool_tip="Ayarlanan grubun tüm üyelerinin, bu nesne için değiştirme izinlerinizi paylaşmasına izin verir. Rol kısıtlamalarını etkinleştirmek için Devretme yapmalısınız."/>
- <text name="NextOwnerLabel">
- Sonraki sahip:
- </text>
+ <text name="NextOwnerLabel">Sonraki sahip:</text>
<check_box label="Değiştir" name="checkbox next owner can modify"/>
<check_box label="Kopyala" name="checkbox next owner can copy"/>
<check_box label="Aktar" name="checkbox next owner can transfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/>
@@ -102,27 +54,13 @@
</combo_box>
<spinner label="Fiyat: L$" name="Edit Cost"/>
<check_box label="Aramada göster" name="search_check" tool_tip="Kişiler arama sonuçlarında bu nesneyi görebilsin"/>
- <text name="pathfinding_attributes_label">
- Yol bulma özellikleri:
- </text>
- <text name="B:">
- B:
- </text>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
+ <text name="pathfinding_attributes_label">Yol bulma özellikleri:</text>
+ <text name="B:">B:</text>
+ <text name="O:">O:</text>
+ <text name="G:">G:</text>
+ <text name="E:">E:</text>
+ <text name="N:">N:</text>
+ <text name="F:">F:</text>
</panel>
<panel name="button_panel">
<button label="Aç" name="open_btn"/>
diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
index c4fc76fe29..80fe2b3986 100755
--- a/indra/newview/skins/default/xui/tr/strings.xml
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -449,30 +449,51 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
<string name="TooltipMustSingleDrop">
Buraya sadece bir öğe sürüklenebilir.
</string>
+ <string name="TooltipTooManyWearables">
+ [AMOUNT] öğeden fazlasını içeren bir klasörü kullanamazsınız. Bu limiti Gelişmiş &gt; Hata Ayıklama Ayarlarını Göster &gt; KullanılabilirKlasörLimiti öğesinden değiştirebilirsiniz.
+ </string>
<string name="TooltipPrice" value="L$[AMOUNT]:"/>
<string name="TooltipOutboxDragToWorld">
- Satıcı giden kutunuzda öğeler oluşturamazsınız
+ Pazaryeri İlanları klasöründen öğe oluşturamazsınız
+ </string>
+ <string name="TooltipOutboxWorn">
+ Üzerinizde bulunan öğeleri Pazaryeri İlanları klasörüne koyamazsınız
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ İç içe geçmiş klasörlerin derinliği [AMOUNT] değerini geçiyor. İç içe geçmiş klasörlerin derinliğini azaltın; gerekirse öğeleri kutu içine alın.
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Alt klasör sayısı [AMOUNT] değerini geçiyor. İlanınızdaki klasör sayısını azaltın; gerekirse öğeleri kutu içine alın.
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Öğe sayısı [AMOUNT] değerini geçiyor. Bir ilanda [AMOUNT] öğeden fazlasını satmak için bazılarını kutu içine almalısınız.
+ </string>
+ <string name="TooltipOutboxTooManyStockItems">
+ Stok öğelerinin sayısı [AMOUNT] değerini geçiyor.
+ </string>
+ <string name="TooltipOutboxCannotDropOnRoot">
+ Öğeleri veya klasörleri sadece TÜMÜ sekmesine bırakabilirsiniz. Lütfen bu sekmeyi seçin ve öğelerinizi ya da klasörlerinizi yeniden taşıyın.
</string>
<string name="TooltipOutboxNoTransfer">
- Bu nesnelerden bir veya daha fazlası satılamaz veya aktarılamaz.
+ 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
+ Pazaryerine sadece envanterinizdeki öğelerden koyabilirsiniz
</string>
- <string name="TooltipOutboxWorn">
- Giymekte olduğunuz öğeleri Satıcı giden kutunuza koyamazsınız.
+ <string name="TooltipOutboxLinked">
+ Bağlı öğeleri veya klasörleri Pazaryerine koyamazsınız
</string>
<string name="TooltipOutboxCallingCard">
- Satıcı giden kutunuza arama kartları koyamazsınız
+ Arama kartlarını Pazaryerine koyamazsınız
</string>
- <string name="TooltipOutboxFolderLevels">
- İç içe geçmiş klasörlerin derinliği üçü geçiyor
+ <string name="TooltipOutboxDragActive">
+ Listeye alınmış bir ilanı taşıyamazsınız
</string>
- <string name="TooltipOutboxTooManyFolders">
- Üst seviyedeki klasördeki alt klasör sayısı 20&apos;yi geçiyor
+ <string name="TooltipOutboxCannotMoveRoot">
+ Pazaryeri ilanları kök klasörünü taşıyamazsınız
</string>
- <string name="TooltipOutboxTooManyObjects">
- Üst seviyedeki klasördeki öğe sayısı 200&apos;ü geçiyor
+ <string name="TooltipOutboxMixedStock">
+ Bir stok klasöründeki tüm öğelerin tipi ve izni aynı olmalıdır
</string>
<string name="TooltipDragOntoOwnChild">
Bir klasörü alt klasörüne taşıyamazsınız
@@ -1057,9 +1078,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
<string name="AgentNameSubst">
(Siz)
</string>
- <string name="JoinAnExperience">
- Bir tecrübeye katıl
- </string>
+ <string name="JoinAnExperience"/><!-- intentionally blank -->
<string name="SilentlyManageEstateAccess">
Gayri menkul erişim listelerini yönetirken uyarıları bastır
</string>
@@ -1126,6 +1145,12 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
<string name="bitmap_image_files">
Bitmap Görüntüler
</string>
+ <string name="png_image_files">
+ PNG Görüntüleri
+ </string>
+ <string name="save_texture_image_files">
+ Targa veya PNG Görüntüleri
+ </string>
<string name="avi_movie_file">
AVI Film Dosyası
</string>
@@ -1375,6 +1400,9 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
<string name="FavoritesNoMatchingItems">
Bir yer imini favorilerinize eklemek için buraya sürükleyin.
</string>
+ <string name="MarketplaceNoMatchingItems">
+ Öğe bulunamadı. Arama dizenizin yazımını kontrol edin ve yeniden deneyin.
+ </string>
<string name="InventoryNoTexture">
Envanterinizde bu dokunun kopyası yok
</string>
@@ -1422,29 +1450,95 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
<string name="InventoryOutboxError">
[[MARKETPLACE_CREATE_STORE_URL] Mağazası] hata döndürüyor.
</string>
+ <string name="InventoryMarketplaceError">
+ Bu özellik şu anda Beta aşamasında. Katılmak istiyorsanız lütfen adınızı bu [http://goo.gl/forms/FCQ7UXkakz Google formuna] ekleyin.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItemsTitle">
+ Pazaryeri İlanları klasörünüz boş.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItems">
+ Klasörleri [[MARKETPLACE_DASHBOARD_URL] Pazaryerinde] satılık olarak listelemek için bu alana sürükleyin.
+ </string>
+ <string name="Marketplace Validation Warning Stock">
+ stok klasörü bir sürüm klasöründe bulunmalıdır
+ </string>
+ <string name="Marketplace Validation Error Mixed Stock">
+ : Hata: Bir stok klasöründeki tüm öğeler aynı tipte ve kopyalanamaz olmalıdır
+ </string>
+ <string name="Marketplace Validation Error Subfolder In Stock">
+ : Hata: stok klasörü alt klasörler içeremez
+ </string>
+ <string name="Marketplace Validation Warning Empty">
+ : Uyarı: Klasör hiçbir öğe içermiyor
+ </string>
+ <string name="Marketplace Validation Warning Create Stock">
+ : Uyarı: stok klasörü oluşturuluyor
+ </string>
+ <string name="Marketplace Validation Warning Create Version">
+ : Uyarı: sürüm klasörü oluşturuluyor
+ </string>
+ <string name="Marketplace Validation Warning Move">
+ : Uyarı: Öğeler taşınıyor
+ </string>
+ <string name="Marketplace Validation Warning Delete">
+ : Uyarı: klasör içeriği stok klasörüne aktarıldı, boş klasör kaldırılıyor
+ </string>
+ <string name="Marketplace Validation Error Stock Item">
+ : Hata: Kopyalanamaz öğeler stok klasöründe saklanmalıdır
+ </string>
+ <string name="Marketplace Validation Warning Unwrapped Item">
+ : Uyarı: Öğeler bir sürüm klasöründe bulunmalıdır
+ </string>
+ <string name="Marketplace Validation Error">
+ : Hata:
+ </string>
+ <string name="Marketplace Validation Warning">
+ : Uyarı:
+ </string>
+ <string name="Marketplace Validation Error Empty Version">
+ : Uyarı: sürüm klasörü en az 1 öğe içermelidir
+ </string>
+ <string name="Marketplace Validation Error Empty Stock">
+ : Uyarı: Stok klasörü en az 1 öğe içermelidir
+ </string>
+ <string name="Marketplace Validation No Error">
+ Raporlanacak hiçbir hata ya da uyarı yok
+ </string>
<string name="Marketplace Error None">
Hata yok
</string>
+ <string name="Marketplace Error Prefix">
+ Hata:
+ </string>
<string name="Marketplace Error Not Merchant">
- Hata: Öğeleri Pazaryerine göndermeden önce kendinizi bir satıcı olarak belirlemelisiniz (ücretsizdir).
+ Öğeleri Pazaryerine göndermeden önce kendinizi bir satıcı olarak belirtmeniz gerekir (ücretsizdir).
</string>
- <string name="Marketplace Error Empty Folder">
- Hata: Bu klasörün içeriği boş.
+ <string name="Marketplace Error Not Accepted">
+ Öğe bu klasöre taşınamıyor.
</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 name="Marketplace Error Unsellable Item">
+ Bu öğe Pazaryerinde satılamaz.
</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 name="MarketplaceNoID">
+ no Mkt ID
</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 name="MarketplaceLive">
+ listelenmiş
</string>
- <string name="Marketplace Error Unsellable Item">
- Hata: Bu öğe Pazaryerinde satılamaz.
+ <string name="MarketplaceActive">
+ etkin
</string>
- <string name="Marketplace Error Internal Import">
- Hata: Bu öğede bir sorun var. Daha sonra tekrar deneyin.
+ <string name="MarketplaceMax">
+ maks.
+ </string>
+ <string name="MarketplaceStock">
+ stok
+ </string>
+ <string name="MarketplaceNoStock">
+ stokta kalmadı
+ </string>
+ <string name="MarketplaceUpdating">
+ güncelleniyor...
</string>
<string name="Open landmarks">
Açık yer imleri
@@ -1465,6 +1559,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
İçerik yok
</string>
<string name="WornOnAttachmentPoint" value="([ATTACHMENT_POINT] üzerinde giyilmiş)"/>
+ <string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/>
<string name="ActiveGesture" value="[GESLABEL] (etkin)"/>
<string name="PermYes">
Evet
@@ -1735,6 +1830,15 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
<string name="Invalid Attachment">
Geçersiz Aksesuar Noktası
</string>
+ <string name="ATTACHMENT_MISSING_ITEM">
+ Hata: eksik öğe
+ </string>
+ <string name="ATTACHMENT_MISSING_BASE_ITEM">
+ Hata: Eksik temel öğe
+ </string>
+ <string name="ATTACHMENT_NOT_ATTACHED">
+ Hata: Nesne mevcut dış görünüme dahil ama eklenmemiş
+ </string>
<string name="YearsMonthsOld">
[AGEYEARS] [AGEMONTHS]&apos;lık
</string>
@@ -1903,6 +2007,9 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
<string name="SaveComplete">
Kaydetme tamamlandı.
</string>
+ <string name="UploadFailed">
+ Dosya karşıya yüklenemedi:
+ </string>
<string name="ObjectOutOfRange">
Komut dosyası (nesne kapsam dışı)
</string>
@@ -1912,6 +2019,9 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
<string name="GroupsNone">
hiçbiri
</string>
+ <string name="CompileNoExperiencePerm">
+ [SCRIPT] komut dizisi [EXPERIENCE] deneyimiyle atlanıyor.
+ </string>
<string name="Group" value="(grup)"/>
<string name="Unknown">
(Bilinmiyor)
@@ -5073,6 +5183,9 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin.
<string name="Command_Marketplace_Label">
Pazaryeri
</string>
+ <string name="Command_MarketplaceListings_Label">
+ Pazaryeri
+ </string>
<string name="Command_MiniMap_Label">
Mini-harita
</string>
@@ -5160,6 +5273,9 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin.
<string name="Command_Marketplace_Tooltip">
Alışveriş yap
</string>
+ <string name="Command_MarketplaceListings_Tooltip">
+ Oluşturduğunuz öğeleri satın
+ </string>
<string name="Command_MiniMap_Tooltip">
Yakındaki kişileri göster
</string>
@@ -5283,4 +5399,85 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin.
<string name="loading_chat_logs">
Yükleniyor...
</string>
+ <string name="experience_tools_experience">
+ Deneyim
+ </string>
+ <string name="ExperienceNameNull">
+ (deneyim yok)
+ </string>
+ <string name="ExperienceNameUntitled">
+ (başlıksız deneyim)
+ </string>
+ <string name="Land-Scope">
+ Arazi Kapsamında
+ </string>
+ <string name="Grid-Scope">
+ Ağ Kapsamında
+ </string>
+ <string name="Allowed_Experiences_Tab">
+ İZİN VERİLEN
+ </string>
+ <string name="Blocked_Experiences_Tab">
+ ENGELLENMİŞ
+ </string>
+ <string name="Contrib_Experiences_Tab">
+ KATKIDA BULUNAN
+ </string>
+ <string name="Admin_Experiences_Tab">
+ YÖNETİCİ
+ </string>
+ <string name="Recent_Experiences_Tab">
+ SON
+ </string>
+ <string name="Owned_Experiences_Tab">
+ SAHİBİ
+ </string>
+ <string name="ExperiencesCounter">
+ ([EXPERIENCES], maks. [MAXEXPERIENCES])
+ </string>
+ <string name="ExperiencePermission1">
+ kontrollerinizi ele alma
+ </string>
+ <string name="ExperiencePermission3">
+ avatarınızdaki animasyonları tetikleme
+ </string>
+ <string name="ExperiencePermission4">
+ avatarınıza ekleme
+ </string>
+ <string name="ExperiencePermission9">
+ kameranızı takip etmek
+ </string>
+ <string name="ExperiencePermission10">
+ kameranızı kontrol etme
+ </string>
+ <string name="ExperiencePermission11">
+ sizi ışınlama
+ </string>
+ <string name="ExperiencePermission12">
+ deneyim izinlerini otomatik olarak kabul et
+ </string>
+ <string name="ExperiencePermissionShortUnknown">
+ bilinmeyen bir işlem gerçekleştirdi: [Permission]
+ </string>
+ <string name="ExperiencePermissionShort1">
+ Kontrolü Al
+ </string>
+ <string name="ExperiencePermissionShort3">
+ Animasyonları Tetikle
+ </string>
+ <string name="ExperiencePermissionShort4">
+ Ekle
+ </string>
+ <string name="ExperiencePermissionShort9">
+ Kamera Takibi
+ </string>
+ <string name="ExperiencePermissionShort10">
+ Kamera Kontrolü
+ </string>
+ <string name="ExperiencePermissionShort11">
+ Işınla
+ </string>
+ <string name="ExperiencePermissionShort12">
+ İzin
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/tr/teleport_strings.xml b/indra/newview/skins/default/xui/tr/teleport_strings.xml
index 20d09b1ee2..e3a08e04b2 100755
--- a/indra/newview/skins/default/xui/tr/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/tr/teleport_strings.xml
@@ -48,6 +48,9 @@ Bir dakika sonra tekrar deneyin.
<message name="MustGetAgeRegion">
Bu bölgeye girebilmek için 18 veya üzeri bir yaşta olmanız gerekir.
</message>
+ <message name="RegionTPSpecialUsageBlocked">
+ Bölgeye girilemiyor. &quot;[REGION_NAME]&quot; bir Yetenek Oyunu Bölgesi. Buraya girebilmek için bazı ölçütleri karşılamanız gerekiyor. Ayrıntılar için lütfen [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ] adresini ziyaret edin.
+ </message>
</message_set>
<message_set name="progress">
<message name="sending_dest">
diff --git a/indra/newview/skins/default/xui/zh/floater_about.xml b/indra/newview/skins/default/xui/zh/floater_about.xml
index 2dfb35fa54..250cbe67e0 100755
--- a/indra/newview/skins/default/xui/zh/floater_about.xml
+++ b/indra/newview/skins/default/xui/zh/floater_about.xml
@@ -1,71 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="關於 [CAPITALIZED_APP_NAME]">
- <floater.string name="AboutHeader">
- [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
-[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
- </floater.string>
- <floater.string name="AboutCompiler">
- 以 [COMPILER_VERSION] 版本 [COMPILER] 建置
- </floater.string>
- <floater.string name="AboutPosition">
- 你的方位是 [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1],地區名:[REGION],主機:&lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
-第二人生 URL:&lt;nolink&gt;[SLURL]&lt;/nolink&gt;
-(全域坐標:[POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
-[SERVER_VERSION]
-[SERVER_RELEASE_NOTES_URL]
- </floater.string>
- <floater.string name="AboutSystem">
- CPU:[CPU]
-記憶體:[MEMORY_MB] MB
-作業系統版本:[OS_VERSION]
-顯示卡供應商:[GRAPHICS_CARD_VENDOR]
-顯示卡:[GRAPHICS_CARD]
- </floater.string>
- <floater.string name="AboutDriver">
- Windows 顯示驅動程式版本:[GRAPHICS_DRIVER_VERSION]
- </floater.string>
- <floater.string name="AboutLibs">
- OpenGL 版本:[OPENGL_VERSION]
-
-libcurl 版本: [LIBCURL_VERSION]
-J2C 解碼器版本: [J2C_VERSION]
-音效驅動程式版本: [AUDIO_DRIVER_VERSION]
-Qt Webkit 版本: [QT_WEBKIT_VERSION]
-語音伺服器版本: [VOICE_VERSION]
- </floater.string>
- <floater.string name="none">
- (無)
- </floater.string>
- <floater.string name="AboutTraffic">
- 封包損失:[PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
- </floater.string>
- <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 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>
+ <text name="linden_intro">Second Life 由以下的 Linden 家族帶給你:
+這些人士做了開放源碼的貢獻:</text>
+ <text_editor name="contrib_names">執行時期被取代的假名稱</text_editor>
</panel>
<panel label="許可" name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
+ <text_editor name="licenses_editor">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)
@@ -92,8 +37,7 @@ Qt Webkit 版本: [QT_WEBKIT_VERSION]
保留一切權利。 詳情見 licenses.txt。
- 語音聊天音頻技術:Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
+ 語音聊天音頻技術:Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)</text_editor>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_about_land.xml b/indra/newview/skins/default/xui/zh/floater_about_land.xml
index 76db621951..a9d95e5b9b 100755
--- a/indra/newview/skins/default/xui/zh/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/zh/floater_about_land.xml
@@ -331,22 +331,6 @@
<check_box label="安全(無傷害)" name="check safe" tool_tip="若勾選,將把土地設為安全,禁絕傷害性的戰鬥。 若未勾選,則允許傷害性的戰鬥。"/>
<check_box label="禁止推撞" name="PushRestrictCheck" tool_tip="禁止使用腳本推撞。 勾選這選項可有效防止你土地上出現滋事行為。"/>
<check_box label="將地點刊登顯示在搜尋中(L$30 / 每週)" name="ShowDirectoryCheck" tool_tip="讓其他人可以在搜尋結果中看到這塊地段"/>
- <combo_box name="land category with adult">
- <combo_box.item label="任何類別" name="item0"/>
- <combo_box.item label="林登位置" name="item1"/>
- <combo_box.item label="完全成人" name="item2"/>
- <combo_box.item label="藝術與文化" name="item3"/>
- <combo_box.item label="商業" name="item4"/>
- <combo_box.item label="教育" name="item5"/>
- <combo_box.item label="遊戲" name="item6"/>
- <combo_box.item label="聚會所" name="item7"/>
- <combo_box.item label="歡迎新手光臨" name="item8"/>
- <combo_box.item label="公園與自然景觀" name="item9"/>
- <combo_box.item label="住宅" name="item10"/>
- <combo_box.item label="購物" name="item11"/>
- <combo_box.item label="出租" name="item13"/>
- <combo_box.item label="其他" name="item12"/>
- </combo_box>
<combo_box name="land category">
<combo_box.item label="任何類別" name="item0"/>
<combo_box.item label="林登位置" name="item1"/>
@@ -477,5 +461,6 @@
<button label="移除" label_selected="移除" name="remove_banned"/>
</panel>
</panel>
+ <panel label="體驗" name="land_experiences_panel"/>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_associate_listing.xml b/indra/newview/skins/default/xui/zh/floater_associate_listing.xml
new file mode 100644
index 0000000000..ab0a84dd18
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_associate_listing.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="associate listing" title="聯結刊登">
+ <text name="message">刊登 ID:</text>
+ <line_editor name="listing_id">在此鍵入 ID</line_editor>
+ <button label="確定" name="OK"/>
+ <button label="取消" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_edit_hover_height.xml b/indra/newview/skins/default/xui/zh/floater_edit_hover_height.xml
new file mode 100644
index 0000000000..d7c4728183
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_edit_hover_height.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="HoverHeight" title="設定懸浮高度">
+ <slider label="高度" name="HoverHeightSlider"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_experience_search.xml b/indra/newview/skins/default/xui/zh/floater_experience_search.xml
new file mode 100644
index 0000000000..c65b64c98f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_experience_search.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="experiencepicker" title="選擇體驗"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_experienceprofile.xml b/indra/newview/skins/default/xui/zh/floater_experienceprofile.xml
new file mode 100644
index 0000000000..4d2b3331d7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_experienceprofile.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater title="EXPERIENCE PROFILE">
+ <floater.string name="empty_slurl">
+ (無)
+ </floater.string>
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Light&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Light&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Light&quot;
+ </floater.string>
+ <text name="edit_title" value="體驗簡覽"/>
+ <tab_container name="tab_container">
+ <panel name="panel_experience_info">
+ <scroll_container name="xp_scroll">
+ <panel name="scrolling_panel">
+ <layout_stack>
+ <layout_panel name="top panel">
+ <button label="編輯" name="edit_btn"/>
+ </layout_panel>
+ <layout_panel name="maturity panel">
+ <text name="ContentRating">
+ 分級:
+ </text>
+ </layout_panel>
+ <layout_panel name="location panel">
+ <text name="Location">
+ 位置:
+ </text>
+ </layout_panel>
+ <layout_panel>
+ <text name="Owner">
+ 所有人:
+ </text>
+ </layout_panel>
+ <layout_panel name="group_panel">
+ <text name="Group">
+ 群組:
+ </text>
+ </layout_panel>
+ <layout_panel name="perm panel">
+ <button label="允許" name="allow_btn"/>
+ <button label="忘記" name="forget_btn"/>
+ <button label="封鎖" name="block_btn"/>
+ <text name="privileged">
+ 所有居民均可使用這個體驗。
+ </text>
+ <button label="違規舉報" name="report_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ </panel>
+ <panel name="edit_panel_experience_info">
+ <scroll_container name="edit_xp_scroll">
+ <panel name="edit_scrolling_panel">
+ <text name="edit_experience_title_label" value="名稱:"/>
+ <text name="edit_experience_desc_label" value="描述:"/>
+ <button label="群組" name="Group_btn"/>
+ <text name="edit_ContentRating">
+ 分級:
+ </text>
+ <icons_combo_box label="適度成人" name="edit_ContentRatingText" tool_tip="提升體驗的內容分級將會重設所有已允許該體驗的居民的權限。">
+ <icons_combo_box.item label="完全成人" name="Adult" value="42"/>
+ <icons_combo_box.item label="適度成人" name="Mature" value="21"/>
+ <icons_combo_box.item label="一般" name="PG" value="13"/>
+ </icons_combo_box>
+ <text name="edit_Location">
+ 位置:
+ </text>
+ <button label="設定為目前位置" name="location_btn"/>
+ <button label="清空位置" name="clear_btn"/>
+ <check_box label="啟用體驗" name="edit_enable_btn" tool_tip=""/>
+ <check_box label="不顯現在搜尋結果" name="edit_private_btn"/>
+ <text name="changes" value="體驗的變更結果可能需要數分鐘才會擴及所有地區。"/>
+ <button label="返回" name="cancel_btn"/>
+ <button label="儲存" name="save_btn"/>
+ </panel>
+ </scroll_container>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_experiences.xml b/indra/newview/skins/default/xui/zh/floater_experiences.xml
new file mode 100644
index 0000000000..995241797e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_experiences.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_experiences" title="體驗"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_facebook.xml b/indra/newview/skins/default/xui/zh/floater_facebook.xml
index 9847db9124..9a71a26333 100644
--- a/indra/newview/skins/default/xui/zh/floater_facebook.xml
+++ b/indra/newview/skins/default/xui/zh/floater_facebook.xml
@@ -1,20 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_facebook" title="發佈到臉書">
- <panel name="background">
- <tab_container name="tabs">
- <panel label="狀態" name="panel_facebook_status"/>
- <panel label="相片" name="panel_facebook_photo"/>
- <panel label="打卡" name="panel_facebook_place"/>
- <panel label="朋友" name="panel_facebook_friends"/>
- <panel label="帳號" name="panel_facebook_account"/>
- </tab_container>
- <panel name="connection_status_panel">
- <text name="connection_error_text">
- 錯誤
- </text>
- <text name="connection_loading_text">
- 載入中…
- </text>
- </panel>
- </panel>
+ <tab_container name="tabs">
+ <panel label="狀態" name="panel_facebook_status"/>
+ <panel label="相片" name="panel_facebook_photo"/>
+ <panel label="打卡" name="panel_facebook_place"/>
+ <panel label="朋友" name="panel_facebook_friends"/>
+ </tab_container>
+ <text name="connection_error_text">
+ 錯誤
+ </text>
+ <text name="connection_loading_text">
+ 載入中…
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/zh/floater_inventory_item_properties.xml
index 6998df75f3..4f17b96579 100755
--- a/indra/newview/skins/default/xui/zh/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/zh/floater_inventory_item_properties.xml
@@ -1,67 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="item properties" title="收納區物品屬性">
- <floater.string name="unknown">
- (未知)
- </floater.string>
- <floater.string name="public">
- (公開)
- </floater.string>
- <floater.string name="you_can">
- 你可以:
- </floater.string>
- <floater.string name="owner_can">
- 所有人可以:
- </floater.string>
- <floater.string name="acquiredDate">
- [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
- </floater.string>
- <text name="LabelItemNameTitle">
- 名稱:
- </text>
- <text name="LabelItemDescTitle">
- 描述:
- </text>
- <text name="LabelCreatorTitle">
- 創造者:
- </text>
+ <floater.string name="unknown">(未知)</floater.string>
+ <floater.string name="public">(公開)</floater.string>
+ <floater.string name="you_can">你可以:</floater.string>
+ <floater.string name="owner_can">所有人可以:</floater.string>
+ <floater.string name="acquiredDate">[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]</floater.string>
+ <text name="LabelItemNameTitle">名稱:</text>
+ <text name="LabelItemDescTitle">描述:</text>
+ <text name="LabelCreatorTitle">創造者:</text>
<button label="檔案..." name="BtnCreator"/>
- <text name="LabelOwnerTitle">
- 所有人:
- </text>
+ <text name="LabelOwnerTitle">所有人:</text>
<button label="檔案..." name="BtnOwner"/>
- <text name="LabelAcquiredTitle">
- 取得於:
- </text>
- <text name="LabelAcquiredDate">
- Wed May 24 12:50:46 2006
- </text>
- <text name="OwnerLabel">
- 你:
- </text>
+ <text name="LabelAcquiredTitle">取得於:</text>
+ <text name="LabelAcquiredDate">Wed May 24 12:50:46 2006</text>
+ <text name="OwnerLabel">你:</text>
<check_box label="編輯" name="CheckOwnerModify"/>
<check_box label="恚庨" name="CheckOwnerCopy"/>
<check_box label="轉售" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">
- 任何人:
- </text>
+ <text name="AnyoneLabel">任何人:</text>
<check_box label="恚庨" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">
- 群組:
- </text>
+ <text name="GroupLabel">群組:</text>
<check_box label="分享" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel">
- 下一個所有人:
- </text>
+ <text name="NextOwnerLabel">下一個所有人:</text>
<check_box label="編輯" name="CheckNextOwnerModify"/>
<check_box label="恚庨" name="CheckNextOwnerCopy"/>
<check_box label="轉售" name="CheckNextOwnerTransfer"/>
<check_box label="出售" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
- <combo_box.item label="恚庨" name="Copy"/>
+ <combo_box name="ComboBoxSaleType">
+ <combo_box.item label="複製" name="Copy"/>
+ <combo_box.item label="內容" name="Contents"/>
<combo_box.item label="原件" name="Original"/>
</combo_box>
<spinner label="價格:" name="Edit Cost"/>
- <text name="CurrencySymbol">
- L$
- </text>
+ <text name="CurrencySymbol">L$</text>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml
index 6d1d18b67c..51dc73d971 100755
--- a/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml
@@ -5,8 +5,8 @@
<check_box label="服裝" name="check_clothing"/>
<check_box label="姿勢" name="check_gesture"/>
<check_box label="地標" name="check_landmark"/>
- <check_box label="網面" name="check_mesh"/>
<check_box label="記事卡" name="check_notecard"/>
+ <check_box label="網面" name="check_mesh"/>
<check_box label="物件" name="check_object"/>
<check_box label="腳本" name="check_script"/>
<check_box label="聲音" name="check_sound"/>
@@ -19,6 +19,10 @@
<text name="- OR -">
- 或 -
</text>
+ <radio_group name="date_search_direction">
+ <radio_item label="新近於" name="newer"/>
+ <radio_item label="早於" name="older"/>
+ </radio_group>
<spinner label="小時前" name="spin_hours_ago"/>
<spinner label="天前" name="spin_days_ago"/>
<button label="關閉" label_selected="關閉" name="Close"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_item_properties.xml b/indra/newview/skins/default/xui/zh/floater_item_properties.xml
new file mode 100644
index 0000000000..35dfae62b3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_item_properties.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Item Properties" title="物品屬性"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_lagmeter.xml b/indra/newview/skins/default/xui/zh/floater_lagmeter.xml
index 6e58e7332f..e9a082288a 100644
--- a/indra/newview/skins/default/xui/zh/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/zh/floater_lagmeter.xml
@@ -7,7 +7,7 @@
360
</floater.string>
<floater.string name="min_title_msg">
- Lag
+ 延遲
</floater.string>
<floater.string name="min_width_px">
90
@@ -22,28 +22,28 @@
15
</floater.string>
<floater.string name="client_frame_time_window_bg_msg">
- Normal, window in background
+ 正常,視窗位於背景
</floater.string>
<floater.string name="client_frame_time_critical_msg">
- Client frame rate below [CLIENT_FRAME_RATE_CRITICAL]
+ 客戶端幀率低於 [CLIENT_FRAME_RATE_CRITICAL]
</floater.string>
<floater.string name="client_frame_time_warning_msg">
- Client frame rate between [CLIENT_FRAME_RATE_CRITICAL] and [CLIENT_FRAME_RATE_WARNING]
+ 客戶端幀率介於 [CLIENT_FRAME_RATE_CRITICAL] 和 [CLIENT_FRAME_RATE_WARNING] 之間
</floater.string>
<floater.string name="client_frame_time_normal_msg">
正常
</floater.string>
<floater.string name="client_draw_distance_cause_msg">
- Possible cause: Draw distance set too high
+ 可能原因:可視距離設得太遠
</floater.string>
<floater.string name="client_texture_loading_cause_msg">
- Possible cause: Images loading
+ 可能原因:正在載入圖像
</floater.string>
<floater.string name="client_texture_memory_cause_msg">
- Possible cause: Too many images in memory
+ 可能原因:記憶體裡圖像太多
</floater.string>
<floater.string name="client_complex_objects_cause_msg">
- Possible cause: Too many complex objects in scene
+ 可能原因:場景內複雜物件太多
</floater.string>
<floater.string name="network_text_msg">
網路
@@ -55,10 +55,10 @@
5
</floater.string>
<floater.string name="network_packet_loss_critical_msg">
- Connection is dropping over [NETWORK_PACKET_LOSS_CRITICAL]% of packets
+ 這次連通丟失了至少 [NETWORK_PACKET_LOSS_CRITICAL]% 的封包
</floater.string>
<floater.string name="network_packet_loss_warning_msg">
- Connection is dropping [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% of packets
+ 這次連通丟失了 [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% 的封包
</floater.string>
<floater.string name="network_performance_normal_msg">
正常
@@ -70,16 +70,16 @@
300
</floater.string>
<floater.string name="network_ping_critical_msg">
- Connection ping time is over [NETWORK_PING_CRITICAL] ms
+ 探測連通回應時間超過 [NETWORK_PING_CRITICAL] 毫秒
</floater.string>
<floater.string name="network_ping_warning_msg">
- Connection ping time is [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
+ 探測連通回應時間為 [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] 毫秒
</floater.string>
<floater.string name="network_packet_loss_cause_msg">
- Possible bad connection or &apos;Bandwidth&apos; pref too high.
+ 可能連通不良,或所設的偏好連通頻寬過高。
</floater.string>
<floater.string name="network_ping_cause_msg">
- Possible bad connection or file-sharing app.
+ 可能連通不良,或使用檔案分享應用程式。
</floater.string>
<floater.string name="server_text_msg">
伺服器
diff --git a/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml
index f4a7ba5cca..e971b166f7 100755
--- a/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml
@@ -9,7 +9,24 @@
<floater.string name="Title">
腳本:[NAME]
</floater.string>
+ <floater.string name="experience_enabled">
+ 清除勾選即可移除目前的體驗
+ </floater.string>
+ <floater.string name="no_experiences">
+ 你未經授權使用任何體驗
+ </floater.string>
+ <floater.string name="add_experiences">
+ 選取新增一個體驗
+ </floater.string>
+ <floater.string name="show_experience_profile">
+ 點按即可簡覽該體驗
+ </floater.string>
+ <floater.string name="loading">
+ 載入中…
+ </floater.string>
<button label="重設" label_selected="重設" name="Reset"/>
<check_box initial_value="true" label="執行中" name="running"/>
<check_box initial_value="true" label="Mono" name="mono"/>
+ <check_box label="使用體驗:" name="enable_xp"/>
+ <button label="&gt;" name="view_profile"/>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_marketplace_listings.xml b/indra/newview/skins/default/xui/zh/floater_marketplace_listings.xml
new file mode 100644
index 0000000000..6da718f230
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_marketplace_listings.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_listings" title="MARKETPLACE 刊登">
+ <panel name="marketplace_listings_panel">
+ <panel>
+ <panel name="marketplace_listings_inventory_placeholder_panel">
+ <text name="marketplace_listings_inventory_placeholder_title">載入中…</text>
+ </panel>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_marketplace_validation.xml b/indra/newview/skins/default/xui/zh/floater_marketplace_validation.xml
new file mode 100644
index 0000000000..ef89de95ad
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_marketplace_validation.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_marketplace_validation" title="查核 Marketplace 刊登清單">
+ <button label="確定" label_selected="確定" name="OK"/>
+ <text_editor name="validation_text">MARKETPLACE_VALIDATION_TEXT</text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_openobject.xml b/indra/newview/skins/default/xui/zh/floater_openobject.xml
index ce6869487a..29140eceb9 100755
--- a/indra/newview/skins/default/xui/zh/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/zh/floater_openobject.xml
@@ -3,6 +3,11 @@
<text name="object_name">
[DESC]:
</text>
- <button label="覆製到收納區" label_selected="覆製到收納區" name="copy_to_inventory_button"/>
- <button label="覆製且穿上" label_selected="覆製且穿上" name="copy_and_wear_button"/>
+ <text name="border_note">
+ 複製到收納區並加以穿戴
+ </text>
+ <button label="新增到裝扮" label_selected="新增到裝扮" name="copy_and_wear_button"/>
+ <button label="取代裝扮" label_selected="取代裝扮" name="copy_and_replace_button"/>
+ <button label="只複製到收納區" label_selected="只複製到收納區" name="copy_to_inventory_button"/>
+ <button label="取消" label_selected="取消" name="cancel_button"/>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_pay.xml b/indra/newview/skins/default/xui/zh/floater_pay.xml
index 69427605a4..026ead9574 100755
--- a/indra/newview/skins/default/xui/zh/floater_pay.xml
+++ b/indra/newview/skins/default/xui/zh/floater_pay.xml
@@ -1,21 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money">
- <string name="payee_group">
- 支付群組
- </string>
- <string name="payee_resident">
- 支付居民
- </string>
- <text name="payee_name">
- 測試一個長度非常非常非常長的名稱,檢查是否被切斷
- </text>
- <button label="L$1" label_selected="L$1" name="fastpay 1"/>
- <button label="L$5" label_selected="L$5" name="fastpay 5"/>
- <button label="L$10" label_selected="L$10" name="fastpay 10"/>
- <button label="L$20" label_selected="L$20" name="fastpay 20"/>
- <text name="amount text">
- 或選擇一個金額:
- </text>
- <button label="支付" label_selected="支付" name="pay btn"/>
- <button label="取消" label_selected="取消" name="cancel btn"/>
+ <string name="payee_group">支付群組</string>
+ <string name="payee_resident">支付居民</string>
+ <text name="paying_text">你正在支付:</text>
+ <text name="payee_name">測試一個長度非常非常非常長的名稱,檢查是否被切斷</text>
+ <panel label="搜尋" name="PatternsPanel">
+ <button label="支付 L$ 1" label_selected="支付 L$ 1" name="fastpay 1"/>
+ <button label="支付 L$ 5" label_selected="支付 L$ 5" name="fastpay 5"/>
+ <button label="支付 L$ 10" label_selected="支付 L$ 10" name="fastpay 10"/>
+ <button label="支付 L$ 20" label_selected="支付 L$ 20" name="fastpay 20"/>
+ </panel>
+ <panel label="搜尋" name="InputPanel">
+ <text name="amount text">其他金額:</text>
+ <button label="支付" label_selected="支付" name="pay btn"/>
+ <button label="取消" label_selected="取消" name="cancel btn"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_pay_object.xml b/indra/newview/skins/default/xui/zh/floater_pay_object.xml
index 7d20b44bc6..c32243a115 100755
--- a/indra/newview/skins/default/xui/zh/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/zh/floater_pay_object.xml
@@ -1,28 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money">
- <string name="payee_group">
- 支付群組
- </string>
- <string name="payee_resident">
- 支付居民
- </string>
- <text name="payee_name">
- Ericacita Moostopolison
- </text>
- <text name="object_name_label">
- 經由物件:
- </text>
+ <string name="payee_group">支付群組</string>
+ <string name="payee_resident">支付居民</string>
+ <text name="paying_text">你正在支付:</text>
+ <text name="payee_name">Ericacita Moostopolison</text>
+ <text name="object_name_label">經由物件:</text>
<icon name="icon_object" tool_tip="物件"/>
- <text name="object_name_text">
- 這是我名稱很長很長很長很長的一個很棒的物件
- </text>
- <button label="L$1" label_selected="L$1" name="fastpay 1"/>
- <button label="L$5" label_selected="L$5" name="fastpay 5"/>
- <button label="L$10" label_selected="L$10" name="fastpay 10"/>
- <button label="L$20" label_selected="L$20" name="fastpay 20"/>
- <text name="amount text">
- 或選擇一個金額:
- </text>
- <button label="支付" label_selected="支付" name="pay btn"/>
- <button label="取消" label_selected="取消" name="cancel btn"/>
+ <text name="object_name_text">這是我名稱很長很長很長很長的一個很棒的物件</text>
+ <panel label="搜尋" name="PatternsPanel">
+ <button label="支付 L$ 1" label_selected="支付 L$ 1" name="fastpay 1"/>
+ <button label="支付 L$ 5" label_selected="支付 L$ 5" name="fastpay 5"/>
+ <button label="支付 L$ 10" label_selected="支付 L$ 10" name="fastpay 10"/>
+ <button label="支付 L$ 20" label_selected="支付 L$ 20" name="fastpay 20"/>
+ </panel>
+ <panel label="搜尋" name="InputPanel">
+ <text name="amount text">其他金額:</text>
+ <button label="支付" label_selected="支付" name="pay btn"/>
+ <button label="取消" label_selected="取消" name="cancel btn"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_report_abuse.xml b/indra/newview/skins/default/xui/zh/floater_report_abuse.xml
index d4b5a2f990..347b40e675 100755
--- a/indra/newview/skins/default/xui/zh/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/zh/floater_report_abuse.xml
@@ -67,7 +67,7 @@
<combo_box.item label="土地 &gt; 侵佔 &gt; 物件或材質" name="Land__Encroachment__Objects_textures"/>
<combo_box.item label="土地 &gt; 侵佔 &gt; 粒子" name="Land__Encroachment__Particles"/>
<combo_box.item label="土地 &gt; 侵佔 &gt; 樹種 / 植物" name="Land__Encroachment__Trees_plants"/>
- <combo_box.item label="下注或賭博" name="Wagering_gambling"/>
+ <combo_box.item label="違反遊戲規則" name="Wagering_gambling"/>
<combo_box.item label="其他" name="Other"/>
</combo_box>
<text name="abuser_name_title">
diff --git a/indra/newview/skins/default/xui/zh/floater_snapshot.xml b/indra/newview/skins/default/xui/zh/floater_snapshot.xml
index a65227bbd4..4090248083 100755
--- a/indra/newview/skins/default/xui/zh/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/zh/floater_snapshot.xml
@@ -39,17 +39,8 @@
<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="new_snapshot_btn"/>
<panel name="advanced_options_panel">
- <text name="advanced_options_label">
- 進階選項
- </text>
<text name="layer_type_label">
擷取快照:
</text>
@@ -68,4 +59,10 @@
<combo_box.item label="不用濾鏡" name="NoFilter"/>
</combo_box>
</panel>
+ <text name="image_res_text">
+ [WIDTH] 像素(寬) x [HEIGHT] 像素(高)
+ </text>
+ <text name="file_size_label">
+ [SIZE] KB
+ </text>
</floater>
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 6f50be0855..58530f00c1 100755
--- a/indra/newview/skins/default/xui/zh/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/zh/floater_top_objects.xml
@@ -21,6 +21,12 @@
<floater.string name="none_descriptor">
查無結果。
</floater.string>
+ <floater.string name="URLs">
+ URL
+ </floater.string>
+ <floater.string name="memory">
+ 記憶體 (KB)
+ </floater.string>
<text name="title_text">
載入中...
</text>
@@ -30,7 +36,7 @@
<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="日期" name="time"/>
<scroll_list.columns label="URL" name="URLs"/>
<scroll_list.columns label="記憶體 (KB)" name="memory"/>
</scroll_list>
diff --git a/indra/newview/skins/default/xui/zh/floater_twitter.xml b/indra/newview/skins/default/xui/zh/floater_twitter.xml
index 0df68ba9be..ac49b2a967 100644
--- a/indra/newview/skins/default/xui/zh/floater_twitter.xml
+++ b/indra/newview/skins/default/xui/zh/floater_twitter.xml
@@ -1,17 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_twitter" title="推特">
- <panel name="background">
- <tab_container name="tabs">
- <panel label="編撰" name="panel_twitter_photo"/>
- <panel label="帳號" name="panel_twitter_account"/>
- </tab_container>
- <panel name="connection_status_panel">
- <text name="connection_error_text">
- 錯誤
- </text>
- <text name="connection_loading_text">
- 載入中…
- </text>
- </panel>
- </panel>
+ <tab_container name="tabs">
+ <panel label="編撰" name="panel_twitter_photo"/>
+ <panel label="帳號" name="panel_twitter_account"/>
+ </tab_container>
+ <text name="connection_error_text">
+ 錯誤
+ </text>
+ <text name="connection_loading_text">
+ 載入中…
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/menu_attachment_self.xml b/indra/newview/skins/default/xui/zh/menu_attachment_self.xml
index eb1bad0ca2..d9e6eff897 100755
--- a/indra/newview/skins/default/xui/zh/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/zh/menu_attachment_self.xml
@@ -8,6 +8,7 @@
<menu_item_call label="我的外觀" name="Change Outfit"/>
<menu_item_call label="編輯我的裝扮" name="Edit Outfit"/>
<menu_item_call label="編輯我的體形" name="Edit My Shape"/>
+ <menu_item_call label="懸浮高度" name="Hover Height"/>
<menu_item_call label="我的朋友" name="Friends..."/>
<menu_item_call label="我的群組" name="Groups..."/>
<menu_item_call label="我的個人檔案" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/zh/menu_avatar_self.xml b/indra/newview/skins/default/xui/zh/menu_avatar_self.xml
index 68d0600141..a644a45df6 100755
--- a/indra/newview/skins/default/xui/zh/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/zh/menu_avatar_self.xml
@@ -25,6 +25,7 @@
<menu_item_call label="我的外觀" name="Chenge Outfit"/>
<menu_item_call label="編輯我的裝扮" name="Edit Outfit"/>
<menu_item_call label="編輯我的體形" name="Edit My Shape"/>
+ <menu_item_call label="懸浮高度" name="Hover Height"/>
<menu_item_call label="我的朋友" name="Friends..."/>
<menu_item_call label="我的群組" name="Groups..."/>
<menu_item_call label="我的個人檔案" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/zh/menu_inventory.xml b/indra/newview/skins/default/xui/zh/menu_inventory.xml
index 478f987035..b346e82b77 100755
--- a/indra/newview/skins/default/xui/zh/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/zh/menu_inventory.xml
@@ -1,5 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
+ <menu_item_call label="新建刊登" name="Marketplace Create Listing"/>
+ <menu_item_call label="聯結刊登" name="Marketplace Associate Listing"/>
+ <menu_item_call label="取得(刷新)刊登" name="Marketplace Get Listing"/>
+ <menu_item_call label="檢查是否有誤" name="Marketplace Check Listing"/>
+ <menu_item_call label="編輯刊登" name="Marketplace Edit Listing"/>
+ <menu_item_call label="刊登" name="Marketplace List"/>
+ <menu_item_call label="停止刊登" name="Marketplace Unlist"/>
+ <menu_item_call label="啟用" name="Marketplace Activate"/>
+ <menu_item_call label="停用" name="Marketplace Deactivate"/>
<menu_item_call label="分享" name="Share"/>
<menu_item_call label="購買" name="Task Buy"/>
<menu_item_call label="打開" name="Task Open"/>
@@ -87,6 +96,7 @@
<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="複製到 Marketplace 刊登" name="Marketplace Copy"/>
+ <menu_item_call label="移到 Marketplace 刊登" name="Marketplace Move"/>
<menu_item_call label="-- 無選項 --" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml
index 8ad0e7324f..a4461f8c6a 100755
--- a/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml
@@ -5,7 +5,7 @@
<menu_item_check label="依最近排序" name="sort_by_recent"/>
<menu_item_check label="總是由名稱排序資料夾" name="sort_folders_by_name"/>
<menu_item_check label="系統資料夾排序到最上方" name="sort_system_folders_to_top"/>
- <menu_item_call label="顯示過濾器" name="show_filters"/>
+ <menu_item_call label="顯示過濾器…" name="show_filters"/>
<menu_item_call label="重設過濾器" name="reset_filters"/>
<menu_item_call label="關閉全部資料夾" name="close_folders"/>
<menu_item_call label="清空 Lost and Found" name="empty_lostnfound"/>
diff --git a/indra/newview/skins/default/xui/zh/menu_marketplace_view.xml b/indra/newview/skins/default/xui/zh/menu_marketplace_view.xml
new file mode 100644
index 0000000000..5396b2a866
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_marketplace_view.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_marketplace_sort">
+ <menu_item_check label="按存量排序(由少到多)" name="sort_by_stock_amount"/>
+ <menu_item_check label="只顯示刊登資料夾" name="show_only_listing_folders"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_experience.xml b/indra/newview/skins/default/xui/zh/menu_url_experience.xml
new file mode 100644
index 0000000000..97ff33b921
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_experience.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</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 adc29a3944..9572ad49d3 100755
--- a/indra/newview/skins/default/xui/zh/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml
@@ -8,13 +8,14 @@
<menu_item_call label="新收納區視窗" name="NewInventoryWindow"/>
<menu_item_call label="地點…" name="Places"/>
<menu_item_call label="精選地點…" name="Picks"/>
+ <menu_item_call label="體驗…" name="Experiences"/>
<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_item_call label="行走 / 跑步 / 飛行…" name="WalkRunFly"/>
</menu>
<menu label="狀態" name="Status">
<menu_item_check label="離開" name="Away"/>
@@ -22,6 +23,7 @@
</menu>
<menu_item_call label="購買 L$…" name="Buy and Sell L$"/>
<menu_item_call label="商家發件匣…" name="MerchantOutbox"/>
+ <menu_item_call label="Marketplace 刊登…" name="MarketplaceListings"/>
<menu_item_call label="帳戶主控臺…" name="Manage My Account"/>
<menu_item_call label="偏好設定…" name="Preferences"/>
<menu_item_call label="工具列按鈕…" name="Toolbars"/>
@@ -46,7 +48,7 @@
<menu_item_check label="朋友" name="My Friends"/>
<menu_item_check label="群組" name="My Groups"/>
<menu_item_check label="附近的人群" name="Active Speakers"/>
- <menu_item_call label="封鎖清單" name="Block List"/>
+ <menu_item_check label="封鎖清單" name="Block List"/>
<menu_item_check label="請勿打擾" name="Do Not Disturb"/>
</menu>
<menu label="世界" name="World">
@@ -60,7 +62,7 @@
<menu_item_call label="快照" name="Take Snapshot"/>
<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="RegionEstate"/>
<menu_item_call label="我所擁有的土地…" name="My Land"/>
<menu_item_call label="購買這塊土地" name="Buy Land"/>
<menu label="顯示" name="LandShow">
@@ -248,6 +250,7 @@
<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="Region Debug Console"/>
<menu_item_check label="快速碼錶" name="Fast Timers"/>
<menu_item_check label="記憶體" name="Memory"/>
<menu_item_check label="場景統計資料" name="Scene Statistics"/>
@@ -351,7 +354,7 @@
<menu_item_check label="探詢內插物件位置" name="Ping Interpolate Object Positions"/>
<menu_item_call label="丟出一個封包" name="Drop a Packet"/>
</menu>
- <menu_item_call label="傾印腳本控制的攝影機" name="Dump Scripted Camera"/>
+ <menu_item_call label="傾印腳本控制的攝影機" name="Dump Scripted Camera"/>
<menu label="錄製器" name="Recorder">
<menu_item_call label="開始播放" name="Start Playback"/>
<menu_item_call label="停止播放" name="Stop Playback"/>
diff --git a/indra/newview/skins/default/xui/zh/mime_types.xml b/indra/newview/skins/default/xui/zh/mime_types.xml
index 70af2d2f19..8967475abb 100755
--- a/indra/newview/skins/default/xui/zh/mime_types.xml
+++ b/indra/newview/skins/default/xui/zh/mime_types.xml
@@ -44,6 +44,14 @@
播放這個位置的音頻
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ 無內容
+ </label>
+ <tooltip name="none_tooltip">
+ 此處無媒體
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
即時串流
diff --git a/indra/newview/skins/default/xui/zh/mime_types_linux.xml b/indra/newview/skins/default/xui/zh/mime_types_linux.xml
index 70af2d2f19..8967475abb 100755
--- a/indra/newview/skins/default/xui/zh/mime_types_linux.xml
+++ b/indra/newview/skins/default/xui/zh/mime_types_linux.xml
@@ -44,6 +44,14 @@
播放這個位置的音頻
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ 無內容
+ </label>
+ <tooltip name="none_tooltip">
+ 此處無媒體
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
即時串流
diff --git a/indra/newview/skins/default/xui/zh/mime_types_mac.xml b/indra/newview/skins/default/xui/zh/mime_types_mac.xml
index 70af2d2f19..8967475abb 100755
--- a/indra/newview/skins/default/xui/zh/mime_types_mac.xml
+++ b/indra/newview/skins/default/xui/zh/mime_types_mac.xml
@@ -44,6 +44,14 @@
播放這個位置的音頻
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ 無內容
+ </label>
+ <tooltip name="none_tooltip">
+ 此處無媒體
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
即時串流
diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml
index bd05725e2b..0a98101b60 100755
--- a/indra/newview/skins/default/xui/zh/notifications.xml
+++ b/indra/newview/skins/default/xui/zh/notifications.xml
@@ -73,6 +73,10 @@
[MESSAGE]
<usetemplate name="okcancelbuttons" notext="取消" yestext="是"/>
</notification>
+ <notification name="GenericAlertOK">
+ [MESSAGE]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
<notification name="BadInstallation">
[APP_NAME] 更新時出錯。 請 [http://get.secondlife.com 下載] 最新版本的 Viewer。
<usetemplate name="okbutton" yestext="確定"/>
@@ -125,6 +129,88 @@
購物市集初始化失敗,系統或網路出錯。 請稍候再試一次。
<usetemplate name="okbutton" yestext="確定"/>
</notification>
+ <notification name="StockPasteFailed">
+ 複製或移到限量資料夾時發生問題:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="MerchantPasteFailed">
+ 複製或移到 Marketplace 刊登時發生問題:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="MerchantTransactionFailed">
+ 和 Marketplace 進行的交易發生如下錯誤:
+
+ 原因:&apos;[ERROR_REASON]&apos;
+ [ERROR_DESCRIPTION]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="MerchantUnprocessableEntity">
+ 我們無法刊登這產品或啓用版本資料夾。 通常這是因為刊登內容表的資料不齊,但也可能因為資料夾結構有錯所致。 請編輯刊登內容或檢查刊登資料夾看是否有誤。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="MerchantListingFailed">
+ 刊登到 Marketplace 時,發生錯誤:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="MerchantFolderActivationFailed">
+ 啓用此版本資料夾時發生錯誤:
+
+ &apos;[ERROR_CODE]&apos;
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmMerchantActiveChange">
+ 這個動作會改變此刊登的內容。 你確定要繼續嗎?
+ <usetemplate ignoretext="在我變更 Marketplace 的一項刊登內容之前,先跟我確認" name="okcancelignore" notext="取消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmMerchantMoveInventory">
+ 你拖曳到 Marketplace 刊登視窗的物項,會從原來的位置移出來,不會被複製。 你確定要繼續嗎?
+ <usetemplate ignoretext="在我把物項從收納區移到 Marketplace 之前,先跟我確認" name="okcancelignore" notext="取消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmListingCutOrDelete">
+ 移動或刪除刊登資料夾將會刪除你的 Marketplace 刊登。 如你希望保留 Marketplace 刊登,請改而移動或刪除所想修改的版本資料夾的內容。 你確定要繼續嗎?
+ <usetemplate ignoretext="在我把物項從 Marketplace 移出或刪除之前,先跟我確認" name="okcancelignore" notext="取消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmCopyToMarketplace">
+ 你無權將這些物項的一或多個複製到 Marketplace。 你可以移動這些物項,或保留不動。
+ <usetemplate canceltext="取消" ignoretext="我試著選擇複製到 Marketplace 的內容如果含有「禁止複製」的物項,先向我確認" name="yesnocancelbuttons" notext="保留不移動物項" yestext="移動物項"/>
+ </notification>
+ <notification name="ConfirmMerchantUnlist">
+ 這動作會停登這個刊登。 你確定要繼續嗎?
+ <usetemplate ignoretext="在我停登 Marketplace 的現有刊登內容前,先跟我確認" name="okcancelignore" notext="取消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmMerchantClearVersion">
+ 這個動作會停用此刊登的版本資料夾。 你確定要繼續嗎?
+ <usetemplate ignoretext="在我停用 Marketplace 某項刊登的版本資料夾之前,先跟我確認。" name="okcancelignore" notext="取消" yestext="確定"/>
+ </notification>
+ <notification name="AlertMerchantListingNotUpdated">
+ 這刊登無法更新。
+[[URL] 點按這裡]即可在 Marketplace 進行編輯。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="AlertMerchantListingCannotWear">
+ 你不能穿戴位在 Marketplace 刊登資料夾裡的衣物或身體部位。
+ </notification>
+ <notification name="AlertMerchantListingInvalidID">
+ 無效的刊登 ID。
+ </notification>
+ <notification name="AlertMerchantListingActivateRequired">
+ 這個刊登有多個版本資料夾或缺少版本資料夾。 你事後必須選擇一個加以啓用。
+ <usetemplate ignoretext="當我要新建帶有多個版本資料夾的刊登前,提醒我啓動一個版本資料夾" name="okignore" yestext="確定"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderSplit">
+ 我們已經將不同類型的限量物項分開放置到不同的存量資料夾,這樣你的資料夾才能夠刊登。
+ <usetemplate ignoretext="刊登前把限量資料夾一分為二時,告知我" name="okignore" yestext="確定"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderEmpty">
+ 因為存量爲零,我們已經把你的刊登物下架。 你若希望重新刊登,必須先增加存量。
+ <usetemplate ignoretext="限量資料夾如果成空、導致刊登物下架,告知我" name="okignore" yestext="確定"/>
+ </notification>
<notification name="CompileQueueSaveText">
上傳腳本文字時出問題,原因:[REASON]。 請稍候再試一次。
</notification>
@@ -469,6 +555,10 @@
儲存變更?
<usetemplate canceltext="取消" name="yesnocancelbuttons" notext="不要儲存" yestext="儲存"/>
</notification>
+ <notification name="DeleteNotecard">
+ 刪除記事卡?
+ <usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
+ </notification>
<notification name="GestureSaveFailedTooManySteps">
姿勢儲存失敗。
這個姿勢步驟太多。
@@ -575,6 +665,9 @@
<notification name="RegionNoTerraforming">
這個 [REGION] 地區並不允許變更地形。
</notification>
+ <notification name="ParcelNoTerraforming">
+ 你無權針對地段 [PARCEL] 進行土地變形。
+ </notification>
<notification name="CannotCopyWarning">
你沒有權限複製以下項目:
[ITEMS]
@@ -1816,6 +1909,30 @@ SHA1 指紋:[MD5_DIGEST]
僅針對這個領地或針對 [ALL_ESTATES] 移除領地管理人?
<usetemplate canceltext="取消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
</notification>
+ <notification label="選擇領地" name="EstateAllowedExperienceAdd">
+ 僅針對這個領地或針對 [ALL_ESTATES] 將它新增到允許清單?
+ <usetemplate canceltext="取消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="選擇領地" name="EstateAllowedExperienceRemove">
+ 僅針對這個領地或針對 [ALL_ESTATES] 將它從允許清單中移除?
+ <usetemplate canceltext="取消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="選擇領地" name="EstateBlockedExperienceAdd">
+ 僅針對這個領地或針對 [ALL_ESTATES] 將它新增到封鎖清單?
+ <usetemplate canceltext="取消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="選擇領地" name="EstateBlockedExperienceRemove">
+ 僅針對這個領地或針對 [ALL_ESTATES] 將它從封鎖清單中移除?
+ <usetemplate canceltext="取消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="選擇領地" name="EstateTrustedExperienceAdd">
+ 僅針對這個領地或針對 [ALL_ESTATES] 將它新增到金鑰清單?
+ <usetemplate canceltext="取消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="選擇領地" name="EstateTrustedExperienceRemove">
+ 僅針對這個領地或針對 [ALL_ESTATES] 將它從金鑰清單中移除?
+ <usetemplate canceltext="取消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
<notification label="確認踢出" name="EstateKickUser">
將 [EVIL_USER] 由這領地踢出?
<usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
@@ -1828,6 +1945,9 @@ SHA1 指紋:[MD5_DIGEST]
你所欲前往的地區含有超過你目前偏好的分級的內容。 你可以到「我自己 &gt; 偏好設定 &gt; 一般設定」變更你的偏好設定。
<usetemplate name="okbutton" yestext="確定"/>
</notification>
+ <notification name="SLM_UPDATE_FOLDER">
+ [MESSAGE]
+ </notification>
<notification name="RegionEntryAccessBlocked_AdultsOnlyContent">
你所欲前往的地區含有 [REGIONMATURITY] 的分級內容,僅限成人。
<url name="url">
@@ -1890,6 +2010,10 @@ SHA1 指紋:[MD5_DIGEST]
發生技術問題,你的偏好設定和伺服器上的不一致。
<usetemplate name="okbutton" yestext="確定"/>
</notification>
+ <notification name="RegionTPSpecialUsageBlocked">
+ 無法進入地區。 &apos;[REGION_NAME]&apos; 是個「技巧性博奕」(Skill Gaming)地區,你必須符合一定條件才可進入。 欲知詳情,請參閱 [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life 技巧性博奕常見問題集]。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
<notification name="PreferredMaturityChanged">
你將不再收到通知,告知你即將進入一個 [RATING] 內容分級的地區。 你可以到選單列底下的「我自己 &gt; 偏好設定 &gt; 一般設定」變更你的內容偏好。
<usetemplate name="okbutton" yestext="確定"/>
@@ -2111,6 +2235,10 @@ SHA1 指紋:[MD5_DIGEST]
<ignore name="ignore" text="我在創建不含 money() 腳本的物件時設定了「支付物件」動作"/>
</form>
</notification>
+ <notification name="PayConfirmation">
+ 確認你真要支付 L$[AMOUNT] 給 [TARGET]。
+ <usetemplate ignoretext="付款前跟我確認(超過 L$200 的總額)" name="okcancelignore" notext="取消" yestext="支付"/>
+ </notification>
<notification name="OpenObjectCannotCopy">
這物件中沒有任何准許你複製的物項。
</notification>
@@ -2196,6 +2324,9 @@ SHA1 指紋:[MD5_DIGEST]
<button ignore="絕不取代" name="No" text="取消"/>
</form>
</notification>
+ <notification name="TooManyWearables">
+ 你不能對含超過 [AMOUNT] 個物項的資料夾作穿戴動作。 欲變更此上限,可到「進階」&gt;「顯示除錯設定」&gt;「WearFolderLimit」。
+ </notification>
<notification label="「請勿打擾」模式警告" name="DoNotDisturbModePay">
你已開啟「請勿打擾」。 你將不會收到任何付款購買的物項。
@@ -2647,9 +2778,6 @@ SHA1 指紋:[MD5_DIGEST]
<notification name="NoValidCircuit">
沒有有效的線路碼。
</notification>
- <notification name="NoValidTimestamp">
- 沒有有效的時間戳記。
- </notification>
<notification name="NoPendingConnection">
無法建立待通的連線。
</notification>
@@ -2804,7 +2932,7 @@ SHA1 指紋:[MD5_DIGEST]
[MESSAGE]
-來源物件:&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;(所有人是 [NAME])?
+來源物件:&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;(所有人:[NAME])
<form name="form">
<button name="Gotopage" text="前往頁面"/>
<button name="Cancel" text="取消"/>
@@ -2830,6 +2958,72 @@ SHA1 指紋:[MD5_DIGEST]
<button name="Mute" text="封鎖"/>
</form>
</notification>
+ <notification name="ExperienceAcquireFailed">
+ 無法取得新的體驗:
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="NotInGroupExperienceProfileMessage">
+ 已取消對體驗群組的變更,因為擁有人不是所選群組的成員。
+ </notification>
+ <notification name="UneditableExperienceProfileMessage">
+ 已在更新體驗簡覽時忽略不可編輯的欄位 &apos;[field]&apos;。
+ </notification>
+ <notification name="RestrictedToOwnerExperienceProfileMessage">
+ 已忽略對欄位 &apos;[field]&apos; 的變更,只有體驗擁有人可作此變更。
+ </notification>
+ <notification name="MaturityRatingExceedsOwnerExperienceProfileMessage">
+ 你不能將體驗的內容分級設定為比擁有人所設更高的等級。
+ </notification>
+ <notification name="RestrictedTermExperienceProfileMessage">
+ 以下項目導致無法更新體驗的名稱或描述:[extra_info]
+ </notification>
+ <notification name="TeleportedHomeExperienceRemoved">
+ 你已移除金鑰體驗 secondlife:///app/experience/[public_id]/profile,因此被瞬間傳送離開 [region_name] 地區,因為你已無權續留。
+ <form name="form">
+ <ignore name="ignore" text="移除體驗後,已被踢出地區"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperienceEntry">
+ 你已參與金鑰體驗 secondlife:///app/experience/[public_id]/profile,因此獲准進入 [region_name] 地區,若移除此體驗,你可能會被踢出地區。
+ <form name="form">
+ <ignore name="ignore" text="已透過體驗獲准進入地區"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperiencesAvailable">
+ 你並沒有權限進入此目的地。 若接受以下一項體驗,可獲准進入該地區:
+
+[EXPERIENCE_LIST]
+
+可能有其他金鑰體驗供選擇。
+ </notification>
+ <notification name="ExperienceEvent">
+ 一個物件已得到 secondlife:///app/experience/[public_id]/profile 體驗允許,可以[EventType]。
+ 所有人:secondlife:///app/agent/[OwnerID]/inspect
+ 物件名稱:[ObjectName]
+ 地段名稱:[ParcelName]
+ </notification>
+ <notification name="ExperienceEventAttachment">
+ 一個附件已得到 secondlife:///app/experience/[public_id]/profile 體驗允許,可以[EventType]。
+ 所有人:secondlife:///app/agent/[OwnerID]/inspect
+ </notification>
+ <notification name="ScriptQuestionExperience">
+ &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;,一個由 &apos;[NAME]&apos; 擁有的物件,邀請你參與以下的 [GRID_WIDE] 體驗:
+
+[EXPERIENCE]
+
+允准之後,除非在「體驗簡覽」撤銷該權限,否則你將不再看到此訊息。
+
+本體驗的相關腳本,將可在啟用本體驗的地區進行以下動作:
+
+[QUESTIONS] 你是否同意?
+ <form name="form">
+ <button name="BlockExperience" text="封鎖體驗"/>
+ <button name="Mute" text="封鎖物件"/>
+ <button name="Yes" text="是"/>
+ <button name="No" text="否"/>
+ </form>
+ </notification>
<notification name="ScriptQuestionCaution">
警告:物件 &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; 要求全權存取你的林登幣帳戶。 你如果允許存取帳戶,它將可在任何時候從你帳戶取走資金,或完全加以清空,或定期取走部分資金,且不會發出警告。
@@ -3149,6 +3343,10 @@ SHA1 指紋:[MD5_DIGEST]
(存續 [EXISTENCE] 秒鐘)
你在 [TIME] 秒鐘後在本地為 &apos;[BODYREGION]&apos; 更新了一個 [RESOLUTION] 的定貌材質。
</notification>
+ <notification name="CannotUploadTexture">
+ 無法上傳質料。
+[REASON]
+ </notification>
<notification name="LivePreviewUnavailable">
我們無法顯示這個材質的預覽,因為它設為「禁止複製」且 / 或「禁止轉移」。
<usetemplate ignoretext="「禁止複製」和「禁止轉移」的材質若不能使用實時預覽模式,請給我警示。" name="okignore" yestext="確定"/>
@@ -3724,9 +3922,11 @@ SHA1 指紋:[MD5_DIGEST]
</notification>
<notification name="TeleportedByAttachment">
你已成功被 [ITEM_ID] 上的一個附件瞬間傳送
+ <usetemplate ignoretext="瞬間傳送:你已成功被一個附件瞬間傳送" name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOnParcel">
你已成功被 &apos;[PARCEL_NAME]&apos; 地段的物件 &apos;[OBJECT_NAME]&apos; 瞬間傳送
+ <usetemplate ignoretext="瞬間傳送:你已被一個物件或地段瞬間傳送成功" name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOwnedBy">
你已成功被 [OWNER_ID] 擁有的物件 &apos;[OBJECT_NAME]&apos; 瞬間傳送
@@ -4058,7 +4258,7 @@ SHA1 指紋:[MD5_DIGEST]
<usetemplate ignoretext="無法移動檔案。 已恢復前一個路徑。" name="okignore" yestext="確定"/>
</notification>
<notification name="DefaultObjectPermissions">
- 儲存預設權限時出問題,原因:[REASON]。 請稍後再嘗試儲存預設權限。
+ 儲存預設物件權限時出問題,原因:[REASON]。 請稍後再嘗試儲存預設權限。
<usetemplate name="okbutton" yestext="確定"/>
</notification>
<notification name="ChatHistoryIsBusyAlert">
diff --git a/indra/newview/skins/default/xui/zh/panel_experience_info.xml b/indra/newview/skins/default/xui/zh/panel_experience_info.xml
new file mode 100644
index 0000000000..04d22c46ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_experience_info.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_experience_info">
+ <text name="title" value="體驗簡覽"/>
+ <scroll_container name="xp_scroll">
+ <panel name="scrolling_panel">
+ <layout_stack>
+ <layout_panel>
+ <text name="experience_title" value="Kyle&apos;s Superhero RPG"/>
+ </layout_panel>
+ <layout_panel name="location panel">
+ <text name="Location">
+ 位置:
+ </text>
+ <text name="LocationTextText">
+ 某某地點
+ </text>
+ <button label="瞬間傳送" name="teleport_btn"/>
+ <button label="地圖" name="map_btn"/>
+ </layout_panel>
+ <layout_panel name="marketplace panel">
+ <text name="Location">
+ 第二人生購物市集商店:
+ </text>
+ <text name="LocationTextText">
+ 某某地點
+ </text>
+ </layout_panel>
+ <layout_panel>
+ <text name="ContentRating">
+ 分級:
+ </text>
+ <text name="ContentRatingText">
+ 完全成人
+ </text>
+ <text name="Owner">
+ 所有人:
+ </text>
+ <text name="OwnerText">
+ Kyle
+ </text>
+ <button label="編輯" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_experience_list_editor.xml b/indra/newview/skins/default/xui/zh/panel_experience_list_editor.xml
new file mode 100644
index 0000000000..469f942578
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_experience_list_editor.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="experince_list_editor">
+ <panel.string name="loading">
+ 載入中...
+ </panel.string>
+ <panel.string name="panel_allowed">
+ 允許的體驗:
+ </panel.string>
+ <panel.string name="panel_blocked">
+ 封鎖的體驗:
+ </panel.string>
+ <panel.string name="panel_trusted">
+ 金鑰體驗:
+ </panel.string>
+ <panel.string name="no_results">
+ (空白)
+ </panel.string>
+ <text name="text_name">
+ 體驗清單
+ </text>
+ <scroll_list name="experience_list">
+ <columns label="名稱" name="experience_name"/>
+ </scroll_list>
+ <button label="添加..." name="btn_add"/>
+ <button label="移除" name="btn_remove"/>
+ <button label="檔案..." name="btn_profile"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_experience_list_item.xml b/indra/newview/skins/default/xui/zh/panel_experience_list_item.xml
new file mode 100644
index 0000000000..3ec619b8de
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_experience_list_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiences">
+ <text name="experience_name">
+ 測試用名稱
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_experience_log.xml b/indra/newview/skins/default/xui/zh/panel_experience_log.xml
new file mode 100644
index 0000000000..791dcd0a2e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_experience_log.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="EVENTS">
+ <string name="no_events" value="無活動。"/>
+ <string name="loading" value="載入中..."/>
+ <layout_stack>
+ <layout_panel>
+ <scroll_list name="experience_log_list">
+ <columns label="時間" name="time"/>
+ <columns label="活動" name="event"/>
+ <columns label="體驗" name="experience_name"/>
+ <columns label="物件" name="object_name"/>
+ </scroll_list>
+ <button label="通知" name="btn_notify"/>
+ <button label="簡覽" name="btn_profile_xp"/>
+ <button label="回報" name="btn_report_xp"/>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <check_box label="對所有活動作通知 天數" name="notify_all"/>
+ <button label="清除" name="btn_clear"/>
+ <button label="&lt;" name="btn_prev"/>
+ <button label="&gt;" name="btn_next"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_experience_search.xml b/indra/newview/skins/default/xui/zh/panel_experience_search.xml
new file mode 100644
index 0000000000..9b0145748e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_experience_search.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="SEARCH">
+ <string name="not_found">
+ 查無「[TEXT]」
+ </string>
+ <string name="no_results">
+ 沒有結果
+ </string>
+ <string name="searching">
+ 搜尋中...
+ </string>
+ <string name="loading">
+ 載入中…
+ </string>
+ <string name="maturity_icon_general">
+ &quot;Parcel_PG_Light&quot;
+ </string>
+ <string name="maturity_icon_moderate">
+ &quot;Parcel_M_Light&quot;
+ </string>
+ <string name="maturity_icon_adult">
+ &quot;Parcel_R_Light&quot;
+ </string>
+ <panel name="search_panel">
+ <button label="前往" name="find"/>
+ <icons_combo_box label="適度成人" name="maturity">
+ <icons_combo_box.item label="完全成人" name="Adult" value="42"/>
+ <icons_combo_box.item label="適度成人" name="Mature" value="21"/>
+ <icons_combo_box.item label="一般" name="PG" value="13"/>
+ </icons_combo_box>
+ <scroll_list name="search_results">
+ <columns label="名稱" name="experience_name"/>
+ <columns label="所有人" name="owner"/>
+ </scroll_list>
+ <button label="確定" label_selected="確定" name="ok_btn"/>
+ <button label="取消" name="cancel_btn"/>
+ <button label="察看簡覽" name="profile_btn"/>
+ <button label="&lt;" name="left_btn"/>
+ <button label="&gt;" name="right_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_experiences.xml b/indra/newview/skins/default/xui/zh/panel_experiences.xml
new file mode 100644
index 0000000000..bb1df97058
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_experiences.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Experiences">
+ <string name="loading_experiences" value="體驗載入中..."/>
+ <string name="no_experiences" value="未設體驗。"/>
+ <string name="acquire" value="取得體驗"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_facebook_photo.xml b/indra/newview/skins/default/xui/zh/panel_facebook_photo.xml
index d43fcf4665..85d2ac36f3 100644
--- a/indra/newview/skins/default/xui/zh/panel_facebook_photo.xml
+++ b/indra/newview/skins/default/xui/zh/panel_facebook_photo.xml
@@ -1,26 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="圖像解析度">
- <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="1200x630" name="1200x630"/>
- </combo_box>
- <combo_box name="filters_combobox" tool_tip="圖像濾鏡">
- <combo_box.item label="不用濾鏡" name="NoFilter"/>
- </combo_box>
- <button label="重新整理" name="new_snapshot_btn" tool_tip="點按即可刷新"/>
- <button label="預覽" name="big_preview_btn" tool_tip="點按即可切換預覽"/>
- <text name="caption_label">
- 說明(可留空):
- </text>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="發佈" name="post_photo_btn"/>
- <button label="取消" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <combo_box name="resolution_combobox" tool_tip="圖像解析度">
+ <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="1200x630" name="1200x630"/>
+ </combo_box>
+ <combo_box name="filters_combobox" tool_tip="圖像濾鏡">
+ <combo_box.item label="不用濾鏡" name="NoFilter"/>
+ </combo_box>
+ <button label="刷新" name="new_snapshot_btn" tool_tip="點按即可刷新"/>
+ <button label="預覽" name="big_preview_btn" tool_tip="點按即可切換預覽"/>
+ <text name="caption_label">
+ 說明(可留空):
+ </text>
+ <button label="發佈" name="post_photo_btn"/>
+ <button label="取消" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_facebook_place.xml b/indra/newview/skins/default/xui/zh/panel_facebook_place.xml
index 27bd789af1..56d4d687ef 100644
--- a/indra/newview/skins/default/xui/zh/panel_facebook_place.xml
+++ b/indra/newview/skins/default/xui/zh/panel_facebook_place.xml
@@ -1,17 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_place">
- <layout_stack name="stack_place">
- <layout_panel name="place_detail_panel">
- <text name="place_caption_label">
- 描述一下你所在的地方:
- </text>
- </layout_panel>
- <layout_panel name="place_map_panel">
- <check_box initial_value="false" label="" name="add_place_view_cb"/>
- </layout_panel>
- <layout_panel name="place_button_panel">
- <button label="發佈" name="post_place_btn"/>
- <button label="取消" name="cancel_place_btn"/>
- </layout_panel>
- </layout_stack>
+ <text name="place_caption_label">
+ 描述一下你所在的地方:
+ </text>
+ <check_box initial_value="false" label="包括地點的俯瞰圖" name="add_place_view_cb"/>
+ <button label="發佈" name="post_place_btn"/>
+ <button label="取消" name="cancel_place_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_facebook_status.xml b/indra/newview/skins/default/xui/zh/panel_facebook_status.xml
index b947b49a4f..3a7cbd07b0 100644
--- a/indra/newview/skins/default/xui/zh/panel_facebook_status.xml
+++ b/indra/newview/skins/default/xui/zh/panel_facebook_status.xml
@@ -1,14 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_facebook_status">
- <layout_stack name="stack_status">
- <layout_panel name="status_detail_panel">
- <text name="status_caption_label">
- 你在想些什麼?
- </text>
- </layout_panel>
- <layout_panel name="status_button_panel">
- <button label="發佈" name="post_status_btn"/>
- <button label="取消" name="cancel_status_btn"/>
- </layout_panel>
- </layout_stack>
+ <string name="facebook_connected" value="已成功連通臉書,身分為:"/>
+ <string name="facebook_disconnected" value="未連通臉書"/>
+ <text name="account_caption_label">
+ 未連通臉書。
+ </text>
+ <panel name="panel_buttons">
+ <button label="連通…" name="connect_btn"/>
+ <button label="中斷" name="disconnect_btn"/>
+ <text name="account_learn_more_label">
+ [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 如何發佈到臉書]
+ </text>
+ </panel>
+ <text name="status_caption_label">
+ 你在想些什麼?
+ </text>
+ <button label="發佈" name="post_status_btn"/>
+ <button label="取消" name="cancel_status_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_flickr_photo.xml b/indra/newview/skins/default/xui/zh/panel_flickr_photo.xml
index 75738abebc..ece239a29f 100644
--- a/indra/newview/skins/default/xui/zh/panel_flickr_photo.xml
+++ b/indra/newview/skins/default/xui/zh/panel_flickr_photo.xml
@@ -1,41 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_flickr_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="圖像解析度">
- <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>
- <combo_box name="filters_combobox" tool_tip="圖像濾鏡">
- <combo_box.item label="不用濾鏡" name="NoFilter"/>
- </combo_box>
- <button label="刷新" name="new_snapshot_btn" tool_tip="點按即可刷新"/>
- <button label="預覽" name="big_preview_btn" tool_tip="點按即可切換預覽"/>
- <text name="title_label">
- 標題:
- </text>
- <text name="description_label">
- 描述:
- </text>
- <check_box initial_value="true" label="在描述結尾加上第二人生的地點" name="add_location_cb"/>
- <text name="tags_label">
- 標籤:
- </text>
- <text name="tags_help_label">
- 不同標籤之間以半形空格分隔
+ <combo_box name="resolution_combobox" tool_tip="圖像解析度">
+ <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>
+ <combo_box name="filters_combobox" tool_tip="圖像濾鏡">
+ <combo_box.item label="不用濾鏡" name="NoFilter"/>
+ </combo_box>
+ <button label="刷新" name="new_snapshot_btn" tool_tip="點按即可刷新"/>
+ <button label="預覽" name="big_preview_btn" tool_tip="點按即可切換預覽"/>
+ <text name="title_label">
+ 標題:
+ </text>
+ <text name="description_label">
+ 描述:
+ </text>
+ <check_box initial_value="true" label="在描述結尾加上第二人生的地點" name="add_location_cb"/>
+ <text name="tags_label">
+ 標籤:
+ </text>
+ <text name="tags_help_label">
+ 不同標籤之間以半形空格分隔
標籤若含空格,用 &quot;&quot; 半形符號括住
- </text>
- <combo_box name="rating_combobox" tool_tip="Flickr 內容分級">
- <combo_box.item label="安全級 Flickr 內容" name="SafeRating"/>
- <combo_box.item label="適中級 Flickr 內容" name="ModerateRating"/>
- <combo_box.item label="限制級 Flickr 內容" name="RestrictedRating"/>
- </combo_box>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="上傳" name="post_photo_btn"/>
- <button label="取消" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ </text>
+ <combo_box name="rating_combobox" tool_tip="Flickr 內容分級">
+ <combo_box.item label="安全級 Flickr 內容" name="SafeRating"/>
+ <combo_box.item label="適中級 Flickr 內容" name="ModerateRating"/>
+ <combo_box.item label="限制級 Flickr 內容" name="RestrictedRating"/>
+ </combo_box>
+ <button label="上傳" name="post_photo_btn"/>
+ <button label="取消" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml
index 43e3507961..1fb0b3f5bb 100755
--- a/indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml
@@ -23,6 +23,7 @@
<accordion_tab name="group_roles_tab" title="角色與成員"/>
<accordion_tab name="group_notices_tab" title="通知"/>
<accordion_tab name="group_land_tab" title="土地 / 資產"/>
+ <accordion_tab name="group_experiences_tab" title="體驗"/>
</accordion>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/zh/panel_login.xml b/indra/newview/skins/default/xui/zh/panel_login.xml
index 09a1af5cf8..5292e5fc38 100755
--- a/indra/newview/skins/default/xui/zh/panel_login.xml
+++ b/indra/newview/skins/default/xui/zh/panel_login.xml
@@ -1,26 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_login">
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php
- </panel.string>
+ <panel.string name="forgot_password_url">http://secondlife.com/account/request.php</panel.string>
<layout_stack name="ui_stack">
<layout_panel name="ui_container">
<combo_box label="使用者名稱" name="username_combo" tool_tip="使用者名稱是你註冊時所挑選的,例如 bobsmith12 或 Steller Sunshine"/>
<line_editor label="密碼" name="password_edit"/>
- <check_box label="記得我" name="remember_check"/>
- <text name="forgot_password_text">
- 忘記密碼
- </text>
- <button label="登入" name="connect_btn"/>
- <text name="At_My_Last_Location_Label">
- 到我上次去的地點
- </text>
<combo_box label="我的最愛" name="start_location_combo">
+ <combo_box.item label="我上一次位置" name="MyLastLocation"/>
<combo_box.item label="我的家" name="MyHome"/>
</combo_box>
- <button label="登入" name="connect_favorite_btn"/>
- <line_editor label="鍵入一個地點" name="location_edit"/>
- <button label="登入" name="connect_location_btn"/>
+ <button label="登入" name="connect_btn"/>
+ <check_box label="記得我" name="remember_check"/>
+ <text name="forgot_password_text">忘記密碼</text>
<combo_box label="選擇模擬世界" name="server_combo"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/zh/panel_marketplace_listings.xml b/indra/newview/skins/default/xui/zh/panel_marketplace_listings.xml
new file mode 100644
index 0000000000..2eae87c6a0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_marketplace_listings.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Marketplace" name="Marketplace Panel">
+ <panel name="tool_panel">
+ <menu_button name="sort_btn" tool_tip="檢視/排序的選項"/>
+ <button name="add_btn" tool_tip="新建一個刊登資料夾"/>
+ <button label="檢查是否有誤" name="audit_btn" tool_tip="檢查你的 Marketplace 刊登"/>
+ </panel>
+ <panel name="tab_container_panel">
+ <filter_editor label="過濾 Marketplace 刊登清單" name="filter_editor"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_marketplace_listings_inventory.xml b/indra/newview/skins/default/xui/zh/panel_marketplace_listings_inventory.xml
new file mode 100644
index 0000000000..a052a50bd1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_marketplace_listings_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="全部" name="All Items" tool_tip="拖曳並置放物品到這裡,即可刊登"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_marketplace_listings_listed.xml b/indra/newview/skins/default/xui/zh/panel_marketplace_listings_listed.xml
new file mode 100644
index 0000000000..3adc66a1d4
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_marketplace_listings_listed.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="已刊登" name="Active Items"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_marketplace_listings_unassociated.xml b/indra/newview/skins/default/xui/zh/panel_marketplace_listings_unassociated.xml
new file mode 100644
index 0000000000..d582e6615c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_marketplace_listings_unassociated.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="已取消聯結" name="Unassociated Items"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_marketplace_listings_unlisted.xml b/indra/newview/skins/default/xui/zh/panel_marketplace_listings_unlisted.xml
new file mode 100644
index 0000000000..6d00f3d9b7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_marketplace_listings_unlisted.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_panel label="未刊登" name="Inactive Items"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_postcard_settings.xml b/indra/newview/skins/default/xui/zh/panel_postcard_settings.xml
index 900ab3a54e..8ab122ccc3 100755
--- a/indra/newview/skins/default/xui/zh/panel_postcard_settings.xml
+++ b/indra/newview/skins/default/xui/zh/panel_postcard_settings.xml
@@ -7,17 +7,7 @@
<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>
+ <spinner label="寬 x 高" name="postcard_snapshot_width"/>
+ <check_box label="鎖住比例" name="postcard_keep_aspect_check"/>
+ <slider label="清晰度:" name="image_quality_slider"/>
</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 ab4d9a881d..fcbed76d49 100755
--- a/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml
@@ -14,9 +14,9 @@
<text name="Web:">
網頁:
</text>
- <radio_group name="use_external_browser">
- <radio_item label="使用我的網頁瀏覽器(例如 IE, Firefox, Safari)" name="external" tool_tip="使用系統預設的瀏覽器瀏覽幫助,開啟網頁。全螢幕模式下不建議這麼做。" value="true"/>
- <radio_item label="使用內建網頁瀏覽器" name="internal" tool_tip="使用內建的瀏覽器瀏覽幫助,開啟網頁。該瀏覽器將透過 [APP_NAME] 開啟新視窗。" value=""/>
+ <radio_group name="preferred_browser_behavior">
+ <radio_item label="所有連結都用我的網頁瀏覽器(例如 Chrome、Firefox、IE)開啟" name="internal" tool_tip="使用系統預設的瀏覽器瀏覽幫助,開啟網頁。全螢幕模式下不建議這麼做。" value="0"/>
+ <radio_item label="僅在開啟第二人生連結時使用內建瀏覽器" name="external" tool_tip="使用系統預設的瀏覽器瀏覽幫助,開啟網頁。僅在開啟 LindenLab/SecondLife 的連結時才會使用內建瀏覽器。" value="1"/>
</radio_group>
<check_box initial_value="true" label="啟用外掛" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="接受 cookies" name="cookies_enabled"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_experiences.xml b/indra/newview/skins/default/xui/zh/panel_region_experiences.xml
new file mode 100644
index 0000000000..7b1b697fd6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_region_experiences.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="體驗" name="Experiences">
+ <panel.string name="trusted_estate_text">
+ 任何體驗都可以成為金鑰體驗。
+
+金鑰體驗可在此領地執行。
+
+此外,即使這個領地平常不開放進入,參與任何鑰匙體驗的居民,只要維持處在「金鑰體驗」狀態,仍可進入領地停留。
+ </panel.string>
+ <panel.string name="allowed_estate_text">
+ 只允准「土地範圍」的體驗。
+
+獲准的體驗可在此領地執行。
+ </panel.string>
+ <panel.string name="blocked_estate_text">
+ 只封鎖「網格範圍」的體驗。
+
+遭封鎖的體驗不得在此領地執行。
+ </panel.string>
+ <panel.string name="estate_caption">
+ 變更此夜籤中的設定會影響這個領地內的全部地區設定。
+ </panel.string>
+ <panel.string name="allowed_parcel_text">
+ 只允准「土地範圍」的體驗。
+
+獲准的體驗若未被領地封鎖,就可在此地段執行。
+ </panel.string>
+ <panel.string name="blocked_parcel_text">
+ 任何居民的體驗都可以加以封鎖。
+
+遭封鎖的體驗不得在此地段執行。
+ </panel.string>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_script_experience.xml b/indra/newview/skins/default/xui/zh/panel_script_experience.xml
new file mode 100644
index 0000000000..40fd0a90de
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_script_experience.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel name="script_experience" title="體驗">
+ <button label="體驗" name="Expand Experience"/>
+ <check_box label="使用體驗" name="enable_xp"/>
+ <layout_stack name="xp_details">
+ <layout_panel>
+ <combo_box label="選擇體驗…" name="Experiences..."/>
+ </layout_panel>
+ </layout_stack>
+ <text name="No Experiences">
+ 你尚未對任何體驗作貢獻。
+ </text>
+</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
index 20fb9b494a..9c45c54a5e 100755
--- a/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml
@@ -1,7 +1,7 @@
<?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]。 若要將圖像存為材質,請選擇一個正方格式。
@@ -13,8 +13,8 @@
<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"/>
+ <spinner label="寬 x 高" 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"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_snapshot_local.xml b/indra/newview/skins/default/xui/zh/panel_snapshot_local.xml
index a929c9a3fb..691ab8bac7 100755
--- a/indra/newview/skins/default/xui/zh/panel_snapshot_local.xml
+++ b/indra/newview/skins/default/xui/zh/panel_snapshot_local.xml
@@ -1,7 +1,7 @@
<?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"/>
@@ -13,24 +13,17 @@
<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>
+ <spinner label="寬 x 高" name="local_snapshot_width"/>
+ <check_box label="鎖住比例" name="local_keep_aspect_check"/>
+ <text name="local_format_label">
+ 格式
+ </text>
+ <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"/>
<button label="取消" name="cancel_btn"/>
<flyout_button label="儲存" name="save_btn" tool_tip="儲存圖像到檔案">
<flyout_button.item label="儲存" name="save_item"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml b/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml
index 43d7280373..a5a1cbfb51 100755
--- a/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml
@@ -1,16 +1,10 @@
<?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"/>
- <text name="send_to_facebook_textbox">
- [secondlife:/// 臉書(Facebook)]
- </text>
- <text name="send_to_twitter_textbox">
- [secondlife:/// 推特(Twitter)]
- </text>
- <text name="send_to_flickr_textbox">
- [secondlife:/// Flickr]
- </text>
+ <button label="儲存到硬碟" name="save_to_computer_btn"/>
+ <button label="儲存到收納區(L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="上傳到簡覽" name="save_to_profile_btn"/>
+ <button label="上傳到臉書" name="send_to_facebook_btn"/>
+ <button label="上傳到推特" name="send_to_twitter_btn"/>
+ <button label="上傳到 Flickr" name="send_to_flickr_btn"/>
+ <button label="用電郵傳送" name="save_to_email_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
index 853a856104..77f8b335db 100755..100644
--- a/indra/newview/skins/default/xui/zh/panel_snapshot_postcard.xml
+++ b/indra/newview/skins/default/xui/zh/panel_snapshot_postcard.xml
@@ -12,6 +12,10 @@
<text name="title">
電郵
</text>
- <button label="訊息" name="message_btn"/>
- <button label="設定" name="settings_btn"/>
+ <tab_container name="postcard_tabs">
+ <panel label="訊息" name="panel_postcard_message"/>
+ <panel label="設定" name="panel_postcard_settings"/>
+ </tab_container>
+ <button label="取消" name="cancel_btn"/>
+ <button label="送出" name="send_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
index 6f64a4e83c..1f202572f5 100755
--- a/indra/newview/skins/default/xui/zh/panel_snapshot_profile.xml
+++ b/indra/newview/skins/default/xui/zh/panel_snapshot_profile.xml
@@ -1,7 +1,7 @@
<?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"/>
@@ -10,19 +10,12 @@
<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>
+ <spinner label="寬 x 高" name="profile_snapshot_width"/>
+ <check_box label="鎖住比例" name="profile_keep_aspect_check"/>
+ <text name="caption_label">
+ 內容敘述:
+ </text>
+ <check_box initial_value="true" label="加入所在位置" name="add_location_cb"/>
<button label="取消" name="cancel_btn"/>
<button label="發佈" name="post_btn"/>
</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 b4cdff9d6b..2de31eb526 100755
--- a/indra/newview/skins/default/xui/zh/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/zh/panel_status_bar.xml
@@ -1,28 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <panel.string name="packet_loss_tooltip">
- 封包損失
- </panel.string>
- <panel.string name="bandwidth_tooltip">
- 頻寬
- </panel.string>
- <panel.string name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string name="timeTooltip">
- [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
- </panel.string>
- <panel.string name="buycurrencylabel">
- L$ [AMT]
- </panel.string>
+ <panel.string name="packet_loss_tooltip">封包損失</panel.string>
+ <panel.string name="bandwidth_tooltip">頻寬</panel.string>
+ <panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>
+ <panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>
+ <panel.string name="buycurrencylabel">L$ [AMT]</panel.string>
<panel name="balance_bg">
- <text name="balance" tool_tip="點按以重新更新你的 L$ 帳戶餘額" value="L$20"/>
+ <text name="balance" tool_tip="點按以重新更新你的 L$ 帳戶餘額" value="L$??"/>
<button label="購買 L$" name="buyL" tool_tip="點按以購買更多 L$"/>
<button label="購物" name="goShop" tool_tip="打開第二人生購物市集"/>
</panel>
- <text name="TimeText" tool_tip="目前時區(太平洋)">
- 24:00 AM PST
- </text>
+ <text name="TimeText" tool_tip="目前時區(太平洋)">24:00 AM PST</text>
<button name="media_toggle_btn" tool_tip="開始/停止全部媒體(音樂、影片、網頁)"/>
<button name="volume_btn" tool_tip="全域音量控制"/>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_twitter_photo.xml b/indra/newview/skins/default/xui/zh/panel_twitter_photo.xml
index d015f4aa95..19eb23eac7 100644
--- a/indra/newview/skins/default/xui/zh/panel_twitter_photo.xml
+++ b/indra/newview/skins/default/xui/zh/panel_twitter_photo.xml
@@ -1,32 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_twitter_photo">
- <layout_stack name="stack_photo">
- <layout_panel name="text_panel">
- <text name="status_label">
- 說一說你正在做什麼
- </text>
- <text name="status_counter_label">
- 140
- </text>
- <check_box initial_value="true" label="加入所在位置" name="add_location_cb"/>
- <check_box initial_value="true" label="附上照片" name="add_photo_cb"/>
- </layout_panel>
- <layout_panel name="snapshot_panel">
- <combo_box name="resolution_combobox" tool_tip="圖像解析度">
- <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>
- <combo_box name="filters_combobox" tool_tip="圖像濾鏡">
- <combo_box.item label="不用濾鏡" name="NoFilter"/>
- </combo_box>
- <button label="刷新" name="new_snapshot_btn" tool_tip="點按即可刷新"/>
- <button label="預覽" name="big_preview_btn" tool_tip="點按即可切換預覽"/>
- </layout_panel>
- <layout_panel name="photo_button_panel">
- <button label="發到推特" name="post_photo_btn"/>
- <button label="取消" name="cancel_photo_btn"/>
- </layout_panel>
- </layout_stack>
+ <text name="status_label">
+ 說一說你正在做什麼
+ </text>
+ <text name="status_counter_label">
+ 140
+ </text>
+ <check_box initial_value="true" label="加入所在位置" name="add_location_cb"/>
+ <check_box initial_value="true" label="附上照片" name="add_photo_cb"/>
+ <combo_box name="resolution_combobox" tool_tip="圖像解析度">
+ <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>
+ <combo_box name="filters_combobox" tool_tip="圖像濾鏡">
+ <combo_box.item label="不用濾鏡" name="NoFilter"/>
+ </combo_box>
+ <button label="刷新" name="new_snapshot_btn" tool_tip="點按即可刷新"/>
+ <button label="預覽" name="big_preview_btn" tool_tip="點按即可切換預覽"/>
+ <button label="發到推特" name="post_photo_btn"/>
+ <button label="取消" name="cancel_photo_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/role_actions.xml b/indra/newview/skins/default/xui/zh/role_actions.xml
index 96f931f73f..0a3ef8c710 100755
--- a/indra/newview/skins/default/xui/zh/role_actions.xml
+++ b/indra/newview/skins/default/xui/zh/role_actions.xml
@@ -71,4 +71,8 @@
<action description="加入群組語音聊天" longdescription="身負具這能力的角色的成員,可以加入群組的語音聊天會話。 注意:欲加入語音聊天會話,需有「加入群組聊天」能力。" name="join voice chat" value="27"/>
<action description="適度成人內容的群組聊天" longdescription="身負具這能力的角色的成員,可以控制誰可加入群組語音和文字聊天會話。" name="moderate group chat" value="37"/>
</action_set>
+ <action_set description="這些能力包括修改本群組所擁有的體驗的權限" name="experience_tools_experience">
+ <action description="體驗管理" longdescription="擔任有此能力的角色的成員,可以編輯一個體驗的元資料。" name="experience admin" value="49"/>
+ <action description="體驗貢獻者" longdescription="擔任有此能力的角色的成員,可以為一個體驗貢獻腳本。" name="experience contributor" value="50"/>
+ </action_set>
</role_actions>
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 1b093e0ecd..9c5798d256 100755
--- a/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="item properties" title="物品檔案">
+ <panel.string name="loading_experience">
+ (載入中)
+ </panel.string>
<panel.string name="unknown">
(未知)
</panel.string>
@@ -43,17 +46,20 @@
<text name="LabelAcquiredTitle">
取得於:
</text>
+ <text name="LabelItemExperienceTitle">
+ 體驗:
+ </text>
<panel name="perms_inv">
<text name="perm_modify">
你可以:
</text>
<check_box label="修改" name="CheckOwnerModify"/>
- <check_box label="恚庨" name="CheckOwnerCopy"/>
+ <check_box label="複製" name="CheckOwnerCopy"/>
<check_box label="轉移" name="CheckOwnerTransfer"/>
<text name="AnyoneLabel">
任何人:
</text>
- <check_box label="恚庨" name="CheckEveryoneCopy"/>
+ <check_box label="複製" name="CheckEveryoneCopy"/>
<text name="GroupLabel">
群組:
</text>
@@ -62,12 +68,13 @@
下一個所有人:
</text>
<check_box label="修改" name="CheckNextOwnerModify"/>
- <check_box label="恚庨" name="CheckNextOwnerCopy"/>
+ <check_box label="複製" name="CheckNextOwnerCopy"/>
<check_box label="轉移" name="CheckNextOwnerTransfer" tool_tip="下一個所有人可贈送或轉售這個物件"/>
</panel>
<check_box label="出售" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
- <combo_box.item label="恚庨" name="Copy"/>
+ <combo_box name="ComboBoxSaleType">
+ <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"/>
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 60f44a3d88..0884f1789b 100755
--- a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml
@@ -1,71 +1,31 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="object properties" title="物件檔案">
- <panel.string name="text deed continued">
- 讓渡
- </panel.string>
- <panel.string name="text deed">
- 讓渡
- </panel.string>
- <panel.string name="text modify info 1">
- 你能修改這個物件
- </panel.string>
- <panel.string name="text modify info 2">
- 你能修改這些物件
- </panel.string>
- <panel.string name="text modify info 3">
- 你不能修改這個物件
- </panel.string>
- <panel.string name="text modify info 4">
- 你不能修改這些物件
- </panel.string>
- <panel.string name="text modify info 5">
- 無法跨地區修改這個物件
- </panel.string>
- <panel.string name="text modify info 6">
- 無法跨地區修改這些物件
- </panel.string>
- <panel.string name="text modify warning">
- 這個物件含有聯結的部分
- </panel.string>
- <panel.string name="Cost Default">
- 價格: L$
- </panel.string>
- <panel.string name="Cost Total">
- 總價:L$
- </panel.string>
- <panel.string name="Cost Per Unit">
- 單價:L$
- </panel.string>
- <panel.string name="Cost Mixed">
- 混合價格
- </panel.string>
- <panel.string name="Sale Mixed">
- 混合銷售
- </panel.string>
+ <panel.string name="text deed continued">讓渡</panel.string>
+ <panel.string name="text deed">讓渡</panel.string>
+ <panel.string name="text modify info 1">你能修改這個物件</panel.string>
+ <panel.string name="text modify info 2">你能修改這些物件</panel.string>
+ <panel.string name="text modify info 3">你不能修改這個物件</panel.string>
+ <panel.string name="text modify info 4">你不能修改這些物件</panel.string>
+ <panel.string name="text modify info 5">無法跨地區修改這個物件</panel.string>
+ <panel.string name="text modify info 6">無法跨地區修改這些物件</panel.string>
+ <panel.string name="text modify warning">這個物件含有聯結的部分</panel.string>
+ <panel.string name="Cost Default">價格: L$</panel.string>
+ <panel.string name="Cost Total">總價格:L$</panel.string>
+ <panel.string name="Cost Per Unit">單價:L$</panel.string>
+ <panel.string name="Cost Mixed">混合價格</panel.string>
+ <panel.string name="Sale Mixed">混合銷售</panel.string>
<text name="title" value="物件檔案"/>
<text name="where" value="(在虛擬世界)"/>
<panel label="" name="properties_panel">
- <text name="Name:">
- 名稱:
- </text>
- <text name="Description:">
- 描述:
- </text>
- <text name="CreatorNameLabel">
- 創造者:
- </text>
- <text name="Owner:">
- 所有人:
- </text>
- <text name="Group_label">
- 群組:
- </text>
+ <text name="Name:">名稱:</text>
+ <text name="Description:">描述:</text>
+ <text name="CreatorNameLabel">創造者:</text>
+ <text name="Owner:">所有人:</text>
+ <text name="Group_label">群組:</text>
<button name="button set group" tool_tip="選擇一個群組以分享這物件的權限"/>
<name_box initial_value="載入中..." name="Group Name Proxy"/>
<button label="讓渡" label_selected="讓渡" name="button deed" tool_tip="「讓渡」會把這物件贈送出去並賦予「下一個所有人」權限。 群組所分享的物件可由群組職員加以讓渡。"/>
- <text name="label click action">
- 點按以:
- </text>
+ <text name="label click action">點按以:</text>
<combo_box name="clickaction">
<combo_box.item label="觸碰(預設)" name="Touch/grab(default)"/>
<combo_box.item label="坐在物件上" name="Sitonobject"/>
@@ -75,21 +35,13 @@
<combo_box.item label="縮放" name="Zoom"/>
</combo_box>
<panel name="perms_inv">
- <text name="perm_modify">
- 你能修改這個物件
- </text>
- <text name="Anyone can:">
- 任何人:
- </text>
+ <text name="perm_modify">你能修改這個物件</text>
+ <text name="Anyone can:">任何人:</text>
<check_box label="恚庨" name="checkbox allow everyone copy"/>
<check_box label="移動" name="checkbox allow everyone move"/>
- <text name="GroupLabel">
- 群組:
- </text>
+ <text name="GroupLabel">群組:</text>
<check_box label="分享" name="checkbox share with group" tool_tip="允許此群組所有成員共享你修改此物件的權限。 你必須讓渡才能啟動角色限制。"/>
- <text name="NextOwnerLabel">
- 下一個所有人:
- </text>
+ <text name="NextOwnerLabel">下一個所有人:</text>
<check_box label="修改" name="checkbox next owner can modify"/>
<check_box label="恚庨" name="checkbox next owner can copy"/>
<check_box label="轉移" name="checkbox next owner can transfer" tool_tip="下一個所有人可贈送或轉售這個物件"/>
@@ -102,27 +54,13 @@
</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>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
+ <text name="pathfinding_attributes_label">尋徑屬性:</text>
+ <text name="B:">B:</text>
+ <text name="O:">O:</text>
+ <text name="G:">G:</text>
+ <text name="E:">E:</text>
+ <text name="N:">N:</text>
+ <text name="F:">F:</text>
</panel>
<panel name="button_panel">
<button label="打開" name="open_btn"/>
diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml
index ad2c331ee4..6493864b92 100755
--- a/indra/newview/skins/default/xui/zh/strings.xml
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -444,30 +444,51 @@ http://secondlife.com/viewer-access-faq
<string name="TooltipMustSingleDrop">
只有一個物品可以被拖曳到此處
</string>
+ <string name="TooltipTooManyWearables">
+ 你不能對含超過 [AMOUNT] 個物項的資料夾作穿戴動作。 欲變更此上限,可到「進階」&gt;「顯示除錯設定」&gt;「WearFolderLimit」。
+ </string>
<string name="TooltipPrice" value="L$[AMOUNT]:"/>
<string name="TooltipOutboxDragToWorld">
- 商家發件匣內的物項無法產生到虛擬世界
+ 你不能從 Marketplace 的刊登資料夾產生物件。
+ </string>
+ <string name="TooltipOutboxWorn">
+ 你不能把正在穿戴的物件放到 Marketplace 的刊登資料夾
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ 巢狀資料夾深度超過 [AMOUNT]。 請減少巢狀資料夾的深度,必要的話請把物件併整起來。
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ 子資料夾數目超過 [AMOUNT]。 請減少刊登的資料夾數目,必要的話請把物件併整起來。
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ 物件數目超過 [AMOUNT]。 若想在同一刊登中出售超過 [AMOUNT] 個物件,你需要把物件併整起來。
+ </string>
+ <string name="TooltipOutboxTooManyStockItems">
+ 限量物件數目超過 [AMOUNT]。
+ </string>
+ <string name="TooltipOutboxCannotDropOnRoot">
+ 你只能把物項或資料夾拖放到「所有」(ALL)頁籤 請選取該頁籤,再移動你的物項或資料夾。
</string>
<string name="TooltipOutboxNoTransfer">
- 至少一個物件無法出售或轉移。
+ 至少一個物件無法出售或轉移
</string>
<string name="TooltipOutboxNotInInventory">
- 你的商家發件匣只能接受直接來自收納區的物項。
+ 你只能將物件從收納區放到 Marketplace。
</string>
- <string name="TooltipOutboxWorn">
- 你穿著中的物項無法放入商家發件匣。
+ <string name="TooltipOutboxLinked">
+ 你不能把聯結的物件或資料夾放到 Marketplace
</string>
<string name="TooltipOutboxCallingCard">
- 名片不得放入商家發件匣
+ 你不能把名片放到 Marketplace
</string>
- <string name="TooltipOutboxFolderLevels">
- 巢狀資料夾深度超過 3
+ <string name="TooltipOutboxDragActive">
+ 已登出的刊登內容不得移動
</string>
- <string name="TooltipOutboxTooManyFolders">
- 頂層資料夾的子資料夾數目超過 20
+ <string name="TooltipOutboxCannotMoveRoot">
+ 你不能移動 Marketplace 刊登的根目錄
</string>
- <string name="TooltipOutboxTooManyObjects">
- 頂層資料夾物項數目超過 200
+ <string name="TooltipOutboxMixedStock">
+ 限量資料夾的所有物件必須是相同的類型和權限
</string>
<string name="TooltipDragOntoOwnChild">
資料夾不得移到其子資料夾底下
@@ -1052,9 +1073,7 @@ http://secondlife.com/viewer-access-faq
<string name="AgentNameSubst">
(你)
</string>
- <string name="JoinAnExperience">
- 加入體驗
- </string>
+ <string name="JoinAnExperience"/><!-- intentionally blank -->
<string name="SilentlyManageEstateAccess">
管理領出入許可名單時,不顯示警示
</string>
@@ -1121,6 +1140,12 @@ http://secondlife.com/viewer-access-faq
<string name="bitmap_image_files">
Bitmap 圖像
</string>
+ <string name="png_image_files">
+ PNG 圖像
+ </string>
+ <string name="save_texture_image_files">
+ Targa 或 PNG 圖像
+ </string>
<string name="avi_movie_file">
AVI 視頻檔案
</string>
@@ -1370,6 +1395,9 @@ http://secondlife.com/viewer-access-faq
<string name="FavoritesNoMatchingItems">
將一個地標拖曳到這裡,加進「我的最愛」。
</string>
+ <string name="MarketplaceNoMatchingItems">
+ 找不到物項。 請檢查搜尋字串的拼寫,再試一次。
+ </string>
<string name="InventoryNoTexture">
你的收納區裡沒有這個材質的副本
</string>
@@ -1417,29 +1445,95 @@ http://secondlife.com/viewer-access-faq
<string name="InventoryOutboxError">
[[MARKETPLACE_CREATE_STORE_URL] 購物市集商店]正傳回錯誤。
</string>
+ <string name="InventoryMarketplaceError">
+ 這功能尚在 Beta 測試階段。 如你想參與,請到這個[http://goo.gl/forms/FCQ7UXkakz Google 表單]填寫姓名。
+ </string>
+ <string name="InventoryMarketplaceListingsNoItemsTitle">
+ 你的 Marketplace 刊登資料夾是空的。
+ </string>
+ <string name="InventoryMarketplaceListingsNoItems">
+ 將資料夾拖曳到這個區域,即可在[[MARKETPLACE_DASHBOARD_URL] Marketplace]刊登出售。
+ </string>
+ <string name="Marketplace Validation Warning Stock">
+ 限量資料夾必須放在版本資料夾裡
+ </string>
+ <string name="Marketplace Validation Error Mixed Stock">
+ :錯誤:限量資料夾的所有物件必須是「禁止複製」且同一類型
+ </string>
+ <string name="Marketplace Validation Error Subfolder In Stock">
+ :錯誤:限量資料夾不得含有子資料夾
+ </string>
+ <string name="Marketplace Validation Warning Empty">
+ :警告:資料夾裡沒有東西
+ </string>
+ <string name="Marketplace Validation Warning Create Stock">
+ :警告:新建限量資料夾
+ </string>
+ <string name="Marketplace Validation Warning Create Version">
+ :警告:新建版本資料夾
+ </string>
+ <string name="Marketplace Validation Warning Move">
+ :警告:移動物項
+ </string>
+ <string name="Marketplace Validation Warning Delete">
+ :警告:資料夾內容已轉移到限量資料夾,空的資料夾已移除
+ </string>
+ <string name="Marketplace Validation Error Stock Item">
+ :錯誤:「禁止複製」物件必須放在限量資料夾裡
+ </string>
+ <string name="Marketplace Validation Warning Unwrapped Item">
+ :警告:物項必須放在一個版本資料夾裡
+ </string>
+ <string name="Marketplace Validation Error">
+ :錯誤:
+ </string>
+ <string name="Marketplace Validation Warning">
+ :警告:
+ </string>
+ <string name="Marketplace Validation Error Empty Version">
+ :警告:版本資料夾必須包含至少一個物項
+ </string>
+ <string name="Marketplace Validation Error Empty Stock">
+ :警告:限量資料夾必須包含至少一個物項
+ </string>
+ <string name="Marketplace Validation No Error">
+ 沒有需要報告的錯誤或警告
+ </string>
<string name="Marketplace Error None">
零錯誤
</string>
+ <string name="Marketplace Error Prefix">
+ 錯誤:
+ </string>
<string name="Marketplace Error Not Merchant">
- 發生錯誤:將物項送往第二人生購物市集之前,你必須取得商家的身份(免費)。
+ 將物件移到 Marketplace 前,你必須取得商家的身份(免費)。
</string>
- <string name="Marketplace Error Empty Folder">
- 錯誤:此資料夾沒有內容。
+ <string name="Marketplace Error Not Accepted">
+ 無法移動該資料夾的物項。
</string>
- <string name="Marketplace Error Unassociated Products">
- 錯誤:此物項上傳失敗,因為你的商家帳戶有太多和產品無關聯的物項。 要解決這個問題,請登入第二人生購物市集網站,減低你的無關聯物項數目。
+ <string name="Marketplace Error Unsellable Item">
+ 此物項無法在 Marketplace 出售。
</string>
- <string name="Marketplace Error Object Limit">
- 錯誤:此物項包含太多物件。 要解決這錯誤,請將物件裝箱,使總物件數目不超過 200。
+ <string name="MarketplaceNoID">
+ 沒有 Mkt ID
</string>
- <string name="Marketplace Error Folder Depth">
- 錯誤:此物項含有太多層的巢狀資料夾。 請加以重新整理,至多允許 3 層的巢狀資料夾。
+ <string name="MarketplaceLive">
+ 已刊登
</string>
- <string name="Marketplace Error Unsellable Item">
- 錯誤:此物項無法在第二人生購物市集出售。
+ <string name="MarketplaceActive">
+ 使用中
+ </string>
+ <string name="MarketplaceMax">
+ 最多
</string>
- <string name="Marketplace Error Internal Import">
- 錯誤:這個物項有問題。 請稍候再試一次。
+ <string name="MarketplaceStock">
+ 限量
+ </string>
+ <string name="MarketplaceNoStock">
+ 缺貨
+ </string>
+ <string name="MarketplaceUpdating">
+ 正在更新…
</string>
<string name="Open landmarks">
開啟地標
@@ -1460,6 +1554,7 @@ http://secondlife.com/viewer-access-faq
無內容
</string>
<string name="WornOnAttachmentPoint" value="(已穿 [ATTACHMENT_POINT])"/>
+ <string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/>
<string name="ActiveGesture" value="[GESLABEL](使用中)"/>
<string name="PermYes">
@@ -1730,6 +1825,15 @@ http://secondlife.com/viewer-access-faq
<string name="Invalid Attachment">
無效的附接點
</string>
+ <string name="ATTACHMENT_MISSING_ITEM">
+ 錯誤:缺少物件
+ </string>
+ <string name="ATTACHMENT_MISSING_BASE_ITEM">
+ 錯誤:缺少基本物項
+ </string>
+ <string name="ATTACHMENT_NOT_ATTACHED">
+ 錯誤:物件在目前的裝扮裡,可是卻未附著
+ </string>
<string name="YearsMonthsOld">
年齡:[AGEYEARS] 年 [AGEMONTHS] 月
</string>
@@ -1898,6 +2002,9 @@ http://secondlife.com/viewer-access-faq
<string name="SaveComplete">
儲存完畢。
</string>
+ <string name="UploadFailed">
+ 檔案上傳失敗:
+ </string>
<string name="ObjectOutOfRange">
腳本(物件超出範圍)
</string>
@@ -1907,6 +2014,9 @@ http://secondlife.com/viewer-access-faq
<string name="GroupsNone">
</string>
+ <string name="CompileNoExperiencePerm">
+ 略過體驗 [EXPERIENCE] 的腳本 [SCRIPT]。
+ </string>
<string name="Group" value="(群組)"/>
<string name="Unknown">
(未知)
@@ -4396,7 +4506,7 @@ http://secondlife.com/viewer-access-faq
女性姿勢
</string>
<string name="Other Gestures">
- 其他���勢
+ 其他姿勢
</string>
<string name="Speech Gestures">
演說姿勢
@@ -4658,7 +4768,7 @@ http://secondlife.com/viewer-access-faq
刪除所選取的物品?
</string>
<string name="DeleteItem">
- 刪除所選取的物���?
+ 刪除所選取的物品?
</string>
<string name="EmptyOutfitText">
沒有任何物品在這個裝扮內
@@ -5070,6 +5180,9 @@ http://secondlife.com/viewer-access-faq
<string name="Command_Marketplace_Label">
第二人生購物市集
</string>
+ <string name="Command_MarketplaceListings_Label">
+ Marketplace
+ </string>
<string name="Command_MiniMap_Label">
迷你地圖
</string>
@@ -5157,6 +5270,9 @@ http://secondlife.com/viewer-access-faq
<string name="Command_Marketplace_Tooltip">
前往購物
</string>
+ <string name="Command_MarketplaceListings_Tooltip">
+ 出售你的創作物
+ </string>
<string name="Command_MiniMap_Tooltip">
顯示附近的人
</string>
@@ -5280,4 +5396,85 @@ http://secondlife.com/viewer-access-faq
<string name="loading_chat_logs">
載入中…
</string>
+ <string name="experience_tools_experience">
+ 體驗
+ </string>
+ <string name="ExperienceNameNull">
+ (沒有體驗)
+ </string>
+ <string name="ExperienceNameUntitled">
+ (無名的體驗)
+ </string>
+ <string name="Land-Scope">
+ 土地範圍型
+ </string>
+ <string name="Grid-Scope">
+ 網格範圍型
+ </string>
+ <string name="Allowed_Experiences_Tab">
+ 准許
+ </string>
+ <string name="Blocked_Experiences_Tab">
+ 已封鎖的
+ </string>
+ <string name="Contrib_Experiences_Tab">
+ 貢獻者
+ </string>
+ <string name="Admin_Experiences_Tab">
+ 管理員
+ </string>
+ <string name="Recent_Experiences_Tab">
+ 最近
+ </string>
+ <string name="Owned_Experiences_Tab">
+ 擁有
+ </string>
+ <string name="ExperiencesCounter">
+ ([EXPERIENCES] 項,最多 [MAXEXPERIENCES] 項)
+ </string>
+ <string name="ExperiencePermission1">
+ 取得你的各項控制
+ </string>
+ <string name="ExperiencePermission3">
+ 對你的化身觸發動作
+ </string>
+ <string name="ExperiencePermission4">
+ 附著到你的化身
+ </string>
+ <string name="ExperiencePermission9">
+ 追蹤你的攝影機
+ </string>
+ <string name="ExperiencePermission10">
+ 控制你的攝影機
+ </string>
+ <string name="ExperiencePermission11">
+ 瞬間傳送你本人
+ </string>
+ <string name="ExperiencePermission12">
+ 自動接受各種體驗權限
+ </string>
+ <string name="ExperiencePermissionShortUnknown">
+ 進行了未知的操作:[Permission]
+ </string>
+ <string name="ExperiencePermissionShort1">
+ 取得控制
+ </string>
+ <string name="ExperiencePermissionShort3">
+ 觸發動作
+ </string>
+ <string name="ExperiencePermissionShort4">
+ 附著
+ </string>
+ <string name="ExperiencePermissionShort9">
+ 追蹤攝影機
+ </string>
+ <string name="ExperiencePermissionShort10">
+ 控制攝影機
+ </string>
+ <string name="ExperiencePermissionShort11">
+ 瞬間傳送
+ </string>
+ <string name="ExperiencePermissionShort12">
+ 權限
+ </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 37080a8d0c..61db294272 100755
--- a/indra/newview/skins/default/xui/zh/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/zh/teleport_strings.xml
@@ -48,6 +48,9 @@
<message name="MustGetAgeRegion">
你必須年滿 18 歲才可進入這地區。
</message>
+ <message name="RegionTPSpecialUsageBlocked">
+ 無法進入地區。 &apos;[REGION_NAME]&apos; 是個「技巧性博奕」(Skill Gaming)地區,你必須符合一定條件才可進入。 欲知詳情,請參閱 [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life 技巧性博奕常見問題集]。
+ </message>
</message_set>
<message_set name="progress">
<message name="sending_dest">
diff --git a/indra/newview/tests/llslurl_test.cpp b/indra/newview/tests/llslurl_test.cpp
index 2bc0d5a086..4694f657b6 100755
--- a/indra/newview/tests/llslurl_test.cpp
+++ b/indra/newview/tests/llslurl_test.cpp
@@ -39,7 +39,21 @@ namespace
static const char * const TEST_FILENAME("llslurl_test.xml");
}
-
+
+//
+// Stub implementation for LLTrans
+//
+class LLTrans
+{
+public:
+ static std::string getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args);
+};
+
+std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args)
+{
+ return std::string();
+}
+
//----------------------------------------------------------------------------
// Mock objects for the dependencies of the code we're testing
diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp
index 0eb0ab6500..e68da14fe9 100755
--- a/indra/newview/tests/llviewernetwork_test.cpp
+++ b/indra/newview/tests/llviewernetwork_test.cpp
@@ -38,6 +38,31 @@ namespace
static const char * const TEST_FILENAME("llviewernetwork_test.xml");
}
+
+//
+// Stub implementation for LLTrans
+//
+class LLTrans
+{
+public:
+ static std::string getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args);
+};
+
+std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args)
+{
+ std::string grid_label = std::string();
+ if(xml_desc == "AgniGridLabel")
+ {
+ grid_label = "Second Life Main Grid (Agni)";
+ }
+ else if(xml_desc == "AditiGridLabel")
+ {
+ grid_label = "Second Life Beta Test Grid (Aditi)";
+ }
+
+ return grid_label;
+}
+
//----------------------------------------------------------------------------
// Mock objects for the dependencies of the code we're testing
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 32cf9d3df6..cae6bded9f 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -387,9 +387,13 @@ class Windows_i686_Manifest(ViewerManifest):
if self.args['configuration'].lower() == 'debug':
self.path("msvcr120d.dll")
self.path("msvcp120d.dll")
+ self.path("msvcr100d.dll")
+ self.path("msvcp100d.dll")
else:
self.path("msvcr120.dll")
self.path("msvcp120.dll")
+ self.path("msvcr100.dll")
+ self.path("msvcp100.dll")
# Vivox runtimes
self.path("SLVoice.exe")