diff options
| author | Merov Linden <merov@lindenlab.com> | 2010-10-07 15:58:20 -0700 | 
|---|---|---|
| committer | Merov Linden <merov@lindenlab.com> | 2010-10-07 15:58:20 -0700 | 
| commit | c8cd7ef7a4da4482b776c37201b158a443dd737a (patch) | |
| tree | 521c6dc7af632dc9df64a69c18997eb091d68f20 | |
| parent | d1ad7a56beee603b336600d4aace1e4d4c0f5ade (diff) | |
| parent | d25a30e55b7e6a20173c3a53891489adc5610d72 (diff) | |
Pull update from viewer-development
32 files changed, 250 insertions, 64 deletions
| @@ -24,3 +24,5 @@ d40ac9dd949cba6dab1cc386da6a2027690c2519 alpha-5  d6781e22543acd7e21b967209f3c6e7003d380e3 fork to viewer-2-0  c6e6324f5be1401f077ad18a4a0f6b46451c2f7b last_sprint  7076e22f9f43f479a4ea75eac447a36364bead5a beta_2.1.3 +7076e22f9f43f479a4ea75eac447a36364bead5a 2.2.0-beta1 +9822eb3e25f7fe0c28ffd8aba45c507caa383cbc 2.2.0-beta2 diff --git a/doc/contributions.txt b/doc/contributions.txt index d8dec69269..d179c0fb8c 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -665,6 +665,7 @@ Techwolf Lupindo  	SNOW-681  	SNOW-685  	SNOW-690 +	SNOW-746  	VWR-12385  tenebrous pau  	VWR-247 diff --git a/indra/cmake/FindGoogleBreakpad.cmake b/indra/cmake/FindGoogleBreakpad.cmake new file mode 100644 index 0000000000..1a0493be5e --- /dev/null +++ b/indra/cmake/FindGoogleBreakpad.cmake @@ -0,0 +1,40 @@ +# -*- cmake -*- + +# - Find Google BreakPad +# Find the Google BreakPad includes and library +# This module defines +#  BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR, where to find exception_handler.h, etc. +#  BREAKPAD_EXCEPTION_HANDLER_LIBRARIES, the libraries needed to use Google BreakPad. +#  BREAKPAD_EXCEPTION_HANDLER_FOUND, If false, do not try to use Google BreakPad. +# also defined, but not for general use are +#  BREAKPAD_EXCEPTION_HANDLER_LIBRARY, where to find the Google BreakPad library. + +FIND_PATH(BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR google_breakpad/exception_handler.h) + +SET(BREAKPAD_EXCEPTION_HANDLER_NAMES ${BREAKPAD_EXCEPTION_HANDLER_NAMES} breakpad_client) +FIND_LIBRARY(BREAKPAD_EXCEPTION_HANDLER_LIBRARY +  NAMES ${BREAKPAD_EXCEPTION_HANDLER_NAMES} +  ) + +IF (BREAKPAD_EXCEPTION_HANDLER_LIBRARY AND BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR) +    SET(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES ${BREAKPAD_EXCEPTION_HANDLER_LIBRARY}) +    SET(BREAKPAD_EXCEPTION_HANDLER_FOUND "YES") +ELSE (BREAKPAD_EXCEPTION_HANDLER_LIBRARY AND BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR) +    SET(BREAKPAD_EXCEPTION_HANDLER_FOUND "NO") +ENDIF (BREAKPAD_EXCEPTION_HANDLER_LIBRARY AND BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR) + + +IF (BREAKPAD_EXCEPTION_HANDLER_FOUND) +   IF (NOT BREAKPAD_EXCEPTION_HANDLER_FIND_QUIETLY) +      MESSAGE(STATUS "Found Google BreakPad: ${BREAKPAD_EXCEPTION_HANDLER_LIBRARIES}") +   ENDIF (NOT BREAKPAD_EXCEPTION_HANDLER_FIND_QUIETLY) +ELSE (BREAKPAD_EXCEPTION_HANDLER_FOUND) +   IF (BREAKPAD_EXCEPTION_HANDLER_FIND_REQUIRED) +      MESSAGE(FATAL_ERROR "Could not find Google BreakPad library") +   ENDIF (BREAKPAD_EXCEPTION_HANDLER_FIND_REQUIRED) +ENDIF (BREAKPAD_EXCEPTION_HANDLER_FOUND) + +MARK_AS_ADVANCED( +  BREAKPAD_EXCEPTION_HANDLER_LIBRARY +  BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR +  ) diff --git a/indra/cmake/GoogleBreakpad.cmake b/indra/cmake/GoogleBreakpad.cmake index 8270c0fabb..7498674042 100644 --- a/indra/cmake/GoogleBreakpad.cmake +++ b/indra/cmake/GoogleBreakpad.cmake @@ -2,8 +2,8 @@  include(Prebuilt)  if (STANDALONE) -  MESSAGE(FATAL_ERROR "*TODO standalone support for google breakad is unimplemented") -  # *TODO - implement this include(FindGoogleBreakpad) +  set(BREAKPAD_EXCEPTION_HANDLER_FIND_REQUIRED ON) +  include(FindGoogleBreakpad)  else (STANDALONE)    use_prebuilt_binary(google_breakpad)    if (DARWIN) diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp index b7da5f4a1b..e28ef1f25d 100644 --- a/indra/llui/llaccordionctrltab.cpp +++ b/indra/llui/llaccordionctrltab.cpp @@ -141,6 +141,7 @@ LLAccordionCtrlTab::LLAccordionCtrlTabHeader::LLAccordionCtrlTabHeader(  	textboxParams.use_ellipses = true;  	textboxParams.bg_visible = false;  	textboxParams.mouse_opaque = false; +	textboxParams.parse_urls = false;  	mHeaderTextbox = LLUICtrlFactory::create<LLTextBox>(textboxParams);  	addChild(mHeaderTextbox);  } diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index f26711065a..65ef3e5f8f 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -499,7 +499,7 @@ void LLButton::onMouseEnter(S32 x, S32 y, MASK mask)  	if (isInEnabledChain())  		mNeedsHighlight = TRUE; -	} +}  void LLButton::onMouseLeave(S32 x, S32 y, MASK mask)  { diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 67b3c5cfce..30cd85619e 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -1060,12 +1060,12 @@ std::string LLNotificationChannel::summarize()  // LLNotifications implementation  // ---  LLNotifications::LLNotifications() : LLNotificationChannelBase(LLNotificationFilters::includeEverything, -															   LLNotificationComparators::orderByUUID()), -									mIgnoreAllNotifications(false) +							       LLNotificationComparators::orderByUUID()), +				     mIgnoreAllNotifications(false)  {  	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Notification.Show", boost::bind(&LLNotifications::addFromCallback, this, _2)); - -    mListener.reset(new LLNotificationsListener(*this)); +	 +	mListener.reset(new LLNotificationsListener(*this));  } diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index 4fe1687f0e..f075c44520 100644 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -504,7 +504,7 @@ public:  	std::string getLabel() const;  	std::string getURL() const;  	S32 getURLOption() const; -    S32 getURLOpenExternally() const; +	S32 getURLOpenExternally() const;  	const LLNotificationFormPtr getForm(); diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index b9ae976e58..79b0c63b38 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -49,6 +49,7 @@  #include "llfloaterpay.h"  #include "llfloaterworldmap.h"  #include "llgiveinventory.h" +#include "llinventorybridge.h"  #include "llinventorymodel.h"	// for gInventory.findCategoryUUIDForType  #include "llinventorypanel.h"  #include "llimview.h"			// for gIMMgr @@ -443,17 +444,27 @@ namespace action_give_inventory  	}  	/** -	 * Checks My Inventory visibility. +	 * @return active inventory panel, or NULL if there's no such panel  	 */ -	static bool is_give_inventory_acceptable() +	static LLInventoryPanel* get_active_inventory_panel()  	{  		LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);  		if (!active_panel)  		{  			active_panel = get_outfit_editor_inventory_panel(); -			if (!active_panel) return false;  		} +		return active_panel; +	} + +	/** +	 * Checks My Inventory visibility. +	 */ +	static bool is_give_inventory_acceptable() +	{ +		LLInventoryPanel* active_panel = get_active_inventory_panel(); +		if (!active_panel) return false; +  		// check selection in the panel  		const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList();  		if (inventory_selected_uuids.empty()) return false; // nothing selected @@ -543,12 +554,8 @@ namespace action_give_inventory  			return;  		} -		LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); -		if (!active_panel) -		{ -			active_panel = get_outfit_editor_inventory_panel(); -			if (!active_panel) return; -		} +		LLInventoryPanel* active_panel = get_active_inventory_panel(); +		if (!active_panel) return;  		const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList();  		if (inventory_selected_uuids.empty()) @@ -632,12 +639,8 @@ namespace action_give_inventory  		llassert(avatar_names.size() == avatar_uuids.size()); -		LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); -		if (!active_panel) -		{ -			active_panel = get_outfit_editor_inventory_panel(); -			if (!active_panel) return; -		} +		LLInventoryPanel* active_panel = get_active_inventory_panel(); +		if (!active_panel) return;  		const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList();  		if (inventory_selected_uuids.empty()) @@ -672,6 +675,53 @@ void LLAvatarActions::shareWithAvatars()  	LLNotificationsUtil::add("ShareNotification");  } + +// static +bool LLAvatarActions::canShareSelectedItems(LLInventoryPanel* inv_panel /* = NULL*/) +{ +	using namespace action_give_inventory; + +	if (!inv_panel) +	{ +		LLInventoryPanel* active_panel = get_active_inventory_panel(); +		if (!active_panel) return false; +		inv_panel = active_panel; +	} + +	// check selection in the panel +	LLFolderView* root_folder = inv_panel->getRootFolder(); +	const uuid_set_t inventory_selected_uuids = root_folder->getSelectionList(); +	if (inventory_selected_uuids.empty()) return false; // nothing selected + +	bool can_share = true; +	uuid_set_t::const_iterator it = inventory_selected_uuids.begin(); +	const uuid_set_t::const_iterator it_end = inventory_selected_uuids.end(); +	for (; it != it_end; ++it) +	{ +		LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it); +		// any category can be offered. +		if (inv_cat) +		{ +			continue; +		} + +		// check if inventory item can be given +		LLFolderViewItem* item = root_folder->getItemByID(*it); +		if (!item) return false; +		LLInvFVBridge* bridge = dynamic_cast<LLInvFVBridge*>(item->getListener()); +		if (bridge && bridge->canShare()) +		{ +			continue; +		} + +		// there are neither item nor category in inventory +		can_share = false; +		break; +	} + +	return can_share; +} +  // static  void LLAvatarActions::toggleBlock(const LLUUID& id)  { diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index 6313ae0759..44bd3778da 100644 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -34,6 +34,8 @@  #include <string>  #include <vector> +class LLInventoryPanel; +  /**   * Friend-related actions (add, remove, offer teleport, etc)   */ @@ -183,6 +185,15 @@ public:  	 */  	static bool canOfferTeleport(const uuid_vec_t& ids); +	/** +	 * Checks whether all items selected in the given inventory panel can be shared +	 * +	 * @param inv_panel Inventory panel to get selection from. If NULL, the active inventory panel is used. +	 * +	 * @return false if the selected items cannot be shared or the active inventory panel cannot be obtained +	 */ +	static bool canShareSelectedItems(LLInventoryPanel* inv_panel = NULL); +  private:  	static bool callbackAddFriend(const LLSD& notification, const LLSD& response);  	static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response); diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 33d006578d..29c2b7565e 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -770,7 +770,7 @@ void LLBottomTray::loadButtonsOrder()  	}  	// Nearbychat is not stored in order settings file, but it must be the first of the panels, so moving it  	// manually here -	mToolbarStack->movePanel(mNearbyChatBar, NULL, true); +	mToolbarStack->movePanel(mChatBarContainer, NULL, true);  }  void LLBottomTray::onDraggableButtonMouseUp(LLUICtrl* ctrl, S32 x, S32 y) @@ -1026,7 +1026,7 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width)  		processShrinkButtons(delta_width, buttons_freed_width);  	}  	// 3. Decreasing width of nearby chat. -	const S32 chatbar_panel_min_width = get_panel_min_width(mToolbarStack, mNearbyChatBar); +	const S32 chatbar_panel_min_width = get_panel_min_width(mToolbarStack, mChatBarContainer);  	const S32 chatbar_panel_width = mChatBarContainer->getRect().getWidth();  	if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width)  	{ diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index df0d22561e..e124263db5 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -565,7 +565,10 @@ void LLPanelLandGeneral::refresh()  		if (regionp)  		{  			insert_maturity_into_textbox(mContentRating, gFloaterView->getParentFloater(this), MATURITY); -			mLandType->setText(LLTrans::getString(regionp->getSimProductName())); + +			std::string land_type; +			bool is_land_type_localized = LLTrans::findString(land_type, regionp->getSimProductName()); +			mLandType->setText(is_land_type_localized ? land_type : regionp->getSimProductName());  		}  		// estate owner/manager cannot edit other parts of the parcel diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp index 4a324773e9..a1d291fea6 100644 --- a/indra/newview/llfloatermap.cpp +++ b/indra/newview/llfloatermap.cpp @@ -124,7 +124,9 @@ BOOL LLFloaterMap::postBuild()  BOOL LLFloaterMap::handleDoubleClick( S32 x, S32 y, MASK mask )  { -	LLFloaterReg::showInstance("world_map"); +	// If floater is minimized, minimap should be shown on doubleclick (STORM-299) +	std::string floater_to_show = this->isMinimized() ? "mini_map" : "world_map"; +	LLFloaterReg::showInstance(floater_to_show);  	return TRUE;  } diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index ff6df548c4..41f85ae29d 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -323,8 +323,9 @@ BOOL LLFloaterPreference::postBuild()  	if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))  		tabcontainer->selectFirstTab(); +	getChild<LLUICtrl>("cache_location")->setEnabled(FALSE); // make it read-only but selectable (STORM-227)  	std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""); -	getChild<LLUICtrl>("cache_location")->setValue(cache_location); +	setCacheLocation(cache_location);  	// if floater is opened before login set default localized busy message  	if (LLStartUp::getStartupState() < STATE_STARTED) @@ -414,7 +415,7 @@ void LLFloaterPreference::apply()  	fov_slider->setMaxValue(LLViewerCamera::getInstance()->getMaxView());  	std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""); -	getChild<LLUICtrl>("cache_location")->setValue(cache_location);		 +	setCacheLocation(cache_location);  	LLViewerMedia::setCookiesEnabled(getChild<LLUICtrl>("cookies_enabled")->getValue()); @@ -1310,6 +1311,12 @@ void LLFloaterPreference::getUIColor(LLUICtrl* ctrl, const LLSD& param)  	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); +}  //----------------------------------------------------------------------------  static LLRegisterPanelClassWrapper<LLPanelPreference> t_places("panel_preference"); diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index d1e15d5ab8..e99731b92e 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -103,6 +103,8 @@ protected:  public: +	void setCacheLocation(const LLStringExplicit& location); +  	void onClickSetCache();  	void onClickResetCache();  	void onClickSkin(LLUICtrl* ctrl,const LLSD& userdata); diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index c42b397252..5393678a6b 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -235,7 +235,7 @@ static bool isGroupUIVisible()  {  	static LLPanel* panel = 0;  	if(!panel) -		panel = LLSideTray::getInstance()->findChild<LLPanel>("panel_group_info_sidetray"); +		panel = LLSideTray::getInstance()->getPanel("panel_group_info_sidetray");  	if(!panel)  		return false;  	return panel->isInVisibleChain(); diff --git a/indra/newview/llnamebox.cpp b/indra/newview/llnamebox.cpp index 74d4217899..c31da84f78 100644 --- a/indra/newview/llnamebox.cpp +++ b/indra/newview/llnamebox.cpp @@ -47,6 +47,7 @@ LLNameBox::LLNameBox(const Params& p)  {  	mNameID = LLUUID::null;  	mLink = p.link; +	mParseHTML = mLink; // STORM-215  	mInitialValue = p.initial_value().asString();  	LLNameBox::sInstances.insert(this);  	setText(LLStringUtil::null); @@ -119,7 +120,7 @@ void LLNameBox::setName(const std::string& name, BOOL is_group)  		std::string url;  		if (is_group) -			url = "[secondlife:///app/group/" + LLURI::escape(name) + "/about " + name + "]"; +			url = "[secondlife:///app/group/" + mNameID.asString() + "/about " + name + "]";  		else  			url = "[secondlife:///app/agent/" + mNameID.asString() + "/about " + name + "]"; diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index 62ed7acb15..76b85d5bec 100644 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -597,7 +597,7 @@ void LLPanelGroup::showNotice(const std::string& subject,  //static  void LLPanelGroup::refreshCreatedGroup(const LLUUID& group_id)  { -	LLPanelGroup* panel = LLSideTray::getInstance()->findChild<LLPanelGroup>("panel_group_info_sidetray"); +	LLPanelGroup* panel = LLSideTray::getInstance()->getPanel<LLPanelGroup>("panel_group_info_sidetray");  	if(!panel)  		return;  	panel->setGroupID(group_id); @@ -612,7 +612,7 @@ void LLPanelGroup::showNotice(const std::string& subject,  					   const std::string& inventory_name,  					   LLOfferInfo* inventory_offer)  { -	LLPanelGroup* panel = LLSideTray::getInstance()->findChild<LLPanelGroup>("panel_group_info_sidetray"); +	LLPanelGroup* panel = LLSideTray::getInstance()->getPanel<LLPanelGroup>("panel_group_info_sidetray");  	if(!panel)  		return; diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index b09360a2d6..c4a484d368 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -1245,7 +1245,12 @@ void LLLandmarksPanel::doProcessParcelInfo(LLLandmark* landmark,  	landmark->getGlobalPos(landmark_global_pos);  	// let's toggle pick panel into  panel places -	LLPanel* panel_places =  LLSideTray::getInstance()->getChild<LLPanel>("panel_places");//-> sidebar_places +	LLPanel* panel_places =  LLSideTray::getInstance()->getPanel("panel_places");//-> sidebar_places +	if (!panel_places) +	{ +		llassert(NULL != panel_places); +		return; +	}  	panel_places->addChild(panel_pick);  	LLRect paren_rect(panel_places->getRect());  	panel_pick->reshape(paren_rect.getWidth(),paren_rect.getHeight(), TRUE); diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 23e96c22fa..31ea542743 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -182,8 +182,26 @@ void LLSidepanelInventory::performActionOnSelection(const std::string &action)  void LLSidepanelInventory::onWearButtonClicked()  { -	performActionOnSelection("wear"); -	performActionOnSelection("attach"); +	LLPanelMainInventory *panel_main_inventory = mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory"); +	if (!panel_main_inventory) +	{ +		llassert(panel_main_inventory != NULL); +		return; +	} + +	// Get selected items set. +	const std::set<LLUUID> selected_uuids_set = panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList(); +	if (selected_uuids_set.empty()) return; // nothing selected + +	// Convert the set to a vector. +	uuid_vec_t selected_uuids_vec; +	for (std::set<LLUUID>::const_iterator it = selected_uuids_set.begin(); it != selected_uuids_set.end(); ++it) +	{ +		selected_uuids_vec.push_back(*it); +	} + +	// Wear all selected items. +	wear_multiple(selected_uuids_vec, true);  }  void LLSidepanelInventory::onPlayButtonClicked() @@ -286,7 +304,7 @@ void LLSidepanelInventory::updateVerbs()  		case LLInventoryType::IT_OBJECT:  		case LLInventoryType::IT_ATTACHMENT:  			mWearBtn->setVisible(TRUE); -			mWearBtn->setEnabled(get_can_item_be_worn(item->getLinkedUUID())); +			mWearBtn->setEnabled(canWearSelected());  		 	mShopBtn->setVisible(FALSE);  			break;  		case LLInventoryType::IT_SOUND: @@ -311,18 +329,39 @@ bool LLSidepanelInventory::canShare()  	LLPanelMainInventory* panel_main_inventory =  		mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory"); -	LLFolderView* root_folder = -		panel_main_inventory->getActivePanel()->getRootFolder(); +	if (!panel_main_inventory) +	{ +		llwarns << "Failed to get the main inventory panel" << llendl; +		return false; +	} + +	LLInventoryPanel* active_panel = panel_main_inventory->getActivePanel(); +	// Avoid flicker in the Recent tab while inventory is being loaded. +	if (!active_panel->getRootFolder()->hasVisibleChildren()) return false; + +	return LLAvatarActions::canShareSelectedItems(active_panel); +} -	LLFolderViewItem* current_item = root_folder->hasVisibleChildren() -		? root_folder->getCurSelectedItem() -		: NULL; +bool LLSidepanelInventory::canWearSelected() +{ +	LLPanelMainInventory* panel_main_inventory = +		mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory"); -	LLInvFVBridge* bridge = current_item -		? dynamic_cast <LLInvFVBridge*> (current_item->getListener()) -		: NULL; +	if (!panel_main_inventory) +	{ +		llassert(panel_main_inventory != NULL); +		return false; +	} + +	std::set<LLUUID> selected_uuids = panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList(); +	for (std::set<LLUUID>::const_iterator it = selected_uuids.begin(); +		it != selected_uuids.end(); +		++it) +	{ +		if (!get_can_item_be_worn(*it)) return false; +	} -	return bridge ? bridge->canShare() : false; +	return true;  }  LLInventoryItem *LLSidepanelInventory::getSelectedItem() diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h index 4776dd7530..32c98bc034 100644 --- a/indra/newview/llsidepanelinventory.h +++ b/indra/newview/llsidepanelinventory.h @@ -65,6 +65,8 @@ protected:  	void performActionOnSelection(const std::string &action);  	void updateVerbs(); +	bool canWearSelected(); // check whether selected items can be worn +  	//  	// UI Elements  	// diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 521e5005e8..71f3b0e491 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -59,6 +59,8 @@ using namespace LLNotificationsUI;  static LLRootViewRegistry::Register<LLSideTray>	t1("side_tray");  static LLDefaultChildRegistry::Register<LLSideTrayTab>	t2("sidetray_tab"); +static const S32 BOTTOM_BAR_PAD = 5; +  static const std::string COLLAPSED_NAME = "<<";  static const std::string EXPANDED_NAME  = ">>"; @@ -318,6 +320,9 @@ void LLSideTrayTab::undock(LLFloater* floater_tab)  	floater_tab->setTitle(mTabTitle);  	floater_tab->setName(getName()); +	// Resize handles get obscured by added panel so move them to front. +	floater_tab->moveResizeHandlesToFront(); +  	// Reshape the floater if needed.  	LLRect floater_rect;  	if (floater_tab->hasSavedRect()) @@ -329,13 +334,18 @@ void LLSideTrayTab::undock(LLFloater* floater_tab)  	{  		// Detaching for the first time. Reshape the floater.  		floater_rect = side_tray->getLocalRect(); + +		// Reduce detached floater height by small BOTTOM_BAR_PAD not to make it flush with the bottom bar. +		floater_rect.mBottom += LLBottomTray::getInstance()->getRect().getHeight() + BOTTOM_BAR_PAD; +		floater_rect.makeValid();  		floater_tab->reshape(floater_rect.getWidth(), floater_rect.getHeight());  	}  	// Reshape the panel.  	{ -		LLRect panel_rect = floater_rect; +		LLRect panel_rect = floater_tab->getLocalRect();  		panel_rect.mTop -= floater_tab->getHeaderHeight(); +		panel_rect.makeValid();  		setRect(panel_rect);  		reshape(panel_rect.getWidth(), panel_rect.getHeight());  	} diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 4e79007c13..4c23a1920b 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -109,6 +109,22 @@ public:      LLPanel*	getPanel		(const std::string& panel_name);      LLPanel*	getActivePanel	();      bool		isPanelActive	(const std::string& panel_name); + +	/* +	 * get the panel of given type T (don't show it or do anything else with it) +	 */ +	template <typename T> +	T* getPanel(const std::string& panel_name) +	{ +		T* panel = dynamic_cast<T*>(getPanel(panel_name)); +		if (!panel) +		{ +			llwarns << "Child named \"" << panel_name << "\" of type " << typeid(T*).name() << " not found" << llendl; +			return NULL; +		} +		return panel; +	} +  	/*  	 * get currently active tab  	 */ diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 33c74e7465..26b7e0fb6d 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -6453,7 +6453,7 @@ void process_covenant_reply(LLMessageSystem* msg, void**)  	LLPanelLandCovenant::updateEstateOwnerName(owner_name);  	LLFloaterBuyLand::updateEstateOwnerName(owner_name); -	LLPanelPlaceProfile* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceProfile>("panel_place_profile"); +	LLPanelPlaceProfile* panel = LLSideTray::getInstance()->getPanel<LLPanelPlaceProfile>("panel_place_profile");  	if (panel)  	{  		panel->updateEstateName(estate_name); @@ -6587,7 +6587,7 @@ void onCovenantLoadComplete(LLVFS *vfs,  	LLPanelLandCovenant::updateCovenantText(covenant_text);  	LLFloaterBuyLand::updateCovenantText(covenant_text, asset_uuid); -	LLPanelPlaceProfile* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceProfile>("panel_place_profile"); +	LLPanelPlaceProfile* panel = LLSideTray::getInstance()->getPanel<LLPanelPlaceProfile>("panel_place_profile");  	if (panel)  	{  		panel->updateCovenantText(covenant_text); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 1ee3b84b5e..e69b0a2996 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -4814,7 +4814,7 @@ void LLPipeline::enableLightsFullbright(const LLColor4& color)  void LLPipeline::disableLights()  {  	enableLights(0); // no lighting (full bright) -	//glColor4f(1.f, 1.f, 1.f, 1.f); // lighting color = white by default +	glColor4f(1.f, 1.f, 1.f, 1.f); // lighting color = white by default  }  //============================================================================ diff --git a/indra/newview/skins/default/xui/en/panel_group_notify.xml b/indra/newview/skins/default/xui/en/panel_group_notify.xml index 6f271a757c..cded4cf31a 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notify.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notify.xml @@ -85,6 +85,7 @@       layout="topleft"       left="45"       name="attachment" +     parse_urls="false"       text_color="GroupNotifyTextColor"       value="Attachment"       use_ellipses="true" diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml index e0426c75b4..a48a9ce626 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -132,6 +132,7 @@                   height="18"                   layout="topleft"                   name="curr_outfit_name" +                 parse_urls="false"                   text_color="LtGray"                   top_pad="2"                   value="[Current Outfit]" diff --git a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml index de147908d8..43d580844f 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml @@ -52,6 +52,7 @@       layout="topleft"       left="110"       name="picture_name" +     parse_urls="false"       text_color="white"       top="9"       use_ellipses="true" diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml index 4f7c4fa9b2..978b204df9 100644 --- a/indra/newview/skins/default/xui/en/panel_picks.xml +++ b/indra/newview/skins/default/xui/en/panel_picks.xml @@ -106,18 +106,6 @@ bg_opaque_color="DkGray2"  		      user_resize="false"   		      auto_resize="true"  			  width="51"> -	            <button -	             enabled="false" -	             follows="bottom|left" -	             height="18" -	             image_selected="OptionsMenu_Press" -	             image_unselected="OptionsMenu_Off" -	             image_disabled="OptionsMenu_Disabled" -	             layout="topleft" -	             left="0" -	             name="gear_menu_btn" -	             top_pad="0" -	             width="18" />  				<button  	             follows="bottom|left"  	             height="18" @@ -125,9 +113,10 @@ bg_opaque_color="DkGray2"  	             image_selected="AddItem_Press"  	             image_unselected="AddItem_Off"  	             layout="topleft" -	             left_pad="15" +	             left="0"  	             name="new_btn"  	             tool_tip="Create a new pick or classified at the current location" +	             top="0"  	             width="18" />  		  </layout_panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index 879781f746..140d16e37f 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -195,7 +195,6 @@     control_name="CacheLocationTopFolder"     border_style="line"     border_thickness="1" -   enabled="false"     follows="left|top"     font="SansSerif"     height="23" diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml index c1c0f07304..b5839878d5 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml @@ -77,6 +77,7 @@ width="333">        font="SansSerifLargeBold"        height="20"        left="35" +      parse_urls="false"        text_color="White"        top="15"        use_ellipses="true" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 6b3fd9ff9e..8470d91b8c 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -321,6 +321,8 @@  	<!-- For land type back from the simulator -->  	<string name="Estate / Full Region">Estate / Full Region</string> +	<string name="Estate / Homestead">Estate / Homestead</string> +	<string name="Mainland / Homestead">Mainland / Homestead</string>  	<string name="Mainland / Full Region">Mainland / Full Region</string>  	<!-- File load/save dialogs --> | 
