Basic Summary: Issue 743: [Chat UI] Option to italicize actions (/me) in chat - Adds debug LiruItalicizeActions, and a checkbox to Adv. Chat->Chat UI preferences Issue 737: [Frosting] Annoyance Removal (Red beacon after teleport using LM's) - Adds debug ClearBeaconAfterTeleport, checkbox under System->General Issue 639: [Frosting] The agent isn't identified properly in chat - Oh what a silly issue this was, it's as though whoever wrote this didn't care. Fixes issue where names in logs do not match names in chat due to display name system Fixes the issue in which Unnamed objects got named by a hardcoded string under certain circumstances. Issue 813: [Frosting] When only accepting from friends, do not display incoming chat notification for nonfriends - Also broke the setting out, separating it from the voice calls friend only setting - Adds InstantMessagesFriendsOnly debug setting and checkbox in Adv. Chat->Chat/IM Issue 764: Copy SLURL from Map returns correct region but wrong coordinates. Satisfied the longstanding issue of inflexible autoresponse options. - Autoresponse now has its own tab in Adv. Chat preferences: Busy, Muted, nonfriends, and anyone (or just friends) can have separate responses, along with items of your choosing. - Prevent doubling up with the first repeated autoresponse due to typing message and normal message. Translator Summary: Adv. Chat->Chat UI->"Italicize action messages (/me)" System->General->"Clear red destination beacon after teleporting" Drop Targets for floater_ao.xml, panel_avatar.xml, panel_group_notices.xml, and panel_preferences_ascent_system.xml Adv. Chat->Chat/IM->"Only accept IMs from Friends" Please clean up the Busy Mode Response elements from panel_preferences_im.xml strings.xml now has "IM_autoresponse_minutes" Adv. Chat (panel_preferences_ascent_chat.xml) now has a new panel "Autoresponse", please clean up the old Autoresponse elements from Chat/IM tab and translate this panel. Developer Summary: Adds EChatStyle to LLChat, used for identifying what style a piece of chat is. Update settings_per_account.xml - Reorganized the ascent specific section. - Removes a few old and unused settings Better organize settings_per_account_ascent.xml - TODO: Actually get this include system working and remove the Ascent specific section in settings_per_account.xml Modernize LLDropTarget and make it more flexible and stand alone - The Text of drop targets is now a child of the target itself, meaning the necessity of having a static instance to the parent is eliminated - Drop targets are now one element in UI XML. - Drop targets now have fill_parent option which allows the target to spread over the parent, while the text, tool_tip, and border stays in place - If Drop Targets have a control_name, it is from the per account settings group, since Items must be in the inventory of the account in question. - All drop targets now use the common LLDropTarget class instead of their own. - LLGroupDropTarget is now derived from LLDropTarget and has its own tag group_drop_target. Cleaned up the focus functions we use to focus the input bar, setInputFocus exists for their purpose. Updated our llim* code to line up better with upstream and conform to styling. Polished LLTracker and LLFloaterWorldMap a bit Cleaned/Updated up LLStyleMap a bit. Optimized autoresponse code: - wildcards are now replaced via boost::algorithm::replace_all - Autoresponse and related chat enhancements are now performed inside their case, instead of by the large if block above.
498 lines
19 KiB
C++
498 lines
19 KiB
C++
/**
|
|
*
|
|
* Copyright (c) 2009-2011, Kitty Barnett
|
|
*
|
|
* The source code in this file is provided to you under the terms of the
|
|
* GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY;
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
* PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt
|
|
* in this distribution, or online at http://www.gnu.org/licenses/lgpl-2.1.txt
|
|
*
|
|
* By copying, modifying or distributing this software, you acknowledge that
|
|
* you have read and understood your obligations described above, and agree to
|
|
* abide by those obligations.
|
|
*
|
|
*/
|
|
|
|
#include "llviewerprecompiledheaders.h"
|
|
#include "llagent.h"
|
|
#include "llavatarnamecache.h"
|
|
#include "llenvmanager.h"
|
|
#include "llhudtext.h" // LLHUDText::refreshAllObjectText()
|
|
#include "llimview.h" // LLIMMgr::computeSessionID()
|
|
#include "llmoveview.h" // Movement panel (contains "Stand" and "Stop Flying" buttons)
|
|
#include "llparcel.h"
|
|
#include "lltabcontainer.h"
|
|
#include "lltoolmgr.h"
|
|
#include "llviewerparcelmgr.h"
|
|
#include "llvoavatar.h"
|
|
#include "roles_constants.h" // Group "powers"
|
|
|
|
#include "llfloaterbeacons.h"
|
|
#include "llfloatertools.h"
|
|
#include "llfloaterenvsettings.h"
|
|
#include "llfloaterwindlight.h"
|
|
#include "llfloaterwater.h"
|
|
#include "llfloaterdaycycle.h"
|
|
#include "llagentcamera.h"
|
|
#include "llviewerwindow.h"
|
|
#include "llpanelmaininventory.h"
|
|
#include "llappviewer.h"
|
|
#include "llfloaterland.h"
|
|
#include "llfloatergodtools.h"
|
|
#include "llfloaterregioninfo.h"
|
|
#include "llfloatermap.h"
|
|
#include "llfloaterchat.h"
|
|
#include "llfloateravatarlist.h"
|
|
#include "llfloaterworldmap.h"
|
|
#include "llviewerregion.h"
|
|
|
|
#include "rlvui.h"
|
|
#include "rlvhandler.h"
|
|
#include "rlvextensions.h"
|
|
|
|
// ============================================================================
|
|
|
|
// Checked: 2010-02-28 (RLVa-1.4.0a) | Added: RLVa-1.2.0a
|
|
RlvUIEnabler::RlvUIEnabler()
|
|
{
|
|
// Connect us to the behaviour toggle signal
|
|
gRlvHandler.setBehaviourToggleCallback(boost::bind(&RlvUIEnabler::onBehaviourToggle, this, _1, _2));
|
|
|
|
// onRefreshHoverText()
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWLOC, boost::bind(&RlvUIEnabler::onRefreshHoverText, this)));
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWNAMES, boost::bind(&RlvUIEnabler::onRefreshHoverText, this)));
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWHOVERTEXTALL, boost::bind(&RlvUIEnabler::onRefreshHoverText, this)));
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWHOVERTEXTWORLD, boost::bind(&RlvUIEnabler::onRefreshHoverText, this)));
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWHOVERTEXTHUD, boost::bind(&RlvUIEnabler::onRefreshHoverText, this)));
|
|
|
|
// onToggleMovement
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_FLY, boost::bind(&RlvUIEnabler::onToggleMovement, this)));
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_ALWAYSRUN, boost::bind(&RlvUIEnabler::onToggleMovement, this)));
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_TEMPRUN, boost::bind(&RlvUIEnabler::onToggleMovement, this)));
|
|
|
|
// onToggleViewXXX
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_VIEWNOTE, boost::bind(&RlvUIEnabler::onToggleViewXXX, this)));
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_VIEWSCRIPT, boost::bind(&RlvUIEnabler::onToggleViewXXX, this)));
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_VIEWTEXTURE, boost::bind(&RlvUIEnabler::onToggleViewXXX, this)));
|
|
|
|
// onToggleXXX
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_EDIT, boost::bind(&RlvUIEnabler::onToggleEdit, this)));
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SETDEBUG, boost::bind(&RlvUIEnabler::onToggleSetDebug, this)));
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SETENV, boost::bind(&RlvUIEnabler::onToggleSetEnv, this)));
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWINV, boost::bind(&RlvUIEnabler::onToggleShowInv, this, _1)));
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWLOC, boost::bind(&RlvUIEnabler::onToggleShowLoc, this)));
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWMINIMAP, boost::bind(&RlvUIEnabler::onToggleShowMinimap, this)));
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWNAMES, boost::bind(&RlvUIEnabler::onToggleShowNames, this, _1)));
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWWORLDMAP, boost::bind(&RlvUIEnabler::onToggleShowWorldMap, this)));
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_UNSIT, boost::bind(&RlvUIEnabler::onToggleUnsit, this)));
|
|
|
|
// onToggleTp
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_TPLOC, boost::bind(&RlvUIEnabler::onToggleTp, this)));
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_TPLM, boost::bind(&RlvUIEnabler::onToggleTp, this)));
|
|
|
|
// onUpdateLoginLastLocation
|
|
#ifdef RLV_EXTENSION_STARTLOCATION
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_TPLOC, boost::bind(&RlvUIEnabler::onUpdateLoginLastLocation, this, _1)));
|
|
m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_UNSIT, boost::bind(&RlvUIEnabler::onUpdateLoginLastLocation, this, _1)));
|
|
#endif // RLV_EXTENSION_STARTLOCATION
|
|
}
|
|
|
|
// Checked: 2010-02-28 (RLVa-1.4.0a) | Added: RLVa-1.2.0a
|
|
void RlvUIEnabler::onBehaviourToggle(ERlvBehaviour eBhvr, ERlvParamType eType)
|
|
{
|
|
bool fQuitting = LLApp::isQuitting();
|
|
for (behaviour_handler_map_t::const_iterator itHandler = m_Handlers.lower_bound(eBhvr), endHandler = m_Handlers.upper_bound(eBhvr);
|
|
itHandler != endHandler; ++itHandler)
|
|
{
|
|
itHandler->second(fQuitting);
|
|
}
|
|
}
|
|
|
|
// ============================================================================
|
|
|
|
// Checked: 2010-03-02 (RLVa-1.4.0a) | Added: RLVa-1.2.0a
|
|
void RlvUIEnabler::onRefreshHoverText()
|
|
{
|
|
// Refresh all hover text each time any of the monitored behaviours get set or unset
|
|
LLHUDText::refreshAllObjectText();
|
|
}
|
|
|
|
// Checked: 2010-03-17 (RLVa-1.2.0a) | Added: RLVa-1.2.0a
|
|
void RlvUIEnabler::onToggleEdit()
|
|
{
|
|
bool fEnable = !gRlvHandler.hasBehaviour(RLV_BHVR_EDIT);
|
|
|
|
if (!fEnable)
|
|
{
|
|
// Turn off "View / Highlight Transparent"
|
|
LLDrawPoolAlpha::sShowDebugAlpha = FALSE;
|
|
|
|
// Close the Beacons floater if it's open
|
|
if (LLFloaterBeacons::instanceVisible())
|
|
LLFloaterBeacons::toggleInstance();
|
|
|
|
// Get rid of the build floater if it's open [copy/paste from toggle_build_mode()]
|
|
if (gFloaterTools->getVisible())
|
|
{
|
|
gAgentCamera.resetView(FALSE);
|
|
gFloaterTools->close();
|
|
gViewerWindow->showCursor();
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
// Checked: 2010-03-02 (RLVa-1.4.0a) | Modified: RLVa-1.4.0a
|
|
void RlvUIEnabler::onToggleMovement()
|
|
{
|
|
if ( (gRlvHandler.hasBehaviour(RLV_BHVR_FLY)) && (gAgent.getFlying()) )
|
|
gAgent.setFlying(FALSE);
|
|
if ( (gRlvHandler.hasBehaviour(RLV_BHVR_ALWAYSRUN)) && (gAgent.getAlwaysRun()) )
|
|
gAgent.clearAlwaysRun();
|
|
if ( (gRlvHandler.hasBehaviour(RLV_BHVR_TEMPRUN)) && (gAgent.getTempRun()) )
|
|
gAgent.clearTempRun();
|
|
}
|
|
|
|
// Checked: 2011-05-28 (RLVa-1.4.0a) | Added: RLVa-1.4.0a
|
|
void RlvUIEnabler::onToggleSetDebug()
|
|
{
|
|
bool fEnable = !gRlvHandler.hasBehaviour(RLV_BHVR_SETDEBUG);
|
|
for (std::map<std::string, S16>::const_iterator itSetting = RlvExtGetSet::m_DbgAllowed.begin();
|
|
itSetting != RlvExtGetSet::m_DbgAllowed.end(); ++itSetting)
|
|
{
|
|
if (itSetting->second & RlvExtGetSet::DBG_WRITE)
|
|
gSavedSettings.getControl(itSetting->first)->setHiddenFromSettingsEditor(!fEnable);
|
|
}
|
|
}
|
|
|
|
// Checked: 2011-09-04 (RLVa-1.4.1a) | Modified: RLVa-1.4.1a
|
|
void RlvUIEnabler::onToggleSetEnv()
|
|
{
|
|
bool fEnable = !gRlvHandler.hasBehaviour(RLV_BHVR_SETENV);
|
|
|
|
if (!fEnable)
|
|
{
|
|
// Only close the floaters if their instance exists and they're actually visible
|
|
if ( (LLFloaterEnvSettings::isOpen()) && (LLFloaterEnvSettings::instance()->getVisible()) )
|
|
LLFloaterEnvSettings::instance()->close();
|
|
if ( (LLFloaterWindLight::isOpen()) && (LLFloaterWindLight::instance()->getVisible()) )
|
|
LLFloaterWindLight::instance()->close();
|
|
if ( (LLFloaterWater::isOpen()) && (LLFloaterWater::instance()->getVisible()) )
|
|
LLFloaterWater::instance()->close();
|
|
if ( (LLFloaterDayCycle::isOpen()) && (LLFloaterDayCycle::instance()->getVisible()) )
|
|
LLFloaterDayCycle::instance()->close();
|
|
}
|
|
|
|
// Don't allow toggling "Basic Shaders" and/or "Atmopsheric Shaders" through the debug settings under @setenv=n
|
|
gSavedSettings.getControl("VertexShaderEnable")->setHiddenFromSettingsEditor(!fEnable);
|
|
gSavedSettings.getControl("WindLightUseAtmosShaders")->setHiddenFromSettingsEditor(!fEnable);
|
|
|
|
// Restore the user's WindLight preferences when releasing
|
|
if (fEnable)
|
|
LLEnvManagerNew::instance().usePrefs();
|
|
}
|
|
|
|
// Checked: 2011-11-04 (RLVa-1.4.4a) | Modified: RLVa-1.4.4a
|
|
void RlvUIEnabler::onToggleShowInv(bool fQuitting)
|
|
{
|
|
if (fQuitting)
|
|
return; // Nothing to do if the viewer is shutting down
|
|
|
|
bool fEnable = !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWINV);
|
|
|
|
//
|
|
// When disabling, close any inventory floaters that may be open
|
|
//
|
|
if (!fEnable)
|
|
{
|
|
LLInventoryView::closeAll();
|
|
}
|
|
}
|
|
|
|
// Checked: 2010-04-22 (RLVa-1.2.0f) | Modified: RLVa-1.2.0f
|
|
void RlvUIEnabler::onToggleShowLoc()
|
|
{
|
|
bool fEnable = !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC);
|
|
|
|
// RELEASE-RLVa: [SL-2.0.1] Check that the code below still evaluates to *only* LLNavigationBar::instance().mCmbLocation->refresh()
|
|
//LLAppViewer::instance()->handleLoginComplete();
|
|
|
|
if (!fEnable)
|
|
{
|
|
// Close the "About Land" floater if it's currently visible
|
|
if (LLFloaterLand::instanceVisible())
|
|
LLFloaterLand::hideInstance();
|
|
|
|
// Close the "Estate Tools" floater is it's currently visible
|
|
if (LLFloaterRegionInfo::instanceVisible())
|
|
LLFloaterRegionInfo::hideInstance();
|
|
LLFloaterGodTools::hide();
|
|
}
|
|
}
|
|
|
|
// Checked: 2010-02-28 (RLVa-1.4.0a) | Added: RLVa-1.2.0a
|
|
void RlvUIEnabler::onToggleShowMinimap()
|
|
{
|
|
|
|
bool fEnable = !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWMINIMAP);
|
|
|
|
// Start or stop filtering showing the mini-map floater
|
|
if ((!fEnable) && LLFloaterMap::instanceVisible())
|
|
LLFloaterMap::hideInstance();
|
|
}
|
|
|
|
// Checked: 2010-12-08 (RLVa-1.4.0a) | Modified: RLVa-1.2.2c
|
|
void RlvUIEnabler::onToggleShowNames(bool fQuitting)
|
|
{
|
|
if (fQuitting)
|
|
return; // Nothing to do if the viewer is shutting down
|
|
|
|
bool fEnable = !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES);
|
|
|
|
// Close the "Active Speakers" panel if it's currently visible
|
|
|
|
|
|
// Force the use of the "display name" cache so we can filter both display and legacy names (or return back to the user's preference)
|
|
if (!fEnable)
|
|
{
|
|
LLFloaterChat::getInstance()->childSetVisible("active_speakers_panel", false);
|
|
// Close the "Avatar List/Radar" floater if it's currently visible
|
|
if ( LLFloaterAvatarList::instanceExists() && LLFloaterAvatarList::getInstance()->getVisible() )
|
|
LLFloaterAvatarList::toggle(NULL);
|
|
LLAvatarNameCache::setForceDisplayNames(true);
|
|
}
|
|
else
|
|
{
|
|
LLAvatarNameCache::setForceDisplayNames(false);
|
|
LLAvatarNameCache::setUseDisplayNames(gSavedSettings.getS32("PhoenixNameSystem") == 1 || gSavedSettings.getS32("PhoenixNameSystem") == 2);
|
|
}
|
|
LLVOAvatar::invalidateNameTags(); // See handleDisplayNamesOptionChanged()
|
|
}
|
|
|
|
// Checked: 2010-02-28 (RLVa-1.4.0a) | Added: RLVa-1.2.0a
|
|
void RlvUIEnabler::onToggleShowWorldMap()
|
|
{
|
|
bool fEnable = !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWWORLDMAP);
|
|
|
|
// Simulate clicking the Map button [see LLToolBar::onClickMap()]
|
|
if ((!fEnable) && gFloaterWorldMap->getVisible())
|
|
LLFloaterWorldMap::toggle();
|
|
}
|
|
|
|
// Checked: 2010-08-22 (RLVa-1.2.1a) | Added: RLVa-1.2.1a
|
|
void RlvUIEnabler::onToggleTp()
|
|
{
|
|
/* // Disable the navigation bar "Home" button if both @tplm=n *and* @tploc=n restricted
|
|
LLButton* pNavBarHomeBtn = LLNavigationBar::getInstance()->findChild<LLButton>("home_btn");
|
|
RLV_ASSERT(pNavBarHomeBtn);
|
|
if (pNavBarHomeBtn)
|
|
pNavBarHomeBtn->setEnabled(!(gRlvHandler.hasBehaviour(RLV_BHVR_TPLM) && gRlvHandler.hasBehaviour(RLV_BHVR_TPLOC)));
|
|
*/
|
|
}
|
|
|
|
// Checked: 2010-03-01 (RLVa-1.2.0c) | Added: RLVa-1.2.0a
|
|
void RlvUIEnabler::onToggleUnsit()
|
|
{
|
|
/*
|
|
bool fEnable = !gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT);
|
|
|
|
LLPanelStandStopFlying* pPanelStand = LLPanelStandStopFlying::getInstance();
|
|
RLV_ASSERT(pPanelStand);
|
|
if (pPanelStand)
|
|
{
|
|
LLButton* pBtnStand = pPanelStand->findChild<LLButton>("stand_btn");
|
|
RLV_ASSERT(pBtnStand);
|
|
if (pBtnStand)
|
|
pBtnStand->setEnabled(fEnable);
|
|
}
|
|
*/
|
|
}
|
|
|
|
// Checked: 2010-03-01 (RLVa-1.2.0b) | Added: RLVa-1.2.0a
|
|
void RlvUIEnabler::onToggleViewXXX()
|
|
{
|
|
// If any of the three are still active then we keep filtering
|
|
/*bool fHasViewXXX = (gRlvHandler.hasBehaviour(RLV_BHVR_VIEWNOTE)) ||
|
|
(gRlvHandler.hasBehaviour(RLV_BHVR_VIEWSCRIPT)) || (gRlvHandler.hasBehaviour(RLV_BHVR_VIEWTEXTURE));
|
|
|
|
// Start or stop filtering opening the preview floaters
|
|
if ( (fHasViewXXX) && (!m_ConnFloaterViewXXX.connected()) )
|
|
m_ConnFloaterViewXXX = LLFloaterReg::setValidateCallback(boost::bind(&RlvUIEnabler::filterFloaterViewXXX, this, _1, _2));
|
|
else if ( (!fHasViewXXX) && (m_ConnFloaterViewXXX.connected()) )
|
|
m_ConnFloaterViewXXX.disconnect();*/
|
|
}
|
|
|
|
// Checked: 2010-04-01 (RLVa-1.2.0c) | Added: RLVa-1.2.0c
|
|
void RlvUIEnabler::onUpdateLoginLastLocation(bool fQuitting)
|
|
{
|
|
if (!fQuitting)
|
|
RlvSettings::updateLoginLastLocation();
|
|
}
|
|
|
|
// ============================================================================
|
|
|
|
// Checked: 2010-02-28 (RLVa-1.4.0a) | Added: RLVa-1.2.0a
|
|
/*void RlvUIEnabler::addGenericFloaterFilter(const std::string& strFloaterName)
|
|
{
|
|
m_FilteredFloaters.insert(strFloaterName);
|
|
|
|
if (!m_ConnFloaterGeneric.connected())
|
|
m_ConnFloaterGeneric = LLFloaterReg::setValidateCallback(boost::bind(&RlvUIEnabler::filterFloaterGeneric, this, _1, _2));
|
|
|
|
}
|
|
|
|
// Checked: 2010-02-28 (RLVa-1.4.0a) | Added: RLVa-1.2.0a
|
|
void RlvUIEnabler::removeGenericFloaterFilter(const std::string& strFloaterName)
|
|
{
|
|
std::multiset<std::string>::iterator itFloater = m_FilteredFloaters.find(strFloaterName);
|
|
RLV_ASSERT_DBG(itFloater != m_FilteredFloaters.end());
|
|
m_FilteredFloaters.erase(itFloater);
|
|
|
|
RLV_ASSERT_DBG(m_ConnFloaterGeneric.connected());
|
|
if (m_FilteredFloaters.empty())
|
|
m_ConnFloaterGeneric.disconnect();
|
|
}
|
|
|
|
// Checked: 2010-02-28 (RLVa-1.4.0a) | Added: RLVa-1.2.0a
|
|
bool RlvUIEnabler::filterFloaterGeneric(const std::string& strName, const LLSD&)
|
|
{
|
|
return m_FilteredFloaters.end() == m_FilteredFloaters.find(strName);
|
|
}
|
|
|
|
// Checked: 2010-04-22 (RLVa-1.4.5) | Added: RLVa-1.2.0
|
|
bool RlvUIEnabler::filterFloaterShowLoc(const std::string& strName, const LLSD&)
|
|
{
|
|
if ("about_land" == strName)
|
|
return canViewParcelProperties();
|
|
else if ("region_info" == strName)
|
|
return canViewRegionProperties();
|
|
else if ("god_tools" == strName)
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
// Checked: 2012-02-07 (RLVa-1.4.5) | Added: RLVa-1.4.5
|
|
bool RlvUIEnabler::filterPanelShowLoc(const std::string& strFloater, const std::string&, const LLSD& sdKey)
|
|
{
|
|
if ("places" == strFloater)
|
|
{
|
|
const std::string strType = sdKey["type"].asString();
|
|
if ("create_landmark" == strType)
|
|
return false;
|
|
else if ("agent" == strType)
|
|
return canViewParcelProperties();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// Checked: 2010-03-01 (RLVa-1.2.0b) | Added: RLVa-1.2.0a
|
|
bool RlvUIEnabler::filterFloaterViewXXX(const std::string& strName, const LLSD&)
|
|
{
|
|
if ( (gRlvHandler.hasBehaviour(RLV_BHVR_VIEWNOTE)) && ("preview_notecard" == strName) )
|
|
{
|
|
RlvUtil::notifyBlockedViewXXX(LLAssetType::AT_NOTECARD);
|
|
return false;
|
|
}
|
|
else if ( (gRlvHandler.hasBehaviour(RLV_BHVR_VIEWSCRIPT)) && (("preview_script" == strName) || ("preview_scriptedit" == strName)) )
|
|
{
|
|
RlvUtil::notifyBlockedViewXXX(LLAssetType::AT_SCRIPT);
|
|
return false;
|
|
}
|
|
else if ( (gRlvHandler.hasBehaviour(RLV_BHVR_VIEWTEXTURE)) && ("preview_texture" == strName) )
|
|
{
|
|
RlvUtil::notifyBlockedViewXXX(LLAssetType::AT_TEXTURE);
|
|
return false;
|
|
}
|
|
return true;
|
|
}*/
|
|
|
|
// ============================================================================
|
|
|
|
// Checked: 2012-02-09 (RLVa-1.4.5) | Modified: RLVa-1.4.5
|
|
bool RlvUIEnabler::canViewParcelProperties()
|
|
{
|
|
// We'll allow "About Land" as long as the user has the ability to return prims (through ownership or through group powers)
|
|
bool fShow = !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC);
|
|
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
|
|
{
|
|
// RELEASE-RLVa: [SL-3.2] Check that opening the "About Land" floater still sets focus to the current parcel is none is selected
|
|
const LLParcel* pParcel = NULL;
|
|
if (LLViewerParcelMgr::getInstance()->selectionEmpty())
|
|
{
|
|
pParcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
|
|
}
|
|
else
|
|
{
|
|
LLParcelSelection* pParcelSel = LLViewerParcelMgr::getInstance()->getFloatingParcelSelection();
|
|
if (pParcelSel->hasOthersSelected())
|
|
return false;
|
|
pParcel = pParcelSel->getParcel();
|
|
}
|
|
|
|
// Ideally we could just use LLViewerParcelMgr::isParcelOwnedByAgent(), but that has that sneaky exemption for "god-like"
|
|
if (pParcel)
|
|
{
|
|
const LLUUID& idOwner = pParcel->getOwnerID();
|
|
if ( (idOwner != gAgent.getID()) )
|
|
{
|
|
S32 count = gAgent.mGroups.count();
|
|
for (S32 i = 0; i < count; ++i)
|
|
{
|
|
if (gAgent.mGroups.get(i).mID == idOwner)
|
|
{
|
|
fShow = ((gAgent.mGroups.get(i).mPowers & GP_LAND_RETURN) > 0);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
fShow = true;
|
|
}
|
|
}
|
|
}
|
|
return fShow;
|
|
}
|
|
|
|
// Checked: 2010-04-20 (RLVa-1.4.5) | Modified: RLVa-1.2.0
|
|
bool RlvUIEnabler::canViewRegionProperties()
|
|
{
|
|
// We'll allow "Region / Estate" if the user is either the region owner or an estate manager
|
|
bool fShow = !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC);
|
|
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
|
|
{
|
|
// [See LLRegion::canManageEstate() but without the "god-like" exception]
|
|
const LLViewerRegion* pRegion = gAgent.getRegion();
|
|
if (pRegion)
|
|
fShow = (pRegion->isEstateManager()) || (pRegion->getOwner() == gAgent.getID());
|
|
}
|
|
return fShow;
|
|
}
|
|
|
|
// Checked: 2010-04-20 (RLVa-1.2.0f) | Added: RLVa-1.2.0f
|
|
/*bool RlvUIEnabler::hasOpenIM(const LLUUID& idAgent)
|
|
{
|
|
LLUUID idSession = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, idAgent);
|
|
return (NULL != LLFloaterReg::findInstance("impanel", idSession));
|
|
}
|
|
|
|
// Checked: 2011-11-04 (RLVa-1.4.4a) | Modified: RLVa-1.4.4a
|
|
bool RlvUIEnabler::hasOpenProfile(const LLUUID& idAgent)
|
|
{
|
|
// -> SL-2.1.0 added the ability to "share" inventory by dropping it on the avatar picker floater so we should check for that
|
|
// -> we can drag/drop inventory onto calling cards but probably noone knows about it and it would be too involved to check for that
|
|
// TODO-RLVa: [RLVa-1.2.1] Check the avatar picker as well
|
|
|
|
// Check if the user has the specified agent's profile open
|
|
return LLAvatarActions::profileVisible(idAgent);
|
|
}*/
|
|
|
|
// Checked: 2010-09-11 (RLVa-1.2.1d) | Added: RLVa-1.2.1d
|
|
bool RlvUIEnabler::isBuildEnabled()
|
|
{
|
|
return (gAgent.canEditParcel()) && ((!gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) || (!gRlvHandler.hasBehaviour(RLV_BHVR_REZ)));
|
|
}
|
|
|
|
// ============================================================================
|