/**
* @file llfloaterpreference.cpp
* @brief Global preferences with and without persistence.
*
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, 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$
*/
/*
* App-wide preferences. Note that these are not per-user,
* because we need to load many preferences before we have
* a login name.
*/
#include "llviewerprecompiledheaders.h"
#include "llfloaterpreference.h"
#include "message.h"
#include "llfloaterautoreplacesettings.h"
#include "llviewertexturelist.h"
#include "llagent.h"
#include "llagentcamera.h"
#include "llcheckboxctrl.h"
#include "llcolorswatch.h"
#include "llcombobox.h"
#include "llcommandhandler.h"
#include "lldirpicker.h"
#include "lleventtimer.h"
#include "llfeaturemanager.h"
#include "llfocusmgr.h"
//#include "llfirstuse.h"
#include "llfloaterreg.h"
#include "llfloaterabout.h"
#include "llfavoritesbar.h"
#include "llfloatersidepanelcontainer.h"
// [FS communication UI]
//#include "llfloaterimsession.h"
#include "fsfloaterim.h"
#include "fsfloaternearbychat.h"
// [FS communication UI]
#include "llkeyboard.h"
#include "llmodaldialog.h"
#include "llnavigationbar.h"
#include "llfloaterimnearbychat.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "llnotificationtemplate.h"
// [FS Login Panel]
//#include "llpanellogin.h"
#include "fspanellogin.h"
// [FS Login Panel]
#include "llpanelvoicedevicesettings.h"
#include "llradiogroup.h"
#include "llsearchcombobox.h"
#include "llsky.h"
#include "llscrolllistctrl.h"
#include "llscrolllistitem.h"
#include "llsliderctrl.h"
#include "lltabcontainer.h"
#include "lltrans.h"
#include "llviewercontrol.h"
#include "llviewercamera.h"
#include "llviewerwindow.h"
#include "llviewermessage.h"
#include "llviewershadermgr.h"
#include "llviewerthrottle.h"
#include "llvoavatarself.h"
#include "llvotree.h"
#include "llvosky.h"
#include "llfloaterpathfindingconsole.h"
// linden library includes
#include "llavatarnamecache.h"
#include "llerror.h"
#include "llfontgl.h"
#include "llrect.h"
#include "llstring.h"
// project includes
#include "llbutton.h"
#include "llflexibleobject.h"
#include "lllineeditor.h"
#include "llresmgr.h"
#include "llspinctrl.h"
#include "llstartup.h"
#include "lltextbox.h"
#include "llui.h"
#include "llviewerobjectlist.h"
#include "llvoavatar.h"
#include "llvovolume.h"
#include "llwindow.h"
#include "llworld.h"
#include "pipeline.h"
#include "lluictrlfactory.h"
#include "llviewermedia.h"
#include "llpluginclassmedia.h"
#include "llteleporthistorystorage.h"
#include "llproxy.h"
#include "llweb.h"
// [RLVa:KB] - Checked: 2010-03-18 (RLVa-1.2.0a)
#include "rlvactions.h"
// [/RLVa:KB]
#include "lllogininstance.h" // to check if logged in yet
#include "llsdserialize.h"
#include "llpresetsmanager.h"
#include "llviewercontrol.h"
#include "llpresetsmanager.h"
#include "llfeaturemanager.h"
#include "llviewertexturelist.h"
#include "llsearchableui.h"
// Firestorm Includes
#include "exogroupmutelist.h"
#include "fsavatarrenderpersistence.h"
#include "fsdroptarget.h"
#include "fsfloaterimcontainer.h"
#include "growlmanager.h"
#include "lfsimfeaturehandler.h"
#include "llaudioengine.h" // Output device selection
#include "llavatarname.h" // Deeper name cache stuffs
#include "lleventtimer.h"
#include "llviewermenufile.h" // FIRE-23606 Reveal path to external script editor in prefernces
#include "lldiriterator.h" // for populating the fonts combo
#include "llline.h"
#include "llpanelblockedlist.h"
#include "llpanelmaininventory.h"
#include "llscrolllistctrl.h"
#include "llspellcheck.h"
#include "llsdserialize.h" // KB: SkinsSelector
#include "lltoolbarview.h"
#include "llviewernetwork.h" //
#include "NACLantispam.h"
#include "../llcrashlogger/llcrashlogger.h"
#if LL_WINDOWS
#include
#endif
// FIRE-23606 Reveal path to external script editor in prefernces
#if LL_DARWIN
#include
#include // [FS:CR]
#endif
//
// FIRE-6340, FIRE-6567 - Setting Bandwidth issues
//const F32 BANDWIDTH_UPDATER_TIMEOUT = 0.5f;
char const* const VISIBILITY_DEFAULT = "default";
char const* const VISIBILITY_HIDDEN = "hidden";
//control value for middle mouse as talk2push button
const static std::string MIDDLE_MOUSE_CV = "MiddleMouse"; // for voice client and redability
const static std::string MOUSE_BUTTON_4_CV = "MouseButton4";
const static std::string MOUSE_BUTTON_5_CV = "MouseButton5";
/// This must equal the maximum value set for the IndirectMaxComplexity slider in panel_preferences_graphics1.xml
static const U32 INDIRECT_MAX_ARC_OFF = 101; // all the way to the right == disabled
static const U32 MIN_INDIRECT_ARC_LIMIT = 1; // must match minimum of IndirectMaxComplexity in panel_preferences_graphics1.xml
static const U32 MAX_INDIRECT_ARC_LIMIT = INDIRECT_MAX_ARC_OFF-1; // one short of all the way to the right...
/// These are the effective range of values for RenderAvatarMaxComplexity
static const F32 MIN_ARC_LIMIT = 20000.0f;
static const F32 MAX_ARC_LIMIT = 350000.0f;
static const F32 MIN_ARC_LOG = log(MIN_ARC_LIMIT);
static const F32 MAX_ARC_LOG = log(MAX_ARC_LIMIT);
static const F32 ARC_LIMIT_MAP_SCALE = (MAX_ARC_LOG - MIN_ARC_LOG) / (MAX_INDIRECT_ARC_LIMIT - MIN_INDIRECT_ARC_LIMIT);
struct LabelDef : public LLInitParam::Block
{
Mandatory name;
Mandatory value;
LabelDef()
: name("name"),
value("value")
{}
};
struct LabelTable : public LLInitParam::Block
{
Multiple labels;
LabelTable()
: labels("label")
{}
};
class LLVoiceSetKeyDialog : public LLModalDialog
{
public:
LLVoiceSetKeyDialog(const LLSD& key);
~LLVoiceSetKeyDialog();
/*virtual*/ BOOL postBuild();
void setParent(LLFloaterPreference* parent) { mParent = parent; }
BOOL handleKeyHere(KEY key, MASK mask);
BOOL handleAnyMouseClick(S32 x, S32 y, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down);
static void onCancel(void* user_data);
private:
LLFloaterPreference* mParent;
};
LLVoiceSetKeyDialog::LLVoiceSetKeyDialog(const LLSD& key)
: LLModalDialog(key),
mParent(NULL)
{
}
//virtual
BOOL LLVoiceSetKeyDialog::postBuild()
{
childSetAction("Cancel", onCancel, this);
getChild("Cancel")->setFocus(TRUE);
gFocusMgr.setKeystrokesOnly(TRUE);
return TRUE;
}
LLVoiceSetKeyDialog::~LLVoiceSetKeyDialog()
{
}
BOOL LLVoiceSetKeyDialog::handleKeyHere(KEY key, MASK mask)
{
BOOL result = TRUE;
if (key == 'Q' && mask == MASK_CONTROL)
{
result = FALSE;
}
else if (mParent)
{
mParent->setKey(key);
}
closeFloater();
return result;
}
BOOL LLVoiceSetKeyDialog::handleAnyMouseClick(S32 x, S32 y, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down)
{
BOOL result = FALSE;
if (down
&& (clicktype == LLMouseHandler::CLICK_MIDDLE || clicktype == LLMouseHandler::CLICK_BUTTON4 || clicktype == LLMouseHandler::CLICK_BUTTON5)
&& mask == 0)
{
mParent->setMouse(clicktype);
result = TRUE;
closeFloater();
}
else
{
result = LLMouseHandler::handleAnyMouseClick(x, y, mask, clicktype, down);
}
return result;
}
//static
void LLVoiceSetKeyDialog::onCancel(void* user_data)
{
LLVoiceSetKeyDialog* self = (LLVoiceSetKeyDialog*)user_data;
self->closeFloater();
}
// global functions
// helper functions for getting/freeing the web browser media
// if creating/destroying these is too slow, we'll need to create
// a static member and update all our static callbacks
void handleNameTagOptionChanged(const LLSD& newvalue);
void handleDisplayNamesOptionChanged(const LLSD& newvalue);
bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response);
bool callback_clear_cache(const LLSD& notification, const LLSD& response);
//
bool callback_clear_inventory_cache(const LLSD& notification, const LLSD& response);
void handleFlightAssistOptionChanged(const LLSD& newvalue);
void handleMovelockOptionChanged(const LLSD& newvalue);
void handleMovelockAfterMoveOptionChanged(const LLSD& newvalue);
bool callback_clear_settings(const LLSD& notification, const LLSD& response);
//
bool callback_clear_debug_search(const LLSD& notification, const LLSD& response);
bool callback_pick_debug_search(const LLSD& notification, const LLSD& response);
//
// FIRE-7050 - Add a warning to the Growl preference option because of FIRE-6868
#ifdef LL_WINDOWS
bool callback_growl_not_installed(const LLSD& notification, const LLSD& response);
#endif
//
//
//bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater);
//bool callback_reset_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater);
void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator);
// Clear inventory cache button
bool callback_clear_inventory_cache(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if ( option == 0 ) // YES
{
// flag client texture cache for clearing next time the client runs
// use a marker file instead of a settings variable to prevent logout crashes and
// dual log ins from messing with the flag. -Zi
std::string delete_cache_marker = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, gAgentID.asString() + "_DELETE_INV_GZ");
FILE* fd = LLFile::fopen(delete_cache_marker, "w");
LLFile::close(fd);
LLNotificationsUtil::add("CacheWillClear");
}
return false;
}
//
// Clear inventory cache button
bool callback_clear_web_browser_cache(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if ( option == 0 ) // YES
{
gSavedSettings.setBOOL("FSStartupClearBrowserCache", TRUE);
}
return false;
}
//
bool callback_clear_cache(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if ( option == 0 ) // YES
{
// flag client texture cache for clearing next time the client runs
gSavedSettings.setBOOL("PurgeCacheOnNextStartup", TRUE);
LLNotificationsUtil::add("CacheWillClear");
}
return false;
}
bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if ( option == 0 ) // YES
{
// clean web
LLViewerMedia::getInstance()->clearAllCaches();
LLViewerMedia::getInstance()->clearAllCookies();
// clean nav bar history
LLNavigationBar::getInstance()->clearHistoryCache();
// flag client texture cache for clearing next time the client runs
// Don't clear main texture cache on browser cache clear - it's too expensive to be done except explicitly
//gSavedSettings.setBOOL("PurgeCacheOnNextStartup", TRUE);
//LLNotificationsUtil::add("CacheWillClear");
LLSearchHistory::getInstance()->clearHistory();
LLSearchHistory::getInstance()->save();
// Make navigation bar part of the UI
// LLSearchComboBox* search_ctrl = LLNavigationBar::getInstance()->getChild("search_combo_box");
// search_ctrl->clearHistory();
LLNavigationBar::instance().clearHistory();
//
LLTeleportHistoryStorage::getInstance()->purgeItems();
LLTeleportHistoryStorage::getInstance()->save();
}
return false;
}
void handleNameTagOptionChanged(const LLSD& newvalue)
{
LLAvatarNameCache::getInstance()->setUseUsernames(gSavedSettings.getBOOL("NameTagShowUsernames"));
LLVOAvatar::invalidateNameTags();
}
void handleDisplayNamesOptionChanged(const LLSD& newvalue)
{
LLAvatarNameCache::getInstance()->setUseDisplayNames(newvalue.asBoolean());
LLVOAvatar::invalidateNameTags();
}
void handleAppearanceCameraMovementChanged(const LLSD& newvalue)
{
if(!newvalue.asBoolean() && gAgentCamera.getCameraMode() == CAMERA_MODE_CUSTOMIZE_AVATAR)
{
gAgentCamera.changeCameraToDefault();
gAgentCamera.resetView();
}
}
//
bool callback_clear_debug_search(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if ( option == 0 ) // YES
{
gSavedSettings.setString("SearchURLDebug","");
}
return false;
}
bool callback_pick_debug_search(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if ( option == 0 ) // YES
{
std::string url;
if (LFSimFeatureHandler::instanceExists())
{
url = LFSimFeatureHandler::instance().searchURL();
}
else
{
#ifdef OPENSIM //
if (LLGridManager::getInstance()->isInOpenSim())
{
url = LLLoginInstance::getInstance()->hasResponse("search")
? LLLoginInstance::getInstance()->getResponse("search").asString()
: gSavedSettings.getString("SearchURLOpenSim");
}
else // we are in SL or SL beta
#endif // OPENSIM //
{
//not in OpenSim means we are in SL or SL beta
url = gSavedSettings.getString("SearchURL");
}
}
gSavedSettings.setString("SearchURLDebug", url);
}
return false;
}
//
/*bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option && floater )
{
if ( floater )
{
floater->setAllIgnored();
// LLFirstUse::disableFirstUse();
floater->buildPopupLists();
}
}
return false;
}
bool callback_reset_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if ( 0 == option && floater )
{
if ( floater )
{
floater->resetAllIgnored();
//LLFirstUse::resetFirstUse();
floater->buildPopupLists();
}
}
return false;
}
*/
void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator)
{
numerator = 0;
denominator = 0;
for (F32 test_denominator = 1.f; test_denominator < 30.f; test_denominator += 1.f)
{
if (fmodf((decimal_val * test_denominator) + 0.01f, 1.f) < 0.02f)
{
numerator = ll_round(decimal_val * test_denominator);
denominator = ll_round(test_denominator);
break;
}
}
}
// static
std::string LLFloaterPreference::sSkin = "";
//////////////////////////////////////////////
// LLFloaterPreference
LLFloaterPreference::LLFloaterPreference(const LLSD& key)
: LLFloater(key),
mGotPersonalInfo(false),
mOriginalIMViaEmail(false),
mLanguageChanged(false),
mAvatarDataInitialized(false),
mClickActionDirty(false)
{
LLConversationLog::instance().addObserver(this);
//Build Floater is now Called from LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build);
static bool registered_dialog = false;
if (!registered_dialog)
{
LLFloaterReg::add("voice_set_key", "floater_select_key.xml", (LLFloaterBuildFunc)&LLFloaterReg::build);
registered_dialog = true;
}
mCommitCallbackRegistrar.add("Pref.Cancel", boost::bind(&LLFloaterPreference::onBtnCancel, this, _2));
mCommitCallbackRegistrar.add("Pref.OK", boost::bind(&LLFloaterPreference::onBtnOK, this, _2));
mCommitCallbackRegistrar.add("Pref.ClearCache", boost::bind(&LLFloaterPreference::onClickClearCache, this));
mCommitCallbackRegistrar.add("Pref.WebClearCache", boost::bind(&LLFloaterPreference::onClickBrowserClearCache, this));
// Clear inventory cache button
mCommitCallbackRegistrar.add("Pref.InvClearCache", boost::bind(&LLFloaterPreference::onClickInventoryClearCache, this));
//
// Clear web browser cache button
mCommitCallbackRegistrar.add("Pref.WebBrowserClearCache", boost::bind(&LLFloaterPreference::onClickWebBrowserClearCache, this));
//
mCommitCallbackRegistrar.add("Pref.SetCache", boost::bind(&LLFloaterPreference::onClickSetCache, this));
mCommitCallbackRegistrar.add("Pref.ResetCache", boost::bind(&LLFloaterPreference::onClickResetCache, this));
// mCommitCallbackRegistrar.add("Pref.ClickSkin", boost::bind(&LLFloaterPreference::onClickSkin, this,_1, _2));
// mCommitCallbackRegistrar.add("Pref.SelectSkin", boost::bind(&LLFloaterPreference::onSelectSkin, this));
mCommitCallbackRegistrar.add("Pref.VoiceSetKey", boost::bind(&LLFloaterPreference::onClickSetKey, this));
mCommitCallbackRegistrar.add("Pref.VoiceSetClearKey", boost::bind(&LLFloaterPreference::onClickClearKey, this)); // FIRE-3803: Clear voice toggle button
mCommitCallbackRegistrar.add("Pref.VoiceSetMiddleMouse", boost::bind(&LLFloaterPreference::onClickSetMiddleMouse, this));
// Handled centrally now
// mCommitCallbackRegistrar.add("Pref.SetSounds", boost::bind(&LLFloaterPreference::onClickSetSounds, this));
mCommitCallbackRegistrar.add("Pref.ClickEnablePopup", boost::bind(&LLFloaterPreference::onClickEnablePopup, this));
mCommitCallbackRegistrar.add("Pref.ClickDisablePopup", boost::bind(&LLFloaterPreference::onClickDisablePopup, this));
mCommitCallbackRegistrar.add("Pref.LogPath", boost::bind(&LLFloaterPreference::onClickLogPath, this));
mCommitCallbackRegistrar.add("Pref.RenderExceptions", boost::bind(&LLFloaterPreference::onClickRenderExceptions, this));
mCommitCallbackRegistrar.add("Pref.HardwareDefaults", boost::bind(&LLFloaterPreference::setHardwareDefaults, this));
mCommitCallbackRegistrar.add("Pref.AvatarImpostorsEnable", boost::bind(&LLFloaterPreference::onAvatarImpostorsEnable, this));
mCommitCallbackRegistrar.add("Pref.UpdateIndirectMaxComplexity", boost::bind(&LLFloaterPreference::updateMaxComplexity, this));
mCommitCallbackRegistrar.add("Pref.RenderOptionUpdate", boost::bind(&LLFloaterPreference::onRenderOptionEnable, this));
mCommitCallbackRegistrar.add("Pref.LocalLightsEnable", boost::bind(&LLFloaterPreference::onLocalLightsEnable, this));
mCommitCallbackRegistrar.add("Pref.WindowedMod", boost::bind(&LLFloaterPreference::onCommitWindowedMode, this));
mCommitCallbackRegistrar.add("Pref.UpdateSliderText", boost::bind(&LLFloaterPreference::refreshUI,this));
mCommitCallbackRegistrar.add("Pref.QualityPerformance", boost::bind(&LLFloaterPreference::onChangeQuality, this, _2));
mCommitCallbackRegistrar.add("Pref.applyUIColor", boost::bind(&LLFloaterPreference::applyUIColor, this ,_1, _2));
mCommitCallbackRegistrar.add("Pref.getUIColor", boost::bind(&LLFloaterPreference::getUIColor, this ,_1, _2));
mCommitCallbackRegistrar.add("Pref.MaturitySettings", boost::bind(&LLFloaterPreference::onChangeMaturity, this));
mCommitCallbackRegistrar.add("Pref.BlockList", boost::bind(&LLFloaterPreference::onClickBlockList, this));
mCommitCallbackRegistrar.add("Pref.Proxy", boost::bind(&LLFloaterPreference::onClickProxySettings, this));
mCommitCallbackRegistrar.add("Pref.TranslationSettings", boost::bind(&LLFloaterPreference::onClickTranslationSettings, this));
mCommitCallbackRegistrar.add("Pref.AutoReplace", boost::bind(&LLFloaterPreference::onClickAutoReplace, this));
mCommitCallbackRegistrar.add("Pref.PermsDefault", boost::bind(&LLFloaterPreference::onClickPermsDefault, this));
mCommitCallbackRegistrar.add("Pref.RememberedUsernames", boost::bind(&LLFloaterPreference::onClickRememberedUsernames, this));
mCommitCallbackRegistrar.add("Pref.SpellChecker", boost::bind(&LLFloaterPreference::onClickSpellChecker, this));
mCommitCallbackRegistrar.add("Pref.Advanced", boost::bind(&LLFloaterPreference::onClickAdvanced, this));
// Improved graphics preferences
mCommitCallbackRegistrar.add("Pref.UpdateIndirectMaxNonImpostors", boost::bind(&LLFloaterPreference::updateMaxNonImpostors, this));
//
sSkin = gSavedSettings.getString("SkinCurrent");
mCommitCallbackRegistrar.add("Pref.ClickActionChange", boost::bind(&LLFloaterPreference::onClickActionChange, this));
gSavedSettings.getControl("NameTagShowUsernames")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2));
gSavedSettings.getControl("NameTagShowFriends")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2));
gSavedSettings.getControl("UseDisplayNames")->getCommitSignal()->connect(boost::bind(&handleDisplayNamesOptionChanged, _2));
gSavedSettings.getControl("AppearanceCameraMovement")->getCommitSignal()->connect(boost::bind(&handleAppearanceCameraMovementChanged, _2));
LLAvatarPropertiesProcessor::getInstance()->addObserver( gAgent.getID(), this );
mCommitCallbackRegistrar.add("Pref.ClearLog", boost::bind(&LLConversationLog::onClearLog, &LLConversationLog::instance()));
mCommitCallbackRegistrar.add("Pref.DeleteTranscripts", boost::bind(&LLFloaterPreference::onDeleteTranscripts, this));
mCommitCallbackRegistrar.add("UpdateFilter", boost::bind(&LLFloaterPreference::onUpdateFilterTerm, this, false)); // Hook up for filtering
//
mCommitCallbackRegistrar.add("NACL.AntiSpamUnblock", boost::bind(&LLFloaterPreference::onClickClearSpamList, this));
mCommitCallbackRegistrar.add("NACL.SetPreprocInclude", boost::bind(&LLFloaterPreference::setPreprocInclude, this));
// FIRE-23606 Reveal path to external script editor in prefernces
mCommitCallbackRegistrar.add("Pref.SetExternalEditor", boost::bind(&LLFloaterPreference::setExternalEditor, this));
//[ADD - Clear Settings : SJ]
mCommitCallbackRegistrar.add("Pref.ClearSettings", boost::bind(&LLFloaterPreference::onClickClearSettings, this));
mCommitCallbackRegistrar.add("Pref.Online_Notices", boost::bind(&LLFloaterPreference::onClickChatOnlineNotices, this));
// FIRE-8190: Preview function for "UI Sounds" Panel
mCommitCallbackRegistrar.add("PreviewUISound", boost::bind(&LLFloaterPreference::onClickPreviewUISound, this, _2));
mCommitCallbackRegistrar.add("Pref.BrowseCache", boost::bind(&LLFloaterPreference::onClickBrowseCache, this));
mCommitCallbackRegistrar.add("Pref.BrowseCrashLogs", boost::bind(&LLFloaterPreference::onClickBrowseCrashLogs, this));
mCommitCallbackRegistrar.add("Pref.BrowseSettingsDir", boost::bind(&LLFloaterPreference::onClickBrowseSettingsDir, this));
mCommitCallbackRegistrar.add("Pref.BrowseLogPath", boost::bind(&LLFloaterPreference::onClickBrowseChatLogDir, this));
mCommitCallbackRegistrar.add("Pref.Javascript", boost::bind(&LLFloaterPreference::onClickJavascript, this));
//[FIX FIRE-2765 : SJ] Making sure Reset button resets works
mCommitCallbackRegistrar.add("Pref.ResetLogPath", boost::bind(&LLFloaterPreference::onClickResetLogPath, this));
//
gSavedSettings.getControl("FSColorUsername")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2));
gSavedSettings.getControl("FSUseLegacyClienttags")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2));
gSavedSettings.getControl("FSClientTagsVisibility")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2));
gSavedSettings.getControl("FSColorClienttags")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2));
//
// Sound cache
mCommitCallbackRegistrar.add("Pref.BrowseSoundCache", boost::bind(&LLFloaterPreference::onClickBrowseSoundCache, this));
mCommitCallbackRegistrar.add("Pref.SetSoundCache", boost::bind(&LLFloaterPreference::onClickSetSoundCache, this));
mCommitCallbackRegistrar.add("Pref.ResetSoundCache", boost::bind(&LLFloaterPreference::onClickResetSoundCache, this));
//
// FIRE-2912: Reset voice button
mCommitCallbackRegistrar.add("Pref.ResetVoice", boost::bind(&LLFloaterPreference::onClickResetVoice, this));
}
void LLFloaterPreference::processProperties( void* pData, EAvatarProcessorType type )
{
if ( APT_PROPERTIES == type )
{
const LLAvatarData* pAvatarData = static_cast( pData );
if (pAvatarData && (gAgent.getID() == pAvatarData->avatar_id) && (pAvatarData->avatar_id != LLUUID::null))
{
storeAvatarProperties( pAvatarData );
processProfileProperties( pAvatarData );
}
}
}
void LLFloaterPreference::storeAvatarProperties( const LLAvatarData* pAvatarData )
{
if (gAgent.isInitialized() && (gAgent.getID() != LLUUID::null) && (LLStartUp::getStartupState() == STATE_STARTED))
{
mAvatarProperties.avatar_id = pAvatarData->avatar_id;
mAvatarProperties.image_id = pAvatarData->image_id;
mAvatarProperties.fl_image_id = pAvatarData->fl_image_id;
mAvatarProperties.about_text = pAvatarData->about_text;
mAvatarProperties.fl_about_text = pAvatarData->fl_about_text;
mAvatarProperties.profile_url = pAvatarData->profile_url;
mAvatarProperties.flags = pAvatarData->flags;
mAvatarProperties.allow_publish = pAvatarData->flags & AVATAR_ALLOW_PUBLISH;
mAvatarDataInitialized = true;
}
}
void LLFloaterPreference::processProfileProperties(const LLAvatarData* pAvatarData )
{
getChild("online_searchresults")->setValue( (bool)(pAvatarData->flags & AVATAR_ALLOW_PUBLISH) );
}
void LLFloaterPreference::saveAvatarProperties( void )
{
const BOOL allowPublish = getChild("online_searchresults")->getValue();
if (allowPublish)
{
mAvatarProperties.flags |= AVATAR_ALLOW_PUBLISH;
}
//
// NOTE: We really don't want to send the avatar properties unless we absolutely
// need to so we can avoid the accidental profile reset bug, so, if we're
// logged in, the avatar data has been initialized and we have a state change
// for the "allow publish" flag, then set the flag to its new value and send
// the properties update.
//
// NOTE: The only reason we can not remove this update altogether is because of the
// "allow publish" flag, the last remaining profile setting in the viewer
// that doesn't exist in the web profile.
//
if ((LLStartUp::getStartupState() == STATE_STARTED) && mAvatarDataInitialized && (allowPublish != mAvatarProperties.allow_publish))
{
mAvatarProperties.allow_publish = allowPublish;
LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate( &mAvatarProperties );
}
}
BOOL LLFloaterPreference::postBuild()
{
// [FS communication UI]
//gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLFloaterIMSessionTab::processChatHistoryStyleUpdate, false));
//gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLViewerChat::signalChatFontChanged));
// [FS communication UI]
gSavedSettings.getControl("ChatBubbleOpacity")->getSignal()->connect(boost::bind(&LLFloaterPreference::onNameTagOpacityChange, this, _2));
gSavedSettings.getControl("ConsoleBackgroundOpacity")->getSignal()->connect(boost::bind(&LLFloaterPreference::onConsoleOpacityChange, this, _2)); // FIRE-1332 - Sepeate opacity settings for nametag and console chat
gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeMaturity, this));
gSavedPerAccountSettings.getControl("ModelUploadFolder")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeModelFolder, this));
gSavedPerAccountSettings.getControl("TextureUploadFolder")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeTextureFolder, this));
gSavedPerAccountSettings.getControl("SoundUploadFolder")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeSoundFolder, this));
gSavedPerAccountSettings.getControl("AnimationUploadFolder")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeAnimationFolder, this));
LLTabContainer* tabcontainer = getChild("pref core");
if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
tabcontainer->selectFirstTab();
getChild("cache_location")->setEnabled(FALSE); // make it read-only but selectable (STORM-227)
// getChildView("log_path_string")->setEnabled(FALSE);// do the same for chat logs path - Field removed from Privacy tab, we have it already in Network & Files tab along with few fancy buttons (03 Mar 2015)
getChildView("log_path_string-panelsetup")->setEnabled(FALSE);// and the redundant instance -WoLf
std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");
setCacheLocation(cache_location);
// Sound cache
setSoundCacheLocation(gSavedSettings.getString("FSSoundCacheLocation"));
getChild("FSSoundCacheLocation")->setEnabled(FALSE);
//
getChild("language_combobox")->setCommitCallback(boost::bind(&LLFloaterPreference::onLanguageChange, this));
// [CHUI MERGE]
// We don't use these in FS Communications UI, should we in the future? Disabling for now.
//getChild("FriendIMOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"FriendIMOptions"));
//getChild("NonFriendIMOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"NonFriendIMOptions"));
//getChild("ConferenceIMOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"ConferenceIMOptions"));
//getChild("GroupChatOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"GroupChatOptions"));
//getChild("NearbyChatOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"NearbyChatOptions"));
//getChild("ObjectIMOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"ObjectIMOptions"));
//
// if floater is opened before login set default localized do not disturb message
if (LLStartUp::getStartupState() < STATE_STARTED)
{
gSavedPerAccountSettings.setString("DoNotDisturbModeResponse", LLTrans::getString("DoNotDisturbModeResponseDefault"));
// FIRE-5436: Unlocalizable auto-response messages
gSavedPerAccountSettings.setString("FSAutorespondModeResponse", LLTrans::getString("AutoResponseModeDefault"));
gSavedPerAccountSettings.setString("FSAutorespondNonFriendsResponse", LLTrans::getString("AutoResponseModeNonFriendsDefault"));
gSavedPerAccountSettings.setString("FSRejectTeleportOffersResponse", LLTrans::getString("RejectTeleportOffersResponseDefault"));
gSavedPerAccountSettings.setString("FSRejectFriendshipRequestsResponse", LLTrans::getString("RejectFriendshipRequestsResponseDefault"));
gSavedPerAccountSettings.setString("FSMutedAvatarResponse", LLTrans::getString("MutedAvatarsResponseDefault"));
gSavedPerAccountSettings.setString("FSAwayAvatarResponse", LLTrans::getString("AwayAvatarResponseDefault"));
//
}
// set 'enable' property for 'Clear log...' button
changed();
LLLogChat::getInstance()->setSaveHistorySignal(boost::bind(&LLFloaterPreference::onLogChatHistorySaved, this));
LLSliderCtrl* fov_slider = getChild("camera_fov");
fov_slider->setMinValue(LLViewerCamera::getInstance()->getMinView());
fov_slider->setMaxValue(LLViewerCamera::getInstance()->getMaxView());
// Hook up and init for filtering
mFilterEdit = getChild("search_prefs_edit");
mFilterEdit->setKeystrokeCallback(boost::bind(&LLFloaterPreference::onUpdateFilterTerm, this, false));
// Load and assign label for 'default language'
std::string user_filename = gDirUtilp->getExpandedFilename(LL_PATH_DEFAULT_SKIN, "default_languages.xml");
std::map labels;
if (loadFromFilename(user_filename, labels))
{
std::string system_lang = gSavedSettings.getString("SystemLanguage");
std::map::iterator iter = labels.find(system_lang);
if (iter != labels.end())
{
getChild("language_combobox")->add(iter->second, LLSD("default"), ADD_TOP, true);
}
else
{
LL_WARNS() << "Language \"" << system_lang << "\" is not in default_languages.xml" << LL_ENDL;
getChild("language_combobox")->add("System default", LLSD("default"), ADD_TOP, true);
}
}
else
{
LL_WARNS() << "Failed to load labels from " << user_filename << ". Using default." << LL_ENDL;
getChild("language_combobox")->add("System default", LLSD("default"), ADD_TOP, true);
}
// [SL:KB] - Patch: Viewer-CrashReporting | Checked: 2011-06-11 (Catznip-2.6.c) | Added: Catznip-2.6.0c
#ifndef LL_SEND_CRASH_REPORTS
// Hide the crash report tab if crash reporting isn't enabled
LLTabContainer* pTabContainer = getChild("pref core");
if (pTabContainer)
{
LLPanel* pCrashReportPanel = pTabContainer->getPanelByName("crashreports");
if (pCrashReportPanel)
pTabContainer->removeTabPanel(pCrashReportPanel);
}
#endif // LL_SEND_CRASH_REPORTS
// [/SL:KB]
//
#if !defined(OPENSIM) || defined(SINGLEGRID)//
// Hide the opensim tab if opensim isn't enabled
LLTabContainer* tab_container = getChild("pref core");
if (tab_container)
{
LLPanel* opensim_panel = tab_container->getPanelByName("opensim");
if (opensim_panel)
tab_container->removeTabPanel(opensim_panel);
}
//
#endif // OPENSIM //
// Pie menu
gSavedSettings.getControl("OverridePieColors")->getSignal()->connect(boost::bind(&LLFloaterPreference::onPieColorsOverrideChanged, this));
// make sure pie color controls are enabled or greyed out properly
onPieColorsOverrideChanged();
// Pie menu
// Group Notices and chiclets location setting conversion BOOL => S32
gSavedSettings.getControl("ShowGroupNoticesTopRight")->getSignal()->connect(boost::bind(&LLFloaterPreference::onShowGroupNoticesTopRightChanged, this));
onShowGroupNoticesTopRightChanged();
// Group Notices and chiclets location setting conversion BOOL => S32
// Show email address in preferences (FIRE-1071)
getChild("send_im_to_email")->setLabelArg("[EMAIL]", getString("LoginToChange"));
// Load the list of font settings
populateFontSelectionCombo();
//
// Update label for max. non imposters and max complexity
gSavedSettings.getControl("IndirectMaxNonImpostors")->getCommitSignal()->connect(boost::bind(&LLFloaterPreference::updateMaxNonImpostorsLabel, this, _2));
gSavedSettings.getControl("RenderAvatarMaxComplexity")->getCommitSignal()->connect(boost::bind(&LLFloaterPreference::updateMaxComplexityLabel, this, _2));
// Properly disable avatar tag setting
gSavedSettings.getControl("NameTagShowUsernames")->getCommitSignal()->connect(boost::bind(&LLFloaterPreference::onAvatarTagSettingsChanged, this));
gSavedSettings.getControl("FSNameTagShowLegacyUsernames")->getCommitSignal()->connect(boost::bind(&LLFloaterPreference::onAvatarTagSettingsChanged, this));
gSavedSettings.getControl("AvatarNameTagMode")->getCommitSignal()->connect(boost::bind(&LLFloaterPreference::onAvatarTagSettingsChanged, this));
gSavedSettings.getControl("FSTagShowARW")->getCommitSignal()->connect(boost::bind(&LLFloaterPreference::onAvatarTagSettingsChanged, this));
onAvatarTagSettingsChanged();
//
// Correct enabled state of Animated Script Dialogs option
gSavedSettings.getControl("ScriptDialogsPosition")->getCommitSignal()->connect(boost::bind(&LLFloaterPreference::updateAnimatedScriptDialogs, this));
updateAnimatedScriptDialogs();
// Set max. UI scaling factor depending on max. supported OS scaling factor
#if LL_WINDOWS
if (IsWindowsVersionOrGreater(10, 0, 0))
{
getChild("ui_scale_slider")->setMaxValue(4.5f);
}
else if (IsWindows8Point1OrGreater())
{
getChild("ui_scale_slider")->setMaxValue(2.5f);
}
#endif
//
// Disable options only available on Windows and not on other platforms
#ifndef LL_WINDOWS
childSetEnabled("FSDisableWMIProbing", FALSE);
#endif
//
// Disable options only available on Linux and not on other platforms
#ifndef LL_LINUX
childSetEnabled("FSRemapLinuxShortcuts", FALSE);
#endif
//
return TRUE;
}
// Pie menu
void LLFloaterPreference::onPieColorsOverrideChanged()
{
BOOL enable = gSavedSettings.getBOOL("OverridePieColors");
getChild("pie_bg_color_override")->setEnabled(enable);
getChild("pie_selected_color_override")->setEnabled(enable);
getChild("pie_menu_opacity")->setEnabled(enable);
getChild("pie_menu_fade_out")->setEnabled(enable);
}
// Pie menu
// Group Notices and chiclets location setting conversion BOOL => S32
void LLFloaterPreference::onShowGroupNoticesTopRightChanged()
{
getChild("ShowGroupNoticesTopRight")->setValue(gSavedSettings.getBOOL("ShowGroupNoticesTopRight"));
}
// Group Notices and chiclets location setting conversion BOOL => S32
void LLFloaterPreference::updateDeleteTranscriptsButton()
{
// LLLogChat::getListOfTranscriptFiles will go through the whole chatlog dir, reach a bit of each file,
// then append this file to the return-list if it seems to be valid.
// All this only to see if there is at least one item.
// There's two ways to make this faster:
// 1. Make a new function which returns just true/false and exist with true as soon as one valid file is found.
// 2. Always enable this button.
// There seems to be little reason why this button should ever be disabled, so 2. it is, unless someone knows
// a good reason why 1. is the better way to handle this.
// std::vector list_of_transcriptions_file_names;
// LLLogChat::getListOfTranscriptFiles(list_of_transcriptions_file_names);
// getChild("delete_transcripts")->setEnabled(list_of_transcriptions_file_names.size() > 0);
getChild("delete_transcripts")->setEnabled( true );
//
}
void LLFloaterPreference::onDoNotDisturbResponseChanged()
{
// set "DoNotDisturbResponseChanged" TRUE if user edited message differs from default, FALSE otherwise
bool response_changed_flag =
LLTrans::getString("DoNotDisturbModeResponseDefault")
!= getChild("do_not_disturb_response")->getValue().asString();
gSavedPerAccountSettings.setBOOL("DoNotDisturbResponseChanged", response_changed_flag );
// FIRE-5436: Unlocalizable auto-response messages
bool auto_response_changed_flag =
LLTrans::getString("AutoResponseModeDefault")
!= getChild("autorespond_response")->getValue().asString();
gSavedPerAccountSettings.setBOOL("FSAutoResponseChanged", auto_response_changed_flag );
bool auto_response_non_friends_changed_flag =
LLTrans::getString("AutoResponseModeNonFriendsDefault")
!= getChild("autorespond_nf_response")->getValue().asString();
gSavedPerAccountSettings.setBOOL("FSAutoResponseNonFriendsChanged", auto_response_non_friends_changed_flag );
bool reject_teleport_offers_response_changed_flag =
LLTrans::getString("RejectTeleportOffersResponseDefault")
!= getChild("autorespond_rto_response")->getValue().asString();
gSavedPerAccountSettings.setBOOL("FSRejectTeleportOffersResponseChanged", reject_teleport_offers_response_changed_flag );
bool reject_friendship_requests_response_changed_flag =
LLTrans::getString("RejectFriendshipRequestsResponseDefault")
!= getChild("autorespond_rfr_response")->getValue().asString();
gSavedPerAccountSettings.setBOOL("FSRejectFriendshipRequestsResponseChanged", reject_friendship_requests_response_changed_flag );
bool muted_avatar_response_changed_flag =
LLTrans::getString("MutedAvatarsResponseDefault")
!= getChild("muted_avatar_response")->getValue().asString();
gSavedPerAccountSettings.setBOOL("FSMutedAvatarResponseChanged", muted_avatar_response_changed_flag );
bool away_avatar_response_changed_flag =
LLTrans::getString("AwayAvatarResponseDefault")
!= getChild("away_avatar_response")->getValue().asString();
gSavedPerAccountSettings.setBOOL("FSAwayAvatarResponseChanged", away_avatar_response_changed_flag );
//
}
LLFloaterPreference::~LLFloaterPreference()
{
LLConversationLog::instance().removeObserver(this);
}
void LLFloaterPreference::draw()
{
// Performance improvement
//BOOL has_first_selected = (getChildRef("disabled_popups").getFirstSelected()!=NULL);
//gSavedSettings.setBOOL("FirstSelectedDisabledPopups", has_first_selected);
//
//has_first_selected = (getChildRef("enabled_popups").getFirstSelected()!=NULL);
//gSavedSettings.setBOOL("FirstSelectedEnabledPopups", has_first_selected);
static LLScrollListCtrl* disabled_popups = getChild("disabled_popups");
static LLScrollListCtrl* enabled_popups = getChild("enabled_popups");
BOOL has_first_selected = disabled_popups->getFirstSelected() != NULL;
gSavedSettings.setBOOL("FirstSelectedDisabledPopups", has_first_selected);
has_first_selected = enabled_popups->getFirstSelected() != NULL;
gSavedSettings.setBOOL("FirstSelectedEnabledPopups", has_first_selected);
//
LLFloater::draw();
}
void LLFloaterPreference::saveSettings()
{
LLTabContainer* tabcontainer = getChild("pref core");
child_list_t::const_iterator iter = tabcontainer->getChildList()->begin();
child_list_t::const_iterator end = tabcontainer->getChildList()->end();
for ( ; iter != end; ++iter)
{
LLView* view = *iter;
LLPanelPreference* panel = dynamic_cast(view);
if (panel)
panel->saveSettings();
}
}
void LLFloaterPreference::apply()
{
LLAvatarPropertiesProcessor::getInstance()->addObserver( gAgent.getID(), this );
LLTabContainer* tabcontainer = getChild("pref core");
/*
if (sSkin != gSavedSettings.getString("SkinCurrent"))
{
LLNotificationsUtil::add("ChangeSkin");
refreshSkin(this);
}
*/
// Call apply() on all panels that derive from LLPanelPreference
for (child_list_t::const_iterator iter = tabcontainer->getChildList()->begin();
iter != tabcontainer->getChildList()->end(); ++iter)
{
LLView* view = *iter;
LLPanelPreference* panel = dynamic_cast(view);
if (panel)
panel->apply();
}
gViewerWindow->requestResolutionUpdate(); // for UIScaleFactor
LLSliderCtrl* fov_slider = getChild("camera_fov");
fov_slider->setMinValue(LLViewerCamera::getInstance()->getMinView());
fov_slider->setMaxValue(LLViewerCamera::getInstance()->getMaxView());
std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");
setCacheLocation(cache_location);
// Sound cache
setSoundCacheLocation(gSavedSettings.getString("FSSoundCacheLocation"));
//LLViewerMedia::getInstance()->setCookiesEnabled(getChild("cookies_enabled")->getValue());
if (hasChild("web_proxy_enabled", TRUE) &&hasChild("web_proxy_editor", TRUE) && hasChild("web_proxy_port", TRUE))
{
bool proxy_enable = getChild("web_proxy_enabled")->getValue();
std::string proxy_address = getChild("web_proxy_editor")->getValue();
int proxy_port = getChild("web_proxy_port")->getValue();
LLViewerMedia::getInstance()->setProxyConfig(proxy_enable, proxy_address, proxy_port);
}
if (mGotPersonalInfo)
{
bool new_im_via_email = getChild("send_im_to_email")->getValue().asBoolean();
bool new_hide_online = getChild("online_visibility")->getValue().asBoolean();
if ((new_im_via_email != mOriginalIMViaEmail)
||(new_hide_online != mOriginalHideOnlineStatus))
{
// This hack is because we are representing several different
// possible strings with a single checkbox. Since most users
// can only select between 2 values, we represent it as a
// checkbox. This breaks down a little bit for liaisons, but
// works out in the end.
if (new_hide_online != mOriginalHideOnlineStatus)
{
if (new_hide_online) mDirectoryVisibility = VISIBILITY_HIDDEN;
else mDirectoryVisibility = VISIBILITY_DEFAULT;
//Update showonline value, otherwise multiple applys won't work
mOriginalHideOnlineStatus = new_hide_online;
}
gAgent.sendAgentUpdateUserInfo(new_im_via_email,mDirectoryVisibility);
}
}
saveAvatarProperties();
if (mClickActionDirty)
{
updateClickActionSettings();
mClickActionDirty = false;
}
// Fix resetting graphics preset on cancel; Save preset here because cancel() gets called in either way!
saveGraphicsPreset(gSavedSettings.getString("PresetGraphicActive"));
}
void LLFloaterPreference::cancel()
{
LLTabContainer* tabcontainer = getChild("pref core");
// Call cancel() on all panels that derive from LLPanelPreference
for (child_list_t::const_iterator iter = tabcontainer->getChildList()->begin();
iter != tabcontainer->getChildList()->end(); ++iter)
{
LLView* view = *iter;
LLPanelPreference* panel = dynamic_cast(view);
if (panel)
panel->cancel();
}
// hide joystick pref floater
LLFloaterReg::hideInstance("pref_joystick");
// hide translation settings floater
LLFloaterReg::hideInstance("prefs_translation");
// hide autoreplace settings floater
LLFloaterReg::hideInstance("prefs_autoreplace");
// hide spellchecker settings folder
LLFloaterReg::hideInstance("prefs_spellchecker");
// hide advanced graphics floater
LLFloaterReg::hideInstance("prefs_graphics_advanced");
// reverts any changes to current skin
//gSavedSettings.setString("SkinCurrent", sSkin);
if (mClickActionDirty)
{
updateClickActionControls();
mClickActionDirty = false;
}
LLFloaterPreferenceProxy * advanced_proxy_settings = LLFloaterReg::findTypedInstance("prefs_proxy");
if (advanced_proxy_settings)
{
advanced_proxy_settings->cancel();
}
//Need to reload the navmesh if the pathing console is up
LLHandle pathfindingConsoleHandle = LLFloaterPathfindingConsole::getInstanceHandle();
if ( !pathfindingConsoleHandle.isDead() )
{
LLFloaterPathfindingConsole* pPathfindingConsole = pathfindingConsoleHandle.get();
pPathfindingConsole->onRegionBoundaryCross();
}
// Fix resetting graphics preset on cancel
//if (!mSavedGraphicsPreset.empty())
if (mSavedGraphicsPreset != gSavedSettings.getString("PresetGraphicActive"))
//
{
gSavedSettings.setString("PresetGraphicActive", mSavedGraphicsPreset);
LLPresetsManager::getInstance()->triggerChangeSignal();
}
}
void LLFloaterPreference::onOpen(const LLSD& key)
{
// this variable and if that follows it are used to properly handle do not disturb mode response message
static bool initialized = FALSE;
// if user is logged in and we haven't initialized do not disturb mode response yet, do it
if (!initialized && LLStartUp::getStartupState() == STATE_STARTED)
{
// Special approach is used for do not disturb response localization, because "DoNotDisturbModeResponse" is
// in non-localizable xml, and also because it may be changed by user and in this case it shouldn't be localized.
// To keep track of whether do not disturb response is default or changed by user additional setting DoNotDisturbResponseChanged
// was added into per account settings.
// initialization should happen once,so setting variable to TRUE
initialized = TRUE;
// this connection is needed to properly set "DoNotDisturbResponseChanged" setting when user makes changes in
// do not disturb response message.
gSavedPerAccountSettings.getControl("DoNotDisturbModeResponse")->getSignal()->connect(boost::bind(&LLFloaterPreference::onDoNotDisturbResponseChanged, this));
// FIRE-5436: Unlocalizable auto-response messages
gSavedPerAccountSettings.getControl("FSAutorespondModeResponse")->getSignal()->connect(boost::bind(&LLFloaterPreference::onDoNotDisturbResponseChanged, this));
gSavedPerAccountSettings.getControl("FSAutorespondNonFriendsResponse")->getSignal()->connect(boost::bind(&LLFloaterPreference::onDoNotDisturbResponseChanged, this));
gSavedPerAccountSettings.getControl("FSRejectTeleportOffersResponse")->getSignal()->connect(boost::bind(&LLFloaterPreference::onDoNotDisturbResponseChanged, this));
gSavedPerAccountSettings.getControl("FSRejectFriendshipRequestsResponse")->getSignal()->connect(boost::bind(&LLFloaterPreference::onDoNotDisturbResponseChanged, this));
gSavedPerAccountSettings.getControl("FSMutedAvatarResponse")->getSignal()->connect(boost::bind(&LLFloaterPreference::onDoNotDisturbResponseChanged, this));
gSavedPerAccountSettings.getControl("FSAwayAvatarResponse")->getSignal()->connect(boost::bind(&LLFloaterPreference::onDoNotDisturbResponseChanged, this));
//
// FIRE-17630: Properly disable per-account settings backup list
getChildView("restore_per_account_disable_cover")->setVisible(FALSE);
// Keyword settings are per-account; enable after logging in
LLPanel* keyword_panel = getChild("ChatKeywordAlerts");
for (child_list_t::const_iterator iter = keyword_panel->getChildList()->begin();
iter != keyword_panel->getChildList()->end(); ++iter)
{
LLUICtrl* child = static_cast(*iter);
LLControlVariable* enabled_control = child->getEnabledControlVariable();
BOOL enabled = !enabled_control || enabled_control->getValue().asBoolean();
child->setEnabled(enabled);
}
//
}
gAgent.sendAgentUserInfoRequest();
/////////////////////////// From LLPanelGeneral //////////////////////////
// if we have no agent, we can't let them choose anything
// if we have an agent, then we only let them choose if they have a choice
bool can_choose_maturity =
gAgent.getID().notNull() &&
(gAgent.isMature() || gAgent.isGodlike());
LLComboBox* maturity_combo = getChild("maturity_desired_combobox");
LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesRequest( gAgent.getID() );
if (can_choose_maturity)
{
// if they're not adult or a god, they shouldn't see the adult selection, so delete it
if (!gAgent.isAdult() && !gAgent.isGodlikeWithoutAdminMenuFakery())
{
// we're going to remove the adult entry from the combo
LLScrollListCtrl* maturity_list = maturity_combo->findChild("ComboBox");
if (maturity_list)
{
maturity_list->deleteItems(LLSD(SIM_ACCESS_ADULT));
}
}
getChildView("maturity_desired_combobox")->setEnabled( true);
getChildView("maturity_desired_textbox")->setVisible( false);
}
else
{
getChild("maturity_desired_textbox")->setValue(maturity_combo->getSelectedItemLabel());
getChildView("maturity_desired_combobox")->setEnabled( false);
}
// Forget previous language changes.
mLanguageChanged = false;
// Display selected maturity icons.
onChangeMaturity();
onChangeModelFolder();
onChangeTextureFolder();
onChangeSoundFolder();
onChangeAnimationFolder();
// Load (double-)click to walk/teleport settings.
updateClickActionControls();
// Load UI Sounds tabs settings.
updateUISoundsControls();
// Enabled/disabled popups, might have been changed by user actions
// while preferences floater was closed.
buildPopupLists();
//get the options that were checked
// [CHUI MERGE]
// We don't use these in FS Communications UI, should we in the future? Disabling for now.
//onNotificationsChange("FriendIMOptions");
//onNotificationsChange("NonFriendIMOptions");
//onNotificationsChange("ConferenceIMOptions");
//onNotificationsChange("GroupChatOptions");
//onNotificationsChange("NearbyChatOptions");
//onNotificationsChange("ObjectIMOptions");
//
// [FS Login Panel]
//LLPanelLogin::setAlwaysRefresh(true);
FSPanelLogin::setAlwaysRefresh(true);
// [FS Login Panel]
refresh();
getChildView("plain_text_chat_history")->setEnabled(TRUE);
getChild("plain_text_chat_history")->setValue(gSavedSettings.getBOOL("PlainTextChatHistory"));
// Show/hide Client Tag panel
bool in_opensim = false;
#ifdef OPENSIM
in_opensim = LLGridManager::getInstance()->isInOpenSim();
#endif // OPENSIM
getChild("client_tags_panel")->setVisible(in_opensim);
//
// Group mutes backup
LLScrollListItem* groupmute_item = getChild("restore_per_account_files_list")->getItem(LLSD("groupmutes"));
groupmute_item->setEnabled(in_opensim);
groupmute_item->getColumn(0)->setEnabled(in_opensim);
//
// Call onOpen on all panels for additional initialization on open
// Call onOpen() on all panels that derive from LLPanelPreference
LLTabContainer* tabcontainer = getChild("pref core");
for (child_list_t::const_iterator iter = tabcontainer->getChildList()->begin();
iter != tabcontainer->getChildList()->end(); ++iter)
{
LLView* view = *iter;
LLPanelPreference* panel = dynamic_cast(view);
if (panel)
panel->onOpen(key);
}
//
// Make sure the current state of prefs are saved away when
// when the floater is opened. That will make cancel do its
// job
saveSettings();
// Make sure there is a default preference file
LLPresetsManager::getInstance()->createMissingDefault(PRESETS_CAMERA);
LLPresetsManager::getInstance()->createMissingDefault(PRESETS_GRAPHIC);
// Fix resetting graphics preset on cancel
saveGraphicsPreset(gSavedSettings.getString("PresetGraphicActive"));
// FIRE-19810: Make presets global since PresetGraphicActive setting is global as well
//bool started = (LLStartUp::getStartupState() == STATE_STARTED);
//LLButton* load_btn = findChild("PrefLoadButton");
//LLButton* save_btn = findChild("PrefSaveButton");
//LLButton* delete_btn = findChild("PrefDeleteButton");
//LLButton* exceptions_btn = findChild("RenderExceptionsButton");
//if (load_btn && save_btn && delete_btn && exceptions_btn)
//{
// load_btn->setEnabled(started);
// save_btn->setEnabled(started);
// delete_btn->setEnabled(started);
// exceptions_btn->setEnabled(started);
//}
//
collectSearchableItems();
if (!mFilterEdit->getText().empty())
{
mFilterEdit->setText(LLStringExplicit(""));
onUpdateFilterTerm(true);
// Hook up and init for filtering
if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
tabcontainer->selectFirstTab();
//
}
}
void LLFloaterPreference::onRenderOptionEnable()
{
refreshEnabledGraphics();
}
void LLFloaterPreferenceGraphicsAdvanced::onRenderOptionEnable()
{
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance("preferences");
if (instance)
{
instance->refresh();
}
refreshEnabledGraphics();
}
void LLFloaterPreferenceGraphicsAdvanced::onAdvancedAtmosphericsEnable()
{
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance("preferences");
if (instance)
{
instance->refresh();
}
refreshEnabledGraphics();
}
void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledGraphics()
{
refreshEnabledState();
}
void LLFloaterPreference::onAvatarImpostorsEnable()
{
refreshEnabledGraphics();
}
// toggle lighting detail availability in response to local light rendering, to avoid confusion
void LLFloaterPreference::onLocalLightsEnable()
{
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance("preferences");
if (instance)
{
getChildView("LocalLightsDetail")->setEnabled(gSavedSettings.getBOOL("RenderLocalLights"));
}
}
//
//static
void LLFloaterPreference::initDoNotDisturbResponse()
{
if (!gSavedPerAccountSettings.getBOOL("DoNotDisturbResponseChanged"))
{
//LLTrans::getString("DoNotDisturbModeResponseDefault") is used here for localization (EXT-5885)
gSavedPerAccountSettings.setString("DoNotDisturbModeResponse", LLTrans::getString("DoNotDisturbModeResponseDefault"));
}
// FIRE-5436: Unlocalizable auto-response messages
if (!gSavedPerAccountSettings.getBOOL("FSAutoResponseChanged"))
{
gSavedPerAccountSettings.setString("FSAutorespondModeResponse", LLTrans::getString("AutoResponseModeDefault"));
}
if (!gSavedPerAccountSettings.getBOOL("FSAutoResponseNonFriendsChanged"))
{
gSavedPerAccountSettings.setString("FSAutorespondNonFriendsResponse", LLTrans::getString("AutoResponseModeNonFriendsDefault"));
}
if (!gSavedPerAccountSettings.getBOOL("FSRejectTeleportOffersResponseChanged"))
{
gSavedPerAccountSettings.setString("FSRejectTeleportOffersResponse", LLTrans::getString("RejectTeleportOffersResponseDefault"));
}
if (!gSavedPerAccountSettings.getBOOL("FSRejectFriendshipRequestsResponseChanged"))
{
gSavedPerAccountSettings.setString("FSRejectFriendshipRequestsResponse", LLTrans::getString("RejectFriendshipRequestsResponseDefault"));
}
if (!gSavedPerAccountSettings.getBOOL("FSMutedAvatarResponseChanged"))
{
gSavedPerAccountSettings.setString("FSMutedAvatarResponse", LLTrans::getString("MutedAvatarsResponseDefault"));
}
if (!gSavedPerAccountSettings.getBOOL("FSAwayAvatarResponseChanged"))
{
gSavedPerAccountSettings.setString("FSAwayAvatarResponse", LLTrans::getString("AwayAvatarResponseDefault"));
}
//
}
//static
void LLFloaterPreference::updateShowFavoritesCheckbox(bool val)
{
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance("preferences");
if (instance)
{
instance->getChild("favorites_on_login_check")->setValue(val);
}
}
void LLFloaterPreference::setHardwareDefaults()
{
// Fix resetting graphics preset on cancel
//std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive");
//if (!preset_graphic_active.empty())
//{
// saveGraphicsPreset(preset_graphic_active);
// saveSettings(); // save here to be able to return to the previous preset by Cancel
//}
//
LLFeatureManager::getInstance()->applyRecommendedSettings();
// reset indirects before refresh because we may have changed what they control
LLAvatarComplexityControls::setIndirectControls();
refreshEnabledGraphics();
gSavedSettings.setString("PresetGraphicActive", "");
LLPresetsManager::getInstance()->triggerChangeSignal();
LLTabContainer* tabcontainer = getChild("pref core");
child_list_t::const_iterator iter = tabcontainer->getChildList()->begin();
child_list_t::const_iterator end = tabcontainer->getChildList()->end();
for ( ; iter != end; ++iter)
{
LLView* view = *iter;
LLPanelPreference* panel = dynamic_cast(view);
if (panel)
{
panel->setHardwareDefaults();
}
}
}
void LLFloaterPreference::getControlNames(std::vector& names)
{
LLView* view = findChild("display");
LLFloater* advanced = LLFloaterReg::findTypedInstance("prefs_graphics_advanced");
// Improved graphics preferences
//if (view && advanced)
if (view)
//
{
std::list stack;
stack.push_back(view);
// Improved graphics preferences
//stack.push_back(advanced);
if (advanced)
{
stack.push_back(advanced);
}
//
while(!stack.empty())
{
// Process view on top of the stack
LLView* curview = stack.front();
stack.pop_front();
LLUICtrl* ctrl = dynamic_cast(curview);
if (ctrl)
{
LLControlVariable* control = ctrl->getControlVariable();
if (control)
{
std::string control_name = control->getName();
if (std::find(names.begin(), names.end(), control_name) == names.end())
{
names.push_back(control_name);
}
}
}
for (child_list_t::const_iterator iter = curview->getChildList()->begin();
iter != curview->getChildList()->end(); ++iter)
{
stack.push_back(*iter);
}
}
}
}
//virtual
void LLFloaterPreference::onClose(bool app_quitting)
{
// Preferences search
//gSavedSettings.setS32("LastPrefTab", getChild("pref core")->getCurrentPanelIndex());
if (mFilterEdit->getText().empty())
{
gSavedSettings.setS32("LastPrefTab", getChild("pref core")->getCurrentPanelIndex());
}
//
// [FS Login Panel]
//LLPanelLogin::setAlwaysRefresh(false);
FSPanelLogin::setAlwaysRefresh(false);
// [FS Login Panel]
if (!app_quitting)
{
cancel();
}
}
// static
void LLFloaterPreference::onBtnOK(const LLSD& userdata)
{
// commit any outstanding text entry
if (hasFocus())
{
LLUICtrl* cur_focus = dynamic_cast(gFocusMgr.getKeyboardFocus());
if (cur_focus && cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
}
}
if (canClose())
{
saveSettings();
apply();
if (userdata.asString() == "closeadvanced")
{
LLFloaterReg::hideInstance("prefs_graphics_advanced");
}
else
{
closeFloater(false);
}
//Conversation transcript and log path changed so reload conversations based on new location
if(mPriorInstantMessageLogPath.length())
{
if(moveTranscriptsAndLog())
{
//When floaters are empty but have a chat history files, reload chat history into them
// [FS communication UI]
//LLFloaterIMSessionTab::reloadEmptyFloaters();
FSFloaterIMContainer::reloadEmptyFloaters();
// [FS communication UI]
}
//Couldn't move files so restore the old path and show a notification
else
{
gSavedPerAccountSettings.setString("InstantMessageLogPath", mPriorInstantMessageLogPath);
LLNotificationsUtil::add("PreferenceChatPathChanged");
}
mPriorInstantMessageLogPath.clear();
}
LLUIColorTable::instance().saveUserSettings();
gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);
// [SL:KB] - Patch: Viewer-CrashReporting | Checked: 2011-10-02 (Catznip-2.8.0e) | Added: Catznip-2.8.0e
// We need to save all crash settings, even if they're defaults [see LLCrashLogger::loadCrashBehaviorSetting()]
gCrashSettings.saveToFile(gSavedSettings.getString("CrashSettingsFile"), FALSE);
// [/SL:KB]
//Only save once logged in and loaded per account settings
if(mGotPersonalInfo)
{
gSavedPerAccountSettings.saveToFile(gSavedSettings.getString("PerAccountSettingsFile"), TRUE);
}
}
else
{
// Show beep, pop up dialog, etc.
LL_INFOS() << "Can't close preferences!" << LL_ENDL;
}
// [FS Login Panel]
//LLPanelLogin::updateLocationSelectorsVisibility();
FSPanelLogin::updateLocationSelectorsVisibility();
// [FS Login Panel]
//Need to reload the navmesh if the pathing console is up
LLHandle pathfindingConsoleHandle = LLFloaterPathfindingConsole::getInstanceHandle();
if ( !pathfindingConsoleHandle.isDead() )
{
LLFloaterPathfindingConsole* pPathfindingConsole = pathfindingConsoleHandle.get();
pPathfindingConsole->onRegionBoundaryCross();
}
}
// static
void LLFloaterPreference::onBtnCancel(const LLSD& userdata)
{
if (hasFocus())
{
LLUICtrl* cur_focus = dynamic_cast(gFocusMgr.getKeyboardFocus());
if (cur_focus && cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
}
refresh();
}
cancel();
if (userdata.asString() == "closeadvanced")
{
LLFloaterReg::hideInstance("prefs_graphics_advanced");
}
else
{
closeFloater();
}
}
// static
// Show email address in preferences (FIRE-1071)
//void LLFloaterPreference::updateUserInfo(const std::string& visibility, bool im_via_email, bool is_verified_email)
void LLFloaterPreference::updateUserInfo(const std::string& visibility, bool im_via_email, bool is_verified_email, const std::string& email)
{
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance("preferences");
if (instance)
{
// Show email address in preferences (FIRE-1071)
//instance->setPersonalInfo(visibility, im_via_email, is_verified_email);
instance->setPersonalInfo(visibility, im_via_email, is_verified_email, email);
}
}
void LLFloaterPreference::refreshEnabledGraphics()
{
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance("preferences");
if (instance)
{
instance->refresh();
}
LLFloater* advanced = LLFloaterReg::findTypedInstance("prefs_graphics_advanced");
if (advanced)
{
advanced->refresh();
}
}
void LLFloaterPreference::onClickClearCache()
{
LLNotificationsUtil::add("ConfirmClearCache", LLSD(), LLSD(), callback_clear_cache);
}
void LLFloaterPreference::onClickBrowserClearCache()
{
LLNotificationsUtil::add("ConfirmClearBrowserCache", LLSD(), LLSD(), callback_clear_browser_cache);
}
// Clear inventory cache button
void LLFloaterPreference::onClickInventoryClearCache()
{
LLNotificationsUtil::add("ConfirmClearInventoryCache", LLSD(), LLSD(), callback_clear_inventory_cache);
}
//
// Clear web browser cache button
void LLFloaterPreference::onClickWebBrowserClearCache()
{
LLNotificationsUtil::add("ConfirmClearWebBrowserCache", LLSD(), LLSD(), callback_clear_web_browser_cache);
}
//
// Called when user changes language via the combobox.
void LLFloaterPreference::onLanguageChange()
{
// Let the user know that the change will only take effect after restart.
// Do it only once so that we're not too irritating.
if (!mLanguageChanged)
{
LLNotificationsUtil::add("ChangeLanguage");
mLanguageChanged = true;
}
}
void LLFloaterPreference::onNotificationsChange(const std::string& OptionName)
{
mNotificationOptions[OptionName] = getChild(OptionName)->getSelectedItemLabel();
bool show_notifications_alert = true;
for (notifications_map::iterator it_notification = mNotificationOptions.begin(); it_notification != mNotificationOptions.end(); it_notification++)
{
if(it_notification->second != "No action")
{
show_notifications_alert = false;
break;
}
}
getChild("notifications_alert")->setVisible(show_notifications_alert);
}
void LLFloaterPreference::onNameTagOpacityChange(const LLSD& newvalue)
{
LLColorSwatchCtrl* color_swatch = findChild("background");
if (color_swatch)
{
LLColor4 new_color = color_swatch->get();
color_swatch->set( new_color.setAlpha(newvalue.asReal()) );
}
}
// FIRE-1332 - Sepeate opacity settings for nametag and console chat
void LLFloaterPreference::onConsoleOpacityChange(const LLSD& newvalue)
{
LLColorSwatchCtrl* color_swatch = findChild("console_background");
if (color_swatch)
{
LLColor4 new_color = color_swatch->get();
color_swatch->set( new_color.setAlpha(newvalue.asReal()) );
}
}
//
void LLFloaterPreference::onClickSetCache()
{
std::string cur_name(gSavedSettings.getString("CacheLocation"));
// std::string cur_top_folder(gDirUtilp->getBaseFileName(cur_name));
std::string proposed_name(cur_name);
(new LLDirPickerThread(boost::bind(&LLFloaterPreference::changeCachePath, this, _1, _2), proposed_name))->getFile();
}
void LLFloaterPreference::changeCachePath(const std::vector& filenames, std::string proposed_name)
{
std::string dir_name = filenames[0];
if (!dir_name.empty() && dir_name != proposed_name)
{
std::string new_top_folder(gDirUtilp->getBaseFileName(dir_name));
LLNotificationsUtil::add("CacheWillBeMoved");
gSavedSettings.setString("NewCacheLocation", dir_name);
gSavedSettings.setString("NewCacheLocationTopFolder", new_top_folder);
}
else
{
std::string cache_location = gDirUtilp->getCacheDir();
gSavedSettings.setString("CacheLocation", cache_location);
std::string top_folder(gDirUtilp->getBaseFileName(cache_location));
gSavedSettings.setString("CacheLocationTopFolder", top_folder);
}
}
void LLFloaterPreference::onClickBrowseCache()
{
gViewerWindow->getWindow()->openFile(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""));
}
void LLFloaterPreference::onClickBrowseCrashLogs()
{
gViewerWindow->getWindow()->openFile(gDirUtilp->getExpandedFilename(LL_PATH_LOGS,""));
}
void LLFloaterPreference::onClickBrowseSettingsDir()
{
gViewerWindow->getWindow()->openFile(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,""));
}
void LLFloaterPreference::onClickBrowseChatLogDir()
{
gViewerWindow->getWindow()->openFile(gDirUtilp->getExpandedFilename(LL_PATH_CHAT_LOGS,""));
}
void LLFloaterPreference::onClickResetCache()
{
if (gDirUtilp->getCacheDir(false) == gDirUtilp->getCacheDir(true))
{
// The cache location was already the default.
return;
}
gSavedSettings.setString("NewCacheLocation", "");
gSavedSettings.setString("NewCacheLocationTopFolder", "");
LLNotificationsUtil::add("CacheWillBeMoved");
std::string cache_location = gDirUtilp->getCacheDir(false);
gSavedSettings.setString("CacheLocation", cache_location);
std::string top_folder(gDirUtilp->getBaseFileName(cache_location));
gSavedSettings.setString("CacheLocationTopFolder", top_folder);
}
// Sound cache
void LLFloaterPreference::onClickSetSoundCache()
{
std::string cur_name(gSavedSettings.getString("FSSoundCacheLocation"));
std::string proposed_name(cur_name);
(new LLDirPickerThread(boost::bind(&LLFloaterPreference::changeSoundCachePath, this, _1, _2), proposed_name))->getFile();
}
void LLFloaterPreference::changeSoundCachePath(const std::vector& filenames, std::string proposed_name)
{
std::string dir_name = filenames[0];
if (!dir_name.empty() && dir_name != proposed_name)
{
gSavedSettings.setString("FSSoundCacheLocation", dir_name);
setSoundCacheLocation(dir_name);
LLNotificationsUtil::add("SoundCacheWillBeMoved");
}
}
void LLFloaterPreference::onClickBrowseSoundCache()
{
gViewerWindow->getWindow()->openFile(gDirUtilp->getExpandedFilename(LL_PATH_FS_SOUND_CACHE, ""));
}
void LLFloaterPreference::onClickResetSoundCache()
{
gSavedSettings.setString("FSSoundCacheLocation", std::string());
setSoundCacheLocation(std::string());
LLNotificationsUtil::add("SoundCacheWillBeMoved");
}
//
// FIRE-2912: Reset voice button
class FSResetVoiceTimer : public LLEventTimer
{
public:
FSResetVoiceTimer() : LLEventTimer(5.f) { }
~FSResetVoiceTimer() { }
BOOL tick()
{
gSavedSettings.setBOOL("EnableVoiceChat", TRUE);
LLFloaterPreference* floater = LLFloaterReg::findTypedInstance("preferences");
if (floater)
{
floater->childSetEnabled("enable_voice_check", true);
floater->childSetEnabled("enable_voice_check_volume", true);
}
return TRUE;
}
};
void LLFloaterPreference::onClickResetVoice()
{
if (gSavedSettings.getBOOL("EnableVoiceChat") && !gSavedSettings.getBOOL("CmdLineDisableVoice"))
{
gSavedSettings.setBOOL("EnableVoiceChat", FALSE);
childSetEnabled("enable_voice_check", false);
childSetEnabled("enable_voice_check_volume", false);
new FSResetVoiceTimer();
}
}
//
// Performs a wipe of the local settings dir on next restart
bool callback_clear_settings(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if ( option == 0 ) // YES
{
// Create a filesystem marker instructing a full settings wipe
std::string clear_file_name;
clear_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"CLEAR");
LL_INFOS() << "Creating clear settings marker file " << clear_file_name << LL_ENDL;
LLAPRFile clear_file ;
clear_file.open(clear_file_name, LL_APR_W);
if (clear_file.getFileHandle())
{
LL_INFOS("MarkerFile") << "Created clear settings marker file " << clear_file_name << LL_ENDL;
clear_file.close();
LLNotificationsUtil::add("SettingsWillClear");
}
else
{
LL_WARNS("MarkerFile") << "Cannot clear settings marker file " << clear_file_name << LL_ENDL;
}
return true;
}
return false;
}
//[ADD - Clear Usersettings : SJ] - When button Reset Defaults is clicked show a warning
void LLFloaterPreference::onClickClearSettings()
{
LLNotificationsUtil::add("FirestormClearSettingsPrompt",LLSD(), LLSD(), callback_clear_settings);
}
void LLFloaterPreference::onClickChatOnlineNotices()
{
getChildView("OnlineOfflinetoNearbyChatHistory")->setEnabled(getChild("OnlineOfflinetoNearbyChat")->getValue().asBoolean());
}
void LLFloaterPreference::onClickClearSpamList()
{
NACLAntiSpamRegistry::instance().purgeAllQueues();
}
void LLFloaterPreference::setPreprocInclude()
{
std::string cur_name(gSavedSettings.getString("_NACL_PreProcHDDIncludeLocation"));
std::string proposed_name(cur_name);
(new LLDirPickerThread(boost::bind(&LLFloaterPreference::changePreprocIncludePath, this, _1, _2), proposed_name))->getFile();
}
void LLFloaterPreference::changePreprocIncludePath(const std::vector& filenames, std::string proposed_name)
{
std::string dir_name = filenames[0];
if (!dir_name.empty() && dir_name != proposed_name)
{
std::string new_top_folder(gDirUtilp->getBaseFileName(dir_name));
gSavedSettings.setString("_NACL_PreProcHDDIncludeLocation", dir_name);
}
}
// FIRE-23606 Reveal path to external script editor in prefernces
void LLFloaterPreference::setExternalEditor()
{
std::string cur_name(gSavedSettings.getString("ExternalEditor"));
std::string proposed_name(cur_name);
(new LLFilePickerReplyThread(boost::bind(&LLFloaterPreference::changeExternalEditorPath, this, _1), LLFilePicker::FFLOAD_EXE, false))->getFile();
}
void LLFloaterPreference::changeExternalEditorPath(const std::vector& filenames)
{
const std::string chosen_path = filenames[0];
std::string executable_path = chosen_path;
#if LL_DARWIN
// on Mac, if it's an application bundle, figure out the actual path from the Info.plist file
CFStringRef path_cfstr = CFStringCreateWithCString(kCFAllocatorDefault, chosen_path.c_str(), kCFStringEncodingMacRoman); // get path as a CFStringRef
CFURLRef path_url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, path_cfstr, kCFURLPOSIXPathStyle, TRUE); // turn it into a CFURLRef
CFBundleRef chosen_bundle = CFBundleCreate(kCFAllocatorDefault, path_url); // get a handle for the bundle
CFRelease(path_url); // [FS:CR] Don't leave a mess clean up our objects after we use them
LLSD args;
if (NULL != chosen_bundle)
{
CFDictionaryRef bundleInfoDict = CFBundleGetInfoDictionary(chosen_bundle); // get the bundle's dictionary
CFRelease(chosen_bundle); // [FS:CR] Don't leave a mess clean up our objects after we use them
if (NULL != bundleInfoDict)
{
CFStringRef executable_cfstr = (CFStringRef)CFDictionaryGetValue(bundleInfoDict, CFSTR("CFBundleExecutable")); // get the name of the actual executable (e.g. TextEdit or firefox-bin)
int max_file_length = 256; // (max file name length is 255 in OSX)
char executable_buf[max_file_length];
if (CFStringGetCString(executable_cfstr, executable_buf, max_file_length, kCFStringEncodingMacRoman)) // convert CFStringRef to char*
{
executable_path += std::string("/Contents/MacOS/") + std::string(executable_buf); // append path to executable directory and then executable name to exec path
}
else
{
std::string warning = "Unable to get CString from CFString for executable path";
LL_WARNS() << warning << LL_ENDL;
args["MESSAGE"] = warning;
LLNotificationsUtil::add("GenericAlert", args);
}
}
else
{
std::string warning = "Unable to get bundle info dictionary from application bundle";
LL_WARNS() << warning << LL_ENDL;
args["MESSAGE"] = warning;
LLNotificationsUtil::add("GenericAlert", args);
}
}
else
{
if (-1 != executable_path.find(".app")) // only warn if this path actually had ".app" in it, i.e. it probably just wasn'nt an app bundle and that's okay
{
std::string warning = std::string("Unable to get bundle from path \"") + chosen_path + std::string("\"");
LL_WARNS() << warning << LL_ENDL;
args["MESSAGE"] = warning;
LLNotificationsUtil::add("GenericAlert", args);
}
}
#endif
{
std::string bin = executable_path;
if (!bin.empty())
{
// surround command with double quotes for the case if the path contains spaces
if (bin.find("\"") == std::string::npos)
{
bin = "\"" + bin + "\"";
}
executable_path = bin;
}
}
gSavedSettings.setString("ExternalEditor", executable_path);
}
//
//[FIX JIRA-1971 : SJ] Show an notify when Javascript setting change
void LLFloaterPreference::onClickJavascript()
{
if (!gSavedSettings.getBOOL("BrowserJavascriptEnabled"))
{
LLNotificationsUtil::add("DisableJavascriptBreaksSearch");
}
}
/*
void LLFloaterPreference::onClickSkin(LLUICtrl* ctrl, const LLSD& userdata)
{
gSavedSettings.setString("SkinCurrent", userdata.asString());
ctrl->setValue(userdata.asString());
}
void LLFloaterPreference::onSelectSkin()
{
std::string skin_selection = getChild("skin_selection")->getValue().asString();
gSavedSettings.setString("SkinCurrent", skin_selection);
}
void LLFloaterPreference::refreshSkin(void* data)
{
LLPanel*self = (LLPanel*)data;
sSkin = gSavedSettings.getString("SkinCurrent");
self->getChild("skin_selection", true)->setValue(sSkin);
}
*/
void LLFloaterPreference::buildPopupLists()
{
LLScrollListCtrl& disabled_popups =
getChildRef("disabled_popups");
LLScrollListCtrl& enabled_popups =
getChildRef("enabled_popups");
disabled_popups.deleteAllItems();
enabled_popups.deleteAllItems();
for (LLNotifications::TemplateMap::const_iterator iter = LLNotifications::instance().templatesBegin();
iter != LLNotifications::instance().templatesEnd();
++iter)
{
LLNotificationTemplatePtr templatep = iter->second;
LLNotificationFormPtr formp = templatep->mForm;
LLNotificationForm::EIgnoreType ignore = formp->getIgnoreType();
if (ignore <= LLNotificationForm::IGNORE_NO)
continue;
LLSD row;
row["columns"][0]["value"] = formp->getIgnoreMessage();
row["columns"][0]["font"] = "SANSSERIF_SMALL";
row["columns"][0]["width"] = 400;
LLScrollListItem* item = NULL;
bool show_popup = !formp->getIgnored();
if (!show_popup)
{
// Don't show chosen option for ignored dialogs in the list. There is only one
// notification that makes use of it ("ReplaceAttachment") and it would make the
// list appear truncated.
#if 0
if (ignore == LLNotificationForm::IGNORE_WITH_LAST_RESPONSE)
{
// Default responses are declared in "ignores" settings group, see llnotifications.cpp
//LLSD last_response = LLUI::getInstance()->mSettingGroups["config"]->getLLSD("Default" + templatep->mName);
LLSD last_response = LLUI::getInstance()->mSettingGroups["ignores"]->getLLSD("Default" + templatep->mName);
//
if (!last_response.isUndefined())
{
for (LLSD::map_const_iterator it = last_response.beginMap();
it != last_response.endMap();
++it)
{
if (it->second.asBoolean())
{
row["columns"][1]["value"] = formp->getElement(it->first)["ignore"].asString();
break;
}
}
}
row["columns"][1]["font"] = "SANSSERIF_SMALL";
row["columns"][1]["width"] = 360;
}
#endif
item = disabled_popups.addElement(row);
}
else
{
item = enabled_popups.addElement(row);
}
if (item)
{
item->setUserdata((void*)&iter->first);
}
}
// Let's sort it so we can find stuff!
enabled_popups.sortByColumnIndex(0, TRUE);
disabled_popups.sortByColumnIndex(0, TRUE);
//
}
void LLFloaterPreference::refreshEnabledState()
{
// Improved graphics preferences
//LLCheckBoxCtrl* ctrl_wind_light = getChild("WindLightUseAtmosShaders");
//LLCheckBoxCtrl* ctrl_deferred = getChild("UseLightShaders");
//// if vertex shaders off, disable all shader related products
//if (!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders"))
//{
// ctrl_wind_light->setEnabled(FALSE);
// ctrl_wind_light->setValue(FALSE);
//}
//else
//{
// ctrl_wind_light->setEnabled(TRUE);
//}
////Deferred/SSAO/Shadows
//BOOL bumpshiny = gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps && LLFeatureManager::getInstance()->isFeatureAvailable("RenderObjectBump") && gSavedSettings.getBOOL("RenderObjectBump");
//BOOL shaders = gSavedSettings.getBOOL("WindLightUseAtmosShaders");
//BOOL enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
// bumpshiny &&
// shaders &&
// gGLManager.mHasFramebufferObject &&
// gSavedSettings.getBOOL("RenderAvatarVP") &&
// (ctrl_wind_light->get()) ? TRUE : FALSE;
//ctrl_deferred->setEnabled(enabled);
F32 mem_multiplier = gSavedSettings.getF32("RenderTextureMemoryMultiple");
S32Megabytes min_tex_mem = LLViewerTextureList::getMinVideoRamSetting();
S32Megabytes max_tex_mem = LLViewerTextureList::getMaxVideoRamSetting(false, mem_multiplier);
getChild("GraphicsCardTextureMemory")->setMinValue(min_tex_mem.value());
getChild("GraphicsCardTextureMemory")->setMaxValue(max_tex_mem.value());
#if ADDRESS_SIZE == 32
childSetEnabled("FSRestrictMaxTextureSize", false);
#endif
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderVBOEnable") ||
!gGLManager.mHasVertexBufferObject)
{
getChildView("vbo")->setEnabled(FALSE);
getChildView("vbo_stream")->setEnabled(FALSE);
}
else
#if LL_DARWIN
getChildView("vbo_stream")->setEnabled(FALSE); //Hardcoded disable on mac
getChild("vbo_stream")->setValue((LLSD::Boolean) FALSE);
#else
getChildView("vbo_stream")->setEnabled(LLVertexBuffer::sEnableVBOs);
#endif
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderCompressTextures") ||
!gGLManager.mHasVertexBufferObject)
{
getChildView("texture compression")->setEnabled(FALSE);
}
// if no windlight shaders, turn off nighttime brightness, gamma, and fog distance
LLSpinCtrl* gamma_ctrl = getChild("gamma");
gamma_ctrl->setEnabled(!gPipeline.canUseWindLightShaders());
getChildView("fog")->setEnabled(!gPipeline.canUseWindLightShaders());
// anti-aliasing
{
LLUICtrl* fsaa_ctrl = getChild("fsaa");
// Enable or disable the control, the "Antialiasing:" label and the restart warning
// based on code support for the feature on the current hardware.
if (gPipeline.canUseAntiAliasing())
{
fsaa_ctrl->setEnabled(TRUE);
}
else
{
fsaa_ctrl->setEnabled(FALSE);
fsaa_ctrl->setValue((LLSD::Integer) 0);
}
}
LLComboBox* ctrl_reflections = getChild("Reflections");
// [RLVa:KB] - Checked: 2013-05-11 (RLVa-1.4.9)
if (RlvActions::isRlvEnabled())
{
getChild("do_not_disturb_response")->setEnabled(!RlvActions::hasBehaviour(RLV_BHVR_SENDIM));
}
// [/RLVa:KB]
// Reflections
BOOL reflections = gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps;
ctrl_reflections->setEnabled(reflections);
// Bump & Shiny
LLCheckBoxCtrl* bumpshiny_ctrl = getChild("BumpShiny");
bool bumpshiny = gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps && LLFeatureManager::getInstance()->isFeatureAvailable("RenderObjectBump");
bumpshiny_ctrl->setEnabled(bumpshiny ? TRUE : FALSE);
// Does not exist
//LLCheckBoxCtrl* ctrl_enhanced_skel = getChild("AvatarEnhancedSkeleton");
//bool enhanced_skel_enabled = gSavedSettings.getBOOL("IncludeEnhancedSkeleton");
//ctrl_enhanced_skel->setValue(enhanced_skel_enabled);
//
// Avatar Mode
// Enable Avatar Shaders
LLCheckBoxCtrl* ctrl_avatar_vp = getChild("AvatarVertexProgram");
// Avatar Render Mode
LLCheckBoxCtrl* ctrl_avatar_cloth = getChild("AvatarCloth");
bool avatar_vp_enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP");
if (LLViewerShaderMgr::sInitialized)
{
S32 max_avatar_shader = LLViewerShaderMgr::instance()->mMaxAvatarShaderLevel;
avatar_vp_enabled = (max_avatar_shader > 0) ? TRUE : FALSE;
}
ctrl_avatar_vp->setEnabled(avatar_vp_enabled);
if (gSavedSettings.getBOOL("RenderAvatarVP") == FALSE)
{
ctrl_avatar_cloth->setEnabled(false);
}
else
{
ctrl_avatar_cloth->setEnabled(true);
}
// Vertex Shaders, Global Shader Enable
LLRadioGroup* terrain_detail = getChild("TerrainDetailRadio"); // can be linked with control var
terrain_detail->setEnabled(FALSE);
// WindLight
LLCheckBoxCtrl* ctrl_wind_light = getChild("WindLightUseAtmosShaders");
LLSliderCtrl* sky = getChild("SkyMeshDetail");
// [RLVa:KB] - Checked: 2010-03-18 (RLVa-1.2.0a) | Modified: RLVa-0.2.0a
// "Atmospheric Shaders" can't be disabled - but can be enabled - under @setenv=n
ctrl_wind_light->setEnabled( (RlvActions::canChangeEnvironment()) || (!gSavedSettings.getBOOL("WindLightUseAtmosShaders")));
// [/RLVa:KB]
// ctrl_wind_light->setEnabled(TRUE);
sky->setEnabled(TRUE);
//Deferred/SSAO/Shadows
LLCheckBoxCtrl* ctrl_deferred = getChild("UseLightShaders");
BOOL enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
((bumpshiny_ctrl && bumpshiny_ctrl->get()) ? TRUE : FALSE) &&
gGLManager.mHasFramebufferObject &&
gSavedSettings.getBOOL("RenderAvatarVP") &&
(ctrl_wind_light->get()) ? TRUE : FALSE;
ctrl_deferred->setEnabled(enabled);
LLCheckBoxCtrl* ctrl_ssao = getChild("UseSSAO");
LLCheckBoxCtrl* ctrl_dof = getChild("UseDoF");
LLComboBox* ctrl_shadow = getChild("ShadowDetail");
// note, okay here to get from ctrl_deferred as it's twin, ctrl_deferred2 will alway match it
enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO") && (ctrl_deferred->get() ? TRUE : FALSE);
ctrl_deferred->set(gSavedSettings.getBOOL("RenderDeferred"));
ctrl_ssao->setEnabled(enabled);
ctrl_dof->setEnabled(enabled);
enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail");
ctrl_shadow->setEnabled(enabled);
// now turn off any features that are unavailable
disableUnavailableSettings();
// Cannot have floater active until caps have been received
//getChild("default_creation_permissions")->setEnabled(LLStartUp::getStartupState() < STATE_STARTED ? false : true);
getChild("fs_default_creation_permissions")->setEnabled(LLStartUp::getStartupState() < STATE_STARTED ? false : true);
getChildView("block_list")->setEnabled(LLLoginInstance::getInstance()->authSuccess());
}
void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState()
{
LLComboBox* ctrl_reflections = getChild("Reflections");
LLTextBox* reflections_text = getChild("ReflectionsText");
// Reflections
BOOL reflections = gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps;
ctrl_reflections->setEnabled(reflections);
reflections_text->setEnabled(reflections);
// Bump & Shiny
LLCheckBoxCtrl* bumpshiny_ctrl = getChild("BumpShiny");
bool bumpshiny = gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps && LLFeatureManager::getInstance()->isFeatureAvailable("RenderObjectBump");
bumpshiny_ctrl->setEnabled(bumpshiny ? TRUE : FALSE);
// Avatar Mode
// Enable Avatar Shaders
LLCheckBoxCtrl* ctrl_avatar_vp = getChild("AvatarVertexProgram");
// Avatar Render Mode
LLCheckBoxCtrl* ctrl_avatar_cloth = getChild("AvatarCloth");
bool avatar_vp_enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP");
if (LLViewerShaderMgr::sInitialized)
{
S32 max_avatar_shader = LLViewerShaderMgr::instance()->mMaxAvatarShaderLevel;
avatar_vp_enabled = (max_avatar_shader > 0) ? TRUE : FALSE;
}
ctrl_avatar_vp->setEnabled(avatar_vp_enabled);
if (gSavedSettings.getBOOL("RenderAvatarVP") == FALSE)
{
ctrl_avatar_cloth->setEnabled(FALSE);
}
else
{
ctrl_avatar_cloth->setEnabled(TRUE);
}
// Vertex Shaders, Global Shader Enable
// SL-12594 Basic shaders are always enabled. DJH TODO clean up now-orphaned state handling code
LLSliderCtrl* terrain_detail = getChild("TerrainDetail"); // can be linked with control var
LLTextBox* terrain_text = getChild("TerrainDetailText");
terrain_detail->setEnabled(FALSE);
terrain_text->setEnabled(FALSE);
// WindLight
LLCheckBoxCtrl* ctrl_wind_light = getChild("WindLightUseAtmosShaders");
LLSliderCtrl* sky = getChild("SkyMeshDetail");
LLTextBox* sky_text = getChild("SkyMeshDetailText");
// [RLVa:KB] - Checked: 2010-03-18 (RLVa-1.2.0a) | Modified: RLVa-0.2.0a
// "Atmospheric Shaders" can't be disabled - but can be enabled - under @setenv=n
ctrl_wind_light->setEnabled( (RlvActions::canChangeEnvironment()) || (!gSavedSettings.getBOOL("WindLightUseAtmosShaders")));
// [/RLVa:KB]
// ctrl_wind_light->setEnabled(TRUE);
sky->setEnabled(TRUE);
sky_text->setEnabled(TRUE);
//Deferred/SSAO/Shadows
LLCheckBoxCtrl* ctrl_deferred = getChild("UseLightShaders");
BOOL enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
((bumpshiny_ctrl && bumpshiny_ctrl->get()) ? TRUE : FALSE) &&
gGLManager.mHasFramebufferObject &&
gSavedSettings.getBOOL("RenderAvatarVP") &&
(ctrl_wind_light->get()) ? TRUE : FALSE;
ctrl_deferred->setEnabled(enabled);
LLCheckBoxCtrl* ctrl_ssao = getChild("UseSSAO");
LLCheckBoxCtrl* ctrl_dof = getChild("UseDoF");
LLComboBox* ctrl_shadow = getChild("ShadowDetail");
LLTextBox* shadow_text = getChild("RenderShadowDetailText");
// note, okay here to get from ctrl_deferred as it's twin, ctrl_deferred2 will alway match it
enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO") && (ctrl_deferred->get() ? TRUE : FALSE);
ctrl_deferred->set(gSavedSettings.getBOOL("RenderDeferred"));
ctrl_ssao->setEnabled(enabled);
ctrl_dof->setEnabled(enabled);
enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail");
ctrl_shadow->setEnabled(enabled);
shadow_text->setEnabled(enabled);
// Hardware settings
F32 mem_multiplier = gSavedSettings.getF32("RenderTextureMemoryMultiple");
S32Megabytes min_tex_mem = LLViewerTextureList::getMinVideoRamSetting();
S32Megabytes max_tex_mem = LLViewerTextureList::getMaxVideoRamSetting(false, mem_multiplier);
getChild("GraphicsCardTextureMemory")->setMinValue(min_tex_mem.value());
getChild("GraphicsCardTextureMemory")->setMaxValue(max_tex_mem.value());
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderVBOEnable") ||
!gGLManager.mHasVertexBufferObject)
{
getChildView("vbo")->setEnabled(FALSE);
}
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderCompressTextures") ||
!gGLManager.mHasVertexBufferObject)
{
getChildView("texture compression")->setEnabled(FALSE);
}
// if no windlight shaders, turn off nighttime brightness, gamma, and fog distance
LLUICtrl* gamma_ctrl = getChild("gamma");
gamma_ctrl->setEnabled(!gPipeline.canUseWindLightShaders());
getChildView("(brightness, lower is brighter)")->setEnabled(!gPipeline.canUseWindLightShaders());
getChildView("fog")->setEnabled(!gPipeline.canUseWindLightShaders());
getChildView("antialiasing restart")->setVisible(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred"));
// now turn off any features that are unavailable
disableUnavailableSettings();
}
// static
void LLAvatarComplexityControls::setIndirectControls()
{
/*
* We have controls that have an indirect relationship between the control
* values and adjacent text and the underlying setting they influence.
* In each case, the control and its associated setting are named Indirect
* This method interrogates the controlled setting and establishes the
* appropriate value for the indirect control. It must be called whenever the
* underlying setting may have changed other than through the indirect control,
* such as when the 'Reset all to recommended settings' button is used...
*/
setIndirectMaxNonImpostors();
setIndirectMaxArc();
}
// static
void LLAvatarComplexityControls::setIndirectMaxNonImpostors()
{
U32 max_non_impostors = gSavedSettings.getU32("RenderAvatarMaxNonImpostors");
// for this one, we just need to make zero, which means off, the max value of the slider
U32 indirect_max_non_impostors = (0 == max_non_impostors) ? LLVOAvatar::IMPOSTORS_OFF : max_non_impostors;
gSavedSettings.setU32("IndirectMaxNonImpostors", indirect_max_non_impostors);
}
void LLAvatarComplexityControls::setIndirectMaxArc()
{
U32 max_arc = gSavedSettings.getU32("RenderAvatarMaxComplexity");
U32 indirect_max_arc;
if (0 == max_arc)
{
// the off position is all the way to the right, so set to control max
indirect_max_arc = INDIRECT_MAX_ARC_OFF;
}
else
{
// This is the inverse of the calculation in updateMaxComplexity
indirect_max_arc = (U32)ll_round(((log(F32(max_arc)) - MIN_ARC_LOG) / ARC_LIMIT_MAP_SCALE)) + MIN_INDIRECT_ARC_LIMIT;
}
gSavedSettings.setU32("IndirectMaxComplexity", indirect_max_arc);
}
void LLFloaterPreference::disableUnavailableSettings()
{
LLComboBox* ctrl_reflections = getChild("Reflections");
LLCheckBoxCtrl* ctrl_avatar_vp = getChild("AvatarVertexProgram");
LLCheckBoxCtrl* ctrl_avatar_cloth = getChild("AvatarCloth");
LLCheckBoxCtrl* ctrl_shader_enable = getChild("BasicShaders");
LLCheckBoxCtrl* ctrl_wind_light = getChild("WindLightUseAtmosShaders");
LLCheckBoxCtrl* ctrl_deferred = getChild("UseLightShaders");
LLComboBox* ctrl_shadows = getChild("ShadowDetail");
LLCheckBoxCtrl* ctrl_ssao = getChild("UseSSAO");
LLCheckBoxCtrl* ctrl_dof = getChild("UseDoF");
LLSliderCtrl* sky = getChild("SkyMeshDetail");
// if vertex shaders off, disable all shader related products
if (!LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable"))
{
ctrl_shader_enable->setEnabled(FALSE);
ctrl_shader_enable->setValue(FALSE);
ctrl_wind_light->setEnabled(FALSE);
ctrl_wind_light->setValue(FALSE);
sky->setEnabled(FALSE);
ctrl_reflections->setEnabled(FALSE);
ctrl_reflections->setValue(0);
ctrl_avatar_vp->setEnabled(FALSE);
ctrl_avatar_vp->setValue(FALSE);
ctrl_avatar_cloth->setEnabled(FALSE);
ctrl_avatar_cloth->setValue(FALSE);
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
ctrl_dof->setEnabled(FALSE);
ctrl_dof->setValue(FALSE);
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
}
// disabled windlight
if (!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders"))
{
ctrl_wind_light->setEnabled(FALSE);
ctrl_wind_light->setValue(FALSE);
sky->setEnabled(FALSE);
//deferred needs windlight, disable deferred
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
ctrl_dof->setEnabled(FALSE);
ctrl_dof->setValue(FALSE);
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
}
// disabled deferred
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") ||
!gGLManager.mHasFramebufferObject)
{
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
ctrl_dof->setEnabled(FALSE);
ctrl_dof->setValue(FALSE);
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
}
// disabled deferred SSAO
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO"))
{
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
}
// disabled deferred shadows
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail"))
{
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
}
// disabled reflections
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionDetail"))
{
ctrl_reflections->setEnabled(FALSE);
ctrl_reflections->setValue(FALSE);
}
// disabled av
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP"))
{
ctrl_avatar_vp->setEnabled(FALSE);
ctrl_avatar_vp->setValue(FALSE);
ctrl_avatar_cloth->setEnabled(FALSE);
ctrl_avatar_cloth->setValue(FALSE);
//deferred needs AvatarVP, disable deferred
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
ctrl_dof->setEnabled(FALSE);
ctrl_dof->setValue(FALSE);
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
}
// disabled cloth
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarCloth"))
{
ctrl_avatar_cloth->setEnabled(FALSE);
ctrl_avatar_cloth->setValue(FALSE);
}
}
void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()
{
LLComboBox* ctrl_reflections = getChild("Reflections");
LLTextBox* reflections_text = getChild("ReflectionsText");
LLCheckBoxCtrl* ctrl_avatar_vp = getChild("AvatarVertexProgram");
LLCheckBoxCtrl* ctrl_avatar_cloth = getChild("AvatarCloth");
LLCheckBoxCtrl* ctrl_wind_light = getChild("WindLightUseAtmosShaders");
LLCheckBoxCtrl* ctrl_deferred = getChild("UseLightShaders");
LLComboBox* ctrl_shadows = getChild("ShadowDetail");
LLTextBox* shadows_text = getChild("RenderShadowDetailText");
LLCheckBoxCtrl* ctrl_ssao = getChild("UseSSAO");
LLCheckBoxCtrl* ctrl_dof = getChild("UseDoF");
LLSliderCtrl* sky = getChild("SkyMeshDetail");
LLTextBox* sky_text = getChild("SkyMeshDetailText");
// disabled windlight
if (!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders"))
{
ctrl_wind_light->setEnabled(FALSE);
ctrl_wind_light->setValue(FALSE);
sky->setEnabled(FALSE);
sky_text->setEnabled(FALSE);
//deferred needs windlight, disable deferred
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
shadows_text->setEnabled(FALSE);
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
ctrl_dof->setEnabled(FALSE);
ctrl_dof->setValue(FALSE);
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
}
// disabled deferred
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") ||
!gGLManager.mHasFramebufferObject)
{
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
shadows_text->setEnabled(FALSE);
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
ctrl_dof->setEnabled(FALSE);
ctrl_dof->setValue(FALSE);
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
}
// disabled deferred SSAO
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO"))
{
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
}
// disabled deferred shadows
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail"))
{
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
shadows_text->setEnabled(FALSE);
}
// disabled reflections
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionDetail"))
{
ctrl_reflections->setEnabled(FALSE);
ctrl_reflections->setValue(FALSE);
reflections_text->setEnabled(FALSE);
}
// disabled av
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP"))
{
ctrl_avatar_vp->setEnabled(FALSE);
ctrl_avatar_vp->setValue(FALSE);
ctrl_avatar_cloth->setEnabled(FALSE);
ctrl_avatar_cloth->setValue(FALSE);
//deferred needs AvatarVP, disable deferred
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
shadows_text->setEnabled(FALSE);
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
ctrl_dof->setEnabled(FALSE);
ctrl_dof->setValue(FALSE);
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
}
// disabled cloth
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarCloth"))
{
ctrl_avatar_cloth->setEnabled(FALSE);
ctrl_avatar_cloth->setValue(FALSE);
}
}
void LLFloaterPreference::refresh()
{
LLPanel::refresh();
// Improved graphics preferences
getChild("fsaa")->setValue((LLSD::Integer) gSavedSettings.getU32("RenderFSAASamples"));
updateSliderText(getChild("RenderPostProcess", true), getChild("PostProcessText", true));
LLAvatarComplexityControls::setIndirectControls();
setMaxNonImpostorsText(gSavedSettings.getU32("RenderAvatarMaxNonImpostors"),getChild("IndirectMaxNonImpostorsText", true));
//
LLAvatarComplexityControls::setText(
gSavedSettings.getU32("RenderAvatarMaxComplexity"),
getChild("IndirectMaxComplexityText", true));
refreshEnabledState();
LLFloater* advanced = LLFloaterReg::findTypedInstance("prefs_graphics_advanced");
if (advanced)
{
advanced->refresh();
}
}
void LLFloaterPreferenceGraphicsAdvanced::refresh()
{
getChild("fsaa")->setValue((LLSD::Integer) gSavedSettings.getU32("RenderFSAASamples"));
// sliders and their text boxes
// mPostProcess = gSavedSettings.getS32("RenderGlowResolutionPow");
// slider text boxes
updateSliderText(getChild("ObjectMeshDetail", true), getChild("ObjectMeshDetailText", true));
updateSliderText(getChild("FlexibleMeshDetail", true), getChild("FlexibleMeshDetailText", true));
updateSliderText(getChild("TreeMeshDetail", true), getChild("TreeMeshDetailText", true));
updateSliderText(getChild("AvatarMeshDetail", true), getChild("AvatarMeshDetailText", true));
updateSliderText(getChild("AvatarPhysicsDetail", true), getChild("AvatarPhysicsDetailText", true));
updateSliderText(getChild("TerrainMeshDetail", true), getChild("TerrainMeshDetailText", true));
updateSliderText(getChild("RenderPostProcess", true), getChild("PostProcessText", true));
updateSliderText(getChild("SkyMeshDetail", true), getChild("SkyMeshDetailText", true));
updateSliderText(getChild("TerrainDetail", true), getChild("TerrainDetailText", true));
LLAvatarComplexityControls::setIndirectControls();
setMaxNonImpostorsText(
gSavedSettings.getU32("RenderAvatarMaxNonImpostors"),
getChild("IndirectMaxNonImpostorsText", true));
LLAvatarComplexityControls::setText(
gSavedSettings.getU32("RenderAvatarMaxComplexity"),
getChild("IndirectMaxComplexityText", true));
refreshEnabledState();
}
void LLFloaterPreference::onCommitWindowedMode()
{
refresh();
}
void LLFloaterPreference::onChangeQuality(const LLSD& data)
{
U32 level = (U32)(data.asReal());
LLFeatureManager::getInstance()->setGraphicsLevel(level, true);
refreshEnabledGraphics();
refresh();
}
void LLFloaterPreference::onClickSetKey()
{
LLVoiceSetKeyDialog* dialog = LLFloaterReg::showTypedInstance("voice_set_key", LLSD(), TRUE);
if (dialog)
{
dialog->setParent(this);
}
}
// FIRE-3803: Clear voice toggle button
void LLFloaterPreference::onClickClearKey()
{
gSavedSettings.setString("PushToTalkButton", "");
}
//
void LLFloaterPreference::setKey(KEY key)
{
getChild("modifier_combo")->setValue(LLKeyboard::stringFromKey(key));
// update the control right away since we no longer wait for apply
getChild("modifier_combo")->onCommit();
}
void LLFloaterPreference::setMouse(LLMouseHandler::EClickType click)
{
std::string bt_name;
std::string ctrl_value;
switch (click)
{
case LLMouseHandler::CLICK_MIDDLE:
bt_name = "middle_mouse";
ctrl_value = MIDDLE_MOUSE_CV;
break;
case LLMouseHandler::CLICK_BUTTON4:
bt_name = "button4_mouse";
ctrl_value = MOUSE_BUTTON_4_CV;
break;
case LLMouseHandler::CLICK_BUTTON5:
bt_name = "button5_mouse";
ctrl_value = MOUSE_BUTTON_5_CV;
break;
default:
break;
}
if (!ctrl_value.empty())
{
LLUICtrl* p2t_line_editor = getChild("modifier_combo");
// We are using text control names for readability and compatibility with voice
p2t_line_editor->setControlValue(ctrl_value);
// Fix crash "Failed to find string middle_mouse in panel Media Voice tab loaded from file"
//LLPanel* advanced_preferences = dynamic_cast(p2t_line_editor->getParent());
LLPanel* advanced_preferences = dynamic_cast(p2t_line_editor->getParent()->getParent()->getParent());
//
if (advanced_preferences)
{
p2t_line_editor->setValue(advanced_preferences->getString(bt_name));
}
}
}
void LLFloaterPreference::onClickSetMiddleMouse()
{
LLUICtrl* p2t_line_editor = getChild("modifier_combo");
// update the control right away since we no longer wait for apply
p2t_line_editor->setControlValue(MIDDLE_MOUSE_CV);
//push2talk button "middle mouse" control value is in English, need to localize it for presentation
LLPanel* audioPanel=getChild("audio");
p2t_line_editor->setValue(audioPanel->getString("middle_mouse"));
}
// Handled centrally now
/*
void LLFloaterPreference::onClickSetSounds()
{
// Disable Enable gesture/collisions sounds checkbox if the master sound is disabled
// or if sound effects are disabled.
getChild("gesture_audio_play_btn")->setEnabled(!gSavedSettings.getBOOL("MuteSounds"));
getChild("collisions_audio_play_btn")->setEnabled(!gSavedSettings.getBOOL("MuteSounds"));
}
*/
// FIRE-8190: Preview function for "UI Sounds" Panel
void LLFloaterPreference::onClickPreviewUISound(const LLSD& ui_sound_id)
{
std::string uisndid = ui_sound_id.asString();
make_ui_sound(uisndid.c_str(), true);
}
// FIRE-8190: Preview function for "UI Sounds" Panel
/*
void LLFloaterPreference::onClickSkipDialogs()
{
LLNotificationsUtil::add("SkipShowNextTimeDialogs", LLSD(), LLSD(), boost::bind(&callback_skip_dialogs, _1, _2, this));
}
void LLFloaterPreference::onClickResetDialogs()
{
LLNotificationsUtil::add("ResetShowNextTimeDialogs", LLSD(), LLSD(), boost::bind(&callback_reset_dialogs, _1, _2, this));
}
*/
void LLFloaterPreference::onClickEnablePopup()
{
LLScrollListCtrl& disabled_popups = getChildRef("disabled_popups");
std::vector items = disabled_popups.getAllSelected();
std::vector::iterator itor;
for (itor = items.begin(); itor != items.end(); ++itor)
{
LLNotificationTemplatePtr templatep = LLNotifications::instance().getTemplate(*(std::string*)((*itor)->getUserdata()));
//gSavedSettings.setWarning(templatep->mName, TRUE);
std::string notification_name = templatep->mName;
LLUI::getInstance()->mSettingGroups["ignores"]->setBOOL(notification_name, TRUE);
}
buildPopupLists();
}
void LLFloaterPreference::onClickDisablePopup()
{
LLScrollListCtrl& enabled_popups = getChildRef("enabled_popups");
std::vector items = enabled_popups.getAllSelected();
std::vector::iterator itor;
for (itor = items.begin(); itor != items.end(); ++itor)
{
LLNotificationTemplatePtr templatep = LLNotifications::instance().getTemplate(*(std::string*)((*itor)->getUserdata()));
templatep->mForm->setIgnored(true);
}
buildPopupLists();
}
void LLFloaterPreference::resetAllIgnored()
{
for (LLNotifications::TemplateMap::const_iterator iter = LLNotifications::instance().templatesBegin();
iter != LLNotifications::instance().templatesEnd();
++iter)
{
if (iter->second->mForm->getIgnoreType() > LLNotificationForm::IGNORE_NO)
{
iter->second->mForm->setIgnored(false);
}
}
}
void LLFloaterPreference::setAllIgnored()
{
for (LLNotifications::TemplateMap::const_iterator iter = LLNotifications::instance().templatesBegin();
iter != LLNotifications::instance().templatesEnd();
++iter)
{
if (iter->second->mForm->getIgnoreType() > LLNotificationForm::IGNORE_NO)
{
iter->second->mForm->setIgnored(true);
}
}
}
void LLFloaterPreference::onClickLogPath()
{
std::string proposed_name(gSavedPerAccountSettings.getString("InstantMessageLogPath"));
mPriorInstantMessageLogPath.clear();
(new LLDirPickerThread(boost::bind(&LLFloaterPreference::changeLogPath, this, _1, _2), proposed_name))->getFile();
}
void LLFloaterPreference::changeLogPath(const std::vector& filenames, std::string proposed_name)
{
//Path changed
if (proposed_name != filenames[0])
{
gSavedPerAccountSettings.setString("InstantMessageLogPath", filenames[0]);
mPriorInstantMessageLogPath = proposed_name;
// enable/disable 'Delete transcripts button
updateDeleteTranscriptsButton();
}
//[FIX FIRE-2765 : SJ] Enable Reset button when own Chatlogdirectory is set
getChildView("reset_logpath")->setEnabled(TRUE);
}
//[FIX FIRE-2765 : SJ] Making sure Reset button resets the chatlogdirectory to the default setting
void LLFloaterPreference::onClickResetLogPath()
{
// FIRE-12955: Logs don't get moved when clicking reset log path button
//gDirUtilp->setChatLogsDir(gDirUtilp->getOSUserAppDir());
//gSavedPerAccountSettings.setString("InstantMessageLogPath", gDirUtilp->getChatLogsDir());
mPriorInstantMessageLogPath = gDirUtilp->getChatLogsDir();
gSavedPerAccountSettings.setString("InstantMessageLogPath", gDirUtilp->getOSUserAppDir());
// enable/disable 'Delete transcripts button
updateDeleteTranscriptsButton();
getChildView("reset_logpath")->setEnabled(FALSE);
//
}
bool LLFloaterPreference::moveTranscriptsAndLog()
{
std::string instantMessageLogPath(gSavedPerAccountSettings.getString("InstantMessageLogPath"));
std::string chatLogPath = gDirUtilp->add(instantMessageLogPath, gDirUtilp->getUserName());
bool madeDirectory = false;
//Does the directory really exist, if not then make it
if(!LLFile::isdir(chatLogPath))
{
//mkdir success is defined as zero
if(LLFile::mkdir(chatLogPath) != 0)
{
return false;
}
madeDirectory = true;
}
std::string originalConversationLogDir = LLConversationLog::instance().getFileName();
std::string targetConversationLogDir = gDirUtilp->add(chatLogPath, "conversation.log");
//Try to move the conversation log
if(!LLConversationLog::instance().moveLog(originalConversationLogDir, targetConversationLogDir))
{
//Couldn't move the log and created a new directory so remove the new directory
if(madeDirectory)
{
LLFile::rmdir(chatLogPath);
}
return false;
}
//Attempt to move transcripts
std::vector listOfTranscripts;
std::vector listOfFilesMoved;
LLLogChat::getListOfTranscriptFiles(listOfTranscripts);
if(!LLLogChat::moveTranscripts(gDirUtilp->getChatLogsDir(),
instantMessageLogPath,
listOfTranscripts,
listOfFilesMoved))
{
//Couldn't move all the transcripts so restore those that moved back to their old location
LLLogChat::moveTranscripts(instantMessageLogPath,
gDirUtilp->getChatLogsDir(),
listOfFilesMoved);
//Move the conversation log back
LLConversationLog::instance().moveLog(targetConversationLogDir, originalConversationLogDir);
if(madeDirectory)
{
LLFile::rmdir(chatLogPath);
}
return false;
}
gDirUtilp->setChatLogsDir(instantMessageLogPath);
gDirUtilp->updatePerAccountChatLogsDir();
return true;
}
// Show email address in preferences (FIRE-1071)
//void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im_via_email, bool is_verified_email)
void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im_via_email, bool is_verified_email, const std::string& email)
// Show email address in preferences (FIRE-1071)
{
mGotPersonalInfo = true;
mOriginalIMViaEmail = im_via_email;
mDirectoryVisibility = visibility;
if (visibility == VISIBILITY_DEFAULT)
{
mOriginalHideOnlineStatus = false;
getChildView("online_visibility")->setEnabled(TRUE);
}
else if (visibility == VISIBILITY_HIDDEN)
{
mOriginalHideOnlineStatus = true;
getChildView("online_visibility")->setEnabled(TRUE);
}
else
{
mOriginalHideOnlineStatus = true;
}
getChild("online_searchresults")->setEnabled(TRUE);
getChildView("friends_online_notify_checkbox")->setEnabled(TRUE);
getChild("online_visibility")->setValue(mOriginalHideOnlineStatus);
getChild("online_visibility")->setLabelArg("[DIR_VIS]", mDirectoryVisibility);
getChildView("send_im_to_email")->setEnabled(is_verified_email);
std::string tooltip;
if (!is_verified_email)
tooltip = getString("email_unverified_tooltip");
getChildView("send_im_to_email")->setToolTip(tooltip);
// *TODO: Show or hide verify email text here based on is_verified_email
getChild("send_im_to_email")->setValue(im_via_email);
getChildView("favorites_on_login_check")->setEnabled(TRUE);
//getChildView("log_path_button")->setEnabled(TRUE); // Does not exist as of 12-09-2014
getChildView("chat_font_size")->setEnabled(TRUE);
//getChildView("open_log_path_button")->setEnabled(TRUE); // Does not exist as of 12-09-2014
getChildView("log_path_button-panelsetup")->setEnabled(TRUE);// second set of controls for panel_preferences_setup -WoLf
getChildView("open_log_path_button-panelsetup")->setEnabled(TRUE);
std::string Chatlogsdir = gDirUtilp->getOSUserAppDir();
getChildView("conversation_log_combo")->setEnabled(TRUE); //
getChildView("LogNearbyChat")->setEnabled(TRUE); //
//getChildView("log_nearby_chat")->setEnabled(TRUE); // Does not exist as of 12-09-2014
//[FIX FIRE-2765 : SJ] Set Chatlog Reset Button on enabled when Chatlogpath isn't the default folder
if (gSavedPerAccountSettings.getString("InstantMessageLogPath") != gDirUtilp->getOSUserAppDir())
{
getChildView("reset_logpath")->setEnabled(TRUE);
}
// Show email address in preferences (FIRE-1071)
std::string display_email(email);
if(display_email.size() > 30)
{
display_email.resize(30);
display_email += "...";
}
getChild("send_im_to_email")->setLabelArg("[EMAIL]", display_email);
// Show email address in preferences (FIRE-1071)
// FIRE-420: Show end of last conversation in history
getChildView("LogShowHistory")->setEnabled(TRUE);
// Clear inventory cache button
getChildView("ClearInventoryCache")->setEnabled(TRUE);
// FIRE-18250: Option to disable default eye movement
getChildView("FSStaticEyes")->setEnabled(TRUE);
// FIRE-22564: Route llOwnerSay to scipt debug window
getChildView("FSllOwnerSayToScriptDebugWindow_checkbox")->setEnabled(TRUE);
}
void LLFloaterPreference::refreshUI()
{
refresh();
}
// Improved graphics preferences
void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box)
{
if (text_box == NULL || ctrl== NULL)
return;
// get range and points when text should change
F32 value = (F32)ctrl->getValue().asReal();
F32 min = ctrl->getMinValue();
F32 max = ctrl->getMaxValue();
F32 range = max - min;
llassert(range > 0);
F32 midPoint = min + range / 3.0f;
F32 highPoint = min + (2.0f * range / 3.0f);
// choose the right text
if (value < midPoint)
{
text_box->setText(LLTrans::getString("GraphicsQualityLow"));
}
else if (value < highPoint)
{
text_box->setText(LLTrans::getString("GraphicsQualityMid"));
}
else
{
text_box->setText(LLTrans::getString("GraphicsQualityHigh"));
}
}
void LLFloaterPreference::updateMaxNonImpostors()
{
// Called when the IndirectMaxNonImpostors control changes
// Responsible for fixing the slider label (IndirectMaxNonImpostorsText) and setting RenderAvatarMaxNonImpostors
LLSliderCtrl* ctrl = getChild("IndirectMaxNonImpostors",true);
U32 value = ctrl->getValue().asInteger();
if (0 == value || LLVOAvatar::IMPOSTORS_OFF <= value)
{
value=0;
}
gSavedSettings.setU32("RenderAvatarMaxNonImpostors", value);
LLVOAvatar::updateImpostorRendering(value); // make it effective immediately
setMaxNonImpostorsText(value, getChild("IndirectMaxNonImpostorsText"));
}
void LLFloaterPreference::setMaxNonImpostorsText(U32 value, LLTextBox* text_box)
{
if (0 == value)
{
text_box->setText(LLTrans::getString("no_limit"));
}
else
{
text_box->setText(llformat("%d", value));
}
}
void LLFloaterPreference::updateMaxNonImpostorsLabel(const LLSD& newvalue)
{
U32 value = newvalue.asInteger();
if (0 == value || LLVOAvatar::IMPOSTORS_OFF <= value)
{
value=0;
}
setMaxNonImpostorsText(value, getChild("IndirectMaxNonImpostorsText"));
}
void LLFloaterPreference::updateMaxComplexityLabel(const LLSD& newvalue)
{
U32 value = newvalue.asInteger();
LLAvatarComplexityControls::setText(value, getChild("IndirectMaxComplexityText"));
}
//
void LLFloaterPreferenceGraphicsAdvanced::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box)
{
if (text_box == NULL || ctrl== NULL)
return;
// get range and points when text should change
F32 value = (F32)ctrl->getValue().asReal();
F32 min = ctrl->getMinValue();
F32 max = ctrl->getMaxValue();
F32 range = max - min;
llassert(range > 0);
F32 midPoint = min + range / 3.0f;
F32 highPoint = min + (2.0f * range / 3.0f);
// choose the right text
if (value < midPoint)
{
text_box->setText(LLTrans::getString("GraphicsQualityLow"));
}
else if (value < highPoint)
{
text_box->setText(LLTrans::getString("GraphicsQualityMid"));
}
else
{
text_box->setText(LLTrans::getString("GraphicsQualityHigh"));
}
}
void LLFloaterPreferenceGraphicsAdvanced::updateMaxNonImpostors()
{
// Called when the IndirectMaxNonImpostors control changes
// Responsible for fixing the slider label (IndirectMaxNonImpostorsText) and setting RenderAvatarMaxNonImpostors
LLSliderCtrl* ctrl = getChild("IndirectMaxNonImpostors",true);
U32 value = ctrl->getValue().asInteger();
if (0 == value || LLVOAvatar::IMPOSTORS_OFF <= value)
{
value=0;
}
gSavedSettings.setU32("RenderAvatarMaxNonImpostors", value);
LLVOAvatar::updateImpostorRendering(value); // make it effective immediately
setMaxNonImpostorsText(value, getChild("IndirectMaxNonImpostorsText"));
}
void LLFloaterPreferenceGraphicsAdvanced::setMaxNonImpostorsText(U32 value, LLTextBox* text_box)
{
if (0 == value)
{
text_box->setText(LLTrans::getString("no_limit"));
}
else
{
text_box->setText(llformat("%d", value));
}
}
void LLAvatarComplexityControls::updateMax(LLSliderCtrl* slider, LLTextBox* value_label)
{
// Called when the IndirectMaxComplexity control changes
// Responsible for fixing the slider label (IndirectMaxComplexityText) and setting RenderAvatarMaxComplexity
U32 indirect_value = slider->getValue().asInteger();
U32 max_arc;
if (INDIRECT_MAX_ARC_OFF == indirect_value)
{
// The 'off' position is when the slider is all the way to the right,
// which is a value of INDIRECT_MAX_ARC_OFF,
// so it is necessary to set max_arc to 0 disable muted avatars.
max_arc = 0;
}
else
{
// if this is changed, the inverse calculation in setIndirectMaxArc
// must be changed to match
max_arc = (U32)ll_round(exp(MIN_ARC_LOG + (ARC_LIMIT_MAP_SCALE * (indirect_value - MIN_INDIRECT_ARC_LIMIT))));
}
gSavedSettings.setU32("RenderAvatarMaxComplexity", (U32)max_arc);
setText(max_arc, value_label);
}
void LLAvatarComplexityControls::setText(U32 value, LLTextBox* text_box)
{
if (0 == value)
{
text_box->setText(LLTrans::getString("no_limit"));
}
else
{
// Proper number formatting with delimiter
//text_box->setText(llformat("%d", value));
std::string output_string;
LLLocale locale("");
LLResMgr::getInstance()->getIntegerString(output_string, value);
text_box->setText(output_string);
}
}
void LLFloaterPreference::updateMaxComplexity()
{
// Called when the IndirectMaxComplexity control changes
LLAvatarComplexityControls::updateMax(
getChild("IndirectMaxComplexity"),
getChild("IndirectMaxComplexityText"));
}
bool LLFloaterPreference::loadFromFilename(const std::string& filename, std::map &label_map)
{
LLXMLNodePtr root;
if (!LLXMLNode::parseFile(filename, root, NULL))
{
LL_WARNS() << "Unable to parse file " << filename << LL_ENDL;
return false;
}
if (!root->hasName("labels"))
{
LL_WARNS() << filename << " is not a valid definition file" << LL_ENDL;
return false;
}
LabelTable params;
LLXUIParser parser;
parser.readXUI(root, params, filename);
if (params.validateBlock())
{
for (LLInitParam::ParamIterator::const_iterator it = params.labels.begin();
it != params.labels.end();
++it)
{
LabelDef label_entry = *it;
label_map[label_entry.name] = label_entry.value;
}
}
else
{
LL_WARNS() << filename << " failed to load" << LL_ENDL;
return false;
}
return true;
}
void LLFloaterPreferenceGraphicsAdvanced::updateMaxComplexity()
{
// Called when the IndirectMaxComplexity control changes
LLAvatarComplexityControls::updateMax(
getChild("IndirectMaxComplexity"),
getChild("IndirectMaxComplexityText"));
}
void LLFloaterPreference::onChangeMaturity()
{
U8 sim_access = gSavedSettings.getU32("PreferredMaturity");
getChild("rating_icon_general")->setVisible(sim_access == SIM_ACCESS_PG
|| sim_access == SIM_ACCESS_MATURE
|| sim_access == SIM_ACCESS_ADULT);
getChild("rating_icon_moderate")->setVisible(sim_access == SIM_ACCESS_MATURE
|| sim_access == SIM_ACCESS_ADULT);
getChild("rating_icon_adult")->setVisible(sim_access == SIM_ACCESS_ADULT);
}
std::string get_category_path(LLUUID cat_id)
{
LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
std::string localized_cat_name;
if (!LLTrans::findString(localized_cat_name, "InvFolder " + cat->getName()))
{
localized_cat_name = cat->getName();
}
if (cat->getParentUUID().notNull())
{
return get_category_path(cat->getParentUUID()) + " > " + localized_cat_name;
}
else
{
return localized_cat_name;
}
}
std::string get_category_path(LLFolderType::EType cat_type)
{
LLUUID cat_id = gInventory.findUserDefinedCategoryUUIDForType(cat_type);
return get_category_path(cat_id);
}
void LLFloaterPreference::onChangeModelFolder()
{
if (gInventory.isInventoryUsable())
{
getChild("upload_models")->setText(get_category_path(LLFolderType::FT_OBJECT));
}
}
void LLFloaterPreference::onChangeTextureFolder()
{
if (gInventory.isInventoryUsable())
{
getChild("upload_textures")->setText(get_category_path(LLFolderType::FT_TEXTURE));
}
}
void LLFloaterPreference::onChangeSoundFolder()
{
if (gInventory.isInventoryUsable())
{
getChild("upload_sounds")->setText(get_category_path(LLFolderType::FT_SOUND));
}
}
void LLFloaterPreference::onChangeAnimationFolder()
{
if (gInventory.isInventoryUsable())
{
getChild("upload_animation")->setText(get_category_path(LLFolderType::FT_ANIMATION));
}
}
// FIXME: this will stop you from spawning the sidetray from preferences dialog on login screen
// but the UI for this will still be enabled
void LLFloaterPreference::onClickBlockList()
{
// Optional standalone blocklist floater
//LLFloaterSidePanelContainer::showPanel("people", "panel_people",
// LLSD().with("people_panel_tab_name", "blocked_panel"));
BOOL saved_setting = gSavedSettings.getBOOL("FSDisableBlockListAutoOpen");
gSavedSettings.setBOOL("FSDisableBlockListAutoOpen", FALSE);
LLPanelBlockedList::showPanelAndSelect();
gSavedSettings.setBOOL("FSDisableBlockListAutoOpen", saved_setting);
//
}
void LLFloaterPreference::onClickProxySettings()
{
LLFloaterReg::showInstance("prefs_proxy");
}
void LLFloaterPreference::onClickTranslationSettings()
{
LLFloaterReg::showInstance("prefs_translation");
}
void LLFloaterPreference::onClickAutoReplace()
{
LLFloaterReg::showInstance("prefs_autoreplace");
}
void LLFloaterPreference::onClickSpellChecker()
{
LLFloaterReg::showInstance("prefs_spellchecker");
}
void LLFloaterPreference::onClickRenderExceptions()
{
LLFloaterReg::showInstance("avatar_render_settings");
}
void LLFloaterPreference::onClickAdvanced()
{
LLFloaterReg::showInstance("prefs_graphics_advanced");
LLTabContainer* tabcontainer = getChild("pref core");
for (child_list_t::const_iterator iter = tabcontainer->getChildList()->begin();
iter != tabcontainer->getChildList()->end(); ++iter)
{
LLView* view = *iter;
LLPanelPreferenceGraphics* panel = dynamic_cast(view);
if (panel)
{
panel->resetDirtyChilds();
}
}
}
void LLFloaterPreference::onClickActionChange()
{
mClickActionDirty = true;
}
void LLFloaterPreference::onClickPermsDefault()
{
LLFloaterReg::showInstance("perms_default");
}
void LLFloaterPreference::onClickRememberedUsernames()
{
LLFloaterReg::showInstance("forget_username");
}
void LLFloaterPreference::onDeleteTranscripts()
{
LLSD args;
args["FOLDER"] = gDirUtilp->getUserName();
LLNotificationsUtil::add("PreferenceChatDeleteTranscripts", args, LLSD(), boost::bind(&LLFloaterPreference::onDeleteTranscriptsResponse, this, _1, _2));
}
void LLFloaterPreference::onDeleteTranscriptsResponse(const LLSD& notification, const LLSD& response)
{
if (0 == LLNotificationsUtil::getSelectedOption(notification, response))
{
LLLogChat::deleteTranscripts();
updateDeleteTranscriptsButton();
}
}
void LLFloaterPreference::onLogChatHistorySaved()
{
LLButton * delete_transcripts_buttonp = getChild("delete_transcripts");
if (!delete_transcripts_buttonp->getEnabled())
{
delete_transcripts_buttonp->setEnabled(true);
}
}
void LLFloaterPreference::updateClickActionSettings()
{
const int single_clk_action = getChild("single_click_action_combo")->getValue().asInteger();
const int double_clk_action = getChild("double_click_action_combo")->getValue().asInteger();
gSavedSettings.setBOOL("ClickToWalk", single_clk_action == 1);
gSavedSettings.setBOOL("DoubleClickAutoPilot", double_clk_action == 1);
gSavedSettings.setBOOL("DoubleClickTeleport", double_clk_action == 2);
}
void LLFloaterPreference::updateClickActionControls()
{
const bool click_to_walk = gSavedSettings.getBOOL("ClickToWalk");
const bool dbl_click_to_walk = gSavedSettings.getBOOL("DoubleClickAutoPilot");
const bool dbl_click_to_teleport = gSavedSettings.getBOOL("DoubleClickTeleport");
getChild("single_click_action_combo")->setValue((int)click_to_walk);
getChild("double_click_action_combo")->setValue(dbl_click_to_teleport ? 2 : (int)dbl_click_to_walk);
}
// Load UI Sounds tabs settings
void LLFloaterPreference::updateUISoundsControls()
{
getChild("PlayModeUISndNewIncomingIMSession")->setValue((int)gSavedSettings.getU32("PlayModeUISndNewIncomingIMSession")); // 0, 1, 2, 3. Shared with Chat > Notifications > "When receiving Instant Messages"
getChild("PlayModeUISndNewIncomingGroupIMSession")->setValue((int)gSavedSettings.getU32("PlayModeUISndNewIncomingGroupIMSession")); // 0, 1, 2, 3. Shared with Chat > Notifications > "When receiving Group Instant Messages"
getChild("PlayModeUISndNewIncomingConfIMSession")->setValue((int)gSavedSettings.getU32("PlayModeUISndNewIncomingConfIMSession")); // 0, 1, 2, 3. Shared with Chat > Notifications > "When receiving AdHoc Instant Messages"
#ifdef OPENSIM
getChild("textFSRestartOpenSim")->setVisible(TRUE);
getChild("UISndRestartOpenSim")->setVisible(TRUE);
getChild("Prev_UISndRestartOpenSim")->setVisible(TRUE);
getChild("Def_UISndRestartOpenSim")->setVisible(TRUE);
getChild("PlayModeUISndRestartOpenSim")->setVisible(TRUE);
#endif
getChild("UseLSLFlightAssist")->setValue((int)gSavedPerAccountSettings.getF32("UseLSLFlightAssist")); // Flight Assist combo box; Not sound-related, but better to place it here instead of creating whole new void
// FIRE-9856: Mute sound effects disable plays sound from collisions and plays sound from gestures checkbox not disable after restart/relog
bool mute_sound_effects = gSavedSettings.getBOOL("MuteSounds");
bool mute_all_sounds = gSavedSettings.getBOOL("MuteAudio");
getChild("gesture_audio_play_btn")->setEnabled(!(mute_sound_effects || mute_all_sounds));
getChild("collisions_audio_play_btn")->setEnabled(!(mute_sound_effects || mute_all_sounds));
}
//
void LLFloaterPreference::applyUIColor(LLUICtrl* ctrl, const LLSD& param)
{
LLUIColorTable::instance().setColor(param.asString(), LLColor4(ctrl->getValue()));
}
void LLFloaterPreference::getUIColor(LLUICtrl* ctrl, const LLSD& param)
{
LLColorSwatchCtrl* color_swatch = (LLColorSwatchCtrl*) ctrl;
color_swatch->setOriginal(LLUIColorTable::instance().getColor(param.asString()));
}
void LLFloaterPreference::setCacheLocation(const LLStringExplicit& location)
{
LLUICtrl* cache_location_editor = getChild("cache_location");
cache_location_editor->setValue(location);
cache_location_editor->setToolTip(location);
}
// Sound cache
void LLFloaterPreference::setSoundCacheLocation(const LLStringExplicit& location)
{
LLUICtrl* cache_location_editor = getChild("FSSoundCacheLocation");
cache_location_editor->setValue(location);
cache_location_editor->setToolTip(location);
}
//
void LLFloaterPreference::selectPanel(const LLSD& name)
{
LLTabContainer * tab_containerp = getChild("pref core");
LLPanel * panel = tab_containerp->getPanelByName(name);
if (NULL != panel)
{
tab_containerp->selectTabPanel(panel);
}
}
void LLFloaterPreference::selectPrivacyPanel()
{
selectPanel("im");
}
void LLFloaterPreference::selectChatPanel()
{
selectPanel("chat");
}
void LLFloaterPreference::changed()
{
getChild("clear_log")->setEnabled(LLConversationLog::instance().getConversations().size() > 0);
// set 'enable' property for 'Delete transcripts...' button
updateDeleteTranscriptsButton();
}
// Build fix
//void LLFloaterPreference::saveGraphicsPreset(std::string& preset)
void LLFloaterPreference::saveGraphicsPreset(const std::string& preset)
//
{
mSavedGraphicsPreset = preset;
}
// Properly disable avatar tag setting
void LLFloaterPreference::onAvatarTagSettingsChanged()
{
bool usernames_enabled = gSavedSettings.getBOOL("NameTagShowUsernames");
bool legacy_enabled = gSavedSettings.getBOOL("FSNameTagShowLegacyUsernames");
childSetEnabled("FSshow_legacyun", usernames_enabled);
childSetEnabled("legacy_trim_check", usernames_enabled && legacy_enabled);
bool arw_options_enabled = gSavedSettings.getBOOL("FSTagShowARW") && gSavedSettings.getS32("AvatarNameTagMode") > 0;
childSetEnabled("FSTagShowTooComplexOnlyARW", arw_options_enabled);
childSetEnabled("FSTagShowOwnARW", arw_options_enabled);
}
//
// Correct enabled state of Animated Script Dialogs option
void LLFloaterPreference::updateAnimatedScriptDialogs()
{
S32 position = gSavedSettings.getS32("ScriptDialogsPosition");
childSetEnabled("FSAnimatedScriptDialogs", position == 2 || position == 3);
}
//
//------------------------------Updater---------------------------------------
// FIRE-6340, FIRE-6567 - Setting Bandwidth issues
//static bool handleBandwidthChanged(const LLSD& newvalue)
//{
// gViewerThrottle.setMaxBandwidth((F32) newvalue.asReal());
// return true;
//}
//class LLPanelPreference::Updater : public LLEventTimer
//{
//public:
// typedef boost::function callback_t;
// Updater(callback_t cb, F32 period)
// :LLEventTimer(period),
// mCallback(cb)
// {
// mEventTimer.stop();
// }
// virtual ~Updater(){}
// void update(const LLSD& new_value)
// {
// mNewValue = new_value;
// mEventTimer.start();
// }
//protected:
// BOOL tick()
// {
// mCallback(mNewValue);
// mEventTimer.stop();
// return FALSE;
// }
//private:
// LLSD mNewValue;
// callback_t mCallback;
//};
//---------------------------------------------------------------------------- */
// FIRE-6340, FIRE-6567 - Setting Bandwidth issues
static LLPanelInjector t_places("panel_preference");
LLPanelPreference::LLPanelPreference()
: LLPanel()
// FIRE-6340, FIRE-6567 - Setting Bandwidth issues
//mBandWidthUpdater(NULL)
{
// Handled centrally now
// mCommitCallbackRegistrar.add("Pref.setControlFalse", boost::bind(&LLPanelPreference::setControlFalse,this, _2));
mCommitCallbackRegistrar.add("Pref.updateMediaAutoPlayCheckbox", boost::bind(&LLPanelPreference::updateMediaAutoPlayCheckbox, this, _1));
mCommitCallbackRegistrar.add("Pref.PrefDelete", boost::bind(&LLPanelPreference::deletePreset, this, _2));
mCommitCallbackRegistrar.add("Pref.PrefSave", boost::bind(&LLPanelPreference::savePreset, this, _2));
mCommitCallbackRegistrar.add("Pref.PrefLoad", boost::bind(&LLPanelPreference::loadPreset, this, _2));
// Customizable contact list columns
mCommitCallbackRegistrar.add("FS.CheckContactListColumnMode", boost::bind(&LLPanelPreference::onCheckContactListColumnMode, this));
}
//virtual
BOOL LLPanelPreference::postBuild()
{
////////////////////// PanelGeneral ///////////////////
if (hasChild("display_names_check", TRUE))
{
BOOL use_people_api = gSavedSettings.getBOOL("UsePeopleAPI");
LLCheckBoxCtrl* ctrl_display_name = getChild("display_names_check");
ctrl_display_name->setEnabled(use_people_api);
if (!use_people_api)
{
ctrl_display_name->setValue(FALSE);
}
}
// Minimap pick radius transparency
LLSliderCtrl* map_pickradius_transparency = findChild("MapPickRadiusTransparency");
if (map_pickradius_transparency)
{
mOriginalMapPickRadiusTransparency = LLUIColorTable::instance().getColor("MapPickRadiusColor").get().mV[VW];
map_pickradius_transparency->setValue(mOriginalMapPickRadiusTransparency);
map_pickradius_transparency->setCommitCallback(boost::bind(&LLPanelPreference::updateMapPickRadiusTransparency, this, _2));
}
//
// Flash chat toolbar button notification
if (hasChild("FSNotifyIMFlash", TRUE))
{
gSavedSettings.getControl("FSChatWindow")->getSignal()->connect(boost::bind(&LLPanelPreference::onChatWindowChanged, this));
onChatWindowChanged();
}
//
// Exodus' mouselook combat feature
if (hasChild("FSMouselookCombatFeatures", TRUE))
{
gSavedSettings.getControl("EnableMouselook")->getSignal()->connect(boost::bind(&LLPanelPreference::updateMouselookCombatFeatures, this));
gSavedSettings.getControl("FSMouselookCombatFeatures")->getSignal()->connect(boost::bind(&LLPanelPreference::updateMouselookCombatFeatures, this));
updateMouselookCombatFeatures();
}
//
////////////////////// PanelVoice ///////////////////
// Doesn't exist as of 25-07-2014
//if (hasChild("voice_unavailable", TRUE))
//{
// BOOL voice_disabled = gSavedSettings.getBOOL("CmdLineDisableVoice");
// getChildView("voice_unavailable")->setVisible( voice_disabled);
// getChildView("enable_voice_check")->setVisible( !voice_disabled);
//}
//
//////////////////////PanelSkins ///////////////////
/* Handled below
if (hasChild("skin_selection", TRUE))
{
LLFloaterPreference::refreshSkin(this);
// if skin is set to a skin that no longer exists (silver) set back to default
if (getChild("skin_selection")->getSelectedIndex() < 0)
{
gSavedSettings.setString("SkinCurrent", "default");
LLFloaterPreference::refreshSkin(this);
}
}
*/
//////////////////////PanelPrivacy ///////////////////
if (hasChild("media_enabled", TRUE))
{
bool media_enabled = gSavedSettings.getBOOL("AudioStreamingMedia");
getChild("media_enabled")->set(media_enabled);
getChild("autoplay_enabled")->setEnabled(media_enabled);
}
if (hasChild("music_enabled", TRUE))
{
getChild("music_enabled")->set(gSavedSettings.getBOOL("AudioStreamingMusic"));
}
if (hasChild("media_filter"))
{
getChild("media_filter")->set(gSavedSettings.getBOOL("MediaEnableFilter"));
}
if (hasChild("voice_call_friends_only_check", TRUE))
{
getChild("voice_call_friends_only_check")->setCommitCallback(boost::bind(&showFriendsOnlyWarning, _1, _2));
}
// Disable running multiple viewers warning
//if (hasChild("allow_multiple_viewer_check", TRUE))
//{
// getChild("allow_multiple_viewer_check")->setCommitCallback(boost::bind(&showMultipleViewersWarning, _1, _2));
//}
//
if (hasChild("favorites_on_login_check", TRUE))
{
getChild("favorites_on_login_check")->setCommitCallback(boost::bind(&handleFavoritesOnLoginChanged, _1, _2));
// [FS Login Panel]
//bool show_favorites_at_login = LLPanelLogin::getShowFavorites();
bool show_favorites_at_login = FSPanelLogin::getShowFavorites();
// [FS Login Panel]
getChild("favorites_on_login_check")->setValue(show_favorites_at_login);
}
if (hasChild("mute_chb_label", TRUE))
{
getChild("mute_chb_label")->setShowCursorHand(false);
getChild("mute_chb_label")->setSoundFlags(LLView::MOUSE_UP);
getChild("mute_chb_label")->setClickedCallback(boost::bind(&toggleMuteWhenMinimized));
}
//////////////////////PanelAdvanced ///////////////////
if (hasChild("modifier_combo", TRUE))
{
//localizing if push2talk button is set to middle mouse
std::string modifier_value = getChild("modifier_combo")->getValue().asString();
if (MIDDLE_MOUSE_CV == modifier_value)
{
getChild("modifier_combo")->setValue(getString("middle_mouse"));
}
else if (MOUSE_BUTTON_4_CV == modifier_value)
{
getChild("modifier_combo")->setValue(getString("button4_mouse"));
}
else if (MOUSE_BUTTON_5_CV == modifier_value)
{
getChild("modifier_combo")->setValue(getString("button5_mouse"));
}
}
// Panel Setup (Network) -WoLf
if (hasChild("connection_port_enabled"))
{
getChild("connection_port_enabled")->setCommitCallback(boost::bind(&showCustomPortWarning, _1, _2));
}
// [/WoLf]
//////////////////////PanelSetup ///////////////////
// FIRE-6340, FIRE-6567 - Setting Bandwidth issues
//if (hasChild("max_bandwidth"), TRUE)
//{
// mBandWidthUpdater = new LLPanelPreference::Updater(boost::bind(&handleBandwidthChanged, _1), BANDWIDTH_UPDATER_TIMEOUT);
// gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&LLPanelPreference::Updater::update, mBandWidthUpdater, _2));
//}
// FIRE-6340, FIRE-6567 - Setting Bandwidth issues
#ifdef EXTERNAL_TOS
LLRadioGroup* ext_browser_settings = getChild("preferred_browser_behavior");
if (ext_browser_settings)
{
// turn off ability to set external/internal browser
ext_browser_settings->setSelectedByValue(LLWeb::BROWSER_EXTERNAL_ONLY, true);
ext_browser_settings->setEnabled(false);
}
#endif
////////////////////// PanelAlerts ///////////////////
if (hasChild("OnlineOfflinetoNearbyChat", TRUE))
{
getChildView("OnlineOfflinetoNearbyChatHistory")->setEnabled(getChild("OnlineOfflinetoNearbyChat")->getValue().asBoolean());
}
// Only enable Growl checkboxes if Growl is usable
if (hasChild("notify_growl_checkbox", TRUE))
{
BOOL growl_enabled = gSavedSettings.getBOOL("FSEnableGrowl") && GrowlManager::isUsable();
getChild("notify_growl_checkbox")->setCommitCallback(boost::bind(&LLPanelPreference::onEnableGrowlChanged, this));
getChild("notify_growl_checkbox")->setEnabled(GrowlManager::isUsable());
getChild("notify_growl_always_checkbox")->setEnabled(growl_enabled);
getChild("FSFilterGrowlKeywordDuplicateIMs")->setEnabled(growl_enabled);
}
//
////////////////////// PanelUI ///////////////////
// Customizable contact list columns
if (hasChild("textFriendlistColumns", TRUE))
{
onCheckContactListColumnMode();
}
//
apply();
return true;
}
LLPanelPreference::~LLPanelPreference()
{
// FIRE-6340, FIRE-6567 - Setting Bandwidth issues
//if (mBandWidthUpdater)
//{
// delete mBandWidthUpdater;
//}
// FIRE-6340, FIRE-6567 - Setting Bandwidth issues
}
void LLPanelPreference::apply()
{
// no-op
}
void LLPanelPreference::saveSettings()
{
LLFloater* advanced = LLFloaterReg::findTypedInstance("prefs_graphics_advanced");
// Save the value of all controls in the hierarchy
mSavedValues.clear();
std::list view_stack;
view_stack.push_back(this);
if (advanced)
{
view_stack.push_back(advanced);
}
while(!view_stack.empty())
{
// Process view on top of the stack
LLView* curview = view_stack.front();
view_stack.pop_front();
LLColorSwatchCtrl* color_swatch = dynamic_cast(curview);
if (color_swatch)
{
mSavedColors[color_swatch->getName()] = color_swatch->get();
}
else
{
LLUICtrl* ctrl = dynamic_cast(curview);
if (ctrl)
{
LLControlVariable* control = ctrl->getControlVariable();
if (control)
{
mSavedValues[control] = control->getValue();
}
}
}
// Push children onto the end of the work stack
for (child_list_t::const_iterator iter = curview->getChildList()->begin();
iter != curview->getChildList()->end(); ++iter)
{
view_stack.push_back(*iter);
}
}
}
void LLPanelPreference::showMultipleViewersWarning(LLUICtrl* checkbox, const LLSD& value)
{
if (checkbox && checkbox->getValue())
{
LLNotificationsUtil::add("AllowMultipleViewers");
}
}
void LLPanelPreference::showFriendsOnlyWarning(LLUICtrl* checkbox, const LLSD& value)
{
if (checkbox && checkbox->getValue())
{
LLNotificationsUtil::add("FriendsAndGroupsOnly");
}
}
// Manage the custom port alert, fixes Cant Close bug. -WoLf
void LLPanelPreference::showCustomPortWarning(LLUICtrl* checkbox, const LLSD& value)
{
LLNotificationsUtil::add("ChangeConnectionPort");
}
// [/WoLf]
void LLPanelPreference::handleFavoritesOnLoginChanged(LLUICtrl* checkbox, const LLSD& value)
{
if (checkbox)
{
LLFavoritesOrderStorage::instance().showFavoritesOnLoginChanged(checkbox->getValue().asBoolean());
if(checkbox->getValue())
{
LLNotificationsUtil::add("FavoritesOnLogin");
}
}
}
void LLPanelPreference::toggleMuteWhenMinimized()
{
std::string mute("MuteWhenMinimized");
gSavedSettings.setBOOL(mute, !gSavedSettings.getBOOL(mute));
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance("preferences");
if (instance)
{
instance->getChild