diff options
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/app_settings/settings_per_account.xml | 11 | ||||
| -rw-r--r-- | indra/newview/llfavoritesbar.cpp | 9 | ||||
| -rwxr-xr-x | indra/newview/llfloaterpreference.cpp | 50 | ||||
| -rw-r--r-- | indra/newview/llfloaterpreference.h | 6 | ||||
| -rw-r--r-- | indra/newview/llpanellogin.cpp | 90 | ||||
| -rw-r--r-- | indra/newview/llpanellogin.h | 2 | ||||
| -rw-r--r-- | indra/newview/llviewerinventory.cpp | 106 | ||||
| -rw-r--r-- | indra/newview/llviewerinventory.h | 1 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/notifications.xml | 10 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_login.xml | 19 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_preferences_privacy.xml | 14 | 
11 files changed, 294 insertions, 24 deletions
| diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index 705c73cbf7..8efec1cff0 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -160,6 +160,17 @@          <key>Value</key>              <integer>0</integer>          </map> +      <key>ShowFavoritesOnLogin</key> +        <map> +        <key>Comment</key> +             <string>Determines whether favorites of last logged in user will be saved on exit from viewer and shown on login screen</string> +        <key>Persist</key> +             <integer>1</integer> +        <key>Type</key> +             <string>Boolean</string> +        <key>Value</key> +             <integer>0</integer> +        </map>      <!-- End of back compatibility settings -->      </map>  </llsd> diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 0c0fdd5572..0b17d64eb0 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -607,6 +607,15 @@ void LLFavoritesBarCtrl::changed(U32 mask)  	}	  	else  	{ +		LLInventoryModel::item_array_t items; +		LLInventoryModel::cat_array_t cats; +		LLIsType is_type(LLAssetType::AT_LANDMARK); +		gInventory.collectDescendentsIf(mFavoriteFolderId, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); +		 +		for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) +		{ +			(*i)->getSLURL(); +		}  		updateButtons();  	}  } diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 2d2e66f6d4..8c9dfe435a 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -105,6 +105,7 @@  #include "llteleporthistorystorage.h"  #include "lllogininstance.h"        // to check if logged in yet +#include "llsdserialize.h"  const F32 MAX_USER_FAR_CLIP = 512.f;  const F32 MIN_USER_FAR_CLIP = 64.f; @@ -284,7 +285,8 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)  	mGotPersonalInfo(false),  	mOriginalIMViaEmail(false),  	mLanguageChanged(false), -	mDoubleClickActionDirty(false) +	mDoubleClickActionDirty(false), +	mFavoritesRecordMayExist(false)  {  	//Build Floater is now Called from 	LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>); @@ -541,6 +543,34 @@ void LLFloaterPreference::apply()  		updateDoubleClickSettings();  		mDoubleClickActionDirty = false;  	} + +	if (mFavoritesRecordMayExist && !gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin")) +	{ +		removeFavoritesRecordOfUser();		 +	} +} + +void LLFloaterPreference::removeFavoritesRecordOfUser() +{ +	mFavoritesRecordMayExist = false; +	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); +	LLSD fav_llsd; +	llifstream file; +	file.open(filename); +	if (!file.is_open()) return; +	LLSDSerialize::fromXML(fav_llsd, file); +	 +	LLAvatarName av_name; +	LLAvatarNameCache::get( gAgentID, &av_name ); +	if (fav_llsd.has(av_name.getLegacyName())) +	{ +		fav_llsd.erase(av_name.getLegacyName()); +	} +	 +	llofstream out_file; +	out_file.open(filename); +	LLSDSerialize::toPrettyXML(fav_llsd, out_file); +  }  void LLFloaterPreference::cancel() @@ -626,6 +656,11 @@ void LLFloaterPreference::onOpen(const LLSD& key)  		getChildView("maturity_desired_combobox")->setVisible( false);  	} +	if (LLStartUp::getStartupState() == STATE_STARTED) +	{ +		mFavoritesRecordMayExist = gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin"); +	} +  	// Forget previous language changes.  	mLanguageChanged = false; @@ -1339,6 +1374,7 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im  //	getChild<LLUICtrl>("busy_response")->setValue(gSavedSettings.getString("BusyModeResponse2")); +	getChildView("favorites_on_login_check")->setEnabled(TRUE);  	getChildView("log_nearby_chat")->setEnabled(TRUE);  	getChildView("log_instant_messages")->setEnabled(TRUE);  	getChildView("show_timestamps_check_im")->setEnabled(TRUE); @@ -1554,6 +1590,10 @@ BOOL LLPanelPreference::postBuild()  	{  		getChild<LLCheckBoxCtrl>("voice_call_friends_only_check")->setCommitCallback(boost::bind(&showFriendsOnlyWarning, _1, _2));  	} +	if (hasChild("favorites_on_login_check")) +	{ +		getChild<LLCheckBoxCtrl>("favorites_on_login_check")->setCommitCallback(boost::bind(&showFavoritesOnLoginWarning, _1, _2)); +	}  	// Panel Advanced  	if (hasChild("modifier_combo")) @@ -1621,6 +1661,14 @@ void LLPanelPreference::showFriendsOnlyWarning(LLUICtrl* checkbox, const LLSD& v  	}  } +void LLPanelPreference::showFavoritesOnLoginWarning(LLUICtrl* checkbox, const LLSD& value) +{ +	if (checkbox && checkbox->getValue()) +	{ +		LLNotificationsUtil::add("FavoritesOnLogin"); +	} +} +  void LLPanelPreference::cancel()  {  	for (control_values_map_t::iterator iter =  mSavedValues.begin(); diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 165de9f42d..784033ae95 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -159,6 +159,8 @@ public:  	void buildPopupLists();  	static void refreshSkin(void* data); +	// Remove record of current user's favorites from file on disk. +	void removeFavoritesRecordOfUser();  private:  	static std::string sSkin;  	// set true if state of double-click action checkbox or radio-group was changed by user @@ -169,6 +171,8 @@ private:  	bool mLanguageChanged;  	bool mOriginalHideOnlineStatus; +	// Record of current user's favorites may be stored in file on disk. +	bool mFavoritesRecordMayExist;  	std::string mDirectoryVisibility;  	LLAvatarData mAvatarProperties; @@ -192,6 +196,8 @@ public:  private:  	//for "Only friends and groups can call or IM me"  	static void showFriendsOnlyWarning(LLUICtrl*, const LLSD&); +	//for "Show my Favorite Landmarks at Login" +	static void showFavoritesOnLoginWarning(LLUICtrl* checkbox, const LLSD& value);  	typedef std::map<LLControlVariable*, LLSD> control_values_map_t;  	control_values_map_t mSavedValues; diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 5f89097c17..c143aff2d4 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -253,11 +253,67 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  	gResponsePtr = LLIamHereLogin::build( this );  	LLHTTPClient::head( LLGridManager::getInstance()->getLoginPage(), gResponsePtr ); -	 + +	// Show last logged in user favorites in "Start at" combo. +	addUsersWithFavoritesToUsername(); +	getChild<LLComboBox>("username_combo")->setTextChangedCallback(boost::bind(&LLPanelLogin::addFavoritesToStartLocation, this)); +  	updateLocationCombo(false);  } +void LLPanelLogin::addUsersWithFavoritesToUsername() +{ +	LLComboBox* combo = getChild<LLComboBox>("username_combo"); +	if (!combo) return; +	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); +	LLSD fav_llsd; +	llifstream file; +	file.open(filename); +	if (!file.is_open()) return; +	LLSDSerialize::fromXML(fav_llsd, file); +	for (LLSD::map_const_iterator iter = fav_llsd.beginMap(); +		iter != fav_llsd.endMap(); ++iter) +	{ +		combo->add(iter->first); +	} +} + +void LLPanelLogin::addFavoritesToStartLocation() +{ +	LLComboBox* combo = getChild<LLComboBox>("start_location_combo"); +	if (!combo) return; +	int num_items = combo->getItemCount(); +	for (int i = num_items - 1; i > 2; i--) +	{ +		combo->remove(i); +	} +	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); +	LLSD fav_llsd; +	llifstream file; +	file.open(filename); +	if (!file.is_open()) return; +	LLSDSerialize::fromXML(fav_llsd, file); +	for (LLSD::map_const_iterator iter = fav_llsd.beginMap(); +		iter != fav_llsd.endMap(); ++iter) +	{ +		if(iter->first != getChild<LLComboBox>("username_combo")->getSimple()) continue; +		combo->addSeparator(); +		LLSD user_llsd = iter->second; +		for (LLSD::array_const_iterator iter1 = user_llsd.beginArray(); +			iter1 != user_llsd.endArray(); ++iter1) +		{ +			std::string label = (*iter1)["name"].asString(); +			std::string value = (*iter1)["slurl"].asString(); +			if(label != "" && value != "") +			{ +				combo->add(label, value); +			} +		} +		break; +	} +} +  // force the size to be correct (XML doesn't seem to be sufficient to do this)  // (with some padding so the other login screen doesn't show through)  void LLPanelLogin::reshapeBrowser() @@ -393,13 +449,14 @@ void LLPanelLogin::giveFocus()  	if( sInstance )  	{  		// Grab focus and move cursor to first blank input field -		std::string username = sInstance->getChild<LLUICtrl>("username_edit")->getValue().asString(); +		std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();  		std::string pass = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString();  		BOOL have_username = !username.empty();  		BOOL have_pass = !pass.empty();  		LLLineEditor* edit = NULL; +		LLComboBox* combo = NULL;  		if (have_username && !have_pass)  		{  			// User saved his name but not his password.  Move @@ -409,7 +466,7 @@ void LLPanelLogin::giveFocus()  		else  		{  			// User doesn't have a name, so start there. -			edit = sInstance->getChild<LLLineEditor>("username_edit"); +			combo = sInstance->getChild<LLComboBox>("username_combo");  		}  		if (edit) @@ -417,6 +474,10 @@ void LLPanelLogin::giveFocus()  			edit->setFocus(TRUE);  			edit->selectAll();  		} +		else if (combo) +		{ +			combo->setFocus(TRUE); +		}  	}  } @@ -431,8 +492,8 @@ void LLPanelLogin::showLoginWidgets()  	// *TODO: Append all the usual login parameters, like first_login=Y etc.  	std::string splash_screen_url = LLGridManager::getInstance()->getLoginPage();  	web_browser->navigateTo( splash_screen_url, "text/html" ); -	LLUICtrl* username_edit = sInstance->getChild<LLUICtrl>("username_edit"); -	username_edit->setFocus(TRUE); +	LLUICtrl* username_combo = sInstance->getChild<LLUICtrl>("username_combo"); +	username_combo->setFocus(TRUE);  }  // static @@ -476,16 +537,17 @@ void LLPanelLogin::setFields(LLPointer<LLCredential> credential,  		    login_id += " ";  		    login_id += lastname;  	    } -		sInstance->getChild<LLUICtrl>("username_edit")->setValue(login_id);	 +		sInstance->getChild<LLComboBox>("username_combo")->setLabel(login_id);	  	}  	else if((std::string)identifier["type"] == "account")  	{ -		sInstance->getChild<LLUICtrl>("username_edit")->setValue((std::string)identifier["account_name"]);		 +		sInstance->getChild<LLComboBox>("username_combo")->setLabel((std::string)identifier["account_name"]);		  	}  	else  	{ -	  sInstance->getChild<LLUICtrl>("username_edit")->setValue(std::string());	 +	  sInstance->getChild<LLComboBox>("username_combo")->setLabel(std::string());	  	} +	sInstance->addFavoritesToStartLocation();  	// if the password exists in the credential, set the password field with  	// a filler to get some stars  	LLSD authenticator = credential->getAuthenticator(); @@ -533,7 +595,7 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,  		authenticator = credential->getAuthenticator();  	} -	std::string username = sInstance->getChild<LLUICtrl>("username_edit")->getValue().asString(); +	std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();  	LLStringUtil::trim(username);  	std::string password = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString(); @@ -625,15 +687,15 @@ BOOL LLPanelLogin::areCredentialFieldsDirty()  	}  	else  	{ -		std::string username = sInstance->getChild<LLUICtrl>("username_edit")->getValue().asString(); +		std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();  		LLStringUtil::trim(username);  		std::string password = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString(); -		LLLineEditor* ctrl = sInstance->getChild<LLLineEditor>("username_edit"); -		if(ctrl && ctrl->isDirty()) +		LLComboBox* combo = sInstance->getChild<LLComboBox>("username_combo"); +		if(combo && combo->isDirty())  		{  			return true;  		} -		ctrl = sInstance->getChild<LLLineEditor>("password_edit"); +		LLLineEditor* ctrl = sInstance->getChild<LLLineEditor>("password_edit");  		if(ctrl && ctrl->isDirty())   		{  			return true; @@ -873,7 +935,7 @@ void LLPanelLogin::onClickConnect(void *)  			return;  		}  		updateStartSLURL(); -		std::string username = sInstance->getChild<LLUICtrl>("username_edit")->getValue().asString(); +		std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();  		if(username.empty()) diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index 83e76a308b..1ef6539ecc 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -85,6 +85,8 @@ public:  private:  	friend class LLPanelLoginListener;  	void reshapeBrowser(); +	void addFavoritesToStartLocation(); +	void addUsersWithFavoritesToUsername();  	static void onClickConnect(void*);  	static void onClickNewAccount(void*);  //	static bool newAccountAlertCallback(const LLSD& notification, const LLSD& response); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 70696dc762..b3642a2c1e 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -48,6 +48,7 @@  #include "llinventorybridge.h"  #include "llinventorypanel.h"  #include "llfloaterinventory.h" +#include "lllandmarkactions.h"  #include "llviewerassettype.h"  #include "llviewerregion.h" @@ -59,7 +60,9 @@  #include "llcommandhandler.h"  #include "llviewermessage.h"  #include "llsidepanelappearance.h" +#include "llavatarnamecache.h"  #include "llavataractions.h" +#include "lllogininstance.h"  ///----------------------------------------------------------------------------  /// Helper class to store special inventory item names and their localized values. @@ -1416,6 +1419,8 @@ public:  	S32 getSortIndex(const LLUUID& inv_item_id);  	void removeSortIndex(const LLUUID& inv_item_id); +	void getSLURL(const LLUUID& asset_id); +  	/**  	 * Implementation of LLDestroyClass. Calls cleanup() instance method.  	 * @@ -1442,9 +1447,17 @@ private:  	void load();  	void save(); +	void saveFavoritesSLURLs(); + +	void onLandmarkLoaded(const LLUUID& asset_id, LLLandmark* landmark); +	void storeFavoriteSLURL(const LLUUID& asset_id, std::string& slurl); +  	typedef std::map<LLUUID, S32> sort_index_map_t;  	sort_index_map_t mSortIndexes; +	typedef std::map<LLUUID, std::string> slurls_map_t; +	slurls_map_t mSLURLs; +  	bool mIsDirty;  	struct IsNotInFavorites @@ -1499,10 +1512,27 @@ void LLFavoritesOrderStorage::removeSortIndex(const LLUUID& inv_item_id)  	mIsDirty = true;  } +void LLFavoritesOrderStorage::getSLURL(const LLUUID& asset_id) +{ +	slurls_map_t::iterator slurl_iter = mSLURLs.find(asset_id); +	if (slurl_iter != mSLURLs.end()) return; // SLURL for current landmark is already cached + +	LLLandmark* lm = gLandmarkList.getAsset(asset_id, +			boost::bind(&LLFavoritesOrderStorage::onLandmarkLoaded, this, asset_id, _1)); +	if (lm) +	{ +		onLandmarkLoaded(asset_id, lm); +	} +} +  // static  void LLFavoritesOrderStorage::destroyClass()  {  	LLFavoritesOrderStorage::instance().cleanup(); +	if (gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin")) +	{ +		LLFavoritesOrderStorage::instance().saveFavoritesSLURLs(); +	}  }  void LLFavoritesOrderStorage::load() @@ -1525,6 +1555,76 @@ void LLFavoritesOrderStorage::load()  	}  } +void LLFavoritesOrderStorage::saveFavoritesSLURLs() +{ +	// Do not change the file if we are not logged in yet. +	if (!LLLoginInstance::getInstance()->authSuccess()) return; +	 +	std::string user_dir = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, ""); +	if (user_dir.empty()) return; + +	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); +	llifstream in_file; +	in_file.open(filename); +	LLSD fav_llsd; +	if (in_file.is_open()) +	{ +		LLSDSerialize::fromXML(fav_llsd, in_file); +	} + +	const LLUUID fav_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); +	LLInventoryModel::cat_array_t cats; +	LLInventoryModel::item_array_t items; +	gInventory.collectDescendents(fav_id, cats, items, LLInventoryModel::EXCLUDE_TRASH); + +	LLSD user_llsd; +	for (LLInventoryModel::item_array_t::iterator it = items.begin(); it != items.end(); it++) +	{ +		LLSD value; +		value["name"] = (*it)->getName(); +		value["asset_id"] = (*it)->getAssetUUID(); + +		slurls_map_t::iterator slurl_iter = mSLURLs.find(value["asset_id"]); +		if (slurl_iter != mSLURLs.end()) +		{ +			value["slurl"] = slurl_iter->second; +			user_llsd[(*it)->getSortField()] = value; +		} +	} + +	LLAvatarName av_name; +	LLAvatarNameCache::get( gAgentID, &av_name ); +	fav_llsd[av_name.getLegacyName()] = user_llsd; + +	llofstream file; +	file.open(filename); +	LLSDSerialize::toPrettyXML(fav_llsd, file); +} + +void LLFavoritesOrderStorage::onLandmarkLoaded(const LLUUID& asset_id, LLLandmark* landmark) +{ +	if (!landmark) return; + +	LLVector3d pos_global; +	if (!landmark->getGlobalPos(pos_global)) +	{ +		// If global position was unknown on first getGlobalPos() call +		// it should be set for the subsequent calls. +		landmark->getGlobalPos(pos_global); +	} + +	if (!pos_global.isExactlyZero()) +	{ +		LLLandmarkActions::getSLURLfromPosGlobal(pos_global, +				boost::bind(&LLFavoritesOrderStorage::storeFavoriteSLURL, this, asset_id, _1)); +	} +} + +void LLFavoritesOrderStorage::storeFavoriteSLURL(const LLUUID& asset_id, std::string& slurl) +{ +	mSLURLs[asset_id] = slurl; +} +  void LLFavoritesOrderStorage::save()  {  	// nothing to save if clean @@ -1581,6 +1681,12 @@ S32 LLViewerInventoryItem::getSortField() const  void LLViewerInventoryItem::setSortField(S32 sortField)  {  	LLFavoritesOrderStorage::instance().setSortIndex(mUUID, sortField); +	getSLURL(); +} + +void LLViewerInventoryItem::getSLURL() +{ +	LLFavoritesOrderStorage::instance().getSLURL(mAssetUUID);  }  const LLPermissions& LLViewerInventoryItem::getPermissions() const diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 1af06a1be8..41542a4e0f 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -62,6 +62,7 @@ public:  	virtual const std::string& getName() const;  	virtual S32 getSortField() const;  	virtual void setSortField(S32 sortField); +	virtual void getSLURL(); //Caches SLURL for landmark. //*TODO: Find a better way to do it and remove this method from here.  	virtual const LLPermissions& getPermissions() const;  	virtual const bool getIsFullPerm() const; // 'fullperm' in the popular sense: modify-ok & copy-ok & transfer-ok, no special god rules applied  	virtual const LLUUID& getCreatorUUID() const; diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 63c030b068..3df53ac442 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -253,6 +253,16 @@ Save all changes to clothing/body parts?    <notification     icon="alertmodal.tga" +   name="FavoritesOnLogin" +   type="alertmodal">     +    Note: When you turn on this option, anyone who uses this computer can see your list of favorite locations. +    <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga"     name="GrantModifyRights"     type="alertmodal">  Granting modify rights to another Resident allows them to change, delete or take ANY objects you may have in-world. Be VERY careful when handing out this permission. diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 257ed799da..806182bcb4 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -61,23 +61,28 @@ left="20"  width="150">  Username:  </text> -<line_editor +<combo_box +allow_text_entry="true"  follows="left|bottom"  height="22" -label="bobsmith12 or Steller Sunshine"  left_delta="0" -max_length_bytes="63" -name="username_edit" -prevalidate_callback="ascii"  +max_chars="128" +prevalidate_callback="ascii"  select_on_focus="true"  tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine"  top_pad="0" -width="150" /> +name="username_combo" +width="178"> +  <combo_box.combo_button +   visible ="false"/> +  <combo_box.drop_down_button +   visible ="false"/> +</combo_box>  <text  follows="left|bottom"  font="SansSerifSmall"  height="15" -left_pad="8" +left_pad="-19"  name="password_text"  top="20"      width="150"> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index 16becbfe2a..ef25588ca3 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -78,6 +78,16 @@       name="auto_disengage_mic_check"       top_pad="10"       width="350" /> +    <check_box +     control_name="ShowFavoritesOnLogin" +     enabled="false"  +     height="16" +     label="Show my Favorite Landmarks at Login (via 'Start At' drop-down menu)" +     layout="topleft" +     left="30" +     name="favorites_on_login_check" +     top_pad="10" +     width="350" />  	<text        type="string"      length="1" @@ -87,7 +97,7 @@       left="30"       mouse_opaque="false"       name="Logs:" -     top_pad="30" +     top_pad="20"       width="350">          Chat Logs:      </text> @@ -179,7 +189,7 @@       layout="topleft"       left="30"       name="block_list" -     top_pad="35" +     top_pad="28"       width="145">          <!--<button.commit_callback           function="SideTray.ShowPanel"--> | 
