phoenix-firestorm/indra/newview/llfloaterpreference.h

697 lines
24 KiB
C++

/**
* @file llfloaterpreference.h
* @brief LLPreferenceCore class definition
*
* $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.
*/
#ifndef LL_LLFLOATERPREFERENCE_H
#define LL_LLFLOATERPREFERENCE_H
#include "llfloater.h"
#include "llavatarpropertiesprocessor.h"
#include "llconversationlog.h"
#include "llsearcheditor.h"
#include "llsetkeybinddialog.h"
#include "llkeyconflict.h"
#include "llaudioengine.h" // <FS:Ansariel> Output device selection
class LLConversationLogObserver;
class LLPanelPreference;
class LLPanelLCD;
class LLPanelDebug;
class LLMessageSystem;
class LLComboBox;
class LLScrollListCtrl;
class LLScrollListCell;
class LLSliderCtrl;
class LLSD;
class LLTextBox;
class LLComboBox;
class LLLineEditor;
// <FS:Zi> FIRE-19539 - Include the alert messages in Prefs>Notifications>Alerts in preference Search.
class LLFilterEditor;
namespace ll
{
namespace prefs
{
struct SearchData;
}
}
typedef std::map<std::string, std::string> notifications_map;
typedef enum
{
GS_LOW_GRAPHICS,
GS_MID_GRAPHICS,
GS_HIGH_GRAPHICS,
GS_ULTRA_GRAPHICS
} EGraphicsSettings;
// Floater to control preferences (display, audio, bandwidth, general.
class LLFloaterPreference : public LLFloater, public LLAvatarPropertiesObserver, public LLConversationLogObserver
{
public:
LLFloaterPreference(const LLSD& key);
~LLFloaterPreference();
void apply();
void cancel(const std::vector<std::string> settings_to_skip = {});
// <FS:Zi> FIRE-19539 - Include the alert messages in Prefs>Notifications>Alerts in preference Search.
// /*virtual*/ void draw();
// </FS:Zi>
/*virtual*/ bool postBuild();
/*virtual*/ void onOpen(const LLSD& key);
/*virtual*/ void onClose(bool app_quitting);
/*virtual*/ void changed();
/*virtual*/ void changed(const LLUUID& session_id, U32 mask) {};
// static data update, called from message handler
// <FS:Ansariel> Show email address in preferences (FIRE-1071) and keep for OpenSim
//static void updateUserInfo(const std::string& visibility);
static void updateUserInfo(const std::string& visibility, bool im_via_email, const std::string& email);
// refresh all the graphics preferences menus
static void refreshEnabledGraphics();
// translate user's do not disturb response message according to current locale if message is default, otherwise do nothing
static void initDoNotDisturbResponse();
// update Show Favorites checkbox
static void updateShowFavoritesCheckbox(bool val);
void processProperties( void* pData, EAvatarProcessorType type );
void saveAvatarProperties( void );
static void saveAvatarPropertiesCoro(const std::string url, bool allow_publish);
void selectPrivacyPanel();
void selectChatPanel();
void getControlNames(std::vector<std::string>& names);
// updates click/double-click action controls depending on values from settings.xml
void updateClickActionViews();
void updateSearchableItems();
void onBtnOK(const LLSD& userdata);
void onBtnCancel(const LLSD& userdata);
protected:
//void onClickClearCache(); // Clear viewer texture cache, file cache on next startup // AO: was protected, moved to public
void onClickBrowserClearCache(); // Clear web history and caches as well as viewer caches above
void onLanguageChange();
void onNotificationsChange(const std::string& OptionName);
void onNameTagOpacityChange(const LLSD& newvalue);
void onConsoleOpacityChange(const LLSD& newvalue); // <FS:CR> FIRE-1332 - Sepeate opacity settings for nametag and console chat
// set value of "DoNotDisturbResponseChanged" in account settings depending on whether do not disturb response
// <FS:Zi> Pie menu
// make sure controls get greyed out or enabled when pie color override is toggled
void onPieColorsOverrideChanged();
// </FS:Zi> Pie menu
// string differs from default after user changes.
void onDoNotDisturbResponseChanged();
// if the custom settings box is clicked
void onChangeCustom();
void updateMeterText(LLUICtrl* ctrl);
// callback for defaults
void setHardwareDefaults();
void setRecommended();
// callback for when client modifies a render option
void onRenderOptionEnable();
// callback for when client turns on impostors
void onAvatarImpostorsEnable();
// <FS:AO> callback for local lights toggle
void onLocalLightsEnable();
// callback for commit in the "Single click on land" and "Double click on land" comboboxes.
void onClickActionChange();
// updates click/double-click action keybindngs depending on view values
void updateClickActionControls();
void onAtmosShaderChange();
// <FS:PP> updates UI Sounds controls depending on values from settings.xml
void updateUISoundsControls();
//<FS:Kadah> Font Selection
void populateFontSelectionCombo();
void loadFontPresetsFromDir(const std::string& dir, LLComboBox* font_selection_combo);
//</FS:Kadah>
// <FS:Ansariel> Properly disable avatar tag setting
void onAvatarTagSettingsChanged();
// <FS:Ansariel> Correct enabled state of Animated Script Dialogs option
void updateAnimatedScriptDialogs();
// <FS:Zi> Group Notices and chiclets location setting conversion bool => S32
void onShowGroupNoticesTopRightChanged();
public:
// This function squirrels away the current values of the controls so that
// cancel() can restore them.
void saveSettings();
void saveIgnoredNotifications();
void restoreIgnoredNotifications();
void setCacheLocation(const LLStringExplicit& location);
// <FS:Ansariel> Sound cache
void setSoundCacheLocation(const LLStringExplicit& location);
void onClickSetSoundCache();
void changeSoundCachePath(const std::vector<std::string>& filenames, std::string proposed_name);
void onClickBrowseSoundCache();
void onClickResetSoundCache();
// </FS:Ansariel>
// <FS:Ansariel> FIRE-2912: Reset voice button
void onClickResetVoice();
void onClickSetCache();
void changeCachePath(const std::vector<std::string>& filenames, std::string proposed_name);
void onClickBrowseCache();
void onClickBrowseCrashLogs();
void onClickBrowseChatLogDir();
void onClickResetCache();
void onClickClearCache(); // AO: was protected, moved to public
void onClickJavascript();
void onClickBrowseSettingsDir();
void onClickSkin(LLUICtrl* ctrl,const LLSD& userdata);
void onSelectSkin();
// void onClickSetSounds(); //<FS:KC> Handled centrally now
void onClickPreviewUISound(const LLSD& ui_sound_id); // <FS:PP> FIRE-8190: Preview function for "UI Sounds" Panel
void setPreprocInclude();
void changePreprocIncludePath(const std::vector<std::string>& filenames, std::string proposed_name);
// <FS:LO> FIRE-23606 Reveal path to external script editor in prefernces
void setExternalEditor();
void changeExternalEditorPath(const std::vector<std::string>& filenames);
// </FS:LO>
// <FS:Zi> FIRE-19539 - Include the alert messages in Prefs>Notifications>Alerts in preference Search.
// void onClickEnablePopup();
// void onClickDisablePopup();
void onSelectPopup();
void onUpdatePopupFilter();
// </FS:Zi>
void resetAllIgnored();
void setAllIgnored();
void onClickLogPath();
void changeLogPath(const std::vector<std::string>& filenames, std::string proposed_name);
bool moveTranscriptsAndLog();
//[FIX FIRE-2765 : SJ] Making sure Reset button resets works
void onClickResetLogPath();
// <FS:Ansariel> Show email address in preferences (FIRE-1071) and keep for OpenSim
//void setPersonalInfo(const std::string& visibility);
void setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email);
// </FS:Ansariel> Show email address in preferences (FIRE-1071)
void refreshEnabledState();
// <FS:Ansariel> Improved graphics preferences
void disableUnavailableSettings();
void onCommitWindowedMode();
void refresh(); // Refresh enable/disable
// if the quality radio buttons are changed
void onChangeQuality(const LLSD& data);
void onClickClearSettings();
void onClickChatOnlineNotices();
void onClickClearSpamList();
//void callback_clear_settings(const LLSD& notification, const LLSD& response);
// <FS:Ansariel> Clear inventory cache button
void onClickInventoryClearCache();
// <FS:Ansariel> Clear web browser cache button
void onClickWebBrowserClearCache();
// <FS:Ansariel> Improved graphics preferences
void updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box);
void updateMaxNonImpostorsLabel(const LLSD& newvalue);
void updateMaxComplexityLabel(const LLSD& newvalue);
// </FS:Ansariel>
void refreshUI();
void onChangeMaturity();
void onChangeComplexityMode(const LLSD& newvalue);
void onChangeModelFolder();
void onChangePBRFolder();
void onChangeTextureFolder();
void onChangeSoundFolder();
void onChangeAnimationFolder();
void onClickBlockList();
void onClickProxySettings();
void onClickTranslationSettings();
void onClickPermsDefault();
void onClickRememberedUsernames();
void onClickAutoReplace();
void onClickSpellChecker();
void onClickRenderExceptions();
void onClickAutoAdjustments();
void onClickAdvanced();
void applyUIColor(LLUICtrl* ctrl, const LLSD& param);
void getUIColor(LLUICtrl* ctrl, const LLSD& param);
void onLogChatHistorySaved();
// <FS:Zi> FIRE-19539 - Include the alert messages in Prefs>Notifications>Alerts in preference Search.
// void buildPopupLists();
void buildPopupList();
// </FS:Zi>
static void refreshSkin(void* data);
void selectPanel(const LLSD& name);
// <FS:Ansariel> Build fix
//void saveGraphicsPreset(std::string& preset);
void saveGraphicsPreset(const std::string& preset);
// </FS:Ansariel>
// <FS:Zi> Support preferences search SLURLs
void onCopySearch();
void setRecommendedSettings();
void resetAutotuneSettings();
private:
void onDeleteTranscripts();
void onDeleteTranscriptsResponse(const LLSD& notification, const LLSD& response);
void updateDeleteTranscriptsButton();
void updateMaxNonImpostors();
void updateIndirectMaxNonImpostors(const LLSD& newvalue);
void setMaxNonImpostorsText(U32 value, LLTextBox* text_box);
void updateMaxComplexity();
void updateComplexityText();
static bool loadFromFilename(const std::string& filename, std::map<std::string, std::string> &label_map);
static std::string sSkin;
notifications_map mNotificationOptions;
bool mGotPersonalInfo;
// <FS:Ansariel> Keep it for OpenSim
bool mOriginalIMViaEmail;
bool mLanguageChanged;
bool mAvatarDataInitialized;
U32 mLastQualityLevel = 0;
std::string mPriorInstantMessageLogPath;
bool mOriginalHideOnlineStatus;
std::string mDirectoryVisibility;
bool mAllowPublish; // Allow showing agent in search
std::string mSavedGraphicsPreset;
LOG_CLASS(LLFloaterPreference);
LLSearchEditor* mFilterEdit = nullptr;
LLScrollListCtrl* mEnabledPopups = nullptr;
LLScrollListCtrl* mDisabledPopups = nullptr;
LLButton* mDeleteTranscriptsBtn = nullptr;
LLButton* mEnablePopupBtn = nullptr;
LLButton* mDisablePopupBtn = nullptr;
std::unique_ptr< ll::prefs::SearchData > mSearchData;
bool mSearchDataDirty;
boost::signals2::connection mImpostorsChangedSignal;
boost::signals2::connection mComplexityChangedSignal;
void onUpdateFilterTerm( bool force = false );
void collectSearchableItems();
//void filterIgnorableNotifications(); // <FS:Ansariel> Using different solution
std::map<std::string, bool> mIgnorableNotifs;
// <FS:Zi> FIRE-19539 - Include the alert messages in Prefs>Notifications>Alerts in preference Search.
LLScrollListCtrl* mPopupList;
LLFilterEditor* mPopupFilter;
// </FS.Zi>
};
class LLPanelPreference : public LLPanel
{
public:
LLPanelPreference();
/*virtual*/ bool postBuild();
virtual ~LLPanelPreference();
virtual void apply();
virtual void cancel(const std::vector<std::string> settings_to_skip = {});
// void setControlFalse(const LLSD& user_data); //<FS:KC> Handled centrally now
virtual void setHardwareDefaults();
// Disables "Allow Media to auto play" check box only when both
// "Streaming Music" and "Media" are unchecked. Otherwise enables it.
void updateMediaAutoPlayCheckbox(LLUICtrl* ctrl);
// This function squirrels away the current values of the controls so that
// cancel() can restore them.
virtual void saveSettings();
void deletePreset(const LLSD& user_data);
void savePreset(const LLSD& user_data);
void loadPreset(const LLSD& user_data);
// <FS:Ansariel> Handled in llviewercontrol.cpp
//class Updater;
protected:
typedef std::map<LLControlVariable*, LLSD> control_values_map_t;
control_values_map_t mSavedValues;
private:
//for "Only friends and groups can call or IM me"
static void showFriendsOnlyWarning(LLUICtrl*, const LLSD&);
//for "Allow Multiple Viewers"
static void showMultipleViewersWarning(LLUICtrl*, const LLSD&);
static void showCustomPortWarning(LLUICtrl*, const LLSD&); // <FS:WoLf>
//for "Show my Favorite Landmarks at Login"
static void handleFavoritesOnLoginChanged(LLUICtrl* checkbox, const LLSD& value);
static void toggleMuteWhenMinimized();
// <FS:Ansariel> Only enable Growl checkboxes if Growl is usable
void onEnableGrowlChanged();
// <FS:Ansariel> Flash chat toolbar button notification
void onChatWindowChanged();
// <FS:Ansariel> Exodus' mouselook combat feature
void updateMouselookCombatFeatures();
// <FS:Ansariel> Minimap pick radius transparency
void updateMapPickRadiusTransparency(const LLSD& value);
F32 mOriginalMapPickRadiusTransparency;
// <FS:Ansariel> Customizable contact list columns
void onCheckContactListColumnMode();
typedef std::map<std::string, LLColor4> string_color_map_t;
string_color_map_t mSavedColors;
//<FS:HG> FIRE-6340, FIRE-6567 - Setting Bandwidth issues
//Updater* mBandWidthUpdater;
LOG_CLASS(LLPanelPreference);
};
class LLPanelPreferenceGraphics : public LLPanelPreference
{
public:
bool postBuild();
void draw();
void cancel(const std::vector<std::string> settings_to_skip = {});
void saveSettings();
void resetDirtyChilds();
void setHardwareDefaults();
void setPresetText();
protected:
bool hasDirtyChilds();
private:
void onPresetsListChange();
LOG_CLASS(LLPanelPreferenceGraphics);
};
class LLPanelPreferenceControls : public LLPanelPreference, public LLKeyBindResponderInterface
{
LOG_CLASS(LLPanelPreferenceControls);
public:
LLPanelPreferenceControls();
virtual ~LLPanelPreferenceControls();
bool postBuild();
void apply();
void cancel(const std::vector<std::string> settings_to_skip = {});
void saveSettings();
void resetDirtyChilds();
void onListCommit();
void onModeCommit();
void onRestoreDefaultsBtn();
void onRestoreDefaultsResponse(const LLSD& notification, const LLSD& response);
// Bypass to let Move & view read values without need to create own key binding handler
// Todo: consider a better way to share access to keybindings
bool canKeyBindHandle(const std::string &control, EMouseClickType click, KEY key, MASK mask);
// Bypasses to let Move & view modify values without need to create own key binding handler
void setKeyBind(const std::string &control, EMouseClickType click, KEY key, MASK mask, bool set /*set or reset*/ );
void updateAndApply();
// from interface
/*virtual*/ bool onSetKeyBind(EMouseClickType click, KEY key, MASK mask, bool all_modes);
/*virtual*/ void onDefaultKeyBind(bool all_modes);
/*virtual*/ void onCancelKeyBind();
private:
// reloads settings, discards current changes, updates table
void regenerateControls();
// These fuctions do not clean previous content
bool addControlTableColumns(const std::string &filename);
bool addControlTableRows(const std::string &filename);
void addControlTableSeparator();
// Cleans content and then adds content from xml files according to current mEditingMode
void populateControlTable();
// Updates keybindings from storage to table
void updateTable();
LLScrollListCtrl* pControlsTable;
LLComboBox *pKeyModeBox;
LLKeyConflictHandler mConflictHandler[LLKeyConflictHandler::MODE_COUNT];
std::string mEditingControl;
S32 mEditingColumn;
S32 mEditingMode;
};
class LLAvatarComplexityControls
{
public:
static void updateMax(LLSliderCtrl* slider, LLTextBox* value_label, bool short_val = false);
static void setText(U32 value, LLTextBox* text_box, bool short_val = false);
static void updateMaxRenderTime(LLSliderCtrl* slider, LLTextBox* value_label, bool short_val = false);
static void setRenderTimeText(F32 value, LLTextBox* text_box, bool short_val = false);
static void setIndirectControls();
static void setIndirectMaxNonImpostors();
static void setIndirectMaxArc();
LOG_CLASS(LLAvatarComplexityControls);
};
// [SL:KB] - Catznip Viewer-Skins
class LLPanelPreferenceSkins : public LLPanelPreference
{
public:
LLPanelPreferenceSkins();
/*virtual*/ bool postBuild();
/*virtual*/ void apply();
/*virtual*/ void cancel(const std::vector<std::string> settings_to_skip = {});
void callbackRestart(const LLSD& notification, const LLSD& response); // <FS:CR> Callback for restart dialogs
protected:
void onSkinChanged();
void onSkinThemeChanged();
void refreshSkinList();
void refreshSkinThemeList();
void refreshPreviewImage(); // <FS:PP> FIRE-1689: Skins preview image
void showSkinChangeNotification();
protected:
std::string m_Skin;
LLComboBox* m_pSkinCombo;
std::string m_SkinTheme;
LLComboBox* m_pSkinThemeCombo;
LLButton* m_pSkinPreview; // <FS:PP> FIRE-1689: Skins preview image
LLSD m_SkinsInfo;
std::string m_SkinName;
std::string m_SkinThemeName;
LOG_CLASS(LLPanelPreferenceSkins);
};
// [/SL:KB]
// [SL:KB] - Patch: Viewer-CrashReporting | Checked: 2010-10-21 (Catznip-2.6.0a) | Added: Catznip-2.2.0c
class LLPanelPreferenceCrashReports : public LLPanelPreference
{
public:
LLPanelPreferenceCrashReports();
/*virtual*/ bool postBuild();
/*virtual*/ void apply();
/*virtual*/ void cancel(const std::vector<std::string> settings_to_skip = {});
void refresh();
private:
LOG_CLASS(LLPanelPreferenceCrashReports);
};
// [/SL:KB]
// <FS:CR> Settings Backup
class FSPanelPreferenceBackup : public LLPanelPreference
{
public:
FSPanelPreferenceBackup();
/*virtual*/ bool postBuild();
protected:
// <FS:Zi> Backup settings
void onClickSetBackupSettingsPath();
void changeBackupSettingsPath(const std::vector<std::string>& filenames, std::string proposed_name);
void onClickSelectAll();
void onClickDeselectAll();
void onClickBackupSettings();
void onClickRestoreSettings();
void doSelect(bool all); // calls applySelection for each list
void applySelection(LLScrollListCtrl* control, bool all); // selects or deselects all items in a scroll list
void doBackupSettings(const LLSD& notification, const LLSD& response); // callback for backup dialog
void doRestoreSettings(const LLSD& notification, const LLSD& response); // callback for restore dialog
void onQuitConfirmed(const LLSD& notification, const LLSD& response); // callback for finished restore dialog
// </FS:Zi>
private:
LOG_CLASS(FSPanelPreferenceBackup);
};
// <FS:AW opensim preferences>
class LLPanelPreferenceOpensim : public LLPanelPreference
{
LOG_CLASS(LLPanelPreferenceOpensim);
public:
LLPanelPreferenceOpensim();
~LLPanelPreferenceOpensim();
#ifdef OPENSIM
/*virtual*/ void apply();
/*virtual*/ void cancel(const std::vector<std::string> settings_to_skip = {});
protected:
boost::signals2::connection mGridListChangedCallbackConnection;
boost::signals2::connection mGridAddedCallbackConnection;
void onOpen(const LLSD& key);
/*virtual*/ bool postBuild();
void onClickAddGrid();
void addedGrid(bool success);
void onClickClearGrid();
void onClickRefreshGrid();
void onClickRemoveGrid();
void onSelectGrid();
bool removeGridCB(const LLSD& notification, const LLSD& response);
void onClickClearDebugSearchURL();
void onClickPickDebugSearchURL();
void refreshGridList(bool success = true);
LLScrollListCtrl* mGridListControl;
private:
LLLineEditor* mEditorGridName;
LLLineEditor* mEditorGridURI;
LLLineEditor* mEditorLoginPage;
LLLineEditor* mEditorHelperURI;
LLLineEditor* mEditorWebsite;
LLLineEditor* mEditorSupport;
LLLineEditor* mEditorRegister;
LLLineEditor* mEditorPassword;
LLLineEditor* mEditorSearch;
LLLineEditor* mEditorGridMessage;
std::string mCurrentGrid;
#endif
};
// </FS:AW opensim preferences>
// <FS:Ansariel> Output device selection
class FSPanelPreferenceSounds : public LLPanelPreference
{
public:
FSPanelPreferenceSounds();
virtual ~FSPanelPreferenceSounds();
bool postBuild();
private:
LLPanel* mOutputDevicePanel;
LLComboBox* mOutputDeviceComboBox;
LLCheckBoxCtrl* mMoapInteractionAll;
LLCheckBoxCtrl* mMoapInteractionAny;
LLCheckBoxCtrl* mMoapInteractionHud;
LLCheckBoxCtrl* mMoapInteractionOwnObjects;
LLCheckBoxCtrl* mMoapInteractionGroupObjects;
LLCheckBoxCtrl* mMoapInteractionFriendObjects;
LLCheckBoxCtrl* mMoapInteractionLandownerObjects;
void onOutputDeviceChanged(const LLSD& new_value);
void onOutputDeviceSelectionChanged(const LLSD& new_value);
void onOutputDeviceListChanged(LLAudioEngine::output_device_map_t output_devices);
void onMoapInteractionChanged();
void updateMoapInteractionSetting();
boost::signals2::connection mOutputDeviceListChangedConnection;
LOG_CLASS(FSPanelPreferenceSounds);
};
// </FS:Ansariel>
class LLFloaterPreferenceProxy : public LLFloater
{
public:
LLFloaterPreferenceProxy(const LLSD& key);
~LLFloaterPreferenceProxy();
/// show off our menu
static void show();
void cancel();
protected:
bool postBuild();
void onOpen(const LLSD& key);
void onClose(bool app_quitting);
void saveSettings();
void onBtnOk();
void onBtnCancel();
void onClickCloseBtn(bool app_quitting = false);
void onChangeSocksSettings();
private:
bool mSocksSettingsDirty;
typedef std::map<LLControlVariable*, LLSD> control_values_map_t;
control_values_map_t mSavedValues;
LOG_CLASS(LLFloaterPreferenceProxy);
};
#endif // LL_LLPREFERENCEFLOATER_H