Files
SingularityViewer/indra/newview/llpanelexperiencelog.cpp
Liru Færs b08b597397 Merge branch 'master' of git://github.com/Shyotl/SingularityViewer
# Conflicts:
#	indra/llcommon/llsd.cpp
#	indra/llcommon/llsdserialize.cpp
#	indra/newview/llspeakers.cpp
#	indra/newview/llviewermessage.cpp
2020-02-25 06:51:41 -05:00

271 lines
7.7 KiB
C++

/**
* @file llpanelexperiencelog.cpp
* @brief llpanelexperiencelog
*
* $LicenseInfo:firstyear=2014&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2014, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llpanelexperiencelog.h"
#include "llexperiencelog.h"
#include "llexperiencecache.h"
#include "llbutton.h"
#include "llscrolllistctrl.h"
#include "llcombobox.h"
#include "llspinctrl.h"
#include "llcheckboxctrl.h"
#include "llfloaterexperienceprofile.h"
//#include "llfloaterreg.h"
#include "lluictrlfactory.h"
#include "llfloaterreporter.h"
#include "llinventoryfunctions.h"
#include <boost/range/adaptor/reversed.hpp>
#define BTN_PROFILE_XP "btn_profile_xp"
#define BTN_REPORT_XP "btn_report_xp"
/* Singu Note: We do not have injectors, so we'll have to call this function instead
static LLPanelInjector<LLPanelExperienceLog> register_experiences_panel("experience_log");
*/
void* create_xp_log(void* data) { return new LLPanelExperienceLog(false); }
LLPanelExperienceLog::LLPanelExperienceLog(bool build)
: mEventList(nullptr)
, mPageSize(25)
, mCurrentPage(0)
{
//buildFromFile("panel_experience_log.xml");
if (build) LLUICtrlFactory::getInstance()->buildPanel(this, "panel_experience_log.xml"); // Singu Note: Use filename in xml
}
BOOL LLPanelExperienceLog::postBuild( void )
{
LLExperienceLog* log = LLExperienceLog::getInstance();
mEventList = getChild<LLScrollListCtrl>("experience_log_list");
mEventList->setCommitCallback(boost::bind(&LLPanelExperienceLog::onSelectionChanged, this));
mEventList->setDoubleClickCallback( boost::bind(&LLPanelExperienceLog::onProfileExperience, this));
getChild<LLButton>("btn_clear")->setCommitCallback(boost::bind(&LLExperienceLog::clear, log));
getChild<LLButton>("btn_clear")->setCommitCallback(boost::bind(&LLPanelExperienceLog::refresh, this));
getChild<LLButton>(BTN_PROFILE_XP)->setCommitCallback(boost::bind(&LLPanelExperienceLog::onProfileExperience, this));
getChild<LLButton>(BTN_REPORT_XP )->setCommitCallback(boost::bind(&LLPanelExperienceLog::onReportExperience, this));
getChild<LLButton>("btn_notify" )->setCommitCallback(boost::bind(&LLPanelExperienceLog::onNotify, this));
getChild<LLButton>("btn_next" )->setCommitCallback(boost::bind(&LLPanelExperienceLog::onNext, this));
getChild<LLButton>("btn_prev" )->setCommitCallback(boost::bind(&LLPanelExperienceLog::onPrev, this));
LLCheckBoxCtrl* check = getChild<LLCheckBoxCtrl>("notify_all");
check->set(log->getNotifyNewEvent());
check->setCommitCallback(boost::bind(&LLPanelExperienceLog::notifyChanged, this));
LLSpinCtrl* spin = getChild<LLSpinCtrl>("logsizespinner");
spin->set(log->getMaxDays());
spin->setCommitCallback(boost::bind(&LLPanelExperienceLog::logSizeChanged, this));
mPageSize = log->getPageSize();
refresh();
mNewEvent = LLExperienceLog::instance().addUpdateSignal(boost::bind(&LLPanelExperienceLog::refresh, this));
return TRUE;
}
LLPanelExperienceLog* LLPanelExperienceLog::create()
{
return new LLPanelExperienceLog();
}
void LLPanelExperienceLog::refresh()
{
S32 selected = mEventList->getFirstSelectedIndex();
mEventList->deleteAllItems();
const LLSD events = LLExperienceLog::instance().getEvents();
if(events.size() == 0)
{
mEventList->setCommentText(getString("no_events"));
return;
}
setAllChildrenEnabled(FALSE);
LLSD item;
bool waiting = false;
LLUUID waiting_id;
U32 itemsToSkip = mPageSize*mCurrentPage;
U32 items = 0;
bool moreItems = false;
if (!events.emptyMap())
{
for (const auto& day : boost::adaptors::reverse(events.map()))
{
const std::string& date = day.first;
if (LLExperienceLog::instance().isExpired(date))
{
continue;
}
const LLSD& dayArray = day.second;
U32 size = dayArray.size();
if(itemsToSkip > size)
{
itemsToSkip -= size;
continue;
}
if(items >= mPageSize && size > 0)
{
moreItems = true;
break;
}
for(int i = dayArray.size() - itemsToSkip - 1; i >= 0; i--)
{
if (items >= mPageSize)
{
moreItems = true;
break;
}
const LLSD event = dayArray[i];
LLUUID id = event[LLExperienceCache::EXPERIENCE_ID].asUUID();
const LLSD& experience = LLExperienceCache::instance().get(id);
if(experience.isUndefined()){
waiting = true;
waiting_id = id;
}
if(!waiting)
{
item["id"] = event;
LLSD& columns = item["columns"];
columns[0]["column"] = "time";
columns[0]["value"] = day.first+event["Time"].asString();
columns[1]["column"] = "event";
columns[1]["value"] = LLExperienceLog::getPermissionString(event, "ExperiencePermissionShort");
columns[2]["column"] = "experience_name";
columns[2]["value"] = experience[LLExperienceCache::NAME].asString();
columns[3]["column"] = "object_name";
columns[3]["value"] = event["ObjectName"].asString();
mEventList->addElement(item);
}
++items;
}
}
}
if (waiting)
{
mEventList->deleteAllItems();
mEventList->setCommentText(getString("loading"));
LLExperienceCache::instance().get(waiting_id, boost::bind(&LLPanelExperienceLog::refresh, this));
}
else
{
setAllChildrenEnabled(TRUE);
mEventList->setEnabled(TRUE);
getChild<LLButton>("btn_next")->setEnabled(moreItems);
getChild<LLButton>("btn_prev")->setEnabled(mCurrentPage>0);
getChild<LLButton>("btn_clear")->setEnabled(mEventList->getItemCount()>0);
if (selected < 0)
{
selected = 0;
}
mEventList->selectNthItem(selected);
onSelectionChanged();
}
}
void LLPanelExperienceLog::onProfileExperience()
{
LLSD event = getSelectedEvent();
if (event.isDefined())
{
LLFloaterExperienceProfile::showInstance(event[LLExperienceCache::EXPERIENCE_ID].asUUID());
}
}
void LLPanelExperienceLog::onReportExperience()
{
LLSD event = getSelectedEvent();
if (event.isDefined())
{
LLFloaterReporter::showFromExperience(event[LLExperienceCache::EXPERIENCE_ID].asUUID());
}
}
void LLPanelExperienceLog::onNotify()
{
LLSD event = getSelectedEvent();
if (event.isDefined())
{
LLExperienceLog::instance().notify(event);
}
}
void LLPanelExperienceLog::onNext()
{
mCurrentPage++;
refresh();
}
void LLPanelExperienceLog::onPrev()
{
if(mCurrentPage>0)
{
mCurrentPage--;
refresh();
}
}
void LLPanelExperienceLog::notifyChanged()
{
LLExperienceLog::instance().setNotifyNewEvent(getChild<LLCheckBoxCtrl>("notify_all")->get());
}
void LLPanelExperienceLog::logSizeChanged()
{
int value = (int)(getChild<LLSpinCtrl>("logsizespinner")->get());
LLExperienceLog::instance().setMaxDays(value);
refresh();
}
void LLPanelExperienceLog::onSelectionChanged()
{
bool enabled = (1 == mEventList->getNumSelected());
getChild<LLButton>(BTN_REPORT_XP)->setEnabled(enabled);
getChild<LLButton>(BTN_PROFILE_XP)->setEnabled(enabled);
getChild<LLButton>("btn_notify")->setEnabled(enabled);
}
LLSD LLPanelExperienceLog::getSelectedEvent()
{
LLScrollListItem* item = mEventList->getFirstSelected();
if(item)
{
return item->getValue();
}
return LLSD();
}