diff options
| author | Tofu Linden <tofu.linden@lindenlab.com> | 2010-02-16 09:45:25 +0000 | 
|---|---|---|
| committer | Tofu Linden <tofu.linden@lindenlab.com> | 2010-02-16 09:45:25 +0000 | 
| commit | e3367fad368660bf40db29a82237475a9f2dfdbd (patch) | |
| tree | fae2860b9a165fcb2ee4b8834a8b7fac6ff691cf | |
| parent | c892ac9313071f3e00e680a0bda6441adcc0e405 (diff) | |
| parent | 481e26ae2db0415226a04eec3b3f05f9a246081d (diff) | |
PE merge.
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 4 | ||||
| -rw-r--r-- | indra/newview/llfolderview.cpp | 8 | ||||
| -rw-r--r-- | indra/newview/llgroupmgr.cpp | 20 | ||||
| -rw-r--r-- | indra/newview/llimfloater.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llimfloatercontainer.cpp | 8 | ||||
| -rw-r--r-- | indra/newview/lltoastnotifypanel.cpp | 130 | ||||
| -rw-r--r-- | indra/newview/lltoastnotifypanel.h | 8 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_outfit_save_as.xml | 1 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_notification.xml | 12 | 
9 files changed, 121 insertions, 76 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index d0c2f3cb34..c0cf8ec1ad 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -5055,7 +5055,9 @@      <map>        <key>Comment</key>        <string>Default width of buttons in the toast.  -      Note if required width will be less then this one, a button will be reshaped to default size , otherwise to required</string> +      Notes: +      If required width will be less then this one, a button will be reshaped to default size , otherwise to required +      Change of this parameter will affect the layout of buttons in notification toast.</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 8dbdfff635..d053933dfb 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -234,7 +234,7 @@ LLFolderView::LLFolderView(const Params& p)  	// Textbox  	LLTextBox::Params text_p; -	LLRect new_r(5, 13-50, 300, 0-50); +	LLRect new_r(5, 40, 300, 40-13);  	text_p.name(std::string(p.name));  	text_p.rect(new_r);  	text_p.font(getLabelFontForStyle(mLabelStyle)); @@ -1625,7 +1625,11 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )  			LLFolderViewItem* parent_folder = last_selected->getParentFolder();  			if (!last_selected->isOpen() && parent_folder && parent_folder->getParentFolder())  			{ -				setSelection(parent_folder, FALSE, TRUE); +				// Don't change selectin to hidden folder. See EXT-5328. +				if (!parent_folder->getHidden()) +				{ +					setSelection(parent_folder, FALSE, TRUE); +				}  			}  			else  			{ diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 4db75bbd8a..6dbd3a81e8 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -1721,15 +1721,14 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,  	{  		LLUUID& ejected_member_id = (*it); -		llwarns << "LLGroupMgr::sendGroupMemberEjects -- ejecting member" << ejected_member_id << llendl; -		  		// Can't use 'eject' to leave a group. -		if ((*it) == gAgent.getID()) continue; +		if (ejected_member_id == gAgent.getID()) continue;  		// Make sure they are in the group, and we need the member data -		LLGroupMgrGroupData::member_list_t::iterator mit = group_datap->mMembers.find(*it); +		LLGroupMgrGroupData::member_list_t::iterator mit = group_datap->mMembers.find(ejected_member_id);  		if (mit != group_datap->mMembers.end())  		{ +			LLGroupMemberData* member_data = (*mit).second;  			// Add them to the message  			if (start_message)  			{ @@ -1752,21 +1751,18 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,  			}  			// Clean up groupmgr -			for (LLGroupMemberData::role_list_t::iterator rit = (*mit).second->roleBegin(); -				 rit != (*mit).second->roleEnd(); ++rit) +			for (LLGroupMemberData::role_list_t::iterator rit = member_data->roleBegin(); +				 rit != member_data->roleEnd(); ++rit)  			{  				if ((*rit).first.notNull() && (*rit).second!=0)  				{  					(*rit).second->removeMember(ejected_member_id); - -					llwarns << "LLGroupMgr::sendGroupMemberEjects - removing member from role " << llendl;  				}  			} -			group_datap->mMembers.erase(*it); +			group_datap->mMembers.erase(ejected_member_id); -			llwarns << "LLGroupMgr::sendGroupMemberEjects - deleting memnber data " << llendl; -			delete (*mit).second; +			delete member_data;  		}  	} @@ -1774,8 +1770,6 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,  	{  		gAgent.sendReliableMessage();  	} - -	llwarns << "LLGroupMgr::sendGroupMemberEjects - done " << llendl;  }  void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id) diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 52312b87a5..8b2c5b039f 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -489,7 +489,11 @@ void LLIMFloater::setVisible(BOOL visible)  		channel->redrawToasts();  	} -	if (visible && mChatHistory && mInputEditor) +	BOOL is_minimized = visible && isChatMultiTab() +		? LLIMFloaterContainer::getInstance()->isMinimized() +		: !visible; + +	if (!is_minimized && mChatHistory && mInputEditor)  	{  		//only if floater was construced and initialized from xml  		updateMessages(); diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index a775115ac9..2f248f3596 100644 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -110,8 +110,8 @@ void LLIMFloaterContainer::addFloater(LLFloater* floaterp,  		icon_params.avatar_id = avatar_id;  		icon = LLUICtrlFactory::instance().createWidget<LLAvatarIconCtrl>(icon_params); -		mSessions[avatar_id] = floaterp; -		floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, avatar_id)); +		mSessions[session_id] = floaterp; +		floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id));  	}  	mTabContainer->setTabImage(floaterp, icon);  } @@ -123,7 +123,7 @@ void LLIMFloaterContainer::onCloseFloater(LLUUID& id)  void LLIMFloaterContainer::onNewMessageReceived(const LLSD& data)  { -	LLUUID session_id = data["from_id"].asUUID(); +	LLUUID session_id = data["session_id"].asUUID();  	LLFloater* floaterp = get_ptr_in_map(mSessions, session_id);  	LLFloater* current_floater = LLMultiFloater::getActiveFloater(); @@ -147,6 +147,8 @@ LLIMFloaterContainer* LLIMFloaterContainer::getInstance()  void LLIMFloaterContainer::setMinimized(BOOL b)  { +	if (isMinimized() == b) return; +	  	LLMultiFloater::setMinimized(b);  	if (isMinimized()) return; diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 980b51337f..ef3535042c 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -46,6 +46,7 @@  #include "llnotificationsutil.h"  const S32 BOTTOM_PAD = VPAD * 3; +const S32 IGNORE_BTN_TOP_DELTA = 3*VPAD;//additional ignore_btn padding  S32 BUTTON_WIDTH = 90;  //static @@ -127,14 +128,6 @@ mAddedDefaultBtn(false)  	{  		std::vector<index_button_pair_t> buttons;  		buttons.reserve(mNumOptions); -		for (S32 i = 0; i < mNumOptions; i++) -		{ -			LLSD form_element = form->getElement(i); -			if (form_element["type"].asString() != "button") -			{ -				continue; -			} -		}  		S32 buttons_width = 0;  		// create all buttons and accumulate they total width to reshape mControlPanel  		for (S32 i = 0; i < mNumOptions; i++) @@ -155,22 +148,42 @@ mAddedDefaultBtn(false)  		}  		else  		{ -			//try get an average left_pad to spread out buttons -			S32 left_pad = (getRect().getWidth() - buttons_width) / (S32(buttons.size() + 1)); -			// left_pad can be < 2*HPAD if we have a lot of buttons.  -			if(left_pad < 2*HPAD) +			const S32 button_panel_width = mControlPanel->getRect().getWidth();// do not change width of the panel +			S32 button_panel_height = mControlPanel->getRect().getHeight(); +			//try get an average h_pad to spread out buttons +			S32 h_pad = (button_panel_width - buttons_width) / (S32(buttons.size())); +			if(h_pad < 2*HPAD)  			{ -				//Probably it is  a scriptdialog toast, set default left_pad -				left_pad = 2*HPAD; +				/* +				 * Probably it is  a scriptdialog toast +				 * for a scriptdialog toast h_pad can be < 2*HPAD if we have a lot of buttons. +				 * In last case set default h_pad to avoid heaping of buttons  +				 */ +				h_pad = 2*HPAD;  			} -			//how many rows we need to fit all buttons with current width of the panel -			S32 button_rows = (buttons_width + left_pad * S32(buttons.size() + 1)) / getRect().getWidth() + 1; -			//calculate required panel height  -			S32 button_panel_height = button_rows *( BTN_HEIGHT + VPAD) + BOTTOM_PAD; - -			adjustPanelForScriptNotice(getRect().getWidth(), button_panel_height); -			//we begin from lefttop angle and go to rightbottom. -			updateButtonsLayout(buttons, left_pad, button_panel_height); +			if (mIsScriptDialog) +			{ +				// we are using default width for script buttons so we can determinate button_rows +				//to get a number of rows we divide the required width of the buttons to button_panel_width +				S32 button_rows = llceil(F32(buttons.size() - 1) * (BUTTON_WIDTH + h_pad) / button_panel_width); +				//S32 button_rows = (buttons.size() - 1) * (BUTTON_WIDTH + h_pad) / button_panel_width; +				//reserve one row for the ignore_btn +				button_rows++; +				//calculate required panel height for scripdialog notification. +				button_panel_height = button_rows * (BTN_HEIGHT + VPAD)	+ IGNORE_BTN_TOP_DELTA + BOTTOM_PAD; +			} +			else +			{ +				// in common case buttons can have different widths so we need to calculate button_rows according to buttons_width +				//S32 button_rows = llceil(F32(buttons.size()) * (buttons_width + h_pad) / button_panel_width); +				S32 button_rows = llceil(F32((buttons.size() - 1) * h_pad + buttons_width) / button_panel_width); +				//calculate required panel height  +				button_panel_height = button_rows * (BTN_HEIGHT + VPAD)	+ BOTTOM_PAD; +			} +		 +			// we need to keep min width and max height to make visible all buttons, because width of the toast can not be changed +			adjustPanelForScriptNotice(button_panel_width, button_panel_height); +			updateButtonsLayout(buttons, h_pad);  		}  	}  	// adjust panel's height to the text size @@ -202,7 +215,8 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, BOOL is_opt  	mBtnCallbackData.push_back(userdata);  	LLButton::Params p; -	const LLFontGL* font = form_element["index"].asInteger() == -1 ? sFontSmall: sFont; // for ignore button in script dialog +	bool is_ignore_btn = form_element["index"].asInteger() == -1; +	const LLFontGL* font = is_ignore_btn ? sFontSmall: sFont; // for ignore button in script dialog  	p.name(form_element["name"].asString());  	p.label(form_element["text"].asString());  	p.font(font); @@ -216,12 +230,19 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, BOOL is_opt  		p.image_color(LLUIColorTable::instance().getColor("ButtonCautionImageColor"));  		p.image_color_disabled(LLUIColorTable::instance().getColor("ButtonCautionImageColor"));  	} +	// for the scriptdialog buttons we use fixed button size. This  is a limit!  	if (!mIsScriptDialog && font->getWidth(form_element["text"].asString()) > BUTTON_WIDTH)  	{  		p.rect.width = 1;  		p.auto_resize = true;  	} -	 +	else if (mIsScriptDialog && is_ignore_btn) +	{ +		// this is ignore button,make it smaller +		p.rect.height = BTN_HEIGHT_SMALL; +		p.rect.width = 1; +		p.auto_resize = true; +	}  	LLButton* btn = LLUICtrlFactory::create<LLButton>(p);  	mNumButtons++;  	btn->autoResize(); @@ -241,38 +262,48 @@ LLToastNotifyPanel::~LLToastNotifyPanel()  		LLNotifications::getInstance()->cancel(mNotification);  	}  } -void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair_t>& buttons, S32 left_pad, S32 top) + +void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair_t>& buttons, S32 h_pad)  { -	S32 left = left_pad; +	S32 left = 0; +	//reserve place for ignore button +	S32 bottom_offset = mIsScriptDialog ? (BTN_HEIGHT + IGNORE_BTN_TOP_DELTA + BOTTOM_PAD) : BOTTOM_PAD; +	S32 max_width = mControlPanel->getRect().getWidth();  	LLButton* ignore_btn = NULL;  	for (std::vector<index_button_pair_t>::const_iterator it = buttons.begin(); it != buttons.end(); it++)  	{ -		if(left + it->second->getRect().getWidth() + 2*HPAD > getRect().getWidth()) -		{ -			// looks like we need to add button to the next row -			left = left_pad; -			top-= (BTN_HEIGHT + VPAD); -		} -		LLRect btn_rect(it->second->getRect()); -		if(mIsScriptDialog && it->first == -1) +		if (it->first == -1)  		{ -			//this is ignore button ( index == -1) we need to add it into new extra row at the end  			ignore_btn = it->second;  			continue;  		} -		btn_rect.setLeftTopAndSize(left, top, btn_rect.getWidth(), btn_rect.getHeight()); -		it->second->setRect(btn_rect);					 -		left = btn_rect.mLeft + btn_rect.getWidth() + left_pad; -		addChild(it->second, -1); +		LLButton* btn = it->second; +		LLRect btn_rect(btn->getRect()); +		if (left + btn_rect.getWidth() > max_width)// whether there is still some place for button+h_pad in the mControlPanel +		{ +			// looks like we need to add button to the next row +			left = 0; +			bottom_offset += (BTN_HEIGHT + VPAD); +		} +		//we arrange buttons from bottom to top for backward support of old script +		btn_rect.setOriginAndSize(left, bottom_offset, btn_rect.getWidth(),	btn_rect.getHeight()); +		btn->setRect(btn_rect); +		left = btn_rect.mLeft + btn_rect.getWidth() + h_pad; +		mControlPanel->addChild(btn, -1);  	} -	if(ignore_btn) +	if (mIsScriptDialog && ignore_btn != NULL)  	{ -		LLRect btn_rect(ignore_btn->getRect()); -		btn_rect.setOriginAndSize(getRect().getWidth() - btn_rect.getWidth() - left_pad, -				BOTTOM_PAD,// move button at the bottom edge -				btn_rect.getWidth(), btn_rect.getHeight()); -		ignore_btn->setRect(btn_rect); -		addChild(ignore_btn, -1); +		LLRect ignore_btn_rect(ignore_btn->getRect()); +		S32 buttons_per_row = max_width / BUTTON_WIDTH; //assume that h_pad far less than BUTTON_WIDTH +		S32 ignore_btn_left = buttons_per_row * BUTTON_WIDTH + (buttons_per_row	- 1) * h_pad - ignore_btn_rect.getWidth(); +		if (ignore_btn_left + ignore_btn_rect.getWidth() > max_width)// make sure that the ignore button is in panel +		{ +			ignore_btn_left = max_width - ignore_btn_rect.getWidth() - 2 * HPAD; +		} +		ignore_btn_rect.setOriginAndSize(ignore_btn_left, BOTTOM_PAD,// always move ignore button at the bottom +				ignore_btn_rect.getWidth(), ignore_btn_rect.getHeight()); +		ignore_btn->setRect(ignore_btn_rect); +		mControlPanel->addChild(ignore_btn, -1);  	}  } @@ -280,18 +311,15 @@ void LLToastNotifyPanel::adjustPanelForScriptNotice(S32 button_panel_width, S32  {  	//adjust layout  	// we need to keep min width and max height to make visible all buttons, because width of the toast can not be changed -	LLRect button_rect = mControlPanel->getRect();  	reshape(getRect().getWidth(), mInfoPanel->getRect().getHeight() + button_panel_height + VPAD); -	button_rect.set(0, button_rect.mBottom + button_panel_height, button_rect.getWidth(), button_rect.mBottom); -	mControlPanel->reshape(button_rect.getWidth(), button_panel_height); -	mControlPanel->setRect(button_rect); +	mControlPanel->reshape( button_panel_width, button_panel_height);  }  void LLToastNotifyPanel::adjustPanelForTipNotice()  {  	LLRect info_rect = mInfoPanel->getRect();  	LLRect this_rect = getRect(); - +	//we don't need display ControlPanel for tips because they doesn't contain any buttons.   	mControlPanel->setVisible(FALSE);  	reshape(getRect().getWidth(), mInfoPanel->getRect().getHeight()); diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h index 1f50c21f6f..3d57c50386 100644 --- a/indra/newview/lltoastnotifypanel.h +++ b/indra/newview/lltoastnotifypanel.h @@ -73,7 +73,13 @@ private:  	void adjustPanelForScriptNotice(S32 max_width, S32 max_height);  	void adjustPanelForTipNotice();  	void addDefaultButton(); -	void updateButtonsLayout(const std::vector<index_button_pair_t>& buttons, S32 left_pad, S32 top); +	/* +	 * It lays out buttons of the notification in  mControlPanel. +	 * Buttons will be placed from BOTTOM to TOP. +	 * @param  h_pad horizontal space between buttons. It is depent on number of buttons. +	 * @param buttons vector of button to be added.  +	 */ +	void updateButtonsLayout(const std::vector<index_button_pair_t>& buttons, S32 h_pad);  	// panel elements  	LLTextBase*		mTextBox; diff --git a/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml index 16079b30cb..a2938e8574 100644 --- a/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml +++ b/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml @@ -4,6 +4,7 @@   can_minimize="false"   height="100"   layout="topleft" + title="Save Outfit"   name="modal container"   width="240">      <button diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml index 14326b1018..34738745eb 100644 --- a/indra/newview/skins/default/xui/en/panel_notification.xml +++ b/indra/newview/skins/default/xui/en/panel_notification.xml @@ -83,12 +83,16 @@    <panel      background_visible="false"      follows="left|right|bottom" -    height="40"  +    height="30"  +    width="290"      label="control_panel"      layout="topleft" -    left="0" -    left_delta="-38" +    left="10"      name="control_panel" -    top_pad="0"> +    top_pad="5"> +    <!--  +    Notes: +    This panel holds buttons of notification. Change of its size can affect the layout of buttons.  +     -->    </panel>  </panel>  | 
