/** * @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" // 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; // FIRE-19539 - Include the alert messages in Prefs>Notifications>Alerts in preference Search. class LLFilterEditor; namespace ll { namespace prefs { struct SearchData; } } typedef std::map 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 settings_to_skip = {}); // FIRE-19539 - Include the alert messages in Prefs>Notifications>Alerts in preference Search. // /*virtual*/ void draw(); // /*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 // 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& 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 onTimeFormatChange(); void onNotificationsChange(const std::string& OptionName); void onNameTagOpacityChange(const LLSD& newvalue); void onConsoleOpacityChange(const LLSD& newvalue); // FIRE-1332 - Sepeate opacity settings for nametag and console chat // set value of "DoNotDisturbResponseChanged" in account settings depending on whether do not disturb response // Pie menu // make sure controls get greyed out or enabled when pie color override is toggled void onPieColorsOverrideChanged(); // 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(); // 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(); // updates UI Sounds controls depending on values from settings.xml void updateUISoundsControls(); // Font Selection void populateFontSelectionCombo(); void loadFontPresetsFromDir(const std::string& dir, LLComboBox* font_selection_combo); // // Properly disable avatar tag setting void onAvatarTagSettingsChanged(); // Correct enabled state of Animated Script Dialogs option void updateAnimatedScriptDialogs(); // 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); // Sound cache void setSoundCacheLocation(const LLStringExplicit& location); void onClickSetSoundCache(); void changeSoundCachePath(const std::vector& filenames, std::string proposed_name); void onClickBrowseSoundCache(); void onClickResetSoundCache(); // // FIRE-2912: Reset voice button void onClickResetVoice(); void onClickSetCache(); void changeCachePath(const std::vector& 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(); // Handled centrally now void onClickPreviewUISound(const LLSD& ui_sound_id); // FIRE-8190: Preview function for "UI Sounds" Panel void setPreprocInclude(); void changePreprocIncludePath(const std::vector& filenames, std::string proposed_name); // FIRE-23606 Reveal path to external script editor in prefernces void setExternalEditor(); void changeExternalEditorPath(const std::vector& filenames); // // FIRE-19539 - Include the alert messages in Prefs>Notifications>Alerts in preference Search. // void onClickEnablePopup(); // void onClickDisablePopup(); void onSelectPopup(); void onUpdatePopupFilter(); // void resetAllIgnored(); void setAllIgnored(); void onClickLogPath(); void changeLogPath(const std::vector& filenames, std::string proposed_name); bool moveTranscriptsAndLog(); //[FIX FIRE-2765 : SJ] Making sure Reset button resets works void onClickResetLogPath(); // 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); // Show email address in preferences (FIRE-1071) void refreshEnabledState(); // 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); // Clear inventory cache button void onClickInventoryClearCache(); // Clear web browser cache button void onClickWebBrowserClearCache(); // Improved graphics preferences void updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box); void updateMaxNonImpostorsLabel(const LLSD& newvalue); void updateMaxComplexityLabel(const LLSD& newvalue); // 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(); // FIRE-19539 - Include the alert messages in Prefs>Notifications>Alerts in preference Search. // void buildPopupLists(); void buildPopupList(); // static void refreshSkin(void* data); void selectPanel(const LLSD& name); // Build fix //void saveGraphicsPreset(std::string& preset); void saveGraphicsPreset(const std::string& preset); // // 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 &label_map); static std::string sSkin; notifications_map mNotificationOptions; bool mGotPersonalInfo; // 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; LLComboBox* mTimeFormatCombobox = 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(); // Using different solution std::map mIgnorableNotifs; // FIRE-19539 - Include the alert messages in Prefs>Notifications>Alerts in preference Search. LLScrollListCtrl* mPopupList; LLFilterEditor* mPopupFilter; // }; class LLPanelPreference : public LLPanel { public: LLPanelPreference(); /*virtual*/ bool postBuild(); virtual ~LLPanelPreference(); virtual void apply(); virtual void cancel(const std::vector settings_to_skip = {}); // void setControlFalse(const LLSD& user_data); // 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); // Handled in llviewercontrol.cpp //class Updater; protected: typedef std::map 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&); // //for "Show my Favorite Landmarks at Login" static void handleFavoritesOnLoginChanged(LLUICtrl* checkbox, const LLSD& value); static void toggleMuteWhenMinimized(); // Only enable Growl checkboxes if Growl is usable void onEnableGrowlChanged(); // Flash chat toolbar button notification void onChatWindowChanged(); // Exodus' mouselook combat feature void updateMouselookCombatFeatures(); // Minimap pick radius transparency void updateMapPickRadiusTransparency(const LLSD& value); F32 mOriginalMapPickRadiusTransparency; // Customizable contact list columns void onCheckContactListColumnMode(); typedef std::map string_color_map_t; string_color_map_t mSavedColors; // 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 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 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 settings_to_skip = {}); void callbackRestart(const LLSD& notification, const LLSD& response); // Callback for restart dialogs protected: void onSkinChanged(); void onSkinThemeChanged(); void refreshSkinList(); void refreshSkinThemeList(); void refreshPreviewImage(); // 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; // 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 settings_to_skip = {}); void refresh(); private: LOG_CLASS(LLPanelPreferenceCrashReports); }; // [/SL:KB] // Settings Backup class FSPanelPreferenceBackup : public LLPanelPreference { public: FSPanelPreferenceBackup(); /*virtual*/ bool postBuild(); protected: // Backup settings void onClickSetBackupSettingsPath(); void changeBackupSettingsPath(const std::vector& 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 // private: LOG_CLASS(FSPanelPreferenceBackup); }; // class LLPanelPreferenceOpensim : public LLPanelPreference { LOG_CLASS(LLPanelPreferenceOpensim); public: LLPanelPreferenceOpensim(); ~LLPanelPreferenceOpensim(); #ifdef OPENSIM /*virtual*/ void apply(); /*virtual*/ void cancel(const std::vector 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 }; // // 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); }; // 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 control_values_map_t; control_values_map_t mSavedValues; LOG_CLASS(LLFloaterPreferenceProxy); }; #endif // LL_LLPREFERENCEFLOATER_H