diff options
125 files changed, 1502 insertions, 801 deletions
| diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h index 85c78198dc..cd76bfe709 100644 --- a/indra/llcommon/llfasttimer.h +++ b/indra/llcommon/llfasttimer.h @@ -39,46 +39,81 @@  #define TIME_FAST_TIMERS 0  #if LL_WINDOWS +#define LL_INLINE __forceinline + +// +// NOTE: put back in when we aren't using platform sdk anymore +//  // because MS has different signatures for these functions in winnt.h  // need to rename them to avoid conflicts -#define _interlockedbittestandset _renamed_interlockedbittestandset -#define _interlockedbittestandreset _renamed_interlockedbittestandreset -#include <intrin.h> -#undef _interlockedbittestandset -#undef _interlockedbittestandreset +//#define _interlockedbittestandset _renamed_interlockedbittestandset +//#define _interlockedbittestandreset _renamed_interlockedbittestandreset +//#include <intrin.h> +//#undef _interlockedbittestandset +//#undef _interlockedbittestandreset + +//inline U32 get_cpu_clock_count_32() +//{ +//	U64 time_stamp = __rdtsc(); +//	return (U32)(time_stamp >> 8); +//} +// +//// return full timer value, *not* shifted by 8 bits +//inline U64 get_cpu_clock_count_64() +//{ +//	return __rdtsc(); +//} -#define LL_INLINE __forceinline  // shift off lower 8 bits for lower resolution but longer term timing  // on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing  inline U32 get_cpu_clock_count_32()  { -	U64 time_stamp = __rdtsc(); -	return (U32)(time_stamp >> 8); +	U32 ret_val; +	__asm  +	{ +        _emit   0x0f +        _emit   0x31 +		shr eax,8 +		shl edx,24 +		or eax, edx +		mov dword ptr [ret_val], eax +	} +    return ret_val;  }  // return full timer value, *not* shifted by 8 bits  inline U64 get_cpu_clock_count_64()  { -	return __rdtsc(); +	U64 ret_val; +	__asm  +	{ +        _emit   0x0f +        _emit   0x31 +		mov eax,eax +		mov edx,edx +		mov dword ptr [ret_val+4], edx +		mov dword ptr [ret_val], eax +	} +    return ret_val;  }  #else  #define LL_INLINE -#endif // LL_WINDOWS - -#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__)) -inline U32 get_cpu_clock_count_32() -{																	 -	U64 x;															 -	__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));					 -	return (U32)x >> 8;													 -} - -inline U32 get_cpu_clock_count_64() -{																	 -	U64 x; -	__asm__ volatile (".byte 0x0f, 0x31": "=A"(x)); -	return x; -} +#endif +
 +#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
 +inline U32 get_cpu_clock_count_32()
 +{																	
 +	U64 x;															
 +	__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));					
 +	return (U32)x >> 8;													
 +}
 +
 +inline U32 get_cpu_clock_count_64()
 +{																	
 +	U64 x;
 +	__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
 +	return x >> 8;
 +}
  #endif  #if ( LL_DARWIN && !(defined(__i386__) || defined(__amd64__))) || (LL_SOLARIS && defined(__sparc__)) diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp index 9cfc67af14..3694ecd4f4 100644 --- a/indra/llui/llflatlistview.cpp +++ b/indra/llui/llflatlistview.cpp @@ -711,19 +711,12 @@ void LLFlatListView::selectLastItem		()  void LLFlatListView::ensureSelectedVisible()  { -	LLRect visible_rc = getVisibleContentRect();  	LLRect selected_rc = getLastSelectedItemRect(); -	if ( !visible_rc.contains (selected_rc) ) +	if ( selected_rc.isValid() )  	{ -		// But scroll in Items panel coordinates  		scrollToShowRect(selected_rc);  	} - -	// In case we are in accordion tab notify parent to show selected rectangle -	LLRect screen_rc; -	localRectToScreen(selected_rc, &screen_rc); -	notifyParent(LLSD().with("scrollToShowRect",screen_rc.getValue()));  } diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 980cd2abd7..3734a22f7e 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -2362,7 +2362,7 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out  	LLRect::tCoordType screen_width = getSnapRect().getWidth();  	LLRect::tCoordType screen_height = getSnapRect().getHeight(); - +	  	// only automatically resize non-minimized, resizable floaters  	if( floater->isResizable() && !floater->isMinimized() )  	{ @@ -2387,16 +2387,11 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out  			new_width = llmax(new_width, min_width);  			new_height = llmax(new_height, min_height); -			floater->reshape( new_width, new_height, TRUE ); -			if (floater->followsRight()) -			{ -				floater->translate(old_width - new_width, 0); -			} +			LLRect new_rect; +			new_rect.setLeftTopAndSize(view_rect.mTop,view_rect.mLeft,new_width, new_height); -			if (floater->followsTop()) -			{ -				floater->translate(0, old_height - new_height); -			} +			floater->reshape( new_width, new_height, TRUE ); +			floater->setRect(new_rect);  		}  	} diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index aba35773ee..c4f10038f8 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -93,6 +93,8 @@ public:  	void updateLayout(BOOL force_resize = FALSE);  	S32 getPanelSpacing() const { return mPanelSpacing; } +	BOOL getAnimate () const { return mAnimate; } +	void setAnimate (BOOL animate) { mAnimate = animate; }  	static void updateClass(); diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 21f3f15739..c172a2b714 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -99,7 +99,7 @@ const S32 TEAROFF_SEPARATOR_HEIGHT_PIXELS = 10;  const S32 MENU_ITEM_PADDING = 4;  const std::string BOOLEAN_TRUE_PREFIX( "\xE2\x9C\x94" ); // U+2714 HEAVY CHECK MARK -const std::string BRANCH_SUFFIX( ">" ); +const std::string BRANCH_SUFFIX( "\xE2\x96\xB6" ); // U+25B6 BLACK RIGHT-POINTING TRIANGLE  const std::string ARROW_UP  ("^^^^^^^");  const std::string ARROW_DOWN("vvvvvvv"); diff --git a/indra/llui/llresizehandle.cpp b/indra/llui/llresizehandle.cpp index 6239a8f721..3df09d124a 100644 --- a/indra/llui/llresizehandle.cpp +++ b/indra/llui/llresizehandle.cpp @@ -124,7 +124,7 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask)  	{  		// Make sure the mouse in still over the application.  We don't want to make the parent  		// so big that we can't see the resize handle any more. -	 +  		S32 screen_x;  		S32 screen_y;  		localPointToScreen(x, y, &screen_x, &screen_y); @@ -146,68 +146,61 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask)  			LLRect scaled_rect = orig_rect;  			S32 delta_x = screen_x - mDragLastScreenX;  			S32 delta_y = screen_y - mDragLastScreenY; + +			if(delta_x == 0 && delta_y == 0) +				return FALSE; +  			LLCoordGL mouse_dir;  			// use hysteresis on mouse motion to preserve user intent when mouse stops moving  			mouse_dir.mX = (screen_x == mLastMouseScreenX) ? mLastMouseDir.mX : screen_x - mLastMouseScreenX;  			mouse_dir.mY = (screen_y == mLastMouseScreenY) ? mLastMouseDir.mY : screen_y - mLastMouseScreenY; +			  			mLastMouseScreenX = screen_x;  			mLastMouseScreenY = screen_y;  			mLastMouseDir = mouse_dir; -			S32 x_multiple = 1; -			S32 y_multiple = 1; -			switch( mCorner ) -			{ -			case LEFT_TOP: -				x_multiple = -1;  -				y_multiple =  1;	 -				break; -			case LEFT_BOTTOM:	 -				x_multiple = -1;  -				y_multiple = -1;	 -				break; -			case RIGHT_TOP:		 -				x_multiple =  1;  -				y_multiple =  1;	 -				break; -			case RIGHT_BOTTOM:	 -				x_multiple =  1;  -				y_multiple = -1;	 -				break; -			} +			S32 new_width = orig_rect.getWidth(); +			S32 new_height = orig_rect.getHeight(); -			S32 new_width = orig_rect.getWidth() + x_multiple * delta_x; -			if( new_width < mMinWidth ) -			{ -				new_width = mMinWidth; -				delta_x = x_multiple * (mMinWidth - orig_rect.getWidth()); -			} - -			S32 new_height = orig_rect.getHeight() + y_multiple * delta_y; -			if( new_height < mMinHeight ) -			{ -				new_height = mMinHeight; -				delta_y = y_multiple * (mMinHeight - orig_rect.getHeight()); -			} +			S32 new_pos_x = orig_rect.mLeft; +			S32 new_pos_y = orig_rect.mTop;  			switch( mCorner )  			{ -			case LEFT_TOP:		 -				scaled_rect.translate(delta_x, 0);			 +			case LEFT_TOP: +				new_width-=delta_x; +				new_height+=delta_y; +				new_pos_x+=delta_x; +				new_pos_y+=delta_y;  				break;  			case LEFT_BOTTOM:	 -				scaled_rect.translate(delta_x, delta_y);	 +				new_width-=delta_x; +				new_height-=delta_y; +				new_pos_x+=delta_x;  				break;  			case RIGHT_TOP:		 +				new_width+=delta_x; +				new_height+=delta_y; +				new_pos_y+=delta_y;  				break;  			case RIGHT_BOTTOM:	 -				scaled_rect.translate(0, delta_y);			 +				new_width+=delta_x; +				new_height-=delta_y;  				break;  			} +			new_width = llmax(new_width,mMinWidth); +			new_height = llmax(new_height,mMinHeight); +			 +			LLRect::tCoordType screen_width = resizing_view->getParent()->getSnapRect().getWidth(); +			LLRect::tCoordType screen_height = resizing_view->getParent()->getSnapRect().getHeight(); +			 +			new_width = llmin(new_width, screen_width); +			new_height = llmin(new_height, screen_height); +			  			// temporarily set new parent rect -			scaled_rect.mRight = scaled_rect.mLeft + new_width; -			scaled_rect.mTop = scaled_rect.mBottom + new_height; +			scaled_rect.setLeftTopAndSize(new_pos_x,new_pos_y,new_width,new_height); +				  			resizing_view->setRect(scaled_rect);  			LLView* snap_view = NULL; @@ -258,7 +251,11 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask)  			resizing_view->setRect(orig_rect);  			// translate and scale to new shape -			resizing_view->setShape(scaled_rect, true); +			resizing_view->reshape(scaled_rect.getWidth(),scaled_rect.getHeight()); +			resizing_view->setRect(scaled_rect); +			//set shape to handle dependent floaters... +			resizing_view->handleReshape(scaled_rect, false); +			  			// update last valid mouse cursor position based on resized view's actual size  			LLRect new_rect = resizing_view->getRect(); diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp index a5e47e8547..94465a67ce 100644 --- a/indra/llui/llscrollcontainer.cpp +++ b/indra/llui/llscrollcontainer.cpp @@ -668,6 +668,11 @@ void LLScrollContainer::scrollToShowRect(const LLRect& rect, const LLRect& const  	// propagate scroll to document  	updateScroll(); + +	// In case we are in accordion tab notify parent to show selected rectangle +	LLRect screen_rc; +	localRectToScreen(rect_to_constrain, &screen_rc); +	notifyParent(LLSD().with("scrollToShowRect",screen_rc.getValue()));  }  void LLScrollContainer::pageUp(S32 overlap) diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 5ebf49c488..17aecaf32f 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -346,7 +346,8 @@ void LLTextBase::drawSelectionBackground()  					S32 segment_line_start = segmentp->getStart() + segment_offset;  					S32 segment_line_end = llmin(segmentp->getEnd(), line_iter->mDocIndexEnd); -					S32 segment_width, segment_height; +					S32 segment_width = 0; +					S32 segment_height = 0;  					// if selection after beginning of segment  					if(selection_left >= segment_line_start) @@ -433,7 +434,8 @@ void LLTextBase::drawCursor()  			if (LL_KIM_OVERWRITE == gKeyboard->getInsertMode() && !hasSelection())  			{ -				S32 segment_width, segment_height; +				S32 segment_width = 0; +				S32 segment_height = 0;  				segmentp->getDimensions(mCursorPos - segmentp->getStart(), 1, segment_width, segment_height);  				S32 width = llmax(CURSOR_THICKNESS, segment_width);  				cursor_rect.mRight = cursor_rect.mLeft + width; @@ -2443,10 +2445,12 @@ void LLNormalTextSegment::setToolTip(const std::string& tooltip)  bool LLNormalTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const  { -	height = mFontHeight; +	height = 0; +	width = 0;  	bool force_newline = false;  	if (num_chars > 0)  	{ +		height = mFontHeight;  		LLWString text = mEditor.getWText();  		// if last character is a newline, then return true, forcing line break  		llwchar last_char = text[mStart + first_char + num_chars - 1]; @@ -2461,10 +2465,6 @@ bool LLNormalTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& widt  			width = mStyle->getFont()->getWidth(text.c_str(), mStart + first_char, num_chars);  		}  	} -	else -	{ -		width = 0; -	}  	LLUIImagePtr image = mStyle->getImage();  	if( image.notNull()) diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index 296d827a20..1f0c4fe13a 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -200,6 +200,11 @@ const std::string &LLDir::getOSUserAppDir() const  const std::string &LLDir::getLindenUserDir() const  { +	if (mLindenUserDir.empty()) +	{ +		lldebugs << "getLindenUserDir() called early, we don't have the user name yet - returning empty string to caller" << llendl; +	} +  	return mLindenUserDir;  } @@ -337,7 +342,7 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd  		break;  	case LL_PATH_CACHE: -	    prefix = getCacheDir(); +		prefix = getCacheDir();  		break;  	case LL_PATH_USER_SETTINGS: @@ -348,6 +353,11 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd  	case LL_PATH_PER_SL_ACCOUNT:  		prefix = getLindenUserDir(); +		if (prefix.empty()) +		{ +			// if we're asking for the per-SL-account directory but we haven't logged in yet (or otherwise don't know the account name from which to build this string), then intentionally return a blank string to the caller and skip the below warning about a blank prefix. +			return std::string(); +		}  		break;  	case LL_PATH_CHAT_LOGS: @@ -557,7 +567,7 @@ std::string LLDir::getForbiddenFileChars()  void LLDir::setLindenUserDir(const std::string &username)  { -	// if both first and last aren't set, assume we're grabbing the cached dir +	// if the username isn't set, that's bad  	if (!username.empty())  	{  		// some platforms have case-sensitive filesystems, so be diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h index 9c1e992eca..05d5efc66f 100644 --- a/indra/llvfs/lldir.h +++ b/indra/llvfs/lldir.h @@ -44,7 +44,7 @@ typedef enum ELLPath  	LL_PATH_NONE = 0,  	LL_PATH_USER_SETTINGS = 1,  	LL_PATH_APP_SETTINGS = 2,	 -	LL_PATH_PER_SL_ACCOUNT = 3,	 +	LL_PATH_PER_SL_ACCOUNT = 3, // returns/expands to blank string if we don't know the account name yet  	LL_PATH_CACHE = 4,	  	LL_PATH_CHARACTER = 5,	  	LL_PATH_HELP = 6,		 diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp index ee902d1de7..a9736560ec 100644 --- a/indra/llvfs/lldir_linux.cpp +++ b/indra/llvfs/lldir_linux.cpp @@ -112,9 +112,10 @@ LLDir_Linux::LLDir_Linux()  		// ...normal installation running  		mSkinBaseDir = mAppRODataDir + mDirDelimiter + "skins";      }	 +  	mOSUserDir = getCurrentUserHome(tmp_str);  	mOSUserAppDir = ""; -	mLindenUserDir = tmp_str; +	mLindenUserDir = "";  	char path [32];	/* Flawfinder: ignore */  diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp index a8fad8e5bd..8ac5a41e93 100644 --- a/indra/llvfs/lldir_solaris.cpp +++ b/indra/llvfs/lldir_solaris.cpp @@ -100,7 +100,7 @@ LLDir_Solaris::LLDir_Solaris()  	mAppRODataDir = strdup(tmp_str);  	mOSUserDir = getCurrentUserHome(tmp_str);  	mOSUserAppDir = ""; -	mLindenUserDir = tmp_str; +	mLindenUserDir = "";  	char path [LL_MAX_PATH];	/* Flawfinder: ignore */  diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 255e8e6102..d86e158e50 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -157,7 +157,6 @@ set(viewer_SOURCE_FILES      llfloaterbuycurrency.cpp      llfloaterbuyland.cpp      llfloatercamera.cpp -    llfloaterchat.cpp      llfloaterchatterbox.cpp      llfloatercolorpicker.cpp      llfloatercustomize.cpp @@ -669,7 +668,6 @@ set(viewer_HEADER_FILES      llfloaterbuycurrency.h      llfloaterbuyland.h      llfloatercamera.h -    llfloaterchat.h      llfloaterchatterbox.h      llfloatercolorpicker.h      llfloatercustomize.h diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 5bd80ec7b2..4886deaede 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -5084,6 +5084,18 @@        <key>Value</key>        <integer>5</integer>      </map> +    <key>ToastButtonWidth</key> +    <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> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>90</integer> +    </map>      <key>ChannelBottomPanelMargin</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 7bbe6857fe..a66c8fb197 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -2806,6 +2806,7 @@ void LLAgent::endAnimationUpdateUI()  		gStatusBar->setVisibleForMouselook(true);  		LLBottomTray::getInstance()->setVisible(TRUE); +		LLBottomTray::getInstance()->onMouselookModeOut();  		LLSideTray::getInstance()->getButtonsPanel()->setVisible(TRUE);  		LLSideTray::getInstance()->updateSidetrayVisibility(); @@ -2904,6 +2905,7 @@ void LLAgent::endAnimationUpdateUI()  		LLNavigationBar::getInstance()->setVisible(FALSE);  		gStatusBar->setVisibleForMouselook(false); +		LLBottomTray::getInstance()->onMouselookModeIn();  		LLBottomTray::getInstance()->setVisible(FALSE);  		LLSideTray::getInstance()->getButtonsPanel()->setVisible(FALSE); diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 10a2dd132a..c21cdf9508 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -1364,15 +1364,15 @@ void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name,  	}   } -class LLAutoRenameFolder: public LLInventoryCallback +class LLShowCreatedOutfit: public LLInventoryCallback  {  public: -	LLAutoRenameFolder(LLUUID& folder_id): +	LLShowCreatedOutfit(LLUUID& folder_id):  		mFolderID(folder_id)  	{  	} -	virtual ~LLAutoRenameFolder() +	virtual ~LLShowCreatedOutfit()  	{  		LLSD key;  		LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key); @@ -1382,13 +1382,15 @@ public:  		{  			outfit_panel->getRootFolder()->clearSelection();  			outfit_panel->getRootFolder()->setSelectionByID(mFolderID, TRUE); -			outfit_panel->getRootFolder()->setNeedsAutoRename(TRUE);  		}  		LLAccordionCtrlTab* tab_outfits = outfit_panel ? outfit_panel->findChild<LLAccordionCtrlTab>("tab_outfits") : 0;  		if (tab_outfits && !tab_outfits->getDisplayChildren())  		{  			tab_outfits->changeOpenClose(tab_outfits->getDisplayChildren());  		} + +		LLAppearanceManager::instance().updateIsDirty(); +		LLAppearanceManager::instance().updatePanelOutfitName("");  	}  	virtual void fire(const LLUUID&) @@ -1413,10 +1415,10 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)  		LLFolderType::FT_OUTFIT,  		new_folder_name); -	LLPointer<LLInventoryCallback> cb = new LLAutoRenameFolder(folder_id); +	LLPointer<LLInventoryCallback> cb = new LLShowCreatedOutfit(folder_id);  	LLAppearanceManager::instance().shallowCopyCategory(LLAppearanceManager::instance().getCOF(),folder_id, cb); -	LLAppearanceManager::instance().createBaseOutfitLink(folder_id, NULL); -	 +	LLAppearanceManager::instance().createBaseOutfitLink(folder_id, cb); +  	return folder_id;  } diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 4d4a89bcd4..748d8bdfbf 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -392,6 +392,21 @@ const LLViewerInventoryItem* LLAppearanceManager::getBaseOutfitLink()  	return NULL;  } +bool LLAppearanceManager::getBaseOutfitName(std::string& name) +{ +	const LLViewerInventoryItem* outfit_link = getBaseOutfitLink(); +	if(outfit_link) +	{ +		const LLViewerInventoryCategory *cat = outfit_link->getLinkedCategory(); +		if (cat) +		{ +			name = cat->getName(); +			return true; +		} +	} +	return false; +} +  // Update appearance from outfit folder.  void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, bool append)  { @@ -630,6 +645,7 @@ void LLAppearanceManager::createBaseOutfitLink(const LLUUID& category, LLPointer  							LLAssetType::AT_LINK_FOLDER, link_waiter);  		new_outfit_name = catp->getName();  	} +	  	updatePanelOutfitName(new_outfit_name);  } diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index b954968998..20745b70e4 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -63,6 +63,7 @@ public:  	// Finds the folder link to the currently worn outfit  	const LLViewerInventoryItem *getBaseOutfitLink(); +	bool getBaseOutfitName(std::string &name);  	// Update the displayed outfit name in UI.  	void updatePanelOutfitName(const std::string& name); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 97fc0304f1..6d0bbee755 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1356,7 +1356,7 @@ bool LLAppViewer::cleanup()  	if( gViewerWindow)  		gViewerWindow->shutdownViews(); -	llinfos << "Cleaning up Inevntory" << llendflush; +	llinfos << "Cleaning up Inventory" << llendflush;  	// Cleanup Inventory after the UI since it will delete any remaining observers  	// (Deleted observers should have already removed themselves) @@ -1451,10 +1451,17 @@ bool LLAppViewer::cleanup()  	LLUIColorTable::instance().saveUserSettings(); -	// PerAccountSettingsFile should be empty if no use has been logged on. +	// PerAccountSettingsFile should be empty if no user has been logged on.  	// *FIX:Mani This should get really saved in a "logoff" mode.  -	gSavedPerAccountSettings.saveToFile(gSavedSettings.getString("PerAccountSettingsFile"), TRUE); -	llinfos << "Saved settings" << llendflush; +	if (gSavedSettings.getString("PerAccountSettingsFile").empty()) +	{ +		llinfos << "Not saving per-account settings; don't know the account name yet." << llendl; +	} +	else +	{ +		gSavedPerAccountSettings.saveToFile(gSavedSettings.getString("PerAccountSettingsFile"), TRUE); +		llinfos << "Saved settings" << llendflush; +	}  	std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);  	// save all settings, even if equals defaults diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 118a546ada..38edbd04ba 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -172,24 +172,6 @@ void LLAvatarActions::offerTeleport(const std::vector<LLUUID>& ids)  		return;  	handle_lure(ids); - -	// Record the offer. -	for (std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++) -	{ -		LLUUID target_id = *it; -		std::string target_name; - -		gCacheName->getFullName(target_id, target_name); - -		LLSD args; -		args["TO_NAME"] = target_name; - -		LLSD payload; -		payload["from_id"] = target_id; -		payload["SESSION_NAME"] = target_name; -		payload["SUPPRESS_TOAST"] = true; -		LLNotificationsUtil::add("TeleportOfferSent", args, payload); -	}  }  // static diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp index 42ae122ff9..87b8d807c4 100644 --- a/indra/newview/llavatariconctrl.cpp +++ b/indra/newview/llavatariconctrl.cpp @@ -64,7 +64,7 @@ void LLAvatarIconIDCache::load	()  	llinfos << "Loading avatar icon id cache." << llendl;  	// build filename for each user -	std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, mFilename); +	std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, mFilename);  	llifstream file(resolved_filename);  	if (!file.is_open()) @@ -97,7 +97,7 @@ void LLAvatarIconIDCache::load	()  void LLAvatarIconIDCache::save	()  { -	std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, mFilename); +	std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, mFilename);  	// open a file for writing  	llofstream file (resolved_filename); diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 19e9e52ddf..6784e6693b 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -320,6 +320,11 @@ boost::signals2::connection LLAvatarList::setRefreshCompleteCallback(const commi  	return mRefreshCompleteSignal.connect(cb);  } +boost::signals2::connection LLAvatarList::setItemDoubleClickCallback(const mouse_signal_t::slot_type& cb) +{ +	return mItemDoubleClickSignal.connect(cb); +} +  void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos)  {  	LLAvatarListItem* item = new LLAvatarListItem(); @@ -333,6 +338,8 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is  	item->setShowProfileBtn(mShowProfileBtn);  	item->showSpeakingIndicator(mShowSpeakingIndicator); +	item->setDoubleClickCallback(boost::bind(&LLAvatarList::onItemDoucleClicked, this, _1, _2, _3, _4)); +  	addItem(item, id, pos);  } @@ -400,6 +407,11 @@ void LLAvatarList::updateLastInteractionTimes()  	}  } +void LLAvatarList::onItemDoucleClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask) +{ +	mItemDoubleClickSignal(ctrl, x, y, mask); +} +  bool LLAvatarItemComparator::compare(const LLPanel* item1, const LLPanel* item2) const  {  	const LLAvatarListItem* avatar_item1 = dynamic_cast<const LLAvatarListItem*>(item1); diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 0d2ce884ae..a58a562378 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -92,6 +92,8 @@ public:  	boost::signals2::connection setRefreshCompleteCallback(const commit_signal_t::slot_type& cb); +	boost::signals2::connection setItemDoubleClickCallback(const mouse_signal_t::slot_type& cb); +  protected:  	void refresh(); @@ -101,6 +103,7 @@ protected:  		std::vector<LLUUID>& vadded,  		std::vector<LLUUID>& vremoved);  	void updateLastInteractionTimes(); +	void onItemDoucleClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask);  private: @@ -120,6 +123,7 @@ private:  	LLAvatarListItem::ContextMenu* mContextMenu;  	commit_signal_t mRefreshCompleteSignal; +	mouse_signal_t mItemDoubleClickSignal;  };  /** Abstract comparator for avatar items */ diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index 1043858373..66ab32f3e8 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -258,6 +258,21 @@ void LLAvatarListItem::onProfileBtnClick()  	LLAvatarActions::showProfile(mAvatarId);  } +BOOL LLAvatarListItem::handleDoubleClick(S32 x, S32 y, MASK mask) +{ +	if(mInfoBtn->getRect().pointInRect(x, y)) +	{ +		onInfoBtnClick(); +		return TRUE; +	} +	if(mProfileBtn->getRect().pointInRect(x, y)) +	{ +		onProfileBtnClick(); +		return TRUE; +	} +	return LLPanel::handleDoubleClick(x, y, mask); +} +  void LLAvatarListItem::setValue( const LLSD& value )  {  	if (!value.isMap()) return;; diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index f76ffb391d..479a4833cb 100644 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -103,6 +103,8 @@ public:  	void onInfoBtnClick();  	void onProfileBtnClick(); +	/*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask); +  protected:  	/**  	 * Contains indicator to show voice activity.  diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 2758684ae9..aa45f9328d 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -48,10 +48,20 @@  #include "llsyswellwindow.h"  #include "llfloatercamera.h"  #include "lltexteditor.h" +#include "llnotifications.h"  // Build time optimization, generate extern template once in .cpp file  template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance(); +namespace +{ +	const std::string& PANEL_CHICLET_NAME	= "chiclet_list_panel"; +	const std::string& PANEL_CHATBAR_NAME	= "chat_bar"; +	const std::string& PANEL_MOVEMENT_NAME	= "movement_panel"; +	const std::string& PANEL_CAMERA_NAME	= "cam_panel"; +	const std::string& PANEL_GESTURE_NAME	= "gesture_panel"; +} +  LLBottomTray::LLBottomTray(const LLSD&)  :	mChicletPanel(NULL),  	mSpeakPanel(NULL), @@ -236,6 +246,61 @@ void LLBottomTray::onFocusLost()  	}  } +void LLBottomTray::savePanelsShape() +{ +	mSavedShapeList.clear(); +	for (child_list_const_iter_t +			 child_it = mToolbarStack->beginChild(), +			 child_it_end = mToolbarStack->endChild(); +		 child_it != child_it_end; ++child_it) +	{ +		mSavedShapeList.push_back( (*child_it)->getRect() ); +	} +} + +void LLBottomTray::restorePanelsShape() +{ +	if (mSavedShapeList.size() != mToolbarStack->getChildCount()) +		return; +	int i = 0; +	for (child_list_const_iter_t +			 child_it = mToolbarStack->beginChild(), +			 child_it_end = mToolbarStack->endChild(); +		 child_it != child_it_end; ++child_it) +	{ +		(*child_it)->setShape(mSavedShapeList[i++]); +	} +} + +void LLBottomTray::onMouselookModeOut() +{ +	// Apply the saved settings when we are not in mouselook mode, see EXT-3988. +	{ +		setTrayButtonVisibleIfPossible (RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton"), false); +		setTrayButtonVisibleIfPossible (RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton"),    false); +		setTrayButtonVisibleIfPossible (RS_BUTTON_CAMERA,   gSavedSettings.getBOOL("ShowCameraButton"),  false); +		setTrayButtonVisibleIfPossible (RS_BUTTON_SNAPSHOT, gSavedSettings.getBOOL("ShowSnapshotButton"),false); +	} +	// HACK: To avoid usage the LLLayoutStack logic of resizing, we force the updateLayout +	// and then restore children saved shapes. See EXT-4309. +	BOOL saved_anim = mToolbarStack->getAnimate(); +	mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, FALSE); +	// Disable animation to prevent layout updating in several frames. +	mToolbarStack->setAnimate(FALSE); +	// Force the updating of layout to reset panels collapse factor. +	mToolbarStack->updateLayout(); +	// Restore animate state. +	mToolbarStack->setAnimate(saved_anim); +	// Restore saved shapes. +	restorePanelsShape(); +} + +void LLBottomTray::onMouselookModeIn() +{ +	savePanelsShape(); +	mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, TRUE); +} +  //virtual  // setVisible used instead of onVisibilityChange, since LLAgent calls it on entering/leaving mouselook mode.  // If bottom tray is already visible in mouselook mode, then onVisibilityChange will not be called from setVisible(true), @@ -255,24 +320,21 @@ void LLBottomTray::setVisible(BOOL visible)  			LLView* viewp = *child_it;  			std::string name = viewp->getName(); -			// Chat bar and gesture button are shown even in mouselook mode. But the move, camera and snapshot buttons shouldn't be displayed. See EXT-3988. -			if ("chat_bar" == name || "gesture_panel" == name || (visibility && ("movement_panel" == name || "cam_panel" == name || "snapshot_panel" == name))) +			// Chat bar and gesture button are shown even in mouselook mode. +			// But the move, camera and snapshot buttons shouldn't be displayed. See EXT-3988. +			if ("chat_bar" == name || "gesture_panel" == name)  				continue;  			else   			{  				viewp->setVisible(visibility);  			}  		} - -		// Apply the saved settings when we are not in mouselook mode, see EXT-3988. -		if (visibility) -		{ -			showCameraButton(gSavedSettings.getBOOL("ShowCameraButton")); -			showSnapshotButton(gSavedSettings.getBOOL("ShowSnapshotButton")); -			showMoveButton(gSavedSettings.getBOOL("ShowMoveButton")); -			showGestureButton(gSavedSettings.getBOOL("ShowGestureButton")); -		}  	} + +	if(visible) +		gFloaterView->setSnapOffsetBottom(getRect().getHeight()); +	else +		gFloaterView->setSnapOffsetBottom(0);  }  void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask) @@ -337,15 +399,6 @@ void LLBottomTray::showSnapshotButton(BOOL visible)  	setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible);  } -namespace -{ -	const std::string& PANEL_CHICLET_NAME	= "chiclet_list_panel"; -	const std::string& PANEL_CHATBAR_NAME	= "chat_bar"; -	const std::string& PANEL_MOVEMENT_NAME	= "movement_panel"; -	const std::string& PANEL_CAMERA_NAME	= "cam_panel"; -	const std::string& PANEL_GESTURE_NAME	= "gesture_panel"; -} -  BOOL LLBottomTray::postBuild()  { @@ -1018,7 +1071,7 @@ void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool vis  	panel->setVisible(visible);  } -void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible) +void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification)  {  	bool can_be_set = true; @@ -1058,7 +1111,11 @@ void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type  	{  		// mark this button to show it while future bottom tray extending  		mResizeState |= shown_object_type; -		LLNotificationsUtil::add("BottomTrayButtonCanNotBeShown"); +		if ( raise_notification ) +			LLNotificationsUtil::add("BottomTrayButtonCanNotBeShown", +									 LLSD(), +									 LLSD(), +									 LLNotificationFunctorRegistry::instance().DONOTHING);  	}  } diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 9be0e5810f..562ee56912 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -92,7 +92,10 @@ public:  	void showMoveButton(BOOL visible);  	void showCameraButton(BOOL visible);  	void showSnapshotButton(BOOL visible); -	 + +	void onMouselookModeIn(); +	void onMouselookModeOut(); +  	/**  	 * Creates IM Chiclet based on session type (IM chat or Group chat)  	 */ @@ -167,7 +170,14 @@ private:  	 *  - if hidden via context menu button should be shown but there is no enough room for now  	 *    it will be shown while extending.  	 */ -	void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible); +	void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification = true); + +	/** +	 * Save and restore children shapes. +	 * Used to avoid the LLLayoutStack resizing logic between mouse look mode switching. +	 */ +	void savePanelsShape(); +	void restorePanelsShape();  	MASK mResizeState; @@ -177,6 +187,9 @@ private:  	typedef std::map<EResizeState, S32> state_object_width_map_t;  	state_object_width_map_t mObjectDefaultWidthMap; +	typedef std::vector<LLRect> shape_list_t; +	shape_list_t mSavedShapeList; +  protected:  	LLBottomTray(const LLSD& key = LLSD()); diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp index 3412ee5428..f909c9e6c1 100644 --- a/indra/newview/llcallfloater.cpp +++ b/indra/newview/llcallfloater.cpp @@ -722,13 +722,28 @@ void LLCallFloater::removeVoiceRemoveTimer(const LLUUID& voice_speaker_id)  bool LLCallFloater::validateSpeaker(const LLUUID& speaker_id)  { -	if (mVoiceType != VC_LOCAL_CHAT) -		return true; +	bool is_valid = true; +	switch (mVoiceType) +	{ +	case  VC_LOCAL_CHAT: +		{ +			// A nearby chat speaker is considered valid it it's known to LLVoiceClient (i.e. has enabled voice). +			std::vector<LLUUID> speakers; +			get_voice_participants_uuids(speakers); +			is_valid = std::find(speakers.begin(), speakers.end(), speaker_id) != speakers.end(); +		} +		break; +	case VC_GROUP_CHAT: +		// if participant had left this call before do not allow add her again. See EXT-4216. +		// but if she Join she will be added into the list from the LLCallFloater::onChange() +		is_valid = STATE_LEFT != getState(speaker_id); +		break; +	default: +		// do nothing. required for Linux build +		break; +	} -	// A nearby chat speaker is considered valid it it's known to LLVoiceClient (i.e. has enabled voice). -	std::vector<LLUUID> speakers; -	get_voice_participants_uuids(speakers); -	return std::find(speakers.begin(), speakers.end(), speaker_id) != speakers.end(); +	return is_valid;  }  void LLCallFloater::connectToChannel(LLVoiceChannel* channel) diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp index 442dc660cd..b32a955038 100644 --- a/indra/newview/llchatbar.cpp +++ b/indra/newview/llchatbar.cpp @@ -48,7 +48,6 @@  #include "llcombobox.h"  #include "llcommandhandler.h"	// secondlife:///app/chat/ support  #include "llviewercontrol.h" -#include "llfloaterchat.h"  #include "llgesturemgr.h"  #include "llkeyboard.h"  #include "lllineeditor.h" @@ -548,7 +547,7 @@ void LLChatBar::onInputEditorFocusLost()  // static  void LLChatBar::onInputEditorGainFocus()  { -	LLFloaterChat::setHistoryCursorAndScrollToEnd(); +	//LLFloaterChat::setHistoryCursorAndScrollToEnd();  }  void LLChatBar::onClickSay( LLUICtrl* ctrl ) diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 2fc83c7e54..977f5c2bd0 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -577,23 +577,17 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_  		view->reshape(target_rect.getWidth(), view->getRect().getHeight());  		view->setOrigin(target_rect.mLeft, view->getRect().mBottom); -		std::string header_text = "[" + chat.mTimeStr + "] "; +		std::string widget_associated_text = "\n[" + chat.mTimeStr + "] ";  		if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM) -			header_text += chat.mFromName + delimiter; +			widget_associated_text += chat.mFromName + delimiter; -		mEditor->appendWidget(p, header_text, false); +		mEditor->appendWidget(p, widget_associated_text, false);  		mLastFromName = chat.mFromName;  		mLastFromID = chat.mFromID;  		mLastMessageTime = new_message_time;  	}  	std::string message = irc_me ? chat.mText.substr(3) : chat.mText; -	if ( message.size() > 0 && !LLStringOps::isSpace(message[message.size() - 1]) ) -	{ -		// Ensure that message ends with NewLine, to avoid losing of new lines -		// while copy/paste from text chat. See EXT-3263. -		message += NEW_LINE; -	}  	mEditor->appendText(message, FALSE, style_params);  	mEditor->blockUndo(); diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index 9ce3f29853..f7f7ee83af 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -168,27 +168,30 @@ void LLNearbyChatToastPanel::init(LLSD& notification)  	msg_text->setText(std::string("")); -	std::string str_sender; -	 -	str_sender = fromName; +	if ( notification["chat_style"].asInteger() != CHAT_STYLE_IRC ) +	{ +		std::string str_sender; -	str_sender+=" "; +		str_sender = fromName; -	//append user name -	{ -		LLStyle::Params style_params_name; +		str_sender+=" "; -		LLColor4 userNameColor = LLUIColorTable::instance().getColor("ChatToastAgentNameColor"); +		//append user name +		{ +			LLStyle::Params style_params_name; -		style_params_name.color(userNameColor); -		 -		std::string font_name = LLFontGL::nameFromFont(messageFont); -		std::string font_style_size = LLFontGL::sizeFromFont(messageFont); -		style_params_name.font.name(font_name); -		style_params_name.font.size(font_style_size); -		 -		msg_text->appendText(str_sender, FALSE, style_params_name); -		 +			LLColor4 userNameColor = LLUIColorTable::instance().getColor("ChatToastAgentNameColor"); + +			style_params_name.color(userNameColor); + +			std::string font_name = LLFontGL::nameFromFont(messageFont); +			std::string font_style_size = LLFontGL::sizeFromFont(messageFont); +			style_params_name.font.name(font_name); +			style_params_name.font.size(font_style_size); + +			msg_text->appendText(str_sender, FALSE, style_params_name); + +		}  	}  	//append text diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index dc2e22f899..f21fbbe6f5 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -453,6 +453,7 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p)  , mNewMessagesIcon(NULL)  , mSpeakerCtrl(NULL)  , mCounterCtrl(NULL) +, mChicletButton(NULL)  {  	enableCounterControl(p.enable_counter);  } @@ -540,6 +541,11 @@ void LLIMChiclet::toggleSpeakerControl()  void LLIMChiclet::setCounter(S32 counter)  { +	if (mCounterCtrl->getCounter() == counter) +	{ +		return; +	} +  	mCounterCtrl->setCounter(counter);  	setShowCounter(counter);  	setShowNewMessagesIcon(counter); @@ -571,6 +577,11 @@ void LLIMChiclet::onMouseDown()  	setCounter(0);  } +void LLIMChiclet::setToggleState(bool toggle) +{ +	mChicletButton->setToggleState(toggle); +} +  BOOL LLIMChiclet::handleMouseDown(S32 x, S32 y, MASK mask)  {  	onMouseDown(); @@ -629,6 +640,7 @@ LLIMChiclet::EType LLIMChiclet::getIMSessionType(const LLUUID& session_id)  LLIMP2PChiclet::Params::Params()  : avatar_icon("avatar_icon") +, chiclet_button("chiclet_button")  , unread_notifications("unread_notifications")  , speaker("speaker")  , new_message_icon("new_message_icon") @@ -641,6 +653,10 @@ LLIMP2PChiclet::LLIMP2PChiclet(const Params& p)  , mChicletIconCtrl(NULL)  , mPopupMenu(NULL)  { +	LLButton::Params button_params = p.chiclet_button; +	mChicletButton = LLUICtrlFactory::create<LLButton>(button_params); +	addChild(mChicletButton); +  	LLIconCtrl::Params new_msg_params = p.new_message_icon;  	mNewMessagesIcon = LLUICtrlFactory::create<LLIconCtrl>(new_msg_params);  	addChild(mNewMessagesIcon); @@ -755,6 +771,7 @@ void LLIMP2PChiclet::onMenuItemClicked(const LLSD& user_data)  LLAdHocChiclet::Params::Params()  : avatar_icon("avatar_icon") +, chiclet_button("chiclet_button")  , unread_notifications("unread_notifications")  , speaker("speaker")  , new_message_icon("new_message_icon") @@ -768,6 +785,10 @@ LLAdHocChiclet::LLAdHocChiclet(const Params& p)  , mChicletIconCtrl(NULL)  , mPopupMenu(NULL)  { +	LLButton::Params button_params = p.chiclet_button; +	mChicletButton = LLUICtrlFactory::create<LLButton>(button_params); +	addChild(mChicletButton); +  	LLIconCtrl::Params new_msg_params = p.new_message_icon;  	mNewMessagesIcon = LLUICtrlFactory::create<LLIconCtrl>(new_msg_params);  	addChild(mNewMessagesIcon); @@ -882,6 +903,7 @@ BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)  LLIMGroupChiclet::Params::Params()  : group_icon("group_icon") +, chiclet_button("chiclet_button")  , unread_notifications("unread_notifications")  , speaker("speaker")  , new_message_icon("new_message_icon") @@ -895,6 +917,10 @@ LLIMGroupChiclet::LLIMGroupChiclet(const Params& p)  , mChicletIconCtrl(NULL)  , mPopupMenu(NULL)  { +	LLButton::Params button_params = p.chiclet_button; +	mChicletButton = LLUICtrlFactory::create<LLButton>(button_params); +	addChild(mChicletButton); +  	LLIconCtrl::Params new_msg_params = p.new_message_icon;  	mNewMessagesIcon = LLUICtrlFactory::create<LLIconCtrl>(new_msg_params);  	addChild(mNewMessagesIcon); @@ -1409,6 +1435,32 @@ S32	LLChicletPanel::notifyParent(const LLSD& info)  	return LLPanel::notifyParent(info);  } +void LLChicletPanel::setChicletToggleState(const LLUUID& session_id, bool toggle) +{ +	if(session_id.isNull()) +	{ +		llwarns << "Null Session ID" << llendl; +	} + +	// toggle off all chiclets, except specified +	S32 size = getChicletCount(); +	for(int n = 0; n < size; ++n) +	{ +		LLIMChiclet* chiclet = getChiclet<LLIMChiclet>(n); +		if(chiclet && chiclet->getSessionId() != session_id) +		{ +			chiclet->setToggleState(false); +		} +	} + +	// toggle specified chiclet +	LLIMChiclet* chiclet = findChiclet<LLIMChiclet>(session_id); +	if(chiclet) +	{ +		chiclet->setToggleState(toggle); +	} +} +  void LLChicletPanel::arrange()  {  	if(mChicletList.empty()) @@ -1801,6 +1853,7 @@ LLChicletSpeakerCtrl::LLChicletSpeakerCtrl(const Params&p)  LLScriptChiclet::Params::Params()   : icon("icon") + , chiclet_button("chiclet_button")   , new_message_icon("new_message_icon")  {  } @@ -1809,6 +1862,10 @@ LLScriptChiclet::LLScriptChiclet(const Params&p)   : LLIMChiclet(p)   , mChicletIconCtrl(NULL)  { +	LLButton::Params button_params = p.chiclet_button; +	mChicletButton = LLUICtrlFactory::create<LLButton>(button_params); +	addChild(mChicletButton); +  	LLIconCtrl::Params new_msg_params = p.new_message_icon;  	mNewMessagesIcon = LLUICtrlFactory::create<LLIconCtrl>(new_msg_params);  	addChild(mNewMessagesIcon); @@ -1857,6 +1914,7 @@ static const std::string INVENTORY_USER_OFFER	("UserGiveItem");  LLInvOfferChiclet::Params::Params()   : icon("icon") + , chiclet_button("chiclet_button")   , new_message_icon("new_message_icon")  {  } @@ -1865,6 +1923,10 @@ LLInvOfferChiclet::LLInvOfferChiclet(const Params&p)   : LLIMChiclet(p)   , mChicletIconCtrl(NULL)  { +	LLButton::Params button_params = p.chiclet_button; +	mChicletButton = LLUICtrlFactory::create<LLButton>(button_params); +	addChild(mChicletButton); +  	LLIconCtrl::Params new_msg_params = p.new_message_icon;  	mNewMessagesIcon = LLUICtrlFactory::create<LLIconCtrl>(new_msg_params);  	addChild(mNewMessagesIcon); diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index 3665e4d093..ae5b2148db 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -422,6 +422,8 @@ public:  	 */  	virtual void onMouseDown(); +	virtual void setToggleState(bool toggle); +  protected:  	LLIMChiclet(const LLIMChiclet::Params& p); @@ -438,7 +440,7 @@ protected:  	LLIconCtrl* mNewMessagesIcon;  	LLChicletNotificationCounterCtrl* mCounterCtrl;  	LLChicletSpeakerCtrl* mSpeakerCtrl; - +	LLButton* mChicletButton;  	/** the id of another participant, either an avatar id or a group id*/  	LLUUID mOtherParticipantId; @@ -473,6 +475,8 @@ class LLIMP2PChiclet : public LLIMChiclet  public:  	struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>  	{ +		Optional<LLButton::Params> chiclet_button; +  		Optional<LLChicletAvatarIconCtrl::Params> avatar_icon;  		Optional<LLChicletNotificationCounterCtrl::Params> unread_notifications; @@ -538,6 +542,8 @@ class LLAdHocChiclet : public LLIMChiclet  public:  	struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>  	{ +		Optional<LLButton::Params> chiclet_button; +  		Optional<LLChicletAvatarIconCtrl::Params> avatar_icon;  		Optional<LLChicletNotificationCounterCtrl::Params> unread_notifications; @@ -614,6 +620,8 @@ public:  	struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>  	{ +		Optional<LLButton::Params> chiclet_button; +  		Optional<LLIconCtrl::Params> icon;  		Optional<LLIconCtrl::Params> new_message_icon; @@ -656,6 +664,8 @@ public:  	struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>  	{ +		Optional<LLButton::Params> chiclet_button; +  		Optional<LLChicletInvOfferIconCtrl::Params> icon;  		Optional<LLIconCtrl::Params> new_message_icon; @@ -697,6 +707,8 @@ public:  	struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>  	{ +		Optional<LLButton::Params> chiclet_button; +  		Optional<LLChicletGroupIconCtrl::Params> group_icon;  		Optional<LLChicletNotificationCounterCtrl::Params> unread_notifications; @@ -1040,6 +1052,11 @@ public:  	S32	notifyParent(const LLSD& info); +	/** +	 * Toggle chiclet by session id ON and toggle OFF all other chiclets. +	 */ +	void setChicletToggleState(const LLUUID& session_id, bool toggle); +  protected:  	LLChicletPanel(const Params&p);  	friend class LLUICtrlFactory; diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp index eb9a2fec2f..72074955d1 100644 --- a/indra/newview/llcompilequeue.cpp +++ b/indra/newview/llcompilequeue.cpp @@ -59,7 +59,6 @@  #include "llbutton.h"  #include "lldir.h" -#include "llfloaterchat.h"  #include "llnotificationsutil.h"  #include "llviewerstats.h"  #include "llvfile.h" @@ -447,14 +446,10 @@ void LLFloaterCompileQueue::scriptArrived(LLVFS *vfs, const LLUUID& asset_id,  		if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status )  		{ -			LLChat chat(LLTrans::getString("CompileQueueScriptNotFound")); -			LLFloaterChat::addChat(chat);  			buffer = LLTrans::getString("CompileQueueProblemDownloading") + (": ") + data->mScriptName;  		}  		else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)  		{ -			LLChat chat(LLTrans::getString("CompileQueueInsufficientPermDownload")); -			LLFloaterChat::addChat(chat);  			buffer = LLTrans::getString("CompileQueueInsufficientPermFor") + (": ") + data->mScriptName;  		}  		else diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 4103ccf175..fb94657278 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -483,6 +483,10 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  				if (drop)  				{ +					if (mItems.empty()) +					{ +						setLandingTab(NULL); +					}  					handleNewFavoriteDragAndDrop(item, favorites_id, x, y);  					showDragMarker(FALSE);  				} @@ -508,14 +512,14 @@ void LLFavoritesBarCtrl::handleExistingFavoriteDragAndDrop(S32 x, S32 y)  	if (dest)  	{ -		updateItemsOrder(mItems, mDragItemId, dest->getLandmarkId()); +		LLInventoryModel::updateItemsOrder(mItems, mDragItemId, dest->getLandmarkId());  	}  	else  	{  		mItems.push_back(gInventory.getItem(mDragItemId));  	} -	saveItemsOrder(mItems); +	gInventory.saveItemsOrder(mItems);  	LLToggleableMenu* menu = (LLToggleableMenu*) mPopupMenuHandle.get(); @@ -1193,25 +1197,6 @@ BOOL LLFavoritesBarCtrl::needToSaveItemsOrder(const LLInventoryModel::item_array  	return result;  } -void LLFavoritesBarCtrl::saveItemsOrder(LLInventoryModel::item_array_t& items) -{ -	int sortField = 0; - -	// current order is saved by setting incremental values (1, 2, 3, ...) for the sort field -	for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) -	{ -		LLViewerInventoryItem* item = *i; - -		item->setSortField(++sortField); -		item->setComplete(TRUE); -		item->updateServer(FALSE); - -		gInventory.updateItem(item); -	} - -	gInventory.notifyObservers(); -} -  LLInventoryModel::item_array_t::iterator LLFavoritesBarCtrl::findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id)  {  	LLInventoryModel::item_array_t::iterator result = items.end(); @@ -1228,15 +1213,6 @@ LLInventoryModel::item_array_t::iterator LLFavoritesBarCtrl::findItemByUUID(LLIn  	return result;  } -void LLFavoritesBarCtrl::updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& srcItemId, const LLUUID& destItemId) -{ -	LLViewerInventoryItem* srcItem = gInventory.getItem(srcItemId); -	LLViewerInventoryItem* destItem = gInventory.getItem(destItemId); - -	items.erase(findItemByUUID(items, srcItem->getUUID())); -	items.insert(findItemByUUID(items, destItem->getUUID()), srcItem); -} -  void LLFavoritesBarCtrl::insertBeforeItem(LLInventoryModel::item_array_t& items, const LLUUID& beforeItemId, LLViewerInventoryItem* insertedItem)  {  	LLViewerInventoryItem* beforeItem = gInventory.getItem(beforeItemId); diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h index 9ac734baff..40dd551eef 100644 --- a/indra/newview/llfavoritesbar.h +++ b/indra/newview/llfavoritesbar.h @@ -126,16 +126,7 @@ private:  	// checks if the current order of the favorites items must be saved  	BOOL needToSaveItemsOrder(const LLInventoryModel::item_array_t& items); -	// saves current order of the favorites items -	void saveItemsOrder(LLInventoryModel::item_array_t& items); - -	/* -	 * changes favorites items order by insertion of the item identified by srcItemId -	 * BEFORE the item identified by destItemId. both items must exist in items array. -	 */ -	void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& srcItemId, const LLUUID& destItemId); - -	/* +	/**  	 * inserts an item identified by insertedItemId BEFORE an item identified by beforeItemId.  	 * this function assumes that an item identified by insertedItemId doesn't exist in items array.  	 */ diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp index 538b44c056..5c3a54e34b 100644 --- a/indra/newview/llfloaterbulkpermission.cpp +++ b/indra/newview/llfloaterbulkpermission.cpp @@ -48,7 +48,6 @@  #include "llresmgr.h"  #include "llbutton.h"  #include "lldir.h" -#include "llfloaterchat.h"  #include "llviewerstats.h"  #include "lluictrlfactory.h"  #include "llselectmgr.h" diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp index a0c018454a..fc1230d576 100644 --- a/indra/newview/llfloaterchat.cpp +++ b/indra/newview/llfloaterchat.cpp @@ -37,8 +37,6 @@  #include "llviewerprecompiledheaders.h" -#include "llfloaterchat.h" -  // project include  #include "llagent.h"  #include "llappviewer.h" diff --git a/indra/newview/llfloaterchatterbox.cpp b/indra/newview/llfloaterchatterbox.cpp index 5a5d88b058..da6d436e2e 100644 --- a/indra/newview/llfloaterchatterbox.cpp +++ b/indra/newview/llfloaterchatterbox.cpp @@ -38,7 +38,6 @@  #include "llfloaterreg.h"  #include "llfloaterchatterbox.h"  #include "lluictrlfactory.h" -#include "llfloaterchat.h"  #include "llfloaterfriends.h"  #include "llfloatergroups.h"  #include "llviewercontrol.h" @@ -134,22 +133,6 @@ BOOL LLFloaterChatterBox::postBuild()  		addFloater(LLFloaterMyFriends::getInstance(), TRUE);  	} -	if (gSavedSettings.getBOOL("ChatHistoryTornOff")) -	{ -		LLFloaterChat* floater_chat = LLFloaterChat::getInstance(); -		if(floater_chat) -		{ -			// add then remove to set up relationship for re-attach -			addFloater(floater_chat, FALSE); -			removeFloater(floater_chat); -			// reparent to floater view -			gFloaterView->addChild(floater_chat); -		} -	} -	else -	{ -		addFloater(LLFloaterChat::getInstance(), FALSE); -	}  	mTabContainer->lockTabs();  	return TRUE;  } @@ -230,8 +213,6 @@ void LLFloaterChatterBox::onOpen(const LLSD& key)  	//*TODO:Skinning show the session id associated with key  	if (key.asString() == "local")  	{ -		LLFloaterChat* chat = LLFloaterReg::findTypedInstance<LLFloaterChat>("chat"); -		chat->openFloater();  	}  	else if (key.isDefined())  	{ @@ -245,12 +226,6 @@ void LLFloaterChatterBox::onOpen(const LLSD& key)  void LLFloaterChatterBox::onVisibilityChange ( const LLSD& new_visibility )  { -	// HACK: potentially need to toggle console -	LLFloaterChat* instance = LLFloaterChat::getInstance(); -	if(instance) -	{ -		instance->updateConsoleVisibility(); -	}  }  void LLFloaterChatterBox::removeFloater(LLFloater* floaterp) @@ -349,8 +324,7 @@ LLFloater* LLFloaterChatterBox::getCurrentVoiceFloater()  	}  	if (LLVoiceChannelProximal::getInstance() == LLVoiceChannel::getCurrentVoiceChannel())  	{ -		// show near me tab if in proximal channel -		return LLFloaterChat::getInstance(); +		return NULL;  	}  	else  	{ diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index 6a9c602db2..de65c6f876 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -110,7 +110,7 @@ LLFloaterGesture::LLFloaterGesture(const LLSD& key)  	mCommitCallbackRegistrar.add("Gesture.Action.ToogleActiveState", boost::bind(&LLFloaterGesture::onActivateBtnClick, this));  	mCommitCallbackRegistrar.add("Gesture.Action.ShowPreview", boost::bind(&LLFloaterGesture::onClickEdit, this)); -	mCommitCallbackRegistrar.add("Gesture.Action.CopyPast", boost::bind(&LLFloaterGesture::onCopyPastAction, this, _2)); +	mCommitCallbackRegistrar.add("Gesture.Action.CopyPaste", boost::bind(&LLFloaterGesture::onCopyPasteAction, this, _2));  	mCommitCallbackRegistrar.add("Gesture.Action.SaveToCOF", boost::bind(&LLFloaterGesture::addToCurrentOutFit, this));  	mEnableCallbackRegistrar.add("Gesture.EnableAction", boost::bind(&LLFloaterGesture::isActionEnabled, this, _2)); @@ -245,6 +245,7 @@ void LLFloaterGesture::refreshAll()  void LLFloaterGesture::buildGestureList()  { +	S32 scroll_pos = mGestureList->getScrollPos();  	std::vector<LLUUID> selected_items;  	getSelectedIds(selected_items);  	LL_DEBUGS("Gesture")<< "Rebuilding gesture list "<< LL_ENDL; @@ -274,13 +275,14 @@ void LLFloaterGesture::buildGestureList()  			}  		}  	} +  	// attempt to preserve scroll position through re-builds -	// since we do re-build any time anything dirties +	// since we do re-build whenever something gets dirty  	for(std::vector<LLUUID>::iterator it = selected_items.begin(); it != selected_items.end(); it++)  	{  		mGestureList->selectByID(*it);  	} -	mGestureList->scrollToShowSelected(); +	mGestureList->setScrollPos(scroll_pos);  }  void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gesture,LLCtrlListInterface * list ) @@ -475,7 +477,7 @@ void LLFloaterGesture::onActivateBtnClick()  	}  } -void LLFloaterGesture::onCopyPastAction(const LLSD& command) +void LLFloaterGesture::onCopyPasteAction(const LLSD& command)  {  	std::string command_name  = command.asString();  	// since we select this comman inventory item had  already arrived . diff --git a/indra/newview/llfloatergesture.h b/indra/newview/llfloatergesture.h index 14e132900d..629d77b949 100644 --- a/indra/newview/llfloatergesture.h +++ b/indra/newview/llfloatergesture.h @@ -99,7 +99,7 @@ private:  	void onClickPlay();  	void onClickNew();  	void onCommitList(); -	void onCopyPastAction(const LLSD& command); +	void onCopyPasteAction(const LLSD& command);  	void onDeleteSelected();  	LLUUID mSelectedID; diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 186fb0c9bc..7d8259126e 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -326,6 +326,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)  	mCommitCallbackRegistrar.add("Pref.UpdateSliderText",       boost::bind(&LLFloaterPreference::onUpdateSliderText,this, _1,_2));	  	mCommitCallbackRegistrar.add("Pref.AutoDetectAspect",       boost::bind(&LLFloaterPreference::onCommitAutoDetectAspect, this));	  	mCommitCallbackRegistrar.add("Pref.ParcelMediaAutoPlayEnable",       boost::bind(&LLFloaterPreference::onCommitParcelMediaAutoPlayEnable, this));	 +	mCommitCallbackRegistrar.add("Pref.MediaEnabled",           boost::bind(&LLFloaterPreference::onCommitMediaEnabled, this));	  	mCommitCallbackRegistrar.add("Pref.onSelectAspectRatio",    boost::bind(&LLFloaterPreference::onKeystrokeAspectRatio, this));	  	mCommitCallbackRegistrar.add("Pref.QualityPerformance",     boost::bind(&LLFloaterPreference::onChangeQuality, this, _2));	  	mCommitCallbackRegistrar.add("Pref.applyUIColor",			boost::bind(&LLFloaterPreference::applyUIColor, this ,_1, _2)); @@ -994,16 +995,18 @@ void LLFloaterPreference::onCommitParcelMediaAutoPlayEnable()  	gSavedSettings.setBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING, autoplay);  	lldebugs << "autoplay now = " << int(autoplay) << llendl; +} -	if (autoplay) -	{ -		// autoplay toggle has gone from FALSE to TRUE; ensure that -		// the media system is thus actually turned on too. -		gSavedSettings.setBOOL("AudioStreamingVideo", TRUE); -		gSavedSettings.setBOOL("AudioStreamingMusic", TRUE); -		gSavedSettings.setBOOL("AudioStreamingMedia", TRUE); -		llinfos << "autoplay turned on, turned all media subsystems on" << llendl; -	} +void LLFloaterPreference::onCommitMediaEnabled() +{ +	LLCheckBoxCtrl *media_enabled_ctrl = getChild<LLCheckBoxCtrl>("media_enabled"); +	bool enabled = media_enabled_ctrl->get(); +	gSavedSettings.setBOOL("AudioStreamingVideo", enabled); +	gSavedSettings.setBOOL("AudioStreamingMusic", enabled); +	gSavedSettings.setBOOL("AudioStreamingMedia", enabled); +	media_enabled_ctrl->setTentative(false); +	// Update enabled state of the "autoplay" checkbox +	getChild<LLCheckBoxCtrl>("autoplay_enabled")->setEnabled(enabled);  }  void LLFloaterPreference::refresh() @@ -1420,6 +1423,20 @@ BOOL LLPanelPreference::postBuild()  		refresh();  	} +	//////////////////////PanelPrivacy /////////////////// +	if(hasChild("media_enabled")) +	{ +		bool video_enabled = gSavedSettings.getBOOL("AudioStreamingVideo"); +		bool music_enabled = gSavedSettings.getBOOL("AudioStreamingMusic"); +		bool media_enabled = gSavedSettings.getBOOL("AudioStreamingMedia"); +		bool enabled = video_enabled || music_enabled || media_enabled; +		 +		LLCheckBoxCtrl *media_enabled_ctrl = getChild<LLCheckBoxCtrl>("media_enabled");	 +		media_enabled_ctrl->set(enabled); +		media_enabled_ctrl->setTentative(!(video_enabled == music_enabled == media_enabled)); +		getChild<LLCheckBoxCtrl>("autoplay_enabled")->setEnabled(enabled); +	} +	  	apply();  	return true;  } diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index b7ddc1fe64..6f382620ee 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -133,6 +133,7 @@ public:  	void onCommitAutoDetectAspect();  	void onCommitParcelMediaAutoPlayEnable(); +	void onCommitMediaEnabled();  	void applyResolution();  	void applyUIColor(LLUICtrl* ctrl, const LLSD& param);  	void getUIColor(LLUICtrl* ctrl, const LLSD& param);	 diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 023559de44..120b9cf65d 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -1603,7 +1603,7 @@ std::string all_estates_text()  	}  	else if (region && region->getOwner() == gAgent.getID())  	{ -		return LLTrans::getString("AllEstatesYouOwn"); +		return LLTrans::getString("RegionInfoAllEstatesYouOwn");  	}  	else if (region && region->isEstateManager())  	{ diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index f53b62e490..afb58c9407 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -2078,8 +2078,10 @@ void LLFloaterSnapshot::draw()  	{		  		if(previewp->getThumbnailImage())  		{ +			LLRect thumbnail_rect = getChild<LLUICtrl>("thumbnail_placeholder")->getRect(); +  			S32 offset_x = (getRect().getWidth() - previewp->getThumbnailWidth()) / 2 ; -			S32 offset_y = getRect().getHeight() - 205 + (90 - previewp->getThumbnailHeight()) / 2 ; +			S32 offset_y = thumbnail_rect.mBottom + (thumbnail_rect.getHeight() - previewp->getThumbnailHeight()) / 2 ;  			glMatrixMode(GL_MODELVIEW);  			gl_draw_scaled_image(offset_x, offset_y,  diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index bd6d8972e4..a3b487b0cc 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -116,9 +116,12 @@ public:  	{  		if (params.size() == 0)  		{ -			return false; +			// support the secondlife:///app/worldmap SLapp +			LLFloaterReg::showInstance("world_map", "center"); +			return true;  		} +		// support the secondlife:///app/worldmap/{LOCATION}/{COORDS} SLapp  		const std::string region_name = params[0].asString();  		S32 x = (params.size() > 1) ? params[1].asInteger() : 128;  		S32 y = (params.size() > 2) ? params[2].asInteger() : 128; diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 9aed403991..a63fb73032 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -78,7 +78,7 @@  ///----------------------------------------------------------------------------  const S32 RENAME_WIDTH_PAD = 4; -const S32 RENAME_HEIGHT_PAD = 2; +const S32 RENAME_HEIGHT_PAD = 1;  const S32 AUTO_OPEN_STACK_DEPTH = 16;  const S32 MIN_ITEM_WIDTH_VISIBLE = LLFolderViewItem::ICON_WIDTH  			+ LLFolderViewItem::ICON_PAD  @@ -1885,8 +1885,8 @@ void LLFolderView::scrollToShowItem(LLFolderViewItem* item, const LLRect& constr  		S32 icon_height = mIcon.isNull() ? 0 : mIcon->getHeight();   		S32 label_height = llround(getLabelFontForStyle(mLabelStyle)->getLineHeight());  -		// when navigating with keyboard, only move top of folders on screen, otherwise show whole folder -		S32 max_height_to_show = mScrollContainer->hasFocus() ? (llmax( icon_height, label_height ) + ICON_PAD) : local_rect.getHeight();  +		// when navigating with keyboard, only move top of opened folder on screen, otherwise show whole folder +		S32 max_height_to_show = item->isOpen() && mScrollContainer->hasFocus() ? (llmax( icon_height, label_height ) + ICON_PAD) : local_rect.getHeight();   		// get portion of item that we want to see...  		LLRect item_local_rect = LLRect(item->getIndentation(),  @@ -2221,10 +2221,9 @@ void LLFolderView::updateRenamerPosition()  {  	if(mRenameItem)  	{ -		LLFontGL* font = getLabelFontForStyle(mLabelStyle); - -		S32 x = ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD - 1 + mRenameItem->getIndentation(); -		S32 y = llfloor(mRenameItem->getRect().getHeight() - font->getLineHeight()-2); +		// See also LLFolderViewItem::draw() +		S32 x = ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mRenameItem->getIndentation(); +		S32 y = mRenameItem->getRect().getHeight() - mRenameItem->getItemHeight() - RENAME_HEIGHT_PAD;  		mRenameItem->localPointToScreen( x, y, &x, &y );  		screenPointToLocal( x, y, &x, &y );  		mRenamer->setOrigin( x, y ); @@ -2236,7 +2235,7 @@ void LLFolderView::updateRenamerPosition()  		}  		S32 width = llmax(llmin(mRenameItem->getRect().getWidth() - x, scroller_rect.getWidth() - x - getRect().mLeft), MINIMUM_RENAMER_WIDTH); -		S32 height = llfloor(font->getLineHeight() + RENAME_HEIGHT_PAD); +		S32 height = mRenameItem->getItemHeight() - RENAME_HEIGHT_PAD;  		mRenamer->reshape( width, height, TRUE );  	}  } diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 2363f51d80..4b48626b22 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -855,6 +855,7 @@ void LLFolderViewItem::draw()  			ARROW_SIZE, ARROW_SIZE, mControlLabelRotation, arrow_image->getImage(), sFgColor);  	} +	// See also LLFolderView::updateRenamerPosition()  	F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation);  	LLFontGL* font = getLabelFontForStyle(mLabelStyle); diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index aee34eb0af..d7c60ff34e 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -42,7 +42,6 @@  #include "llbottomtray.h"  #include "llchannelmanager.h"  #include "llchiclet.h" -#include "llfloaterchat.h"  #include "llfloaterreg.h"  #include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container  #include "lllayoutstack.h" @@ -115,6 +114,8 @@ LLIMFloater::LLIMFloater(const LLUUID& session_id)  void LLIMFloater::onFocusLost()  {  	LLIMModel::getInstance()->resetActiveSessionID(); +	 +	LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, false);  }  void LLIMFloater::onFocusReceived() @@ -126,6 +127,8 @@ void LLIMFloater::onFocusReceived()  	{  		mInputEditor->setFocus(TRUE);  	} + +	LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, true);  }  // virtual @@ -490,6 +493,15 @@ void LLIMFloater::setVisible(BOOL visible)  		updateMessages();  		mInputEditor->setFocus(TRUE);  	} + +	if(!visible) +	{ +		LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(mSessionID); +		if(chiclet) +		{ +			chiclet->setToggleState(false); +		} +	}  }  //static diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index 74e0a06a34..fad28015a8 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -59,7 +59,6 @@  #include "llinventory.h"  #include "llinventorymodel.h"  #include "llfloaterinventory.h" -#include "llfloaterchat.h"  #include "lliconctrl.h"  #include "llkeyboard.h"  #include "lllineeditor.h" diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index f8ac6660fc..b53d36a074 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -51,7 +51,6 @@  #include "llchat.h"  #include "llchiclet.h"  #include "llresmgr.h" -#include "llfloaterchat.h"  #include "llfloaterchatterbox.h"  #include "llavataractions.h"  #include "llhttpnode.h" @@ -2237,7 +2236,6 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess  		LLChat chat(message);  		chat.mSourceType = CHAT_SOURCE_SYSTEM; -		LLFloaterChat::addChatHistory(chat);  		LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());  		if(nearby_chat) @@ -2405,7 +2403,9 @@ LLUUID LLIMMgr::addSession(  	//we don't need to show notes about online/offline, mute/unmute users' statuses for existing sessions  	if (!new_session) return session_id; -	noteOfflineUsers(session_id, floater, ids); +	//Per Plan's suggestion commented "explicit offline status warning" out to make Dessie happier (see EXT-3609) +	//*TODO After February 2010 remove this commented out line if no one will be missing that warning +	//noteOfflineUsers(session_id, floater, ids);  	// Only warn for regular IMs - not group IMs  	if( dialog == IM_NOTHING_SPECIAL ) @@ -3137,9 +3137,6 @@ public:  				ll_vector3_from_sd(message_params["position"]),  				true); -			chat.mText = std::string("IM: ") + name + separator_string + saved + message; -			LLFloaterChat::addChat(chat, TRUE, is_this_agent); -  			//K now we want to accept the invitation  			std::string url = gAgent.getRegion()->getCapability(  				"ChatSessionRequest"); diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 6e72a7a4f7..099f863dc9 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2931,80 +2931,6 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response  	return false;  } -/* -Next functions intended to reorder items in the inventory folder and save order on server -Is now used for Favorites folder. - -*TODO: refactoring is needed with Favorites Bar functionality. Probably should be moved in LLInventoryModel -*/ -void saveItemsOrder(LLInventoryModel::item_array_t& items) -{ -	int sortField = 0; - -	// current order is saved by setting incremental values (1, 2, 3, ...) for the sort field -	for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) -	{ -		LLViewerInventoryItem* item = *i; - -		item->setSortField(++sortField); -		item->setComplete(TRUE); -		item->updateServer(FALSE); - -		gInventory.updateItem(item); - -		// Tell the parent folder to refresh its sort order. -		gInventory.addChangedMask(LLInventoryObserver::SORT, item->getParentUUID()); -	} - -	gInventory.notifyObservers(); -} - -LLInventoryModel::item_array_t::iterator findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id) -{ -	LLInventoryModel::item_array_t::iterator result = items.end(); - -	for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) -	{ -		if ((*i)->getUUID() == id) -		{ -			result = i; -			break; -		} -	} - -	return result; -} - -// See also LLInventorySort where landmarks in the Favorites folder are sorted. -class LLViewerInventoryItemSort -{ -public: -	bool operator()(const LLPointer<LLViewerInventoryItem>& a, const LLPointer<LLViewerInventoryItem>& b) -	{ -		return a->getSortField() < b->getSortField(); -	} -}; - -/** - * Sorts passed items by LLViewerInventoryItem sort field. - * - * @param[in, out] items - array of items, not sorted. - */ -void rearrange_item_order_by_sort_field(LLInventoryModel::item_array_t& items) -{ -	static LLViewerInventoryItemSort sort_functor; -	std::sort(items.begin(), items.end(), sort_functor); -} - -void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& srcItemId, const LLUUID& destItemId) -{ -	LLViewerInventoryItem* srcItem = gInventory.getItem(srcItemId); -	LLViewerInventoryItem* destItem = gInventory.getItem(destItemId); - -	items.erase(findItemByUUID(items, srcItem->getUUID())); -	items.insert(findItemByUUID(items, destItem->getUUID()), srcItem); -} -  BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  										BOOL drop)  { @@ -3087,36 +3013,34 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			// if dragging from/into favorites folder only reorder items  			if ((mUUID == inv_item->getParentUUID()) && folder_allows_reorder)  			{ -				LLInventoryModel::cat_array_t cats; -				LLInventoryModel::item_array_t items; -				LLIsType is_type(LLAssetType::AT_LANDMARK); -				model->collectDescendentsIf(mUUID, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); -  				LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());  				LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL;  				if (itemp)  				{  					LLUUID srcItemId = inv_item->getUUID();  					LLUUID destItemId = itemp->getListener()->getUUID(); - -					// ensure items are sorted properly before changing order. EXT-3498 -					rearrange_item_order_by_sort_field(items); - -					// update order -					updateItemsOrder(items, srcItemId, destItemId); - -					saveItemsOrder(items); +					gInventory.rearrangeFavoriteLandmarks(srcItemId, destItemId);  				}  			}  			else if (favorites_id == mUUID) // if target is the favorites folder we use copy  			{ +				// use callback to rearrange favorite landmarks after adding +				// to have new one placed before target (on which it was dropped). See EXT-4312. +				LLPointer<AddFavoriteLandmarkCallback> cb = new AddFavoriteLandmarkCallback(); +				LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); +				LLFolderViewItem* drag_over_item = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL; +				if (drag_over_item && drag_over_item->getListener()) +				{ +					cb.get()->setTargetLandmarkId(drag_over_item->getListener()->getUUID()); +				} +  				copy_inventory_item(  					gAgent.getID(),  					inv_item->getPermissions().getOwner(),  					inv_item->getUUID(),  					mUUID,  					std::string(), -					LLPointer<LLInventoryCallback>(NULL)); +					cb);  			}  			else if (move_is_into_current_outfit || move_is_into_outfit)  			{ diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index e3caabf08f..2885ba13fa 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -51,7 +51,6 @@  #include "llappearancemgr.h"  #include "llappviewer.h"  //#include "llfirstuse.h" -#include "llfloaterchat.h"  #include "llfloatercustomize.h"  #include "llfocusmgr.h"  #include "llfolderview.h" diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index cab4c6048e..8fab8d116a 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -3627,6 +3627,98 @@ BOOL LLInventoryModel::getIsFirstTimeInViewer2()  	return sFirstTimeInViewer2;  } +static LLInventoryModel::item_array_t::iterator find_item_iter_by_uuid(LLInventoryModel::item_array_t& items, const LLUUID& id) +{ +	LLInventoryModel::item_array_t::iterator result = items.end(); + +	for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) +	{ +		if ((*i)->getUUID() == id) +		{ +			result = i; +			break; +		} +	} + +	return result; +} + +// static +void LLInventoryModel::updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& src_item_id, const LLUUID& dest_item_id) +{ +	LLInventoryModel::item_array_t::iterator it_src = find_item_iter_by_uuid(items, src_item_id); +	LLInventoryModel::item_array_t::iterator it_dest = find_item_iter_by_uuid(items, dest_item_id); + +	if (it_src == items.end() || it_dest == items.end()) return; + +	LLViewerInventoryItem* src_item = *it_src; +	items.erase(it_src); +	 +	// target iterator can not be valid because the container was changed, so update it. +	it_dest = find_item_iter_by_uuid(items, dest_item_id); +	items.insert(it_dest, src_item); +} + +void LLInventoryModel::saveItemsOrder(const LLInventoryModel::item_array_t& items) +{ +	int sortField = 0; + +	// current order is saved by setting incremental values (1, 2, 3, ...) for the sort field +	for (item_array_t::const_iterator i = items.begin(); i != items.end(); ++i) +	{ +		LLViewerInventoryItem* item = *i; + +		item->setSortField(++sortField); +		item->setComplete(TRUE); +		item->updateServer(FALSE); + +		updateItem(item); + +		// Tell the parent folder to refresh its sort order. +		addChangedMask(LLInventoryObserver::SORT, item->getParentUUID()); +	} + +	notifyObservers(); +} + +// See also LLInventorySort where landmarks in the Favorites folder are sorted. +class LLViewerInventoryItemSort +{ +public: +	bool operator()(const LLPointer<LLViewerInventoryItem>& a, const LLPointer<LLViewerInventoryItem>& b) +	{ +		return a->getSortField() < b->getSortField(); +	} +}; + +/** + * Sorts passed items by LLViewerInventoryItem sort field. + * + * @param[in, out] items - array of items, not sorted. + */ +static void rearrange_item_order_by_sort_field(LLInventoryModel::item_array_t& items) +{ +	static LLViewerInventoryItemSort sort_functor; +	std::sort(items.begin(), items.end(), sort_functor); +} + +void LLInventoryModel::rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id) +{ +	LLInventoryModel::cat_array_t cats; +	LLInventoryModel::item_array_t items; +	LLIsType is_type(LLAssetType::AT_LANDMARK); +	LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); +	gInventory.collectDescendentsIf(favorites_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); + +	// ensure items are sorted properly before changing order. EXT-3498 +	rearrange_item_order_by_sort_field(items); + +	// update order +	updateItemsOrder(items, source_item_id, target_item_id); + +	saveItemsOrder(items); +} +  //----------------------------------------------------------------------------  // *NOTE: DEBUG functionality diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index 39377b4ae2..2a2b48ce3c 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -384,6 +384,39 @@ public:  	void setLibraryOwnerID(const LLUUID& id);  	void setLibraryRootFolderID(const LLUUID& id); + +	/** +	 * Changes items order by insertion of the item identified by src_item_id +	 * BEFORE the item identified by dest_item_id. Both items must exist in items array. +	 * +	 * Sorting is stored after method is finished. Only src_item_id is moved before dest_item_id. +	 * +	 * @param[in, out] items - vector with items to be updated. It should be sorted in a right way +	 * before calling this method. +	 * @param src_item_id - LLUUID of inventory item to be moved in new position +	 * @param dest_item_id - LLUUID of inventory item before which source item should be placed. +	 */ +	static void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& src_item_id, const LLUUID& dest_item_id); + +	/** +	 * Saves current order of the passed items using inventory item sort field. +	 * +	 * It reset items' sort fields and saves them on server. +	 * Is used to save order for Favorites folder. +	 * +	 * @param[in] items vector of items in order to be saved. +	 */ +	void saveItemsOrder(const LLInventoryModel::item_array_t& items); + +	/** +	 * Rearranges Landmarks inside Favorites folder. +	 * Moves source landmark before target one. +	 * +	 * @param source_item_id - LLUUID of the source item to be moved into new position +	 * @param target_item_id - LLUUID of the target item before which source item should be placed. +	 */ +	void rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id); +  protected:  	// Internal methods which add inventory and make sure that all of diff --git a/indra/newview/lllocationhistory.cpp b/indra/newview/lllocationhistory.cpp index d910dbf718..ae1b8f8540 100644 --- a/indra/newview/lllocationhistory.cpp +++ b/indra/newview/lllocationhistory.cpp @@ -123,6 +123,12 @@ void LLLocationHistory::save() const  	// build filename for each user  	std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, mFilename); +	if (resolved_filename.empty()) +	{ +		llinfos << "can't get path to location history filename - probably not logged in yet." << llendl; +		return; +	} +  	// open a file for writing  	llofstream file (resolved_filename);  	if (!file.is_open()) diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 92f19c9232..4e5aaeb66a 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -35,7 +35,6 @@  #include "llagent.h"  #include "llagentui.h"  #include "lllogchat.h" -#include "llfloaterchat.h"  #include "lltrans.h"  #include "llviewercontrol.h" diff --git a/indra/newview/llmenucommands.cpp b/indra/newview/llmenucommands.cpp index 757eb3c9bc..8d950f072d 100644 --- a/indra/newview/llmenucommands.cpp +++ b/indra/newview/llmenucommands.cpp @@ -46,7 +46,6 @@  #include "llcallingcard.h"  #include "llviewercontrol.h"  //#include "llfirstuse.h" -#include "llfloaterchat.h"  #include "llfloaterworldmap.h"  #include "lllineeditor.h"  #include "llstatusbar.h" diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index b520bc1c2d..cf4a08ce76 100644 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -64,7 +64,6 @@  #include "llviewerwindow.h"  #include "llworld.h" //for particle system banning  #include "llchat.h" -#include "llfloaterchat.h"  #include "llimview.h"  #include "llnotifications.h"  #include "lluistring.h" @@ -258,7 +257,7 @@ LLMuteList::~LLMuteList()  {  	// If we quit from the login screen we will not have an SL account  	// name.  Don't try to save, otherwise we'll dump a file in -	// C:\Program Files\SecondLife\  JC +	// C:\Program Files\SecondLife\ or similar. JC  	std::string user_dir = gDirUtilp->getLindenUserDir();  	if (!user_dir.empty())  	{ @@ -532,9 +531,6 @@ void notify_automute_callback(const LLUUID& agent_id, const std::string& first_n  			LLIMModel::getInstance()->addMessage(agent_id, SYSTEM_FROM, LLUUID::null, message);  		} - -		LLChat auto_chat(message); -		LLFloaterChat::addChat(auto_chat, FALSE, FALSE);  	}  } diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index 96442fafcc..c50e049d4c 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -180,11 +180,6 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)  		if(panel && panel->messageID() == fromID && panel->canAddText())  		{ -			if (CHAT_STYLE_IRC == notification["chat_style"].asInteger()) -			{ -				notification["message"] = notification["from"].asString() + notification["message"].asString(); -			} -  			panel->addMessage(notification);  			toast->reshapeToPanel();  			toast->resetTimer(); @@ -349,7 +344,10 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg)  	// Handle irc styled messages for toast panel  	if (tmp_chat.mChatStyle == CHAT_STYLE_IRC)  	{ -		tmp_chat.mText = tmp_chat.mText.substr(3); +		if(!tmp_chat.mFromName.empty()) +			tmp_chat.mText = tmp_chat.mFromName + tmp_chat.mText.substr(3); +		else +			tmp_chat.mText = tmp_chat.mText.substr(3);  	}  	// arrange a channel on a screen diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index daec793d75..01291c4012 100644 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -419,9 +419,9 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)  		if(tab_land->getDisplayChildren())  			tab_land->changeOpenClose(tab_land->getDisplayChildren()); -		tab_roles->canOpenClose(false); -		tab_notices->canOpenClose(false); -		tab_land->canOpenClose(false); +		tab_roles->setVisible(false); +		tab_notices->setVisible(false); +		tab_land->setVisible(false);  		getChild<LLUICtrl>("group_name")->setVisible(false);  		getChild<LLUICtrl>("group_name_editor")->setVisible(true); @@ -443,9 +443,9 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)  		LLGroupData agent_gdatap;  		bool is_member = gAgent.getGroupData(mID,agent_gdatap); -		tab_roles->canOpenClose(is_member); -		tab_notices->canOpenClose(is_member); -		tab_land->canOpenClose(is_member); +		tab_roles->setVisible(is_member); +		tab_notices->setVisible(is_member); +		tab_land->setVisible(is_member);  		getChild<LLUICtrl>("group_name")->setVisible(true);  		getChild<LLUICtrl>("group_name_editor")->setVisible(false); diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index 6210973dae..45fc3d4688 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -614,7 +614,7 @@ void LLPanelGroupNotices::showNotice(const std::string& subject,  		mViewInventoryIcon->setVisible(TRUE);  		std::stringstream ss; -		ss << "        " << inventory_name; +		ss << "        " << LLViewerInventoryItem::getDisplayName(inventory_name);  		mViewInventoryName->setText(ss.str());  		mBtnOpenAttachment->setEnabled(TRUE); diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 30acf37f82..d6e407a0ed 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -35,6 +35,7 @@  #include "llbutton.h"  #include "llfloaterreg.h" +#include "llnotificationsutil.h"  #include "llsdutil.h"  #include "llsdutil_math.h"  #include "llregionhandle.h" @@ -632,8 +633,7 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const  		LLViewerInventoryItem* landmark = LLLandmarkActions::findLandmarkForAgentPos();  		if(landmark)  		{ -			LLSideTray::getInstance()->showPanel("panel_places",  -								LLSD().with("type", "landmark").with("id",landmark->getUUID())); +			LLNotificationsUtil::add("LandmarkAlreadyExists");  		}  		else  		{ diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index e74a39c85c..a5a61f0c7b 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -51,6 +51,8 @@  #include "llviewermenu.h"  #include "llviewertexturelist.h" +const std::string FILTERS_FILENAME("filters.xml"); +  static LLRegisterPanelClassWrapper<LLPanelMainInventory> t_inventory("panel_main_inventory");  void on_file_loaded_for_save(BOOL success,  @@ -160,7 +162,7 @@ BOOL LLPanelMainInventory::postBuild()  	// Now load the stored settings from disk, if available.  	std::ostringstream filterSaveName; -	filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml"); +	filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, FILTERS_FILENAME);  	llinfos << "LLPanelMainInventory::init: reading from " << filterSaveName << llendl;  	llifstream file(filterSaveName.str());  	LLSD savedFilterState; @@ -230,7 +232,7 @@ LLPanelMainInventory::~LLPanelMainInventory( void )  	}  	std::ostringstream filterSaveName; -	filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml"); +	filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, FILTERS_FILENAME);  	llofstream filtersFile(filterSaveName.str());  	if(!LLSDSerialize::toPrettyXML(filterRoot, filtersFile))  	{ diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 43366ef814..d4376550d6 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -445,7 +445,7 @@ bool remove_task_inventory_callback(const LLSD& notification, const LLSD& respon  }  // helper for remove -// ! REFACTOR ! two_uuids_list_t is also defined in llinevntorybridge.h, but differently. +// ! REFACTOR ! two_uuids_list_t is also defined in llinventorybridge.h, but differently.  typedef std::pair<LLUUID, std::list<LLUUID> > panel_two_uuids_list_t;  typedef std::pair<LLPanelObjectInventory*, panel_two_uuids_list_t> remove_data_t;  BOOL LLTaskInvFVBridge::removeItem() diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index e058b3b326..df73c27f54 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -35,6 +35,7 @@  #include "llagent.h"  #include "llagentwearables.h" +#include "llappearancemgr.h"  #include "llbutton.h"  #include "llfloaterreg.h" @@ -44,6 +45,8 @@  #include "llinventoryfunctions.h"  #include "llinventorypanel.h"  #include "lllandmark.h" +#include "lllineeditor.h" +#include "llmodaldialog.h"  #include "llsidepanelappearance.h"  #include "llsidetray.h"  #include "lltabcontainer.h" @@ -61,12 +64,75 @@  static LLRegisterPanelClassWrapper<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory");  bool LLPanelOutfitsInventory::sShowDebugEditor = false; +class LLOutfitSaveAsDialog : public LLModalDialog +{ +private: +	std::string	mItemName; +	std::string mTempItemName; +	 +	boost::signals2::signal<void (const std::string&)> mSaveAsSignal; + +public: +	LLOutfitSaveAsDialog( const LLSD& key ) +		: LLModalDialog( key ), +		  mTempItemName(key.asString()) +	{ +	} +		 +	BOOL postBuild() +	{ +		getChild<LLUICtrl>("Save")->setCommitCallback(boost::bind(&LLOutfitSaveAsDialog::onSave, this )); +		getChild<LLUICtrl>("Cancel")->setCommitCallback(boost::bind(&LLOutfitSaveAsDialog::onCancel, this )); +		 +		childSetTextArg("name ed", "[DESC]", mTempItemName); +		return TRUE; +	} + +	void setSaveAsCommit( const boost::signals2::signal<void (const std::string&)>::slot_type& cb ) +	{ +		mSaveAsSignal.connect(cb); +	} + +	virtual void onOpen(const LLSD& key) +	{ +		LLLineEditor* edit = getChild<LLLineEditor>("name ed"); +		if (edit) +		{ +			edit->setFocus(TRUE); +			edit->selectAll(); +		} +	} + +	void onSave() +	{ +		mItemName = childGetValue("name ed").asString(); +		LLStringUtil::trim(mItemName); +		if( !mItemName.empty() ) +		{ +			mSaveAsSignal(mItemName); +			closeFloater(); // destroys this object +		} +	} + +	void onCancel() +	{ +		closeFloater(); // destroys this object +	} +}; +	  LLPanelOutfitsInventory::LLPanelOutfitsInventory() :  	mActivePanel(NULL),  	mParent(NULL)  {  	mSavedFolderState = new LLSaveFolderState();  	mSavedFolderState->setApply(FALSE); + +	static bool registered_dialog = false; +	if (!registered_dialog) +	{ +		LLFloaterReg::add("outfit_save_as", "floater_outfit_save_as.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLOutfitSaveAsDialog>); +		registered_dialog = true; +	}  }  LLPanelOutfitsInventory::~LLPanelOutfitsInventory() @@ -177,10 +243,28 @@ void LLPanelOutfitsInventory::onEdit()  {  } -void LLPanelOutfitsInventory::onNew() +void LLPanelOutfitsInventory::onSave() +{ +	std::string outfit_name; + +	if (!LLAppearanceManager::getInstance()->getBaseOutfitName(outfit_name)) +	{ +		outfit_name = LLViewerFolderType::lookupNewCategoryName(LLFolderType::FT_OUTFIT); +	} + +	LLOutfitSaveAsDialog* save_as_dialog = LLFloaterReg::showTypedInstance<LLOutfitSaveAsDialog>("outfit_save_as", LLSD(outfit_name), TRUE); +	if (save_as_dialog) +	{ +		save_as_dialog->setSaveAsCommit(boost::bind(&LLPanelOutfitsInventory::onSaveCommit, this, _1 )); +	} +} + +void LLPanelOutfitsInventory::onSaveCommit(const std::string& outfit_name)  { -	const std::string& outfit_name = LLViewerFolderType::lookupNewCategoryName(LLFolderType::FT_OUTFIT);  	LLUUID outfit_folder = gAgentWearables.makeNewOutfitLinks(outfit_name); +	LLSD key; +	LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key); +  	if (mAppearanceTabs)  	{  		mAppearanceTabs->selectTabByName("outfitslist_tab"); @@ -291,7 +375,7 @@ void LLPanelOutfitsInventory::onGearButtonClick()  void LLPanelOutfitsInventory::onAddButtonClick()  { -	onNew(); +	onSave();  }  void LLPanelOutfitsInventory::showActionMenu(LLMenuGL* menu, std::string spawning_view_name) @@ -330,7 +414,7 @@ void LLPanelOutfitsInventory::onCustomAction(const LLSD& userdata)  	const std::string command_name = userdata.asString();  	if (command_name == "new")  	{ -		onNew(); +		onSave();  	}  	if (command_name == "edit")  	{ diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h index b117311775..76110e2a3f 100644 --- a/indra/newview/llpaneloutfitsinventory.h +++ b/indra/newview/llpaneloutfitsinventory.h @@ -59,7 +59,9 @@ public:  	void onAdd();  	void onRemove();  	void onEdit(); -	void onNew(); +	void onSave(); +	 +	void onSaveCommit(const std::string& item_name);  	void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);  	void onSelectorButtonClicked(); diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 03cc870a59..c14b282488 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -532,10 +532,10 @@ BOOL LLPanelPeople::postBuild()  	friends_panel->childSetAction("add_btn",	boost::bind(&LLPanelPeople::onAddFriendWizButtonClicked,	this));  	friends_panel->childSetAction("del_btn",	boost::bind(&LLPanelPeople::onDeleteFriendButtonClicked,	this)); -	mOnlineFriendList->setDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, mOnlineFriendList)); -	mAllFriendList->setDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, mAllFriendList)); -	mNearbyList->setDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, mNearbyList)); -	mRecentList->setDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, mRecentList)); +	mOnlineFriendList->setItemDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, _1)); +	mAllFriendList->setItemDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, _1)); +	mNearbyList->setItemDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, _1)); +	mRecentList->setItemDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, _1));  	mOnlineFriendList->setCommitCallback(boost::bind(&LLPanelPeople::onAvatarListCommitted, this, mOnlineFriendList));  	mAllFriendList->setCommitCallback(boost::bind(&LLPanelPeople::onAvatarListCommitted, this, mAllFriendList)); @@ -1005,12 +1005,15 @@ void LLPanelPeople::onTabSelected(const LLSD& param)  		mFilterEditor->setLabel(getString("people_filter_label"));  } -void LLPanelPeople::onAvatarListDoubleClicked(LLAvatarList* list) +void LLPanelPeople::onAvatarListDoubleClicked(LLUICtrl* ctrl)  { -	LLUUID clicked_id = list->getSelectedUUID(); - -	if (clicked_id.isNull()) +	LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(ctrl); +	if(!item) +	{  		return; +	} + +	LLUUID clicked_id = item->getAvatarId();  #if 0 // SJB: Useful for testing, but not currently functional or to spec  	LLAvatarActions::showProfile(clicked_id); diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index da2c0e368c..7580fdbeef 100644 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -109,7 +109,7 @@ private:  	void					onNearbyViewSortButtonClicked();  	void					onFriendsViewSortButtonClicked();  	void					onGroupsViewSortButtonClicked(); -	void					onAvatarListDoubleClicked(LLAvatarList* list); +	void					onAvatarListDoubleClicked(LLUICtrl* ctrl);  	void					onAvatarListCommitted(LLAvatarList* list);  	void					onGroupPlusButtonClicked();  	void					onGroupMinusButtonClicked(); diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 4f539f404d..2dc3a62637 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -160,8 +160,6 @@ BOOL LLPanelPrimMediaControls::postBuild()  	mSkipBackCtrl			= getChild<LLUICtrl>("skip_back");  	mVolumeCtrl				= getChild<LLUICtrl>("media_volume");  	mMuteBtn				= getChild<LLButton>("media_mute_button"); -	mVolumeUpCtrl			= getChild<LLUICtrl>("volume_up"); -	mVolumeDownCtrl			= getChild<LLUICtrl>("volume_down");  	mVolumeSliderCtrl       = getChild<LLSliderCtrl>("volume_slider");  	mWhitelistIcon			= getChild<LLIconCtrl>("media_whitelist_flag");  	mSecureLockIcon			= getChild<LLIconCtrl>("media_secure_lock_flag"); @@ -339,8 +337,6 @@ void LLPanelPrimMediaControls::updateShape()  		mMediaAddressCtrl->setVisible(has_focus && !mini_controls);  		mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);  		mVolumeCtrl->setVisible(false); -		mVolumeUpCtrl->setVisible(false); -		mVolumeDownCtrl->setVisible(false);  		mWhitelistIcon->setVisible(!mini_controls && (media_data)?media_data->getWhiteListEnable():false);  		// Disable zoom if HUD @@ -373,8 +369,6 @@ void LLPanelPrimMediaControls::updateShape()  			mSkipBackCtrl->setEnabled(has_focus && !mini_controls);  			mVolumeCtrl->setVisible(has_focus); -			mVolumeUpCtrl->setVisible(has_focus); -			mVolumeDownCtrl->setVisible(has_focus);  			mVolumeCtrl->setEnabled(has_focus);  			mVolumeSliderCtrl->setEnabled(has_focus && shouldVolumeSliderBeVisible());  			mVolumeSliderCtrl->setVisible(has_focus && shouldVolumeSliderBeVisible()); @@ -417,21 +411,15 @@ void LLPanelPrimMediaControls::updateShape()  			// video vloume  			if(volume <= 0.0)  			{ -				mVolumeUpCtrl->setEnabled(TRUE); -				mVolumeDownCtrl->setEnabled(FALSE);  				mMuteBtn->setToggleState(true);  			}  			else if (volume >= 1.0)  			{ -				mVolumeUpCtrl->setEnabled(FALSE); -				mVolumeDownCtrl->setEnabled(TRUE);  				mMuteBtn->setToggleState(false);  			}  			else  			{  				mMuteBtn->setToggleState(false); -				mVolumeUpCtrl->setEnabled(TRUE); -				mVolumeDownCtrl->setEnabled(TRUE);  			}  			switch(result) @@ -476,12 +464,8 @@ void LLPanelPrimMediaControls::updateShape()  			mSkipBackCtrl->setEnabled(FALSE);  			mVolumeCtrl->setVisible(FALSE); -			mVolumeUpCtrl->setVisible(FALSE); -			mVolumeDownCtrl->setVisible(FALSE);  			mVolumeSliderCtrl->setVisible(FALSE);  			mVolumeCtrl->setEnabled(FALSE); -			mVolumeUpCtrl->setEnabled(FALSE); -			mVolumeDownCtrl->setEnabled(FALSE);  			mVolumeSliderCtrl->setEnabled(FALSE);  			if (mMediaPanelScroll) diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h index 419f033628..743cec70a1 100644 --- a/indra/newview/llpanelprimmediacontrols.h +++ b/indra/newview/llpanelprimmediacontrols.h @@ -156,8 +156,6 @@ private:  	LLUICtrl *mMediaPlaySliderCtrl;  	LLUICtrl *mVolumeCtrl;  	LLButton *mMuteBtn; -	LLUICtrl *mVolumeUpCtrl; -	LLUICtrl *mVolumeDownCtrl;  	LLSliderCtrl *mVolumeSliderCtrl;  	LLIconCtrl *mWhitelistIcon;  	LLIconCtrl *mSecureLockIcon; diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 0a2217fc51..571745ee02 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -723,7 +723,10 @@ void LLTeleportHistoryPanel::onTeleportHistoryChange(S32 removed_index)  	if (-1 == removed_index)  		showTeleportHistory(); // recreate all items  	else +	{  		replaceItem(removed_index); // replace removed item by most recent +		updateVerbs(); +	}  }  void LLTeleportHistoryPanel::replaceItem(S32 removed_index) diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 611516c703..0d8c847d27 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -70,7 +70,7 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av  	mSpeakerMgr->addListener(mSpeakerModeratorListener, "update_moderator");  	mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); -	mAvatarListDoubleClickConnection = mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList)); +	mAvatarListDoubleClickConnection = mAvatarList->setItemDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, _1));  	mAvatarListRefreshConnection = mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2));      // Set onAvatarListDoubleClicked as default on_return action.  	mAvatarListReturnConnection = mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList)); @@ -132,10 +132,15 @@ void LLParticipantList::setSpeakingIndicatorsVisible(BOOL visible)  	mAvatarList->setSpeakingIndicatorsVisible(visible);  }; -void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list) +void LLParticipantList::onAvatarListDoubleClicked(LLUICtrl* ctrl)  { -	// NOTE(EM): Should we check if there is multiple selection and start conference if it is so? -	LLUUID clicked_id = list->getSelectedUUID(); +	LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(ctrl); +	if(!item) +	{ +		return; +	} + +	LLUUID clicked_id = item->getAvatarId();  	if (clicked_id.isNull() || clicked_id == gAgent.getID())  		return; diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index 70badbc40d..e1b1b5af00 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -232,7 +232,7 @@ class LLParticipantList  		};  	private: -		void onAvatarListDoubleClicked(LLAvatarList* list); +		void onAvatarListDoubleClicked(LLUICtrl* ctrl);  		void onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param);  		/** diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index 95756ac5f3..cc70360528 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -55,7 +55,6 @@  #include "llviewerobjectlist.h"  #include "llviewerregion.h"  #include "lldir.h" -//#include "llfloaterchat.h"  #include "llviewerstats.h"  #include "llviewercontrol.h"		// gSavedSettings  #include "llappviewer.h"		// app_abort_quit() diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 646c9fb6a4..fccf71f3cb 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -79,7 +79,6 @@  #include "llslider.h"  #include "lldir.h"  #include "llcombobox.h" -//#include "llfloaterchat.h"  #include "llviewerstats.h"  #include "llviewertexteditor.h"  #include "llviewerwindow.h" diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 027f3daffb..a00b6a9288 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -47,6 +47,7 @@  #include "llsyswellwindow.h"  #include "llimfloater.h"  #include "llscriptfloater.h" +#include "llfontgl.h"  #include <algorithm> @@ -250,6 +251,13 @@ void LLScreenChannel::onToastDestroyed(LLToast* toast)  	{  		mToastList.erase(it);  	} + +	it = find(mStoredToastList.begin(), mStoredToastList.end(), static_cast<LLPanel*>(toast)); + +	if(it != mStoredToastList.end()) +	{ +		mStoredToastList.erase(it); +	}  } @@ -279,6 +287,11 @@ void LLScreenChannel::onToastFade(LLToast* toast)  //--------------------------------------------------------------------------  void LLScreenChannel::deleteToast(LLToast* toast)  { +	if (toast->isDead()) +	{ +		return; +	} +  	// send signal to observers about destroying of a toast  	toast->mOnDeleteToastSignal(toast); @@ -556,6 +569,7 @@ void LLScreenChannel::showToastsTop()  void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)  {  	LLRect toast_rect; +	LLRect tbox_rect;  	LLToast::Params p;  	p.lifetime_secs = timer;  	p.enable_hide_btn = false; @@ -570,9 +584,26 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)  	std::string	text = LLTrans::getString("StartUpNotifications"); +	tbox_rect   = text_box->getRect(); +	S32 tbox_width  = tbox_rect.getWidth(); +	S32 tbox_vpad   = text_box->getVPad(); +	S32 text_width  = text_box->getDefaultFont()->getWidth(text); +	S32 text_height = text_box->getTextPixelHeight(); + +	// EXT - 3703 (Startup toast message doesn't fit toast width) +	// Calculating TextBox HEIGHT needed to include the whole string according to the given WIDTH of the TextBox. +	S32 new_tbox_height = (text_width/tbox_width + 1) * text_height; +	// Calculating TOP position of TextBox +	S32 new_tbox_top = new_tbox_height + tbox_vpad + gSavedSettings.getS32("ToastGap"); +	// Calculating toast HEIGHT according to the new TextBox size +	S32 toast_height = new_tbox_height + tbox_vpad * 2; + +	tbox_rect.setLeftTopAndSize(tbox_rect.mLeft, new_tbox_top, tbox_rect.getWidth(), new_tbox_height); +	text_box->setRect(tbox_rect); +  	toast_rect = mStartUpToastPanel->getRect();  	mStartUpToastPanel->reshape(getRect().getWidth(), toast_rect.getHeight(), true); -	toast_rect.setLeftTopAndSize(0, toast_rect.getHeight()+gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_rect.getHeight());	 +	toast_rect.setLeftTopAndSize(0, toast_height + gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_height);  	mStartUpToastPanel->setRect(toast_rect);  	text_box->setValue(text); diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index cf62d47362..0d9cf06bc3 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -72,6 +72,9 @@ LLScriptFloater::LLScriptFloater(const LLSD& key)  bool LLScriptFloater::toggle(const LLUUID& object_id)  { +	// Force chiclet toggle on here because first onFocusReceived() will not toggle it on. +	LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(object_id, true); +  	LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);  	LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id); @@ -180,6 +183,15 @@ void LLScriptFloater::setVisible(BOOL visible)  	LLDockableFloater::setVisible(visible);  	hideToastsIfNeeded(); + +	if(!visible) +	{ +		LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getObjectId()); +		if(chiclet) +		{ +			chiclet->setToggleState(false); +		} +	}  }  void LLScriptFloater::onMouseDown() @@ -199,6 +211,20 @@ void LLScriptFloater::onMouseDown()  	}  } +void LLScriptFloater::onFocusLost() +{ +	LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getObjectId(), false); +} + +void LLScriptFloater::onFocusReceived() +{ +	// first focus will be received before setObjectId() call - don't toggle chiclet +	if(getObjectId().notNull()) +	{ +		LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getObjectId(), true); +	} +} +  void LLScriptFloater::hideToastsIfNeeded()  {  	using namespace LLNotificationsUI; diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h index ed10dc5fe9..f86605c5d1 100644 --- a/indra/newview/llscriptfloater.h +++ b/indra/newview/llscriptfloater.h @@ -174,6 +174,10 @@ protected:  	 */  	void onMouseDown(); +	/*virtual*/ void onFocusLost(); +	 +	/*virtual*/ void onFocusReceived(); +  private:  	LLToastNotifyPanel* mScriptForm;  	LLUUID mObjectId; diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 77a370cc3f..43215f86bd 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -87,7 +87,7 @@ void LLWatchForOutfitRenameObserver::changed(U32 mask)  		mPanel->refreshCurrentOutfitName();  	}  } -	 +  LLSidepanelAppearance::LLSidepanelAppearance() :  	LLPanel(),  	mFilterSubString(LLStringUtil::null), @@ -255,7 +255,7 @@ void LLSidepanelAppearance::onNewOutfitButtonClicked()  {  	if (!mLookInfo->getVisible())  	{ -		mPanelOutfitsInventory->onNew(); +		mPanelOutfitsInventory->onSave();  	}  } @@ -321,15 +321,11 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name)  	mOutfitDirtyTag->setVisible(LLAppearanceManager::getInstance()->isOutfitDirty());  	if (name == "")  	{ -		const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getBaseOutfitLink(); -		if (outfit_link) +		std::string outfit_name; +		if (LLAppearanceManager::getInstance()->getBaseOutfitName(outfit_name))  		{ -			const LLViewerInventoryCategory *cat = outfit_link->getLinkedCategory(); -			if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT) -			{ -				mCurrentLookName->setText(cat->getName()); +				mCurrentLookName->setText(outfit_name);  				return; -			}  		}  		mCurrentLookName->setText(getString("No Outfit"));  		mOpenOutfitBtn->setEnabled(FALSE); diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h index 9524b0ece9..aa2e67fd16 100644 --- a/indra/newview/llsidepanelappearance.h +++ b/indra/newview/llsidepanelappearance.h @@ -61,6 +61,7 @@ public:  	void fetchInventory();  	void inventoryFetched();  	void updateVerbs(); +	void onNewOutfitButtonClicked();  private:  	void onFilterEdit(const std::string& search_string); @@ -68,7 +69,6 @@ private:  	void onOpenOutfitButtonClicked();  	void onEditAppearanceButtonClicked();  	void onEditButtonClicked(); -	void onNewOutfitButtonClicked();  	void onBackButtonClicked();  	void onEditWearBackClicked();  	void toggleLookInfoPanel(BOOL visible); diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index fb8aa39445..50c47e293e 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -639,6 +639,21 @@ LLPanel*	LLSideTray::showPanel		(const std::string& panel_name, const LLSD& para  	return NULL;  } +void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params) +{ +	if(!sub_panel) +		return; + +	if (sub_panel->isInVisibleChain()) +	{ +		LLSideTray::getInstance()->collapseSideBar(); +	} +	else +	{ +		LLSideTray::getInstance()->showPanel(panel_name, params); +	} +} +  // This is just LLView::findChildView specialized to restrict the search to LLPanels.  // Optimization for EXT-4068 to avoid searching down to the individual item level  // when inventories are large. diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index de2cfe9711..b1c8675793 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -94,7 +94,15 @@ public:  	 * if no such tab - return NULL, otherwise a pointer to the panel  	 * Pass params as array, or they may be overwritten(example - params["name"]="nearby")  	 */ -    LLPanel*	showPanel		(const std::string& panel_name, const LLSD& params); +	LLPanel*	showPanel		(const std::string& panel_name, const LLSD& params); + +	/** +	 * Toggling Side Tray tab which contains "sub_panel" child of "panel_name" panel. +	 * If "sub_panel" is not visible Side Tray is opened to display it, +	 * otherwise Side Tray is collapsed. +	 * params are passed to "panel_name" panel onOpen(). +	 */ +	void		togglePanel		(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params);  	/*  	 * get the panel (don't show it or do anything else with it) diff --git a/indra/newview/llspeakingindicatormanager.cpp b/indra/newview/llspeakingindicatormanager.cpp index 4bf971437e..2f3b288a47 100644 --- a/indra/newview/llspeakingindicatormanager.cpp +++ b/indra/newview/llspeakingindicatormanager.cpp @@ -229,10 +229,6 @@ void SpeakingIndicatorManager::switchSpeakerIndicators(const speaker_ids_t& spea  				mSwitchedIndicatorsOn.insert(*it_uuid);  			}  		} -		else -		{ -			LL_WARNS("SpeakingIndicator") << "indicator was not found among registered: " << *it_uuid << LL_ENDL; -		}  	}  } diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 793ec401b3..e8f5445c84 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -101,7 +101,6 @@  #include "llface.h"  #include "llfeaturemanager.h"  //#include "llfirstuse.h" -#include "llfloaterchat.h"  #include "llfloaterhud.h"  #include "llfloaterland.h"  #include "llfloaterpreference.h" @@ -879,9 +878,9 @@ bool idle_startup()  		// create necessary directories  		// *FIX: these mkdir's should error check  		gDirUtilp->setPerAccountChatLogsDir(userid);   -    	LLFile::mkdir(gDirUtilp->getLindenUserDir()); +		LLFile::mkdir(gDirUtilp->getLindenUserDir()); -        // Set PerAccountSettingsFile to the default value. +		// Set PerAccountSettingsFile to the default value.  		gSavedSettings.setString("PerAccountSettingsFile",  			gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,   				LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount"))); @@ -915,13 +914,6 @@ bool idle_startup()  		LLFile::mkdir(gDirUtilp->getChatLogsDir());  		LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir()); -		// chat history must be loaded AFTER chat directories are defined. -		if (!gNoRender && gSavedPerAccountSettings.getBOOL("LogShowHistory")) -		{ -			LLFloaterChat::loadHistory(); -		} -		 -		  		//good as place as any to create user windlight directories  		std::string user_windlight_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight", ""));  		LLFile::mkdir(user_windlight_path_name.c_str());		 diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index b3b2b9ee5d..8a36475510 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -40,7 +40,6 @@  #include "llcommandhandler.h"  #include "llviewercontrol.h"  #include "llfloaterbuycurrency.h" -#include "llfloaterchat.h"  #include "llfloaterlagmeter.h"  #include "llpanelvolumepulldown.h"  #include "llfloaterregioninfo.h" @@ -107,7 +106,6 @@ const F32 ICON_TIMER_EXPIRY		= 3.f; // How long the balance and health icons sho  const F32 ICON_FLASH_FREQUENCY	= 2.f;  const S32 TEXT_HEIGHT = 18; -static void onClickBuyCurrency(void*);  static void onClickHealth(void*);  static void onClickScriptDebug(void*);  static void onClickVolume(void*); @@ -122,7 +120,6 @@ LLStatusBar::LLStatusBar(const LLRect& rect)  	mTextTime(NULL),  	mSGBandwidth(NULL),  	mSGPacketLoss(NULL), -	mBtnBuyCurrency(NULL),  	mBtnVolume(NULL),  	mBalance(0),  	mHealth(100), @@ -153,8 +150,10 @@ LLStatusBar::LLStatusBar(const LLRect& rect)  	mTextHealth = getChild<LLTextBox>("HealthText" );  	mTextTime = getChild<LLTextBox>("TimeText" ); -	mBtnBuyCurrency = getChild<LLButton>( "buycurrency" ); -	mBtnBuyCurrency->setClickedCallback( onClickBuyCurrency, this ); +	getChild<LLUICtrl>("buycurrency")->setCommitCallback(  +		boost::bind(&LLStatusBar::onClickBuyCurrency, this)); +	getChild<LLUICtrl>("buyL")->setCommitCallback( +		boost::bind(&LLStatusBar::onClickBuyCurrency, this));  	mBtnVolume = getChild<LLButton>( "volume_btn" );  	mBtnVolume->setClickedCallback( onClickVolume, this ); @@ -362,7 +361,8 @@ void LLStatusBar::refresh()  void LLStatusBar::setVisibleForMouselook(bool visible)  {  	mTextTime->setVisible(visible); -	mBtnBuyCurrency->setVisible(visible); +	getChild<LLUICtrl>("buycurrency")->setVisible(visible); +	getChild<LLUICtrl>("buyL")->setVisible(visible);  	mSGBandwidth->setVisible(visible);  	mSGPacketLoss->setVisible(visible);  	setBackgroundVisible(visible); @@ -382,17 +382,18 @@ void LLStatusBar::setBalance(S32 balance)  {  	std::string money_str = LLResMgr::getInstance()->getMonetaryString( balance ); +	LLButton* btn_buy_currency = getChild<LLButton>("buycurrency");  	LLStringUtil::format_map_t string_args;  	string_args["[AMT]"] = llformat("%s", money_str.c_str());  	std::string labe_str = getString("buycurrencylabel", string_args); -	mBtnBuyCurrency->setLabel(labe_str); +	btn_buy_currency->setLabel(labe_str);  	// Resize the balance button so that the label fits it, and the button expands to the left.  	// *TODO: LLButton should have an option where to expand.  	{ -		S32 saved_right = mBtnBuyCurrency->getRect().mRight; -		mBtnBuyCurrency->autoResize(); -		mBtnBuyCurrency->translate(saved_right - mBtnBuyCurrency->getRect().mRight, 0); +		S32 saved_right = btn_buy_currency->getRect().mRight; +		btn_buy_currency->autoResize(); +		btn_buy_currency->translate(saved_right - btn_buy_currency->getRect().mRight, 0);  	}  	if (mBalance && (fabs((F32)(mBalance - balance)) > gSavedSettings.getF32("UISndMoneyChangeThreshold"))) @@ -497,7 +498,7 @@ S32 LLStatusBar::getSquareMetersLeft() const  	return mSquareMetersCredit - mSquareMetersCommitted;  } -static void onClickBuyCurrency(void* data) +void LLStatusBar::onClickBuyCurrency()  {  	LLFloaterBuyCurrency::buyCurrency();  } diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h index 0e98da0fe4..21a98dd753 100644 --- a/indra/newview/llstatusbar.h +++ b/indra/newview/llstatusbar.h @@ -91,6 +91,7 @@ private:  	// simple method to setup the part that holds the date  	void setupDate(); +	void onClickBuyCurrency();  	void onVolumeChanged(const LLSD& newvalue);  	static void onMouseEnterVolume(LLUICtrl* ctrl); @@ -103,7 +104,6 @@ private:  	LLStatGraph *mSGBandwidth;  	LLStatGraph *mSGPacketLoss; -	LLButton	*mBtnBuyCurrency;  	LLButton	*mBtnVolume;  	S32				mBalance; diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index a5ddb0a620..b980f65e68 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -1190,8 +1190,12 @@ void LLTextureCtrl::draw()  	}  	else if (!mImageAssetID.isNull())  	{ -		mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES); -		mTexturep->setBoostLevel(LLViewerTexture::BOOST_PREVIEW); +		LLPointer<LLViewerFetchedTexture> texture = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES,LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +		 +		texture->setBoostLevel(LLViewerTexture::BOOST_PREVIEW); +		texture->forceToSaveRawImage(0) ; + +		mTexturep = texture;  	}  	else if (!mFallbackImageName.empty())  	{ diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index eeedf38543..5ce6884239 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -495,8 +495,8 @@ void LLTextureFetchWorker::setupPacketData()  U32 LLTextureFetchWorker::calcWorkPriority()  {  // 	llassert_always(mImagePriority >= 0 && mImagePriority <= LLViewerTexture::maxDecodePriority()); -	F32 priority_scale = (F32)LLWorkerThread::PRIORITY_LOWBITS / LLViewerFetchedTexture::maxDecodePriority(); -	mWorkPriority = (U32)(mImagePriority * priority_scale); +	static F32 PRIORITY_SCALE = (F32)LLWorkerThread::PRIORITY_LOWBITS / LLViewerFetchedTexture::maxDecodePriority(); +	mWorkPriority = (U32)(mImagePriority * PRIORITY_SCALE);  	return mWorkPriority;  } @@ -574,7 +574,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  {  	LLMutexLock lock(&mWorkMutex); -	if ((mFetcher->isQuitting() || getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) +	if ((mFetcher->isQuitting() || mImagePriority < 1.0f || getFlags(LLWorkerClass::WCF_DELETE_REQUESTED)))  	{  		if (mState < WRITE_TO_CACHE)  		{ diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index d0c125eb77..94acb2ae8c 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -45,7 +45,7 @@  #include "lltrans.h"  const S32 BOTTOM_PAD = VPAD * 3; -const S32 BUTTON_WIDTH = 90; +S32 BUTTON_WIDTH = 90;  //static  const LLFontGL* LLToastNotifyPanel::sFont = NULL; @@ -63,7 +63,7 @@ mAddedDefaultBtn(false)  	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_notification.xml");  	mInfoPanel = getChild<LLPanel>("info_panel");  	mControlPanel = getChild<LLPanel>("control_panel"); - +	BUTTON_WIDTH = gSavedSettings.getS32("ToastButtonWidth");  	// customize panel's attributes  	// is it intended for displaying a tip  	mIsTip = notification->getType() == "notifytip"; @@ -96,7 +96,8 @@ mAddedDefaultBtn(false)  	// customize panel's outfit  	// preliminary adjust panel's layout -	mIsTip ? adjustPanelForTipNotice() : adjustPanelForScriptNotice(form); +	//move to the end  +	//mIsTip ? adjustPanelForTipNotice() : adjustPanelForScriptNotice(form);  	// adjust text options according to the notification type  	// add a caution textbox at the top of a caution notification @@ -117,8 +118,14 @@ mAddedDefaultBtn(false)  	mTextBox->setValue(notification->getMessage());  	// add buttons for a script notification -	if (!mIsTip) +	if (mIsTip) +	{ +		adjustPanelForTipNotice(); +	} +	else  	{ +		std::vector<index_button_pair_t> buttons; +		buttons.reserve(mNumOptions);  		for (S32 i = 0; i < mNumOptions; i++)  		{  			LLSD form_element = form->getElement(i); @@ -126,65 +133,155 @@ mAddedDefaultBtn(false)  			{  				continue;  			} - -			addButton(form_element["name"].asString(), form_element["text"].asString(), TRUE, form_element["default"].asBoolean());  		} - -		if (mNumButtons == 0) +		S32 buttons_width = 0; +		// create all buttons and accumulate they total width to reshape mControlPanel +		for (S32 i = 0; i < mNumOptions; i++)  		{ -			addButton("OK", LLTrans::getString("ok"), FALSE, TRUE); -			mAddedDefaultBtn = true; +			LLSD form_element = form->getElement(i); +			if (form_element["type"].asString() != "button") +			{ +				continue; +			} +			LLButton* new_button = createButton(form_element, TRUE); +			buttons_width += new_button->getRect().getWidth(); +			S32 index = form_element["index"].asInteger(); +			buttons.push_back(index_button_pair_t(index,new_button)); +		} +		if (buttons.empty()) +		{ +			addDefaultButton(); +		} +		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) +			{ +				//Probably it is  a scriptdialog toast, set default left_pad +				left_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);  		}  	} -  	// adjust panel's height to the text size  	mInfoPanel->setFollowsAll();  	snapToMessageHeight(mTextBox, MAX_LENGTH);  } - -LLToastNotifyPanel::~LLToastNotifyPanel()  +void LLToastNotifyPanel::addDefaultButton()  { -	std::for_each(mBtnCallbackData.begin(), mBtnCallbackData.end(), DeletePointer()); +	LLSD form_element; +	form_element.with("name", "OK").with("text", LLTrans::getString("ok")).with("default", true); +	LLButton* ok_btn = createButton(form_element, FALSE); +	LLRect new_btn_rect(ok_btn->getRect()); + +	new_btn_rect.setOriginAndSize(llabs(getRect().getWidth() - BUTTON_WIDTH)/ 2, BOTTOM_PAD, +			//auto_size for ok button makes it very small, so let's make it wider +			BUTTON_WIDTH, new_btn_rect.getHeight()); +	ok_btn->setRect(new_btn_rect); +	addChild(ok_btn, -1); +	mNumButtons = 1; +	mAddedDefaultBtn = true;  } +LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, BOOL is_option) +{ +	InstanceAndS32* userdata = new InstanceAndS32; +	userdata->mSelf = this; +	userdata->mButtonName = is_option ? form_element["name"].asString() : ""; -void LLToastNotifyPanel::adjustPanelForScriptNotice(const LLNotificationFormPtr form) -{ -	F32 buttons_num = 0; -	S32 button_rows = 0; +	mBtnCallbackData.push_back(userdata); -	// calculate number of buttons -	for (S32 i = 0; i < mNumOptions; i++) +	LLButton::Params p; +	const LLFontGL* font = form_element["index"].asInteger() == -1 ? sFontSmall: sFont; // for ignore button in script dialog +	p.name(form_element["name"].asString()); +	p.label(form_element["text"].asString()); +	p.font(font); +	p.rect.height = BTN_HEIGHT; +	p.click_callback.function(boost::bind(&LLToastNotifyPanel::onClickButton, userdata)); +	p.rect.width = BUTTON_WIDTH; +	p.auto_resize = false; +	p.follows.flags(FOLLOWS_RIGHT | FOLLOWS_LEFT | FOLLOWS_BOTTOM); +	if (mIsCaution)  	{ -		if (form->getElement(i)["type"].asString() == "button") -		{ -			buttons_num++; -		} +		p.image_color(LLUIColorTable::instance().getColor("ButtonCautionImageColor")); +		p.image_color_disabled(LLUIColorTable::instance().getColor("ButtonCautionImageColor"));  	} - -	// calculate necessary height for the button panel -	// if notification form contains no buttons - reserve a place for OK button -	// script notifications have extra line for an IGNORE button -	if(mIsScriptDialog) +	if (!mIsScriptDialog && font->getWidth(form_element["text"].asString()) > BUTTON_WIDTH)  	{ -		button_rows = llceil((buttons_num - 1) / 3.0f) + 1; +		p.rect.width = 1; +		p.auto_resize = true;  	} -	else +	 +	LLButton* btn = LLUICtrlFactory::create<LLButton>(p); +	mNumButtons++; +	btn->autoResize(); +	if (form_element["default"].asBoolean())  	{ -		button_rows = llmax( 1, llceil(buttons_num / 3.0f)); +		setDefaultBtn(btn);  	} -	S32 button_panel_height = button_rows * BTN_HEIGHT + (button_rows + 1) * VPAD + BOTTOM_PAD; +	return btn; +} + +LLToastNotifyPanel::~LLToastNotifyPanel()  +{ +	std::for_each(mBtnCallbackData.begin(), mBtnCallbackData.end(), DeletePointer()); +} +void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair_t>& buttons, S32 left_pad, S32 top) +{ +	S32 left = left_pad; +	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) +		{ +			//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); +	} +	if(ignore_btn) +	{ +		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); +	} +} +void LLToastNotifyPanel::adjustPanelForScriptNotice(S32 button_panel_width, S32 button_panel_height) +{  	//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); +	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);  } -// static  void LLToastNotifyPanel::adjustPanelForTipNotice()  {  	LLRect info_rect = mInfoPanel->getRect(); @@ -208,64 +305,3 @@ void LLToastNotifyPanel::onClickButton(void* data)  	}  	self->mNotification->respond(response);  } - -// virtual -LLButton* LLToastNotifyPanel::addButton(const std::string& name, const std::string& label, BOOL is_option, BOOL is_default) -{ -	LLRect btn_rect; -	LLButton* btn; -	S32 btn_height= BTN_HEIGHT; -	const LLFontGL* font = sFont; -	S32 ignore_pad = 0; -	S32 button_index = mNumButtons; -	S32 index = button_index; -	S32 x = HPAD * 2; // *2 - to make a nice offset - -	if (mIsScriptDialog) -	{ -		// Add two "blank" option spaces, before the "Ignore" button -		index = button_index + 2; -		if (button_index == 0) -		{ -			// Ignore button is smaller, less wide -			btn_height = BTN_HEIGHT_SMALL; -			font = sFontSmall; -			ignore_pad = 10; -		} -	} - -	btn_rect.setOriginAndSize(x + (index % 3) * (BUTTON_WIDTH+HPAD+HPAD) + ignore_pad, -		BOTTOM_PAD + (index / 3) * (BTN_HEIGHT+VPAD), -		BUTTON_WIDTH - 2*ignore_pad, -		btn_height); - -	InstanceAndS32* userdata = new InstanceAndS32; -	userdata->mSelf = this; -	userdata->mButtonName = is_option ? name : ""; - -	mBtnCallbackData.push_back(userdata); - -	LLButton::Params p; -	p.name(name); -	p.label(label); -	p.rect(btn_rect); -	p.click_callback.function(boost::bind(&LLToastNotifyPanel::onClickButton, userdata)); -	p.font(font); -	if (mIsCaution) -	{ -		p.image_color(LLUIColorTable::instance().getColor("ButtonCautionImageColor")); -		p.image_color_disabled(LLUIColorTable::instance().getColor("ButtonCautionImageColor")); -	} -	btn = LLUICtrlFactory::create<LLButton>(p); - - -	mControlPanel->addChild(btn, -1); - -	if (is_default) -	{ -		setDefaultBtn(btn); -	} - -	mNumButtons++; -	return btn; -} diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h index 04525387b3..1f50c21f6f 100644 --- a/indra/newview/lltoastnotifypanel.h +++ b/indra/newview/lltoastnotifypanel.h @@ -57,7 +57,7 @@ public:  	virtual ~LLToastNotifyPanel();  protected: -	LLButton* addButton(std::string const &name, const std::string& label, BOOL is_option, BOOL is_default); +	LLButton* createButton(const LLSD& form_element, BOOL is_option);  	// Used for callbacks  	struct InstanceAndS32 @@ -69,8 +69,11 @@ protected:  private: -	void adjustPanelForScriptNotice(const boost::shared_ptr<LLNotificationForm> form); +	typedef std::pair<int,LLButton*> index_button_pair_t;  +	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);  	// panel elements  	LLTextBase*		mTextBox; diff --git a/indra/newview/lltoolbar.cpp b/indra/newview/lltoolbar.cpp index 224c5b64bc..edbaa0d45a 100644 --- a/indra/newview/lltoolbar.cpp +++ b/indra/newview/lltoolbar.cpp @@ -70,7 +70,6 @@  #include "llviewerwindow.h"  #include "lltoolgrab.h"  #include "llcombobox.h" -#include "llfloaterchat.h"  #include "llimpanel.h"  #include "lllayoutstack.h" @@ -281,21 +280,6 @@ void LLToolBar::updateCommunicateList()  	}  	itemp = communicate_button->addElement(contact_sd, ADD_TOP); -	LLSD communicate_sd; -	communicate_sd["value"] = "local chat"; -	communicate_sd["columns"][0]["value"] = LLFloaterChat::getInstance()->getShortTitle(); - -	if (LLFloaterChat::getInstance() == frontmost_floater) -	{ -		communicate_sd["columns"][0]["font"]["name"] = "SANSSERIF_SMALL"; -		communicate_sd["columns"][0]["font"]["style"] = "BOLD"; -		if (selected.isUndefined()) -		{ -			selected = "local chat"; -		} -	} -	itemp = communicate_button->addElement(communicate_sd, ADD_TOP); -  	communicate_button->addSeparator(ADD_TOP);  	communicate_button->add(getString("Redock Windows"), LLSD("redock"), ADD_TOP);  	communicate_button->addSeparator(ADD_TOP); @@ -357,8 +341,7 @@ void LLToolBar::onClickCommunicate(LLUICtrl* ctrl, const LLSD& user_data)  		if(chatterbox_instance)  		{  			chatterbox_instance->addFloater(LLFloaterMyFriends::getInstance(), FALSE); -		    chatterbox_instance->addFloater(LLFloaterChat::getInstance(), FALSE); -		 +			  			LLUUID session_to_show;  			std::set<LLHandle<LLFloater> >::const_iterator floater_handle_it; diff --git a/indra/newview/llurlhistory.cpp b/indra/newview/llurlhistory.cpp index e8b5aa7c74..08dd82ab86 100644 --- a/indra/newview/llurlhistory.cpp +++ b/indra/newview/llurlhistory.cpp @@ -77,7 +77,7 @@ bool LLURLHistory::saveFile(const std::string& filename)  	std::string temp_str = gDirUtilp->getLindenUserDir();  	if( temp_str.empty() )  	{ -		llwarns << "Can't save. No user directory set." << llendl; +		llinfos << "Can't save URL history - no user directory set yet." << llendl;  		return false;  	} diff --git a/indra/newview/llurlwhitelist.cpp b/indra/newview/llurlwhitelist.cpp index da69039cf9..46bc9276c1 100644 --- a/indra/newview/llurlwhitelist.cpp +++ b/indra/newview/llurlwhitelist.cpp @@ -121,6 +121,12 @@ bool LLUrlWhiteList::save ()  	// build filename for each user  	std::string resolvedFilename = gDirUtilp->getExpandedFilename ( LL_PATH_PER_SL_ACCOUNT, mFilename ); +	if (resolvedFilename.empty()) +	{ +		llinfos << "No per-user dir for saving URL whitelist - presumably not logged in yet.  Skipping." << llendl; +		return false; +	} +  	// open a file for writing  	llofstream file ( resolvedFilename );  	if ( file.is_open () ) diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index e81115c8ab..3a834e7532 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -54,7 +54,6 @@  #include "llfloaterbulkpermission.h"  #include "llfloaterbump.h"  #include "llfloatercamera.h" -#include "llfloaterchat.h"  #include "llfloaterchatterbox.h"  #include "llfloaterdaycycle.h"  #include "llfloatersearch.h" @@ -154,7 +153,7 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("bumps", "floater_bumps.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBump>);  	LLFloaterReg::add("camera", "floater_camera.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCamera>); -	LLFloaterReg::add("chat", "floater_chat_history.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChat>); +	//LLFloaterReg::add("chat", "floater_chat_history.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChat>);  	LLFloaterReg::add("nearby_chat", "floater_nearby_chat.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNearbyChat>);  	LLFloaterReg::add("communicate", "floater_chatterbox.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChatterBox>);  	LLFloaterReg::add("compile_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCompileQueue>); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index df873f241e..6387133a86 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -43,6 +43,7 @@  #include "llconsole.h"  #include "llinventorymodel.h"  #include "llgesturemgr.h" +#include "llsidetray.h"  #include "llinventorybridge.h"  #include "llfloaterinventory.h" @@ -71,7 +72,23 @@ public:  	bool handle(const LLSD& params, const LLSD& query_map,  				LLMediaCtrl* web)  	{ -		if (params.size() < 2) return false; +		if (params.size() < 1) +		{ +			return false; +		} + +		// support secondlife:///app/inventory/show +		if (params[0].asString() == "show") +		{ +			LLSideTray::getInstance()->showPanel("sidepanel_inventory", LLSD()); +			return true; +		} + +		// otherwise, we need a UUID and a verb... +		if (params.size() < 2)  +		{ +			return false; +		}  		LLUUID inventory_id;  		if (!inventory_id.set(params[0], FALSE))  		{ @@ -826,6 +843,13 @@ void CreateGestureCallback::fire(const LLUUID& inv_item)  	gFloaterView->adjustToFitScreen(preview, FALSE);  } +void AddFavoriteLandmarkCallback::fire(const LLUUID& inv_item_id) +{ +	if (mTargetLandmarkId.isNull()) return; + +	gInventory.rearrangeFavoriteLandmarks(inv_item_id, mTargetLandmarkId); +} +  LLInventoryCallbackManager gInventoryCallbacks;  void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id, @@ -1161,6 +1185,15 @@ const std::string& LLViewerInventoryItem::getDisplayName() const  	return mDisplayName = hasSortField ? result : LLInventoryItem::getName();  } +// static +std::string LLViewerInventoryItem::getDisplayName(const std::string& name) +{ +	std::string result; +	BOOL hasSortField = extractSortFieldAndDisplayName(name, 0, &result); + +	return hasSortField ? result : name; +} +  S32 LLViewerInventoryItem::getSortField() const  {  	S32 result; diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 412a2c66e6..917b8747ea 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -66,6 +66,7 @@ public:  	virtual const LLUUID& getAssetUUID() const;  	virtual const std::string& getName() const;  	virtual const std::string& getDisplayName() const; +	static std::string getDisplayName(const std::string& name);  	virtual S32 getSortField() const;  	virtual void setSortField(S32 sortField);  	virtual void rename(const std::string& new_name); @@ -279,6 +280,18 @@ public:  	void fire(const LLUUID& inv_item);  }; +class AddFavoriteLandmarkCallback : public LLInventoryCallback +{ +public: +	AddFavoriteLandmarkCallback() : mTargetLandmarkId(LLUUID::null) {} +	void setTargetLandmarkId(const LLUUID& target_uuid) { mTargetLandmarkId = target_uuid; } + +private: +	void fire(const LLUUID& inv_item); + +	LLUUID mTargetLandmarkId; +}; +  // misc functions  //void inventory_reliable_callback(void**, S32 status); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 83e5a29b59..ba26a51b8b 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -52,7 +52,6 @@  #include "llfloaterbuy.h"  #include "llfloaterbuycontents.h"  #include "llfloaterbuycurrency.h" -#include "llfloaterchat.h"  #include "llfloatercustomize.h"  #include "llfloaterchatterbox.h"  #include "llfloatergodtools.h" @@ -3365,14 +3364,49 @@ void handle_show_side_tray()  	root->addChild(side_tray);  } -class LLShowPanelPeopleTab : public view_listener_t +// Toggle one of "People" panel tabs in side tray. +class LLTogglePanelPeopleTab : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		// Open tab of the "People" panel in side tray. +		std::string panel_name = userdata.asString(); +  		LLSD param; -		param["people_panel_tab_name"] = userdata.asString(); -		LLSideTray::getInstance()->showPanel("panel_people", param); +		param["people_panel_tab_name"] = panel_name; + +		static LLPanel* friends_panel = NULL; +		static LLPanel* groups_panel = NULL; +		static LLPanel* nearby_panel = NULL; + +		if (panel_name == "friends_panel") +		{ +			return togglePeoplePanel(friends_panel, panel_name, param); +		} +		else if (panel_name == "groups_panel") +		{ +			return togglePeoplePanel(groups_panel, panel_name, param); +		} +		else if (panel_name == "nearby_panel") +		{ +			return togglePeoplePanel(nearby_panel, panel_name, param); +		} +		else +		{ +			return false; +		} +	} + +	static bool togglePeoplePanel(LLPanel* &panel, const std::string& panel_name, const LLSD& param) +	{ +		if(!panel) +		{ +			panel = LLSideTray::getInstance()->getPanel(panel_name); +			if(!panel) +				return false; +		} + +		LLSideTray::getInstance()->togglePanel(panel, "panel_people", param); +  		return true;  	}  }; @@ -6339,51 +6373,8 @@ class LLToolsSelectedScriptAction : public view_listener_t  void handle_selected_texture_info(void*)  { -	for (LLObjectSelection::valid_iterator iter = LLSelectMgr::getInstance()->getSelection()->valid_begin(); -		 iter != LLSelectMgr::getInstance()->getSelection()->valid_end(); iter++) -	{ -		LLSelectNode* node = *iter; -		 -		std::string msg; -		msg.assign("Texture info for: "); -		msg.append(node->mName); -		LLChat chat(msg); -		LLFloaterChat::addChat(chat); - -		U8 te_count = node->getObject()->getNumTEs(); -		// map from texture ID to list of faces using it -		typedef std::map< LLUUID, std::vector<U8> > map_t; -		map_t faces_per_texture; -		for (U8 i = 0; i < te_count; i++) -		{ -			if (!node->isTESelected(i)) continue; - -			LLViewerTexture* img = node->getObject()->getTEImage(i); -			LLUUID image_id = img->getID(); -			faces_per_texture[image_id].push_back(i); -		} -		// Per-texture, dump which faces are using it. -		map_t::iterator it; -		for (it = faces_per_texture.begin(); it != faces_per_texture.end(); ++it) -		{ -			LLUUID image_id = it->first; -			U8 te = it->second[0]; -			LLViewerTexture* img = node->getObject()->getTEImage(te); -			S32 height = img->getHeight(); -			S32 width = img->getWidth(); -			S32 components = img->getComponents(); -			msg = llformat("%dx%d %s on face ", -								width, -								height, -								(components == 4 ? "alpha" : "opaque")); -			for (U8 i = 0; i < it->second.size(); ++i) -			{ -				msg.append( llformat("%d ", (S32)(it->second[i]))); -			} -			LLChat chat(msg); -			LLFloaterChat::addChat(chat); -		} -	} +	//useless without LLFloaterChat +	//as since we don't use LLFloaterChat...  }  void handle_test_male(void*) @@ -7898,7 +7889,7 @@ void initialize_menus()  	view_listener_t::addMenu(new LLSelfEnableRemoveAllAttachments(), "Self.EnableRemoveAllAttachments");  	// we don't use boost::bind directly to delay side tray construction -	view_listener_t::addMenu( new LLShowPanelPeopleTab(), "SideTray.PanelPeopleTab"); +	view_listener_t::addMenu( new LLTogglePanelPeopleTab(), "SideTray.PanelPeopleTab");  	 // Avatar pie menu  	view_listener_t::addMenu(new LLObjectMute(), "Avatar.Mute"); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index f707cb9b93..9b15a5154f 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -54,7 +54,6 @@  //#include "llfirstuse.h"  #include "llfloaterbuycurrency.h"  #include "llfloaterbuyland.h" -#include "llfloaterchat.h"  #include "llfloaterland.h"  #include "llfloaterregioninfo.h"  #include "llfloaterlandholdings.h" @@ -711,6 +710,18 @@ protected:  	}   }; +class LLOpenTaskGroupOffer : public LLInventoryAddedObserver +{ +protected: +	/*virtual*/ void done() +	{ +		open_inventory_offer(mAdded, "group_offer"); +		mAdded.clear(); +		gInventory.removeObserver(this); +		delete this; +	} +}; +  //one global instance to bind them  LLOpenTaskOffer* gNewInventoryObserver=NULL; @@ -726,6 +737,7 @@ void start_new_inventory_observer()  class LLDiscardAgentOffer : public LLInventoryFetchComboObserver  { +	LOG_CLASS(LLDiscardAgentOffer);  public:  	LLDiscardAgentOffer(const LLUUID& folder_id, const LLUUID& object_id) :  		mFolderID(folder_id), @@ -822,9 +834,13 @@ bool check_offer_throttle(const std::string& from_name, bool check_only)  				}  				message << ", automatic preview disabled for "  					<< OFFER_THROTTLE_TIME << " seconds."; -				chat.mText = message.str(); +				  				//this is kinda important, so actually put it on screen -				LLFloaterChat::addChat(chat, FALSE, FALSE); +				std::string log_msg = message.str(); +				LLSD args; +				args["MESSAGE"] = log_msg; +				LLNotificationsUtil::add("SystemMessage", args); +  				throttle_logged=true;  			}  			return false; @@ -929,9 +945,6 @@ void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& f  			  case LLAssetType::AT_ANIMATION:  				  LLFloaterReg::showInstance("preview_anim", LLSD(item_id), take_focus);  				  break; -			  case LLAssetType::AT_GESTURE: -				  LLFloaterReg::showInstance("preview_gesture", LLSD(item_id), take_focus); -				  break;  			  case LLAssetType::AT_SCRIPT:  				  LLFloaterReg::showInstance("preview_script", LLSD(item_id), take_focus);  				  break; @@ -1105,7 +1118,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  	// * callback may be called immediately,  	// * adding the mute sends a message,  	// * we can't build two messages at once. -	if (2 == button) +	if (2 == button) // Block  	{  		gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,_4,this));  	} @@ -1146,6 +1159,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  			}  			break;  		case IM_GROUP_NOTICE: +			opener = new LLOpenTaskGroupOffer;  			send_auto_receive_response();  			break;  		case IM_TASK_INVENTORY_OFFERED: @@ -1167,8 +1181,9 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  		if (check_offer_throttle(mFromName, true))  		{  			log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString("."); -			chat.mText = log_message; -			LLFloaterChat::addChatHistory(chat); +			LLSD args; +			args["MESSAGE"] = log_message; +			LLNotificationsUtil::add("SystemMessage", args);  		}  		break; @@ -1341,8 +1356,10 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const  			if (check_offer_throttle(mFromName, true))  			{  				log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString("."); -				chat.mText = log_message; -				LLFloaterChat::addChatHistory(chat); +				//TODO* should go to history only - how? +				//LLSD args; +				//args["MESSAGE"] = log_message; +				//LLNotificationsUtil::add("SystemMessage", args);  			}  			// we will want to open this item when it comes back. @@ -1384,13 +1401,11 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const  			// send the message  			msg->sendReliable(mHost); -			log_message = LLTrans::getString("InvOfferYouDecline") + " " + mDesc + " " + LLTrans::getString("InvOfferFrom") + " " + mFromName +"."; -			chat.mText = log_message; -			if( LLMuteList::getInstance()->isMuted(mFromID ) && ! LLMuteList::getInstance()->isLinden(mFromName) )  // muting for SL-42269 -			{ -				chat.mMuted = TRUE; -			} -			LLFloaterChat::addChatHistory(chat); +			//TODO* should go to message history only... +			//log_message = LLTrans::getString("InvOfferYouDecline") + " " + mDesc + " " + LLTrans::getString("InvOfferFrom") + " " + mFromName +"."; +			//LLSD args; +			//args["MESSAGE"] = log_message; +			//LLNotificationsUtil::add("SystemMessage", args);  			if (busy &&	(!mFromGroup && !mFromObject))  			{ @@ -1752,10 +1767,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				region_id,  				position,  				true); - -			// pretend this is chat generated by self, so it does not show up on screen -			chat.mText = std::string("IM: ") + name + separator_string + message; -			LLFloaterChat::addChat( chat, TRUE, TRUE );  		}  		else if (from_id.isNull())  		{ @@ -1811,19 +1822,24 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  					region_id,  					position,  					true); -				chat.mText = std::string("IM: ") + name + separator_string + saved + message; - -				BOOL local_agent = FALSE; -				LLFloaterChat::addChat( chat, TRUE, local_agent );  			}  			else  			{  				// muted user, so don't start an IM session, just record line in chat  				// history.  Pretend the chat is from a local agent,  				// so it will go into the history but not be shown on screen. + +				//TODO* should go to message hisyory only +				//and this is not system message... +				//LLSD args; +				//args["MESSAGE"] = buffer; +				//LLNotificationsUtil::add("SystemMessage", args); + +				/*  				chat.mText = buffer;  				BOOL local_agent = TRUE;  				LLFloaterChat::addChat( chat, TRUE, local_agent ); +				*/  			}  		}  		break; @@ -2044,6 +2060,13 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			//if (((is_busy && !is_owned_by_me) || is_muted))  			if ( is_muted || mute_im)  			{ +				// Prefetch the offered item so that it can be discarded by the appropriate observer. (EXT-4331) +				LLInventoryFetchObserver::item_ref_t items; +				items.push_back(info->mObjectID); +				LLInventoryFetchObserver* fetch_item = new LLInventoryFetchObserver(); +				fetch_item->fetchItems(items); +				delete fetch_item; +  				// Same as closing window  				info->forceResponse(IOR_DECLINE);  			} @@ -2120,9 +2143,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			region_id,  			position,  			true); - -		chat.mText = std::string("IM: ") + name + separator_string +  saved + message; -		LLFloaterChat::addChat(chat, TRUE, is_this_agent);  	}  	break; @@ -2136,6 +2156,48 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			// Build a link to open the object IM info window.  			std::string location = ll_safe_string((char*)binary_bucket, binary_bucket_size-1); +			if (session_id.notNull()) +			{ +				chat.mFromID = session_id; +			} +			else +			{ +				// This message originated on a region without the updated code for task id and slurl information. +				// We just need a unique ID for this object that isn't the owner ID. +				// If it is the owner ID it will overwrite the style that contains the link to that owner's profile. +				// This isn't ideal - it will make 1 style for all objects owned by the the same person/group. +				// This works because the only thing we can really do in this case is show the owner name and link to their profile. +				chat.mFromID = from_id ^ gAgent.getSessionID(); +			} + +			LLSD query_string; +			query_string["owner"] = from_id; +			query_string["slurl"] = location; +			query_string["name"] = name; +			if (from_group) +			{ +				query_string["groupowned"] = "true"; +			}	 + +			std::ostringstream link; +			link << "secondlife:///app/objectim/" << session_id << LLURI::mapToQueryString(query_string); + +			chat.mURL = link.str(); +			chat.mText = message; +			chat.mSourceType = CHAT_SOURCE_OBJECT; + +			// Note: lie to Nearby Chat, pretending that this is NOT an IM, because +			// IMs from obejcts don't open IM sessions. +			LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); +			if(nearby_chat) +			{ +				nearby_chat->addMessage(chat); +			} + + +			//Object IMs send with from name: 'Second Life' need to be displayed also in notification toasts (EXT-1590) +			if (SYSTEM_FROM != name) break; +			  			LLSD substitutions;  			substitutions["NAME"] = name;  			substitutions["MSG"] = message; @@ -2627,22 +2689,8 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  		chat.mMuted = is_muted && !is_linden; -		if (!visible_in_chat_bubble  -			&& (is_linden || !is_busy || is_owned_by_me)) -		{ -			// show on screen and add to history -			LLNotificationsUI::LLNotificationManager::instance().onChat( -					chat, LLNotificationsUI::NT_NEARBYCHAT); - -			LLFloaterChat::addChat(chat, FALSE, FALSE); -		} -		else -		{ -			LLNotificationsUI::LLNotificationManager::instance().onChat( +		LLNotificationsUI::LLNotificationManager::instance().onChat(  					chat, LLNotificationsUI::NT_NEARBYCHAT); -			// adding temporarily -			LLFloaterChat::addChatHistory(chat); -		}  	}  } @@ -3027,9 +3075,10 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)  		if (avatarp)  		{  			// Chat the "back" SLURL. (DEV-4907) -			LLChat chat("Teleport completed from " + gAgent.getTeleportSourceSLURL().getSLURLString()); -			chat.mSourceType = CHAT_SOURCE_SYSTEM; - 		    LLFloaterChat::addChatHistory(chat); +                        //should go to history only so leave commented                +		        //LLSD args;                                                  +		        //args["MESSAGE"] = message;                                  +		        //LLNotificationsUtil::add("SystemMessage", args);             			// Set the new position  			avatarp->setPositionAgent(agent_pos); @@ -5360,8 +5409,24 @@ bool handle_lure_callback(const LLSD& notification, const LLSD& response)  			it != notification["payload"]["ids"].endArray();  			++it)  		{ +			LLUUID target_id = it->asUUID(); +  			msg->nextBlockFast(_PREHASH_TargetData); -			msg->addUUIDFast(_PREHASH_TargetID, it->asUUID()); +			msg->addUUIDFast(_PREHASH_TargetID, target_id); + +			// Record the offer. +			{ +				std::string target_name; +				gCacheName->getFullName(target_id, target_name); +				LLSD args; +				args["TO_NAME"] = target_name; +	 +				LLSD payload; +				payload["from_id"] = target_id; +				payload["SESSION_NAME"] = target_name; +				payload["SUPPRESS_TOAST"] = true; +				LLNotificationsUtil::add("TeleportOfferSent", args, payload); +			}  		}  		gAgent.sendReliableMessage();  	} diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 4b2707e6d7..10a95443f1 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -1320,14 +1320,37 @@ void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel, bool use_ag  void LLViewerParcelMgr::setHoverParcel(const LLVector3d& pos)  { -	//FIXME: only request parcel info when tooltip is shown -	return; -	/*LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal( pos ); +	static U32 last_west, last_south; + + +	// only request parcel info when tooltip is shown +	if (!gSavedSettings.getBOOL("ShowLandHoverTip")) +	{ +		return; +	} + +	// only request parcel info if position has changed outside of the +	// last parcel grid step +	U32 west_parcel_step = (U32) floor( pos.mdV[VX] / PARCEL_GRID_STEP_METERS ); +	U32 south_parcel_step = (U32) floor( pos.mdV[VY] / PARCEL_GRID_STEP_METERS ); +	 +	if ((west_parcel_step == last_west) && (south_parcel_step == last_south)) +	{ +		return; +	} +	else  +	{ +		last_west = west_parcel_step; +		last_south = south_parcel_step; +	} + +	LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal( pos );  	if (!region)  	{  		return;  	} +  	// Send a rectangle around the point.  	// This means the parcel sent back is at least a rectangle around the point,  	// which is more efficient for public land.  Fewer requests are sent.  JC @@ -1354,7 +1377,7 @@ void LLViewerParcelMgr::setHoverParcel(const LLVector3d& pos)  	msg->addBOOL("SnapSelection",			FALSE );  	msg->sendReliable( region->getHost() ); -	mHoverRequestResult = PARCEL_RESULT_NO_DATA;*/ +	mHoverRequestResult = PARCEL_RESULT_NO_DATA;  } diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 300aea1620..2e92512b31 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -37,7 +37,6 @@  #include "llagent.h"  #include "llaudioengine.h"  #include "llavataractions.h" -#include "llfloaterchat.h"  #include "llfloaterreg.h"  #include "llfloaterworldmap.h"  #include "llfocusmgr.h" diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 1edaeec848..ad993bc056 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1513,16 +1513,20 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  		{  			desired_discard -= 2;  		} -		else if (!isJustBound() && mCachedRawImageReady && !mBoostLevel) +		else if (!isJustBound() && mCachedRawImageReady)  		{ -			// We haven't rendered this in the last half second, and we have a cached raw image, leave the desired discard as-is -			desired_discard = cur_discard; -		} -		else if (mGLTexturep.notNull() && !mGLTexturep->getBoundRecently() && mBoostLevel == LLViewerTexture::BOOST_NONE) -		{ -			// We haven't rendered this in a while, de-prioritize it -			desired_discard += 2; +			if(mBoostLevel < BOOST_HIGH) +			{ +				// We haven't rendered this in a while, de-prioritize it +				desired_discard += 2; +			} +			//else +			//{ +			//	// We haven't rendered this in the last half second, and we have a cached raw image, leave the desired discard as-is +			//	desired_discard = cur_discard; +			//}  		} +  		S32 ddiscard = cur_discard - desired_discard;  		ddiscard = llclamp(ddiscard, 0, 4);  		priority = (ddiscard+1)*100000.f; @@ -1629,7 +1633,7 @@ bool LLViewerFetchedTexture::updateFetch()  	S32 desired_discard = getDesiredDiscardLevel();  	F32 decode_priority = getDecodePriority();  	decode_priority = llmax(decode_priority, 0.0f); -	 +  	if (mIsFetching)  	{  		// Sets mRawDiscardLevel, mRawImage, mAuxRawImage @@ -1772,10 +1776,10 @@ bool LLViewerFetchedTexture::updateFetch()  	{  		make_request = false;  	} -	else if (!isJustBound() && mCachedRawImageReady) -	{ -		make_request = false; -	} +	//else if (!isJustBound() && mCachedRawImageReady) +	//{ +	//	make_request = false; +	//}  	else  	{  		if (mIsFetching) @@ -1847,12 +1851,12 @@ BOOL LLViewerFetchedTexture::forceFetch()  	{  		return false ;  	} -	if(mDesiredSavedRawDiscardLevel < getDiscardLevel()) +	//if(mDesiredSavedRawDiscardLevel < getDiscardLevel())  	{  		//no need to force fetching. normal fetching flow will do the work.  		//return false ;  	} -	if (mNeedsCreateTexture) +	//if (mNeedsCreateTexture)  	{  		// We may be fetching still (e.g. waiting on write)  		// but don't check until we've processed the raw data we have @@ -1888,7 +1892,8 @@ BOOL LLViewerFetchedTexture::forceFetch()  		h = getHeight(0);  		c = getComponents();  	} -	fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mUrl, getID(),getTargetHost(), maxDecodePriority(), +	setDecodePriority(maxDecodePriority()) ; +	fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mUrl, getID(),getTargetHost(), getDecodePriority(),  																		  w, h, c, desired_discard, needsAux());  	if (fetch_request_created) diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 6aaaa4021b..79d9c4e7bb 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -384,8 +384,6 @@ public:  	void updateVirtualSize() ; -	// setDesiredDiscardLevel is only used by LLViewerTextureList -	void setDesiredDiscardLevel(S32 discard) { mDesiredDiscardLevel = discard; }  	S32  getDesiredDiscardLevel()			 { return mDesiredDiscardLevel; }  	void setMinDiscardLevel(S32 discard) 	{ mMinDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel,(S8)discard); } diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 8252b7df00..6bb547373c 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -178,7 +178,7 @@ static std::string get_texture_list_name()  void LLViewerTextureList::doPrefetchImages()  { -    if (LLAppViewer::instance()->getPurgeCache()) +	if (LLAppViewer::instance()->getPurgeCache())  	{  		// cache was purged, no point  		return; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 333527e878..b2ee7f4469 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -101,7 +101,6 @@  #include "llfloaterbuildoptions.h"  #include "llfloaterbuyland.h"  #include "llfloatercamera.h" -#include "llfloaterchat.h"  #include "llfloaterchatterbox.h"  #include "llfloatercustomize.h"  #include "llfloaterland.h" @@ -1638,7 +1637,7 @@ void LLViewerWindow::shutdownGL()  	LLViewerTextureManager::cleanup() ;  	LLImageGL::cleanupClass() ; -	llinfos << "All texturs and llimagegl images are destroyed!" << llendl ; +	llinfos << "All textures and llimagegl images are destroyed!" << llendl ;  	llinfos << "Cleaning up select manager" << llendl;  	LLSelectMgr::getInstance()->cleanup(); diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 7baa0dda65..9f1fe0c11f 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -63,7 +63,6 @@  #include "llviewercamera.h"  #include "llfloaterfriends.h"  //VIVOX, inorder to refresh communicate panel -#include "llfloaterchat.h"		// for LLFloaterChat::addChat()  #include "llviewernetwork.h"  #include "llnotificationsutil.h" @@ -3905,9 +3904,6 @@ void LLVivoxVoiceClient::messageEvent(  						LLVector3::zero,		// default arg  						true);					// prepend name and make it a link to the user's profile -				chat.mText = std::string("IM: ") + session->mName + std::string(": ") + message; -				// If the chat should come in quietly (i.e. we're in busy mode), pretend it's from a local agent. -				LLFloaterChat::addChat( chat, TRUE, quiet_chat );  			}  		}		  	} diff --git a/indra/newview/skins/default/xui/en/alert_button.xml b/indra/newview/skins/default/xui/en/alert_button.xml index 48c67a3770..632564d793 100644 --- a/indra/newview/skins/default/xui/en/alert_button.xml +++ b/indra/newview/skins/default/xui/en/alert_button.xml @@ -1,6 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <button +  name="Alert Button"    label_shadow="true"    auto_resize="false"    image_overlay_alignment="center" 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 new file mode 100644 index 0000000000..c3d84de9a7 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + border="true" + can_close="false" + can_minimize="false" + height="100" + layout="topleft" + name="modal container" + width="240"> +    <button +     height="20" +     label="Save" +     label_selected="Save" +     layout="topleft" +     left="20" +     name="Save" +     top="70" +     width="82" /> +    <button +     height="20" +     label="Cancel" +     label_selected="Cancel" +     layout="topleft" +     left_pad="36" +     name="Cancel" +     top_delta="0" +     width="82" /> +    <text +     type="string" +     length="1" +     follows="left|top" +     font="SansSerif" +     height="16" +     layout="topleft" +     left="20" +     name="Save item as:" +     top="10" +     width="200"> +        Save outfit as: +    </text> +    <line_editor +     type="string" +     length="1" +     border_style="line" +     border_thickness="1" +     follows="left|top" +     font="SansSerif" +     handle_edit_keys_directly="true" +     height="20" +     layout="topleft" +     left_delta="0" +     max_length="63" +     name="name ed" +     top_pad="4" +     width="200"> +        [DESC] +    </line_editor> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index a36a1b591b..60c9810e95 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -43,6 +43,12 @@           layout="topleft"           name="local" />      </radio_group> +  <ui_ctrl  +    height="90" +    width="90" +    name="thumbnail_placeholder" +    top_pad="6" +    />      <text       type="string"       font="SansSerifSmall" @@ -54,7 +60,7 @@       left_delta="0"       halign="right"       name="file_size_label" -     top_pad="106" +     top_pad="10"       width="195">          [SIZE] KB      </text> diff --git a/indra/newview/skins/default/xui/en/menu_gesture_gear.xml b/indra/newview/skins/default/xui/en/menu_gesture_gear.xml index 4642e82c0b..d96f3c5494 100644 --- a/indra/newview/skins/default/xui/en/menu_gesture_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_gesture_gear.xml @@ -17,7 +17,7 @@       layout="topleft"       name="copy_gesture">          <on_click -         function="Gesture.Action.CopyPast" +         function="Gesture.Action.CopyPaste"           parameter="copy_gesture" />          <on_enable           function="Gesture.EnableAction" @@ -28,7 +28,7 @@       layout="topleft"       name="paste">          <on_click -         function="Gesture.Action.CopyPast" +         function="Gesture.Action.CopyPaste"           parameter="paste" />          <on_enable           function="Gesture.EnableAction" @@ -39,7 +39,7 @@       layout="topleft"       name="copy_uuid">          <on_click -         function="Gesture.Action.CopyPast" +         function="Gesture.Action.CopyPaste"           parameter="copy_uuid" />          <on_enable           function="Gesture.EnableAction" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index eae99b30bc..598c5fd8ca 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -1414,6 +1414,16 @@ You have added "[LANDMARK_NAME]" to your [FOLDER_NAME] folder.    </notification>    <notification +   icon="alert.tga" +   name="LandmarkAlreadyExists" +   type="alert"> +You already have a landmark for this location. +    <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification     icon="alertmodal.tga"     name="CannotCreateLandmarkNotOwner"     type="alertmodal"> diff --git a/indra/newview/skins/default/xui/en/panel_chat_separator.xml b/indra/newview/skins/default/xui/en/panel_chat_separator.xml index d0a2ddb289..357dbc07cc 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_separator.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_separator.xml @@ -3,6 +3,6 @@   background_visible="true"   bg_alpha_color="black"   follows="left|right|top" - height="1" + height="0"   layout="topleft"   name="chat_separator_panel" /> diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index 9ad99b1f13..58cb5fed5d 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -126,6 +126,8 @@           <combo_editor            label="Search [SECOND_LIFE]"            name="search_combo_editor"/> +         <combo_list +          draw_border="true" />          </search_combo_box>  	</panel>      <favorites_bar 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 1c1e17eb5a..a8e24366f2 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -77,10 +77,23 @@       name="cookies_enabled"       top_pad="10"       width="350" /> -    <check_box +	<check_box +     control_name="MediaEnabled" +     height="16" +     label="Media Enabled" +     layout="topleft" +     left="30" +     name="media_enabled" +     top_pad="10" +     width="350"> +       <check_box.commit_callback +          function="Pref.MediaEnabled" /> +    </check_box> +	<check_box +	 enabled_control="MediaEnabled"       control_name="ParcelMediaAutoPlayEnable"       height="16" -     label="Allow Media Autoplay" +     label="Allow Media to auto-play"       layout="topleft"       left="30"       name="autoplay_enabled" diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml index ab6384203f..e1d8ee241d 100644 --- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml @@ -122,6 +122,7 @@  		height="22"  		width="22">  	  <button +		  name="fwd_btn"  		  follows="top"  		  image_overlay="Arrow_Right_Off"  		  image_disabled="PushButton_Disabled" @@ -131,7 +132,6 @@  		  hover_glow_amount="0.15"  		  top="0"  		  height="22" -		  min_width="22"  		  width="22"  		  layout="topleft"  		  tool_tip="Navigate forward"> @@ -150,10 +150,11 @@  		min_width="22"  		width="22">  	  <button +		  name="home_btn"  		  follows="top" +		  image_overlay="Home_Off"  		  image_disabled="PushButton_Disabled"  		  image_disabled_selected="PushButton_Disabled" -		  image_overlay="Home_Off"  		  image_selected="PushButton_Selected"  		  image_unselected="PushButton_Off"  		  hover_glow_amount="0.15" @@ -161,7 +162,6 @@  		  tool_tip="Home page"  		  top="0"  		  height="22" -		  min_width="22"  		  width="22">  		<button.commit_callback  			function="MediaCtrl.Home" /> @@ -178,6 +178,7 @@  		min_width="22"  		width="22">  	  <button +		  name="media_stop_btn"  		  follows="top"  		  image_overlay="Stop_Off"  		  image_disabled="PushButton_Disabled" @@ -189,7 +190,6 @@  		  tool_tip="Stop media"  		  top="0"  		  height="22" -		  min_width="22"  		  width="22">  		<button.commit_callback  			function="MediaCtrl.MediaStop" /> @@ -206,6 +206,7 @@  		min_width="22"  		width="22">  	  <button +		  name="reload_btn"  		  follows="top"  		  image_overlay="Refresh_Off"  		  image_disabled="PushButton_Disabled" @@ -217,7 +218,6 @@  		  tool_tip="Reload"  		  top="0"  		  height="22" -		  min_width="22"  		  width="22">  		<button.commit_callback  			function="MediaCtrl.Reload" /> @@ -234,6 +234,7 @@  		min_width="22"  		width="22">  	  <button +		  name="stop_btn"  		  follows="top"  		  image_overlay="StopReload_Off"  		  image_disabled="PushButton_Disabled" @@ -245,7 +246,6 @@  		  tool_tip = "Stop loading"  		  top="0"  		  height="22" -		  min_width="22"  		  width="22">  		<button.commit_callback  			function="MediaCtrl.Stop" /> @@ -262,6 +262,7 @@  		min_width="22"  		width="24">  	  <button +		  name="play_btn"  		  follows="top"  		  image_overlay="Play_Off"  		  image_disabled="PushButton_Disabled" @@ -274,7 +275,6 @@  		  left_delta="2"  		  top="0"  		  height="22" -		  min_width="22"  		  width="22">  		<button.commit_callback  			function="MediaCtrl.Play" /> @@ -290,6 +290,7 @@  		min_width="22"  		width="24">  	  <button +		  name="pause_btn"  		  follows="top"  		  image_overlay="Pause_Off"  		  image_disabled="PushButton_Disabled" @@ -354,7 +355,6 @@  			  image_name="Flag"  			  layout="topleft"  			  tool_tip="White List enabled" -			  min_width="16"  			  width="16" />  		</layout_panel>  		<layout_panel @@ -369,7 +369,6 @@  			  image_name="Lock2"  			  layout="topleft"  			  tool_tip="Secured Browsing" -			  min_width="16"  			  width="16" />  		</layout_panel>  	  </layout_stack> @@ -394,7 +393,6 @@  		  initial_value="0.5"  		  layout="topleft"  		  tool_tip="Movie play progress" -		  min_width="100"  		  width="200">  		<slider_bar.commit_callback  			function="MediaCtrl.JumpProgress" /> @@ -410,6 +408,7 @@  		min_width="22"  		width="22">  	  <button +		  name="skip_back_btn"  		  follows="top"  		  image_overlay="SkipBackward_Off"  		  image_disabled="PushButton_Disabled" @@ -438,6 +437,7 @@  		min_width="22"  		width="22">  	  <button +		  name="skip_forward_btn"  		  follows="top"  		  image_overlay="SkipForward_Off"  		  image_disabled="PushButton_Disabled" @@ -449,7 +449,6 @@  		  layout="topleft"  		  tool_tip="Step forward"  		  top="0" -		  min_width="22"  		  width="22">  		<button.commit_callback  			function="MediaCtrl.SkipForward" /> @@ -470,20 +469,19 @@  	  <!-- two different images.  -->  	  <!-- Note also: the button and the slider must overlap! -->  	  <button +		  name="media_mute_button"  		  follows="top"  		  image_disabled="PushButton_Disabled"  		  image_disabled_selected="PushButton_Disabled"  		  image_selected="AudioMute_Off"  		  image_unselected="Audio_Off"  		  hover_glow_amount="0.15" -		  name="media_mute_button"  		  is_toggle="true"  		  layout="topleft"  		  scale_image="false"   		  tool_tip="Mute This Media"  		  top="0"  		  height="20" -		  min_width="22"  		  width="22" >  		<button.commit_callback  			function="MediaCtrl.ToggleMute" /> @@ -523,6 +521,7 @@  		min_width="22"  		width="22">  	  <button +		  name="zoom_frame_btn"  		  follows="top"  		  image_overlay="Zoom_Off"  		  image_disabled="PushButton_Disabled" @@ -534,7 +533,6 @@  		  height="22"  		  layout="topleft"  		  tool_tip="Zoom into media" -		  min_width="22"  		  width="22">  		<button.commit_callback  			function="MediaCtrl.Zoom" /> @@ -550,6 +548,7 @@  		min_width="21"  		width="21" >  	  <button +		  name="close_btn"  		  follows="top"  		  image_overlay="UnZoom_Off"  		  image_disabled="PushButton_Disabled" @@ -577,6 +576,7 @@  		min_width="22"  		width="22">  	  <button +		  name="new_window_btn"  		  follows="top"  		  image_overlay="ExternalBrowser_Off"  		  image_disabled="PushButton_Disabled" @@ -588,7 +588,6 @@  		  layout="topleft"  		  tool_tip = "Open URL in browser"  		  top="0" -		  min_width="24"  		  width="24" >  		<button.commit_callback  			function="MediaCtrl.Open" /> diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml index ba2d61afb7..d198237e5d 100644 --- a/indra/newview/skins/default/xui/en/panel_toast.xml +++ b/indra/newview/skins/default/xui/en/panel_toast.xml @@ -39,7 +39,8 @@     name="toast_text"     word_wrap="true"     text_color="white" -   top="5"  +   top="5" +   v_pad="5"       use_ellipses="true"     width="260">      Toast text; diff --git a/indra/newview/skins/default/xui/en/widgets/chat_history.xml b/indra/newview/skins/default/xui/en/widgets/chat_history.xml index 8785dff2ae..ef885e8045 100644 --- a/indra/newview/skins/default/xui/en/widgets/chat_history.xml +++ b/indra/newview/skins/default/xui/en/widgets/chat_history.xml @@ -1,23 +1,24 @@  <?xml version="1.0" encoding="UTF-8"?>  <chat_history -	message_header="panel_chat_header.xml" -    message_separator="panel_chat_separator.xml" -    left_text_pad="10" -	right_text_pad="15" -    left_widget_pad="0" -	right_widget_pad="10" -	top_separator_pad="5" -	bottom_separator_pad="5" -	top_header_pad="17" -	bottom_header_pad="10" +  message_header="panel_chat_header.xml" +  message_separator="panel_chat_separator.xml" +  left_text_pad="10" +  right_text_pad="15" +  left_widget_pad="0" +  right_widget_pad="10" +  top_separator_pad="1" +  bottom_separator_pad="1" +  top_header_pad="12" +  bottom_header_pad="5"  	max_length="2147483647"  	track_bottom="true"  	name="chat_history"  	type="string"  	word_wrap="true" +  line_spacing.multiple="1.0"     font="SansSerif">    <more_chat_text      mouse_opaque="true"       word_wrap="true"      /> -</chat_history> +</chat_history>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml index 693c43f141..2bec5b8a29 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml @@ -4,6 +4,13 @@   name="im_adhoc_chiclet"   show_speaker="false"   width="25"> +    <chiclet_im_adhoc.chiclet_button  +     height="25" +     image_selected="PushButton_Selected" +     image_unselected="PushButton_Off" +     name="chiclet_button" +     tab_stop="false" +     width="25"/>      <chiclet_im_adhoc.speaker       auto_update="true"       draw_border="false" @@ -13,11 +20,13 @@       visible="false"       width="20" />      <chiclet_im_adhoc.avatar_icon +     bottom="3"       follows="left|top|bottom" -     height="22" +     height="19" +     left="3"       mouse_opaque="true"       name="adhoc_icon" -     width="22" /> +     width="19" />      <chiclet_im_adhoc.unread_notifications       font_halign="center"       height="25" diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml index f4fc58701c..1d7f3208af 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml @@ -4,6 +4,13 @@   name="im_group_chiclet"   show_speaker="false"   width="25"> +    <chiclet_im_group.chiclet_button  +     height="25" +     image_selected="PushButton_Selected" +     image_unselected="PushButton_Off" +     name="chiclet_button" +     tab_stop="false" +     width="25"/>      <chiclet_im_group.speaker       auto_update="true"       draw_border="false" @@ -13,13 +20,14 @@       visible="false"       width="20" />      <chiclet_im_group.group_icon +     bottom="3"       default_icon="Generic_Group"       follows="left|top|bottom" -     height="18" -  bottom_pad="4" -     mouse_opaque="true" +     height="19" +     left="3" +     mouse_opaque="false"       name="group_icon" -     width="18" /> +     width="19" />      <chiclet_im_group.unread_notifications       height="25"       font_halign="center" diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml index 535113f717..e6289f7cef 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml @@ -4,6 +4,13 @@   name="im_p2p_chiclet"   show_speaker="false"   width="25"> +    <chiclet_im_p2p.chiclet_button  +     height="25" +     image_selected="PushButton_Selected" +     image_unselected="PushButton_Off" +     name="chiclet_button" +     tab_stop="false" +     width="25"/>      <chiclet_im_p2p.speaker       auto_update="true"       draw_border="false" @@ -13,11 +20,13 @@       visible="false"       width="20"/>      <chiclet_im_p2p.avatar_icon +     bottom="3"       follows="left|top|bottom" -     height="22" -     mouse_opaque="true" +     height="19" +     left="3" +     mouse_opaque="false"       name="avatar_icon" -     width="22" /> +     width="19" />      <chiclet_im_p2p.unread_notifications       height="25"       font_halign="center" diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_offer.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_offer.xml index 86bea9be50..138b50c968 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_offer.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_offer.xml @@ -3,14 +3,22 @@   height="25"   name="offer_chiclet"   width="25"> + <chiclet_offer.chiclet_button  +  height="25" +  image_selected="PushButton_Selected" +  image_unselected="PushButton_Off" +  name="chiclet_button" +  tab_stop="false" +  width="25"/>   <chiclet_offer.icon +  bottom="3"    default_icon="Generic_Object_Small"    follows="all" -  height="20" +  height="19" +  left="3"    mouse_opaque="false"    name="chiclet_icon" -  bottom_pad="2" -  width="20" /> +  width="19" />   <chiclet_offer.new_message_icon    bottom="11"    height="14" diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml index b1f9f5b0e8..ecf149dc76 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml @@ -3,14 +3,22 @@   height="25"   name="script_chiclet"   width="25"> + <chiclet_script.chiclet_button  +  height="25" +  image_selected="PushButton_Selected" +  image_unselected="PushButton_Off" +  name="chiclet_button" +  tab_stop="false" +  width="25"/>   <chiclet_script.icon +  bottom="3"    follows="all" -  height="20" +  height="19"    image_name="Generic_Object_Small" +  left="3"    mouse_opaque="false"    name="chiclet_icon" -  width="20" -  bottom_pad="2" /> +  width="19"/>   <chiclet_script.new_message_icon    bottom="11"    height="14" diff --git a/indra/newview/skins/default/xui/en/widgets/menu.xml b/indra/newview/skins/default/xui/en/widgets/menu.xml index 53034afa61..58543338f6 100644 --- a/indra/newview/skins/default/xui/en/widgets/menu.xml +++ b/indra/newview/skins/default/xui/en/widgets/menu.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <menu bg_color="MenuDefaultBgColor"        bg_visible="true" -      drop_shadow="false" +      drop_shadow="true"        tear_off="false"        shortcut_pad="15">  </menu> diff --git a/indra/newview/tests/llviewerhelputil_test.cpp b/indra/newview/tests/llviewerhelputil_test.cpp index d7dd199722..297d98ad8d 100644 --- a/indra/newview/tests/llviewerhelputil_test.cpp +++ b/indra/newview/tests/llviewerhelputil_test.cpp @@ -83,6 +83,9 @@ class LLAgent  public:  	LLAgent() {}  	~LLAgent() {} +#ifdef __GNUC__ +	__attribute__ ((noinline)) +#endif  	BOOL isGodlike() const { return FALSE; }  private:  	int dummy; diff --git a/install.xml b/install.xml index aa25744f15..5069e44d46 100644 --- a/install.xml +++ b/install.xml @@ -962,9 +962,9 @@ anguage Infrstructure (CLI) international standard</string>            <key>windows</key>            <map>              <key>md5sum</key> -            <string>b50db4fdb833111e1e679188e4cb5815</string> +            <string>c41be1ba9728555ae5a2d2151c96dfe1</string>              <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-windows-qt4.6-20100104.tar.bz2</uri> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-windows-qt4.6-20100115.tar.bz2</uri>            </map>          </map>        </map> @@ -1367,23 +1367,23 @@ anguage Infrstructure (CLI) international standard</string>            <key>darwin</key>            <map>              <key>md5sum</key> -            <string>6d2a56c9b335acb10615f230b98aab67</string> +            <string>51f3fa1ab39563505df83b48ba432a3c</string>              <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7832-darwin-20100113a.tar.bz2</uri> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7852-darwin-20100115.tar.bz2</uri>            </map>            <key>linux</key>            <map>              <key>md5sum</key> -            <string>0744cbe83bd6c2c030334d3c69b131cb</string> +            <string>ab9573d6aa2acdd79a553c144c9ecb09</string>              <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7832-linux-20100113a.tar.bz2</uri> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7852-linux-20100115.tar.bz2</uri>            </map>            <key>windows</key>            <map>              <key>md5sum</key> -            <string>e68ed9a04ec9a437016ad5c641406706</string> +            <string>88ab785eebdc4f53a7dfc4e0b95f67ec</string>              <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7832-windows-20100113a.tar.bz2</uri> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7852-windows-20100115.tar.bz2</uri>            </map>          </map>        </map> | 
