diff options
36 files changed, 211 insertions, 110 deletions
| diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index aa7c8c789a..0fc5ca1ad6 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -168,8 +168,8 @@ U8* LLImageBase::allocateData(S32 size)  		}  		else  		{ -		llerrs << "LLImageBase::allocateData: bad size: " << size << llendl; -	} +			llerrs << "LLImageBase::allocateData: bad size: " << size << llendl; +		}  	}  	if (!mData || size != mDataSize)  	{ @@ -267,10 +267,6 @@ LLImageRaw::LLImageRaw(U16 width, U16 height, S8 components)  {  	mMemType = LLMemType::MTYPE_IMAGERAW;  	//llassert( S32(width) * S32(height) * S32(components) <= MAX_IMAGE_DATA_SIZE ); -	if(S32(width) * S32(height) * S32(components) > MAX_IMAGE_DATA_SIZE) -	{ -		llwarns << "over size: width: " << (S32)width << " height: " << (S32)height << " components: " << (S32)components << llendl ; -	}  	allocateDataSize(width, height, components);  	++sRawImageCount;  } diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp index 3a1e9f19fa..237d42090f 100644 --- a/indra/llui/llaccordionctrl.cpp +++ b/indra/llui/llaccordionctrl.cpp @@ -68,8 +68,9 @@ LLAccordionCtrl::LLAccordionCtrl(const Params& params):LLPanel(params)   , mSelectedTab( NULL )   , mTabComparator( NULL )   , mNoVisibleTabsHelpText(NULL) + , mNoVisibleTabsOrigString(params.no_visible_tabs_text.initial_value().asString())  { -	initNoTabsWidget(params.empty_accordion_text); +	initNoTabsWidget(params.no_matched_tabs_text);  	mSingleExpansion = params.single_expansion;  	if(mFitParent && !mSingleExpansion) @@ -379,7 +380,7 @@ void	LLAccordionCtrl::initNoTabsWidget(const LLTextBox::Params& tb_params)  {  	LLTextBox::Params tp = tb_params;  	tp.rect(getLocalRect()); -	mNoVisibleTabsOrigString = tp.initial_value().asString(); +	mNoMatchedTabsOrigString = tp.initial_value().asString();  	mNoVisibleTabsHelpText = LLUICtrlFactory::create<LLTextBox>(tp, this);  } @@ -820,7 +821,7 @@ void	LLAccordionCtrl::setFilterSubString(const std::string& filter_string)  {  	LLStringUtil::format_map_t args;  	args["[SEARCH_TERM]"] = LLURI::escape(filter_string); -	std::string text = filter_string.empty() ? LLStringUtil::null : mNoVisibleTabsOrigString; +	std::string text = filter_string.empty() ? mNoVisibleTabsOrigString : mNoMatchedTabsOrigString;  	LLStringUtil::format(text, args);  	mNoVisibleTabsHelpText->setValue(text); diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h index 677b598a32..3ad5274085 100644 --- a/indra/llui/llaccordionctrl.h +++ b/indra/llui/llaccordionctrl.h @@ -78,12 +78,14 @@ public:  								accordion tabs are responsible for scrolling their content.  								*NOTE fit_parent works best when combined with single_expansion.  								Accordion view should implement getRequiredRect() and provide valid height*/ -		Optional<LLTextBox::Params>	empty_accordion_text; +		Optional<LLTextBox::Params>	no_matched_tabs_text; +		Optional<LLTextBox::Params>	no_visible_tabs_text;  		Params()  			: single_expansion("single_expansion",false)  			, fit_parent("fit_parent", false) -			, empty_accordion_text("empty_accordion_text") +			, no_matched_tabs_text("no_matched_tabs_text") +			, no_visible_tabs_text("no_visible_tabs_text")  		{};  	}; @@ -180,6 +182,8 @@ private:  	bool			mAutoScrolling;  	F32				mAutoScrollRate;  	LLTextBox*		mNoVisibleTabsHelpText; + +	std::string		mNoMatchedTabsOrigString;  	std::string		mNoVisibleTabsOrigString;  	LLAccordionCtrlTab*		mSelectedTab; diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 5b70e4bcb0..fe6bd8eef0 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -6609,7 +6609,7 @@        <key>Type</key>        <string>S32</string>        <key>Value</key> -      <integer>35</integer> +      <integer>12</integer>      </map>      <key>RenderAvatarVP</key>      <map> diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index de4d787d65..e8591ca086 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -26,7 +26,7 @@ list all  RenderAnisotropic			1	0  RenderAvatarCloth			1	1  RenderAvatarLODFactor		1	1.0 -RenderAvatarMaxVisible      1   35 +RenderAvatarMaxVisible      1   12  RenderAvatarVP				1	1  RenderCubeMap				1	1  RenderDelayVBUpdate			1	0 diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index adda7cec4d..779490c9f7 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -26,7 +26,7 @@ list all  RenderAnisotropic			1	0  RenderAvatarCloth			1	1  RenderAvatarLODFactor		1	1.0 -RenderAvatarMaxVisible      1   35 +RenderAvatarMaxVisible      1   12  RenderAvatarVP				1	1  RenderCubeMap				1	1  RenderDelayVBUpdate			1	0 diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index 82886d7e2c..47033efc47 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -26,7 +26,7 @@ list all  RenderAnisotropic				1	0  RenderAvatarCloth				0	0  RenderAvatarLODFactor			1	1.0 -RenderAvatarMaxVisible          1   35 +RenderAvatarMaxVisible          1   12  RenderAvatarVP					1	0  RenderCubeMap					1	1  RenderDelayVBUpdate				1	0 diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index e19a1294c8..52a5587a16 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -654,7 +654,15 @@ bool LLWearableHoldingPattern::pollMissingWearables()  	if (done)  	{  		gAgentAvatarp->debugWearablesLoaded(); -		clearCOFLinksForMissingWearables(); + +		// BAP - if we don't call clearCOFLinksForMissingWearables() +		// here, we won't have to add the link back in later if the +		// wearable arrives late.  This is to avoid corruption of +		// wearable ordering info.  Also has the effect of making +		// unworn item links visible in the COF under some +		// circumstances. + +		//clearCOFLinksForMissingWearables();  		onAllComplete();  	}  	return done; @@ -700,8 +708,13 @@ void LLWearableHoldingPattern::handleLateArrivals()  				data.mWearable = wearable;  				replaced_types.insert(data.mWearableType); -				 -				LLAppearanceMgr::instance().addCOFItemLink(data.mItemID,false); + +				// BAP - if we didn't call +				// clearCOFLinksForMissingWearables() earlier, we +				// don't need to restore the link here.  Fixes +				// wearable ordering problems. + +				// LLAppearanceMgr::instance().addCOFItemLink(data.mItemID,false);  				// BAP failing this means inventory or asset server  				// are corrupted in a way we don't handle. diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index f4004d5664..7be69ba04d 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -412,7 +412,7 @@ static void settings_to_globals()  	LLVolumeImplFlexible::sUpdateFactor = gSavedSettings.getF32("RenderFlexTimeFactor");  	LLVOTree::sTreeFactor				= gSavedSettings.getF32("RenderTreeLODFactor");  	LLVOAvatar::sLODFactor				= gSavedSettings.getF32("RenderAvatarLODFactor"); -	LLVOAvatar::sMaxVisible				= gSavedSettings.getS32("RenderAvatarMaxVisible"); +	LLVOAvatar::sMaxVisible				= (U32)gSavedSettings.getS32("RenderAvatarMaxVisible");  	LLVOAvatar::sVisibleInFirstPerson	= gSavedSettings.getBOOL("FirstPersonAvatarVisible");  	// clamp auto-open time to some minimum usable value  	LLFolderView::sAutoOpenTime			= llmax(0.25f, gSavedSettings.getF32("FolderAutoOpenDelay")); diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp index 87b8d807c4..abb79b53a7 100644 --- a/indra/newview/llavatariconctrl.cpp +++ b/indra/newview/llavatariconctrl.cpp @@ -244,7 +244,10 @@ void LLAvatarIconCtrl::setValue(const LLSD& value)  		LLIconCtrl::setValue(value);  	} -	gCacheName->get(mAvatarId, FALSE, boost::bind(&LLAvatarIconCtrl::nameUpdatedCallback, this, _1, _2, _3, _4)); +	if  (gCacheName) +	{ +		gCacheName->get(mAvatarId, FALSE, boost::bind(&LLAvatarIconCtrl::nameUpdatedCallback, this, _1, _2, _3, _4)); +	}  }  bool LLAvatarIconCtrl::updateFromCache() diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index 880d79222b..46d2e0a5db 100644 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -576,7 +576,9 @@ void LLCOFWearables::clear()  LLAssetType::EType LLCOFWearables::getExpandedAccordionAssetType()  { -	static std::map<std::string, LLAssetType::EType> type_map; +	typedef std::map<std::string, LLAssetType::EType> type_map_t; + +	static type_map_t type_map;  	static LLAccordionCtrl* accordion_ctrl = getChild<LLAccordionCtrl>("cof_wearables_accordion");  	if (type_map.empty()) @@ -587,14 +589,16 @@ LLAssetType::EType LLCOFWearables::getExpandedAccordionAssetType()  	}  	const LLAccordionCtrlTab* tab = accordion_ctrl->getExpandedTab(); +	LLAssetType::EType result = LLAssetType::AT_NONE; -	if (!tab) +	if (tab)  	{ -		llwarns << "No accordion is expanded" << llendl; -		return LLAssetType::AT_NONE; +		type_map_t::iterator i = type_map.find(tab->getName()); +		llassert(i != type_map.end()); +		result = i->second;  	} -	return type_map[tab->getName()]; +	return result;  }  void LLCOFWearables::onListRightClick(LLUICtrl* ctrl, S32 x, S32 y, LLListContextMenu* menu) diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 56bc4a7933..4bd3151f2e 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -135,10 +135,10 @@ BOOL LLFloaterAbout::postBuild()  	// Render the LLSD from getInfo() as a format_map_t  	LLStringUtil::format_map_t args; -	// For reasons I don't yet understand, [ReleaseNotes] is not part of the -	// default substitution strings whereas [APP_NAME] is. But it works to -	// simply copy it into these specific args. + +	// allow the "Release Notes" URL label to be localized  	args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes"); +  	for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap());  		 ii != iend; ++ii)  	{ @@ -293,14 +293,14 @@ LLSD LLFloaterAbout::getInfo()  static std::string get_viewer_release_notes_url()  { -	LLSD query; -	query["channel"] = gSavedSettings.getString("VersionChannelName"); -	query["version"] = LLVersionInfo::getVersion(); - -	std::ostringstream url; -	url << LLTrans::getString("RELEASE_NOTES_BASE_URL") << LLURI::mapToQueryString(query); - -	return LLWeb::escapeURL(url.str()); +	// return a URL to the release notes for this viewer, such as: +	// http://wiki.secondlife.com/wiki/Release_Notes/Second Life Beta Viewer/2.1.0 +	std::string url = LLTrans::getString("RELEASE_NOTES_BASE_URL"); +	if (! LLStringUtil::endsWith(url, "/")) +		url += "/"; +	url += gSavedSettings.getString("VersionChannelName") + "/"; +	url += LLVersionInfo::getShortVersion(); +	return LLWeb::escapeURL(url);  }  class LLFloaterAboutListener: public LLEventAPI diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 68fc86467c..de24bd92d0 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -335,24 +335,34 @@ void show_item_profile(const LLUUID& item_uuid)  void show_item_original(const LLUUID& item_uuid)  { +	//sidetray inventory panel +	LLSidepanelInventory *sidepanel_inventory = +		dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory")); +  	bool reset_inventory_filter = !LLSideTray::getInstance()->isPanelActive("sidepanel_inventory");  	LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(); -	if (!active_panel) return; +	if (!active_panel)  +	{ +		//this may happen when there is no floatera and other panel is active in inventory tab + +		if	(sidepanel_inventory) +		{ +			sidepanel_inventory->showInventoryPanel(); +		} +	} +	 +	active_panel = LLInventoryPanel::getActiveInventoryPanel(); +	if (!active_panel)  +	{ +		return; +	}  	active_panel->setSelection(gInventory.getLinkedItemID(item_uuid), TAKE_FOCUS_NO);  	if(reset_inventory_filter)  	{ -		LLSidepanelInventory *sidepanel_inventory = -			dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory")); -		if(sidepanel_inventory) -		{ -			LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel(); - -			main_inventory->onFilterEdit(""); -		} - -		//now for inventory floater +		//inventory floater +		bool floater_inventory_visible = false;  		LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");  		for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) @@ -364,8 +374,19 @@ void show_item_original(const LLUUID& item_uuid)  				main_inventory->onFilterEdit("");  			} + +			if(floater_inventory->getVisible()) +			{ +				floater_inventory_visible = true; +			} +  		} +		if(sidepanel_inventory && !floater_inventory_visible) +		{ +			LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel(); +			main_inventory->onFilterEdit(""); +		}  	}  } diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp index 23ea786484..384b24210c 100644 --- a/indra/newview/llinventoryitemslist.cpp +++ b/indra/newview/llinventoryitemslist.cpp @@ -288,6 +288,8 @@ void LLPanelInventoryListItemBase::setIconImage(const LLUIImagePtr& image)  void LLPanelInventoryListItemBase::setTitle(const std::string& title, const std::string& highlit_text)  { +	setToolTip(title); +  	LLTextUtil::textboxSetHighlightedVal(  		mTitleCtrl,  		LLStyle::Params(), @@ -295,6 +297,16 @@ void LLPanelInventoryListItemBase::setTitle(const std::string& title, const std:  		highlit_text);  } +BOOL LLPanelInventoryListItemBase::handleToolTip( S32 x, S32 y, MASK mask) +{ +	LLTextBox* item_name = getChild<LLTextBox>("item_name"); +	if (item_name->getRect().getWidth() < item_name->getTextPixelWidth()) +	{ +		return LLPanel::handleToolTip(x,y,mask); +	} +	return FALSE; +} +  void LLPanelInventoryListItemBase::reshapeLeftWidgets()  {  	S32 widget_left = 0; diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h index d6132717e8..489a82829c 100644 --- a/indra/newview/llinventoryitemslist.h +++ b/indra/newview/llinventoryitemslist.h @@ -179,6 +179,10 @@ protected:  	/** Set item title - inventory item name usually */  	virtual void setTitle(const std::string& title, const std::string& highlit_text); +	/** +	 * Show tool tip if item name text size > panel size +	 */ +	virtual BOOL handleToolTip( S32 x, S32 y, MASK mask);  	LLViewerInventoryItem* mItem; diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index f16d1d8fda..6dd800c0c6 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -1450,7 +1450,7 @@ void LLPanelPeople::showFriendsAccordionsIfNeeded()  		LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");  		accordion->arrange(); -		// *TODO: new empty_accordion_text attribute was implemented in accordion (EXT-7368). +		// *TODO: new no_matched_tabs_text attribute was implemented in accordion (EXT-7368).  		// this code should be refactored to use it  		// keep help text in a synchronization with accordions visibility.  		updateFriendListHelpText(); diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 494cba8c6f..1048e3fcc0 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -648,16 +648,18 @@ void LLTeleportHistoryPanel::refresh()  	LLDate tab_boundary_date =  LLDate::now();  	LLFlatListView* curr_flat_view = NULL; +	std::string filter_string = sFilterSubString; +	LLStringUtil::toUpper(filter_string);  	U32 added_items = 0;  	while (mCurrentItem >= 0)  	{  		// Filtering -		if (!sFilterSubString.empty()) +		if (!filter_string.empty())  		{  			std::string landmark_title(items[mCurrentItem].mTitle);  			LLStringUtil::toUpper(landmark_title); -			if( std::string::npos == landmark_title.find(sFilterSubString) ) +			if( std::string::npos == landmark_title.find(filter_string) )  			{  				mCurrentItem--;  				continue; @@ -706,7 +708,7 @@ void LLTeleportHistoryPanel::refresh()  				.getFlatItemForPersistentItem(&mContextMenu,  											  items[mCurrentItem],  											  mCurrentItem, -											  sFilterSubString); +											  filter_string);  			if ( !curr_flat_view->addItem(item, LLUUID::null, ADD_BOTTOM, false) )  				llerrs << "Couldn't add flat item to teleport history." << llendl;  			if (mLastSelectedItemIndex == mCurrentItem) @@ -729,6 +731,8 @@ void LLTeleportHistoryPanel::refresh()  		}  	} +	mHistoryAccordion->setFilterSubString(sFilterSubString); +  	mHistoryAccordion->arrange();  	updateVerbs(); diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index fc5143d33b..63b6fe5ef0 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -88,6 +88,8 @@ BOOL LLSidepanelInventory::postBuild()  		mPanelMainInventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");  		mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2)); +		LLTabContainer* tabs = mPanelMainInventory->getChild<LLTabContainer>("inventory filter tabs"); +		tabs->setCommitCallback(boost::bind(&LLSidepanelInventory::updateVerbs, this));  		/*   		   EXT-4846 : "Can we suppress the "Landmarks" and "My Favorites" folder since they have their own Task Panel?" diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h index a038f99853..13275d14c0 100644 --- a/indra/newview/llsidepanelinventory.h +++ b/indra/newview/llsidepanelinventory.h @@ -54,6 +54,10 @@ public:  	LLPanelMainInventory* getMainInventoryPanel() const { return mPanelMainInventory; }  	BOOL isMainInventoryPanelActive() const; +	void showItemInfoPanel(); +	void showTaskInfoPanel(); +	void showInventoryPanel(); +  protected:  	// Tracks highlighted (selected) item in inventory panel.  	LLInventoryItem *getSelectedItem(); @@ -63,9 +67,6 @@ protected:  	void performActionOnSelection(const std::string &action);  	bool canShare(); -	void showItemInfoPanel(); -	void showTaskInfoPanel(); -	void showInventoryPanel();  	void updateVerbs();  	// diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp index ff7e479368..0df7035f84 100644 --- a/indra/newview/llslurl.cpp +++ b/indra/newview/llslurl.cpp @@ -48,8 +48,9 @@ const char* LLSLURL::SLURL_COM		         = "slurl.com";  // text with www.slurl.com or a link explicitly pointing at www.slurl.com so testing for this  // version is required also. -const char* LLSLURL::WWW_SLURL_COM		 = "www.slurl.com"; -const char* LLSLURL::MAPS_SECONDLIFE_COM	 = "maps.secondlife.com";	 +const char* LLSLURL::WWW_SLURL_COM				 = "www.slurl.com"; +const char* LLSLURL::SECONDLIFE_COM				 = "secondlife.com"; +const char* LLSLURL::MAPS_SECONDLIFE_COM		 = "maps.secondlife.com";  const char* LLSLURL::SLURL_X_GRID_LOCATION_INFO_SCHEME = "x-grid-location-info";  const char* LLSLURL::SLURL_APP_PATH              = "app";  const char* LLSLURL::SLURL_REGION_PATH           = "region"; @@ -187,6 +188,15 @@ LLSLURL::LLSLURL(const std::string& slurl)  		   (slurl_uri.scheme() == LLSLURL::SLURL_HTTPS_SCHEME) ||   		   (slurl_uri.scheme() == LLSLURL::SLURL_X_GRID_LOCATION_INFO_SCHEME))  		{ +			// *HACK: ignore http://secondlife.com/ URLs so that we can use +			// http://secondlife.com/app/ redirect URLs +			// This is only necessary while the server returns Release Note +			// urls using this format rather that pointing to the wiki +			if ((slurl_uri.scheme() == LLSLURL::SLURL_HTTP_SCHEME || +				 slurl_uri.scheme() == LLSLURL::SLURL_HTTPS_SCHEME) && +				slurl_uri.hostName() == LLSLURL::SECONDLIFE_COM) +			  return; +  		    // We're dealing with either a Standalone style slurl or slurl.com slurl  		  if ((slurl_uri.hostName() == LLSLURL::SLURL_COM) ||  		      (slurl_uri.hostName() == LLSLURL::WWW_SLURL_COM) ||  diff --git a/indra/newview/llslurl.h b/indra/newview/llslurl.h index 1210c398f1..e9b0e7f52a 100644 --- a/indra/newview/llslurl.h +++ b/indra/newview/llslurl.h @@ -47,6 +47,7 @@ public:  	static const char* SLURL_SECONDLIFE_PATH;  	static const char* SLURL_COM;  	static const char* WWW_SLURL_COM; +	static const char* SECONDLIFE_COM;  	static const char* MAPS_SECONDLIFE_COM;  	static const char* SLURL_X_GRID_LOCATION_INFO_SCHEME;  	static LLSLURL START_LOCATION; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index df5be34e39..3ef190f766 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -1116,8 +1116,6 @@ bool idle_startup()  				LLVoiceClient::getInstance()->userAuthorized(gUserCredential->userID(), gAgentID);  				// create the default proximal channel  				LLVoiceChannel::initClass(); -				// update the voice settings -				LLVoiceClient::getInstance()->updateSettings();  				LLGridManager::getInstance()->setFavorite();   				LLStartUp::setStartupState( STATE_WORLD_INIT);  			} @@ -1300,6 +1298,10 @@ bool idle_startup()              LLAppViewer::instance()->loadNameCache();  		} +		// update the voice settings *after* gCacheName initialization +		// so that we can construct voice UI that relies on the name cache +		LLVoiceClient::getInstance()->updateSettings(); +  		//gCacheName is required for nearby chat history loading  		//so I just moved nearby history loading a few states further  		if (!gNoRender && gSavedPerAccountSettings.getBOOL("LogShowHistory")) diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 52d227f827..ceed90e210 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -582,14 +582,26 @@ bool LLTextureFetchWorker::doWork(S32 param)  {  	LLMutexLock lock(&mWorkMutex); -	if ((mFetcher->isQuitting() || mImagePriority < 1.0f || getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) +	if ((mFetcher->isQuitting() || getFlags(LLWorkerClass::WCF_DELETE_REQUESTED)))  	{  		if (mState < DECODE_IMAGE)  		{  			return true; // abort  		}  	} -	 +	if(mImagePriority < 1.0f) +	{ +		if (mState == INIT || mState == LOAD_FROM_NETWORK || mState == LOAD_FROM_SIMULATOR) +		{ +			return true; // abort +		} +	} +	if(mState > CACHE_POST && !mCanUseNET && !mCanUseHTTP) +	{ +		//nowhere to get data, abort. +		return true ; +	} +  	if (mFetcher->mDebugPause)  	{  		return false; // debug: don't do any work @@ -777,7 +789,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  			}  			// don't return, fall through to next state  		} -		else if (mSentRequest == UNSENT) +		else if (mSentRequest == UNSENT && mCanUseNET)  		{  			// Add this to the network queue and sit here.  			// LLTextureFetch::update() will send off a request which will change our state @@ -830,6 +842,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  	if (mState == SEND_HTTP_REQ)  	{ +		if(mCanUseHTTP)  		{  			const S32 HTTP_QUEUE_MAX_SIZE = 8;  			// *TODO: Integrate this with llviewerthrottle @@ -895,6 +908,10 @@ bool LLTextureFetchWorker::doWork(S32 param)  			}  			// fall through  		} +		else //can not use http fetch. +		{ +			return true ; //abort +		}  	}  	if (mState == WAIT_HTTP_REQ) diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 3482ac508e..ab6ff88073 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -597,7 +597,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		LLPipeline::sFastAlpha = gSavedSettings.getBOOL("RenderFastAlpha");  		LLPipeline::sUseFarClip = gSavedSettings.getBOOL("RenderUseFarClip"); -		LLVOAvatar::sMaxVisible = gSavedSettings.getS32("RenderAvatarMaxVisible"); +		LLVOAvatar::sMaxVisible = (U32)gSavedSettings.getS32("RenderAvatarMaxVisible");  		LLPipeline::sDelayVBUpdate = gSavedSettings.getBOOL("RenderDelayVBUpdate");  		S32 occlusion = LLPipeline::sUseOcclusion; @@ -699,8 +699,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		// Doing this here gives hardware occlusion queries extra time to complete  		LLAppViewer::instance()->pingMainloopTimeout("Display:UpdateImages");  		LLError::LLCallStacks::clear() ; -		llpushcallstacks ; - +		  		{  			LLMemType mt_iu(LLMemType::MTYPE_DISPLAY_IMAGE_UPDATE);  			LLFastTimer t(FTM_IMAGE_UPDATE); @@ -718,7 +717,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  			LLImageGL::deleteDeadTextures();  			stop_glerror();  		} -		llpushcallstacks ;  		///////////////////////////////////  		//  		// StateSort diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index eb0d4cb8ae..179002d2a8 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -595,7 +595,7 @@ LLVOAvatarSkeletonInfo* LLVOAvatar::sAvatarSkeletonInfo = NULL;  LLVOAvatar::LLVOAvatarXmlInfo* LLVOAvatar::sAvatarXmlInfo = NULL;  LLVOAvatarDictionary *LLVOAvatar::sAvatarDictionary = NULL;  S32 LLVOAvatar::sFreezeCounter = 0; -S32 LLVOAvatar::sMaxVisible = 50; +U32 LLVOAvatar::sMaxVisible = 12;  F32 LLVOAvatar::sRenderDistance = 256.f;  S32	LLVOAvatar::sNumVisibleAvatars = 0;  S32	LLVOAvatar::sNumLODChangesThisFrame = 0; @@ -3173,23 +3173,23 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  		{ // muted avatars update at 16 hz  			mUpdatePeriod = 16;  		} -		else if (visible && mVisibilityRank <= LLVOAvatar::sMaxVisible * 0.25f) +		else if (visible && mVisibilityRank <= LLVOAvatar::sMaxVisible)  		{ //first 25% of max visible avatars are not impostored  			mUpdatePeriod = 1;  		} -		else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 0.75f) -		{ //back 25% of max visible avatars are slow updating impostors -			mUpdatePeriod = 8; -		} -		else if (visible && mVisibilityRank > (U32) LLVOAvatar::sMaxVisible) +		else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 4)  		{ //background avatars are REALLY slow updating impostors  			mUpdatePeriod = 16;  		} +		else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 3) +		{ //back 25% of max visible avatars are slow updating impostors +			mUpdatePeriod = 8; +		}  		else if (visible && mImpostorPixelArea <= impostor_area)  		{  // stuff in between gets an update period based on pixel area  			mUpdatePeriod = llclamp((S32) sqrtf(impostor_area*4.f/mImpostorPixelArea), 2, 8);  		} -		else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 0.25f) +		else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible)  		{ // force nearby impostors in ultra crowded areas  			mUpdatePeriod = 2;  		} diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index b30cce09f6..4259bb8e73 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -223,8 +223,8 @@ public:  public:  	static S32		sRenderName;  	static BOOL		sRenderGroupTitles; -	static S32		sMaxVisible; -	static F32		sRenderDistance; //distance at which avatars will render (affected by control "RenderAvatarMaxVisible") +	static U32		sMaxVisible; //(affected by control "RenderAvatarMaxVisible") +	static F32		sRenderDistance; //distance at which avatars will render.  	static BOOL		sShowAnimationDebug; // show animation debug info  	static BOOL		sUseImpostors; //use impostors for far away avatars  	static BOOL		sShowFootPlane;	// show foot collision plane reported by server diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index 5e9c4dcec8..ea0c5f1d0f 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -647,6 +647,7 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu  	// *TODO: eliminate multiple traversals over the menu items  	setMenuItemVisible(menu, "wear_add",			mask == MASK_CLOTHING && n_worn == 0); +	setMenuItemEnabled(menu, "wear_add",			n_items == 1 && canAddWearable(ids.front()));  	setMenuItemVisible(menu, "wear",				n_worn == 0);  	setMenuItemVisible(menu, "edit",				!standalone && mask & (MASK_CLOTHING|MASK_BODYPART));  	setMenuItemEnabled(menu, "edit",				n_editable == 1 && n_worn == 1 && n_items == 1); @@ -740,4 +741,23 @@ void LLWearableItemsList::ContextMenu::createNewWearable(const LLUUID& item_id)  	LLAgentWearables::createWearable(item->getWearableType(), true);  } +// Can we wear another wearable of the given item's wearable type? +// static +bool LLWearableItemsList::ContextMenu::canAddWearable(const LLUUID& item_id) +{ +	if (!gAgentWearables.areWearablesLoaded()) +	{ +		return false; +	} + +	LLViewerInventoryItem* item = gInventory.getItem(item_id); +	if (!item || item->getType() != LLAssetType::AT_CLOTHING) +	{ +		return false; +	} + +	U32 wearable_count = gAgentWearables.getWearableCount(item->getWearableType()); +	return wearable_count < LLAgentWearables::MAX_CLOTHING_PER_TYPE; +} +  // EOF diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index fe859075c4..69134dd646 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -342,6 +342,7 @@ public:  		static void setMenuItemEnabled(LLContextMenu* menu, const std::string& name, bool val);  		static void updateMask(U32& mask, LLAssetType::EType at);  		static void createNewWearable(const LLUUID& item_id); +		static bool canAddWearable(const LLUUID& item_id);  		LLWearableItemsList*	mParent;  	}; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index cc65b34a61..ee3a2fc34f 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -2207,7 +2207,6 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)  	//LLVertexBuffer::unbind();  	grabReferences(result); -	llpushcallstacks ;  	for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)  	{  		LLSpatialGroup* group = *iter; @@ -2225,7 +2224,6 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)  			}  		}  	} -	llpushcallstacks ;  	for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)  	{  		LLSpatialGroup* group = *iter; @@ -2241,7 +2239,6 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)  		}  	} -	llpushcallstacks ;  	if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD)  	{  		for (LLCullResult::bridge_list_t::iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i) @@ -2268,12 +2265,13 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)  			}  		}  	} - +	llpushcallstacks ;	  	{  		LLFastTimer ftm(FTM_CLIENT_COPY);  		LLVertexBuffer::clientCopy();  	} - +	llpushcallstacks ; +	  	postSort(camera);  	llpushcallstacks ;  } @@ -7117,7 +7115,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  			skip_avatar_update = TRUE;  		} -		llpushcallstacks ;  		if (!skip_avatar_update)  		{  			gAgentAvatarp->updateAttachmentVisibility(CAMERA_MODE_THIRD_PERSON); @@ -7216,7 +7213,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  										(1 << LLPipeline::RENDER_TYPE_WL_SKY));  					static LLCullResult result;  					updateCull(camera, result); -					llpushcallstacks ;  					stateSort(camera, result);  					mRenderTypeMask = tmp & ((1 << LLPipeline::RENDER_TYPE_SKY) |  										(1 << LLPipeline::RENDER_TYPE_CLOUDS) | @@ -7251,7 +7247,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  					LLGLUserClipPlane clip_plane(plane, mat, projection);  					LLGLDisable cull(GL_CULL_FACE);  					updateCull(camera, ref_result, 1); -					llpushcallstacks ;  					stateSort(camera, ref_result);  				} @@ -7308,7 +7303,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  				LLGLUserClipPlane clip_plane(LLPlane(-pnorm, -(pd+pad)), mat, projection);  				static LLCullResult result;  				updateCull(camera, result, water_clip); -				llpushcallstacks ;  				stateSort(camera, result);  				gGL.setColorMask(true, true); @@ -7347,7 +7341,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  		{  			gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode());  		} -		llpushcallstacks ;  	}  } diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml index c1e5ae50e6..a59070496e 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml @@ -48,7 +48,7 @@             mouse_opaque="true"             name="cof_tab"             start_folder="Current Outfit" -           use_label_suffix="false"  +           use_label_suffix="true"              width="315" />     </tab_container>  	 <panel @@ -130,4 +130,4 @@        width="152" />  	 </panel> -</panel>
\ No newline at end of file +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml index 5c9ae51a48..d0c44c4328 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_list.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml @@ -14,7 +14,8 @@       background_visible="true"       bg_alpha_color="DkGray2"       bg_opaque_color="DkGray2" -     empty_accordion_text.value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]." +     no_matched_tabs_text.value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]." +     no_visible_tabs_text.value="There are no any outfits. Try [secondlife:///app/search/all/ Search]."       follows="all"       height="400"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index da28773c74..b79ef1e287 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -173,7 +173,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M         		 background_visible="true"         		 bg_alpha_color="DkGray2"         		 bg_opaque_color="DkGray2" -             empty_accordion_text.value=""               follows="all"               height="356"               layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index 266fd6cb5e..f4694180a1 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -372,29 +372,17 @@      decimal_digits="0"      follows="left|top"      height="16" -    increment="2" -    initial_value="35" -    label="Max. avatar draw distance:" +    increment="1" +    initial_value="12" +    label="Max. # of non-impostor avatars:"      label_width="185"      layout="topleft"      left_delta="0"      max_val="65"      min_val="1" -    name="MaxAvatarDrawDistance" +    name="MaxNumberAvatarDrawn"      top_pad="4"      width="290" /> -    <text -    type="string" -    length="1" -    follows="left|top" -    height="12" -    layout="topleft" -    left_delta="291" -    name="DrawDistanceMeterText3" -    top_delta="0" -    width="128"> -      m -    </text>  		<slider  		control_name="RenderGlowResolutionPow"  		decimal_digits="0" diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml index 21addb8e6f..daa4356c83 100644 --- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml @@ -5,14 +5,16 @@       background_visible="true"       bg_alpha_color="DkGray">           <accordion +     no_matched_tabs_text.value="Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search]." +     no_visible_tabs_text.value="Teleport history is empty. Try [secondlife:///app/search/places/ Search]."       follows="left|top|right|bottom"       height="373"       layout="topleft"       left="3"       top="0"       name="history_accordion" -   background_visible="true" -   bg_alpha_color="DkGray2" +     background_visible="true" +     bg_alpha_color="DkGray2"       width="307">  	    <accordion_tab           layout="topleft" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 294267d43b..68eea8dc9a 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -136,7 +136,7 @@  	<string name="RetrievingData">Retrieving...</string>  	<string name="ReleaseNotes">Release Notes</string> -	<string name="RELEASE_NOTES_BASE_URL">http://secondlife.com/app/releasenotes/</string> +	<string name="RELEASE_NOTES_BASE_URL">http://wiki.secondlife.com/wiki/Release_Notes/</string>  	<!-- Indicates something is being loaded. Maybe should be merged with RetrievingData -->  	<string name="LoadingData">Loading...</string> diff --git a/indra/newview/skins/default/xui/en/widgets/accordion.xml b/indra/newview/skins/default/xui/en/widgets/accordion.xml index 05d7447a6f..19f8234389 100644 --- a/indra/newview/skins/default/xui/en/widgets/accordion.xml +++ b/indra/newview/skins/default/xui/en/widgets/accordion.xml @@ -3,12 +3,16 @@   height="100"   name="accordion"   width="200"> -    <empty_accordion_text +    <no_matched_tabs_text       follows="all"       height="100"       h_pad="10" -     name="no_visible_items_msg" +     name="no_matched_tabs_msg"       v_pad="15"       width="200"       wrap="true "/> +    <!-- This widget will not be created in viewer. Only its value will be used for empty accordion without filter. --> +    <no_visible_tabs_text +     name="no_visible_tabs_msg" +     visible="false"/>  </accordion> | 
