diff options
| author | Mnikolenko Productengine <mnikolenko@productengine.com> | 2025-10-21 22:05:07 +0300 |
|---|---|---|
| committer | Mnikolenko Productengine <mnikolenko@productengine.com> | 2025-10-22 00:50:54 +0300 |
| commit | d294d568d1c97650bba4c388c8a7eab5a5c49c94 (patch) | |
| tree | 240f5c51beb1413f779fe84e771b7fe9638de1ee /indra/newview/llpaneldirplaces.cpp | |
| parent | 4e2a9667bda1a1980993ae453dfe6ff38dd1835a (diff) | |
#4411 WIP initial restoring of Legacy Search
Diffstat (limited to 'indra/newview/llpaneldirplaces.cpp')
| -rw-r--r-- | indra/newview/llpaneldirplaces.cpp | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/indra/newview/llpaneldirplaces.cpp b/indra/newview/llpaneldirplaces.cpp new file mode 100644 index 0000000000..2e221f393a --- /dev/null +++ b/indra/newview/llpaneldirplaces.cpp @@ -0,0 +1,214 @@ +/** + * @file llpaneldirplaces.cpp + * @brief Places panel in the legacy Search directory. + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpaneldirplaces.h" + +// linden library includes +#include "llfontgl.h" +#include "message.h" +#include "lldir.h" +#include "llparcel.h" +#include "llregionflags.h" +#include "llqueryflags.h" + +// viewer project includes +#include "llagent.h" +#include "llbutton.h" +#include "llcheckboxctrl.h" +#include "llcombobox.h" +#include "llfloaterdirectory.h" +#include "lllineeditor.h" +#include "llnotificationsutil.h" +#include "llviewerwindow.h" +#include "llpaneldirbrowser.h" +#include "llsearcheditor.h" +#include "lltextbox.h" +#include "llviewercontrol.h" + +static LLPanelInjector<LLPanelDirPlaces> t_panel_dir_people("panel_dir_places"); + +LLPanelDirPlaces::LLPanelDirPlaces() + : LLPanelDirBrowser() +{ + mMinSearchChars = 3; +} + +bool LLPanelDirPlaces::postBuild() +{ + LLPanelDirBrowser::postBuild(); + + //getChild<LLLineEditor>("name")->setKeystrokeCallback(boost::bind(&LLPanelDirBrowser::onKeystrokeName, _1, _2), NULL); + + childSetAction("Search", &LLPanelDirBrowser::onClickSearchCore, this); + //childDisable("Search"); + + mCurrentSortColumn = "dwell"; + mCurrentSortAscending = FALSE; + + childSetVisible("Category", true); + childSetEnabled("Category", true); + + // Don't prepopulate the places list, as it hurts the database as of 2006-12-04. JC + // initialQuery(); + + return true; +} + +LLPanelDirPlaces::~LLPanelDirPlaces() +{ + // MBW -- HACK!!! + // This looks like some sort of compiler bug. We have a mysterious crash during initialization on powerpc boxes. + // The crash seems unrelated to this code, but the commit that introduced it was narrowed down to this file. + // Adding llinfos calls to both the constructor and destructor here makes the crash go away, even though they don't get called before the point of the crash. + // This is wrong on many levels and scares the hell out of me. + LL_INFOS() << "called" << LL_ENDL; + // Children all cleaned up by default view destructor. +} + + +// virtual +void LLPanelDirPlaces::draw() +{ + updateMaturityCheckbox(); + + LLPanelDirBrowser::draw(); +} + +// virtual +void LLPanelDirPlaces::performQuery() +{ + std::string place_name = childGetValue("name").asString(); + if (place_name.length() < mMinSearchChars) + { + return; + } + + // "hi " is three chars but not a long-enough search + std::string query_string = place_name; + LLStringUtil::trim( query_string ); + bool query_was_filtered = (query_string != place_name); + + // possible we threw away all the short words in the query so check length + if ( query_string.length() < mMinSearchChars ) + { + LLNotificationsUtil::add("SeachFilteredOnShortWordsEmpty"); + return; + }; + + // if we filtered something out, display a popup + if ( query_was_filtered ) + { + LLSD args; + args["FINALQUERY"] = query_string; + LLNotificationsUtil::add("SeachFilteredOnShortWords", args); + }; + + std::string catstring = childGetValue("Category").asString(); + + // Because LLParcel::C_ANY is -1, must do special check + S32 category = 0; + if (catstring == "any") + { + category = LLParcel::C_ANY; + } + else + { + category = LLParcel::getCategoryFromString(catstring); + } + + U32 flags = 0x0; + bool adult_enabled = gAgent.canAccessAdult(); + bool mature_enabled = gAgent.canAccessMature(); + + if( gSavedSettings.getBOOL("ShowPGSims")) + { + flags |= DFQ_INC_PG; + } + + if( gSavedSettings.getBOOL("ShowMatureSims") && mature_enabled) + { + flags |= DFQ_INC_MATURE; + } + + if( gSavedSettings.getBOOL("ShowAdultSims") && adult_enabled) + { + flags |= DFQ_INC_ADULT; + } + + // Pack old query flag in case we are talking to an old server + if ( ((flags & DFQ_INC_PG) == DFQ_INC_PG) && !((flags & DFQ_INC_MATURE) == DFQ_INC_MATURE) ) + { + flags |= DFQ_PG_PARCELS_ONLY; + } + + if (0x0 == flags) + { + LLNotificationsUtil::add("NoContentToSearch"); + return; + } + + queryCore(query_string, category, flags); +} + +void LLPanelDirPlaces::initialQuery() +{ + // All Linden locations in PG/Mature sims, any name. + U32 flags = DFQ_INC_PG | DFQ_INC_MATURE; + queryCore(LLStringUtil::null, LLParcel::C_LINDEN, flags); +} + +void LLPanelDirPlaces::queryCore(const std::string& name, S32 category, U32 flags) +{ + setupNewSearch(); + +// JC: Sorting by dwell severely impacts the performance of the query. +// Instead of sorting on the dataserver, we sort locally once the results +// are received. +// IW: Re-enabled dwell sort based on new 3-character minimum description +// Hopefully we'll move to next-gen Find before this becomes a big problem + + flags |= DFQ_DWELL_SORT; + + LLMessageSystem* msg = gMessageSystem; + + msg->newMessage("DirPlacesQuery"); + msg->nextBlock("AgentData"); + msg->addUUID("AgentID", gAgent.getID()); + msg->addUUID("SessionID", gAgent.getSessionID()); + msg->nextBlock("QueryData"); + msg->addUUID("QueryID", getSearchID()); + msg->addString("QueryText", name); + msg->addU32("QueryFlags", flags); + msg->addS8("Category", (S8)category); + // No longer support queries by region name, too many regions + // for combobox, no easy way to do autocomplete. JC + msg->addString("SimName", ""); + msg->addS32Fast(_PREHASH_QueryStart,mSearchStart); + gAgent.sendReliableMessage(); +} + |
