From 22a00c93b32cb0498c6c87712078971c7a9d70c8 Mon Sep 17 00:00:00 2001 From: Unexpectedly Dismantled <darl@alchemyviewer.org> Date: Thu, 20 May 2021 16:47:20 -0400 Subject: [PATCH] Initial port of integrated search from Alchemy classic The following file is placeholder from the port and broken: indra/newview/skins/default/xui/en/panel_profile_legacy_sidetray.xml Featuring work by: Cinder <cinder@sdf.org> Rye Mutt <rye@alchemyviewer.org> --- indra/newview/CMakeLists.txt | 134 +- .../newview/app_settings/settings_alchemy.xml | 22 + indra/newview/lleventnotifier.cpp | 23 +- indra/newview/lleventnotifier.h | 29 +- indra/newview/llfloaterdirectory.cpp | 1175 +++++++++++++++++ indra/newview/llfloaterdirectory.h | 115 ++ indra/newview/llpanelclassified.cpp | 4 +- indra/newview/llpaneleventinfo.cpp | 158 +++ indra/newview/llpaneleventinfo.h | 59 + indra/newview/llpanelsearchbase.cpp | 43 + indra/newview/llpanelsearchbase.h | 55 + indra/newview/llpanelsearchclassifieds.cpp | 109 ++ indra/newview/llpanelsearchclassifieds.h | 53 + indra/newview/llpanelsearchevents.cpp | 136 ++ indra/newview/llpanelsearchevents.h | 56 + indra/newview/llpanelsearchgroups.cpp | 98 ++ indra/newview/llpanelsearchgroups.h | 51 + indra/newview/llpanelsearchlandsales.cpp | 118 ++ indra/newview/llpanelsearchlandsales.h | 47 + indra/newview/llpanelsearchpeople.cpp | 87 ++ indra/newview/llpanelsearchpeople.h | 51 + indra/newview/llpanelsearchplaces.cpp | 113 ++ indra/newview/llpanelsearchplaces.h | 53 + indra/newview/llstartup.cpp | 13 + indra/newview/llviewerfloaterreg.cpp | 2 + .../skins/default/textures/icon_auction.tga | Bin 0 -> 1068 bytes .../skins/default/textures/icon_group.png | Bin 0 -> 484 bytes .../skins/default/textures/icon_place.tga | Bin 0 -> 1068 bytes .../skins/default/textures/textures.xml | 3 + .../default/xui/en/floater_directory.xml | 282 ++++ .../skins/default/xui/en/menu_viewer.xml | 10 + .../skins/default/xui/en/panel_event_info.xml | 456 +++++++ .../xui/en/panel_profile_legacy_sidetray.xml | 323 +++++ .../xui/en/panel_search_classifieds.xml | 111 ++ .../default/xui/en/panel_search_events.xml | 196 +++ .../default/xui/en/panel_search_groups.xml | 99 ++ .../default/xui/en/panel_search_landsales.xml | 181 +++ .../default/xui/en/panel_search_people.xml | 36 + .../default/xui/en/panel_search_places.xml | 111 ++ 39 files changed, 4546 insertions(+), 66 deletions(-) create mode 100644 indra/newview/llfloaterdirectory.cpp create mode 100644 indra/newview/llfloaterdirectory.h create mode 100644 indra/newview/llpaneleventinfo.cpp create mode 100644 indra/newview/llpaneleventinfo.h create mode 100644 indra/newview/llpanelsearchbase.cpp create mode 100644 indra/newview/llpanelsearchbase.h create mode 100644 indra/newview/llpanelsearchclassifieds.cpp create mode 100644 indra/newview/llpanelsearchclassifieds.h create mode 100644 indra/newview/llpanelsearchevents.cpp create mode 100644 indra/newview/llpanelsearchevents.h create mode 100644 indra/newview/llpanelsearchgroups.cpp create mode 100644 indra/newview/llpanelsearchgroups.h create mode 100644 indra/newview/llpanelsearchlandsales.cpp create mode 100644 indra/newview/llpanelsearchlandsales.h create mode 100644 indra/newview/llpanelsearchpeople.cpp create mode 100644 indra/newview/llpanelsearchpeople.h create mode 100644 indra/newview/llpanelsearchplaces.cpp create mode 100644 indra/newview/llpanelsearchplaces.h create mode 100644 indra/newview/skins/default/textures/icon_auction.tga create mode 100644 indra/newview/skins/default/textures/icon_group.png create mode 100644 indra/newview/skins/default/textures/icon_place.tga create mode 100644 indra/newview/skins/default/xui/en/floater_directory.xml create mode 100644 indra/newview/skins/default/xui/en/panel_event_info.xml create mode 100644 indra/newview/skins/default/xui/en/panel_profile_legacy_sidetray.xml create mode 100644 indra/newview/skins/default/xui/en/panel_search_classifieds.xml create mode 100644 indra/newview/skins/default/xui/en/panel_search_events.xml create mode 100644 indra/newview/skins/default/xui/en/panel_search_groups.xml create mode 100644 indra/newview/skins/default/xui/en/panel_search_landsales.xml create mode 100644 indra/newview/skins/default/xui/en/panel_search_people.xml create mode 100644 indra/newview/skins/default/xui/en/panel_search_places.xml diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index a0dfd9e2eca..7b9a4088e68 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -113,11 +113,11 @@ include_directories(SYSTEM ) set(viewer_SOURCE_FILES - alcinematicmode.cpp alaoengine.cpp alaoset.cpp alavataractions.cpp alchatcommand.cpp + alcinematicmode.cpp alcontrolcache.cpp alfloaterao.cpp alfloaterparticleeditor.cpp @@ -132,7 +132,6 @@ set(viewer_SOURCE_FILES alviewermenu.cpp groupchatlistener.cpp llaccountingcostmanager.cpp - llaisapi.cpp llagent.cpp llagentaccess.cpp llagentbenefits.cpp @@ -144,6 +143,7 @@ set(viewer_SOURCE_FILES llagentpilot.cpp llagentui.cpp llagentwearables.cpp + llaisapi.cpp llanimstatelabels.cpp llappcorehttp.cpp llappearancemgr.cpp @@ -156,9 +156,9 @@ set(viewer_SOURCE_FILES llavatariconctrl.cpp llavatarlist.cpp llavatarlistitem.cpp + llavatarpropertiesprocessor.cpp llavatarrenderinfoaccountant.cpp llavatarrendernotifier.cpp - llavatarpropertiesprocessor.cpp llblockedlistitem.cpp llblocklist.cpp llbox.cpp @@ -196,8 +196,8 @@ set(viewer_SOURCE_FILES lldeferredsounds.cpp lldelayedgestureerror.cpp lldirpicker.cpp - lldonotdisturbnotificationstorage.cpp lldndbutton.cpp + lldonotdisturbnotificationstorage.cpp lldrawable.cpp lldrawpool.cpp lldrawpoolalpha.cpp @@ -230,7 +230,6 @@ set(viewer_SOURCE_FILES llflexibleobject.cpp llfloaterabout.cpp llfloaterassetrecovery.cpp - llfloaterbvhpreview.cpp llfloaterauction.cpp llfloaterautoreplacesettings.cpp llfloateravatar.cpp @@ -248,6 +247,7 @@ set(viewer_SOURCE_FILES llfloaterbuycurrency.cpp llfloaterbuycurrencyhtml.cpp llfloaterbuyland.cpp + llfloaterbvhpreview.cpp llfloatercamera.cpp llfloatercamerapresets.cpp llfloaterchatalerts.cpp @@ -257,6 +257,7 @@ set(viewer_SOURCE_FILES llfloaterconversationpreview.cpp llfloaterdeleteprefpreset.cpp llfloaterdestinations.cpp + llfloaterdirectory.cpp llfloaterdisplayname.cpp llfloatereditenvironmentbase.cpp llfloatereditextdaycycle.cpp @@ -280,9 +281,12 @@ set(viewer_SOURCE_FILES llfloaterhoverheight.cpp llfloaterhud.cpp llfloaterimagepreview.cpp - llfloaterimsessiontab.cpp - llfloaterimsession.cpp llfloaterimcontainer.cpp + llfloaterimnearbychat.cpp + llfloaterimnearbychathandler.cpp + llfloaterimnearbychatlistener.cpp + llfloaterimsession.cpp + llfloaterimsessiontab.cpp llfloaterinspect.cpp llfloaterjoystick.cpp llfloaterlagmeter.cpp @@ -290,21 +294,21 @@ set(viewer_SOURCE_FILES llfloaterlandholdings.cpp llfloaterlinkreplace.cpp llfloaterloadprefpreset.cpp - llfloatermarketplacelistings.cpp llfloatermap.cpp + llfloatermarketplacelistings.cpp llfloatermediasettings.cpp llfloatermemleak.cpp llfloatermodelpreview.cpp llfloatermodeluploadbase.cpp - llfloatermyscripts.cpp llfloatermyenvironment.cpp + llfloatermyscripts.cpp llfloaternamedesc.cpp llfloaternotificationsconsole.cpp llfloaternotificationstabbed.cpp - llfloateroutfitphotopreview.cpp - llfloateroutfitsnapshot.cpp llfloaterobjectweights.cpp llfloateropenobject.cpp + llfloateroutfitphotopreview.cpp + llfloateroutfitsnapshot.cpp llfloaterpathfindingcharacters.cpp llfloaterpathfindingconsole.cpp llfloaterpathfindinglinksets.cpp @@ -312,15 +316,15 @@ set(viewer_SOURCE_FILES llfloaterpay.cpp llfloaterperms.cpp llfloaterpostprocess.cpp - llfloaterprofile.cpp llfloaterpreference.cpp llfloaterpreferenceviewadvanced.cpp llfloaterpreviewtrash.cpp + llfloaterprofile.cpp llfloaterproperties.cpp llfloaterregiondebugconsole.cpp llfloaterregioninfo.cpp - llfloaterreporter.cpp llfloaterregionrestarting.cpp + llfloaterreporter.cpp llfloatersavecamerapreset.cpp llfloatersaveprefpreset.cpp llfloatersceneloadstats.cpp @@ -352,10 +356,10 @@ set(viewer_SOURCE_FILES llfloaterwhitelistentry.cpp llfloaterwindowsize.cpp llfloaterworldmap.cpp + llflyoutcombobtn.cpp llfolderviewmodelinventory.cpp llfollowcam.cpp llfriendcard.cpp - llflyoutcombobtn.cpp llgesturelistener.cpp llgesturemgr.cpp llgiveinventory.cpp @@ -363,17 +367,17 @@ set(viewer_SOURCE_FILES llgroupactions.cpp llgroupiconctrl.cpp llgrouplist.cpp - llgroupoptions.cpp llgroupmgr.cpp + llgroupoptions.cpp llhasheduniqueid.cpp llhints.cpp llhttpretrypolicy.cpp llhudeffect.cpp llhudeffectbeam.cpp + llhudeffectblob.cpp llhudeffectlookat.cpp llhudeffectpointat.cpp llhudeffecttrail.cpp - llhudeffectblob.cpp llhudicon.cpp llhudmanager.cpp llhudnametag.cpp @@ -437,9 +441,6 @@ set(viewer_SOURCE_FILES llnameeditor.cpp llnamelistctrl.cpp llnavigationbar.cpp - llfloaterimnearbychat.cpp - llfloaterimnearbychathandler.cpp - llfloaterimnearbychatlistener.cpp llnetmap.cpp llnotificationalerthandler.cpp llnotificationgrouphandler.cpp @@ -453,8 +454,8 @@ set(viewer_SOURCE_FILES llnotificationstorage.cpp llnotificationtiphandler.cpp lloutfitgallery.cpp - lloutfitslist.cpp lloutfitobserver.cpp + lloutfitslist.cpp lloutputmonitorctrl.cpp llpanelappearancetab.cpp llpanelavatar.cpp @@ -466,6 +467,7 @@ set(viewer_SOURCE_FILES llpaneleditwater.cpp llpaneleditwearable.cpp llpanelenvironment.cpp + llpaneleventinfo.cpp llpanelexperiencelisteditor.cpp llpanelexperiencelog.cpp llpanelexperiencepicker.cpp @@ -473,9 +475,9 @@ set(viewer_SOURCE_FILES llpanelface.cpp llpanelgenerictip.cpp llpanelgroup.cpp - llpanelgroupcreate.cpp llpanelgroupbulk.cpp llpanelgroupbulkban.cpp + llpanelgroupcreate.cpp llpanelgroupexperiences.cpp llpanelgroupgeneral.cpp llpanelgroupinvite.cpp @@ -516,6 +518,14 @@ set(viewer_SOURCE_FILES llpanelprofile.cpp llpanelprofileclassifieds.cpp llpanelprofilepicks.cpp + llpanelpulldown.cpp + llpanelsearchbase.cpp + llpanelsearchclassifieds.cpp + llpanelsearchevents.cpp + llpanelsearchgroups.cpp + llpanelsearchlandsales.cpp + llpanelsearchpeople.cpp + llpanelsearchplaces.cpp llpanelsnapshot.cpp llpanelsnapshotinventory.cpp llpanelsnapshotlocal.cpp @@ -524,10 +534,9 @@ set(viewer_SOURCE_FILES llpanelsnapshotprofile.cpp llpanelteleporthistory.cpp llpaneltiptoast.cpp - llpanelvoiceeffect.cpp llpaneltopinfobar.cpp - llpanelpulldown.cpp llpanelvoicedevicesettings.cpp + llpanelvoiceeffect.cpp llpanelvolume.cpp llpanelvolumepulldown.cpp llpanelwearing.cpp @@ -549,9 +558,9 @@ set(viewer_SOURCE_FILES llphysicsmotion.cpp llphysicsshapebuilderutil.cpp llpipelinelistener.cpp + llplacesfolderview.cpp llplacesinventorybridge.cpp llplacesinventorypanel.cpp - llplacesfolderview.cpp llpopupview.cpp llpostcard.cpp llpresetsmanager.cpp @@ -629,8 +638,8 @@ set(viewer_SOURCE_FILES lltoastimpanel.cpp lltoastnotifypanel.cpp lltoastpanel.cpp - lltoastscripttextbox.cpp lltoastscriptquestion.cpp + lltoastscripttextbox.cpp lltool.cpp lltoolbarview.cpp lltoolbrush.cpp @@ -686,15 +695,15 @@ set(viewer_SOURCE_FILES llviewerhelp.cpp llviewerhelputil.cpp llviewerhome.cpp + llviewerinput.cpp llviewerinventory.cpp llviewerjoint.cpp llviewerjointattachment.cpp llviewerjointmesh.cpp llviewerjoystick.cpp - llviewerinput.cpp llviewerlayer.cpp - llviewermedia.cpp llviewermedia_streamingaudio.cpp + llviewermedia.cpp llviewermediafocus.cpp llviewermenu.cpp llviewermenufile.cpp @@ -723,7 +732,7 @@ set(viewer_SOURCE_FILES llviewerwearable.cpp llviewerwindow.cpp llviewerwindowlistener.cpp - llvisualeffect.cpp + llvisualeffect.cpp llvlcomposition.cpp llvlmanager.cpp llvoavatar.cpp @@ -755,16 +764,16 @@ set(viewer_SOURCE_FILES llworld.cpp llworldmap.cpp llworldmapmessage.cpp - llworldmipmap.cpp llworldmapview.cpp + llworldmipmap.cpp llxmlrpclistener.cpp llxmlrpctransaction.cpp noise.cpp pipeline.cpp rlvactions.cpp - rlvenvironment.cpp rlvcommon.cpp rlveffects.cpp + rlvenvironment.cpp rlvextensions.cpp rlvfloaters.cpp rlvhandler.cpp @@ -780,11 +789,11 @@ set(VIEWER_BINARY_NAME "alchemy-bin" CACHE STRING set(viewer_HEADER_FILES CMakeLists.txt ViewerInstall.cmake - alcinematicmode.h alaoengine.h alaoset.h alavataractions.h alchatcommand.h + alcinematicmode.h alcontrolcache.h alfloaterao.h alfloaterparticleeditor.h @@ -800,7 +809,6 @@ set(viewer_HEADER_FILES groupchatlistener.h llaccountingcost.h llaccountingcostmanager.h - llaisapi.h llagent.h llagentaccess.h llagentbenefits.h @@ -812,6 +820,7 @@ set(viewer_HEADER_FILES llagentpilot.h llagentui.h llagentwearables.h + llaisapi.h llanimstatelabels.h llappcorehttp.h llappearance.h @@ -865,15 +874,15 @@ set(viewer_HEADER_FILES lldeferredsounds.h lldelayedgestureerror.h lldirpicker.h - lldonotdisturbnotificationstorage.h lldndbutton.h + lldonotdisturbnotificationstorage.h lldrawable.h lldrawpool.h lldrawpoolalpha.h lldrawpoolavatar.h lldrawpoolbump.h - lldrawpoolmaterials.h lldrawpoolground.h + lldrawpoolmaterials.h lldrawpoolsimple.h lldrawpoolsky.h lldrawpoolterrain.h @@ -899,7 +908,6 @@ set(viewer_HEADER_FILES llflexibleobject.h llfloaterabout.h llfloaterassetrecovery.h - llfloaterbvhpreview.h llfloaterauction.h llfloaterautoreplacesettings.h llfloateravatar.h @@ -917,8 +925,9 @@ set(viewer_HEADER_FILES llfloaterbuycurrency.h llfloaterbuycurrencyhtml.h llfloaterbuyland.h - llfloatercamerapresets.h + llfloaterbvhpreview.h llfloatercamera.h + llfloatercamerapresets.h llfloaterchatalerts.h llfloaterchatvoicevolume.h llfloatercolorpicker.h @@ -926,6 +935,7 @@ set(viewer_HEADER_FILES llfloaterconversationpreview.h llfloaterdeleteprefpreset.h llfloaterdestinations.h + llfloaterdirectory.h llfloaterdisplayname.h llfloatereditenvironmentbase.h llfloatereditextdaycycle.h @@ -949,12 +959,12 @@ set(viewer_HEADER_FILES llfloaterhoverheight.h llfloaterhud.h llfloaterimagepreview.h + llfloaterimcontainer.h llfloaterimnearbychat.h llfloaterimnearbychathandler.h llfloaterimnearbychatlistener.h - llfloaterimsessiontab.h llfloaterimsession.h - llfloaterimcontainer.h + llfloaterimsessiontab.h llfloaterinspect.h llfloaterjoystick.h llfloaterlagmeter.h @@ -968,15 +978,15 @@ set(viewer_HEADER_FILES llfloatermemleak.h llfloatermodelpreview.h llfloatermodeluploadbase.h - llfloatermyscripts.h llfloatermyenvironment.h + llfloatermyscripts.h llfloaternamedesc.h llfloaternotificationsconsole.h llfloaternotificationstabbed.h - llfloateroutfitphotopreview.h - llfloateroutfitsnapshot.h llfloaterobjectweights.h llfloateropenobject.h + llfloateroutfitphotopreview.h + llfloateroutfitsnapshot.h llfloaterpathfindingcharacters.h llfloaterpathfindingconsole.h llfloaterpathfindinglinksets.h @@ -984,15 +994,15 @@ set(viewer_HEADER_FILES llfloaterpay.h llfloaterperms.h llfloaterpostprocess.h - llfloaterprofile.h llfloaterpreference.h llfloaterpreferenceviewadvanced.h llfloaterpreviewtrash.h + llfloaterprofile.h llfloaterproperties.h llfloaterregiondebugconsole.h llfloaterregioninfo.h - llfloaterreporter.h llfloaterregionrestarting.h + llfloaterreporter.h llfloatersavecamerapreset.h llfloatersaveprefpreset.h llfloatersceneloadstats.h @@ -1024,27 +1034,27 @@ set(viewer_HEADER_FILES llfloaterwhitelistentry.h llfloaterwindowsize.h llfloaterworldmap.h + llflyoutcombobtn.h llfolderviewmodelinventory.h llfollowcam.h llfriendcard.h - llflyoutcombobtn.h llgesturelistener.h llgesturemgr.h llgiveinventory.h llgroupactions.h llgroupiconctrl.h llgrouplist.h - llgroupoptions.h llgroupmgr.h + llgroupoptions.h llhasheduniqueid.h llhints.h llhttpretrypolicy.h llhudeffect.h llhudeffectbeam.h + llhudeffectblob.h llhudeffectlookat.h llhudeffectpointat.h llhudeffecttrail.h - llhudeffectblob.h llhudicon.h llhudmanager.h llhudnametag.h @@ -1114,8 +1124,8 @@ set(viewer_HEADER_FILES llnotificationmanager.h llnotificationstorage.h lloutfitgallery.h - lloutfitslist.h lloutfitobserver.h + lloutfitslist.h lloutputmonitorctrl.h llpanelappearancetab.h llpanelavatar.h @@ -1127,6 +1137,7 @@ set(viewer_HEADER_FILES llpaneleditwater.h llpaneleditwearable.h llpanelenvironment.h + llpaneleventinfo.h llpanelexperiencelisteditor.h llpanelexperiencelog.h llpanelexperiencepicker.h @@ -1134,10 +1145,10 @@ set(viewer_HEADER_FILES llpanelface.h llpanelgenerictip.h llpanelgroup.h - llpanelgroupcreate.h llpanelgroupbulk.h - llpanelgroupbulkimpl.h llpanelgroupbulkban.h + llpanelgroupbulkimpl.h + llpanelgroupcreate.h llpanelgroupexperiences.h llpanelgroupgeneral.h llpanelgroupinvite.h @@ -1178,13 +1189,20 @@ set(viewer_HEADER_FILES llpanelprofile.h llpanelprofileclassifieds.h llpanelprofilepicks.h + llpanelpulldown.h + llpanelsearchbase.h + llpanelsearchclassifieds.h + llpanelsearchevents.h + llpanelsearchgroups.h + llpanelsearchlandsales.h + llpanelsearchpeople.h + llpanelsearchplaces.h llpanelsnapshot.h llpanelteleporthistory.h llpaneltiptoast.h - llpanelpulldown.h + llpaneltopinfobar.h llpanelvoicedevicesettings.h llpanelvoiceeffect.h - llpaneltopinfobar.h llpanelvolume.h llpanelvolumepulldown.h llpanelwearing.h @@ -1206,9 +1224,9 @@ set(viewer_HEADER_FILES llphysicsmotion.h llphysicsshapebuilderutil.h llpipelinelistener.h + llplacesfolderview.h llplacesinventorybridge.h llplacesinventorypanel.h - llplacesfolderview.h llpopupview.h llpostcard.h llpresetsmanager.h @@ -1290,8 +1308,8 @@ set(viewer_HEADER_FILES lltoastimpanel.h lltoastnotifypanel.h lltoastpanel.h - lltoastscripttextbox.h lltoastscriptquestion.h + lltoastscripttextbox.h lltool.h lltoolbarview.h lltoolbrush.h @@ -1316,8 +1334,8 @@ set(viewer_HEADER_FILES lltransientdockablefloater.h lltransientfloatermgr.h lltranslate.h - lluiconstants.h lluiavatar.h + lluiconstants.h lluilistener.h lluploaddialog.h lluploadfloaterobservers.h @@ -1348,15 +1366,15 @@ set(viewer_HEADER_FILES llviewergesture.h llviewerhelp.h llviewerhome.h + llviewerinput.h llviewerinventory.h llviewerjoint.h llviewerjointattachment.h llviewerjointmesh.h llviewerjoystick.h - llviewerinput.h llviewerlayer.h - llviewermedia.h llviewermedia_streamingaudio.h + llviewermedia.h llviewermediafocus.h llviewermediaobserver.h llviewermenu.h @@ -1387,7 +1405,7 @@ set(viewer_HEADER_FILES llviewerwearable.h llviewerwindow.h llviewerwindowlistener.h - llvisualeffect.h + llvisualeffect.h llvlcomposition.h llvlmanager.h llvoavatar.h @@ -1418,8 +1436,8 @@ set(viewer_HEADER_FILES llworld.h llworldmap.h llworldmapmessage.h - llworldmipmap.h llworldmapview.h + llworldmipmap.h llxmlrpclistener.h llxmlrpctransaction.h macmain.h diff --git a/indra/newview/app_settings/settings_alchemy.xml b/indra/newview/app_settings/settings_alchemy.xml index 655c8c0556e..092deddd578 100644 --- a/indra/newview/app_settings/settings_alchemy.xml +++ b/indra/newview/app_settings/settings_alchemy.xml @@ -255,6 +255,28 @@ <key>Value</key> <integer>0</integer> </map> + <key>AlchemyFindLandSort</key> + <map> + <key>Comment</key> + <string>Controls the sort order for land you are searching for ("Name", "Price", "PPM", "Area")</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>Name</string> + </map> + <key>AlchemyFindLandSortAscending</key> + <map> + <key>Comment</key> + <string>Controls whether the sort order for land you are searching for is displayed in ascending or descending order</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <string>0</string> + </map> <key>AlchemyHudTextFadeDistance</key> <map> <key>Comment</key> diff --git a/indra/newview/lleventnotifier.cpp b/indra/newview/lleventnotifier.cpp index e3c17f98777..7e05d6af86f 100644 --- a/indra/newview/lleventnotifier.cpp +++ b/indra/newview/lleventnotifier.cpp @@ -163,11 +163,12 @@ bool LLEventNotifier::handleResponse(U32 eventId, const LLSD& notification, cons return true; } -bool LLEventNotifier::add(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName) +bool LLEventNotifier::add(const LLEventStruct& event) { - LLEventNotification *new_enp = new LLEventNotification(eventId, eventEpoch, eventDateStr, eventName); + if (mNewEventSignal(event)) return false; + LLEventNotification *new_enp = new LLEventNotification(event.eventId, event.eventEpoch, event.eventDateStr, event.eventName); - LL_INFOS() << "Add event " << eventName << " id " << eventId << " date " << eventDateStr << LL_ENDL; + LL_INFOS() << "Add event " << event.eventName << " id " << event.eventId << " date " << event.eventDateStr << LL_ENDL; if(!new_enp->isValid()) { delete new_enp; @@ -208,7 +209,18 @@ void LLEventNotifier::processEventInfoReply(LLMessageSystem *msg, void **) msg->getString("EventData", "Date", eventd_date); msg->getU32("EventData", "DateUTC", event_time_utc); - gEventNotifier.add(event_id, (F64)event_time_utc, eventd_date, event_name); + LLEventStruct event(event_id, (F64)event_time_utc, eventd_date, event_name); + msg->getString("EventData", "Creator", event.creator); + msg->getString("EventData", "Category", event.category); + msg->getString("EventData", "Desc", event.desc); + msg->getU32("EventData", "Duration", event.duration); + msg->getU32("EventData", "Cover", event.cover); + msg->getU32("EventData", "Amount", event.amount); + msg->getString("EventData", "SimName", event.simName); + msg->getVector3d("EventData", "GlobalPos", event.globalPos); + msg->getU32("EventData", "EventFlags", event.flags); + + gEventNotifier.add(event); } @@ -219,7 +231,8 @@ void LLEventNotifier::load(const LLSD& event_options) { LLSD response = *resp_it; - add(response["event_id"].asInteger(), response["event_date_ut"], response["event_date"].asString(), response["event_name"].asString()); + LLEventStruct event(response["event_id"].asInteger(), response["event_date_ut"], response["event_date"].asString(), response["event_name"].asString()); + add(event); } } diff --git a/indra/newview/lleventnotifier.h b/indra/newview/lleventnotifier.h index 3fee46c2f67..ca6b286bab1 100644 --- a/indra/newview/lleventnotifier.h +++ b/indra/newview/lleventnotifier.h @@ -33,6 +33,24 @@ class LLEventNotification; class LLMessageSystem; +typedef struct event_st{ + U32 eventId; + F64 eventEpoch; + std::string eventDateStr; + std::string eventName; + std::string creator; + std::string category; + std::string desc; + U32 duration; + U32 cover; + U32 amount; + std::string simName; + LLVector3d globalPos; + U32 flags; + event_st(U32 id, F64 epoch, const std::string& date_str, const std::string& name) + : eventId(id), eventEpoch(epoch), eventDateStr(date_str), eventName(name){} + event_st(){} +} LLEventStruct; class LLEventNotifier { @@ -41,7 +59,7 @@ class LLEventNotifier virtual ~LLEventNotifier(); void update(); // Notify the user of the event if it's coming up - bool add(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName); + bool add(const LLEventStruct& event); void add(U32 eventId); @@ -54,7 +72,14 @@ class LLEventNotifier typedef std::map<U32, LLEventNotification *> en_map; bool handleResponse(U32 eventId, const LLSD& notification, const LLSD& response); - static void processEventInfoReply(LLMessageSystem *msg, void **); + static void processEventInfoReply(LLMessageSystem *msg, void **); + + typedef boost::signals2::signal<bool(LLEventStruct event)> new_event_signal_t; + new_event_signal_t mNewEventSignal; + boost::signals2::connection setNewEventCallback(const new_event_signal_t::slot_type& cb) + { + return mNewEventSignal.connect(cb); + }; protected: en_map mEventNotifications; diff --git a/indra/newview/llfloaterdirectory.cpp b/indra/newview/llfloaterdirectory.cpp new file mode 100644 index 00000000000..a1daf5b066e --- /dev/null +++ b/indra/newview/llfloaterdirectory.cpp @@ -0,0 +1,1175 @@ +/* + * @file llfloaterdirectory.cpp + * @brief Legacy search facility + * + * Copyright (c) 2014, Cinder Roxley <cinder@sdf.org> + * + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (the "Software") to use, reproduce, display, distribute, + * execute, and transmit the Software, and to prepare derivative works of the + * Software, and to permit third-parties to whom the Software is furnished to + * do so, all subject to the following: + * + * The copyright notices in the Software and this entire statement, including + * the above license grant, this restriction and the following disclaimer, + * must be included in all copies of the Software, in whole or in part, and + * all derivative works of the Software, unless such copies or derivative + * works are solely in the form of machine-executable object code generated by + * a source language processor. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#include "llviewerprecompiledheaders.h" +#include "llfloaterdirectory.h" + +// llmessage +#include "lleventflags.h" +#include "llqueryflags.h" +#include "message.h" + +// llui +#include "llfloaterreg.h" +#include "llpanel.h" +#include "llresmgr.h" +#include "llscrolllistctrl.h" +#include "lltextbase.h" +#include "lltrans.h" + +// newview +#include "llagent.h" +#include "llpanelsearchbase.h" +#include "llpanelplaces.h" +#include "llproductinforequest.h" + +bool filterShortWords(std::string query_string); + +static const std::array<std::string, 6> sSearchPanels{ {"panel_search_people", "panel_search_groups", "panel_search_places", "panel_search_classifieds", "panel_search_events", "panel_search_landsales"} }; +static const std::array<std::string, 5> sDetailPanels{ {"detail_avatar", "detail_group", "detail_place", "detail_classified", "detail_event"} }; + +LLFloaterDirectory::LLFloaterDirectory(const LLSD& key) +: LLFloater(key) +, mQueryID(LLUUID()) +, mResultStart(0) +, mNumResultsReceived(0) +, mResultList(NULL) +, mCurrentQuery() +, mCurrentResultType(SE_UNDEFINED) +, mRemoteParcelObserver(NULL) +{ + mCommitCallbackRegistrar.add("Search.Page", boost::bind(&LLFloaterDirectory::choosePage, this, _2)); +} + +LLFloaterDirectory::~LLFloaterDirectory() +{ +} + +BOOL LLFloaterDirectory::postBuild() +{ + mResultList = getChild<LLScrollListCtrl>("results"); + mResultList->setCommitCallback(boost::bind(&LLFloaterDirectory::onCommitSelection, this)); + for (std::string panel_name: sSearchPanels) + { + LLPanelSearch* panel = static_cast<LLPanelSearch*>(getChild<LLUICtrl>(panel_name)); + panel->setSearchFloater(this); + } + setProgress(false); + mResultsStatus = getChild<LLTextBase>("results_status"); + showDetailPanel(LLStringUtil::null); // hide all the panels + paginate(); + return TRUE; +} + +void LLFloaterDirectory::setProgress(bool working) +{ + getChild<LLUICtrl>("loading")->setVisible(working); +} + +void LLFloaterDirectory::setResultsComment(const std::string& message) +{ + mResultList->setCommentText(message); +} + +void LLFloaterDirectory::onCommitSelection() +{ + switch (mCurrentResultType) + { + case SE_PEOPLE: + { + LLSD params; + params["avatar_id"] = mResultList->getSelectedValue().asUUID(); + getChild<LLPanel>("detail_avatar")->onOpen(params); + showDetailPanel("detail_avatar"); + break; + } + case SE_GROUPS: + { + LLSD params; + params["group_id"] = mResultList->getSelectedValue().asUUID(); + getChild<LLPanel>("detail_group")->onOpen(params); + showDetailPanel("detail_group"); + break; + } + case SE_LANDSALES: + case SE_PLACES: + { + LLSD params; + params["type"] = "remote_place"; + params["id"] = mResultList->getSelectedValue().asUUID(); + getChild<LLPanel>("detail_place")->onOpen(params); + showDetailPanel("detail_place"); + break; + } + case SE_CLASSIFIEDS: + { + LLSD params; + params["classified_id"] = mResultList->getSelectedValue().asUUID(); + getChild<LLPanel>("detail_classified")->onOpen(params); + showDetailPanel("detail_classified"); + break; + } + case SE_EVENTS: + { + getChild<LLPanel>("detail_event")->onOpen(mResultList->getSelectedValue().asInteger()); + showDetailPanel("detail_event"); + break; + } + case SE_UNDEFINED: + default: + LL_WARNS("Search") << "Unhandled search mode: " << mCurrentResultType << LL_ENDL; + break; + } +} + +void LLFloaterDirectory::paginate() +{ + if (mNumResultsReceived) + { + LLStringUtil::format_map_t args; + std::string total_str; + LLResMgr::getInstance()->getIntegerString(total_str, mResultStart + mNumResultsReceived - 1); + args["TOTAL"] = total_str; + args["VISIBLE_END"] = total_str; + total_str = LLStringUtil::null; + LLResMgr::getInstance()->getIntegerString(total_str, mResultStart + 1); + args["VISIBLE_BEGIN"] = total_str; + mResultsStatus->setText(getString((mNumResultsReceived > mCurrentQuery.results_per_page) + ? "result_spillover" : "result_count", + args)); + } + else + mResultsStatus->setText(getString("no_results")); + childSetEnabled("PageUp", mNumResultsReceived > mCurrentQuery.results_per_page); + childSetEnabled("PageDn", mResultStart > 0); +} + +void LLFloaterDirectory::choosePage(const LLSD& userdata) +{ + const std::string command = userdata.asString(); + if (command == "forward") + mResultStart += mCurrentQuery.results_per_page; + else if (command == "back") + mResultStart -= mCurrentQuery.results_per_page; + else + { + LL_WARNS("Search") << "Unhandled command: " << command << LL_ENDL; + return; // Fuck you, you lose. + } + queryDirectory(mCurrentQuery, false); +} + +void LLFloaterDirectory::showDetailPanel(const std::string& panel_name) +{ + for (const std::string& panel_itr: sDetailPanels) + { + childSetVisible(panel_itr, panel_itr == panel_name); + } +} + +void LLFloaterDirectory::rebuildResultList() +{ + mResultList->clearColumns(); + switch (mCurrentResultType) + { + case SE_PEOPLE: + { + LLScrollListColumn::Params icon; + icon.name = "icon"; + icon.width.pixel_width = 20; + mResultList->addColumn(icon); + + LLScrollListColumn::Params name; + name.name = "name"; + name.header.label = "Name"; + name.width.relative_width = 1.f; + mResultList->addColumn(name); + break; + } + case SE_GROUPS: + { + LLScrollListColumn::Params icon; + icon.name = "icon"; + icon.width.pixel_width = 20; + mResultList->addColumn(icon); + + LLScrollListColumn::Params name; + name.name = "name"; + name.header.label = "Name"; + name.width.relative_width = 0.72f; + mResultList->addColumn(name); + + LLScrollListColumn::Params members; + members.name = "members"; + members.header.label = "Members"; + members.width.relative_width = 0.25f; + mResultList->addColumn(members); + + LLScrollListColumn::Params score; + score.name = "score"; + score.header.label = "Score"; + score.width.relative_width = 0.03f; + mResultList->addColumn(score); + break; + } + case SE_PLACES: + { + LLScrollListColumn::Params icon; + icon.name = "icon"; + icon.width.pixel_width = 20; + mResultList->addColumn(icon); + + LLScrollListColumn::Params name; + name.name = "name"; + name.header.label = "Name"; + name.width.relative_width = 0.81f; + mResultList->addColumn(name); + + LLScrollListColumn::Params dwell; + dwell.name = "dwell"; + dwell.header.label = "Traffic"; + dwell.width.relative_width = 0.19f; + mResultList->addColumn(dwell); + break; + } + case SE_LANDSALES: + { + LLScrollListColumn::Params icon; + icon.name = "icon"; + icon.width.pixel_width = 20; + mResultList->addColumn(icon); + + LLScrollListColumn::Params name; + name.name = "name"; + name.header.label = "Name"; + name.width.relative_width = 0.45f; + mResultList->addColumn(name); + + LLScrollListColumn::Params price; + price.name="price"; + price.header.label="Price"; + price.width.relative_width = 0.1f; + mResultList->addColumn(price); + + LLScrollListColumn::Params area; + area.name="area"; + area.header.label="Area"; + area.width.relative_width = 0.1f; + mResultList->addColumn(area); + + LLScrollListColumn::Params ppm; + ppm.name="ppm"; + ppm.header.label="L$/m"; + ppm.width.relative_width = 0.1f; + mResultList->addColumn(ppm); + + LLScrollListColumn::Params type; + type.name="type"; + type.header.label="Type"; + type.width.relative_width = 0.2f; + mResultList->addColumn(type); + break; + } + case SE_CLASSIFIEDS: + { + LLScrollListColumn::Params icon; + icon.name = "icon"; + icon.width.pixel_width = 20; + mResultList->addColumn(icon); + + LLScrollListColumn::Params name; + name.name = "name"; + name.header.label = "Name"; + name.width.relative_width = 0.7f; + mResultList->addColumn(name); + + LLScrollListColumn::Params price; + price.name="price"; + price.header.label="Price"; + price.width.relative_width = 0.3f; + mResultList->addColumn(price); + break; + } + case SE_EVENTS: + { + LLScrollListColumn::Params icon; + icon.name = "icon"; + icon.width.pixel_width = 20; + mResultList->addColumn(icon); + + LLScrollListColumn::Params name; + name.name = "name"; + name.header.label = "Name"; + name.width.relative_width = 0.65f; + mResultList->addColumn(name); + + //LLScrollListColumn::Params time; + //time.name="time"; + //time.header.label="Time"; + //time.width.relative_width = 0.2f; + //mResultList->addColumn(time); + + LLScrollListColumn::Params date; + date.name="date"; + date.header.label="Date"; + date.width.relative_width = 0.3f; + mResultList->addColumn(date); + break; + } + case SE_UNDEFINED: + default: + LL_WARNS("Search") << "Unhandled search mode: " << mCurrentResultType << LL_ENDL; + break; + + } +} + +void LLFloaterDirectory::queryDirectory(const LLDirQuery& query, bool new_search) +{ + if (mCurrentResultType != query.type) + { + mCurrentResultType = query.type; + rebuildResultList(); + } + mResultList->clearRows(); + + if (new_search) + { + mResultStart = 0; + } + + mCurrentQuery = query; + mNumResultsReceived = 0; + mQueryID.generate(); + + switch (mCurrentResultType) + { + case SE_PEOPLE: + { + gMessageSystem->newMessageFast(_PREHASH_DirFindQuery); + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->nextBlockFast(_PREHASH_QueryData); + gMessageSystem->addUUIDFast(_PREHASH_QueryID, mQueryID); + gMessageSystem->addStringFast(_PREHASH_QueryText, query.text); + gMessageSystem->addU32Fast(_PREHASH_QueryFlags, DFQ_PEOPLE); + gMessageSystem->addS32Fast(_PREHASH_QueryStart, mResultStart); + gAgent.sendReliableMessage(); + LL_DEBUGS("Search") << "Firing off search request: " << mQueryID << LL_ENDL; + break; + } + case SE_GROUPS: + { + gMessageSystem->newMessageFast(_PREHASH_DirFindQuery); + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->nextBlockFast(_PREHASH_QueryData); + gMessageSystem->addUUIDFast(_PREHASH_QueryID, mQueryID); + gMessageSystem->addStringFast(_PREHASH_QueryText, query.text); + gMessageSystem->addU32Fast(_PREHASH_QueryFlags, query.scope); + gMessageSystem->addS32Fast(_PREHASH_QueryStart, mResultStart); + gAgent.sendReliableMessage(); + LL_DEBUGS("Search") << "Firing off search request: " << mQueryID << LL_ENDL; + break; + } + case SE_EVENTS: + { + gMessageSystem->newMessageFast(_PREHASH_DirFindQuery); + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->nextBlockFast(_PREHASH_QueryData); + gMessageSystem->addUUIDFast(_PREHASH_QueryID, mQueryID); + gMessageSystem->addStringFast(_PREHASH_QueryText, query.text); + gMessageSystem->addU32Fast(_PREHASH_QueryFlags, query.scope); + gMessageSystem->addS32Fast(_PREHASH_QueryStart, mResultStart); + gAgent.sendReliableMessage(); + LL_DEBUGS("Search") << "Firing off search request: " << mQueryID << " Search Text: " << query.text << LL_ENDL; + break; + } + case SE_PLACES: + { + gMessageSystem->newMessageFast(_PREHASH_DirPlacesQuery); + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->nextBlockFast(_PREHASH_QueryData); + gMessageSystem->addUUIDFast(_PREHASH_QueryID, mQueryID); + gMessageSystem->addStringFast(_PREHASH_QueryText, query.text); + gMessageSystem->addU32Fast(_PREHASH_QueryFlags, query.scope); + gMessageSystem->addS8Fast(_PREHASH_Category, query.category_char); + // TODO: Search filter by region name. + gMessageSystem->addStringFast(_PREHASH_SimName, ""); + gMessageSystem->addS32Fast(_PREHASH_QueryStart, mResultStart); + gAgent.sendReliableMessage(); + LL_DEBUGS("Search") << "Firing off search request: " << mQueryID << LL_ENDL; + break; + } + case SE_LANDSALES: + { + gMessageSystem->newMessageFast(_PREHASH_DirLandQuery); + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->nextBlockFast(_PREHASH_QueryData); + gMessageSystem->addUUIDFast(_PREHASH_QueryID, mQueryID); + gMessageSystem->addU32Fast(_PREHASH_QueryFlags, query.scope); + gMessageSystem->addU32Fast(_PREHASH_SearchType, query.category_int); + gMessageSystem->addS32Fast(_PREHASH_Price, query.price); + gMessageSystem->addS32Fast(_PREHASH_Area, query.area); + gMessageSystem->addS32Fast(_PREHASH_QueryStart, mResultStart); + gAgent.sendReliableMessage(); + LL_DEBUGS("Search") << "Firing off search request: " << mQueryID << query.category_int << LL_ENDL; + break; + } + case SE_CLASSIFIEDS: + { + gMessageSystem->newMessageFast(_PREHASH_DirClassifiedQuery); + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->nextBlockFast(_PREHASH_QueryData); + gMessageSystem->addUUIDFast(_PREHASH_QueryID, mQueryID); + gMessageSystem->addStringFast(_PREHASH_QueryText, query.text); + gMessageSystem->addU32Fast(_PREHASH_QueryFlags, query.scope); + gMessageSystem->addU32Fast(_PREHASH_Category, query.category_int); + gMessageSystem->addS32Fast(_PREHASH_QueryStart, mResultStart); + gAgent.sendReliableMessage(); + LL_DEBUGS("Search") << "Firing off search request: " << mQueryID << LL_ENDL; + break; + } + case SE_UNDEFINED: + default: + break; + } + mResultList->setCommentText(getString("searching")); + setProgress(true); +} + +//static +void LLFloaterDirectory::processSearchPeopleReply(LLMessageSystem* msg, void**) +{ + LLUUID query_id; + std::string first_name; + std::string last_name; + LLUUID agent_id; + LLUUID avatar_id; + U8 online; + //S32 reputation; + + msg->getUUIDFast(_PREHASH_QueryData, _PREHASH_QueryID, query_id); + msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); + + if (agent_id != gAgent.getID()) return; // not for us + LL_DEBUGS("Search") << "Received results for query id: " << query_id << LL_ENDL; + + // *TODO: Get rid of this so we can have multiple search windows + LLFloaterDirectory* self = LLFloaterReg::findTypedInstance<LLFloaterDirectory>("directory"); + if (self == NULL || query_id != self->mQueryID) return; // not the result we're waiting for + self->setProgress(false); + + LLScrollListCtrl* pResults = self->getChild<LLScrollListCtrl>("results"); + + S32 num_new_rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies); + if (num_new_rows == 0) + { + LLStringUtil::format_map_t map; + map["[TEXT]"] = self->mCurrentQuery.text; + pResults->setCommentText(self->getString("not_found", map)); + } + + self->mNumResultsReceived += num_new_rows; + + for (S32 i = 0; i < num_new_rows; ++i) + { + msg->getStringFast( _PREHASH_QueryReplies, _PREHASH_FirstName, first_name, i); + msg->getStringFast( _PREHASH_QueryReplies, _PREHASH_LastName, last_name, i); + msg->getUUIDFast( _PREHASH_QueryReplies, _PREHASH_AgentID, agent_id, i); + //msg->getS32Fast( _PREHASH_QueryReplies, _PREHASH_Reputation, reputation, i); + msg->getU8Fast( _PREHASH_QueryReplies, _PREHASH_Online, online, i); + + if (agent_id.isNull()) + { + LL_INFOS("Search") << "Null result returned for QueryID: " << query_id << LL_ENDL; + LLStringUtil::format_map_t map; + map["[TEXT]"] = self->mCurrentQuery.text; + pResults->setCommentText(self->getString("not_found", map)); + } + else + { + LL_DEBUGS("Search") << "Got: " << first_name << " " << last_name << " AgentID: " << agent_id << LL_ENDL; + pResults->setEnabled(TRUE); + + std::string avatar_name; + avatar_name = LLCacheName::buildFullName(first_name, last_name); + + LLSD element; + element["id"] = agent_id; + + element["columns"][0]["column"] = "icon"; + element["columns"][0]["type"] = "icon"; + element["columns"][0]["value"] = online ? "icon_avatar_online.tga" : "icon_avatar_offline.tga"; + + element["columns"][1]["column"] = "name"; + element["columns"][1]["value"] = avatar_name; + + pResults->addElement(element, ADD_BOTTOM); + } + } + self->paginate(); +} + +//static +void LLFloaterDirectory::processSearchGroupsReply(LLMessageSystem* msg, void**) +{ + LLUUID query_id; + LLUUID group_id; + LLUUID agent_id; + std::string group_name; + S32 members; + F32 search_order; + + msg->getUUIDFast(_PREHASH_QueryData, _PREHASH_QueryID, query_id); + msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); + + if (agent_id != gAgent.getID()) return; // not for us + LL_DEBUGS("Search") << "Received results for query id: " << query_id << LL_ENDL; + + LLFloaterDirectory* self = LLFloaterReg::findTypedInstance<LLFloaterDirectory>("directory"); + if (self == NULL || query_id != self->mQueryID) return; // not the result we're waiting for + + self->setProgress(false); + LLScrollListCtrl* pResults = self->getChild<LLScrollListCtrl>("results"); + + // Check for status messages + if (msg->getNumberOfBlocks("StatusData")) + { + U32 status; + msg->getU32("StatusData", "Status", status); + if (status & STATUS_SEARCH_PLACES_FOUNDNONE) + { + LLStringUtil::format_map_t map; + map["[TEXT]"] = self->getChild<LLUICtrl>("groups_edit")->getValue().asString(); + pResults->setCommentText(self->getString("not_found", map)); + return; + } + else if(status & STATUS_SEARCH_PLACES_SHORTSTRING) + { + pResults->setCommentText(self->getString("search_short")); + return; + } + else if (status & STATUS_SEARCH_PLACES_BANNEDWORD) + { + pResults->setCommentText(self->getString("search_banned")); + return; + } + else if (status & STATUS_SEARCH_PLACES_SEARCHDISABLED) + { + pResults->setCommentText(self->getString("search_disabled")); + return; + } + } + + S32 num_new_rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies); + if (num_new_rows == 0) + { + LLStringUtil::format_map_t map; + map["[TEXT]"] = self->mCurrentQuery.text; + pResults->setCommentText(self->getString("not_found", map)); + } + + self->mNumResultsReceived += num_new_rows; + for (S32 i = 0; i < num_new_rows; ++i) + { + msg->getUUIDFast( _PREHASH_QueryReplies, _PREHASH_GroupID, group_id, i); + msg->getStringFast( _PREHASH_QueryReplies, _PREHASH_GroupName, group_name, i); + msg->getS32Fast( _PREHASH_QueryReplies, _PREHASH_Members, members, i); + msg->getF32Fast( _PREHASH_QueryReplies, _PREHASH_SearchOrder, search_order,i); + if (group_id.isNull()) + { + LL_DEBUGS("Search") << "No results returned for QueryID: " << query_id << LL_ENDL; + LLStringUtil::format_map_t map; + map["[TEXT]"] = self->mCurrentQuery.text; + pResults->setCommentText(self->getString("not_found", map)); + } + else + { + LL_DEBUGS("Search") << "Got: " << group_name << " GroupID: " << group_id << LL_ENDL; + pResults->setEnabled(TRUE); + + LLSD element; + + element["id"] = group_id; + + element["columns"][0]["column"] = "icon"; + element["columns"][0]["type"] = "icon"; + element["columns"][0]["value"] = "Icon_Group"; + + element["columns"][1]["column"] = "name"; + element["columns"][1]["value"] = group_name; + + element["columns"][2]["column"] = "members"; + element["columns"][2]["value"] = members; + + element["columns"][3]["column"] = "score"; + element["columns"][3]["value"] = search_order; + + pResults->addElement(element, ADD_BOTTOM); + } + } + self->paginate(); +} + +//static +void LLFloaterDirectory::processSearchPlacesReply(LLMessageSystem* msg, void**) +{ + LLUUID agent_id; + LLUUID query_id; + LLUUID parcel_id; + std::string name; + BOOL for_sale; + BOOL auction; + F32 dwell; + + msg->getUUIDFast(_PREHASH_QueryData, _PREHASH_QueryID, query_id); + msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); + + if (agent_id != gAgent.getID()) return; // not for us + LL_DEBUGS("Search") << "Received results for query id: " << query_id << LL_ENDL; + + LLFloaterDirectory* self = LLFloaterReg::findTypedInstance<LLFloaterDirectory>("directory"); + if (self == NULL || query_id != self->mQueryID) return; // not the result we're waiting for + + self->setProgress(false); + LLScrollListCtrl* pResults = self->getChild<LLScrollListCtrl>("results"); + + // Check for status messages + if (msg->getNumberOfBlocks("StatusData")) + { + U32 status; + msg->getU32("StatusData", "Status", status); + if (status & STATUS_SEARCH_PLACES_FOUNDNONE) + { + LLStringUtil::format_map_t map; + map["[TEXT]"] = self->mCurrentQuery.text; + pResults->setCommentText(self->getString("not_found", map)); + return; + } + else if(status & STATUS_SEARCH_PLACES_SHORTSTRING) + { + pResults->setCommentText(self->getString("search_short")); + return; + } + else if (status & STATUS_SEARCH_PLACES_BANNEDWORD) + { + pResults->setCommentText(self->getString("search_banned")); + return; + } + else if (status & STATUS_SEARCH_PLACES_SEARCHDISABLED) + { + pResults->setCommentText(self->getString("search_disabled")); + return; + } + } + + S32 num_new_rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies); + if (num_new_rows == 0) + { + LLStringUtil::format_map_t map; + map["[TEXT]"] = self->mCurrentQuery.text; + pResults->setCommentText(self->getString("not_found", map)); + } + + self->mNumResultsReceived += num_new_rows; + for (S32 i = 0; i < num_new_rows; ++i) + { + msg->getUUID( "QueryReplies", "ParcelID", parcel_id, i); + msg->getString( "QueryReplies", "Name", name, i); + msg->getBOOL( "QueryReplies", "ForSale", for_sale, i); + msg->getBOOL( "QueryReplies", "Auction", auction, i); + msg->getF32( "QueryReplies", "Dwell", dwell, i); + if (parcel_id.isNull()) + { + LL_DEBUGS("Search") << "Null result returned for QueryID: " << query_id << LL_ENDL; + LLStringUtil::format_map_t map; + map["[TEXT]"] = self->mCurrentQuery.text; + pResults->setCommentText(self->getString("not_found", map)); + } + else + { + LL_DEBUGS("Search") << "Got: " << name << " ParcelID: " << parcel_id << LL_ENDL; + pResults->setEnabled(TRUE); + + LLSD element; + + element["id"] = parcel_id; + + if (auction) + { + element["columns"][0]["column"] = "icon"; + element["columns"][0]["type"] = "icon"; + element["columns"][0]["value"] = "Icon_Auction"; + } + else if (for_sale) + { + element["columns"][0]["column"] = "icon"; + element["columns"][0]["type"] = "icon"; + element["columns"][0]["value"] = "Icon_For_Sale"; + } + else + { + element["columns"][0]["column"] = "icon"; + element["columns"][0]["type"] = "icon"; + element["columns"][0]["value"] = "Icon_Place"; + } + + element["columns"][1]["column"] = "name"; + element["columns"][1]["value"] = name; + + std::string buffer = llformat("%.0f", (F64)dwell); + element["columns"][2]["column"] = "dwell"; + element["columns"][2]["value"] = buffer; + + pResults->addElement(element, ADD_BOTTOM); + } + } + self->paginate(); +} + +//static +void LLFloaterDirectory::processSearchClassifiedsReply(LLMessageSystem* msg, void**) +{ + LLUUID agent_id; + LLUUID query_id; + LLUUID classified_id; + std::string name; + U32 creation_date; + U32 expiration_date; + S32 price_for_listing; + + msg->getUUIDFast(_PREHASH_QueryData, _PREHASH_QueryID, query_id); + msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); + + if (agent_id != gAgent.getID()) return; // not for us + LL_DEBUGS("Search") << "Received results for query id: " << query_id << LL_ENDL; + + LLFloaterDirectory* self = LLFloaterReg::findTypedInstance<LLFloaterDirectory>("directory"); + if (self == NULL || query_id != self->mQueryID) return; // not the result we're waiting for + + self->setProgress(false); + LLScrollListCtrl* pResults = self->getChild<LLScrollListCtrl>("results"); + + // Check for status messages + if (msg->getNumberOfBlocks("StatusData")) + { + U32 status; + msg->getU32("StatusData", "Status", status); + if (status & STATUS_SEARCH_PLACES_FOUNDNONE) + { + LLStringUtil::format_map_t map; + map["[TEXT]"] = self->mCurrentQuery.text; + pResults->setCommentText(self->getString("not_found", map)); + return; + } + else if(status & STATUS_SEARCH_PLACES_SHORTSTRING) + { + pResults->setCommentText(self->getString("search_short")); + return; + } + else if (status & STATUS_SEARCH_PLACES_BANNEDWORD) + { + pResults->setCommentText(self->getString("search_banned")); + return; + } + else if (status & STATUS_SEARCH_PLACES_SEARCHDISABLED) + { + pResults->setCommentText(self->getString("search_disabled")); + return; + } + } + + S32 num_new_rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies); + if (num_new_rows == 0) + { + LLStringUtil::format_map_t map; + map["[TEXT]"] = self->mCurrentQuery.text; + pResults->setCommentText(self->getString("not_found", map)); + } + + self->mNumResultsReceived += num_new_rows; + for (S32 i = 0; i < num_new_rows; ++i) + { + msg->getUUID( "QueryReplies", "ClassifiedID", classified_id, i); + msg->getString( "QueryReplies", "Name", name, i); + msg->getU32( "QueryReplies", "CreationDate", creation_date, i); + msg->getU32( "QueryReplies", "ExpirationDate", expiration_date,i); + msg->getS32( "QueryReplies", "PriceForListing", price_for_listing,i); + if (classified_id.isNull()) + { + LL_DEBUGS("Search") << "No results returned for QueryID: " << query_id << LL_ENDL; + LLStringUtil::format_map_t map; + map["[TEXT]"] = self->mCurrentQuery.text; + pResults->setCommentText(self->getString("not_found", map)); + } + else + { + LL_DEBUGS("Search") << "Got: " << name << " ClassifiedID: " << classified_id << LL_ENDL; + pResults->setEnabled(TRUE); + + LLSD element; + + element["id"] = classified_id; + + element["columns"][0]["column"] = "icon"; + element["columns"][0]["type"] = "icon"; + element["columns"][0]["value"] = "icon_top_pick.tga"; + + element["columns"][1]["column"] = "name"; + element["columns"][1]["value"] = name; + + element["columns"][2]["column"] = "price"; + element["columns"][2]["value"] = price_for_listing; + + pResults->addElement(element, ADD_BOTTOM); + } + } + self->paginate(); +} + +// static +void LLFloaterDirectory::processSearchLandReply(LLMessageSystem* msg, void**) +{ + LLUUID agent_id; + LLUUID query_id; + LLUUID parcel_id; + std::string name; + std::string land_sku; + std::string land_type; + BOOL auction; + BOOL for_sale; + S32 price; + S32 area; + + msg->getUUIDFast(_PREHASH_QueryData, _PREHASH_QueryID, query_id); + msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); + + if (agent_id != gAgent.getID()) return; // not for us + LL_DEBUGS("Search") << "Received results for query id: " << query_id << LL_ENDL; + + LLFloaterDirectory* self = LLFloaterReg::findTypedInstance<LLFloaterDirectory>("directory"); + if (self == NULL || query_id != self->mQueryID) return; // not the result we're waiting for + + self->setProgress(false); + LLScrollListCtrl* pResults = self->getChild<LLScrollListCtrl>("results"); + + // Check for status messages + if (msg->getNumberOfBlocks("StatusData")) + { + U32 status; + msg->getU32("StatusData", "Status", status); + if (status & STATUS_SEARCH_PLACES_FOUNDNONE) + { + LLStringUtil::format_map_t map; + map["[TEXT]"] = self->mCurrentQuery.text; + pResults->setCommentText(self->getString("not_found", map)); + return; + } + else if(status & STATUS_SEARCH_PLACES_SHORTSTRING) + { + pResults->setCommentText(self->getString("search_short")); + return; + } + else if (status & STATUS_SEARCH_PLACES_BANNEDWORD) + { + pResults->setCommentText(self->getString("search_banned")); + return; + } + else if (status & STATUS_SEARCH_PLACES_SEARCHDISABLED) + { + pResults->setCommentText(self->getString("search_disabled")); + return; + } + } + + S32 num_new_rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies); + if (num_new_rows == 0) + { + LLStringUtil::format_map_t map; + map["[TEXT]"] = self->mCurrentQuery.text; + pResults->setCommentText(self->getString("not_found", map)); + } + + self->mNumResultsReceived += num_new_rows; + S32 not_auction = 0; + for (S32 i = 0; i < num_new_rows; ++i) + { + msg->getUUID( "QueryReplies", "ParcelID", parcel_id, i); + msg->getString( "QueryReplies", "Name", name, i); + msg->getBOOL( "QueryReplies", "Auction", auction, i); + msg->getBOOL( "QueryReplies", "ForSale", for_sale, i); + msg->getS32( "QueryReplies", "SalePrice", price, i); + msg->getS32( "QueryReplies", "ActualArea", area, i); + if (parcel_id.isNull()) + { + LL_DEBUGS("Search") << "Null result returned for QueryID: " << query_id << LL_ENDL; + pResults->setCommentText(self->getString("no_results")); + } + else + { + LL_DEBUGS("Search") << "Got: " << name << " ClassifiedID: " << parcel_id << LL_ENDL; + pResults->setEnabled(TRUE); + if ( msg->getSizeFast(_PREHASH_QueryReplies, i, _PREHASH_ProductSKU) > 0 ) + { + msg->getStringFast( _PREHASH_QueryReplies, _PREHASH_ProductSKU, land_sku, i); + land_type = LLProductInfoRequestManager::instance().getDescriptionForSku(land_sku); + } + else + { + land_sku.clear(); + land_type = LLTrans::getString("land_type_unknown"); + } + if (parcel_id.isNull()) + continue; + + LLSD element; + + element["id"] = parcel_id; + if (auction) + { + element["columns"][0]["column"] = "icon"; + element["columns"][0]["type"] = "icon"; + element["columns"][0]["value"] = "Icon_Auction"; + } + else if (for_sale) + { + element["columns"][0]["column"] = "icon"; + element["columns"][0]["type"] = "icon"; + element["columns"][0]["value"] = "Icon_For_Sale"; + } + else + { + element["columns"][0]["column"] = "icon"; + element["columns"][0]["type"] = "icon"; + element["columns"][0]["value"] = "Icon_Place"; + } + + element["columns"][1]["column"] = "name"; + element["columns"][1]["value"] = name; + + std::string buffer = "Auction"; + if (!auction) + { + buffer = llformat("%d", price); + not_auction++; + } + element["columns"][2]["column"] = "price"; + element["columns"][2]["value"] = price; + + element["columns"][3]["column"] = "area"; + element["columns"][3]["value"] = area; + if (!auction) + { + F32 ppm; + if (area > 0) + ppm = price / area; + else + ppm = 0.f; + std::string buffer = llformat("%.1f", ppm); + element["columns"][4]["column"] = "ppm"; + element["columns"][4]["value"] = buffer; + } + else + { + element["columns"][4]["column"] = "ppm"; + element["columns"][4]["value"] = "1.0"; + } + + element["columns"][5]["column"] = "type"; + element["columns"][5]["value"] = land_type; + + pResults->addElement(element, ADD_BOTTOM); + } + } + self->paginate(); +} + +// static +void LLFloaterDirectory::processSearchEventsReply(LLMessageSystem* msg, void**) +{ + LLUUID agent_id; + LLUUID query_id; + LLUUID owner_id; + std::string name; + std::string date; + + msg->getUUIDFast(_PREHASH_QueryData, _PREHASH_QueryID, query_id); + msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); + + if (agent_id != gAgent.getID()) return; // not for us + LL_DEBUGS("Search") << "Received results for query id: " << query_id << LL_ENDL; + + LLFloaterDirectory* self = LLFloaterReg::findTypedInstance<LLFloaterDirectory>("directory"); + if (self == NULL || query_id != self->mQueryID) return; // not the result we're waiting for + + self->setProgress(false); + LLScrollListCtrl* pResults = self->getChild<LLScrollListCtrl>("results"); + + // Check for status messages + if (msg->getNumberOfBlocks("StatusData")) + { + U32 status; + msg->getU32("StatusData", "Status", status); + if (status & STATUS_SEARCH_EVENTS_FOUNDNONE) + { + LLStringUtil::format_map_t map; + map["[TEXT]"] = self->mCurrentQuery.text; + pResults->setCommentText(self->getString("not_found", map)); + return; + } + else if(status & STATUS_SEARCH_EVENTS_SHORTSTRING) + { + pResults->setCommentText(self->getString("search_short")); + return; + } + else if (status & STATUS_SEARCH_EVENTS_BANNEDWORD) + { + pResults->setCommentText(self->getString("search_banned")); + return; + } + else if (status & STATUS_SEARCH_EVENTS_SEARCHDISABLED) + { + pResults->setCommentText(self->getString("search_disabled")); + return; + } + else if (status & STATUS_SEARCH_EVENTS_NODATEOFFSET) + { + pResults->setCommentText(self->getString("search_no_date_offset")); + return; + } + else if (status & STATUS_SEARCH_EVENTS_NOCATEGORY) + { + pResults->setCommentText(self->getString("search_no_events_category")); + return; + } + else if (status & STATUS_SEARCH_EVENTS_NOQUERY) + { + pResults->setCommentText(self->getString("search_no_query")); + return; + } + } + + S32 num_new_rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies); + if (num_new_rows == 0) + { + LLStringUtil::format_map_t map; + map["[TEXT]"] = self->mCurrentQuery.text; + pResults->setCommentText(self->getString("not_found", map)); + } + + self->mNumResultsReceived += num_new_rows; + for (S32 i = 0; i < num_new_rows; ++i) + { + U32 event_id; + //U32 unix_time; + U32 event_flags; + + msg->getUUID( "QueryReplies", "OwnerID", owner_id, i); + msg->getString( "QueryReplies", "Name", name, i); + msg->getU32( "QueryReplies", "EventID", event_id, i); + msg->getString( "QueryReplies", "Date", date, i); + //msg->getU32( "QueryReplies", "UnixTime", unix_time, i); + msg->getU32( "QueryReplies", "EventFlags", event_flags,i); + + static LLUICachedControl<bool> inc_pg("ShowPGEvents", 1); + static LLUICachedControl<bool> inc_mature("ShowMatureEvents", 0); + static LLUICachedControl<bool> inc_adult("ShowAdultEvents", 0); + + // Skip empty events... + if (owner_id.isNull()) + { + LL_INFOS("Search") << "Skipped " << event_id << " because of a NULL owner result" << LL_ENDL; + continue; + } + // Skips events that don't match our scope... + if (((event_flags & (EVENT_FLAG_ADULT | EVENT_FLAG_MATURE)) == EVENT_FLAG_NONE) && !inc_pg) + { + LL_INFOS("Search") << "Skipped " << event_id << " because it was out of scope" << LL_ENDL; + continue; + } + if ((event_flags & EVENT_FLAG_MATURE) && !inc_mature) + { + LL_INFOS("Search") << "Skipped " << event_id << " because it was out of scope" << LL_ENDL; + continue; + } + if ((event_flags & EVENT_FLAG_ADULT) && !inc_adult) + { + LL_INFOS("Search") << "Skipped " << event_id << " because it was out of scope" << LL_ENDL; + continue; + } + pResults->setEnabled(TRUE); + + LLSD element; + + element["id"] = llformat("%u", event_id); + + if (event_flags == EVENT_FLAG_ADULT) + { + element["columns"][0]["column"] = "icon"; + element["columns"][0]["type"] = "icon"; + element["columns"][0]["value"] = "Parcel_R_Dark"; + } + else if (event_flags == EVENT_FLAG_MATURE) + { + element["columns"][0]["column"] = "icon"; + element["columns"][0]["type"] = "icon"; + element["columns"][0]["value"] = "Parcel_M_Dark"; + } + else + { + element["columns"][0]["column"] = "icon"; + element["columns"][0]["type"] = "icon"; + element["columns"][0]["value"] = "Parcel_PG_Dark"; + } + + element["columns"][1]["column"] = "name"; + element["columns"][1]["value"] = name; + + element["columns"][2]["column"] = "date"; + element["columns"][2]["value"] = date; + + //element["columns"][3]["column"] = "time"; + //element["columns"][3]["value"] = llformat("%u", unix_time); + + pResults->addElement(element, ADD_BOTTOM); + } + self->paginate(); +} diff --git a/indra/newview/llfloaterdirectory.h b/indra/newview/llfloaterdirectory.h new file mode 100644 index 00000000000..8ea0afe047d --- /dev/null +++ b/indra/newview/llfloaterdirectory.h @@ -0,0 +1,115 @@ +/* + * @file llfloaterdirectory.h + * @brief Legacy search facility definitions + * + * Copyright (c) 2014, Cinder Roxley <cinder@sdf.org> + * + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (the "Software") to use, reproduce, display, distribute, + * execute, and transmit the Software, and to prepare derivative works of the + * Software, and to permit third-parties to whom the Software is furnished to + * do so, all subject to the following: + * + * The copyright notices in the Software and this entire statement, including + * the above license grant, this restriction and the following disclaimer, + * must be included in all copies of the Software, in whole or in part, and + * all derivative works of the Software, unless such copies or derivative + * works are solely in the form of machine-executable object code generated by + * a source language processor. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LL_FLOATERDIRECTORY_H +#define LL_FLOATERDIRECTORY_H + +#include "llfloater.h" + +class LLUICtrl; +class LLPanel; +class LLScrollListCtrl; +class LLTextBase; + +class LLRemoteParcelInfoObserver; + +static const size_t MIN_SEARCH_STRING_SIZE = 3; + +typedef enum { + SE_UNDEFINED = 0, + SE_PEOPLE, + SE_GROUPS, + SE_PLACES, + SE_LANDSALES, + SE_EVENTS, + SE_CLASSIFIEDS +} ESearch; + +typedef struct dir_query +{ +public: + dir_query() + : type(SE_UNDEFINED), text(LLStringUtil::null), scope(0), + category_int(0), category_char(0x0), price(0), area(0), results_per_page(100) {} + ESearch type; + std::string text; + U32 scope; + U32 category_int; + S8 category_char; + S32 price; + S32 area; + U32 results_per_page; +} LLDirQuery; + +class LLFloaterDirectory : public LLFloater +{ + friend class LLPanelSearchClassifieds; + friend class LLPanelSearchEvents; + friend class LLPanelSearchGroups; + friend class LLPanelSearchLandSales; + friend class LLPanelSearchPeople; + friend class LLPanelSearchPlaces; +public: + LLFloaterDirectory(const LLSD& key); + BOOL postBuild(); + + static void processSearchPeopleReply(LLMessageSystem* msg, void**); + static void processSearchGroupsReply(LLMessageSystem* msg, void**); + static void processSearchPlacesReply(LLMessageSystem* msg, void**); + static void processSearchClassifiedsReply(LLMessageSystem* msg, void**); + static void processSearchLandReply(LLMessageSystem* msg, void**); + static void processSearchEventsReply(LLMessageSystem* msg, void**); + +protected: + void setProgress(bool working); + void queryDirectory(const LLDirQuery& query, bool new_search = false); + void setResultsComment(const std::string& message); + +private: + ~LLFloaterDirectory(); + void onCommitSelection(); + void choosePage(const LLSD& userdata); + void paginate(); + void showDetailPanel(const std::string& panel_name); + void rebuildResultList(); + + ESearch mCurrentResultType; + LLDirQuery mCurrentQuery; + S32 mResultStart; + S32 mNumResultsReceived; + LLUUID mQueryID; + + LLPanel* mDetailPeople; + LLScrollListCtrl* mResultList; + LLTextBase* mResultsStatus; + LLRemoteParcelInfoObserver* mRemoteParcelObserver; +}; + +#endif // LL_FLOATERDIRECTORY_H diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index 183000ceac2..c60d87d86bd 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -82,6 +82,8 @@ static LLDispatchClassifiedClickThrough sClassifiedClickThrough; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// +static LLPanelInjector<LLPanelClassifiedInfo> t_classified_info("panel_classified_info"); + LLPanelClassifiedInfo::LLPanelClassifiedInfo() : LLPanel() , mInfoLoaded(false) @@ -151,7 +153,7 @@ void LLPanelClassifiedInfo::onOpen(const LLSD& key) LLUUID avatar_id = key["classified_creator_id"]; if(avatar_id.isNull()) { - return; + //return; } if(getAvatarId().notNull()) diff --git a/indra/newview/llpaneleventinfo.cpp b/indra/newview/llpaneleventinfo.cpp new file mode 100644 index 00000000000..54950840e95 --- /dev/null +++ b/indra/newview/llpaneleventinfo.cpp @@ -0,0 +1,158 @@ +/* + * @file llpaneleventinfo.cpp + * @brief Event info panel + * + * Copyright (c) 2014, Cinder Roxley <cinder@sdf.org> + * + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (the "Software") to use, reproduce, display, distribute, + * execute, and transmit the Software, and to prepare derivative works of the + * Software, and to permit third-parties to whom the Software is furnished to + * do so, all subject to the following: + * + * The copyright notices in the Software and this entire statement, including + * the above license grant, this restriction and the following disclaimer, + * must be included in all copies of the Software, in whole or in part, and + * all derivative works of the Software, unless such copies or derivative + * works are solely in the form of machine-executable object code generated by + * a source language processor. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#include "llviewerprecompiledheaders.h" +#include "llpaneleventinfo.h" + +#include "llbutton.h" +#include "lleventflags.h" +#include "lliconctrl.h" +#include "llfloaterreg.h" +#include "llresmgr.h" +#include "llslurl.h" +#include "lltrans.h" + +#include "llagent.h" +#include "llfloaterworldmap.h" +#include "llviewercontrol.h" + +static LLPanelInjector<LLPanelEventInfo> t_event_info("panel_event_info"); + +LLPanelEventInfo::LLPanelEventInfo() +: LLPanel() +, mEvent() +, mEventID(0) +{ + mEventNotifierConnection = gEventNotifier.setNewEventCallback(boost::bind(&LLPanelEventInfo::processEventReply, this, _1)); +} + +LLPanelEventInfo::~LLPanelEventInfo() +{ + if (mEventNotifierConnection.connected()) + { + mEventNotifierConnection.disconnect(); + } +} + +BOOL LLPanelEventInfo::postBuild() +{ + childSetAction("teleport_btn", boost::bind(&LLPanelEventInfo::onBtnTeleport, this)); + childSetAction("show_on_map_btn", boost::bind(&LLPanelEventInfo::onBtnMap, this)); + childSetAction("remind_btn", boost::bind(&LLPanelEventInfo::onBtnRemind, this)); + return TRUE; +} + +void LLPanelEventInfo::onOpen(const LLSD& key) +{ + U32 id(key.asInteger()); + setEventID(id); + + gEventNotifier.add(getEventID()); +} + +// *TODO: localize this bitch. +std::string LLPanelEventInfo::formatFromMinutes(U32 time) +{ + U32 hours = time / 60; + U32 minutes = time % 60; + + std::ostringstream output; + if (hours) + output << hours << " " << getString("hours") << " "; + if (minutes) + output << minutes << " " << getString("minutes"); + return output.str(); +} + +bool LLPanelEventInfo::processEventReply(const LLEventStruct& event) +{ + if (event.eventId != getEventID()) return false; // no + mEvent = event; + getChild<LLUICtrl>("name")->setValue(mEvent.eventName); + getChild<LLUICtrl>("desc")->setValue(mEvent.desc); + getChild<LLUICtrl>("duration")->setValue(formatFromMinutes(mEvent.duration)); + getChild<LLUICtrl>("host")->setValue(LLSLURL("agent", LLUUID(mEvent.creator), "inspect").getSLURLString()); + getChild<LLUICtrl>("time")->setValue(mEvent.eventDateStr); + // *TODO: Prettier + //std::string time; + //LLStringUtil::formatDatetime(time, "%a %d %b %Y %H:%M", "slt", mEvent.eventEpoch); + //getChild<LLUICtrl>("time")->setValue(time); + + // *TODO: Add translation strings + //getChild<LLUICtrl>("category")->setValue(LLTrans::getString(mEvent.category)); + getChild<LLUICtrl>("category")->setValue(mEvent.category); + getChild<LLUICtrl>("cover")->setValue(mEvent.cover + ? LLResMgr::getInstance()->getMonetaryString(mEvent.amount) + : getString("free")); + bool mature = (mEvent.flags & EVENT_FLAG_MATURE); + getChild<LLUICtrl>("content_type")->setValue(getString(mature ? "type_mature" : "type_pg")); + getChild<LLIconCtrl>("content_type_moderate")->setVisible(mature); + getChild<LLIconCtrl>("content_type_general")->setVisible(!mature); + getChild<LLUICtrl>("location")->setValue(LLSLURL(mEvent.simName, mEvent.globalPos).getSLURLString()); + getChild<LLButton>("remind_btn")->setLabel(getString(gEventNotifier.hasNotification(mEvent.eventId) + ? "no_reminder" + : "reminder")); + return true; +} + +void LLPanelEventInfo::onBtnTeleport() +{ + if (!mEvent.globalPos.isExactlyZero()) + { + gAgent.teleportViaLocation(mEvent.globalPos); + LLFloaterWorldMap* worldmap = LLFloaterWorldMap::getInstance(); + if (worldmap) + worldmap->trackLocation(mEvent.globalPos); + } +} + +void LLPanelEventInfo::onBtnMap() +{ + LLFloaterWorldMap* worldmap = LLFloaterWorldMap::getInstance(); + if (!mEvent.globalPos.isExactlyZero() && worldmap) + { + worldmap->trackLocation(mEvent.globalPos); + LLFloaterReg::showInstance("world_map", "center"); + } +} + +void LLPanelEventInfo::onBtnRemind() +{ + if (gEventNotifier.hasNotification(mEvent.eventId)) + { + gEventNotifier.remove(mEvent.eventId); + getChild<LLButton>("remind_btn")->setLabel(getString("reminder")); + } + else + { + gEventNotifier.add(mEvent.eventId); + getChild<LLButton>("remind_btn")->setLabel(getString("no_reminder")); + } +} diff --git a/indra/newview/llpaneleventinfo.h b/indra/newview/llpaneleventinfo.h new file mode 100644 index 00000000000..09260102e00 --- /dev/null +++ b/indra/newview/llpaneleventinfo.h @@ -0,0 +1,59 @@ +/* + * @file llpaneleventinfo.cpp + * @brief Event info panel + * + * Copyright (c) 2014, Cinder Roxley <cinder@sdf.org> + * + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (the "Software") to use, reproduce, display, distribute, + * execute, and transmit the Software, and to prepare derivative works of the + * Software, and to permit third-parties to whom the Software is furnished to + * do so, all subject to the following: + * + * The copyright notices in the Software and this entire statement, including + * the above license grant, this restriction and the following disclaimer, + * must be included in all copies of the Software, in whole or in part, and + * all derivative works of the Software, unless such copies or derivative + * works are solely in the form of machine-executable object code generated by + * a source language processor. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LL_PANELEVENTINFO_H +#define LL_PANELEVENTINFO_H + +#include "llpanel.h" +#include "lleventnotifier.h" + +class LLPanelEventInfo : public LLPanel +{ +public: + LLPanelEventInfo(); + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + +private: + ~LLPanelEventInfo(); + bool processEventReply(const LLEventStruct& event); + std::string formatFromMinutes(U32 time); + void setEventID(U32 id) { mEventID = id; } + U32 getEventID() const { return mEventID; } + void onBtnTeleport(); + void onBtnMap(); + void onBtnRemind(); + + LLEventStruct mEvent; + U32 mEventID; + boost::signals2::connection mEventNotifierConnection; +}; + +#endif // LL_PANELEVENTINFO_H diff --git a/indra/newview/llpanelsearchbase.cpp b/indra/newview/llpanelsearchbase.cpp new file mode 100644 index 00000000000..f28e1c23de7 --- /dev/null +++ b/indra/newview/llpanelsearchbase.cpp @@ -0,0 +1,43 @@ +/* + * @file llpanelsearchbase.cpp + * @brief Search panel base class + * + * Copyright (c) 2014, Cinder Roxley <cinder@sdf.org> + * + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (the "Software") to use, reproduce, display, distribute, + * execute, and transmit the Software, and to prepare derivative works of the + * Software, and to permit third-parties to whom the Software is furnished to + * do so, all subject to the following: + * + * The copyright notices in the Software and this entire statement, including + * the above license grant, this restriction and the following disclaimer, + * must be included in all copies of the Software, in whole or in part, and + * all derivative works of the Software, unless such copies or derivative + * works are solely in the form of machine-executable object code generated by + * a source language processor. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#include "llviewerprecompiledheaders.h" +#include "llpanelsearchbase.h" +#include "llfloaterdirectory.h" + +LLPanelSearch::LLPanelSearch() +: LLPanel() +{ +} + +void LLPanelSearch::setSearchFloater(LLFloaterDirectory* floater) +{ + mFloater = floater; +} diff --git a/indra/newview/llpanelsearchbase.h b/indra/newview/llpanelsearchbase.h new file mode 100644 index 00000000000..29aad065170 --- /dev/null +++ b/indra/newview/llpanelsearchbase.h @@ -0,0 +1,55 @@ +/* + * @file llpanelsearchbase.h + * @brief Search panel base class + * + * Copyright (c) 2014, Cinder Roxley <cinder@sdf.org> + * + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (the "Software") to use, reproduce, display, distribute, + * execute, and transmit the Software, and to prepare derivative works of the + * Software, and to permit third-parties to whom the Software is furnished to + * do so, all subject to the following: + * + * The copyright notices in the Software and this entire statement, including + * the above license grant, this restriction and the following disclaimer, + * must be included in all copies of the Software, in whole or in part, and + * all derivative works of the Software, unless such copies or derivative + * works are solely in the form of machine-executable object code generated by + * a source language processor. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LL_PANELSEARCHBASE_H +#define LL_PANELSEARCHBASE_H + +#include "llpanel.h" + +class LLUICtrl; +class LLFloaterDirectory; + +class LLPanelSearch : public LLPanel +{ +public: + LLPanelSearch(); + /* virtual */ BOOL postBuild() { return FALSE; } + void setSearchFloater(LLFloaterDirectory* floater); + +protected: + virtual ~LLPanelSearch() {}; + LLFloaterDirectory* mFloater; + +private: + virtual void onCommitSearch(LLUICtrl* ctrl) {} + virtual void search() {} +}; + +#endif // LL_PANELSEARCHBASE_H diff --git a/indra/newview/llpanelsearchclassifieds.cpp b/indra/newview/llpanelsearchclassifieds.cpp new file mode 100644 index 00000000000..49b2c635ca1 --- /dev/null +++ b/indra/newview/llpanelsearchclassifieds.cpp @@ -0,0 +1,109 @@ +/* + * @file llpanelsearchclassifieds.cpp + * @brief Groups search panel + * + * Copyright (c) 2014, Cinder Roxley <cinder@sdf.org> + * + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (the "Software") to use, reproduce, display, distribute, + * execute, and transmit the Software, and to prepare derivative works of the + * Software, and to permit third-parties to whom the Software is furnished to + * do so, all subject to the following: + * + * The copyright notices in the Software and this entire statement, including + * the above license grant, this restriction and the following disclaimer, + * must be included in all copies of the Software, in whole or in part, and + * all derivative works of the Software, unless such copies or derivative + * works are solely in the form of machine-executable object code generated by + * a source language processor. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#include "llviewerprecompiledheaders.h" +#include "llpanelsearchclassifieds.h" +#include "llfloaterdirectory.h" + +#include "llfloaterreg.h" +#include "llqueryflags.h" +#include "lltrans.h" + +#include "llagent.h" +#include "llclassifiedflags.h" +#include "llclassifiedinfo.h" +#include "llcombobox.h" +#include "llnotificationsutil.h" +#include "llparcel.h" +#include "llsearcheditor.h" +#include "llsearchhistory.h" + +static LLPanelInjector<LLPanelSearchClassifieds> t_panel_search_classifieds("panel_search_classifieds"); + +LLPanelSearchClassifieds::LLPanelSearchClassifieds() +: LLPanelSearch() +{ + mCommitCallbackRegistrar.add("Search.query", boost::bind(&LLPanelSearchClassifieds::onCommitSearch, this, _1)); +} + +BOOL LLPanelSearchClassifieds::postBuild() +{ + mClassifiedsCategory = getChild<LLComboBox>("classifieds_category"); + mClassifiedsCategory->add("All categories", LLSD("any")); + mClassifiedsCategory->addSeparator(); + LLClassifiedInfo::cat_map::iterator iter; + for (iter = LLClassifiedInfo::sCategories.begin(); + iter != LLClassifiedInfo::sCategories.end(); + ++iter) + { + mClassifiedsCategory->add(LLTrans::getString(iter->second)); + } + + mSearchEditor = getChild<LLSearchEditor>("search_bar"); + //mSearchEditor->setKeystrokeCallback(boost::bind(&LLPanelSearchClassifieds::onCommitSearch, this, _1)); + + return TRUE; +} + +void LLPanelSearchClassifieds::onCommitSearch(LLUICtrl* ctrl) +{ + LLSearchEditor* pSearchEditor = dynamic_cast<LLSearchEditor*>(ctrl); + if (pSearchEditor) + { + std::string text = pSearchEditor->getText(); + LLStringUtil::trim(text); + if (text.length() <= MIN_SEARCH_STRING_SIZE) + LLSearchHistory::getInstance()->addEntry(text); + } + search(); +} + +void LLPanelSearchClassifieds::search() +{ + LLDirQuery query; + query.type = SE_CLASSIFIEDS; + query.results_per_page = 100; + query.text = mSearchEditor->getText(); + LLStringUtil::trim(query.text); + + query.category_int = mClassifiedsCategory->getValue().asInteger(); + + static LLUICachedControl<bool> inc_pg("ShowPGClassifieds", 1); + static LLUICachedControl<bool> inc_mature("ShowMatureClassifieds", 0); + static LLUICachedControl<bool> inc_adult("ShowAdultClassifieds", 0); + if (!(inc_pg || inc_mature || inc_adult)) + { + LLNotificationsUtil::add("NoContentToSearch"); + return; + } + query.scope = pack_classified_flags_request(/*auto_renew*/ FALSE, inc_pg, inc_mature, inc_adult); + + mFloater->queryDirectory(query, true); +} diff --git a/indra/newview/llpanelsearchclassifieds.h b/indra/newview/llpanelsearchclassifieds.h new file mode 100644 index 00000000000..993950e7c48 --- /dev/null +++ b/indra/newview/llpanelsearchclassifieds.h @@ -0,0 +1,53 @@ +/* + * @file llpanelsearchclassifieds.h + * @brief Groups search panel + * + * Copyright (c) 2014, Cinder Roxley <cinder@sdf.org> + * + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (the "Software") to use, reproduce, display, distribute, + * execute, and transmit the Software, and to prepare derivative works of the + * Software, and to permit third-parties to whom the Software is furnished to + * do so, all subject to the following: + * + * The copyright notices in the Software and this entire statement, including + * the above license grant, this restriction and the following disclaimer, + * must be included in all copies of the Software, in whole or in part, and + * all derivative works of the Software, unless such copies or derivative + * works are solely in the form of machine-executable object code generated by + * a source language processor. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LL_PANELSEARCHCLASSIFIEDS_H +#define LL_PANELSEARCHCLASSIFIEDS_H + +#include "llpanelsearchbase.h" + +class LLComboBox; +class LLSearchEditor; + +class LLPanelSearchClassifieds : public LLPanelSearch +{ +public: + LLPanelSearchClassifieds(); + /*virtual*/ BOOL postBuild(); + +private: + /*virtual*/ void onCommitSearch(LLUICtrl* ctrl); + /*virtual*/ void search(); + + LLSearchEditor* mSearchEditor; + LLComboBox* mClassifiedsCategory; +}; + +#endif // LL_PANELSEARCHCLASSIFIEDS_H diff --git a/indra/newview/llpanelsearchevents.cpp b/indra/newview/llpanelsearchevents.cpp new file mode 100644 index 00000000000..30ef758afa2 --- /dev/null +++ b/indra/newview/llpanelsearchevents.cpp @@ -0,0 +1,136 @@ +/* + * @file llpanelsearchevents.cpp + * @brief Events search panel + * + * Copyright (c) 2014, Cinder Roxley <cinder@sdf.org> + * + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (the "Software") to use, reproduce, display, distribute, + * execute, and transmit the Software, and to prepare derivative works of the + * Software, and to permit third-parties to whom the Software is furnished to + * do so, all subject to the following: + * + * The copyright notices in the Software and this entire statement, including + * the above license grant, this restriction and the following disclaimer, + * must be included in all copies of the Software, in whole or in part, and + * all derivative works of the Software, unless such copies or derivative + * works are solely in the form of machine-executable object code generated by + * a source language processor. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#include "llviewerprecompiledheaders.h" +#include "llpanelsearchevents.h" +#include "llfloaterdirectory.h" + +#include "llfloaterreg.h" +#include "llqueryflags.h" + +#include "llagent.h" +#include "llcombobox.h" +#include "llnotificationsutil.h" +#include "llparcel.h" +#include "llsearcheditor.h" +#include "llsearchhistory.h" + +static LLPanelInjector<LLPanelSearchEvents> t_panel_search_events("panel_search_events"); + +LLPanelSearchEvents::LLPanelSearchEvents() +: LLPanelSearch() +, mDate(0) +{ + mCommitCallbackRegistrar.add("Search.query", boost::bind(&LLPanelSearchEvents::onCommitSearch, this, _1)); + mCommitCallbackRegistrar.add("Search.AddDay", boost::bind(&LLPanelSearchEvents::addDay, this)); + mCommitCallbackRegistrar.add("Search.MinusDay", boost::bind(&LLPanelSearchEvents::minusDay, this)); +} + +BOOL LLPanelSearchEvents::postBuild() +{ + mSearchEditor = getChild<LLSearchEditor>("search_bar"); + //mSearchEditor->setKeystrokeCallback(boost::bind(&LLPanelSearchEvents::onCommitSearch, this, _1)); + setDate(0); + + return TRUE; +} + +void LLPanelSearchEvents::onCommitSearch(LLUICtrl* ctrl) +{ + LLSearchEditor* pSearchEditor = dynamic_cast<LLSearchEditor*>(ctrl); + if (pSearchEditor) + { + std::string text = pSearchEditor->getText(); + LLStringUtil::trim(text); + if (text.length() <= MIN_SEARCH_STRING_SIZE) + LLSearchHistory::getInstance()->addEntry(text); + } + search(); +} + +void LLPanelSearchEvents::search() +{ + LLDirQuery query; + query.type = SE_EVENTS; + query.results_per_page = 200; + std::string text = mSearchEditor->getText(); + LLStringUtil::trim(text); + + static LLUICachedControl<bool> inc_pg("ShowPGEvents", 1); + static LLUICachedControl<bool> inc_mature("ShowMatureEvents", 0); + static LLUICachedControl<bool> inc_adult("ShowAdultEvents", 0); + if (!(inc_pg || inc_mature || inc_adult)) + { + LLNotificationsUtil::add("NoContentToSearch"); + return; + } + + query.scope = DFQ_DATE_EVENTS; + if (inc_pg) + query.scope |= DFQ_INC_PG; + if (inc_mature && gAgent.canAccessMature()) + query.scope |= DFQ_INC_MATURE; + if (inc_adult && gAgent.canAccessAdult()) + query.scope |= DFQ_INC_ADULT; + + std::ostringstream string; + string << (childGetValue("events_search_mode").asString() == "current" ? "u" : llformat("%d",mDate)) << "|" + << getChild<LLComboBox>("events_category")->getSelectedValue().asInteger() << "|" + << text; + query.text = string.str(); + + mFloater->queryDirectory(query, true); +} + +void LLPanelSearchEvents::setDate(S32 day) +{ + mDate = day; + struct tm* internal_time; + + time_t utc = time_corrected(); + utc += day * 24 * 60 * 60; + internal_time = utc_to_pacific_time(utc, is_daylight_savings()); + const std::string date = llformat("%d/%d", 1 + internal_time->tm_mon, internal_time->tm_mday); + childSetValue("events_date", date); +} + +void LLPanelSearchEvents::addDay() +{ + setDate(++mDate); + if (childGetValue("events_search_mode").asString() == "date") + search(); +} + +void LLPanelSearchEvents::minusDay() +{ + setDate(--mDate); + if (childGetValue("events_search_mode").asString() == "date") + search(); +} diff --git a/indra/newview/llpanelsearchevents.h b/indra/newview/llpanelsearchevents.h new file mode 100644 index 00000000000..c11421fd776 --- /dev/null +++ b/indra/newview/llpanelsearchevents.h @@ -0,0 +1,56 @@ +/* + * @file llpanelsearchevents.h + * @brief Events search panel + * + * Copyright (c) 2014, Cinder Roxley <cinder@sdf.org> + * + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (the "Software") to use, reproduce, display, distribute, + * execute, and transmit the Software, and to prepare derivative works of the + * Software, and to permit third-parties to whom the Software is furnished to + * do so, all subject to the following: + * + * The copyright notices in the Software and this entire statement, including + * the above license grant, this restriction and the following disclaimer, + * must be included in all copies of the Software, in whole or in part, and + * all derivative works of the Software, unless such copies or derivative + * works are solely in the form of machine-executable object code generated by + * a source language processor. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LL_PANELSEARCHEVENTS_H +#define LL_PANELSEARCHEVENTS_H + +#include "llpanelsearchbase.h" + +class LLComboBox; +class LLSearchEditor; + +class LLPanelSearchEvents : public LLPanelSearch +{ +public: + LLPanelSearchEvents(); + /*virtual*/ BOOL postBuild(); + +private: + /*virtual*/ void onCommitSearch(LLUICtrl* ctrl); + /*virtual*/ void search(); + void setDate(S32 day); + void addDay(); + void minusDay(); + + S32 mDate; + LLSearchEditor* mSearchEditor; +}; + +#endif // LL_PANELSEARCHEVENTS_H diff --git a/indra/newview/llpanelsearchgroups.cpp b/indra/newview/llpanelsearchgroups.cpp new file mode 100644 index 00000000000..92629609d27 --- /dev/null +++ b/indra/newview/llpanelsearchgroups.cpp @@ -0,0 +1,98 @@ +/* + * @file llpanelsearchgroups.cpp + * @brief Groups search panel + * + * Copyright (c) 2014, Cinder Roxley <cinder@sdf.org> + * + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (the "Software") to use, reproduce, display, distribute, + * execute, and transmit the Software, and to prepare derivative works of the + * Software, and to permit third-parties to whom the Software is furnished to + * do so, all subject to the following: + * + * The copyright notices in the Software and this entire statement, including + * the above license grant, this restriction and the following disclaimer, + * must be included in all copies of the Software, in whole or in part, and + * all derivative works of the Software, unless such copies or derivative + * works are solely in the form of machine-executable object code generated by + * a source language processor. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#include "llviewerprecompiledheaders.h" +#include "llpanelsearchgroups.h" +#include "llfloaterdirectory.h" + +#include "llfloaterreg.h" +#include "llqueryflags.h" + +#include "llagent.h" +#include "llnotificationsutil.h" +#include "llsearcheditor.h" +#include "llsearchhistory.h" + +static LLPanelInjector<LLPanelSearchGroups> t_panel_search_groups("panel_search_groups"); + +LLPanelSearchGroups::LLPanelSearchGroups() +: LLPanelSearch() +{ + mCommitCallbackRegistrar.add("Search.query", boost::bind(&LLPanelSearchGroups::onCommitSearch, this, _1)); +} + +BOOL LLPanelSearchGroups::postBuild() +{ + mSearchEditor = getChild<LLSearchEditor>("search_bar"); + //mSearchEditor->setKeystrokeCallback(boost::bind(&LLPanelSearchGroups::onCommitSearch, this, _1)); + + return TRUE; +} + +void LLPanelSearchGroups::onCommitSearch(LLUICtrl* ctrl) +{ + LLSearchEditor* pSearchEditor = dynamic_cast<LLSearchEditor*>(ctrl); + if (pSearchEditor) + { + std::string text = pSearchEditor->getText(); + LLStringUtil::trim(text); + if (text.length() <= MIN_SEARCH_STRING_SIZE) + LLSearchHistory::getInstance()->addEntry(text); + } + search(); +} + +void LLPanelSearchGroups::search() +{ + LLDirQuery query; + query.type = SE_GROUPS; + query.results_per_page = 100; + query.text = mSearchEditor->getText(); + LLStringUtil::trim(query.text); + + static LLUICachedControl<bool> inc_pg("ShowPGGroups", 1); + static LLUICachedControl<bool> inc_mature("ShowMatureGroups", 0); + static LLUICachedControl<bool> inc_adult("ShowAdultGroups", 0); + if (!(inc_pg || inc_mature || inc_adult)) + { + LLNotificationsUtil::add("NoContentToSearch"); + return; + } + + if (inc_pg) + query.scope |= DFQ_INC_PG; + if (inc_mature && gAgent.canAccessMature()) + query.scope |= DFQ_INC_MATURE; + if (inc_adult && gAgent.canAccessAdult()) + query.scope |= DFQ_INC_ADULT; + query.scope |= DFQ_GROUPS; + + mFloater->queryDirectory(query, true); +} diff --git a/indra/newview/llpanelsearchgroups.h b/indra/newview/llpanelsearchgroups.h new file mode 100644 index 00000000000..160fecf4855 --- /dev/null +++ b/indra/newview/llpanelsearchgroups.h @@ -0,0 +1,51 @@ +/* + * @file llpanelsearchgroups.h + * @brief Groups search panel + * + * Copyright (c) 2014, Cinder Roxley <cinder@sdf.org> + * + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (the "Software") to use, reproduce, display, distribute, + * execute, and transmit the Software, and to prepare derivative works of the + * Software, and to permit third-parties to whom the Software is furnished to + * do so, all subject to the following: + * + * The copyright notices in the Software and this entire statement, including + * the above license grant, this restriction and the following disclaimer, + * must be included in all copies of the Software, in whole or in part, and + * all derivative works of the Software, unless such copies or derivative + * works are solely in the form of machine-executable object code generated by + * a source language processor. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LL_PANELSEARCHGROUPS_H +#define LL_PANELSEARCHGROUPS_H + +#include "llpanelsearchbase.h" + +class LLSearchEditor; + +class LLPanelSearchGroups : public LLPanelSearch +{ +public: + LLPanelSearchGroups(); + /*virtual*/ BOOL postBuild(); + +private: + /*virtual*/ void onCommitSearch(LLUICtrl* ctrl); + /*virtual*/ void search(); + + LLSearchEditor* mSearchEditor; +}; + +#endif // LL_PANELSEARCHGROUPS_H diff --git a/indra/newview/llpanelsearchlandsales.cpp b/indra/newview/llpanelsearchlandsales.cpp new file mode 100644 index 00000000000..2b136f02dfc --- /dev/null +++ b/indra/newview/llpanelsearchlandsales.cpp @@ -0,0 +1,118 @@ +/* + * @file llpanelsearchlandsales.cpp + * @brief Groups search panel + * + * Copyright (c) 2014, Cinder Roxley <cinder@sdf.org> + * + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (the "Software") to use, reproduce, display, distribute, + * execute, and transmit the Software, and to prepare derivative works of the + * Software, and to permit third-parties to whom the Software is furnished to + * do so, all subject to the following: + * + * The copyright notices in the Software and this entire statement, including + * the above license grant, this restriction and the following disclaimer, + * must be included in all copies of the Software, in whole or in part, and + * all derivative works of the Software, unless such copies or derivative + * works are solely in the form of machine-executable object code generated by + * a source language processor. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#include "llviewerprecompiledheaders.h" +#include "llpanelsearchlandsales.h" +#include "llfloaterdirectory.h" + +#include "llfloaterreg.h" +#include "llqueryflags.h" + +#include "llagent.h" +#include "llnotificationsutil.h" +#include "llsearcheditor.h" +#include "llsearchhistory.h" +#include "llviewercontrol.h" + +static LLPanelInjector<LLPanelSearchLandSales> t_panel_search_land_sales("panel_search_landsales"); + +LLPanelSearchLandSales::LLPanelSearchLandSales() +: LLPanelSearch() +{ + mCommitCallbackRegistrar.add("Search.query", boost::bind(&LLPanelSearchLandSales::onCommitSearch, this, _1)); +} + +BOOL LLPanelSearchLandSales::postBuild() +{ + return TRUE; +} + +void LLPanelSearchLandSales::onCommitSearch(LLUICtrl* ctrl) +{ + search(); +} + +void LLPanelSearchLandSales::search() +{ + LLDirQuery query; + query.type = SE_LANDSALES; + query.results_per_page = 100; + + static LLUICachedControl<bool> inc_pg("ShowPGLand", 1); + static LLUICachedControl<bool> inc_mature("ShowMatureLand", 0); + static LLUICachedControl<bool> inc_adult("ShowAdultLand", 0); + static LLUICachedControl<bool> limit_price("FindLandPrice", 1); + static LLUICachedControl<bool> limit_area("FindLandArea", 1); + if (!(inc_pg || inc_mature || inc_adult)) + { + LLNotificationsUtil::add("NoContentToSearch"); + return; + } + + const std::string& type = gSavedSettings.getString("FindLandType"); + if (type == "All") + query.category_int = ST_ALL; + else if (type == "Auction") + query.category_int = ST_AUCTION; + else if (type == "Mainland") + query.category_int = ST_MAINLAND; + else if (type == "Estate") + query.category_int = ST_ESTATE; + + if (gAgent.wantsPGOnly()) + query.scope |= DFQ_PG_SIMS_ONLY; + if (inc_pg) + query.scope |= DFQ_INC_PG; + if (inc_mature && gAgent.canAccessMature()) + query.scope |= DFQ_INC_MATURE; + if (inc_adult && gAgent.canAccessAdult()) + query.scope |= DFQ_INC_ADULT; + + const std::string& sort = gSavedSettings.getString("AlchemyFindLandSort"); + if (sort == "Name") + query.scope |= DFQ_NAME_SORT; + else if (sort == "Price") + query.scope |= DFQ_PRICE_SORT; + else if (sort == "PPM") + query.scope |= DFQ_PER_METER_SORT; + else if (sort == "Area") + query.scope |= DFQ_AREA_SORT; + + if (gSavedSettings.getBOOL("AlchemyFindLandSortAscending")) + query.scope |= DFQ_SORT_ASC; + if (limit_price) + query.scope |= DFQ_LIMIT_BY_PRICE; + if (limit_area) + query.scope |= DFQ_LIMIT_BY_AREA; + query.price = childGetValue("edit_price").asInteger(); + query.area = childGetValue("edit_area").asInteger(); + + mFloater->queryDirectory(query, true); +} diff --git a/indra/newview/llpanelsearchlandsales.h b/indra/newview/llpanelsearchlandsales.h new file mode 100644 index 00000000000..0ade87ed6f4 --- /dev/null +++ b/indra/newview/llpanelsearchlandsales.h @@ -0,0 +1,47 @@ +/* + * @file llpanelsearchlandsales.h + * @brief Land sale search panel + * + * Copyright (c) 2014, Cinder Roxley <cinder@sdf.org> + * + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (the "Software") to use, reproduce, display, distribute, + * execute, and transmit the Software, and to prepare derivative works of the + * Software, and to permit third-parties to whom the Software is furnished to + * do so, all subject to the following: + * + * The copyright notices in the Software and this entire statement, including + * the above license grant, this restriction and the following disclaimer, + * must be included in all copies of the Software, in whole or in part, and + * all derivative works of the Software, unless such copies or derivative + * works are solely in the form of machine-executable object code generated by + * a source language processor. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LL_PANELSEARCHLANDSALES_H +#define LL_PANELSEARCHLANDSALES_H + +#include "llpanelsearchbase.h" + +class LLPanelSearchLandSales : public LLPanelSearch +{ +public: + LLPanelSearchLandSales(); + /*virtual*/ BOOL postBuild(); + +private: + /*virtual*/ void search(); + /*virtual*/ void onCommitSearch(LLUICtrl* ctrl); +}; + +#endif // LL_PANELSEARCHLANDSALES_H diff --git a/indra/newview/llpanelsearchpeople.cpp b/indra/newview/llpanelsearchpeople.cpp new file mode 100644 index 00000000000..dbd60489046 --- /dev/null +++ b/indra/newview/llpanelsearchpeople.cpp @@ -0,0 +1,87 @@ +/* + * @file llpanelsearchpeople.cpp + * @brief People search panel + * + * Copyright (c) 2014, Cinder Roxley <cinder@sdf.org> + * + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (the "Software") to use, reproduce, display, distribute, + * execute, and transmit the Software, and to prepare derivative works of the + * Software, and to permit third-parties to whom the Software is furnished to + * do so, all subject to the following: + * + * The copyright notices in the Software and this entire statement, including + * the above license grant, this restriction and the following disclaimer, + * must be included in all copies of the Software, in whole or in part, and + * all derivative works of the Software, unless such copies or derivative + * works are solely in the form of machine-executable object code generated by + * a source language processor. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#include "llviewerprecompiledheaders.h" +#include "llpanelsearchpeople.h" +#include "llfloaterdirectory.h" + +#include "llfloaterreg.h" + +#include "llagent.h" +#include "llsearcheditor.h" +#include "llsearchhistory.h" + +static LLPanelInjector<LLPanelSearchPeople> t_panel_search_people("panel_search_people"); + +LLPanelSearchPeople::LLPanelSearchPeople() +: LLPanelSearch() +{ + mCommitCallbackRegistrar.add("Search.query", boost::bind(&LLPanelSearchPeople::onCommitSearch, this, _1)); +} + +BOOL LLPanelSearchPeople::postBuild() +{ + mSearchEditor = getChild<LLSearchEditor>("search_bar"); + //mSearchEditor->setKeystrokeCallback(boost::bind(&LLPanelSearchPeople::onCommitSearch, this, _1)); + + return TRUE; +} + +void LLPanelSearchPeople::onCommitSearch(LLUICtrl* ctrl) +{ + LLSearchEditor* pSearchEditor = dynamic_cast<LLSearchEditor*>(ctrl); + if (pSearchEditor) + { + std::string text = pSearchEditor->getText(); + LLStringUtil::trim(text); + if (text.length() <= MIN_SEARCH_STRING_SIZE) + LLSearchHistory::getInstance()->addEntry(text); + } + search(); +} + +bool isNotAlphaNum(char c) +{ + return !std::isalnum(c); +} + +void LLPanelSearchPeople::search() +{ + LLDirQuery query; + query.type = SE_PEOPLE; + query.results_per_page = 100; + query.text = mSearchEditor->getText(); + std::replace_if(query.text.begin(), query.text.end(), isNotAlphaNum, ' '); + LLStringUtil::trim(query.text); + + mFloater->queryDirectory(query, true); + if (query.text.length() < MIN_SEARCH_STRING_SIZE) + mFloater->setResultsComment(getString("SeachFilteredOnShortWordsEmpty")); +} diff --git a/indra/newview/llpanelsearchpeople.h b/indra/newview/llpanelsearchpeople.h new file mode 100644 index 00000000000..f3009945ca2 --- /dev/null +++ b/indra/newview/llpanelsearchpeople.h @@ -0,0 +1,51 @@ +/* + * @file llpanelsearchpeople.h + * @brief People search panel + * + * Copyright (c) 2014, Cinder Roxley <cinder@sdf.org> + * + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (the "Software") to use, reproduce, display, distribute, + * execute, and transmit the Software, and to prepare derivative works of the + * Software, and to permit third-parties to whom the Software is furnished to + * do so, all subject to the following: + * + * The copyright notices in the Software and this entire statement, including + * the above license grant, this restriction and the following disclaimer, + * must be included in all copies of the Software, in whole or in part, and + * all derivative works of the Software, unless such copies or derivative + * works are solely in the form of machine-executable object code generated by + * a source language processor. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LL_PANELSEARCHPEOPLE_H +#define LL_PANELSEARCHPEOPLE_H + +#include "llpanelsearchbase.h" + +class LLSearchEditor; + +class LLPanelSearchPeople : public LLPanelSearch +{ +public: + LLPanelSearchPeople(); + /*virtual*/ BOOL postBuild(); + +private: + /*virtual*/ void onCommitSearch(LLUICtrl* ctrl); + /*virtual*/ void search(); + + LLSearchEditor* mSearchEditor; +}; + +#endif // LL_PANELSEARCHPEOPLE_H diff --git a/indra/newview/llpanelsearchplaces.cpp b/indra/newview/llpanelsearchplaces.cpp new file mode 100644 index 00000000000..42de344606b --- /dev/null +++ b/indra/newview/llpanelsearchplaces.cpp @@ -0,0 +1,113 @@ +/* + * @file llpanelsearchplaces.cpp + * @brief Groups search panel + * + * Copyright (c) 2014, Cinder Roxley <cinder@sdf.org> + * + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (the "Software") to use, reproduce, display, distribute, + * execute, and transmit the Software, and to prepare derivative works of the + * Software, and to permit third-parties to whom the Software is furnished to + * do so, all subject to the following: + * + * The copyright notices in the Software and this entire statement, including + * the above license grant, this restriction and the following disclaimer, + * must be included in all copies of the Software, in whole or in part, and + * all derivative works of the Software, unless such copies or derivative + * works are solely in the form of machine-executable object code generated by + * a source language processor. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#include "llviewerprecompiledheaders.h" +#include "llpanelsearchplaces.h" +#include "llfloaterdirectory.h" + +#include "llfloaterreg.h" +#include "llqueryflags.h" + +#include "llagent.h" +#include "llcombobox.h" +#include "llnotificationsutil.h" +#include "llparcel.h" +#include "llsearcheditor.h" +#include "llsearchhistory.h" + +static LLPanelInjector<LLPanelSearchPlaces> t_panel_search_places("panel_search_places"); + +LLPanelSearchPlaces::LLPanelSearchPlaces() +: LLPanelSearch() +{ + mCommitCallbackRegistrar.add("Search.query", boost::bind(&LLPanelSearchPlaces::onCommitSearch, this, _1)); +} + +BOOL LLPanelSearchPlaces::postBuild() +{ + mPlacesCategory = getChild<LLComboBox>("places_category"); + mPlacesCategory->add("All categories", LLSD("any")); + mPlacesCategory->addSeparator(); + for (size_t category = LLParcel::C_LINDEN; category < LLParcel::C_COUNT; ++category) + { + LLParcel::ECategory eCategory = static_cast<LLParcel::ECategory>(category); + mPlacesCategory->add(LLParcel::getCategoryUIString(eCategory), LLParcel::getCategoryString(eCategory)); + } + + mSearchEditor = getChild<LLSearchEditor>("search_bar"); + //mSearchEditor->setKeystrokeCallback(boost::bind(&LLPanelSearchPlaces::onCommitSearch, this, _1)); + + return TRUE; +} + +void LLPanelSearchPlaces::onCommitSearch(LLUICtrl* ctrl) +{ + LLSearchEditor* pSearchEditor = dynamic_cast<LLSearchEditor*>(ctrl); + if (pSearchEditor) + { + std::string text = pSearchEditor->getText(); + LLStringUtil::trim(text); + if (text.length() <= MIN_SEARCH_STRING_SIZE) + LLSearchHistory::getInstance()->addEntry(text); + } + search(); +} + +void LLPanelSearchPlaces::search() +{ + LLDirQuery query; + query.type = SE_PLACES; + query.results_per_page = 100; + query.text = mSearchEditor->getText(); + LLStringUtil::trim(query.text); + + const std::string& category_string = mPlacesCategory->getSelectedValue(); + query.category_char = category_string == "any" ? LLParcel::C_ANY : LLParcel::getCategoryFromString(category_string); + + static LLUICachedControl<bool> inc_pg("ShowPGSims", 1); + static LLUICachedControl<bool> inc_mature("ShowMatureSims", 0); + static LLUICachedControl<bool> inc_adult("ShowAdultSims", 0); + if (!(inc_pg || inc_mature || inc_adult)) + { + LLNotificationsUtil::add("NoContentToSearch"); + return; + } + if (gAgent.wantsPGOnly()) + query.scope |= DFQ_PG_SIMS_ONLY; + if (inc_pg) + query.scope |= DFQ_INC_PG; + if (inc_mature && gAgent.canAccessMature()) + query.scope |= DFQ_INC_MATURE; + if (inc_adult && gAgent.canAccessAdult()) + query.scope |= DFQ_INC_ADULT; + query.scope |= DFQ_DWELL_SORT; + + mFloater->queryDirectory(query, true); +} diff --git a/indra/newview/llpanelsearchplaces.h b/indra/newview/llpanelsearchplaces.h new file mode 100644 index 00000000000..4614ad7a421 --- /dev/null +++ b/indra/newview/llpanelsearchplaces.h @@ -0,0 +1,53 @@ +/* + * @file llpanelsearchplaces.h + * @brief Groups search panel + * + * Copyright (c) 2014, Cinder Roxley <cinder@sdf.org> + * + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (the "Software") to use, reproduce, display, distribute, + * execute, and transmit the Software, and to prepare derivative works of the + * Software, and to permit third-parties to whom the Software is furnished to + * do so, all subject to the following: + * + * The copyright notices in the Software and this entire statement, including + * the above license grant, this restriction and the following disclaimer, + * must be included in all copies of the Software, in whole or in part, and + * all derivative works of the Software, unless such copies or derivative + * works are solely in the form of machine-executable object code generated by + * a source language processor. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LL_PANELSEARCHPLACES_H +#define LL_PANELSEARCHPLACES_H + +#include "llpanelsearchbase.h" + +class LLComboBox; +class LLSearchEditor; + +class LLPanelSearchPlaces : public LLPanelSearch +{ +public: + LLPanelSearchPlaces(); + /*virtual*/ BOOL postBuild(); + +private: + /*virtual*/ void onCommitSearch(LLUICtrl* ctrl); + /*virtual*/ void search(); + + LLSearchEditor* mSearchEditor; + LLComboBox* mPlacesCategory; +}; + +#endif // LL_PANELSEARCHPLACES_H diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 61d7514c5f9..5b4f84520af 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -108,6 +108,7 @@ //#include "llfirstuse.h" #include "llfloaterhud.h" #include "llfloaterland.h" +#include "llfloatersearch.h" #include "llfloatertopobjects.h" #include "llfloaterworldmap.h" #include "llgesturemgr.h" @@ -179,6 +180,7 @@ #include "llappviewer.h" #include "llfasttimerview.h" #include "llfloatermap.h" +#include "llfloaterdirectory.h" #include "llweb.h" #include "llvoiceclient.h" #include "llnamelistctrl.h" @@ -1965,6 +1967,10 @@ bool idle_startup() display_startup(); + // Build the search floater early on so it pops open quick when we want it. + LLFloaterReg::getTypedInstance<LLFloaterDirectory>("search"); + display_startup(); + // We're successfully logged in. gSavedSettings.setBOOL("FirstLoginThisInstall", FALSE); @@ -2603,6 +2609,13 @@ void register_viewer_callbacks(LLMessageSystem* msg) // Special handler as this message is sometimes used for group land. msg->setHandlerFunc("PlacesReply", process_places_reply); msg->setHandlerFunc("GroupNoticesListReply", LLPanelGroupNotices::processGroupNoticesListReply); + + msg->setHandlerFunc("DirPeopleReply", LLFloaterDirectory::processSearchPeopleReply); + msg->setHandlerFunc("DirGroupsReply", LLFloaterDirectory::processSearchGroupsReply); + msg->setHandlerFunc("DirPlacesReply", LLFloaterDirectory::processSearchPlacesReply); + msg->setHandlerFunc("DirEventsReply", LLFloaterDirectory::processSearchEventsReply); + msg->setHandlerFunc("DirLandReply", LLFloaterDirectory::processSearchLandReply); + msg->setHandlerFunc("DirClassifiedReply", LLFloaterDirectory::processSearchClassifiedsReply); msg->setHandlerFunc("AvatarPickerReply", LLFloaterAvatarPicker::processAvatarPickerReply); diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 0777ee2b9d4..11a31c8bbe3 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -69,6 +69,7 @@ #include "llfloaterconversationpreview.h" #include "llfloaterdeleteprefpreset.h" #include "llfloaterdestinations.h" +#include "llfloaterdirectory.h" #include "llfloaterdisplayname.h" #include "llfloatereditextdaycycle.h" #include "llfloaterenvironmentadjust.h" @@ -245,6 +246,7 @@ void LLViewerFloaterReg::registerFloaters() 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("directory", "floater_directory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDirectory>); LLFloaterReg::add("env_post_process", "floater_post_process.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostProcess>); diff --git a/indra/newview/skins/default/textures/icon_auction.tga b/indra/newview/skins/default/textures/icon_auction.tga new file mode 100644 index 0000000000000000000000000000000000000000..d121833b475fcfd92b3e2c7a536123f0fa611f08 GIT binary patch literal 1068 zcmZQzU}As)0R{mE1r8@W8wPwBsQN!Xj888}4x~4!<kf!=0MRh);8uiUE<ST`*^g{K zNDV$SaLIx6!Q4g*GhlAVWj{<Dn>#>a5t(=Xuio_^9#$~**l3s;QnChM^&lD)&LI6T z3{rzlFH8(157GzIo0NNzY%@S{-9O{i|2x3w2e||07JP1i*$-0-(p%ec=YMX+DKHHZ zC!`;w24pu#Z+*wZ{}t6Iz<NPpiBB&m3_$Y8dO>!t-~AsP4}|o>^n=n9NFS+sk>h|| iy~t*O+)K#KKzT3-2?})$^9=U%_tTAV^Yn4mV*mjCqF5>b literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/icon_group.png b/indra/newview/skins/default/textures/icon_group.png new file mode 100644 index 0000000000000000000000000000000000000000..dfb4bc7a96e0216cea829d4954371040cb2d61b6 GIT binary patch literal 484 zcmV<A0UQ2_P)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM00052Nkl<ZC>3Rr z$!@|x5Jd5K0Gk~-YziQOxxs}G;KJu~ARiEfxNu~XkOST(Zy1{#(nw~yyQ;c+Y-_z< z7xEB7q-mNY2?g7>Ez43$<<0D0zH@`_bULHa2<YK(IGs-aIT?Y5Vfw!Bc^;|bIGfET zilVooISBIyB97yFy<V%;uz|5^wQA1Vo5<t<X9P}g2+%x9;g}*q1*N;BL}m#bO7w2G zTd7oHpX>D+h9NUstyb_8TrL-t=nK#U!|ryw{eGYG{eGtie?Fi0dc8)Y!6w_U?e2Sr zkhX+8c4xEMcsy>m+X#nINF6BhU@Dc$@N<X+MM=)Z4+ewfa>=5&+VA(r<B?vuTsFf| zY&M%%eLkPr1cX7uM8^B@Km(<1Rwrc#v|tJvQcCWgga+X{Zn0QIo+ljYctn0OnE<w@ z(<wPFd1Z!hKA*WFW*WC_OhDixV7@?r<<R4DKrr|5c;MKOk$k(N!Vrn|)oR6^20_3M z1Z4C`nXC%>J@Vv7FhMRB3ohF%fHqYSgzLI-600=-T3;_3o&Zf-({m^X_}G*7-?#kg a>&Gt?7vD*&5LhMv0000<MNUMnLSTYd1>6Pz literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/icon_place.tga b/indra/newview/skins/default/textures/icon_place.tga new file mode 100644 index 0000000000000000000000000000000000000000..2170c984994e33bb169b499f44c54580bec595a6 GIT binary patch literal 1068 zcma))O-KSk6o7|J2{n{DN>mpiN-q*oXDy5<$doXWE^C2yvPDt^j~(nHMMz|q*0U^K zy>#%_Ey#jS5kXQAX@63$H>+dYvdPZ!@#g1!^O)Hoq>Hd-B~~)j0{}z~Lm&ydaUYO= z`zab>WEQch<*Ln@_Aj8@9RXsS0Q5GIHN=MutK}=_Ob3^s=Z=9mSE%oAF@tdu89?+( zM?P-)c_6MZ^>v6HnL-?h4e6EVkH%bkmR$>I0o^`C$Na(Vu?qFd-(@H@N+7<8Ak+lN zJ?9|vn1S>|8u)u2B6m?~|37ZRaYfy8{K{YGf1>{`LZMdp^{dq1f@sTUby>vv*HV3% zFVtK96V{h}{$HQ&GZJ&1XgNF0VRbvj_W#5C@02HBGwv8c3mb8BQ0}olb&K_)gzzdr z_9F|aMhf^BJbN_?+${(0Gq+S@HDNkr9*bK1&`k(}l_1;Wh`BUs@!R#2#=P8RzLxWI oar3&;RgUTX8@T5CSFXv&_!gzMwCMK)ygu*3ykmLVJLhqdAMMdz%K!iX literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index fefe3240538..cb3a93b7c2f 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -800,6 +800,9 @@ with the same filename but different name <texture name="icon_diurnal.tga" /> <texture name="icon_for_sale.tga" file_name="icons/Icon_For_Sale.png" /> <texture name="icon_top_pick.tga" /> + <texture name="Icon_Place" file_name="icon_place.tga" preload="false" /> + <texture name="Icon_Auction" file_name="icon_auction.tga" preload="false" /> + <texture name="Icon_Group" file_name="icon_group.png" preload="false" /> <texture name="lag_status_critical.tga" /> <texture name="lag_status_good.tga" /> diff --git a/indra/newview/skins/default/xui/en/floater_directory.xml b/indra/newview/skins/default/xui/en/floater_directory.xml new file mode 100644 index 00000000000..f550c145461 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_directory.xml @@ -0,0 +1,282 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + single_instance="true" + can_resize="true" + height="590" + min_height="135" + min_width="430" + layout="topleft" + name="directory" + save_rect="true" + title="SEARCH" + width="602"> + <floater.string + name="not_found"> +'[TEXT]' not found + </floater.string> + <floater.string + name="no_results"> +No results + </floater.string> + <floater.string + name="result_spillover"> +Over [TOTAL] results Showing [VISIBLE_BEGIN]/[VISIBLE_END] + </floater.string> + <floater.string + name="result_count"> +[TOTAL] results. + </floater.string> + <floater.string + name="searching"> +Searching... + </floater.string> + <floater.string + name="all_categories"> +All Categories + </floater.string> + <floater.string + name="search_banned"> +Some terms in your search query were excluded due to content restrictions as clarified in the Community Standards. + </floater.string> + <floater.string + name="search_short"> +Your search terms were too short so no search was performed. + </floater.string> + <floater.string + name="search_disabled"> +Directory search is disabled in this region. + </floater.string> + <floater.string + name="search_no_date_offset"> +Your search terms were missing the date offset. + </floater.string> + <floater.string + name="search_no_catgory"> +Your search terms were missing a category. + </floater.string> + <floater.string + name="search_no_query"> +Your search terms were missing a query string. + </floater.string> + <tab_container + border="true" + follows="top|left|right" + top="16" + left="0" + height="70" + width="602" + name="search_tabs" + tab_min_width="70" + tab_position="top"> + <panel + border="false" + label="People" + filename="panel_search_people.xml" + class="panel_search_people" + name="panel_search_people" + follows="left|top|right" + layout="topleft" + left="0" + top="0" /> + <panel + border="false" + label="Groups" + filename="panel_search_groups.xml" + class="panel_search_groups" + name="panel_search_groups" + follows="left|top|right" + layout="topleft" + left="0" + top="0" /> + <panel + border="false" + label="Places" + filename="panel_search_places.xml" + class="panel_search_places" + name="panel_search_places" + follows="left|top|right" + layout="topleft" + left="0" + top="0" /> + <panel + border="false" + label="Land" + filename="panel_search_landsales.xml" + class="panel_search_landsales" + name="panel_search_landsales" + follows="left|top|right" + layout="topleft" + left="0" + top="0" /> + <panel + border="false" + label="Events" + filename="panel_search_events.xml" + class="panel_search_events" + name="panel_search_events" + follows="left|top|right" + layout="topleft" + left="0" + top="0" /> + <panel + border="false" + label="Classifieds" + filename="panel_search_classifieds.xml" + class="panel_search_classifieds" + name="panel_search_classifieds" + follows="left|top|right" + layout="topleft" + left="0" + top="0" /> + </tab_container> + <layout_stack + follows="all" + animate="false" + top="87" + bottom="-25" + left="0" + right="-1" + drag_handle_gap="2" + drag_handle_first_indent="1" + drag_handle_second_indent="1" + layout="topleft" + name="results_stack" + orientation="horizontal" + show_drag_handle="true"> + <layout_panel + border="true" + auto_resize="true" + user_resize="true" + layout="topleft" + top="0" + left="0" + width="300" + bottom="-1" + min_height="10" + name="results_lp"> + <scroll_list + layout="topleft" + top="1" + left="2" + width="300" + bottom="-1" + column_padding="0" + draw_heading="true" + follows="left|right|top|bottom" + multi_select="true" + name="results" + search_column="0" /> + </layout_panel> + <layout_panel + border="true" + auto_resize="true" + user_resize="true" + layout="topleft" + top="0" + bottom="-1" + left="405" + width="313" + min_height="10" + name="detail_lp"> + <panel + follows="all" + name="detail_avatar" + top="0" + bottom="-1" + left="0" + width="313" + class="panel_profile_legacy_sidetray" + filename="panel_profile_legacy_sidetray.xml" /> + <panel + follows="all" + name="detail_group" + top="0" + bottom="-1" + left="0" + width="313" + class="panel_group_info_sidetray" + filename="panel_group_info_sidetray.xml" /> + <panel + follows="all" + name="detail_place" + top="0" + bottom="-1" + left="0" + width="313" + class="panel_places" + filename="panel_places.xml" /> + <panel + follows="all" + name="detail_event" + top="0" + bottom="-1" + left="0" + width="313" + class="panel_event_info" + filename="panel_event_info.xml" /> + <panel + follows="all" + name="detail_classified" + top="0" + bottom="-1" + left="0" + width="313" + class="panel_classified_info" + filename="panel_classified_info.xml" /> + </layout_panel> + </layout_stack> + <text + follows="bottom|left" + height="16" + layout="topleft" + left="4" + name="results_status" + top_pad="3" + value="[TOTAL] results" + width="205" /> + <button + follows="bottom|left" + height="16" + width="16" + image_unselected="Arrow_Left" + image_disabled="Arrow_Left_Off" + image_disabled_selected="Arrow_Left_Off" + image_selected="Arrow_Left" + image_pressed="Arrow_Left" + image_top_pad="0" + layout="topleft" + left_pad="5" + name="PageDn" + top_delta="0"> + <button.commit_callback + function="Search.Page" + parameter="back"/> + </button> + <button + follows="bottom|left" + height="16" + width="16" + image_unselected="Arrow_Right" + image_disabled="Arrow_Right_Off" + image_disabled_selected="Arrow_Right_Off" + image_selected="Arrow_Right" + image_pressed="Arrow_Right" + image_top_pad="0" + layout="topleft" + left_pad="5" + name="PageUp" + top_delta="0"> + <button.commit_callback + function="Search.Page" + parameter="forward" /> + </button> + <loading_indicator + follows="bottom|right" + height="16" + layout="topleft" + right="-4" + name="loading" + top_delta="0" + width="16" /> +</floater> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 78e14fee909..e0ad5097bfc 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -557,6 +557,16 @@ function="Floater.Toggle" parameter="search" /> </menu_item_check> + <menu_item_check + label="Directory..." + name="Directory"> + <menu_item_check.on_check + function="Floater.Visible" + parameter="directory" /> + <menu_item_check.on_click + function="Floater.Toggle" + parameter="directory" /> + </menu_item_check> <menu_item_separator/> <menu_item_call label="Teleport home" diff --git a/indra/newview/skins/default/xui/en/panel_event_info.xml b/indra/newview/skins/default/xui/en/panel_event_info.xml new file mode 100644 index 00000000000..81e884079f2 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_event_info.xml @@ -0,0 +1,456 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + follows="all" + height="570" + layout="topleft" + left="0" + min_height="350" + name="event_info" + class="event_info" + top="20" + width="333"> + <panel.string name="free"> + FREE + </panel.string> + <panel.string name="hours"> + hours + </panel.string> + <panel.string name="minutes"> + minutes + </panel.string> + <panel.string name="type_mature"> + Moderate + </panel.string> + <panel.string name="type_pg"> + General Content + </panel.string> + <panel.string name="reminder"> + Remind + </panel.string> + <panel.string name="no_reminder"> + Don't remind + </panel.string> + <button + follows="top|left" + height="24" + image_hover_unselected="BackButton_Over" + image_pressed="BackButton_Press" + image_unselected="BackButton_Off" + layout="topleft" + name="back_btn" + left="10" + 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="4" + name="title" + text_color="LtGray" + top="0" + value="Event Info" + use_ellipses="true" + width="275" /> + <scroll_container + color="DkGray2" + opaque="true" + follows="all" + height="502" + layout="topleft" + left="10" + top_pad="10" + name="profile_scroll" + reserve_scroll_corner="false" + width="312"> + <panel + name="scroll_content_panel" + follows="left|top" + min_height="300" + layout="topleft" + top="0" + background_visible="false" + height="610" + left="0" + width="285"> + <panel + name="snapshot_panel" + layout="topleft" + follows="left|top|right" + height="197" + left="10" + top="10" + width="275"> + <texture_picker + fallback_image="default_land_picture.j2c" + enabled="false" + follows="left|top|right" + height="197" + layout="topleft" + left="0" + name="snapshot" + top="0" + width="275" /> + </panel> + <text_editor + allow_scroll="false" + bg_visible="false" + follows="left|top|right" + h_pad="0" + height="35" + width="290" + layout="topleft" + font="SansSerifBig" + font.style="BOLD" + left="10" + top_pad="10" + name="name" + read_only="true" + text_color="white" + v_pad="0" + value="[name]" + use_ellipses="true" /> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="event_location_label" + text_color="white" + top_pad="5" + value="Location:" + width="250" /> + <text_editor + parse_urls="true" + allow_scroll="false" + bg_visible="false" + follows="left|top" + h_pad="0" + height="30" + layout="topleft" + left="10" + name="location" + read_only="true" + top_pad="5" + width="290" + word_wrap="true" + v_pad="0" + value="[loading...]" /> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="content_type_label" + text_color="white" + top_pad="10" + value="Content Type:" + width="140" /> + <icon + follows="top|left" + height="16" + image_name="Parcel_M_Light" + layout="topleft" + left_pad="0" + name="content_type_moderate" + top_pad="-11" + width="18" /> + <icon + follows="top|left" + height="16" + image_name="Parcel_PG_Light" + layout="topleft" + left_delta="0" + name="content_type_general" + top_delta="0" + width="18" /> + <text_editor + allow_scroll="false" + bg_visible="false" + follows="left|top|right" + h_pad="0" + height="18" + layout="topleft" + left_pad="2" + name="content_type" + read_only="true" + width="130" + top_delta="1" + v_pad="0" + value="[content type]" /> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="time_label" + text_color="white" + top_pad="0" + value="Time:" + width="140" /> + <text_editor + allow_scroll="false" + bg_visible="false" + follows="left|top|right" + h_pad="0" + height="18" + layout="topleft" + left_pad="0" + name="time" + read_only="true" + width="150" + top_pad="-10" + v_pad="0" + value="[time]" /> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="duration_label" + text_color="white" + top_pad="0" + value="Duration:" + width="140" /> + <text_editor + allow_scroll="false" + bg_visible="false" + follows="left|top" + h_pad="0" + halign="left" + height="16" + layout="topleft" + left_pad="0" + name="duration" + read_only="true" + top_pad="-10" + v_pad="0" + value="[duration] hours" + width="150" /> + <layout_stack + animate="false" + name="descr_stack" + layout="topleft" + follows="all" + orientation="vertical" + left="10" + top_pad="5" + width="290" + height="215"> + <layout_panel + auto_resize="false" + name="host_layout_panel" + layout="topleft" + follows="all" + left="0" + top="0" + width="290" + height="16"> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="0" + name="host_label" + text_color="white" + top_pad="0" + value="Host:" + width="140" /> + <text_editor + allow_scroll="false" + bg_visible="false" + follows="left|top" + h_pad="0" + halign="left" + height="16" + layout="topleft" + left_pad="0" + parse_urls="true" + name="host" + read_only="true" + top_pad="-10" + v_pad="0" + value="secondlife:///app/agent/00000000-0000-0000-0000-000000000000/inspect" + width="150" /> + </layout_panel> + <layout_panel + auto_resize="false" + name="category_panel" + layout="topleft" + follows="all" + left="0" + top="0" + width="290" + height="16"> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="0" + name="category_label" + text_color="white" + top="0" + value="Category:" + width="140" /> + <text + height="16" + layout="topleft" + follows="top|left" + left_pad="0" + name="category" + top_pad="-10" + value="[category]" + width="150" /> + </layout_panel> + <layout_panel + auto_resize="false" + name="cover_panel" + layout="topleft" + follows="all" + left="0" + top="0" + width="290" + height="16"> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="0" + name="cover_label" + text_color="white" + top="0" + value="Cover:" + width="140" /> + <text + height="16" + layout="topleft" + follows="top|left" + left_pad="0" + name="cover" + top_pad="-10" + value="L$[cover]" + width="150" /> + </layout_panel> + <layout_panel + name="descr_layout_panel" + layout="topleft" + follows="all" + left="0" + top="0" + width="290" + height="215"> + <text + auto_resize="false" + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="0" + name="desc_label" + text_color="white" + top="0" + value="Description:" + width="250" /> + <text_editor + parse_urls="true" + allow_scroll="true" + bg_visible="false" + follows="all" + h_pad="0" + height="200" + layout="topleft" + left="0" + max_length="1023" + name="desc" + read_only="true" + top_pad="7" + width="280" + v_pad="0" + value="[description]" + word_wrap="true" /> + </layout_panel> + </layout_stack> + </panel> +</scroll_container> +<panel + follows="left|right|bottom" + height="35" + layout="topleft" + top_pad="5" + left="9" + name="buttons"> + <layout_stack + follows="bottom|left|right" + height="23" + layout="topleft" + name="layout_stack1" + left="0" + orientation="horizontal" + top_pad="0" + width="309"> + <layout_panel + follows="bottom|left|right" + height="23" + layout="bottomleft" + left="0" + name="layout_panel1" + auto_resize="true" + width="101"> + <button + follows="bottom|left|right" + height="23" + label="Teleport" + layout="topleft" + left="0" + name="teleport_btn" + top="0" + width="101" /> + </layout_panel> + <layout_panel + follows="bottom|left|right" + height="23" + layout="bottomleft" + left_pad="3" + name="show_on_map_btn_lp" + auto_resize="true" + width="100"> + <button + follows="bottom|left|right" + height="23" + label="Map" + layout="topleft" + name="show_on_map_btn" + top="0" + width="100" /> + </layout_panel> + <layout_panel + follows="bottom|left|right" + height="23" + layout="bottomleft" + left_pad="3" + name="remind_btn_lp" + auto_resize="true" + width="101"> + <button + follows="bottom|left|right" + height="23" + label="Remind" + layout="topleft" + name="remind_btn" + top="0" + width="101" /> + </layout_panel> + </layout_stack> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_profile_legacy_sidetray.xml b/indra/newview/skins/default/xui/en/panel_profile_legacy_sidetray.xml new file mode 100644 index 00000000000..e10169179e0 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_profile_legacy_sidetray.xml @@ -0,0 +1,323 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_opaque="true" + background_visible="true" + follows="all" + height="570" + label="Profile" + layout="topleft" + min_height="350" + left="0" + top="20" + name="Avatar Profile" + width="313"> + <panel.string + name="account_info_fmt"> +[ACCOUNT_TYPE] +[PAYMENT_INFO] +[AGE_VERIFIED] + </panel.string> + <panel.string + name="age_verified"> +Age Verified + </panel.string> + <panel.string + name="rezday_fmt"> +[REZDAY] ([AGE]) + </panel.string> + <panel.string + name="add_friend"> +Add Friend + </panel.string> + <panel.string + name="remove_friend"> +Remove Friend + </panel.string> + <panel + name="avatar_info_top" + follows="top|left|right" + top="0" + left="0" + height="29" + width="313" + layout="topleft"> + <button + follows="top|left" + height="24" + image_hover_unselected="BackButton_Over" + image_pressed="BackButton_Press" + image_unselected="BackButton_Off" + layout="topleft" + name="back" + left="7" + tab_stop="false" + top="2" + width="30" + use_draw_context_alpha="false" /> + <text_editor + allow_scroll="false" + bg_visible="false" + read_only="true" + layout="topleft" + name="avatar_name" + v_pad="0" + value="(Loading...)" + font="SansSerifHugeBold" + h_pad="0" + height="26" + left_pad="8" + text_color="LtGray" + top="1" + use_ellipses="true" + width="268" + follows="top|left|right" + word_wrap="false" + mouse_opaque="false"/> + <loading_indicator + height="25" + follows="top|right" + layout="topleft" + left_pad="-32" + name="progress_indicator" + top_delta="1" + width="25" /> + </panel> + <layout_stack + name="layout" + orientation="vertical" + follows="all" + left="6" + top_pad="0" + height="506" + width="302" + border_size="0"> + <layout_panel + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + name="avatar_accordions" + follows="all" + layout="topleft" + auto_resize="true" + user_resize="true" + height="513" + width="313"> + <accordion + left="0" + top="0" + single_expansion="true" + fit_parent="true" + follows="all" + layout="topleft" + name="avatar_accordion" + height="513" + width="313"> + <accordion_tab + expanded="true" + layout="topleft" + name="avatar_secondlife_tab" + title="Second Life" + fit_panel="true"> + <panel + border="false" + filename="panel_profile_secondlife.xml" + layout="topleft" + left="0" + follows="all" + name="secondlife_tab_panel" + top="0" /> + </accordion_tab> + <accordion_tab + expanded="false" + layout="topleft" + name="avatar_groups_tab" + title="Groups" + fit_panel="true"> + <panel + border="false" + class="panel_profile_groups" + filename="panel_profile_groups.xml" + follows="all" + layout="topleft" + left="0" + name="groups_tab_panel" + top="0" /> + </accordion_tab> + <accordion_tab + expanded="false" + layout="topleft" + name="avatar_interest_tab" + title="Interests" + fit_panel="false"> + <panel + border="false" + filename="panel_profile_interests.xml" + follows="left|top|right" + layout="topleft" + left="0" + name="interests_tab_panel" + top="0" /> + </accordion_tab> + <accordion_tab + expanded="false" + layout="topleft" + name="avatar_picks_tab" + title="Picks" + fit_panel="true"> + <panel + border="false" + class="panel_profile_picks" + filename="panel_profile_picks.xml" + follows="all" + layout="topleft" + left="0" + name="picks_tab_panel" + top="0" /> + </accordion_tab> + <accordion_tab + expanded="false" + layout="topleft" + name="avatar_firstlife_tab" + title="First Life" + fit_panel="true"> + <panel + border="false" + filename="panel_profile_firstlife.xml" + follows="left|top|right" + layout="topleft" + left="0" + name="firstlife_tab_panel" + top="0" /> + </accordion_tab> + <accordion_tab + expanded="false" + layout="topleft" + name="avatar_notes_tab" + title="Notes" + fit_panel="true"> + <panel + border="false" + filename="panel_profile_notes.xml" + follows="all" + layout="topleft" + left="0" + name="notes_tab_panel" + top="0" /> + </accordion_tab> + </accordion> + </layout_panel> + </layout_stack> + + <layout_stack + follows="bottom|left|right" + height="25" + layout="topleft" + name="button_row_ls" + left="6" + orientation="horizontal" + top_pad="5" + width="299"> + <layout_panel + follows="bottom|left|right" + height="23" + layout="bottomleft" + left="0" + name="btn_chat_lp" + auto_resize="true" + width="91"> + <button + follows="bottom|left|right" + left="1" + height="23" + name="btn_chat" + label="Chat" + layout="topleft" + tool_tip="Send an instant message" + top="0" + width="90"> + <button.commit_callback + function="Profile.Action" + parameter="chat" /> + </button> + </layout_panel> + <layout_panel + follows="bottom|left|right" + height="23" + layout="bottomleft" + left_pad="3" + name="btn_friend_lp" + auto_resize="true" + width="91"> + <button + follows="bottom|left|right" + left="1" + height="23" + name="btn_friend" + label="Add Friend" + layout="topleft" + top="0" + width="90"> + <button.commit_callback + function="Profile.Action" + parameter="friend" /> + </button> + </layout_panel> + <layout_panel + follows="bottom|left|right" + height="23" + layout="bottomleft" + left_pad="3" + name="btn_block_lp" + auto_resize="true" + width="91"> + <button + follows="bottom|left|right" + left="1" + height="23" + name="btn_block" + label="Block" + layout="topleft" + tool_tip="Block this avatar" + top="0" + width="90"> + <button.commit_callback + function="Profile.Action" + parameter="block" /> + </button> + </layout_panel> + <layout_panel + follows="bottom|left|right" + height="23" + layout="bottomleft" + left_pad="3" + name="btn_menu_lp" + auto_resize="false" + width="30"> + <menu_button + follows="bottom|left|right" + height="23" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="OptionsMenu_Off" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" + menu_filename="menu_legacy_profile.xml" + menu_position="bottomleft" + tool_tip="Actions on this avatar" + layout="topleft" + left="1" + top="0" + name="btn_menu" + width="30" /> + </layout_panel> + </layout_stack> + <drop_target + top="0" + bottom="-1" + left="0" + right="-1" + layout="topleft" + follows="all" + name="drop_target" + mouse_opaque="false" /> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_search_classifieds.xml b/indra/newview/skins/default/xui/en/panel_search_classifieds.xml new file mode 100644 index 00000000000..7af7ac76a94 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_search_classifieds.xml @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + height="70" + layout="topleft" + name="panel_search_classifieds" + width="602"> + <text + follows="left|top|right" + height="16" + layout="topleft" + left="4" + name="search_title" + top="4" + value="Enter search terms:" + width="255" /> + <check_box + control_name="ShowPGClassifieds" + follows="right|top" + height="16" + label="" + layout="topleft" + left="489" + name="pg_all" + top="4" + width="15"> + <check_box.commit_callback + function="Search.query" /> + </check_box> + <icon + follows="right|top" + height="16" + image_name="Parcel_PG_Dark" + layout="topleft" + left_pad="2" + name="rating_icon_general" + top_delta="-1" + width="18"/> + <check_box + control_name="ShowMatureClassifieds" + follows="right|top" + height="16" + label="" + layout="topleft" + left_pad="2" + name="mature_all" + top_delta="1" + width="15"> + <check_box.commit_callback + function="Search.query" /> + </check_box> + <icon + follows="right|top" + height="16" + image_name="Parcel_M_Dark" + layout="topleft" + left_pad="2" + name="rating_icon_moderate" + top_delta="-1" + width="18"/> + <check_box + control_name="ShowAdultClassifieds" + follows="right|top" + height="16" + label="" + layout="topleft" + left_pad="2" + name="adult_all" + top_delta="1" + width="15"> + <check_box.commit_callback + function="Search.query" /> + </check_box> + <icon + follows="right|top" + height="16" + image_name="Parcel_R_Dark" + layout="topleft" + left_pad="2" + name="rating_icon_adult" + top_delta="-1" + width="18"/> + <search_editor + follows="top|left|right" + search_button_visible="true" + height="22" + text_readonly_color="DkGray" + label="Search" + layout="topleft" + top_pad="1" + left="4" + right="-128" + name="search_bar" + select_on_focus="true" + commit_on_focus_lost="false" + tool_tip="Enter search terms"> + <search_editor.commit_callback + function="Search.query" /> + </search_editor> + <combo_box + follows="right|top" + layout="topleft" + height="23" + allow_text_entry="false" + top_delta="0" + left_pad="2" + name="classifieds_category" + width="122"> + <combo_box.commit_callback + function="Search.query" /> + </combo_box> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_search_events.xml b/indra/newview/skins/default/xui/en/panel_search_events.xml new file mode 100644 index 00000000000..dbe5739bbf7 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_search_events.xml @@ -0,0 +1,196 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + height="70" + layout="topleft" + name="panel_search_events" + width="602"> + <text + follows="left|top" + height="16" + layout="topleft" + left="4" + name="search_title" + top="4" + value="Enter search terms:" + width="128" /> + <radio_group + top_delta="0" + left="130" + height="16" + width="230" + layout="topleft" + initial_value="current" + name="events_search_mode"> + <radio_item + height="16" + label="Ongoing and Upcoming" + layout="topleft" + name="current" + value="current" + top_pad="0" + width="120" /> + <radio_item + height="16" + label="By Date" + layout="topleft" + name="date" + value="date" + left_pad="40" + width="120" /> + <radio_group.commit_callback + function="Search.query" /> + </radio_group> + <button + follows="top|left" + height="16" + width="16" + image_unselected="MinusItem_Off" + image_disabled="MinusItem_Disabled" + image_selected="MinusItem_Press" + image_pressed="MinusItem_Press" + image_top_pad="0" + layout="topleft" + left_pad="14" + name="minus_day" + top_delta="0"> + <button.commit_callback + function="Search.MinusDay" /> + </button> + <text + type="string" + length="1" + follows="left|top" + top_delta="0" + layout="topleft" + left_pad="5" + name="events_date" + font.style="BOLD" + height="16" + width="40" + value="4/20" /> + <button + follows="top|left" + height="16" + width="16" + image_unselected="AddItem_Off" + image_disabled="AddItem_Disabled" + image_selected="AddItem_Press" + image_pressed="AddItem_Press" + image_top_pad="0" + layout="topleft" + left_pad="5" + name="plus_day" + top_delta="0"> + <button.commit_callback + function="Search.AddDay" /> + </button> + <check_box + control_name="ShowPGEvents" + follows="right|top" + height="16" + label="" + layout="topleft" + left="489" + name="pg_all" + top="4" + width="15"> + <check_box.commit_callback + function="Search.query" /> + </check_box> + <icon + follows="right|top" + height="16" + image_name="Parcel_PG_Dark" + layout="topleft" + left_pad="2" + name="rating_icon_general" + top_delta="-1" + width="18"/> + <check_box + control_name="ShowMatureEvents" + follows="right|top" + height="16" + label="" + layout="topleft" + left_pad="2" + name="mature_all" + top_delta="1" + width="15"> + <check_box.commit_callback + function="Search.query" /> + </check_box> + <icon + follows="right|top" + height="16" + image_name="Parcel_M_Dark" + layout="topleft" + left_pad="2" + name="rating_icon_moderate" + top_delta="-1" + width="18"/> + <check_box + control_name="ShowAdultEvents" + follows="right|top" + height="16" + label="" + layout="topleft" + left_pad="2" + name="adult_all" + top_delta="1" + width="15"> + <check_box.commit_callback + function="Search.query" /> + </check_box> + <icon + follows="right|top" + height="16" + image_name="Parcel_R_Dark" + layout="topleft" + left_pad="2" + name="rating_icon_adult" + top_delta="-1" + width="18"/> + <search_editor + follows="top|left|right" + search_button_visible="true" + height="22" + text_readonly_color="DkGray" + label="Search" + layout="topleft" + top_pad="1" + left="4" + right="-128" + name="search_bar" + select_on_focus="true" + commit_on_focus_lost="false" + tool_tip="Enter search terms"> + <search_editor.commit_callback + function="Search.query" /> + </search_editor> + <combo_box + follows="right|top" + layout="topleft" + height="23" + allow_text_entry="false" + top_delta="0" + left_pad="2" + name="events_category" + width="122"> + <combo_box.item label="Any Category" name="any" value="0" /> + <combo_box.item label="" value="filter_separator" enabled="false" /> + <combo_box.item label="Discussion" name="discussion" value="18" /> + <combo_box.item label="Sports" name="sports" value="19" /> + <combo_box.item label="Live Music" name="music" value="20" /> + <!-- <combo_box.item label="???" name="mystery_category" value="21" /> --> + <combo_box.item label="Commercial" name="commercial" value="22" /> + <combo_box.item label="Nightlife/Entertainment" name="nightlife" value="23" /> + <combo_box.item label="Games/Contests" name="games" value="24" /> + <combo_box.item label="Pageants" name="pageants" value="25" /> + <combo_box.item label="Education" name="education" value="26" /> + <combo_box.item label="Arts and Culture" name="arts" value="27" /> + <combo_box.item label="Charity/Support Groups" name="charity" value="28" /> + <combo_box.item label="Miscellaneous" name="misc" value="29" /> + <combo_box.commit_callback + function="Search.query" /> + </combo_box> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_search_groups.xml b/indra/newview/skins/default/xui/en/panel_search_groups.xml new file mode 100644 index 00000000000..3fd13670289 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_search_groups.xml @@ -0,0 +1,99 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + height="70" + layout="topleft" + name="panel_search_groups" + width="602"> + <text + follows="left|top|right" + height="16" + layout="topleft" + left="4" + name="search_title" + top="4" + value="Enter search terms:" + width="255" /> + <check_box + control_name="ShowPGGroups" + follows="right|top" + height="16" + label="" + layout="topleft" + left="489" + name="pg_all" + top="4" + width="15"> + <check_box.commit_callback + function="Search.query" /> + </check_box> + <icon + follows="right|top" + height="16" + image_name="Parcel_PG_Dark" + layout="topleft" + left_pad="2" + name="rating_icon_general" + top_delta="-1" + width="18"/> + <check_box + control_name="ShowMatureGroups" + follows="right|top" + height="16" + label="" + layout="topleft" + left_pad="2" + name="mature_all" + top_delta="1" + width="15"> + <check_box.commit_callback + function="Search.query" /> + </check_box> + <icon + follows="right|top" + height="16" + image_name="Parcel_M_Dark" + layout="topleft" + left_pad="2" + name="rating_icon_moderate" + top_delta="-1" + width="18"/> + <check_box + control_name="ShowAdultGroups" + follows="right|top" + height="16" + label="" + layout="topleft" + left_pad="2" + name="adult_all" + top_delta="1" + width="15"> + <check_box.commit_callback + function="Search.query" /> + </check_box> + <icon + follows="right|top" + height="16" + image_name="Parcel_R_Dark" + layout="topleft" + left_pad="2" + name="rating_icon_adult" + top_delta="-1" + width="18"/> + <search_editor + follows="top|left|right" + search_button_visible="true" + height="22" + text_readonly_color="DkGray" + label="Search" + layout="topleft" + top_pad="1" + left="4" + right="-4" + name="search_bar" + select_on_focus="true" + commit_on_focus_lost="false" + tool_tip="Enter search terms"> + <search_editor.commit_callback + function="Search.query" /> + </search_editor> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_search_landsales.xml b/indra/newview/skins/default/xui/en/panel_search_landsales.xml new file mode 100644 index 00000000000..eaae6c535df --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_search_landsales.xml @@ -0,0 +1,181 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + height="70" + layout="topleft" + name="panel_search_landsales" + width="602"> + <text + follows="left|top|right" + height="16" + layout="topleft" + left="4" + name="search_title" + top="4" + value="Enter search terms:" + width="255" /> + <check_box + control_name="ShowPGLand" + follows="right|top" + height="16" + label="" + layout="topleft" + left="489" + name="pg_all" + top="4" + width="15"> + <check_box.commit_callback + function="Search.query" /> + </check_box> + <icon + follows="right|top" + height="16" + image_name="Parcel_PG_Dark" + layout="topleft" + left_pad="2" + name="rating_icon_general" + top_delta="-1" + width="18"/> + <check_box + control_name="ShowMatureLand" + follows="right|top" + height="16" + label="" + layout="topleft" + left_pad="2" + name="mature_all" + top_delta="1" + width="15"> + <check_box.commit_callback + function="Search.query" /> + </check_box> + <icon + follows="right|top" + height="16" + image_name="Parcel_M_Dark" + layout="topleft" + left_pad="2" + name="rating_icon_moderate" + top_delta="-1" + width="18"/> + <check_box + control_name="ShowAdultLand" + follows="right|top" + height="16" + label="" + layout="topleft" + left_pad="2" + name="adult_all" + top_delta="1" + width="15"> + <check_box.commit_callback + function="Search.query" /> + </check_box> + <icon + follows="right|top" + height="16" + image_name="Parcel_R_Dark" + layout="topleft" + left_pad="2" + name="rating_icon_adult" + top_delta="-1" + width="18"/> + <check_box + control_name="FindLandPrice" + follows="left|top" + height="16" + label="Price <" + layout="topleft" + left="4" + name="price_check" + top_pad="6" + width="40" > + <check_box.commit_callback + function="Search.query" /> + </check_box> + <line_editor + enabled_control="FindLandPrice" + commit_on_focus_lost="false" + follows="left|top" + height="16" + left_pad="20" + name="edit_price" + layout="topleft" + top_delta="-1" + width="40" > + <line_editor.commit_callback + function="Search.query" /> + </line_editor> + <check_box + control_name="FindLandArea" + follows="left|top" + height="16" + label="Area >" + layout="topleft" + left_pad="3" + name="area_check" + top_delta="1" + width="40" > + <check_box.commit_callback + function="Search.query" /> + </check_box> + <line_editor + enabled_control="FindLandArea" + commit_on_focus_lost="false" + follows="left|top" + layout="topleft" + height="16" + left_pad="18" + name="edit_area" + top_delta="-1" + width="40" > + <line_editor.commit_callback + function="Search.query" /> + </line_editor> + <combo_box + control_name="FindLandType" + follows="right|top" + layout="topleft" + height="22" + allow_text_entry="false" + left_pad="90" + top_delta="-1" + name="land_type" + width="110"> + <combo_box.item label="All Categories" name="All" value="All"/> + <combo_box.item label="Auction" name="Auction" value="Auction"/> + <combo_box.item label="Mainland Sales" name="Mainland" value="Mainland"/> + <combo_box.item label="Estate Sales" name="Estate" value="Estate"/> + <combo_box.commit_callback + function="Search.query" /> + </combo_box> + <combo_box + control_name="AlchemyFindLandSort" + follows="right|top" + layout="topleft" + height="22" + allow_text_entry="false" + left_pad="2" + top_delta="0" + name="land_sort" + width="110"> + <combo_box.item label="Sort by Name" name="Name_item" value="Name"/> + <combo_box.item label="Sort by Price" name="Price_item" value="Price"/> + <combo_box.item label="Sort by Price per meter" name="PPM_item" value="PPM"/> + <combo_box.item label="Sort by Area" name="Area_item" value="Area"/> + <combo_box.commit_callback + function="Search.query" /> + </combo_box> + <check_box + control_name="AlchemyFindLandSortAscending" + follows="right|top" + height="16" + label="Ascending" + layout="topleft" + left_pad="3" + name="ascending" + top_delta="5" + width="40" > + <check_box.commit_callback + function="Search.query" /> + </check_box> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_search_people.xml b/indra/newview/skins/default/xui/en/panel_search_people.xml new file mode 100644 index 00000000000..addd20ff739 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_search_people.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + height="70" + class="panel_search_people" + name="panel_search_people" + width="602"> + <panel.string name="SeachFilteredOnShortWordsEmpty"> + Your search terms were too short so no search was performed. + </panel.string> + <text + follows="left|top|right" + height="16" + layout="topleft" + left="4" + name="search_title" + top="4" + value="Enter search terms:" + width="255" /> + <search_editor + follows="top|left|right" + search_button_visible="true" + height="22" + text_readonly_color="DkGray" + label="Search" + layout="topleft" + top_pad="1" + left="4" + right="-4" + name="search_bar" + select_on_focus="true" + commit_on_focus_lost="false" + tool_tip="Enter search terms"> + <search_editor.commit_callback + function="Search.query" /> + </search_editor> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_search_places.xml b/indra/newview/skins/default/xui/en/panel_search_places.xml new file mode 100644 index 00000000000..fabc2c6bbaa --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_search_places.xml @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + height="70" + layout="topleft" + name="panel_search_places" + width="602"> + <text + follows="left|top|right" + height="16" + layout="topleft" + left="4" + name="search_title" + top="4" + value="Enter search terms:" + width="255" /> + <check_box + control_name="ShowPGSims" + follows="right|top" + height="16" + label="" + layout="topleft" + left="489" + name="pg_all" + top="4" + width="15"> + <check_box.commit_callback + function="Search.query" /> + </check_box> + <icon + follows="right|top" + height="16" + image_name="Parcel_PG_Dark" + layout="topleft" + left_pad="2" + name="rating_icon_general" + top_delta="-1" + width="18"/> + <check_box + control_name="ShowMatureSims" + follows="right|top" + height="16" + label="" + layout="topleft" + left_pad="2" + name="mature_all" + top_delta="1" + width="15"> + <check_box.commit_callback + function="Search.query" /> + </check_box> + <icon + follows="right|top" + height="16" + image_name="Parcel_M_Dark" + layout="topleft" + left_pad="2" + name="rating_icon_moderate" + top_delta="-1" + width="18"/> + <check_box + control_name="ShowAdultSims" + follows="right|top" + height="16" + label="" + layout="topleft" + left_pad="2" + name="adult_all" + top_delta="1" + width="15"> + <check_box.commit_callback + function="Search.query" /> + </check_box> + <icon + follows="right|top" + height="16" + image_name="Parcel_R_Dark" + layout="topleft" + left_pad="2" + name="rating_icon_adult" + top_delta="-1" + width="18"/> + <search_editor + follows="top|left|right" + search_button_visible="true" + height="22" + text_readonly_color="DkGray" + label="Search" + layout="topleft" + top_pad="1" + left="4" + right="-128" + name="search_bar" + select_on_focus="true" + commit_on_focus_lost="false" + tool_tip="Enter search terms"> + <search_editor.commit_callback + function="Search.query" /> + </search_editor> + <combo_box + follows="right|top" + layout="topleft" + height="23" + allow_text_entry="false" + top_delta="0" + left_pad="2" + name="places_category" + width="122"> + <combo_box.commit_callback + function="Search.query" /> + </combo_box> +</panel> -- GitLab