Skip to content
Snippets Groups Projects
llfloaterpreference.cpp 117 KiB
Newer Older
  • Learn to ignore specific revisions
  • 	getChildView("friends_online_notify_checkbox")->setEnabled(TRUE);
    	getChild<LLUICtrl>("online_visibility")->setValue(mOriginalHideOnlineStatus); 	 
    	getChild<LLUICtrl>("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<LLUICtrl>("send_im_to_email")->setValue(im_via_email);
    
    	getChildView("favorites_on_login_check")->setEnabled(TRUE);
    
    	getChildView("log_path_button")->setEnabled(TRUE);
    
    	getChildView("chat_font_size")->setEnabled(TRUE);
    
    	getChildView("conversation_log_combo")->setEnabled(TRUE);
    
    void LLFloaterPreference::refreshUI()
    
    void LLFloaterPreferenceGraphicsAdvanced::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box)
    
    	if (text_box == NULL || ctrl== NULL)
    
    	// 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<LLSliderCtrl>("IndirectMaxNonImpostors",true);
    	U32 value = ctrl->getValue().asInteger();
    
    	if (0 == value || LLVOAvatar::IMPOSTORS_OFF <= value)
    
    	gSavedSettings.setU32("RenderAvatarMaxNonImpostors", value);
    	LLVOAvatar::updateImpostorRendering(value); // make it effective immediately
    
    	setMaxNonImpostorsText(value, getChild<LLTextBox>("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"));
    
    		text_box->setText(llformat("%d", value));
    
    void LLFloaterPreference::updateMaxComplexity()
    {
    	// Called when the IndirectMaxComplexity control changes
        LLAvatarComplexityControls::updateMax(
            getChild<LLSliderCtrl>("IndirectMaxComplexity"),
            getChild<LLTextBox>("IndirectMaxComplexityText"));
    }
    
    
    bool LLFloaterPreference::loadFromFilename(const std::string& filename, std::map<std::string, std::string> &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<LabelDef>::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<LLSliderCtrl>("IndirectMaxComplexity"),
            getChild<LLTextBox>("IndirectMaxComplexityText"));
    }
    
    
    void LLFloaterPreference::onChangeMaturity()
    {
    	U8 sim_access = gSavedSettings.getU32("PreferredMaturity");
    
    	getChild<LLIconCtrl>("rating_icon_general")->setVisible(sim_access == SIM_ACCESS_PG
    															|| sim_access == SIM_ACCESS_MATURE
    															|| sim_access == SIM_ACCESS_ADULT);
    
    	getChild<LLIconCtrl>("rating_icon_moderate")->setVisible(sim_access == SIM_ACCESS_MATURE
    															|| sim_access == SIM_ACCESS_ADULT);
    
    	getChild<LLIconCtrl>("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();
        }
    
    
            return get_category_path(cat->getParentUUID()) + " > " + localized_cat_name;
    
            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<LLTextBox>("upload_models")->setText(get_category_path(LLFolderType::FT_OBJECT));
    
        }
    }
    
    void LLFloaterPreference::onChangeTextureFolder()
    {
        if (gInventory.isInventoryUsable())
        {
    
            getChild<LLTextBox>("upload_textures")->setText(get_category_path(LLFolderType::FT_TEXTURE));
    
        }
    }
    
    void LLFloaterPreference::onChangeSoundFolder()
    {
        if (gInventory.isInventoryUsable())
        {
    
            getChild<LLTextBox>("upload_sounds")->setText(get_category_path(LLFolderType::FT_SOUND));
    
        }
    }
    
    void LLFloaterPreference::onChangeAnimationFolder()
    {
        if (gInventory.isInventoryUsable())
        {
    
            getChild<LLTextBox>("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()
    {
    
    	LLFloaterSidePanelContainer::showPanel("people", "panel_people",
    		LLSD().with("people_panel_tab_name", "blocked_panel"));
    
    void LLFloaterPreference::onClickProxySettings()
    
    	LLFloaterReg::showInstance("prefs_proxy");
    
    Vadim ProductEngine's avatar
    Vadim ProductEngine committed
    void LLFloaterPreference::onClickTranslationSettings()
    
    Vadim ProductEngine's avatar
    Vadim ProductEngine committed
    	LLFloaterReg::showInstance("prefs_translation");
    
    void LLFloaterPreference::onClickAutoReplace()
    {
    	LLFloaterReg::showInstance("prefs_autoreplace");
    }
    
    
        LLFloaterReg::showInstance("prefs_spellchecker");
    
    void LLFloaterPreference::onClickRenderExceptions()
    {
        LLFloaterReg::showInstance("avatar_render_settings");
    }
    
    
    void LLFloaterPreference::onClickAdvanced()
    {
    	LLFloaterReg::showInstance("prefs_graphics_advanced");
    
    
    	LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
    	for (child_list_t::const_iterator iter = tabcontainer->getChildList()->begin();
    		 iter != tabcontainer->getChildList()->end(); ++iter)
    	{
    		LLView* view = *iter;
    		LLPanelPreferenceGraphics* panel = dynamic_cast<LLPanelPreferenceGraphics*>(view);
    		if (panel)
    		{
    			panel->resetDirtyChilds();
    		}
    	}
    
    void LLFloaterPreference::onClickActionChange()
    
    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))
    	{
    
    	}
    }
    
    void LLFloaterPreference::onLogChatHistorySaved()
    {
    	LLButton * delete_transcripts_buttonp = getChild<LLButton>("delete_transcripts");
    
    	if (!delete_transcripts_buttonp->getEnabled())
    	{
    		delete_transcripts_buttonp->setEnabled(true);
    	}
    }
    
    
    void LLFloaterPreference::updateClickActionSettings()
    {
    
    	const int single_clk_action = getChild<LLComboBox>("single_click_action_combo")->getValue().asInteger();
    	const int double_clk_action = getChild<LLComboBox>("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<LLComboBox>("single_click_action_combo")->setValue((int)click_to_walk);
    	getChild<LLComboBox>("double_click_action_combo")->setValue(dbl_click_to_teleport ? 2 : (int)dbl_click_to_walk);
    
    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<LLUICtrl>("cache_location");
    	cache_location_editor->setValue(location);
    	cache_location_editor->setToolTip(location);
    }
    
    void LLFloaterPreference::selectPanel(const LLSD& name)
    {
    	LLTabContainer * tab_containerp = getChild<LLTabContainer>("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<LLButton>("clear_log")->setEnabled(LLConversationLog::instance().getConversations().size() > 0);
    
    
    	// set 'enable' property for 'Delete transcripts...' button
    	updateDeleteTranscriptsButton();
    
    
    void LLFloaterPreference::saveGraphicsPreset(std::string& preset)
    {
    	mSavedGraphicsPreset = preset;
    }
    
    
    //------------------------------Updater---------------------------------------
    
    static bool handleBandwidthChanged(const LLSD& newvalue)
    {
    	gViewerThrottle.setMaxBandwidth((F32) newvalue.asReal());
    	return true;
    }
    
    class LLPanelPreference::Updater : public LLEventTimer
    {
    
    public:
    
    	typedef boost::function<bool(const LLSD&)> 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;
    };
    
    //----------------------------------------------------------------------------
    
    static LLPanelInjector<LLPanelPreference> t_places("panel_preference");
    
    LLPanelPreference::LLPanelPreference()
    
    	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));
    
    //virtual
    BOOL LLPanelPreference::postBuild()
    {
    
    	////////////////////// PanelGeneral ///////////////////
    
    	{
    		BOOL use_people_api = gSavedSettings.getBOOL("UsePeopleAPI");
    		LLCheckBoxCtrl* ctrl_display_name = getChild<LLCheckBoxCtrl>("display_names_check");
    		ctrl_display_name->setEnabled(use_people_api);
    		if (!use_people_api)
    		{
    			ctrl_display_name->setValue(FALSE);
    		}
    	}
    
    
    	////////////////////// PanelVoice ///////////////////
    
    James Cook's avatar
    James Cook committed
    	{
    
    		BOOL voice_disabled = gSavedSettings.getBOOL("CmdLineDisableVoice");
    
    		getChildView("voice_unavailable")->setVisible( voice_disabled);
    		getChildView("enable_voice_check")->setVisible( !voice_disabled);
    
    	}
    	
    	//////////////////////PanelSkins ///////////////////
    	
    
    	{
    		LLFloaterPreference::refreshSkin(this);
    
    		// if skin is set to a skin that no longer exists (silver) set back to default
    		if (getChild<LLRadioGroup>("skin_selection")->getSelectedIndex() < 0)
    
    James Cook's avatar
    James Cook committed
    		{
    
    			gSavedSettings.setString("SkinCurrent", "default");
    
    			LLFloaterPreference::refreshSkin(this);
    
    James Cook's avatar
    James Cook committed
    		}
    
    James Cook's avatar
    James Cook committed
    	}
    
    	//////////////////////PanelPrivacy ///////////////////
    
    	{
    		bool media_enabled = gSavedSettings.getBOOL("AudioStreamingMedia");
    
    		getChild<LLCheckBoxCtrl>("media_enabled")->set(media_enabled);
    		getChild<LLCheckBoxCtrl>("autoplay_enabled")->setEnabled(media_enabled);
    	}
    
    	{
    		getChild<LLCheckBoxCtrl>("music_enabled")->set(gSavedSettings.getBOOL("AudioStreamingMusic"));
    
    	if (hasChild("voice_call_friends_only_check", TRUE))
    
    	{
    		getChild<LLCheckBoxCtrl>("voice_call_friends_only_check")->setCommitCallback(boost::bind(&showFriendsOnlyWarning, _1, _2));
    	}
    
    	if (hasChild("allow_multiple_viewer_check", TRUE))
    	{
    		getChild<LLCheckBoxCtrl>("allow_multiple_viewer_check")->setCommitCallback(boost::bind(&showMultipleViewersWarning, _1, _2));
    	}
    
    		getChild<LLCheckBoxCtrl>("favorites_on_login_check")->setCommitCallback(boost::bind(&handleFavoritesOnLoginChanged, _1, _2));
    
    		bool show_favorites_at_login = LLPanelLogin::getShowFavorites();
    		getChild<LLCheckBoxCtrl>("favorites_on_login_check")->setValue(show_favorites_at_login);
    
    	if (hasChild("mute_chb_label", TRUE))
    	{
    		getChild<LLTextBox>("mute_chb_label")->setShowCursorHand(false);
    
    		getChild<LLTextBox>("mute_chb_label")->setSoundFlags(LLView::MOUSE_UP);
    
    		getChild<LLTextBox>("mute_chb_label")->setClickedCallback(boost::bind(&toggleMuteWhenMinimized));
    	}
    
    	//////////////////////PanelAdvanced ///////////////////
    
    	{
    		//localizing if push2talk button is set to middle mouse
    
    		std::string modifier_value = getChild<LLUICtrl>("modifier_combo")->getValue().asString();
    		if (MIDDLE_MOUSE_CV == modifier_value)
    
    			getChild<LLUICtrl>("modifier_combo")->setValue(getString("middle_mouse"));
    
    		else if (MOUSE_BUTTON_4_CV == modifier_value)
    		{
    			getChild<LLUICtrl>("modifier_combo")->setValue(getString("button4_mouse"));
    		}
    		else if (MOUSE_BUTTON_5_CV == modifier_value)
    		{
    			getChild<LLUICtrl>("modifier_combo")->setValue(getString("button5_mouse"));
    		}
    
    	//////////////////////PanelSetup ///////////////////
    
    Paul ProductEngine's avatar
    Paul ProductEngine committed
    		mBandWidthUpdater = new LLPanelPreference::Updater(boost::bind(&handleBandwidthChanged, _1), BANDWIDTH_UPDATER_TIMEOUT);
    
    		gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&LLPanelPreference::Updater::update, mBandWidthUpdater, _2));
    	}
    
    
    #ifdef EXTERNAL_TOS
    	LLRadioGroup* ext_browser_settings = getChild<LLRadioGroup>("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
    
    
    LLPanelPreference::~LLPanelPreference()
    {
    	if (mBandWidthUpdater)
    	{
    		delete mBandWidthUpdater;
    	}
    }
    
    void LLPanelPreference::apply()
    
    	LLFloater* advanced = LLFloaterReg::findTypedInstance<LLFloater>("prefs_graphics_advanced");
    
    
    	// Save the value of all controls in the hierarchy
    	mSavedValues.clear();
    	std::list<LLView*> 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<LLColorSwatchCtrl *>(curview);
    		if (color_swatch)
    		{
    			mSavedColors[color_swatch->getName()] = color_swatch->get();
    		}
    		else
    
    			LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(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);
    		}
    
    James Cook's avatar
    James Cook committed
    
    
    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");
    	}
    }
    
    
    void LLPanelPreference::handleFavoritesOnLoginChanged(LLUICtrl* checkbox, const LLSD& value)
    
    		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<LLFloaterPreference>("preferences");
    	if (instance)
    	{
    		instance->getChild<LLCheckBoxCtrl>("mute_when_minimized")->setBtnFocus();
    	}
    
    void LLPanelPreference::cancel()
    
    James Cook's avatar
    James Cook committed
    {
    
    	for (control_values_map_t::iterator iter =  mSavedValues.begin();
    		 iter !=  mSavedValues.end(); ++iter)
    
    James Cook's avatar
    James Cook committed
    	{
    
    		LLControlVariable* control = iter->first;
    		LLSD ctrl_value = iter->second;
    
    
    		if((control->getName() == "InstantMessageLogPath") && (ctrl_value.asString() == ""))
    		{
    			continue;
    		}
    
    
    		control->set(ctrl_value);
    
    James Cook's avatar
    James Cook committed
    	}
    
    
    	for (string_color_map_t::iterator iter = mSavedColors.begin();
    		 iter != mSavedColors.end(); ++iter)
    	{
    		LLColorSwatchCtrl* color_swatch = findChild<LLColorSwatchCtrl>(iter->first);
    
    		if (color_swatch)
    
    		{
    			color_swatch->set(iter->second);
    			color_swatch->onCommit();
    		}
    	}
    
    James Cook's avatar
    James Cook committed
    }
    
    void LLPanelPreference::setControlFalse(const LLSD& user_data)
    
    	std::string control_name = user_data.asString();
    	LLControlVariable* control = findControl(control_name);
    	
    	if (control)
    		control->set(LLSD(FALSE));
    
    }
    
    void LLPanelPreference::updateMediaAutoPlayCheckbox(LLUICtrl* ctrl)
    {
    	std::string name = ctrl->getName();
    
    	// Disable "Allow Media to auto play" only when both
    	// "Streaming Music" and "Media" are unchecked. STORM-513.
    	if ((name == "enable_music") || (name == "enable_media"))
    	{
    		bool music_enabled = getChild<LLCheckBoxCtrl>("enable_music")->get();
    		bool media_enabled = getChild<LLCheckBoxCtrl>("enable_media")->get();
    
    
    		getChild<LLCheckBoxCtrl>("media_auto_play_combo")->setEnabled(music_enabled || media_enabled);
    
    void LLPanelPreference::deletePreset(const LLSD& user_data)
    
    	std::string subdirectory = user_data.asString();
    	LLFloaterReg::showInstance("delete_pref_preset", subdirectory);
    
    void LLPanelPreference::savePreset(const LLSD& user_data)
    
    	std::string subdirectory = user_data.asString();
    	LLFloaterReg::showInstance("save_pref_preset", subdirectory);
    }
    
    
    void LLPanelPreference::loadPreset(const LLSD& user_data)
    
    {
    	std::string subdirectory = user_data.asString();
    
    	LLFloaterReg::showInstance("load_pref_preset", subdirectory);
    
    void LLPanelPreference::setHardwareDefaults()
    {
    }
    
    
    class LLPanelPreferencePrivacy : public LLPanelPreference
    {
    public:
    	LLPanelPreferencePrivacy()
    	{
    		mAccountIndependentSettings.push_back("VoiceCallsFriendsOnly");
    		mAccountIndependentSettings.push_back("AutoDisengageMic");
    	}
    
    	/*virtual*/ void saveSettings()
    	{
    		LLPanelPreference::saveSettings();
    
    		// Don't save (=erase from the saved values map) per-account privacy settings
    		// if we're not logged in, otherwise they will be reset to defaults on log off.
    		if (LLStartUp::getStartupState() != STATE_STARTED)
    		{
    			// Erase only common settings, assuming there are no color settings on Privacy page.
    			for (control_values_map_t::iterator it = mSavedValues.begin(); it != mSavedValues.end(); )
    			{
    				const std::string setting = it->first->getName();
    
    				if (find(mAccountIndependentSettings.begin(),
    
    					mAccountIndependentSettings.end(), setting) == mAccountIndependentSettings.end())
    				{
    					mSavedValues.erase(it++);
    				}
    				else
    				{
    					++it;
    				}
    			}
    		}
    	}
    
    private:
    	std::list<std::string> mAccountIndependentSettings;
    };
    
    
    static LLPanelInjector<LLPanelPreferenceGraphics> t_pref_graph("panel_preference_graphics");
    static LLPanelInjector<LLPanelPreferencePrivacy> t_pref_privacy("panel_preference_privacy");
    
    	LLFloaterReg::showInstance("prefs_graphics_advanced");
    	LLFloaterReg::hideInstance("prefs_graphics_advanced");
    
    
    	LLPresetsManager* presetsMgr = LLPresetsManager::getInstance();
        presetsMgr->setPresetListChangeCallback(boost::bind(&LLPanelPreferenceGraphics::onPresetsListChange, this));
        presetsMgr->createMissingDefault(); // a no-op after the first time, but that's ok
        
    
    void LLPanelPreferenceGraphics::onPresetsListChange()
    {
    
    	resetDirtyChilds();
    	setPresetText();
    
    
    	LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
    	if (instance && !gSavedSettings.getString("PresetGraphicActive").empty())
    	{
    		instance->saveSettings(); //make cancel work correctly after changing the preset
    	}
    
    AndreyL ProductEngine's avatar
    AndreyL ProductEngine committed
    		std::string dummy;
    		instance->saveGraphicsPreset(dummy);
    
    void LLPanelPreferenceGraphics::setPresetText()
    
    	LLTextBox* preset_text = getChild<LLTextBox>("preset_text");
    
    
    	std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive");
    
    
    	if (!preset_graphic_active.empty() && preset_graphic_active != preset_text->getText())
    
    		LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
    		if (instance)
    		{
    			instance->saveGraphicsPreset(preset_graphic_active);
    		}
    
        if (hasDirtyChilds() && !preset_graphic_active.empty())
    
    		gSavedSettings.setString("PresetGraphicActive", "");
    
    		preset_graphic_active.clear();
    
    		// This doesn't seem to cause an infinite recursion.  This trigger is needed to cause the pulldown
    		// panel to update.
    		LLPresetsManager::getInstance()->triggerChangeSignal();
    
    	if (!preset_graphic_active.empty())
    	{
    
    		if (preset_graphic_active == PRESETS_DEFAULT)
    		{
    
    			preset_graphic_active = LLTrans::getString(PRESETS_DEFAULT);
    
    		preset_text->setText(preset_graphic_active);
    	}
    	else
    	{
    		preset_text->setText(LLTrans::getString("none_paren_cap"));
    
    bool LLPanelPreferenceGraphics::hasDirtyChilds()
    {
    
    	LLFloater* advanced = LLFloaterReg::findTypedInstance<LLFloater>("prefs_graphics_advanced");
    
    	std::list<LLView*> 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();
    
    		LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview);
    		if (ctrl)
    		{
    
    			if (ctrl->isDirty())
    
    				LLControlVariable* control = ctrl->getControlVariable();
    				if (control)
    				{
    					std::string control_name = control->getName();
    					if (!control_name.empty())
    					{
    						return true;
    					}
    				}
    
    		}
    		// 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);
    		}
    
    	return false;
    }
    
    void LLPanelPreferenceGraphics::resetDirtyChilds()
    {
    
    	LLFloater* advanced = LLFloaterReg::findTypedInstance<LLFloater>("prefs_graphics_advanced");
    
    	std::list<LLView*> 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();
    
    		LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview);
    		if (ctrl)
    		{
    			ctrl->resetDirty();
    		}
    		// 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 LLPanelPreferenceGraphics::cancel()
    {
    	LLPanelPreference::cancel();
    }
    void LLPanelPreferenceGraphics::saveSettings()
    {
    	resetDirtyChilds();
    
    Mnikolenko ProductEngine's avatar
    Mnikolenko ProductEngine committed
    	std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive");
    	if (preset_graphic_active.empty())
    
    	{
    		LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
    		if (instance)
    		{
    			//don't restore previous preset after closing Preferences
    
    Mnikolenko ProductEngine's avatar
    Mnikolenko ProductEngine committed
    			instance->saveGraphicsPreset(preset_graphic_active);
    
    	LLPanelPreference::saveSettings();
    }
    void LLPanelPreferenceGraphics::setHardwareDefaults()
    {
    	resetDirtyChilds();
    }
    
    //------------------------LLPanelPreferenceControls--------------------------------
    static LLPanelInjector<LLPanelPreferenceControls> t_pref_contrls("panel_preference_controls");
    
    LLPanelPreferenceControls::LLPanelPreferenceControls()
        :LLPanelPreference(),
        mEditingIndex(-1),
        mEditingColumn(-1),
        mEditingMode(0),
        mShowKeyDialog(false)
    
    LLPanelPreferenceControls::~LLPanelPreferenceControls()
    {
    }
    
    andreykproductengine's avatar
    andreykproductengine committed
    
    BOOL LLPanelPreferenceControls::postBuild()
    {
        //todo: add pitch/yaw?
        //todo: should be auto-expandable with menu items and should pull names from menu when possible
    
    
        // populate list of controls
        pControlsTable = getChild<LLScrollListCtrl>("controls_list");
    
        pKeyModeBox = getChild<LLComboBox>("key_mode");
    
    andreykproductengine's avatar
    andreykproductengine committed
    
        pControlsTable->setCommitCallback(boost::bind(&LLPanelPreferenceControls::onListCommit, this));
    
        pKeyModeBox->setCommitCallback(boost::bind(&LLPanelPreferenceControls::onModeCommit, this));
        getChild<LLButton>("restore_defaults")->setCommitCallback(boost::bind(&LLPanelPreferenceControls::onRestoreDefaults, this));
    
    // Something of a workaround: cells don't handle clicks, so we catch a click, then process it on hover.
    BOOL LLPanelPreferenceControls::handleHover(S32 x, S32 y, MASK mask)
    {
    
        /*S32 column = pControlsTable->getColumnIndexFromOffset(x);
        LLScrollListItem* item = pControlsTable->hitItem(x, y);