summaryrefslogtreecommitdiff
path: root/indra/newview/llpaneldirevents.cpp
diff options
context:
space:
mode:
authorMnikolenko Productengine <mnikolenko@productengine.com>2025-10-21 22:05:07 +0300
committerMnikolenko Productengine <mnikolenko@productengine.com>2025-10-22 00:50:54 +0300
commitd294d568d1c97650bba4c388c8a7eab5a5c49c94 (patch)
tree240f5c51beb1413f779fe84e771b7fe9638de1ee /indra/newview/llpaneldirevents.cpp
parent4e2a9667bda1a1980993ae453dfe6ff38dd1835a (diff)
#4411 WIP initial restoring of Legacy Search
Diffstat (limited to 'indra/newview/llpaneldirevents.cpp')
-rw-r--r--indra/newview/llpaneldirevents.cpp280
1 files changed, 280 insertions, 0 deletions
diff --git a/indra/newview/llpaneldirevents.cpp b/indra/newview/llpaneldirevents.cpp
new file mode 100644
index 0000000000..07a76e050b
--- /dev/null
+++ b/indra/newview/llpaneldirevents.cpp
@@ -0,0 +1,280 @@
+/**
+ * @file llpaneldirevents.cpp
+ * @brief Events 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 "llpaneldirevents.h"
+
+#include <sstream>
+
+// linden library includes
+#include "message.h"
+#include "llqueryflags.h"
+
+// viewer project includes
+#include "llagent.h"
+#include "llviewercontrol.h"
+#include "llnotificationsutil.h"
+#include "llpaneldirbrowser.h"
+#include "llresmgr.h"
+#include "lluiconstants.h"
+#include "llappviewer.h"
+
+static LLPanelInjector<LLPanelDirEvents> t_panel_dir_events("panel_dir_events");
+
+LLPanelDirEvents::LLPanelDirEvents()
+ : LLPanelDirBrowser(),
+ mDoneQuery(FALSE),
+ mDay(0)
+{
+ // more results per page for this
+ mResultsPerPage = 200;
+}
+
+bool LLPanelDirEvents::postBuild()
+{
+ LLPanelDirBrowser::postBuild();
+
+ childSetCommitCallback("date_mode", onDateModeCallback, this);
+
+ childSetAction("<<", onBackBtn, this);
+ childSetAction(">>", onForwardBtn, this);
+
+ childSetAction("Today", onClickToday, this);
+
+ childSetCommitCallback("mature", onCommitMature, this);
+
+ childSetAction("Search", LLPanelDirBrowser::onClickSearchCore, this);
+ setDefaultBtn("Search");
+
+ onDateModeCallback(NULL, this);
+
+ mCurrentSortColumn = "time";
+
+ setDay(0); // for today
+
+ return TRUE;
+}
+
+LLPanelDirEvents::~LLPanelDirEvents()
+{
+}
+
+
+void LLPanelDirEvents::draw()
+{
+ refresh();
+
+ LLPanelDirBrowser::draw();
+}
+
+void LLPanelDirEvents::refresh()
+{
+ updateMaturityCheckbox();
+}
+
+
+void LLPanelDirEvents::setDay(S32 day)
+{
+ mDay = day;
+
+ // Get time UTC
+ time_t utc_time = time_corrected();
+
+ // Correct for offset
+ utc_time += day * 24 * 60 * 60;
+
+ // There's only one internal tm buffer.
+ struct tm* internal_time;
+
+ // Convert to Pacific, based on server's opinion of whether
+ // it's daylight savings time there.
+ internal_time = utc_to_pacific_time(utc_time, is_daylight_savings());
+
+ std::string buffer = llformat("%d/%d",
+ 1 + internal_time->tm_mon, // Jan = 0
+ internal_time->tm_mday); // 2001 = 101
+ childSetValue("date_text", buffer);
+}
+
+// virtual
+void LLPanelDirEvents::performQuery()
+{
+ // event_id 0 will perform no delete action.
+ performQueryOrDelete(0);
+}
+
+void LLPanelDirEvents::performQueryOrDelete(U32 event_id)
+{
+ S32 relative_day = mDay;
+ // Update the date field to show the date IN THE SERVER'S
+ // TIME ZONE, as that is what will be displayed in each event
+
+ // Get time UTC
+ time_t utc_time = time_corrected();
+
+ // Correct for offset
+ utc_time += relative_day * 24 * 60 * 60;
+
+ // There's only one internal tm buffer.
+ struct tm* internal_time;
+
+ // Convert to Pacific, based on server's opinion of whether
+ // it's daylight savings time there.
+ internal_time = utc_to_pacific_time(utc_time, is_daylight_savings());
+
+ std::string buffer = llformat("%d/%d",
+ 1 + internal_time->tm_mon, // Jan = 0
+ internal_time->tm_mday); // 2001 = 101
+ childSetValue("date_text", buffer);
+
+ // Record the relative day so back and forward buttons
+ // offset from this day.
+ mDay = relative_day;
+
+ mDoneQuery = TRUE;
+
+ U32 scope = DFQ_DATE_EVENTS;
+ if ( gAgent.wantsPGOnly()) scope |= DFQ_PG_SIMS_ONLY;
+ if ( childGetValue("incpg").asBoolean() ) scope |= DFQ_INC_PG;
+ if ( childGetValue("incmature").asBoolean() ) scope |= DFQ_INC_MATURE;
+ if ( childGetValue("incadult").asBoolean() ) scope |= DFQ_INC_ADULT;
+
+ // Add old query flags in case we are talking to an old server
+ if ( childGetValue("incpg").asBoolean() && !childGetValue("incmature").asBoolean())
+ {
+ scope |= DFQ_PG_EVENTS_ONLY;
+ }
+
+ if ( !( scope & (DFQ_INC_PG | DFQ_INC_MATURE | DFQ_INC_ADULT )))
+ {
+ LLNotificationsUtil::add("NoContentToSearch");
+ return;
+ }
+
+ setupNewSearch();
+
+ std::ostringstream params;
+
+ // Date mode for the search
+ if ("current" == childGetValue("date_mode").asString())
+ {
+ params << "u|";
+ }
+ else
+ {
+ params << mDay << "|";
+ }
+
+ // Categories are stored in the database in table indra.event_category
+ // XML must match.
+ U32 cat_id = childGetValue("category combo").asInteger();
+
+ params << cat_id << "|";
+ params << childGetValue("event_search_text").asString();
+
+ // send the message
+ if (0 == event_id)
+ {
+ sendDirFindQuery(gMessageSystem, mSearchID, params.str(), scope, mSearchStart);
+ }
+ else
+ {
+ // This delete will also perform a query.
+ LLMessageSystem* msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_EventGodDelete);
+
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+
+ msg->nextBlockFast(_PREHASH_EventData);
+ msg->addU32Fast(_PREHASH_EventID, event_id);
+
+ msg->nextBlockFast(_PREHASH_QueryData);
+ msg->addUUIDFast(_PREHASH_QueryID, mSearchID);
+ msg->addStringFast(_PREHASH_QueryText, params.str());
+ msg->addU32Fast(_PREHASH_QueryFlags, scope);
+ msg->addS32Fast(_PREHASH_QueryStart, mSearchStart);
+ gAgent.sendReliableMessage();
+ }
+}
+
+// static
+void LLPanelDirEvents::onDateModeCallback(LLUICtrl* ctrl, void *data)
+{
+ LLPanelDirEvents* self = (LLPanelDirEvents*)data;
+ if (self->childGetValue("date_mode").asString() == "date")
+ {
+ self->childEnable("Today");
+ self->childEnable(">>");
+ self->childEnable("<<");
+ }
+ else
+ {
+ self->childDisable("Today");
+ self->childDisable(">>");
+ self->childDisable("<<");
+ }
+}
+
+// static
+void LLPanelDirEvents::onClickToday(void *userdata)
+{
+ LLPanelDirEvents *self = (LLPanelDirEvents *)userdata;
+ self->resetSearchStart();
+ self->setDay(0);
+ self->performQuery();
+}
+
+
+// static
+void LLPanelDirEvents::onBackBtn(void* data)
+{
+ LLPanelDirEvents* self = (LLPanelDirEvents*)data;
+ self->resetSearchStart();
+ self->setDay(self->mDay - 1);
+ self->performQuery();
+}
+
+
+// static
+void LLPanelDirEvents::onForwardBtn(void* data)
+{
+ LLPanelDirEvents* self = (LLPanelDirEvents*)data;
+ self->resetSearchStart();
+ self->setDay(self->mDay + 1);
+ self->performQuery();
+}
+
+
+// static
+void LLPanelDirEvents::onCommitMature(LLUICtrl* ctrl, void* data)
+{
+ // just perform another search
+ onClickSearchCore(data);
+}