diff options
| author | Debi King (Dessie) <dessie@lindenlab.com> | 2011-11-08 19:45:54 -0500 | 
|---|---|---|
| committer | Debi King (Dessie) <dessie@lindenlab.com> | 2011-11-08 19:45:54 -0500 | 
| commit | 6bce3d1b9d05dce77db50f3d2c92a70ad6ac8166 (patch) | |
| tree | 4e46356e118106d0a7097affb40f954feedd578b /indra | |
| parent | 860777473acef16dcff16cd5587038409967e44c (diff) | |
| parent | 5fa125ea0b733b3729208d90777d260db5e331e8 (diff) | |
reconciled .hgtags
Diffstat (limited to 'indra')
274 files changed, 4514 insertions, 1844 deletions
| diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp index 4db1b8bd10..bb7998c0a8 100644 --- a/indra/llcommon/llmemory.cpp +++ b/indra/llcommon/llmemory.cpp @@ -1821,6 +1821,7 @@ void LLPrivateMemoryPool::LLChunkHashElement::remove(LLPrivateMemoryPool::LLMemo  //class LLPrivateMemoryPoolManager  //--------------------------------------------------------------------  LLPrivateMemoryPoolManager* LLPrivateMemoryPoolManager::sInstance = NULL ; +BOOL LLPrivateMemoryPoolManager::sPrivatePoolEnabled = FALSE ;  std::vector<LLPrivateMemoryPool*> LLPrivateMemoryPoolManager::sDanglingPoolList ;  LLPrivateMemoryPoolManager::LLPrivateMemoryPoolManager(BOOL enabled, U32 max_pool_size)  @@ -1832,7 +1833,7 @@ LLPrivateMemoryPoolManager::LLPrivateMemoryPoolManager(BOOL enabled, U32 max_poo  		mPoolList[i] = NULL ;  	} -	mPrivatePoolEnabled = enabled ; +	sPrivatePoolEnabled = enabled ;  	const U32 MAX_POOL_SIZE = 256 * 1024 * 1024 ; //256 MB  	mMaxPrivatePoolSize = llmax(max_pool_size, MAX_POOL_SIZE) ; @@ -1917,7 +1918,7 @@ void LLPrivateMemoryPoolManager::destroyClass()  LLPrivateMemoryPool* LLPrivateMemoryPoolManager::newPool(S32 type)   { -	if(!mPrivatePoolEnabled) +	if(!sPrivatePoolEnabled)  	{  		return NULL ;  	} @@ -2015,7 +2016,11 @@ void  LLPrivateMemoryPoolManager::freeMem(LLPrivateMemoryPool* poolp, void* addr  	}  	else  	{ -		if(!sInstance) //the private memory manager is destroyed, try the dangling list +		if(!sPrivatePoolEnabled) +		{ +			free(addr) ; //private pool is disabled. +		} +		else if(!sInstance) //the private memory manager is destroyed, try the dangling list  		{  			for(S32 i = 0 ; i < sDanglingPoolList.size(); i++)  			{ @@ -2036,12 +2041,13 @@ void  LLPrivateMemoryPoolManager::freeMem(LLPrivateMemoryPool* poolp, void* addr  					addr = NULL ;  					break ;  				} -			} +			}		 +			llassert_always(!addr) ; //addr should be release before hitting here! +		} +		else +		{ +			llerrs << "private pool is used before initialized.!" << llendl ;  		} - -		llassert_always(!addr) ; //addr should be release before hitting here! - -		free(addr) ;  	}	  } diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h index 74cf42c894..bbbdaa6497 100644 --- a/indra/llcommon/llmemory.h +++ b/indra/llcommon/llmemory.h @@ -394,12 +394,12 @@ public:  	LLPrivateMemoryPool* newPool(S32 type) ;  	void deletePool(LLPrivateMemoryPool* pool) ; -private: -	static LLPrivateMemoryPoolManager* sInstance ; -	std::vector<LLPrivateMemoryPool*> mPoolList ; -	BOOL mPrivatePoolEnabled; +private:	 +	std::vector<LLPrivateMemoryPool*> mPoolList ;	  	U32  mMaxPrivatePoolSize; +	static LLPrivateMemoryPoolManager* sInstance ; +	static BOOL sPrivatePoolEnabled;  	static std::vector<LLPrivateMemoryPool*> sDanglingPoolList ;  public:  	//debug and statistics info. diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index fc1c1449da..b31fd1f8ae 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -29,7 +29,7 @@  const S32 LL_VERSION_MAJOR = 3;  const S32 LL_VERSION_MINOR = 2; -const S32 LL_VERSION_PATCH = 2; +const S32 LL_VERSION_PATCH = 3;  const S32 LL_VERSION_BUILD = 0;  const char * const LL_CHANNEL = "Second Life Developer"; diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index c53857fcee..dbd96673a1 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -1239,6 +1239,14 @@ void LLPluginClassMedia::focus(bool focused)  	sendMessage(message);  } +void LLPluginClassMedia::set_page_zoom_factor( double factor ) +{ +	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_page_zoom_factor"); + +	message.setValueReal("factor", factor); +	sendMessage(message); +} +  void LLPluginClassMedia::clear_cache()  {  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "clear_cache"); diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index 1f548f8cc0..d95fa40091 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -202,6 +202,7 @@ public:  	bool pluginSupportsMediaBrowser(void);  	void focus(bool focused); +	void set_page_zoom_factor( double factor );  	void clear_cache();  	void clear_cookies();  	void set_cookies(const std::string &cookies); diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp index 0fcd937361..3396213f1c 100644 --- a/indra/llui/lldockablefloater.cpp +++ b/indra/llui/lldockablefloater.cpp @@ -82,7 +82,7 @@ BOOL LLDockableFloater::postBuild()  		mForceDocking = true;  	} -	mDockTongue = LLUI::getUIImage("windows/Flyout_Pointer.png"); +	mDockTongue = LLUI::getUIImage("Flyout_Pointer");  	LLFloater::setDocked(true);  	return LLView::postBuild();  } @@ -244,13 +244,13 @@ const LLUIImagePtr& LLDockableFloater::getDockTongue(LLDockControl::DocAt dock_s  	switch(dock_side)  	{  	case LLDockControl::LEFT: -		mDockTongue = LLUI::getUIImage("windows/Flyout_Left.png"); +		mDockTongue = LLUI::getUIImage("Flyout_Left");  		break;  	case LLDockControl::RIGHT: -		mDockTongue = LLUI::getUIImage("windows/Flyout_Right.png"); +		mDockTongue = LLUI::getUIImage("Flyout_Right");  		break;  	default: -		mDockTongue = LLUI::getUIImage("windows/Flyout_Pointer.png"); +		mDockTongue = LLUI::getUIImage("Flyout_Pointer");  		break;  	} diff --git a/indra/llui/llkeywords.h b/indra/llui/llkeywords.h index d050cd7d7c..ac34015393 100644 --- a/indra/llui/llkeywords.h +++ b/indra/llui/llkeywords.h @@ -51,7 +51,7 @@ public:  	 * - TWO_SIDED_DELIMITER are for delimiters that end with a different delimiter than they open with.  	 * - DOUBLE_QUOTATION_MARKS are for delimiting areas using the same delimiter to open and close.  	 */ -	typedef enum TOKEN_TYPE +	enum TOKEN_TYPE  	{  		WORD,  		LINE, diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 3ef8d8ff35..cb237fca7c 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -1686,7 +1686,8 @@ LLMenuGL::LLMenuGL(const LLMenuGL::Params& p)  	mSpilloverMenu(NULL),  	mJumpKey(p.jump_key),  	mCreateJumpKeys(p.create_jump_keys), -	mNeedsArrange(FALSE),  +	mNeedsArrange(FALSE), +	mResetScrollPositionOnShow(true),  	mShortcutPad(p.shortcut_pad)  {  	typedef boost::tokenizer<boost::char_separator<char> > tokenizer; @@ -3043,7 +3044,7 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y)  	S32 mouse_x, mouse_y;  	// Resetting scrolling position -	if (menu->isScrollable()) +	if (menu->isScrollable() && menu->isScrollPositionOnShowReset())  	{  		menu->mFirstVisibleItem = NULL;  	} diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index 77db588390..bdae899933 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -516,6 +516,9 @@ public:  	static class LLMenuHolderGL* sMenuContainer; +	void resetScrollPositionOnShow(bool reset_scroll_pos) { mResetScrollPositionOnShow = reset_scroll_pos; } +	bool isScrollPositionOnShowReset() { return mResetScrollPositionOnShow; } +  protected:  	void createSpilloverBranch();  	void cleanupSpilloverBranch(); @@ -565,6 +568,7 @@ private:  	KEY				mJumpKey;  	BOOL			mCreateJumpKeys;  	S32				mShortcutPad; +	bool			mResetScrollPositionOnShow;  }; // end class LLMenuGL diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp index 287e3e2b41..e7642ae190 100644 --- a/indra/llui/lltoolbar.cpp +++ b/indra/llui/lltoolbar.cpp @@ -109,6 +109,7 @@ LLToolBar::LLToolBar(const LLToolBar::Params& p)  	mPadBetween(p.pad_between),  	mMinGirth(p.min_girth),  	mPopupMenuHandle(), +	mRightMouseTargetButton(NULL),  	mStartDragItemCallback(NULL),  	mHandleDragItemCallback(NULL),  	mHandleDropCallback(NULL), @@ -139,6 +140,7 @@ void LLToolBar::createContextMenu()  		LLUICtrl::CommitCallbackRegistry::ScopedRegistrar commit_reg;  		commit_reg.add("Toolbars.EnableSetting", boost::bind(&LLToolBar::onSettingEnable, this, _2)); +		commit_reg.add("Toolbars.RemoveSelectedCommand", boost::bind(&LLToolBar::onRemoveSelectedCommand, this));  		LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_reg;  		enable_reg.add("Toolbars.CheckSetting", boost::bind(&LLToolBar::isSettingChecked, this, _2)); @@ -397,6 +399,20 @@ BOOL LLToolBar::handleRightMouseDown(S32 x, S32 y, MASK mask)  	if (handle_it_here)  	{ +		// Determine which button the mouse was over during the click in case the context menu action +		// is intended to affect the button. +		BOOST_FOREACH(LLToolBarButton* button, mButtons) +		{ +			LLRect button_rect; +			button->localRectToOtherView(button->getLocalRect(), &button_rect, this); + +			if (button_rect.pointInRect(x, y)) +			{ +				mRightMouseTargetButton = button; +				break; +			} +		} +  		createContextMenu();  		LLContextMenu * menu = (LLContextMenu *) mPopupMenuHandle.get(); @@ -446,6 +462,18 @@ void LLToolBar::onSettingEnable(const LLSD& userdata)  	}  } +void LLToolBar::onRemoveSelectedCommand() +{ +	llassert(!mReadOnly); + +	if (mRightMouseTargetButton) +	{ +		removeCommand(mRightMouseTargetButton->getCommandId()); + +		mRightMouseTargetButton = NULL; +	} +} +  void LLToolBar::setButtonType(LLToolBarEnums::ButtonType button_type)  {  	bool regenerate_buttons = (mButtonType != button_type); @@ -524,11 +552,11 @@ int LLToolBar::getRankFromPosition(S32 x, S32 y)  			S32 mid_point = (button_rect.mRight + button_rect.mLeft) / 2;  			if (button_panel_x < mid_point)  			{ -		mDragx = button_rect.mLeft - mPadLeft; -		mDragy = button_rect.mTop + mPadTop; -	} -	else -	{ +				mDragx = button_rect.mLeft - mPadLeft; +				mDragy = button_rect.mTop + mPadTop; +			} +			else +			{  				rank++;  				mDragx = button_rect.mRight + mPadRight - 1;  				mDragy = button_rect.mTop + mPadTop; @@ -555,12 +583,12 @@ int LLToolBar::getRankFromPosition(S32 x, S32 y)  	{  		// We hit passed the end of the list so put the insertion point at the end  		if (orientation == LLLayoutStack::HORIZONTAL) -	{ +		{  			mDragx = button_rect.mRight + mPadRight;  			mDragy = button_rect.mTop + mPadTop; -	} -	else -	{ +		} +		else +		{  			mDragx = button_rect.mLeft - mPadLeft;  			mDragy = button_rect.mBottom - mPadBottom;  		} @@ -836,6 +864,7 @@ void LLToolBar::createButtons()  	}  	mButtons.clear();  	mButtonMap.clear(); +	mRightMouseTargetButton = NULL;  	BOOST_FOREACH(LLCommandId& command_id, mButtonCommands)  	{ diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h index f10f39adc3..51fe23ddd1 100644 --- a/indra/llui/lltoolbar.h +++ b/indra/llui/lltoolbar.h @@ -63,9 +63,11 @@ public:  	BOOL handleMouseDown(S32 x, S32 y, MASK mask);  	BOOL handleHover(S32 x, S32 y, MASK mask); +  	void reshape(S32 width, S32 height, BOOL called_from_parent = true);  	void setEnabled(BOOL enabled);  	void setCommandId(const LLCommandId& id) { mId = id; } +	LLCommandId getCommandId() { return mId; }  	void setStartDragCallback(tool_startdrag_callback_t cb)   { mStartDragItemCallback  = cb; }  	void setHandleDragCallback(tool_handledrag_callback_t cb) { mHandleDragItemCallback = cb; } @@ -164,7 +166,8 @@ public:  												pad_bottom,  												pad_between,  												min_girth; -		// get rid of this + +		// default command set  		Multiple<LLCommandId::Params>			commands;  		Optional<LLPanel::Params>				button_panel; @@ -175,8 +178,6 @@ public:  	// virtuals  	void draw();  	void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); -	int  getRankFromPosition(S32 x, S32 y);	 -	int  getRankFromPosition(const LLCommandId& id);	  	BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);  	virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  								   EDragAndDropType cargo_type, @@ -185,15 +186,14 @@ public:  								   std::string& tooltip_msg);  	static const int RANK_NONE = -1; -	  	bool addCommand(const LLCommandId& commandId, int rank = RANK_NONE);  	int  removeCommand(const LLCommandId& commandId);		// Returns the rank the removed command was at, RANK_NONE if not found -	bool hasCommand(const LLCommandId& commandId) const; -	bool enableCommand(const LLCommandId& commandId, bool enabled); -	bool stopCommandInProgress(const LLCommandId& commandId); -	bool flashCommand(const LLCommandId& commandId, bool flash); +	bool hasCommand(const LLCommandId& commandId) const;	// is this command bound to a button in this toolbar +	bool enableCommand(const LLCommandId& commandId, bool enabled);	// enable/disable button bound to the specified command, if it exists in this toolbar +	bool stopCommandInProgress(const LLCommandId& commandId);	// stop command if it is currently active +	bool flashCommand(const LLCommandId& commandId, bool flash); // flash button associated with given command, if in this toolbar -	void setStartDragCallback(tool_startdrag_callback_t cb)   { mStartDragItemCallback  = cb; } +	void setStartDragCallback(tool_startdrag_callback_t cb)   { mStartDragItemCallback  = cb; } // connects drag and drop behavior to external logic  	void setHandleDragCallback(tool_handledrag_callback_t cb) { mHandleDragItemCallback = cb; }  	void setHandleDropCallback(tool_handledrop_callback_t cb) { mHandleDropCallback     = cb; }  	bool isReadOnly() const { return mReadOnly; } @@ -206,69 +206,76 @@ public:  	boost::signals2::connection setButtonLeaveCallback(const button_signal_t::slot_type& cb);  	boost::signals2::connection setButtonRemoveCallback(const button_signal_t::slot_type& cb); -	void setTooltipButtonSuffix(const std::string& suffix) { mButtonTooltipSuffix = suffix; } +	// append the specified string to end of tooltip +	void setTooltipButtonSuffix(const std::string& suffix) { mButtonTooltipSuffix = suffix; }   	LLToolBarEnums::SideType getSideType() const { return mSideType; }  	bool hasButtons() const { return !mButtons.empty(); }  	bool isModified() const { return mModified; } -protected: -	friend class LLUICtrlFactory; -	LLToolBar(const Params&); -	~LLToolBar(); - -	void initFromParams(const Params&); -	tool_startdrag_callback_t		mStartDragItemCallback; -	tool_handledrag_callback_t		mHandleDragItemCallback; -	tool_handledrop_callback_t		mHandleDropCallback; -	bool							mDragAndDropTarget; -	int								mDragRank; -	S32								mDragx, -									mDragy, -									mDragGirth; +	int  getRankFromPosition(S32 x, S32 y);	 +	int  getRankFromPosition(const LLCommandId& id);	 -public:  	// Methods used in loading and saving toolbar settings  	void setButtonType(LLToolBarEnums::ButtonType button_type);  	LLToolBarEnums::ButtonType getButtonType() { return mButtonType; }  	command_id_list_t& getCommandsList() { return mButtonCommands; }  	void clearCommandsList(); -					    +  private: +	friend class LLUICtrlFactory; +	LLToolBar(const Params&); +	~LLToolBar(); + +	void initFromParams(const Params&);  	void createContextMenu();  	void updateLayoutAsNeeded();  	void createButtons();  	void resizeButtonsInRow(std::vector<LLToolBarButton*>& buttons_in_row, S32 max_row_girth);  	BOOL isSettingChecked(const LLSD& userdata);  	void onSettingEnable(const LLSD& userdata); +	void onRemoveSelectedCommand(); +private: +	// static layout state  	const bool						mReadOnly; +	const LLToolBarEnums::SideType	mSideType; +	const bool						mWrap; +	const S32						mPadLeft, +									mPadRight, +									mPadTop, +									mPadBottom, +									mPadBetween, +									mMinGirth; + +	// drag and drop state +	tool_startdrag_callback_t		mStartDragItemCallback; +	tool_handledrag_callback_t		mHandleDragItemCallback; +	tool_handledrop_callback_t		mHandleDropCallback; +	bool							mDragAndDropTarget; +	int								mDragRank; +	S32								mDragx, +									mDragy, +									mDragGirth;  	typedef std::list<LLToolBarButton*> toolbar_button_list; +	typedef std::map<LLUUID, LLToolBarButton*> command_id_map;  	toolbar_button_list				mButtons;  	command_id_list_t				mButtonCommands; -	typedef std::map<LLUUID, LLToolBarButton*> command_id_map;  	command_id_map					mButtonMap;  	LLToolBarEnums::ButtonType		mButtonType; +	LLToolBarButton::Params			mButtonParams[LLToolBarEnums::BTNTYPE_COUNT]; + +	// related widgets  	LLLayoutStack*					mCenteringStack; -	LLLayoutStack*					mWrapStack;  	LLPanel*						mButtonPanel; -	LLToolBarEnums::SideType		mSideType; -	 -	bool							mWrap; -	bool							mNeedsLayout; -	bool							mModified; -	S32								mPadLeft, -									mPadRight, -									mPadTop, -									mPadBottom, -									mPadBetween, -									mMinGirth; +	LLHandle<class LLContextMenu>	mPopupMenuHandle; -	LLToolBarButton::Params			mButtonParams[LLToolBarEnums::BTNTYPE_COUNT]; +	LLToolBarButton*				mRightMouseTargetButton; -	LLHandle<class LLContextMenu>	mPopupMenuHandle; +	bool							mNeedsLayout; +	bool							mModified;  	button_signal_t*				mButtonAddSignal;  	button_signal_t*				mButtonEnterSignal; diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 4dd11541b9..8057506736 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -2545,8 +2545,8 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e  			{  				// This is where we would constrain move/resize to a particular screen -				const S32 MIN_WIDTH  = 320; -				const S32 MIN_HEIGHT = 240; +				const S32 MIN_WIDTH  = 1024; +				const S32 MIN_HEIGHT = 768;  				Rect currentBounds;  				Rect previousBounds; diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 121c7880df..a84bd5fb08 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -1031,6 +1031,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  		mhInstance,  		NULL); +	LL_INFOS("Window") << "window is created." << llendl ; +  	//-----------------------------------------------------------------------  	// Create GL drawing context  	//----------------------------------------------------------------------- @@ -1120,6 +1122,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  		return FALSE;  	} +	LL_INFOS("Window") << "Drawing context is created." << llendl ; +  	gGLManager.initWGL();  	if (wglChoosePixelFormatARB) @@ -1256,7 +1260,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  			LL_INFOS("Window") << "Choosing pixel formats: " << num_formats << " pixel formats returned" << LL_ENDL;  		} -		 +		LL_INFOS("Window") << "pixel formats done." << llendl ;  		S32 swap_method = 0;  		S32 cur_format = num_formats-1; @@ -1306,6 +1310,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  			mhInstance,  			NULL); +		LL_INFOS("Window") << "recreate window done." << llendl ; +  		if (!(mhDC = GetDC(mWindowHandle)))  		{  			close(); @@ -2354,6 +2360,14 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  				return 0;  			} +		case WM_GETMINMAXINFO: +			{ +				LPMINMAXINFO min_max = (LPMINMAXINFO)l_param; +				min_max->ptMinTrackSize.x = 1024; +				min_max->ptMinTrackSize.y = 768; +				return 0; +			} +  		case WM_SIZE:  			{  				window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_SIZE"); diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index 0f74772e42..13d51099a8 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -25,12 +25,11 @@   * $/LicenseInfo$   * @endcond   */ -  #include "llqtwebkit.h" -  #include "linden_common.h"  #include "indra_constants.h" // for indra keyboard codes +#include "lltimer.h"  #include "llgl.h"  #include "llplugininstance.h" @@ -117,15 +116,19 @@ private:  	F32 mBackgroundG;  	F32 mBackgroundB;  	std::string mTarget; -	 +	LLTimer mElapsedTime; +		  	VolumeCatcher mVolumeCatcher;  	void postDebugMessage( const std::string& msg )  	{  		if ( mEnableMediaPluginDebugging )  		{ +			std::stringstream str; +			str << "@Media Msg> " << "[" << (double)mElapsedTime.getElapsedTimeF32()  << "] -- " << msg; +  			LLPluginMessage debug_message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "debug_message"); -			debug_message.setValue("message_text", "Media> " + msg); +			debug_message.setValue("message_text", str.str());  			debug_message.setValue("message_level", "info");  			sendMessage(debug_message);  		} @@ -323,7 +326,11 @@ private:  		LLQtWebKit::getInstance()->enablePlugins( mPluginsEnabled );  		// turn on/off Javascript based on what host app tells us +#if LLQTWEBKIT_API_VERSION >= 11 +		LLQtWebKit::getInstance()->enableJavaScript( mJavascriptEnabled ); +#else  		LLQtWebKit::getInstance()->enableJavascript( mJavascriptEnabled ); +#endif  		std::stringstream str;  		str << "Cookies enabled = " << mCookiesEnabled << ", plugins enabled = " << mPluginsEnabled << ", Javascript enabled = " << mJavascriptEnabled; @@ -346,7 +353,7 @@ private:  		// append details to agent string  		LLQtWebKit::getInstance()->setBrowserAgentId( mUserAgent );  		postDebugMessage( "Updating user agent with " + mUserAgent ); -		 +  #if !LL_QTWEBKIT_USES_PIXMAPS  		// don't flip bitmap  		LLQtWebKit::getInstance()->flipWindow( mBrowserWindowId, true ); @@ -374,7 +381,17 @@ private:  		url << "%22%3E%3C/body%3E%3C/html%3E";  		//lldebugs << "data url is: " << url.str() << llendl; -					 + +		// loading overlay debug screen follows media debugging flag from client for now. +#if LLQTWEBKIT_API_VERSION >= 16 +		LLQtWebKit::getInstance()->enableLoadingOverlay(mBrowserWindowId, mEnableMediaPluginDebugging); +#else +		llwarns << "Ignoring enableLoadingOverlay() call (llqtwebkit version is too old)." << llendl; +#endif +		str.clear(); +		str << "Loading overlay enabled = " << mEnableMediaPluginDebugging << " for mBrowserWindowId = " << mBrowserWindowId; +		postDebugMessage( str.str() ); +  		LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, url.str() );  //		LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "about:blank" ); @@ -583,6 +600,10 @@ private:  		// These could be passed through as well, but aren't really needed.  //		message.setValue("uri", event.getEventUri());  //		message.setValueBoolean("dead", (event.getIntValue() != 0)) + +		// debug spam +		postDebugMessage( "Sending cookie_set message from plugin: " + event.getStringValue() ); +  		sendMessage(message);  	} @@ -863,6 +884,8 @@ MediaPluginWebKit::MediaPluginWebKit(LLPluginInstance::sendMessageFunction host_  	mPluginsEnabled = true;		// default to on  	mEnableMediaPluginDebugging = false;  	mUserAgent = "LLPluginMedia Web Browser"; + +	mElapsedTime.reset();  }  MediaPluginWebKit::~MediaPluginWebKit() @@ -1210,7 +1233,6 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  			{  				mEnableMediaPluginDebugging = message_in.getValueBoolean( "enable" );  			} -  			else  			if(message_name == "js_enable_object")  			{ @@ -1298,6 +1320,15 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  					mFirstFocus = false;  				}  			} +			else if(message_name == "set_page_zoom_factor") +			{ +#if LLQTWEBKIT_API_VERSION >= 15 +				F32 factor = message_in.getValueReal("factor"); +				LLQtWebKit::getInstance()->setPageZoomFactor(factor); +#else +				llwarns << "Ignoring setPageZoomFactor message (llqtwebkit version is too old)." << llendl; +#endif +			}  			else if(message_name == "clear_cache")  			{  				LLQtWebKit::getInstance()->clearCache(); @@ -1324,6 +1355,9 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  			else if(message_name == "set_cookies")  			{  				LLQtWebKit::getInstance()->setCookies(message_in.getValue("cookies")); + +				// debug spam +				postDebugMessage( "Plugin setting cookie: " + message_in.getValue("cookies") );  			}  			else if(message_name == "proxy_setup")  			{ diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index bef775cdb8..ff9cf3199e 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -219,7 +219,6 @@ set(viewer_SOURCE_FILES      llfloateropenobject.cpp      llfloaterpay.cpp      llfloaterperms.cpp -    llfloaterpostcard.cpp      llfloaterpostprocess.cpp      llfloaterpreference.cpp      llfloaterproperties.cpp @@ -396,6 +395,12 @@ set(viewer_SOURCE_FILES      llpanelprimmediacontrols.cpp      llpanelprofile.cpp      llpanelprofileview.cpp +    llpanelsnapshot.cpp +    llpanelsnapshotinventory.cpp +    llpanelsnapshotlocal.cpp +    llpanelsnapshotoptions.cpp +    llpanelsnapshotpostcard.cpp +    llpanelsnapshotprofile.cpp      llpanelteleporthistory.cpp      llpaneltiptoast.cpp      llpanelvoiceeffect.cpp @@ -414,6 +419,7 @@ set(viewer_SOURCE_FILES      llpopupview.cpp      llpolymesh.cpp      llpolymorph.cpp +    llpostcard.cpp      llpreview.cpp      llpreviewanim.cpp      llpreviewgesture.cpp @@ -603,6 +609,7 @@ set(viewer_SOURCE_FILES      llwearablelist.cpp      llwearabletype.cpp      llweb.cpp +    llwebprofile.cpp      llwebsharing.cpp      llwind.cpp      llwindowlistener.cpp @@ -786,7 +793,6 @@ set(viewer_HEADER_FILES      llfloateropenobject.h      llfloaterpay.h      llfloaterperms.h -    llfloaterpostcard.h      llfloaterpostprocess.h      llfloaterpreference.h      llfloaterproperties.h @@ -957,6 +963,7 @@ set(viewer_HEADER_FILES      llpanelprimmediacontrols.h      llpanelprofile.h      llpanelprofileview.h +    llpanelsnapshot.h      llpanelteleporthistory.h      llpaneltiptoast.h      llpanelvoicedevicesettings.h @@ -975,6 +982,7 @@ set(viewer_HEADER_FILES      llpolymesh.h      llpolymorph.h      llpopupview.h +    llpostcard.h      llpreview.h      llpreviewanim.h      llpreviewgesture.h @@ -1164,6 +1172,7 @@ set(viewer_HEADER_FILES      llwearablelist.h      llwearabletype.h      llweb.h +    llwebprofile.h      llwebsharing.h      llwind.h      llwindowlistener.h diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 5c0ea2f774..9c055bdc5a 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1605,17 +1605,6 @@        <key>Value</key>        <integer>0</integer>      </map> -    <key>CloseSnapshotOnKeep</key> -    <map> -      <key>Comment</key> -      <string>Close snapshot window after saving snapshot</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>1</integer> -    </map>      <key>CmdLineDisableVoice</key>      <map>        <key>Comment</key> @@ -2630,17 +2619,6 @@        <key>Value</key>        <integer>-1</integer>      </map> -    <key>DebugToolbarFUI</key> -    <map> -      <key>Comment</key> -      <string>Turn on the FUI Toolbars</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>1</integer> -    </map>      <key>DebugViews</key>      <map>        <key>Comment</key> @@ -4667,6 +4645,17 @@        <string>0.0.0</string>      </map> +    <key>LastSnapshotToProfileHeight</key> +    <map> +      <key>Comment</key> +      <string>The height of the last profile snapshot, in px</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>768</integer> +    </map>      <key>LastSnapshotToEmailHeight</key>      <map>        <key>Comment</key> @@ -4678,6 +4667,17 @@        <key>Value</key>        <integer>768</integer>      </map> +    <key>LastSnapshotToProfileWidth</key> +    <map> +      <key>Comment</key> +      <string>The width of the last profile snapshot, in px</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>1024</integer> +    </map>      <key>LastSnapshotToEmailWidth</key>      <map>        <key>Comment</key> @@ -4733,17 +4733,6 @@        <key>Value</key>        <integer>512</integer>      </map> -    <key>LastSnapshotType</key> -    <map> -      <key>Comment</key> -      <string>Select this as next type of snapshot to take (0 = postcard, 1 = texture, 2 = local image)</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>S32</string> -      <key>Value</key> -      <integer>0</integer> -    </map>      <key>LeftClickShowMenu</key>      <map>        <key>Comment</key> @@ -10608,6 +10597,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>SnapshotProfileLastResolution</key> +    <map> +      <key>Comment</key> +      <string>Take next profile snapshot at this resolution</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>SnapshotPostcardLastResolution</key>      <map>        <key>Comment</key> diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index 6ed4480cb1..8cdd8ed838 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -36,7 +36,7 @@      <key>DisplayDestinationsOnInitialRun</key>          <map>          <key>Comment</key> -          <string>Display the destinations guide when a user first launches FUI.</string> +          <string>Display the destinations guide when a user first launches Second Life.</string>          <key>Persist</key>            <integer>1</integer>          <key>Type</key> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index dc88c81d6a..c937f604fc 100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1970,6 +1970,8 @@ bool LLAppViewer::initThreads()  	static const bool enable_threads = true;  #endif +	LLImage::initClass(); +  	LLVFSThread::initClass(enable_threads && false);  	LLLFSThread::initClass(enable_threads && false); @@ -1979,8 +1981,7 @@ bool LLAppViewer::initThreads()  	LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(),  													sImageDecodeThread,  													enable_threads && true, -													app_metrics_qa_mode); -	LLImage::initClass(); +													app_metrics_qa_mode);	  	if (LLFastTimer::sLog || LLFastTimer::sMetricLog)  	{ @@ -3084,6 +3085,8 @@ void LLAppViewer::handleViewerCrash()  	llinfos << "Last render pool type: " << LLPipeline::sCurRenderPoolType << llendl ; +	LLMemory::logMemoryInfo(true) ; +  	//print out recorded call stacks if there are any.  	LLError::LLCallStacks::print(); diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index f94c843ad9..647ace7ee3 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -403,11 +403,9 @@ bool LLAppViewerWin32::initHardwareTest()  	//  	if (FALSE == gSavedSettings.getBOOL("NoHardwareProbe"))  	{ -		BOOL vram_only = !gSavedSettings.getBOOL("ProbeHardwareOnStartup"); -  		// per DEV-11631 - disable hardware probing for everything  		// but vram. -		vram_only = TRUE; +		BOOL vram_only = TRUE;  		LLSplashScreen::update(LLTrans::getString("StartupDetectingHardware")); diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 966f5b941e..40a4d665f8 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -78,6 +78,8 @@ void on_new_single_inventory_upload_complete(  	const LLSD& server_response,  	S32 upload_price)  { +	bool success = false; +  	if ( upload_price > 0 )  	{  		// this upload costed us L$, update our balance @@ -152,6 +154,7 @@ void on_new_single_inventory_upload_complete(  		gInventory.updateItem(item);  		gInventory.notifyObservers(); +		success = true;  		// Show the preview panel for textures and sounds to let  		// user know that the image (or snapshot) arrived intact. @@ -175,6 +178,13 @@ void on_new_single_inventory_upload_complete(  	// remove the "Uploading..." message  	LLUploadDialog::modalUploadFinished();	 + +	// Let the Snapshot floater know we have finished uploading a snapshot to inventory. +	LLFloater* floater_snapshot = LLFloaterReg::findInstance("snapshot"); +	if (asset_type == LLAssetType::AT_TEXTURE && floater_snapshot) +	{ +		floater_snapshot->notify(LLSD().with("set-finished", LLSD().with("ok", success).with("msg", "inventory"))); +	}  }  LLAssetUploadResponder::LLAssetUploadResponder(const LLSD &post_data, diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 6c9058caf1..4f2fd47488 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -599,7 +599,11 @@ void LLFavoritesBarCtrl::handleNewFavoriteDragAndDrop(LLInventoryItem *item, con  	if (tool_dad->getSource() == LLToolDragAndDrop::SOURCE_NOTECARD)  	{  		viewer_item->setType(LLAssetType::AT_LANDMARK); -		copy_inventory_from_notecard(tool_dad->getObjectID(), tool_dad->getSourceID(), viewer_item.get(), gInventoryCallbacks.registerCB(cb)); +		copy_inventory_from_notecard(favorites_id, +									 tool_dad->getObjectID(), +									 tool_dad->getSourceID(), +									 viewer_item.get(), +									 gInventoryCallbacks.registerCB(cb));  	}  	else  	{ @@ -1016,7 +1020,9 @@ void LLFavoritesBarCtrl::addOpenLandmarksMenuItem(LLToggleableMenu* menu)  	LLMenuItemCallGL::Params item_params;  	item_params.name("open_my_landmarks");  	item_params.label(translated ? label_transl: label_untrans); -	item_params.on_click.function(boost::bind(&LLFloaterSidePanelContainer::showPanel, "places", LLSD())); +	LLSD key; +	key["type"] = "open_landmark_tab"; +	item_params.on_click.function(boost::bind(&LLFloaterSidePanelContainer::showPanel, "places", key));  	LLMenuItemCallGL* menu_item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);  	fitLabelWidth(menu_item); @@ -1197,7 +1203,9 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata)  	LLToggleableMenu* menu = (LLToggleableMenu*) mOverflowMenuHandle.get();  	if (mRestoreOverflowMenu && menu && !menu->getVisible())  	{ +		menu->resetScrollPositionOnShow(false);  		showDropDownMenu(); +		menu->resetScrollPositionOnShow(true);  	}  } diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 4746f93009..2bb1075ec4 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -433,7 +433,6 @@ BOOL LLPanelLandGeneral::postBuild()  	mTextDwell = getChild<LLTextBox>("DwellText"); -  	mBtnBuyLand = getChild<LLButton>("Buy Land...");  	mBtnBuyLand->setClickedCallback(onClickBuyLand, (void*)&BUY_PERSONAL_LAND); @@ -696,20 +695,26 @@ void LLPanelLandGeneral::refresh()  		S32 area;  		S32 claim_price;  		S32 rent_price; -		F32 dwell; +		F32 dwell = DWELL_NAN;  		LLViewerParcelMgr::getInstance()->getDisplayInfo(&area,  								 &claim_price,  								 &rent_price,  								 &for_sale,  								 &dwell); -  		// Area  		LLUIString price = getString("area_size_text");  		price.setArg("[AREA]", llformat("%d",area));      		mTextPriceLabel->setText(getString("area_text"));  		mTextPrice->setText(price.getString()); -		mTextDwell->setText(llformat("%.0f", dwell)); +		if (dwell == DWELL_NAN) +		{ +			mTextDwell->setText(LLTrans::getString("LoadingData")); +		} +		else +		{ +			mTextDwell->setText(llformat("%.0f", dwell)); +		}  		if (for_sale)  		{ diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp deleted file mode 100644 index 3bcbb987f7..0000000000 --- a/indra/newview/llfloaterpostcard.cpp +++ /dev/null @@ -1,384 +0,0 @@ -/**  - * @file llfloaterpostcard.cpp - * @brief Postcard send floater, allows setting name, e-mail address, etc. - * - * $LicenseInfo:firstyear=2004&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llfloaterpostcard.h" - -#include "llfontgl.h" -#include "llsys.h" -#include "llgl.h" -#include "v3dmath.h" -#include "lldir.h" - -#include "llagent.h" -#include "llui.h" -#include "lllineeditor.h" -#include "llbutton.h" -#include "lltexteditor.h" -#include "llfloaterreg.h" -#include "llnotificationsutil.h" -#include "llviewercontrol.h" -#include "llviewernetwork.h" -#include "lluictrlfactory.h" -#include "lluploaddialog.h" -#include "llviewerstats.h" -#include "llviewerwindow.h" -#include "llstatusbar.h" -#include "llviewerregion.h" -#include "lleconomy.h" -#include "message.h" - -#include "llimagejpeg.h" -#include "llimagej2c.h" -#include "llvfile.h" -#include "llvfs.h" -#include "llviewertexture.h" -#include "llassetuploadresponders.h" -#include "llagentui.h" - -#include <boost/regex.hpp>  //boost.regex lib - -///---------------------------------------------------------------------------- -/// Local function declarations, constants, enums, and typedefs -///---------------------------------------------------------------------------- - -///---------------------------------------------------------------------------- -/// Class LLFloaterPostcard -///---------------------------------------------------------------------------- - -LLFloaterPostcard::LLFloaterPostcard(const LLSD& key) -:	LLFloater(key), -	mJPEGImage(NULL), -	mViewerImage(NULL), -	mHasFirstMsgFocus(false) -{ -} - -// Destroys the object -LLFloaterPostcard::~LLFloaterPostcard() -{ -	mJPEGImage = NULL; // deletes image -} - -BOOL LLFloaterPostcard::postBuild() -{ -	// pick up the user's up-to-date email address -	gAgent.sendAgentUserInfoRequest(); - -	childSetAction("cancel_btn", onClickCancel, this); -	childSetAction("send_btn", onClickSend, this); - -	getChildView("from_form")->setEnabled(FALSE); - -	std::string name_string; -	LLAgentUI::buildFullname(name_string); -	getChild<LLUICtrl>("name_form")->setValue(LLSD(name_string)); - -	// For the first time a user focusess to .the msg box, all text will be selected. -	getChild<LLUICtrl>("msg_form")->setFocusChangedCallback(boost::bind(onMsgFormFocusRecieved, _1, this)); -	 -	getChild<LLUICtrl>("to_form")->setFocus(TRUE); - -    return TRUE; -} - -// static -LLFloaterPostcard* LLFloaterPostcard::showFromSnapshot(LLImageJPEG *jpeg, LLViewerTexture *img, const LLVector2 &image_scale, const LLVector3d& pos_taken_global) -{ -	// Take the images from the caller -	// It's now our job to clean them up -	LLFloaterPostcard* instance = LLFloaterReg::showTypedInstance<LLFloaterPostcard>("postcard", LLSD(img->getID())); - -	if (instance) // may be 0 if we're in mouselook mode -	{ -		instance->mJPEGImage = jpeg; -		instance->mViewerImage = img; -		instance->mImageScale = image_scale; -		instance->mPosTakenGlobal = pos_taken_global; -	} -	 -	return instance; -} - -void LLFloaterPostcard::draw() -{ -	LLGLSUIDefault gls_ui; -	LLFloater::draw(); - -	if(!isMinimized() && mViewerImage.notNull() && mJPEGImage.notNull())  -	{ -		// Force the texture to be 100% opaque when the floater is focused. -		F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); -		LLRect rect(getRect()); - -		// first set the max extents of our preview -		rect.translate(-rect.mLeft, -rect.mBottom); -		rect.mLeft += 320; -		rect.mRight -= 10; -		rect.mTop -= 27; -		rect.mBottom = rect.mTop - 130; - -		// then fix the aspect ratio -		F32 ratio = (F32)mJPEGImage->getWidth() / (F32)mJPEGImage->getHeight(); -		if ((F32)rect.getWidth() / (F32)rect.getHeight() >= ratio) -		{ -			rect.mRight = LLRect::tCoordType((F32)rect.mLeft + ((F32)rect.getHeight() * ratio)); -		} -		else -		{ -			rect.mBottom = LLRect::tCoordType((F32)rect.mTop - ((F32)rect.getWidth() / ratio)); -		} -		{ -			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -			gl_rect_2d(rect, LLColor4(0.f, 0.f, 0.f, 1.f) % alpha); -			rect.stretch(-1); -		} -		{ - -		glMatrixMode(GL_TEXTURE); -		glPushMatrix(); -		{ -			glScalef(mImageScale.mV[VX], mImageScale.mV[VY], 1.f); -			glMatrixMode(GL_MODELVIEW); -			gl_draw_scaled_image(rect.mLeft, -								 rect.mBottom, -								 rect.getWidth(), -								 rect.getHeight(), -								 mViewerImage.get(),  -								 LLColor4::white % alpha); -		} -		glMatrixMode(GL_TEXTURE); -		glPopMatrix(); -		glMatrixMode(GL_MODELVIEW); -		} -	} -} - -// static -void LLFloaterPostcard::onClickCancel(void* data) -{ -	if (data) -	{ -		LLFloaterPostcard *self = (LLFloaterPostcard *)data; - -		self->closeFloater(false); -	} -} - -class LLSendPostcardResponder : public LLAssetUploadResponder -{ -public: -	LLSendPostcardResponder(const LLSD &post_data, -							const LLUUID& vfile_id, -							LLAssetType::EType asset_type): -	    LLAssetUploadResponder(post_data, vfile_id, asset_type) -	{	 -	} -	// *TODO define custom uploadFailed here so it's not such a generic message -	void uploadComplete(const LLSD& content) -	{ -		// we don't care about what the server returns from this post, just clean up the UI -		LLUploadDialog::modalUploadFinished(); -	} -}; - -// static -void LLFloaterPostcard::onClickSend(void* data) -{ -	if (data) -	{ -		LLFloaterPostcard *self = (LLFloaterPostcard *)data; - -		std::string from(self->getChild<LLUICtrl>("from_form")->getValue().asString()); -		std::string to(self->getChild<LLUICtrl>("to_form")->getValue().asString()); -		 -		boost::regex emailFormat("[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}(,[ \t]*[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,})*"); -		 -		if (to.empty() || !boost::regex_match(to, emailFormat)) -		{ -			LLNotificationsUtil::add("PromptRecipientEmail"); -			return; -		} - -		if (from.empty() || !boost::regex_match(from, emailFormat)) -		{ -			LLNotificationsUtil::add("PromptSelfEmail"); -			return; -		} - -		std::string subject(self->getChild<LLUICtrl>("subject_form")->getValue().asString()); -		if(subject.empty() || !self->mHasFirstMsgFocus) -		{ -			LLNotificationsUtil::add("PromptMissingSubjMsg", LLSD(), LLSD(), boost::bind(&LLFloaterPostcard::missingSubjMsgAlertCallback, self, _1, _2)); -			return; -		} - -		if (self->mJPEGImage.notNull()) -		{ -			self->sendPostcard(); -		} -		else -		{ -			LLNotificationsUtil::add("ErrorProcessingSnapshot"); -		} -	} -} - -// static -void LLFloaterPostcard::uploadCallback(const LLUUID& asset_id, void *user_data, S32 result, LLExtStat ext_status) // StoreAssetData callback (fixed) -{ -	LLFloaterPostcard *self = (LLFloaterPostcard *)user_data; -	 -	LLUploadDialog::modalUploadFinished(); -	 -	if (result) -	{ -		LLSD args; -		args["REASON"] = std::string(LLAssetStorage::getErrorString(result)); -		LLNotificationsUtil::add("ErrorUploadingPostcard", args); -	} -	else -	{ -		// only create the postcard once the upload succeeds - -		// request the postcard -		LLMessageSystem* msg = gMessageSystem; -		msg->newMessage("SendPostcard"); -		msg->nextBlock("AgentData"); -		msg->addUUID("AgentID", gAgent.getID()); -		msg->addUUID("SessionID", gAgent.getSessionID()); -		msg->addUUID("AssetID", self->mAssetID); -		msg->addVector3d("PosGlobal", self->mPosTakenGlobal); -		msg->addString("To", self->getChild<LLUICtrl>("to_form")->getValue().asString()); -		msg->addString("From", self->getChild<LLUICtrl>("from_form")->getValue().asString()); -		msg->addString("Name", self->getChild<LLUICtrl>("name_form")->getValue().asString()); -		msg->addString("Subject", self->getChild<LLUICtrl>("subject_form")->getValue().asString()); -		msg->addString("Msg", self->getChild<LLUICtrl>("msg_form")->getValue().asString()); -		msg->addBOOL("AllowPublish", FALSE); -		msg->addBOOL("MaturePublish", FALSE); -		gAgent.sendReliableMessage(); -	} - -	self->closeFloater(); -} - -// static -void LLFloaterPostcard::updateUserInfo(const std::string& email) -{ -	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("postcard"); -	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); -		 iter != inst_list.end(); ++iter) -	{ -		LLFloater* instance = *iter; -		const std::string& text = instance->getChild<LLUICtrl>("from_form")->getValue().asString(); -		if (text.empty()) -		{ -			// there's no text in this field yet, pre-populate -			instance->getChild<LLUICtrl>("from_form")->setValue(LLSD(email)); -		} -	} -} - -void LLFloaterPostcard::onMsgFormFocusRecieved(LLFocusableElement* receiver, void* data) -{ -	LLFloaterPostcard* self = (LLFloaterPostcard *)data; -	if(self)  -	{ -		LLTextEditor* msgForm = self->getChild<LLTextEditor>("msg_form"); -		if(msgForm && msgForm == receiver && msgForm->hasFocus() && !(self->mHasFirstMsgFocus)) -		{ -			self->mHasFirstMsgFocus = true; -			msgForm->setText(LLStringUtil::null); -		} -	} -} - -bool LLFloaterPostcard::missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response) -{ -	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); -	if(0 == option) -	{ -		// User clicked OK -		if((getChild<LLUICtrl>("subject_form")->getValue().asString()).empty()) -		{ -			// Stuff the subject back into the form. -			getChild<LLUICtrl>("subject_form")->setValue(getString("default_subject")); -		} - -		if(!mHasFirstMsgFocus) -		{ -			// The user never switched focus to the messagee window.  -			// Using the default string. -			getChild<LLUICtrl>("msg_form")->setValue(getString("default_message")); -		} - -		sendPostcard(); -	} -	return false; -} - -void LLFloaterPostcard::sendPostcard() -{ -	mTransactionID.generate(); -	mAssetID = mTransactionID.makeAssetID(gAgent.getSecureSessionID()); -	LLVFile::writeFile(mJPEGImage->getData(), mJPEGImage->getDataSize(), gVFS, mAssetID, LLAssetType::AT_IMAGE_JPEG); - -	// upload the image -	std::string url = gAgent.getRegion()->getCapability("SendPostcard"); -	if(!url.empty()) -	{ -		llinfos << "Send Postcard via capability" << llendl; -		LLSD body = LLSD::emptyMap(); -		// the capability already encodes: agent ID, region ID -		body["pos-global"] = mPosTakenGlobal.getValue(); -		body["to"] = getChild<LLUICtrl>("to_form")->getValue().asString(); -		body["from"] = getChild<LLUICtrl>("from_form")->getValue().asString(); -		body["name"] = getChild<LLUICtrl>("name_form")->getValue().asString(); -		body["subject"] = getChild<LLUICtrl>("subject_form")->getValue().asString(); -		body["msg"] = getChild<LLUICtrl>("msg_form")->getValue().asString(); -		LLHTTPClient::post(url, body, new LLSendPostcardResponder(body, mAssetID, LLAssetType::AT_IMAGE_JPEG)); -	}  -	else -	{ -		gAssetStorage->storeAssetData(mTransactionID, LLAssetType::AT_IMAGE_JPEG, &uploadCallback, (void *)this, FALSE); -	} -	 -	// give user feedback of the event -	gViewerWindow->playSnapshotAnimAndSound(); -	LLUploadDialog::modalUploadDialog(getString("upload_message")); - -	// don't destroy the window until the upload is done -	// this way we keep the information in the form -	setVisible(FALSE); - -	// also remove any dependency on another floater -	// so that we can be sure to outlive it while we -	// need to. -	LLFloater* dependee = getDependee(); -	if (dependee) -		dependee->removeDependentFloater(this); -} diff --git a/indra/newview/llfloaterpostcard.h b/indra/newview/llfloaterpostcard.h deleted file mode 100644 index 472592154f..0000000000 --- a/indra/newview/llfloaterpostcard.h +++ /dev/null @@ -1,79 +0,0 @@ -/**  - * @file llfloaterpostcard.h - * @brief Postcard send floater, allows setting name, e-mail address, etc. - * - * $LicenseInfo:firstyear=2004&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#ifndef LL_LLFLOATERPOSTCARD_H -#define LL_LLFLOATERPOSTCARD_H - -#include "llfloater.h" -#include "llcheckboxctrl.h" - -#include "llpointer.h" - -class LLTextEditor; -class LLLineEditor; -class LLButton; -class LLViewerTexture; -class LLImageJPEG; - -class LLFloaterPostcard  -: public LLFloater -{ -public: -	LLFloaterPostcard(const LLSD& key); -	virtual ~LLFloaterPostcard(); - -	virtual BOOL postBuild(); -	virtual void draw(); - -	static LLFloaterPostcard* showFromSnapshot(LLImageJPEG *jpeg, LLViewerTexture *img, const LLVector2& img_scale, const LLVector3d& pos_taken_global); - -	static void onClickCancel(void* data); -	static void onClickSend(void* data); - -	static void uploadCallback(const LLUUID& asset_id, -							   void *user_data, -							   S32 result, LLExtStat ext_status); - -	static void updateUserInfo(const std::string& email); - -	static void onMsgFormFocusRecieved(LLFocusableElement* receiver, void* data); -	bool missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response); - -	void sendPostcard(); - -private: -	 -	LLPointer<LLImageJPEG> mJPEGImage; -	LLPointer<LLViewerTexture> mViewerImage; -	LLTransactionID mTransactionID; -	LLAssetID mAssetID; -	LLVector2 mImageScale; -	LLVector3d mPosTakenGlobal; -	bool mHasFirstMsgFocus; -}; - - -#endif // LL_LLFLOATERPOSTCARD_H diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 8105844b0d..48e6cca623 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -42,6 +42,8 @@  #include "llcombobox.h"  #include "lleconomy.h"  #include "lllandmarkactions.h" +#include "llpanelsnapshot.h" +#include "llsidetraypanelcontainer.h"  #include "llsliderctrl.h"  #include "llspinctrl.h"  #include "llviewercontrol.h" @@ -50,9 +52,7 @@  #include "llviewercamera.h"  #include "llviewerwindow.h"  #include "llviewermenufile.h"	// upload_new_resource() -#include "llfloaterpostcard.h"  #include "llcheckboxctrl.h" -#include "llradiogroup.h"  #include "llslurl.h"  #include "lltoolfocus.h"  #include "lltoolmgr.h" @@ -76,18 +76,17 @@  #include "llimagej2c.h"  #include "lllocalcliprect.h"  #include "llnotificationsutil.h" +#include "llpostcard.h"  #include "llresmgr.h"		// LLLocale  #include "llvfile.h"  #include "llvfs.h" +#include "llwebprofile.h"  #include "llwindow.h"  ///----------------------------------------------------------------------------  /// Local function declarations, constants, enums, and typedefs  ///---------------------------------------------------------------------------- -S32 LLFloaterSnapshot::sUIWinHeightLong = 530 ; -S32 LLFloaterSnapshot::sUIWinHeightShort = LLFloaterSnapshot::sUIWinHeightLong - 240 ; -S32 LLFloaterSnapshot::sUIWinWidth = 215 ; - +LLUICtrl* LLFloaterSnapshot::sThumbnailPlaceholder = NULL;  LLSnapshotFloaterView* gSnapshotFloaterView = NULL;  const F32 AUTO_SNAPSHOT_TIME_DELAY = 1.f; @@ -101,6 +100,9 @@ S32 BORDER_WIDTH = 6;  const S32 MAX_POSTCARD_DATASIZE = 1024 * 1024; // one megabyte  const S32 MAX_TEXTURE_SIZE = 512 ; //max upload texture size 512 * 512 +static std::string lastSnapshotWidthName(S32 shot_type); +static std::string lastSnapshotHeightName(S32 shot_type); +  static LLDefaultChildRegistry::Register<LLSnapshotFloaterView> r("snapshot_floater_view");  ///---------------------------------------------------------------------------- @@ -108,6 +110,7 @@ static LLDefaultChildRegistry::Register<LLSnapshotFloaterView> r("snapshot_float  ///----------------------------------------------------------------------------  class LLSnapshotLivePreview : public LLView  { +	LOG_CLASS(LLSnapshotLivePreview);  public:  	enum ESnapshotType  	{ @@ -154,6 +157,7 @@ public:  	F32 getAspect() ;  	LLRect getImageRect();  	BOOL isImageScaled(); +	const LLVector3d& getPosTakenGlobal() const { return mPosTakenGlobal; }  	void setSnapshotType(ESnapshotType type) { mSnapshotType = type; }  	void setSnapshotFormat(LLFloaterSnapshot::ESnapshotFormat type) { mSnapshotFormat = type; } @@ -161,10 +165,12 @@ public:  	void setSnapshotBufferType(LLViewerWindow::ESnapshotType type) { mSnapshotBufferType = type; }  	void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f);  	void saveWeb(); -	LLFloaterPostcard* savePostcard();  	void saveTexture();  	BOOL saveLocal(); +	LLPointer<LLImageFormatted>	getFormattedImage() const { return mFormattedImage; } +	LLPointer<LLImageRaw>		getEncodedImage() const { return mPreviewImageEncoded; } +  	BOOL setThumbnailImageSize() ;  	void generateThumbnailImage(BOOL force_update = FALSE) ;  	void resetThumbnailImage() { mThumbnailImage = NULL ; } @@ -327,7 +333,8 @@ BOOL LLSnapshotLivePreview::isImageScaled()  }  void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail, F32 delay)  -{  +{ +	lldebugs << "updateSnapshot: mSnapshotUpToDate = " << mSnapshotUpToDate << llendl;  	if (mSnapshotUpToDate)  	{  		S32 old_image_index = mCurImageIndex; @@ -367,6 +374,7 @@ void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail  	{  		mSnapshotDelayTimer.start();  		mSnapshotDelayTimer.setTimerExpirySec(delay); +		LLFloaterSnapshot::preUpdate();  	}  	if(new_thumbnail)  	{ @@ -629,8 +637,10 @@ BOOL LLSnapshotLivePreview::setThumbnailImageSize()  	F32 window_aspect_ratio = ((F32)window_width) / ((F32)window_height);  	// UI size for thumbnail -	S32 max_width = LLFloaterSnapshot::getUIWinWidth() - 20; -	S32 max_height = 90; +	// *FIXME: the rect does not change, so maybe there's no need to recalculate max w/h. +	const LLRect& thumbnail_rect = LLFloaterSnapshot::getThumbnailPlaceholderRect(); +	S32 max_width = thumbnail_rect.getWidth(); +	S32 max_height = thumbnail_rect.getHeight();  	if (window_aspect_ratio > (F32)max_width / max_height)  	{ @@ -746,7 +756,15 @@ void LLSnapshotLivePreview::generateThumbnailImage(BOOL force_update)  //static   BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )  { -	LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)snapshot_preview;	 +	LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)snapshot_preview; + +#if 1 // XXX tmp +	if (previewp->mWidth[previewp->mCurImageIndex] == 0 || previewp->mHeight[previewp->mCurImageIndex] == 0) +	{ +		llwarns << "Incorrect dimensions: " << previewp->mWidth[previewp->mCurImageIndex] << "x" << previewp->mHeight[previewp->mCurImageIndex] << llendl; +		return FALSE; +	} +#endif  	LLVector3 new_camera_pos = LLViewerCamera::getInstance()->getOrigin();  	LLQuaternion new_camera_rot = LLViewerCamera::getInstance()->getQuaternion(); @@ -774,6 +792,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )  	// time to produce a snapshot +	lldebugs << "producing snapshot" << llendl;  	if (!previewp->mPreviewImage)  	{  		previewp->mPreviewImage = new LLImageRaw; @@ -809,6 +828,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )  		if(previewp->getSnapshotType() == SNAPSHOT_TEXTURE)  		{ +			lldebugs << "Encoding new image of format J2C" << llendl;  			LLPointer<LLImageJ2C> formatted = new LLImageJ2C;  			LLPointer<LLImageRaw> scaled = new LLImageRaw(  				previewp->mPreviewImage->getData(), @@ -829,18 +849,8 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )  			// delete any existing image  			previewp->mFormattedImage = NULL;  			// now create the new one of the appropriate format. -			// note: postcards and web hardcoded to use jpeg always. -			LLFloaterSnapshot::ESnapshotFormat format; - -			if (previewp->getSnapshotType() == SNAPSHOT_POSTCARD || -				previewp->getSnapshotType() == SNAPSHOT_WEB) -			{ -				format = LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG; -			} -			else -			{ -				format = previewp->getSnapshotFormat(); -			} +			LLFloaterSnapshot::ESnapshotFormat format = previewp->getSnapshotFormat(); +			lldebugs << "Encoding new image of format " << format << llendl;  			switch(format)  			{ @@ -920,12 +930,15 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )  	{  		previewp->generateThumbnailImage() ;  	} +	lldebugs << "done creating snapshot" << llendl; +	LLFloaterSnapshot::postUpdate();  	return TRUE;  }  void LLSnapshotLivePreview::setSize(S32 w, S32 h)  { +	lldebugs << "setSize(" << w << ", " << h << ")" << llendl;  	mWidth[mCurImageIndex] = w;  	mHeight[mCurImageIndex] = h;  } @@ -936,40 +949,9 @@ void LLSnapshotLivePreview::getSize(S32& w, S32& h) const  	h = mHeight[mCurImageIndex];  } -LLFloaterPostcard* LLSnapshotLivePreview::savePostcard() -{ -	if(mViewerImage[mCurImageIndex].isNull()) -	{ -		//this should never happen!! -		llwarns << "The snapshot image has not been generated!" << llendl ; -		return NULL ; -	} - -	// calculate and pass in image scale in case image data only use portion -	// of viewerimage buffer -	LLVector2 image_scale(1.f, 1.f); -	if (!isImageScaled()) -	{ -		image_scale.setVec(llmin(1.f, (F32)mWidth[mCurImageIndex] / (F32)getCurrentImage()->getWidth()), llmin(1.f, (F32)mHeight[mCurImageIndex] / (F32)getCurrentImage()->getHeight())); -	} - -	LLImageJPEG* jpg = dynamic_cast<LLImageJPEG*>(mFormattedImage.get()); -	if(!jpg) -	{ -		llwarns << "Formatted image not a JPEG" << llendl; -		return NULL; -	} -	LLFloaterPostcard* floater = LLFloaterPostcard::showFromSnapshot(jpg, mViewerImage[mCurImageIndex], image_scale, mPosTakenGlobal); -	// relinquish lifetime of jpeg image to postcard floater -	mFormattedImage = NULL; -	mDataSize = 0; -	updateSnapshot(FALSE, FALSE); - -	return floater; -} -  void LLSnapshotLivePreview::saveTexture()  { +	lldebugs << "saving texture: " << mPreviewImage->getWidth() << "x" << mPreviewImage->getHeight() << llendl;  	// gen a new uuid for this asset  	LLTransactionID tid;  	tid.generate(); @@ -982,6 +964,7 @@ void LLSnapshotLivePreview::saveTexture()  												  mPreviewImage->getComponents());  	scaled->biasedScaleToPowerOfTwo(512); +	lldebugs << "scaled texture to " << scaled->getWidth() << "x" << scaled->getHeight() << llendl;  	if (formatted->encode(scaled, 0.0f))  	{ @@ -1020,9 +1003,10 @@ void LLSnapshotLivePreview::saveTexture()  BOOL LLSnapshotLivePreview::saveLocal()  { -	BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage); +	BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage, true);  	// Relinquish image memory. Save button will be disabled as a side-effect. +	lldebugs << "resetting formatted image after saving to disk" << llendl;  	mFormattedImage = NULL;  	mDataSize = 0;  	updateSnapshot(FALSE, FALSE); @@ -1067,11 +1051,20 @@ void LLSnapshotLivePreview::regionNameCallback(LLImageJPEG* snapshot, LLSD& meta  class LLFloaterSnapshot::Impl  { +	LOG_CLASS(LLFloaterSnapshot::Impl);  public: +	typedef enum e_status +	{ +		STATUS_READY, +		STATUS_WORKING, +		STATUS_FINISHED +	} EStatus; +  	Impl()  	:	mAvatarPauseHandles(),  		mLastToolset(NULL), -		mAspectRatioCheckOff(false) +		mAspectRatioCheckOff(false), +		mStatus(STATUS_READY)  	{  	}  	~Impl() @@ -1080,43 +1073,55 @@ public:  		mAvatarPauseHandles.clear();  	} -	static void onClickDiscard(void* data); -	static void onClickKeep(void* data); -	static void onCommitSave(LLUICtrl* ctrl, void* data);  	static void onClickNewSnapshot(void* data);  	static void onClickAutoSnap(LLUICtrl *ctrl, void* data);  	//static void onClickAdvanceSnap(LLUICtrl *ctrl, void* data); -	static void onClickLess(void* data) ;  	static void onClickMore(void* data) ;  	static void onClickUICheck(LLUICtrl *ctrl, void* data);  	static void onClickHUDCheck(LLUICtrl *ctrl, void* data); -	static void onClickKeepOpenCheck(LLUICtrl *ctrl, void* data); +#if 0  	static void onClickKeepAspectCheck(LLUICtrl *ctrl, void* data); -	static void onCommitQuality(LLUICtrl* ctrl, void* data); +#endif +	static void applyKeepAspectCheck(LLFloaterSnapshot* view, BOOL checked);  	static void onCommitResolution(LLUICtrl* ctrl, void* data) { updateResolution(ctrl, data); }  	static void updateResolution(LLUICtrl* ctrl, void* data, BOOL do_update = TRUE);  	static void onCommitFreezeFrame(LLUICtrl* ctrl, void* data);  	static void onCommitLayerTypes(LLUICtrl* ctrl, void*data); +	static void onImageQualityChange(LLFloaterSnapshot* view, S32 quality_val); +	static void onImageFormatChange(LLFloaterSnapshot* view); +#if 0  	static void onCommitSnapshotType(LLUICtrl* ctrl, void* data); -	static void onCommitSnapshotFormat(LLUICtrl* ctrl, void* data);  	static void onCommitCustomResolution(LLUICtrl *ctrl, void* data); +#endif +	static void applyCustomResolution(LLFloaterSnapshot* view, S32 w, S32 h); +	static void onSnapshotUploadFinished(bool status); +	static void onSendingPostcardFinished(bool status);  	static void resetSnapshotSizeOnUI(LLFloaterSnapshot *view, S32 width, S32 height) ;  	static BOOL checkImageSize(LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL isWidthChanged, S32 max_value); +	static LLPanelSnapshot* getActivePanel(LLFloaterSnapshot* floater, bool ok_if_not_found = true); +	static LLSnapshotLivePreview::ESnapshotType getActiveSnapshotType(LLFloaterSnapshot* floater); +	static LLFloaterSnapshot::ESnapshotFormat getImageFormat(LLFloaterSnapshot* floater); +	static LLSpinCtrl* getWidthSpinner(LLFloaterSnapshot* floater); +	static LLSpinCtrl* getHeightSpinner(LLFloaterSnapshot* floater); +	static void enableAspectRatioCheckbox(LLFloaterSnapshot* floater, BOOL enable); +	static void setAspectRatioCheckboxValue(LLFloaterSnapshot* floater, BOOL checked); +  	static LLSnapshotLivePreview* getPreviewView(LLFloaterSnapshot *floater);  	static void setResolution(LLFloaterSnapshot* floater, const std::string& comboname);  	static void updateControls(LLFloaterSnapshot* floater);  	static void updateLayout(LLFloaterSnapshot* floater); -	static void updateResolutionTextEntry(LLFloaterSnapshot* floater); +	static void setStatus(EStatus status, bool ok = true, const std::string& msg = LLStringUtil::null); +	EStatus getStatus() const { return mStatus; }  private: -	static LLSnapshotLivePreview::ESnapshotType getTypeIndex(LLFloaterSnapshot* floater); -	static LLSD getTypeName(LLSnapshotLivePreview::ESnapshotType index); -	static ESnapshotFormat getFormatIndex(LLFloaterSnapshot* floater);  	static LLViewerWindow::ESnapshotType getLayerType(LLFloaterSnapshot* floater);  	static void comboSetCustom(LLFloaterSnapshot *floater, const std::string& comboname);  	static void checkAutoSnapshot(LLSnapshotLivePreview* floater, BOOL update_thumbnail = FALSE);  	static void checkAspectRatio(LLFloaterSnapshot *view, S32 index) ; +	static void setWorking(LLFloaterSnapshot* floater, bool working); +	static void setFinished(LLFloaterSnapshot* floater, bool finished, bool ok = true, const std::string& msg = LLStringUtil::null); +  public:  	std::vector<LLAnimPauseRequest> mAvatarPauseHandles; @@ -1124,84 +1129,97 @@ public:  	LLToolset*	mLastToolset;  	LLHandle<LLView> mPreviewHandle;  	bool mAspectRatioCheckOff ; +	EStatus mStatus;  };  // static -LLSnapshotLivePreview* LLFloaterSnapshot::Impl::getPreviewView(LLFloaterSnapshot *floater) +LLPanelSnapshot* LLFloaterSnapshot::Impl::getActivePanel(LLFloaterSnapshot* floater, bool ok_if_not_found)  { -	LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)floater->impl.mPreviewHandle.get(); -	return previewp; +	LLSideTrayPanelContainer* panel_container = floater->getChild<LLSideTrayPanelContainer>("panel_container"); +	LLPanelSnapshot* active_panel = dynamic_cast<LLPanelSnapshot*>(panel_container->getCurrentPanel()); +	if (!ok_if_not_found) +	{ +		llassert_always(active_panel != NULL); +	} +	return active_panel;  }  // static -LLSnapshotLivePreview::ESnapshotType LLFloaterSnapshot::Impl::getTypeIndex(LLFloaterSnapshot* floater) +LLSnapshotLivePreview::ESnapshotType LLFloaterSnapshot::Impl::getActiveSnapshotType(LLFloaterSnapshot* floater)  { -	LLSnapshotLivePreview::ESnapshotType index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD; -	LLSD value = floater->getChild<LLUICtrl>("snapshot_type_radio")->getValue(); +	LLSnapshotLivePreview::ESnapshotType type = LLSnapshotLivePreview::SNAPSHOT_WEB; +	std::string name; +	LLPanelSnapshot* spanel = getActivePanel(floater); -	const std::string id = value.asString(); -	if (id == "postcard") +	if (spanel)  	{ -		index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD; +		name = spanel->getName();  	} -	else if (id == "texture") + +	if (name == "panel_snapshot_postcard")  	{ -		index = LLSnapshotLivePreview::SNAPSHOT_TEXTURE; +		type = LLSnapshotLivePreview::SNAPSHOT_POSTCARD;  	} -	else if (id == "local") +	else if (name == "panel_snapshot_inventory")  	{ -		index = LLSnapshotLivePreview::SNAPSHOT_LOCAL; +		type = LLSnapshotLivePreview::SNAPSHOT_TEXTURE;  	} -	else if (id == "share_to_web") +	else if (name == "panel_snapshot_local")  	{ -		index = LLSnapshotLivePreview::SNAPSHOT_WEB; +		type = LLSnapshotLivePreview::SNAPSHOT_LOCAL;  	} -	return index; +	return type;  }  // static -LLSD LLFloaterSnapshot::Impl::getTypeName(LLSnapshotLivePreview::ESnapshotType index) +LLFloaterSnapshot::ESnapshotFormat LLFloaterSnapshot::Impl::getImageFormat(LLFloaterSnapshot* floater)  { -	std::string id; -	switch (index) +	LLPanelSnapshot* active_panel = getActivePanel(floater); +	// FIXME: if the default is not PNG, profile uploads may fail. +	return active_panel ? active_panel->getImageFormat() : LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG; +} + +// static +LLSpinCtrl* LLFloaterSnapshot::Impl::getWidthSpinner(LLFloaterSnapshot* floater) +{ +	LLPanelSnapshot* active_panel = getActivePanel(floater); +	return active_panel ? active_panel->getWidthSpinner() : floater->getChild<LLSpinCtrl>("snapshot_width"); +} + +// static +LLSpinCtrl* LLFloaterSnapshot::Impl::getHeightSpinner(LLFloaterSnapshot* floater) +{ +	LLPanelSnapshot* active_panel = getActivePanel(floater); +	return active_panel ? active_panel->getHeightSpinner() : floater->getChild<LLSpinCtrl>("snapshot_height"); +} + +// static +void LLFloaterSnapshot::Impl::enableAspectRatioCheckbox(LLFloaterSnapshot* floater, BOOL enable) +{ +	LLPanelSnapshot* active_panel = getActivePanel(floater); +	if (active_panel)  	{ -		case LLSnapshotLivePreview::SNAPSHOT_WEB: -			id = "share_to_web"; -			break; -		case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: -			id = "postcard"; -			break; -		case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: -			id = "texture"; -			break; -		case LLSnapshotLivePreview::SNAPSHOT_LOCAL: -		default: -			id = "local"; -			break; +		active_panel->enableAspectRatioCheckbox(enable);  	} -	return LLSD(id);  }  // static -LLFloaterSnapshot::ESnapshotFormat LLFloaterSnapshot::Impl::getFormatIndex(LLFloaterSnapshot* floater) +void LLFloaterSnapshot::Impl::setAspectRatioCheckboxValue(LLFloaterSnapshot* floater, BOOL checked)  { -	ESnapshotFormat index = SNAPSHOT_FORMAT_PNG; -	if(floater->hasChild("local_format_combo")) +	LLPanelSnapshot* active_panel = getActivePanel(floater); +	if (active_panel)  	{ -		LLComboBox* local_format_combo = floater->findChild<LLComboBox>("local_format_combo"); -		const std::string id  = local_format_combo->getSelectedItemLabel(); -		if (id == "PNG") -			index = SNAPSHOT_FORMAT_PNG; -		else if (id == "JPEG") -			index = SNAPSHOT_FORMAT_JPEG; -		else if (id == "BMP") -			index = SNAPSHOT_FORMAT_BMP; +		active_panel->getChild<LLUICtrl>(active_panel->getAspectRatioCBName())->setValue(checked);  	} -		return index;  } - +// static +LLSnapshotLivePreview* LLFloaterSnapshot::Impl::getPreviewView(LLFloaterSnapshot *floater) +{ +	LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)floater->impl.mPreviewHandle.get(); +	return previewp; +}  // static  LLViewerWindow::ESnapshotType LLFloaterSnapshot::Impl::getLayerType(LLFloaterSnapshot* floater) @@ -1229,12 +1247,27 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)  {  	LLSnapshotLivePreview* previewp = getPreviewView(floaterp); -	S32 delta_height = gSavedSettings.getBOOL("AdvanceSnapshot") ? 0 : floaterp->getUIWinHeightShort() - floaterp->getUIWinHeightLong() ; +	BOOL advanced = gSavedSettings.getBOOL("AdvanceSnapshot"); + +	// Show/hide advanced options. +	LLPanel* advanced_options_panel = floaterp->getChild<LLPanel>("advanced_options_panel"); +	floaterp->getChild<LLButton>("advanced_options_btn")->setToggleState(advanced); +	if (advanced != advanced_options_panel->getVisible()) +	{ +		S32 panel_width = advanced_options_panel->getRect().getWidth(); +		floaterp->getChild<LLPanel>("advanced_options_panel")->setVisible(advanced); +		S32 floater_width = floaterp->getRect().getWidth(); +		floater_width += (advanced ? panel_width : -panel_width); +		floaterp->reshape(floater_width, floaterp->getRect().getHeight()); +	} -	if(!gSavedSettings.getBOOL("AdvanceSnapshot")) //set to original window resolution +	if(!advanced) //set to original window resolution  	{  		previewp->mKeepAspectRatio = TRUE; +		floaterp->getChild<LLComboBox>("profile_size_combo")->setCurrentByIndex(0); +		gSavedSettings.setS32("SnapshotProfileLastResolution", 0); +  		floaterp->getChild<LLComboBox>("postcard_size_combo")->setCurrentByIndex(0);  		gSavedSettings.setS32("SnapshotPostcardLastResolution", 0); @@ -1256,7 +1289,8 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)  		floaterp->getParent()->setMouseOpaque(TRUE);  		// shrink to smaller layout -		floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getUIWinHeightLong() + delta_height); +		// *TODO: unneeded? +		floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getRect().getHeight());  		// can see and interact with fullscreen preview now  		if (previewp) @@ -1286,7 +1320,8 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)  	else // turning off freeze frame mode  	{  		floaterp->getParent()->setMouseOpaque(FALSE); -		floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getUIWinHeightLong() + delta_height); +		// *TODO: unneeded? +		floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getRect().getHeight());  		if (previewp)  		{  			previewp->setVisible(FALSE); @@ -1315,83 +1350,74 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)  // static  void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)  { -	LLRadioGroup* snapshot_type_radio = floater->getChild<LLRadioGroup>("snapshot_type_radio"); -	LLSnapshotLivePreview::ESnapshotType shot_type = (LLSnapshotLivePreview::ESnapshotType)gSavedSettings.getS32("LastSnapshotType"); -	snapshot_type_radio->setSelectedByValue(getTypeName(shot_type), true); - +	LLSnapshotLivePreview::ESnapshotType shot_type = getActiveSnapshotType(floater);  	ESnapshotFormat shot_format = (ESnapshotFormat)gSavedSettings.getS32("SnapshotFormat");  	LLViewerWindow::ESnapshotType layer_type = getLayerType(floater); +#if 0  	floater->getChildView("share_to_web")->setVisible( gSavedSettings.getBOOL("SnapshotSharingEnabled")); +#endif +#if 0  	floater->getChildView("postcard_size_combo")->setVisible( FALSE);  	floater->getChildView("texture_size_combo")->setVisible( FALSE);  	floater->getChildView("local_size_combo")->setVisible( FALSE); +#endif +	floater->getChild<LLComboBox>("profile_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotProfileLastResolution"));  	floater->getChild<LLComboBox>("postcard_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotPostcardLastResolution"));  	floater->getChild<LLComboBox>("texture_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotTextureLastResolution"));  	floater->getChild<LLComboBox>("local_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotLocalLastResolution"));  	floater->getChild<LLComboBox>("local_format_combo")->selectNthItem(gSavedSettings.getS32("SnapshotFormat"));  	// *TODO: Separate settings for Web images from postcards -	floater->getChildView("send_btn")->setVisible(	shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD || -													shot_type == LLSnapshotLivePreview::SNAPSHOT_WEB); -	floater->getChildView("upload_btn")->setVisible(shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE); -	floater->getChildView("save_btn")->setVisible(	shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL); -	floater->getChildView("keep_aspect_check")->setEnabled(shot_type != LLSnapshotLivePreview::SNAPSHOT_TEXTURE && !floater->impl.mAspectRatioCheckOff); +	enableAspectRatioCheckbox(floater, !floater->impl.mAspectRatioCheckOff); +	setAspectRatioCheckboxValue(floater, gSavedSettings.getBOOL("KeepAspectForSnapshot"));  	floater->getChildView("layer_types")->setEnabled(shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL); -	BOOL is_advance = gSavedSettings.getBOOL("AdvanceSnapshot"); -	BOOL is_local = shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL; -	BOOL show_slider = (shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD || -						shot_type == LLSnapshotLivePreview::SNAPSHOT_WEB || -					   (is_local && shot_format == LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG)); - -	floater->getChildView("more_btn")->setVisible( !is_advance); // the only item hidden in advanced mode -	floater->getChildView("less_btn")->setVisible(				is_advance); -	floater->getChildView("type_label2")->setVisible(				is_advance); -	floater->getChildView("format_label")->setVisible(			is_advance && is_local); -	floater->getChildView("local_format_combo")->setVisible(		is_advance && is_local); -	floater->getChildView("layer_types")->setVisible(				is_advance); -	floater->getChildView("layer_type_label")->setVisible(		is_advance); -	floater->getChildView("snapshot_width")->setVisible(			is_advance); -	floater->getChildView("snapshot_height")->setVisible(			is_advance); -	floater->getChildView("keep_aspect_check")->setVisible(		is_advance); -	floater->getChildView("ui_check")->setVisible(				is_advance); -	floater->getChildView("hud_check")->setVisible(				is_advance); -	floater->getChildView("keep_open_check")->setVisible(			is_advance); -	floater->getChildView("freeze_frame_check")->setVisible(		is_advance); -	floater->getChildView("auto_snapshot_check")->setVisible(		is_advance); -	floater->getChildView("image_quality_slider")->setVisible(	is_advance && show_slider); - -	if (gSavedSettings.getBOOL("RenderUIInSnapshot") || gSavedSettings.getBOOL("RenderHUDInSnapshot")) -	{ //clamp snapshot resolution to window size when showing UI or HUD in snapshot - -		LLSpinCtrl* width_ctrl = floater->getChild<LLSpinCtrl>("snapshot_width"); -		LLSpinCtrl* height_ctrl = floater->getChild<LLSpinCtrl>("snapshot_height"); - -		S32 width = gViewerWindow->getWindowWidthRaw(); -		S32 height = gViewerWindow->getWindowHeightRaw(); - -		width_ctrl->setMaxValue(width); -		 -		height_ctrl->setMaxValue(height); +	LLPanelSnapshot* active_panel = getActivePanel(floater); +	if (active_panel) +	{ +		LLSpinCtrl* width_ctrl = getWidthSpinner(floater); +		LLSpinCtrl* height_ctrl = getHeightSpinner(floater); -		if (width_ctrl->getValue().asInteger() > width) +		// Initialize spinners. +		if (width_ctrl->getValue().asInteger() == 0)  		{ -			width_ctrl->forceSetValue(width); +			S32 w = gSavedSettings.getS32(lastSnapshotWidthName(shot_type)); +			lldebugs << "Initializing width spinner (" << width_ctrl->getName() << "): " << w << llendl; +			width_ctrl->setValue(w);  		} -		if (height_ctrl->getValue().asInteger() > height) +		if (height_ctrl->getValue().asInteger() == 0)  		{ -			height_ctrl->forceSetValue(height); +			S32 h = gSavedSettings.getS32(lastSnapshotHeightName(shot_type)); +			lldebugs << "Initializing height spinner (" << height_ctrl->getName() << "): " << h << llendl; +			height_ctrl->setValue(h); +		} + +		if (gSavedSettings.getBOOL("RenderUIInSnapshot") || gSavedSettings.getBOOL("RenderHUDInSnapshot")) +		{ //clamp snapshot resolution to window size when showing UI or HUD in snapshot +			S32 width = gViewerWindow->getWindowWidthRaw(); +			S32 height = gViewerWindow->getWindowHeightRaw(); + +			width_ctrl->setMaxValue(width); + +			height_ctrl->setMaxValue(height); + +			if (width_ctrl->getValue().asInteger() > width) +			{ +				width_ctrl->forceSetValue(width); +			} +			if (height_ctrl->getValue().asInteger() > height) +			{ +				height_ctrl->forceSetValue(height); +			} +		} +		else +		{ +			width_ctrl->setMaxValue(6016); +			height_ctrl->setMaxValue(6016);  		} -	} -	else -	{  -		LLSpinCtrl* width = floater->getChild<LLSpinCtrl>("snapshot_width"); -		width->setMaxValue(6016); -		LLSpinCtrl* height = floater->getChild<LLSpinCtrl>("snapshot_height"); -		height->setMaxValue(6016);  	}  	LLSnapshotLivePreview* previewp = getPreviewView(floater); @@ -1399,11 +1425,7 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)  	BOOL got_snap = previewp && previewp->getSnapshotUpToDate();  	// *TODO: Separate maximum size for Web images from postcards -	floater->getChildView("send_btn")->setEnabled((shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD || -											shot_type == LLSnapshotLivePreview::SNAPSHOT_WEB) && -											got_snap && previewp->getDataSize() <= MAX_POSTCARD_DATASIZE); -	floater->getChildView("upload_btn")->setEnabled(shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE  && got_snap); -	floater->getChildView("save_btn")->setEnabled(shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL    && got_snap); +	//lldebugs << "Is snapshot up-to-date? " << got_snap << llendl;  	LLLocale locale(LLLocale::USER_LOCALE);  	std::string bytes_string; @@ -1411,9 +1433,17 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)  	{  		LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 );  	} -	S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); -	floater->getChild<LLUICtrl>("texture")->setLabelArg("[AMOUNT]", llformat("%d",upload_cost)); -	floater->getChild<LLUICtrl>("upload_btn")->setLabelArg("[AMOUNT]", llformat("%d",upload_cost)); + +	// Update displayed image resolution. +	LLTextBox* image_res_tb = floater->getChild<LLTextBox>("image_res_text"); +	image_res_tb->setVisible(got_snap); +	if (got_snap) +	{ +		LLPointer<LLImageRaw> img = previewp->getEncodedImage(); +		image_res_tb->setTextArg("[WIDTH]", llformat("%d", img->getWidth())); +		image_res_tb->setTextArg("[HEIGHT]", llformat("%d", img->getHeight())); +	} +  	floater->getChild<LLUICtrl>("file_size_label")->setTextArg("[SIZE]", got_snap ? bytes_string : floater->getString("unknown"));  	floater->getChild<LLUICtrl>("file_size_label")->setColor(  		shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD  @@ -1422,144 +1452,75 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)  	switch(shot_type)  	{ -	  // *TODO: Separate settings for Web images from postcards  	  case LLSnapshotLivePreview::SNAPSHOT_WEB: +		layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR; +		floater->getChild<LLUICtrl>("layer_types")->setValue("colors"); +		setResolution(floater, "profile_size_combo"); +		break;  	  case LLSnapshotLivePreview::SNAPSHOT_POSTCARD:  		layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR;  		floater->getChild<LLUICtrl>("layer_types")->setValue("colors"); -		if(is_advance) -		{			 -			setResolution(floater, "postcard_size_combo"); -		} +		setResolution(floater, "postcard_size_combo");  		break;  	  case LLSnapshotLivePreview::SNAPSHOT_TEXTURE:  		layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR;  		floater->getChild<LLUICtrl>("layer_types")->setValue("colors"); -		if(is_advance) -		{ -			setResolution(floater, "texture_size_combo");			 -		} +		setResolution(floater, "texture_size_combo");  		break;  	  case  LLSnapshotLivePreview::SNAPSHOT_LOCAL: -		if(is_advance) -		{ -			setResolution(floater, "local_size_combo"); -		} +		setResolution(floater, "local_size_combo");  		break;  	  default:  		break;  	} -	updateResolutionTextEntry(floater); -  	if (previewp)  	{ +		lldebugs << "Setting snapshot type (" << shot_type << "), format (" << shot_format << ")" << llendl;  		previewp->setSnapshotType(shot_type);  		previewp->setSnapshotFormat(shot_format);  		previewp->setSnapshotBufferType(layer_type);  	} -} - -// static -void LLFloaterSnapshot::Impl::updateResolutionTextEntry(LLFloaterSnapshot* floater) -{ -	LLSpinCtrl* width_spinner = floater->getChild<LLSpinCtrl>("snapshot_width"); -	LLSpinCtrl* height_spinner = floater->getChild<LLSpinCtrl>("snapshot_height"); -	if(getTypeIndex(floater) == LLSnapshotLivePreview::SNAPSHOT_TEXTURE) +	LLPanelSnapshot* current_panel = Impl::getActivePanel(floater); +	if (current_panel)  	{ -		width_spinner->setAllowEdit(FALSE); -		height_spinner->setAllowEdit(FALSE); -	} -	else -	{ -		width_spinner->setAllowEdit(TRUE); -		height_spinner->setAllowEdit(TRUE); +		LLSD info; +		info["have-snapshot"] = got_snap; +		current_panel->updateControls(info);  	}  }  // static -void LLFloaterSnapshot::Impl::checkAutoSnapshot(LLSnapshotLivePreview* previewp, BOOL update_thumbnail) +void LLFloaterSnapshot::Impl::setStatus(EStatus status, bool ok, const std::string& msg)  { -	if (previewp) +	LLFloaterSnapshot* floater = LLFloaterSnapshot::getInstance(); +	switch (status)  	{ -		BOOL autosnap = gSavedSettings.getBOOL("AutoSnapshot"); -		previewp->updateSnapshot(autosnap, update_thumbnail, autosnap ? AUTO_SNAPSHOT_TIME_DELAY : 0.f); -	} -} - -// static -void LLFloaterSnapshot::Impl::onClickDiscard(void* data) -{ -	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; -	 -	if (view) -	{ -		view->closeFloater(); +	case STATUS_READY: +		setWorking(floater, false); +		setFinished(floater, false); +		break; +	case STATUS_WORKING: +		setWorking(floater, true); +		setFinished(floater, false); +		break; +	case STATUS_FINISHED: +		setWorking(floater, false); +		setFinished(floater, true, ok, msg); +		break;  	} -} - -// static -void LLFloaterSnapshot::Impl::onCommitSave(LLUICtrl* ctrl, void* data) -{ -	if (ctrl->getValue().asString() == "save as") -	{ -		gViewerWindow->resetSnapshotLoc(); -	} -	onClickKeep(data); +	floater->impl.mStatus = status;  }  // static -void LLFloaterSnapshot::Impl::onClickKeep(void* data) +void LLFloaterSnapshot::Impl::checkAutoSnapshot(LLSnapshotLivePreview* previewp, BOOL update_thumbnail)  { -	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; -	LLSnapshotLivePreview* previewp = getPreviewView(view); -  	if (previewp)  	{ -		switch (previewp->getSnapshotType()) -		{ -		  case LLSnapshotLivePreview::SNAPSHOT_WEB: -			previewp->saveWeb(); -			break; - -		  case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: -			{ -				LLFloaterPostcard* floater = previewp->savePostcard(); -				// if still in snapshot mode, put postcard floater in snapshot floaterview -				// and link it to snapshot floater -				if (floater && !gSavedSettings.getBOOL("CloseSnapshotOnKeep")) -				{ -					gFloaterView->removeChild(floater); -					gSnapshotFloaterView->addChild(floater); -					view->addDependentFloater(floater, FALSE); -				} -			} -			break; - -		  case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: -			previewp->saveTexture(); -			break; - -		  case LLSnapshotLivePreview::SNAPSHOT_LOCAL: -			previewp->saveLocal(); -			break; - -		  default: -			break; -		} - -		if (gSavedSettings.getBOOL("CloseSnapshotOnKeep")) -		{ -			view->closeFloater(); -		} -		else -		{ -			checkAutoSnapshot(previewp); -		} - -		updateControls(view); +		BOOL autosnap = gSavedSettings.getBOOL("AutoSnapshot"); +		previewp->updateSnapshot(autosnap, update_thumbnail, autosnap ? AUTO_SNAPSHOT_TIME_DELAY : 0.f);  	}  } @@ -1590,32 +1551,19 @@ void LLFloaterSnapshot::Impl::onClickAutoSnap(LLUICtrl *ctrl, void* data)  void LLFloaterSnapshot::Impl::onClickMore(void* data)  { -	gSavedSettings.setBOOL( "AdvanceSnapshot", TRUE ); +	BOOL visible = gSavedSettings.getBOOL("AdvanceSnapshot"); -	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;		 +	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;  	if (view)  	{ +		gSavedSettings.setBOOL("AdvanceSnapshot", !visible); +#if 0  		view->translate( 0, view->getUIWinHeightShort() - view->getUIWinHeightLong() );  		view->reshape(view->getRect().getWidth(), view->getUIWinHeightLong()); +#endif  		updateControls(view) ;  		updateLayout(view) ; -		if(getPreviewView(view)) -		{ -			getPreviewView(view)->setThumbnailImageSize() ; -		} -	} -} -void LLFloaterSnapshot::Impl::onClickLess(void* data) -{ -	gSavedSettings.setBOOL( "AdvanceSnapshot", FALSE ); -	 -	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;		 -	if (view) -	{ -		view->translate( 0, view->getUIWinHeightLong() - view->getUIWinHeightShort() ); -		view->reshape(view->getRect().getWidth(), view->getUIWinHeightShort()); -		updateControls(view) ; -		updateLayout(view) ; +		// *TODO: redundant?  		if(getPreviewView(view))  		{  			getPreviewView(view)->setThumbnailImageSize() ; @@ -1651,21 +1599,21 @@ void LLFloaterSnapshot::Impl::onClickHUDCheck(LLUICtrl *ctrl, void* data)  	}  } +#if 0  // static -void LLFloaterSnapshot::Impl::onClickKeepOpenCheck(LLUICtrl* ctrl, void* data) +void LLFloaterSnapshot::Impl::onClickKeepAspectCheck(LLUICtrl* ctrl, void* data)  {  	LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; - -	gSavedSettings.setBOOL( "CloseSnapshotOnKeep", !check->get() ); +	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; +	applyKeepAspectCheck(view, check->get());  } +#endif  // static -void LLFloaterSnapshot::Impl::onClickKeepAspectCheck(LLUICtrl* ctrl, void* data) +void LLFloaterSnapshot::Impl::applyKeepAspectCheck(LLFloaterSnapshot* view, BOOL checked)  { -	LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; -	gSavedSettings.setBOOL( "KeepAspectForSnapshot", check->get() ); -	 -	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; +	gSavedSettings.setBOOL("KeepAspectForSnapshot", checked); +  	if (view)  	{  		LLSnapshotLivePreview* previewp = getPreviewView(view) ; @@ -1688,20 +1636,6 @@ void LLFloaterSnapshot::Impl::onClickKeepAspectCheck(LLUICtrl* ctrl, void* data)  }  // static -void LLFloaterSnapshot::Impl::onCommitQuality(LLUICtrl* ctrl, void* data) -{ -	LLSliderCtrl* slider = (LLSliderCtrl*)ctrl; -	S32 quality_val = llfloor((F32)slider->getValue().asReal()); - -	LLSnapshotLivePreview* previewp = getPreviewView((LLFloaterSnapshot *)data); -	if (previewp) -	{ -		previewp->setSnapshotQuality(quality_val); -	} -	checkAutoSnapshot(previewp, TRUE); -} - -// static  void LLFloaterSnapshot::Impl::onCommitFreezeFrame(LLUICtrl* ctrl, void* data)  {  	LLCheckBoxCtrl* check_box = (LLCheckBoxCtrl*)ctrl; @@ -1723,18 +1657,16 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde  	LLSnapshotLivePreview *previewp = getPreviewView(view) ;  	// Don't round texture sizes; textures are commonly stretched in world, profiles, etc and need to be "squashed" during upload, not cropped here -#if 0 -	if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == getTypeIndex(view)) +	if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == getActiveSnapshotType(view))  	{  		previewp->mKeepAspectRatio = FALSE ;  		return ;  	} -#endif  	if(0 == index) //current window size  	{  		view->impl.mAspectRatioCheckOff = true ; -		view->getChildView("keep_aspect_check")->setEnabled(FALSE) ; +		enableAspectRatioCheckbox(view, FALSE);  		if(previewp)  		{ @@ -1744,20 +1676,17 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde  	else if(-1 == index) //custom  	{  		view->impl.mAspectRatioCheckOff = false ; -		//if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE != gSavedSettings.getS32("LastSnapshotType")) -		{ -			view->getChildView("keep_aspect_check")->setEnabled(TRUE) ; +		enableAspectRatioCheckbox(view, TRUE); -			if(previewp) -			{ -				previewp->mKeepAspectRatio = gSavedSettings.getBOOL("KeepAspectForSnapshot") ; -			} +		if(previewp) +		{ +			previewp->mKeepAspectRatio = gSavedSettings.getBOOL("KeepAspectForSnapshot") ;  		}  	}  	else  	{  		view->impl.mAspectRatioCheckOff = true ; -		view->getChildView("keep_aspect_check")->setEnabled(FALSE) ; +		enableAspectRatioCheckbox(view, FALSE);  		if(previewp)  		{ @@ -1768,23 +1697,63 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde  	return ;  } -static std::string lastSnapshotWidthName() +// static +void LLFloaterSnapshot::Impl::setWorking(LLFloaterSnapshot* floater, bool working) +{ +	LLUICtrl* working_lbl = floater->getChild<LLUICtrl>("working_lbl"); +	working_lbl->setVisible(working); +	floater->getChild<LLUICtrl>("working_indicator")->setVisible(working); + +	if (working) +	{ +		const std::string panel_name = getActivePanel(floater, false)->getName(); +		const std::string prefix = panel_name.substr(std::string("panel_snapshot_").size()); +		std::string progress_text = floater->getString(prefix + "_" + "progress_str"); +		working_lbl->setValue(progress_text); +	} + +	// All controls should be disable while posting. +	floater->setCtrlsEnabled(!working); +	LLPanelSnapshot* active_panel = getActivePanel(floater); +	if (active_panel) +	{ +		active_panel->setCtrlsEnabled(!working); +	} +} + +// static +void LLFloaterSnapshot::Impl::setFinished(LLFloaterSnapshot* floater, bool finished, bool ok, const std::string& msg)  { -	switch(gSavedSettings.getS32("LastSnapshotType")) +	floater->getChild<LLUICtrl>("succeeded_panel")->setVisible(finished && ok); +	floater->getChild<LLUICtrl>("failed_panel")->setVisible(finished && !ok); + +	if (finished)  	{ -	  // *TODO: Separate settings for Web snapshots and postcards -	  case LLSnapshotLivePreview::SNAPSHOT_WEB:		 return "LastSnapshotToEmailWidth"; +		LLUICtrl* finished_lbl = floater->getChild<LLUICtrl>(ok ? "succeeded_lbl" : "failed_lbl"); +		std::string result_text = floater->getString(msg + "_" + (ok ? "succeeded_str" : "failed_str")); +		finished_lbl->setValue(result_text); + +		LLSideTrayPanelContainer* panel_container = floater->getChild<LLSideTrayPanelContainer>("panel_container"); +		panel_container->openPreviousPanel(); +		panel_container->getCurrentPanel()->onOpen(LLSD()); +	} +} + +static std::string lastSnapshotWidthName(S32 shot_type) +{ +	switch (shot_type) +	{ +	  case LLSnapshotLivePreview::SNAPSHOT_WEB:		 return "LastSnapshotToProfileWidth";  	  case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: return "LastSnapshotToEmailWidth";  	  case LLSnapshotLivePreview::SNAPSHOT_TEXTURE:  return "LastSnapshotToInventoryWidth";  	  default:                                       return "LastSnapshotToDiskWidth";  	}  } -static std::string lastSnapshotHeightName() +static std::string lastSnapshotHeightName(S32 shot_type)  { -	switch(gSavedSettings.getS32("LastSnapshotType")) +	switch (shot_type)  	{ -	  // *TODO: Separate settings for Web snapshots and postcards -	  case LLSnapshotLivePreview::SNAPSHOT_WEB:	     return "LastSnapshotToEmailHeight"; +	  case LLSnapshotLivePreview::SNAPSHOT_WEB:	     return "LastSnapshotToProfileHeight";  	  case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: return "LastSnapshotToEmailHeight";  	  case LLSnapshotLivePreview::SNAPSHOT_TEXTURE:  return "LastSnapshotToInventoryHeight";  	  default:                                       return "LastSnapshotToDiskHeight"; @@ -1799,10 +1768,12 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL  	if (!view || !combobox)  	{ +		llassert(view && combobox);  		return;  	}  	// save off all selected resolution values +	gSavedSettings.setS32("SnapshotProfileLastResolution",  view->getChild<LLComboBox>("profile_size_combo")->getCurrentIndex());  	gSavedSettings.setS32("SnapshotPostcardLastResolution", view->getChild<LLComboBox>("postcard_size_combo")->getCurrentIndex());  	gSavedSettings.setS32("SnapshotTextureLastResolution",  view->getChild<LLComboBox>("texture_size_combo")->getCurrentIndex());  	gSavedSettings.setS32("SnapshotLocalLastResolution",    view->getChild<LLComboBox>("local_size_combo")->getCurrentIndex()); @@ -1824,16 +1795,45 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL  		if (width == 0 || height == 0)  		{  			// take resolution from current window size +			lldebugs << "Setting preview res from window: " << gViewerWindow->getWindowWidthRaw() << "x" << gViewerWindow->getWindowHeightRaw() << llendl;  			previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());  		}  		else if (width == -1 || height == -1)  		{  			// load last custom value -			previewp->setSize(gSavedSettings.getS32(lastSnapshotWidthName()), gSavedSettings.getS32(lastSnapshotHeightName())); +#if 1 +			S32 new_width = 0, new_height = 0; +			LLPanelSnapshot* spanel = getActivePanel(view); +			if (spanel) +			{ +				lldebugs << "Loading typed res from panel " << spanel->getName() << llendl; +				new_width = spanel->getTypedPreviewWidth(); +				new_height = spanel->getTypedPreviewHeight(); +			} +			else +			{ +				const S32 shot_type = getActiveSnapshotType(view); +				lldebugs << "Loading saved res for shot_type " << shot_type << llendl; +				new_width = gSavedSettings.getS32(lastSnapshotWidthName(shot_type)); +				new_height = gSavedSettings.getS32(lastSnapshotHeightName(shot_type)); +			} + +			llassert(new_width > 0 && new_height > 0); +			previewp->setSize(new_width, new_height); +#else +			LLPanelSnapshot* spanel = getActivePanel(view); +			if (spanel) +			{ +				lldebugs << "Setting custom preview res : " << spanel->getTypedPreviewWidth() << "x" << spanel->getTypedPreviewHeight() << llendl; +				previewp->setSize(spanel->getTypedPreviewWidth(), spanel->getTypedPreviewHeight()); +			} +			//previewp->setSize(gSavedSettings.getS32(lastSnapshotWidthName()), gSavedSettings.getS32(lastSnapshotHeightName())); +#endif  		}  		else  		{  			// use the resolution from the selected pre-canned drop-down choice +			lldebugs << "Setting preview res selected from combo: " << width << "x" << height << llendl;  			previewp->setSize(width, height);  		} @@ -1853,10 +1853,10 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL  			resetSnapshotSizeOnUI(view, width, height) ;  		} -		if(view->getChild<LLUICtrl>("snapshot_width")->getValue().asInteger() != width || view->getChild<LLUICtrl>("snapshot_height")->getValue().asInteger() != height) +		if(getWidthSpinner(view)->getValue().asInteger() != width || getHeightSpinner(view)->getValue().asInteger() != height)  		{ -			view->getChild<LLUICtrl>("snapshot_width")->setValue(width); -			view->getChild<LLUICtrl>("snapshot_height")->setValue(height); +			getWidthSpinner(view)->setValue(width); +			getHeightSpinner(view)->setValue(height);  		}  		if(original_width != width || original_height != height) @@ -1892,32 +1892,41 @@ void LLFloaterSnapshot::Impl::onCommitLayerTypes(LLUICtrl* ctrl, void*data)  	}  } -//static  -void LLFloaterSnapshot::Impl::onCommitSnapshotType(LLUICtrl* ctrl, void* data) +// static +void LLFloaterSnapshot::Impl::onImageQualityChange(LLFloaterSnapshot* view, S32 quality_val) +{ +	LLSnapshotLivePreview* previewp = getPreviewView(view); +	if (previewp) +	{ +		previewp->setSnapshotQuality(quality_val); +	} +	checkAutoSnapshot(previewp, TRUE); +} + +// static +void LLFloaterSnapshot::Impl::onImageFormatChange(LLFloaterSnapshot* view)  { -	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;		  	if (view)  	{ -		gSavedSettings.setS32("LastSnapshotType", getTypeIndex(view)); +		gSavedSettings.setS32("SnapshotFormat", getImageFormat(view));  		getPreviewView(view)->updateSnapshot(TRUE);  		updateControls(view);  	}  } - +#if 0  //static  -void LLFloaterSnapshot::Impl::onCommitSnapshotFormat(LLUICtrl* ctrl, void* data) +void LLFloaterSnapshot::Impl::onCommitSnapshotType(LLUICtrl* ctrl, void* data)  { -	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; +	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;		  	if (view)  	{ -		gSavedSettings.setS32("SnapshotFormat", getFormatIndex(view)); +		gSavedSettings.setS32("LastSnapshotType", getTypeIndex(view));  		getPreviewView(view)->updateSnapshot(TRUE);  		updateControls(view);  	}  } - - +#endif  // Sets the named size combo to "custom" mode.  // static @@ -1931,6 +1940,10 @@ void LLFloaterSnapshot::Impl::comboSetCustom(LLFloaterSnapshot* floater, const s  	{  		gSavedSettings.setS32("SnapshotPostcardLastResolution", combo->getCurrentIndex());  	} +	else if(comboname == "profile_size_combo") +	{ +		gSavedSettings.setS32("SnapshotProfileLastResolution", combo->getCurrentIndex()); +	}  	else if(comboname == "texture_size_combo")   	{  		gSavedSettings.setS32("SnapshotTextureLastResolution", combo->getCurrentIndex()); @@ -2027,21 +2040,29 @@ BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3  //static  void LLFloaterSnapshot::Impl::resetSnapshotSizeOnUI(LLFloaterSnapshot *view, S32 width, S32 height)  { -	view->getChild<LLSpinCtrl>("snapshot_width")->forceSetValue(width); -	view->getChild<LLSpinCtrl>("snapshot_height")->forceSetValue(height); -	gSavedSettings.setS32(lastSnapshotWidthName(), width); -	gSavedSettings.setS32(lastSnapshotHeightName(), height); +	getWidthSpinner(view)->forceSetValue(width); +	getHeightSpinner(view)->forceSetValue(height); +	gSavedSettings.setS32(lastSnapshotWidthName(getActiveSnapshotType(view)), width); +	gSavedSettings.setS32(lastSnapshotHeightName(getActiveSnapshotType(view)), height);  } +#if 0  //static  void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* data)  { -	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;		 +	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; +	S32 w = llfloor((F32)getWidthSpinner(view)->getValue().asReal()); +	S32 h = llfloor((F32)getHeightSpinner(view)->getValue().asReal()); +	applyCustomResolution(view, w, h); +} +#endif + +// static +void LLFloaterSnapshot::Impl::applyCustomResolution(LLFloaterSnapshot* view, S32 w, S32 h) +{ +	lldebugs << "applyCustomResolution(" << w << ", " << h << ")" << llendl;  	if (view)  	{ -		S32 w = llfloor((F32)view->getChild<LLUICtrl>("snapshot_width")->getValue().asReal()); -		S32 h = llfloor((F32)view->getChild<LLUICtrl>("snapshot_height")->getValue().asReal()); -  		LLSnapshotLivePreview* previewp = getPreviewView(view);  		if (previewp)  		{ @@ -2073,7 +2094,7 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat  					}  				}  #endif -				previewp->setMaxImageSize((S32)((LLSpinCtrl *)ctrl)->getMaxValue()) ; +				previewp->setMaxImageSize((S32) getWidthSpinner(view)->getMaxValue()) ;  				// Check image size changes the value of height and width  				if(checkImageSize(previewp, w, h, w != curw, previewp->getMaxImageSize()) @@ -2085,19 +2106,33 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat  				previewp->setSize(w,h);  				checkAutoSnapshot(previewp, FALSE);  				previewp->updateSnapshot(FALSE, TRUE); +				comboSetCustom(view, "profile_size_combo");  				comboSetCustom(view, "postcard_size_combo");  				comboSetCustom(view, "texture_size_combo");  				comboSetCustom(view, "local_size_combo");  			}  		} -		gSavedSettings.setS32(lastSnapshotWidthName(), w); -		gSavedSettings.setS32(lastSnapshotHeightName(), h); +		gSavedSettings.setS32(lastSnapshotWidthName(getActiveSnapshotType(view)), w); +		gSavedSettings.setS32(lastSnapshotHeightName(getActiveSnapshotType(view)), h);  		updateControls(view);  	}  } +// static +void LLFloaterSnapshot::Impl::onSnapshotUploadFinished(bool status) +{ +	setStatus(STATUS_FINISHED, status, "profile"); +} + + +// static +void LLFloaterSnapshot::Impl::onSendingPostcardFinished(bool status) +{ +	setStatus(STATUS_FINISHED, status, "postcard"); +} +  ///----------------------------------------------------------------------------  /// Class LLFloaterSnapshot  ///---------------------------------------------------------------------------- @@ -2134,24 +2169,18 @@ BOOL LLFloaterSnapshot::postBuild()  		LLWebSharing::instance().init();  	} +#if 0  	childSetCommitCallback("snapshot_type_radio", Impl::onCommitSnapshotType, this); -	childSetCommitCallback("local_format_combo", Impl::onCommitSnapshotFormat, this); +#endif  	childSetAction("new_snapshot_btn", Impl::onClickNewSnapshot, this); -	childSetAction("more_btn", Impl::onClickMore, this); -	childSetAction("less_btn", Impl::onClickLess, this); - -	childSetAction("upload_btn", Impl::onClickKeep, this); -	childSetAction("send_btn", Impl::onClickKeep, this); -	childSetCommitCallback("save_btn", Impl::onCommitSave, this); -	childSetAction("discard_btn", Impl::onClickDiscard, this); - -	childSetCommitCallback("image_quality_slider", Impl::onCommitQuality, this); -	getChild<LLUICtrl>("image_quality_slider")->setValue(gSavedSettings.getS32("SnapshotQuality")); +	childSetAction("advanced_options_btn", Impl::onClickMore, this); +#if 0  	childSetCommitCallback("snapshot_width", Impl::onCommitCustomResolution, this);  	childSetCommitCallback("snapshot_height", Impl::onCommitCustomResolution, this); +#endif  	childSetCommitCallback("ui_check", Impl::onClickUICheck, this);  	getChild<LLUICtrl>("ui_check")->setValue(gSavedSettings.getBOOL("RenderUIInSnapshot")); @@ -2159,18 +2188,19 @@ BOOL LLFloaterSnapshot::postBuild()  	childSetCommitCallback("hud_check", Impl::onClickHUDCheck, this);  	getChild<LLUICtrl>("hud_check")->setValue(gSavedSettings.getBOOL("RenderHUDInSnapshot")); -	childSetCommitCallback("keep_open_check", Impl::onClickKeepOpenCheck, this); -	getChild<LLUICtrl>("keep_open_check")->setValue(!gSavedSettings.getBOOL("CloseSnapshotOnKeep")); - +#if 0  	childSetCommitCallback("keep_aspect_check", Impl::onClickKeepAspectCheck, this); -	getChild<LLUICtrl>("keep_aspect_check")->setValue(gSavedSettings.getBOOL("KeepAspectForSnapshot")); +#endif +	impl.setAspectRatioCheckboxValue(this, gSavedSettings.getBOOL("KeepAspectForSnapshot"));  	childSetCommitCallback("layer_types", Impl::onCommitLayerTypes, this);  	getChild<LLUICtrl>("layer_types")->setValue("colors");  	getChildView("layer_types")->setEnabled(FALSE); -	getChild<LLUICtrl>("snapshot_width")->setValue(gSavedSettings.getS32(lastSnapshotWidthName())); -	getChild<LLUICtrl>("snapshot_height")->setValue(gSavedSettings.getS32(lastSnapshotHeightName())); +#if 0 // leads to crash later if one of the settings values is 0 +	impl.getWidthSpinner(this)->setValue(gSavedSettings.getS32(lastSnapshotWidthName())); +	impl.getHeightSpinner(this)->setValue(gSavedSettings.getS32(lastSnapshotHeightName())); +#endif  	getChild<LLUICtrl>("freeze_frame_check")->setValue(gSavedSettings.getBOOL("UseFreezeFrame"));  	childSetCommitCallback("freeze_frame_check", Impl::onCommitFreezeFrame, this); @@ -2178,10 +2208,16 @@ BOOL LLFloaterSnapshot::postBuild()  	getChild<LLUICtrl>("auto_snapshot_check")->setValue(gSavedSettings.getBOOL("AutoSnapshot"));  	childSetCommitCallback("auto_snapshot_check", Impl::onClickAutoSnap, this); +	childSetCommitCallback("profile_size_combo", Impl::onCommitResolution, this);  	childSetCommitCallback("postcard_size_combo", Impl::onCommitResolution, this);  	childSetCommitCallback("texture_size_combo", Impl::onCommitResolution, this);  	childSetCommitCallback("local_size_combo", Impl::onCommitResolution, this); +	LLWebProfile::setImageUploadResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSnapshotUploadFinished, _1)); +	LLPostCard::setPostResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSendingPostcardFinished, _1)); + +	sThumbnailPlaceholder = getChild<LLUICtrl>("thumbnail_placeholder"); +  	// create preview window  	LLRect full_screen_rect = getRootView()->getRect();  	LLSnapshotLivePreview::Params p; @@ -2221,19 +2257,30 @@ void LLFloaterSnapshot::draw()  	{		  		if(previewp->getThumbnailImage())  		{ -			LLRect thumbnail_rect = getChild<LLUICtrl>("thumbnail_placeholder")->getRect(); - -			S32 offset_x = (getRect().getWidth() - previewp->getThumbnailWidth()) / 2 ; +			bool working = impl.getStatus() == Impl::STATUS_WORKING; +			const LLRect& thumbnail_rect = getThumbnailPlaceholderRect(); +			S32 offset_x = thumbnail_rect.mLeft + (thumbnail_rect.getWidth() - previewp->getThumbnailWidth()) / 2 ;  			S32 offset_y = thumbnail_rect.mBottom + (thumbnail_rect.getHeight() - previewp->getThumbnailHeight()) / 2 ;  			glMatrixMode(GL_MODELVIEW);  			// Apply floater transparency to the texture unless the floater is focused.  			F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); +			LLColor4 color = working ? LLColor4::grey4 : LLColor4::white;  			gl_draw_scaled_image(offset_x, offset_y,   					previewp->getThumbnailWidth(), previewp->getThumbnailHeight(),  -					previewp->getThumbnailImage(), LLColor4::white % alpha); +					previewp->getThumbnailImage(), color % alpha);  			previewp->drawPreviewRect(offset_x, offset_y) ; + +			// Draw progress indicators on top of the preview. +			if (working) +			{ +				gGL.pushUIMatrix(); +				const LLRect& r = getThumbnailPlaceholderRect(); +				LLUI::translate((F32) r.mLeft, (F32) r.mBottom); +				sThumbnailPlaceholder->draw(); +				gGL.popUIMatrix(); +			}  		}  	}  } @@ -2249,6 +2296,9 @@ void LLFloaterSnapshot::onOpen(const LLSD& key)  	gSnapshotFloaterView->setEnabled(TRUE);  	gSnapshotFloaterView->setVisible(TRUE);  	gSnapshotFloaterView->adjustToFitScreen(this, FALSE); + +	// Initialize default tab. +	getChild<LLSideTrayPanelContainer>("panel_container")->getCurrentPanel()->onOpen(LLSD());  }  void LLFloaterSnapshot::onClose(bool app_quitting) @@ -2256,6 +2306,62 @@ void LLFloaterSnapshot::onClose(bool app_quitting)  	getParent()->setMouseOpaque(FALSE);  } +// virtual +S32 LLFloaterSnapshot::notify(const LLSD& info) +{ +	// A child panel wants to change snapshot resolution. +	if (info.has("combo-res-change")) +	{ +		std::string combo_name = info["combo-res-change"]["control-name"].asString(); +		impl.updateResolution(getChild<LLUICtrl>(combo_name), this); +		return 1; +	} + +	if (info.has("custom-res-change")) +	{ +		LLSD res = info["custom-res-change"]; +		impl.applyCustomResolution(this, res["w"].asInteger(), res["h"].asInteger()); +		return 1; +	} + +	if (info.has("keep-aspect-change")) +	{ +		impl.applyKeepAspectCheck(this, info["keep-aspect-change"].asBoolean()); +		return 1; +	} + +	if (info.has("image-quality-change")) +	{ +		impl.onImageQualityChange(this, info["image-quality-change"].asInteger()); +		return 1; +	} + +	if (info.has("image-format-change")) +	{ +		impl.onImageFormatChange(this); +		return 1; +	} + +	if (info.has("set-ready")) +	{ +		impl.setStatus(Impl::STATUS_READY); +		return 1; +	} + +	if (info.has("set-working")) +	{ +		impl.setStatus(Impl::STATUS_WORKING); +		return 1; +	} + +	if (info.has("set-finished")) +	{ +		LLSD data = info["set-finished"]; +		impl.setStatus(Impl::STATUS_FINISHED, data["ok"].asBoolean(), data["msg"].asString()); +		return 1; +	} +	return 0; +}  //static   void LLFloaterSnapshot::update() @@ -2276,6 +2382,160 @@ void LLFloaterSnapshot::update()  	}  } +// static +LLFloaterSnapshot* LLFloaterSnapshot::getInstance() +{ +	return LLFloaterReg::getTypedInstance<LLFloaterSnapshot>("snapshot"); +} + +// static +void LLFloaterSnapshot::saveTexture() +{ +	lldebugs << "saveTexture" << llendl; + +	// FIXME: duplicated code +	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	if (!instance) +	{ +		llassert(instance != NULL); +		return; +	} +	LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance); +	if (!previewp) +	{ +		llassert(previewp != NULL); +		return; +	} + +	previewp->saveTexture(); +} + +// static +void LLFloaterSnapshot::saveLocal() +{ +	lldebugs << "saveLocal" << llendl; +	// FIXME: duplicated code +	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	if (!instance) +	{ +		llassert(instance != NULL); +		return; +	} +	LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance); +	if (!previewp) +	{ +		llassert(previewp != NULL); +		return; +	} + +	previewp->saveLocal(); +} + +// static +void LLFloaterSnapshot::preUpdate() +{ +	// FIXME: duplicated code +	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	if (instance) +	{ +		// Disable the send/post/save buttons until snapshot is ready. +		Impl::updateControls(instance); +	} +} + +// static +void LLFloaterSnapshot::postUpdate() +{ +	// FIXME: duplicated code +	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	if (instance) +	{ +		// Enable the send/post/save buttons. +		Impl::updateControls(instance); +	} +} + +// static +void LLFloaterSnapshot::postSave() +{ +	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	if (!instance) +	{ +		llassert(instance != NULL); +		return; +	} + +	instance->impl.updateControls(instance); +	instance->impl.setStatus(Impl::STATUS_WORKING); +} + +// static +void LLFloaterSnapshot::postPanelSwitch() +{ +	LLFloaterSnapshot* instance = getInstance(); +	instance->impl.updateControls(instance); +} + +// static +LLPointer<LLImageFormatted> LLFloaterSnapshot::getImageData() +{ +	// FIXME: May not work for textures. + +	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	if (!instance) +	{ +		llassert(instance != NULL); +		return NULL; +	} + +	LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance); +	if (!previewp) +	{ +		llassert(previewp != NULL); +		return NULL; +	} + +	LLPointer<LLImageFormatted> img = previewp->getFormattedImage(); +	if (!img.get()) +	{ +		llwarns << "Empty snapshot image data" << llendl; +		llassert(img.get() != NULL); +	} + +	return img; +} + +// static +const LLVector3d& LLFloaterSnapshot::getPosTakenGlobal() +{ +	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	if (!instance) +	{ +		llassert(instance != NULL); +		return LLVector3d::zero; +	} + +	LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance); +	if (!previewp) +	{ +		llassert(previewp != NULL); +		return LLVector3d::zero; +	} + +	return previewp->getPosTakenGlobal(); +} + +// static +void LLFloaterSnapshot::setAgentEmail(const std::string& email) +{ +	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	if (instance) +	{ +		LLSideTrayPanelContainer* panel_container = instance->getChild<LLSideTrayPanelContainer>("panel_container"); +		LLPanel* postcard_panel = panel_container->getPanelByName("panel_snapshot_postcard"); +		postcard_panel->notify(LLSD().with("agent-email", email)); +	} +}  ///----------------------------------------------------------------------------  /// Class LLSnapshotFloaterView diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h index c92d9efde5..2c79c749d6 100644 --- a/indra/newview/llfloatersnapshot.h +++ b/indra/newview/llfloatersnapshot.h @@ -27,11 +27,15 @@  #ifndef LL_LLFLOATERSNAPSHOT_H  #define LL_LLFLOATERSNAPSHOT_H +#include "llimage.h"  #include "llfloater.h" +class LLSpinCtrl;  class LLFloaterSnapshot : public LLFloater  { +	LOG_CLASS(LLFloaterSnapshot); +  public:  	typedef enum e_snapshot_format  	{ @@ -47,20 +51,29 @@ public:  	/*virtual*/ void draw();  	/*virtual*/ void onOpen(const LLSD& key);  	/*virtual*/ void onClose(bool app_quitting); +	/*virtual*/ S32 notify(const LLSD& info);  	static void update(); -	 -	static S32  getUIWinHeightLong()  {return sUIWinHeightLong ;} -	static S32  getUIWinHeightShort() {return sUIWinHeightShort ;} -	static S32  getUIWinWidth()       {return sUIWinWidth ;} + +	// TODO: create a snapshot model instead +	static LLFloaterSnapshot* getInstance(); +	static void saveTexture(); +	static void saveLocal(); +	static void preUpdate(); +	static void postUpdate(); +	static void postSave(); +	static void postPanelSwitch(); +	static LLPointer<LLImageFormatted> getImageData(); +	static const LLVector3d& getPosTakenGlobal(); +	static void setAgentEmail(const std::string& email); + +	static const LLRect& getThumbnailPlaceholderRect() { return sThumbnailPlaceholder->getRect(); }  private: +	static LLUICtrl* sThumbnailPlaceholder; +  	class Impl;  	Impl& impl; - -	static S32    sUIWinHeightLong ; -	static S32    sUIWinHeightShort ; -	static S32    sUIWinWidth ;  };  class LLSnapshotFloaterView : public LLFloaterView diff --git a/indra/newview/llfloatertoybox.cpp b/indra/newview/llfloatertoybox.cpp index f527937e8f..324afe661f 100644 --- a/indra/newview/llfloatertoybox.cpp +++ b/indra/newview/llfloatertoybox.cpp @@ -42,6 +42,7 @@ LLFloaterToybox::LLFloaterToybox(const LLSD& key)  	, mToolBar(NULL)  {  	mCommitCallbackRegistrar.add("Toybox.RestoreDefaults", boost::bind(&LLFloaterToybox::onBtnRestoreDefaults, this)); +	mCommitCallbackRegistrar.add("Toybox.ClearAll", boost::bind(&LLFloaterToybox::onBtnClearAll, this));  }  LLFloaterToybox::~LLFloaterToybox() @@ -121,15 +122,35 @@ static bool finish_restore_toybox(const LLSD& notification, const LLSD& response  	{  		LLToolBarView::loadDefaultToolbars();  	} +  	return false;  } + +static bool finish_clear_all_toybox(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + +	if (option == 0) +	{ +		LLToolBarView::clearAllToolbars(); +	} + +	return false; +} +  static LLNotificationFunctorRegistration finish_restore_toybox_reg("ConfirmRestoreToybox", finish_restore_toybox); +static LLNotificationFunctorRegistration finish_clear_all_toybox_reg("ConfirmClearAllToybox", finish_clear_all_toybox);  void LLFloaterToybox::onBtnRestoreDefaults()  {  	LLNotificationsUtil::add("ConfirmRestoreToybox");  } +void LLFloaterToybox::onBtnClearAll() +{ +	LLNotificationsUtil::add("ConfirmClearAllToybox"); +} +  BOOL LLFloaterToybox::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  	EDragAndDropType cargo_type,  	void* cargo_data, diff --git a/indra/newview/llfloatertoybox.h b/indra/newview/llfloatertoybox.h index 6f0275b8fe..10aee0e6f5 100644 --- a/indra/newview/llfloatertoybox.h +++ b/indra/newview/llfloatertoybox.h @@ -50,6 +50,7 @@ public:  		std::string& tooltip_msg);  protected: +	void onBtnClearAll();  	void onBtnRestoreDefaults();  	void onToolBarButtonEnter(LLView* button); diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index 676eaf825d..a26515821d 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -556,6 +556,10 @@ public:  	folders_t::const_iterator getFoldersBegin() const { return mFolders.begin(); }  	folders_t::const_iterator getFoldersEnd() const { return mFolders.end(); }  	folders_t::size_type getFoldersCount() const { return mFolders.size(); } + +	items_t::const_iterator getItemsBegin() const { return mItems.begin(); } +	items_t::const_iterator getItemsEnd() const { return mItems.end(); } +	items_t::size_type getItemsCount() const { return mItems.size(); }  };  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 0e27bd81be..0c092e9a56 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2027,7 +2027,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  #endif  				}  			} -			if (move_is_into_outbox && !move_is_from_outbox) +			else if (move_is_into_outbox && !move_is_from_outbox)  			{  				dropFolderToOutbox(inv_cat);  			} @@ -3544,10 +3544,12 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  		// because they must contain only links to wearable items.  		accept = !(move_is_into_current_outfit || move_is_into_outfit); -		if(drop) +		if(accept && drop)  		{ -			copy_inventory_from_notecard(LLToolDragAndDrop::getInstance()->getObjectID(), -										 LLToolDragAndDrop::getInstance()->getSourceID(), inv_item); +			copy_inventory_from_notecard(mUUID,  // Drop to the chosen destination folder +										 LLToolDragAndDrop::getInstance()->getObjectID(), +										 LLToolDragAndDrop::getInstance()->getSourceID(), +										 inv_item);  		}  	}  	else if(LLToolDragAndDrop::SOURCE_LIBRARY == source) diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index fb02fe0ff7..dc25689fa3 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -2528,9 +2528,9 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)  	{  		LLPointer<LLViewerInventoryCategory> tfolder = new LLViewerInventoryCategory(gAgent.getID());  		tfolder->unpackMessage(msg, _PREHASH_FolderData, i); -		//llinfos << "unpaked folder '" << tfolder->getName() << "' (" -		//		<< tfolder->getUUID() << ") in " << tfolder->getParentUUID() -		//		<< llendl; +		llinfos << "unpacked folder '" << tfolder->getName() << "' (" +				<< tfolder->getUUID() << ") in " << tfolder->getParentUUID() +				<< llendl;  		if(tfolder->getUUID().notNull())  		{  			folders.push_back(tfolder); @@ -2570,8 +2570,8 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)  	{  		LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;  		titem->unpackMessage(msg, _PREHASH_ItemData, i); -		//llinfos << "unpaked item '" << titem->getName() << "' in " -		//		<< titem->getParentUUID() << llendl; +		llinfos << "unpaked item '" << titem->getName() << "' in " +				<< titem->getParentUUID() << llendl;  		U32 callback_id;  		msg->getU32Fast(_PREHASH_ItemData, _PREHASH_CallbackID, callback_id);  		if(titem->getUUID().notNull()) diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 1f1e49726d..58ba0219cc 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -68,7 +68,6 @@ static LLDefaultChildRegistry::Register<LLMediaCtrl> r("web_browser");  LLMediaCtrl::Params::Params()  :	start_url("start_url"),  	border_visible("border_visible", true), -	ignore_ui_scale("ignore_ui_scale", true),  	decouple_texture_size("decouple_texture_size", false),  	texture_width("texture_width", 1024),  	texture_height("texture_height", 1024), @@ -89,7 +88,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :  	mFrequentUpdates( true ),  	mForceUpdate( false ),  	mHomePageUrl( "" ), -	mIgnoreUIScale( true ),  	mAlwaysRefresh( false ),  	mMediaSource( 0 ),  	mTakeFocusOnClick( p.focus_on_click ), @@ -112,8 +110,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :  		setCaretColor( (unsigned int)color.mV[0], (unsigned int)color.mV[1], (unsigned int)color.mV[2] );  	} -	setIgnoreUIScale(p.ignore_ui_scale); -	  	setHomePageUrl(p.start_url, p.initial_mime_type);  	setBorderVisible(p.border_visible); @@ -124,10 +120,8 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :  	if(!getDecoupleTextureSize())  	{ -		S32 screen_width = mIgnoreUIScale ?  -			llround((F32)getRect().getWidth() * LLUI::sGLScaleFactor.mV[VX]) : getRect().getWidth(); -		S32 screen_height = mIgnoreUIScale ?  -			llround((F32)getRect().getHeight() * LLUI::sGLScaleFactor.mV[VY]) : getRect().getHeight(); +		S32 screen_width = llround((F32)getRect().getWidth() * LLUI::sGLScaleFactor.mV[VX]); +		S32 screen_height = llround((F32)getRect().getHeight() * LLUI::sGLScaleFactor.mV[VY]);  		setTextureSize(screen_width, screen_height);  	} @@ -471,8 +465,8 @@ void LLMediaCtrl::reshape( S32 width, S32 height, BOOL called_from_parent )  {  	if(!getDecoupleTextureSize())  	{ -		S32 screen_width = mIgnoreUIScale ? llround((F32)width * LLUI::sGLScaleFactor.mV[VX]) : width; -		S32 screen_height = mIgnoreUIScale ? llround((F32)height * LLUI::sGLScaleFactor.mV[VY]) : height; +		S32 screen_width = llround((F32)width * LLUI::sGLScaleFactor.mV[VX]); +		S32 screen_height = llround((F32)height * LLUI::sGLScaleFactor.mV[VY]);  		// when floater is minimized, these sizes are negative  		if ( screen_height > 0 && screen_width > 0 ) @@ -689,6 +683,8 @@ bool LLMediaCtrl::ensureMediaSourceExists()  			mMediaSource->addObserver( this );  			mMediaSource->setBackgroundColor( getBackgroundColor() );  			mMediaSource->setTrustedBrowser(mTrusted); +			mMediaSource->setPageZoomFactor( LLUI::sGLScaleFactor.mV[ VX ] ); +  			if(mClearCache)  			{  				mMediaSource->clearCache(); @@ -770,15 +766,7 @@ void LLMediaCtrl::draw()  	{  		gGL.pushUIMatrix();  		{ -			if (mIgnoreUIScale) -			{ -				gGL.loadUIIdentity(); -				// font system stores true screen origin, need to scale this by UI scale factor -				// to get render origin for this view (with unit scale) -				gGL.translateUI(floorf(LLFontGL::sCurOrigin.mX * LLUI::sGLScaleFactor.mV[VX]),  -							floorf(LLFontGL::sCurOrigin.mY * LLUI::sGLScaleFactor.mV[VY]),  -							LLFontGL::sCurOrigin.mZ); -			} +			mMediaSource->setPageZoomFactor( LLUI::sGLScaleFactor.mV[ VX ] );  			// scale texture to fit the space using texture coords  			gGL.getTexUnit(0)->bind(media_texture); @@ -826,14 +814,6 @@ void LLMediaCtrl::draw()  			x_offset = (r.getWidth() - width) / 2;  			y_offset = (r.getHeight() - height) / 2;		 -			if(mIgnoreUIScale) -			{ -				x_offset = llround((F32)x_offset * LLUI::sGLScaleFactor.mV[VX]); -				y_offset = llround((F32)y_offset * LLUI::sGLScaleFactor.mV[VY]); -				width = llround((F32)width * LLUI::sGLScaleFactor.mV[VX]); -				height = llround((F32)height * LLUI::sGLScaleFactor.mV[VY]); -			} -  			// draw the browser  			gGL.begin( LLRender::QUADS );  			if (! media_plugin->getTextureCoordsOpenGL()) @@ -900,14 +880,14 @@ void LLMediaCtrl::convertInputCoords(S32& x, S32& y)  		coords_opengl = mMediaSource->getMediaPlugin()->getTextureCoordsOpenGL();  	} -	x = mIgnoreUIScale ? llround((F32)x * LLUI::sGLScaleFactor.mV[VX]) : x; +	x = llround((F32)x * LLUI::sGLScaleFactor.mV[VX]);  	if ( ! coords_opengl )  	{ -		y = mIgnoreUIScale ? llround((F32)(y) * LLUI::sGLScaleFactor.mV[VY]) : y; +		y = llround((F32)(y) * LLUI::sGLScaleFactor.mV[VY]);  	}  	else  	{ -		y = mIgnoreUIScale ? llround((F32)(getRect().getHeight() - y) * LLUI::sGLScaleFactor.mV[VY]) : getRect().getHeight() - y; +		y = llround((F32)(getRect().getHeight() - y) * LLUI::sGLScaleFactor.mV[VY]);  	};  } diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 3c0436e27a..7f2a5e1642 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -51,7 +51,6 @@ public:  		Optional<std::string>	start_url;  		Optional<bool>			border_visible, -								ignore_ui_scale,  								hide_loading,  								decouple_texture_size,  								trusted_content, @@ -125,9 +124,6 @@ public:  		bool getFrequentUpdates() { return mFrequentUpdates; };  		void setFrequentUpdates( bool frequentUpdatesIn ) {  mFrequentUpdates = frequentUpdatesIn; }; -		void setIgnoreUIScale(bool ignore) { mIgnoreUIScale = ignore; } -		bool getIgnoreUIScale() { return mIgnoreUIScale; } -  		void setAlwaysRefresh(bool refresh) { mAlwaysRefresh = refresh; }  		bool getAlwaysRefresh() { return mAlwaysRefresh; } @@ -181,28 +177,29 @@ public:  		const S32 mTextureDepthBytes;  		LLUUID mMediaTextureID;  		LLViewBorder* mBorder; -		bool mFrequentUpdates; -		bool mForceUpdate; -		bool mTrusted; -		std::string mHomePageUrl; -		std::string mHomePageMimeType; -		std::string mCurrentNavUrl; -		std::string mErrorPageURL; -		std::string mTarget; -		bool mIgnoreUIScale; -		bool mAlwaysRefresh; +		bool	mFrequentUpdates, +				mForceUpdate, +				mTrusted, +				mAlwaysRefresh, +				mTakeFocusOnClick, +				mStretchToFill, +				mMaintainAspectRatio, +				mHideLoading, +				mHidingInitialLoad, +				mClearCache, +				mHoverTextChanged, +				mDecoupleTextureSize; + +		std::string mHomePageUrl, +					mHomePageMimeType, +					mCurrentNavUrl, +					mErrorPageURL, +					mTarget;  		viewer_media_t mMediaSource; -		bool mTakeFocusOnClick; -		bool mStretchToFill; -		bool mMaintainAspectRatio; -		bool mHideLoading; -		bool mHidingInitialLoad; -		bool mDecoupleTextureSize; -		S32 mTextureWidth; -		S32 mTextureHeight; -		bool mClearCache; +		S32 mTextureWidth, +			mTextureHeight; +  		class LLWindowShade* mWindowShade; -		bool mHoverTextChanged;  		LLContextMenu* mContextMenu;  }; diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 3418462192..a7303ad035 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -60,13 +60,9 @@ static const S32 RESIZE_BAR_THICKNESS = 3;  static LLRegisterPanelClassWrapper<LLNearbyChat> t_panel_nearby_chat("panel_nearby_chat"); -LLNearbyChat::LLNearbyChat()  -	: LLPanel() -	,mChatHistory(NULL) -{ -} - -LLNearbyChat::~LLNearbyChat() +LLNearbyChat::LLNearbyChat(const LLNearbyChat::Params& p)  +:	LLPanel(p), +	mChatHistory(NULL)  {  } @@ -178,15 +174,20 @@ bool	LLNearbyChat::onNearbyChatCheckContextMenuItem(const LLSD& userdata)  	return false;  } +void LLNearbyChat::removeScreenChat() +{ +	LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID"))); +	if(chat_channel) +	{ +		chat_channel->removeToastsFromChannel(); +	} +} +  void	LLNearbyChat::setVisible(BOOL visible)  {  	if(visible)  	{ -		LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID"))); -		if(chat_channel) -		{ -			chat_channel->removeToastsFromChannel(); -		} +		removeScreenChat();  	}  	LLPanel::setVisible(visible); diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index 5ef584c8ff..7c5975cbc5 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -37,8 +37,7 @@ class LLChatHistory;  class LLNearbyChat: public LLPanel  {  public: -	LLNearbyChat(); -	~LLNearbyChat(); +	LLNearbyChat(const Params& p = LLPanel::getDefaultParams());  	BOOL	postBuild			(); @@ -63,13 +62,14 @@ public:  	void loadHistory();  	static LLNearbyChat* getInstance(); +	void removeScreenChat();  private:  	void	getAllowedRect		(LLRect& rect);  	void	onNearbySpeakers	(); -	 +  private:  	LLHandle<LLView>	mPopupMenuHandle; diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 4674c85324..114472ba56 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -47,6 +47,7 @@  #include "llviewerwindow.h"  #include "llrootview.h"  #include "llviewerchat.h" +#include "llnearbychat.h"  #include "llresizehandle.h" @@ -401,11 +402,13 @@ void LLNearbyChatBar::onToggleNearbyChatPanel()  void LLNearbyChatBar::setMinimized(BOOL b)  { -	if (b != LLFloater::isMinimized()) +	LLNearbyChat* nearby_chat = getChild<LLNearbyChat>("nearby_chat"); +	// when unminimizing with nearby chat visible, go ahead and kill off screen chats +	if (!b && nearby_chat->getVisible())  	{ -		LLFloater::setMinimized(b); -		getChildView("nearby_chat")->setVisible(!b); +		nearby_chat->removeScreenChat();  	} +		LLFloater::setMinimized(b);  }  void LLNearbyChatBar::onChatBoxCommit() diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp index 2a08a29842..aa009a76fa 100644 --- a/indra/newview/llnotificationtiphandler.cpp +++ b/indra/newview/llnotificationtiphandler.cpp @@ -29,6 +29,7 @@  #include "llfloaterreg.h"  #include "llnearbychat.h" +#include "llnearbychatbar.h"  #include "llnotificationhandler.h"  #include "llnotifications.h"  #include "lltoastnotifypanel.h" @@ -93,7 +94,8 @@ bool LLTipHandler::processNotification(const LLSD& notify)  			// don't show toast if Nearby Chat is opened  			LLNearbyChat* nearby_chat = LLNearbyChat::getInstance(); -			if (nearby_chat->getVisible()) +			LLNearbyChatBar* nearby_chat_bar = LLNearbyChatBar::getInstance(); +			if (nearby_chat_bar->getVisible() && nearby_chat->getVisible())  			{  				return false;  			} diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp index 8477219f87..e66dd5690c 100644 --- a/indra/newview/llpanelgrouplandmoney.cpp +++ b/indra/newview/llpanelgrouplandmoney.cpp @@ -1431,7 +1431,7 @@ void LLGroupMoneyPlanningTabEventHandler::processReply(LLMessageSystem* msg,  	LLSD substitution;  	// We don't do time zone corrections of the calculated number of seconds  	// because we don't have a full time stamp, only a date. -	substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%m/%d/%Y", start_date); +	substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%Y-%m-%d", start_date);  	LLStringUtil::format (time_str, substitution);  	text.append(time_str); @@ -1442,7 +1442,7 @@ void LLGroupMoneyPlanningTabEventHandler::processReply(LLMessageSystem* msg,  		text.append(LLTrans::getString("NextStipendDay"));  		time_str = date_format_str; -		substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%m/%d/%Y", next_stipend_date); +		substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%Y-%m-%d", next_stipend_date);  		LLStringUtil::format (time_str, substitution);  		text.append(time_str); diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index a65631b8d8..c7454e85a9 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -1399,10 +1399,6 @@ static void filter_list(LLPlacesInventoryPanel* inventory_list, const std::strin  		inventory_list->restoreFolderState();  	} -	// Open the immediate children of the root folder, since those -	// are invisible in the UI and thus must always be open. -	inventory_list->getRootFolder()->openTopLevelFolders(); -  	if (inventory_list->getFilterSubString().empty() && string.empty())  	{  		// current filter and new filter empty, do nothing diff --git a/indra/newview/llpanelmarketplaceinbox.cpp b/indra/newview/llpanelmarketplaceinbox.cpp index ac528947a4..7cb4bbf891 100644 --- a/indra/newview/llpanelmarketplaceinbox.cpp +++ b/indra/newview/llpanelmarketplaceinbox.cpp @@ -151,6 +151,20 @@ U32 LLPanelMarketplaceInbox::getFreshItemCount() const  					fresh_item_count++;  				}  			} + +			LLFolderViewFolder::items_t::const_iterator items_it = inbox_folder->getItemsBegin(); +			LLFolderViewFolder::items_t::const_iterator items_end = inbox_folder->getItemsEnd(); + +			for (; items_it != items_end; ++items_it) +			{ +				const LLFolderViewItem * item_view = *items_it; +				const LLInboxFolderViewItem * inbox_item_view = dynamic_cast<const LLInboxFolderViewItem*>(item_view); + +				if (inbox_item_view && inbox_item_view->isFresh()) +				{ +					fresh_item_count++; +				} +			}  		}  	} @@ -171,6 +185,7 @@ U32 LLPanelMarketplaceInbox::getTotalItemCount() const  		if (inbox_folder)  		{  			item_count += inbox_folder->getFoldersCount(); +			item_count += inbox_folder->getItemsCount();  		}  	} diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp index 2e4bf55d51..df89adb8da 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.cpp +++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp @@ -45,6 +45,7 @@  static LLDefaultChildRegistry::Register<LLInboxInventoryPanel> r1("inbox_inventory_panel");  static LLDefaultChildRegistry::Register<LLInboxFolderViewFolder> r2("inbox_folder_view_folder"); +static LLDefaultChildRegistry::Register<LLInboxFolderViewItem> r3("inbox_folder_view_item");  // @@ -137,7 +138,7 @@ LLFolderViewFolder * LLInboxInventoryPanel::createFolderViewFolder(LLInvFVBridge  LLFolderViewItem * LLInboxInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge)  { -	LLFolderViewItem::Params params; +	LLInboxFolderViewItem::Params params;  	params.name = bridge->getDisplayName();  	params.icon = bridge->getIcon(); @@ -171,10 +172,6 @@ LLInboxFolderViewFolder::LLInboxFolderViewFolder(const Params& p)  #endif  } -LLInboxFolderViewFolder::~LLInboxFolderViewFolder() -{ -} -  // virtual  void LLInboxFolderViewFolder::draw()  { @@ -190,6 +187,20 @@ void LLInboxFolderViewFolder::draw()  	LLFolderViewFolder::draw();  } +void LLInboxFolderViewFolder::selectItem() +{ +	LLFolderViewFolder::selectItem(); + +	deFreshify(); +} + +void LLInboxFolderViewFolder::toggleOpen() +{ +	LLFolderViewFolder::toggleOpen(); + +	deFreshify(); +} +  void LLInboxFolderViewFolder::computeFreshness()  {  	const U32 last_expansion_utc = gSavedPerAccountSettings.getU32("LastInventoryInboxActivity"); @@ -218,20 +229,6 @@ void LLInboxFolderViewFolder::deFreshify()  	gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());  } -void LLInboxFolderViewFolder::selectItem() -{ -	LLFolderViewFolder::selectItem(); - -	deFreshify(); -} - -void LLInboxFolderViewFolder::toggleOpen() -{ -	LLFolderViewFolder::toggleOpen(); - -	deFreshify(); -} -  void LLInboxFolderViewFolder::setCreationDate(time_t creation_date_utc)  {   	mCreationDate = creation_date_utc;  @@ -246,9 +243,85 @@ void LLInboxFolderViewFolder::setCreationDate(time_t creation_date_utc)  // LLInboxFolderViewItem Implementation  // +LLInboxFolderViewItem::LLInboxFolderViewItem(const Params& p) +	: LLFolderViewItem(p) +	, LLBadgeOwner(getHandle()) +	, mFresh(false) +{ +#if SUPPORTING_FRESH_ITEM_COUNT +	initBadgeParams(p.new_badge()); +#endif +} + +BOOL LLInboxFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* root) +{ +	BOOL retval = LLFolderViewItem::addToFolder(folder, root); + +#if SUPPORTING_FRESH_ITEM_COUNT +	// Compute freshness if our parent is the root folder for the inbox +	if (mParentFolder == mRoot) +	{ +		computeFreshness(); +	} +#endif +	 +	return retval; +} +  BOOL LLInboxFolderViewItem::handleDoubleClick(S32 x, S32 y, MASK mask)  {  	return TRUE;  } +// virtual +void LLInboxFolderViewItem::draw() +{ +#if SUPPORTING_FRESH_ITEM_COUNT +	if (!badgeHasParent()) +	{ +		addBadgeToParentPanel(); +	} + +	setBadgeVisibility(mFresh); +#endif + +	LLFolderViewItem::draw(); +} + +void LLInboxFolderViewItem::selectItem() +{ +	LLFolderViewItem::selectItem(); + +	deFreshify(); +} + +void LLInboxFolderViewItem::computeFreshness() +{ +	const U32 last_expansion_utc = gSavedPerAccountSettings.getU32("LastInventoryInboxActivity"); + +	if (last_expansion_utc > 0) +	{ +		mFresh = (mCreationDate > last_expansion_utc); + +#if DEBUGGING_FRESHNESS +		if (mFresh) +		{ +			llinfos << "Item is fresh! -- creation " << mCreationDate << ", saved_freshness_date " << last_expansion_utc << llendl; +		} +#endif +	} +	else +	{ +		mFresh = true; +	} +} + +void LLInboxFolderViewItem::deFreshify() +{ +	mFresh = false; + +	gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected()); +} + +  // eof diff --git a/indra/newview/llpanelmarketplaceinboxinventory.h b/indra/newview/llpanelmarketplaceinboxinventory.h index 46eeb9ea7f..d6b827ee3e 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.h +++ b/indra/newview/llpanelmarketplaceinboxinventory.h @@ -69,16 +69,15 @@ public:  	};  	LLInboxFolderViewFolder(const Params& p); -	~LLInboxFolderViewFolder(); - +	  	void draw(); -	void computeFreshness(); -	void deFreshify(); -  	void selectItem();  	void toggleOpen(); +	void computeFreshness(); +	void deFreshify(); +  	bool isFresh() const { return mFresh; }  protected: @@ -88,15 +87,35 @@ protected:  }; -class LLInboxFolderViewItem : public LLFolderViewItem +class LLInboxFolderViewItem : public LLFolderViewItem, public LLBadgeOwner  {  public: -	LLInboxFolderViewItem(const Params& p) -		: LLFolderViewItem(p) +	struct Params : public LLInitParam::Block<Params, LLFolderViewItem::Params>  	{ -	} +		Optional<LLBadge::Params>	new_badge; + +		Params() +			: new_badge("new_badge") +		{ +		} +	}; +	LLInboxFolderViewItem(const Params& p); + +	BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root);  	BOOL handleDoubleClick(S32 x, S32 y, MASK mask); + +	void draw(); + +	void selectItem(); + +	void computeFreshness(); +	void deFreshify(); + +	bool isFresh() const { return mFresh; } + +protected: +	bool mFresh;  };  #endif //LL_INBOXINVENTORYPANEL_H diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index 72c6be4c79..04e78e04e3 100755 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -130,11 +130,11 @@ public:  	void createPick()  	{ -		LLSD params; -		params["id"] = gAgent.getID(); -		params["open_tab_name"] = "panel_picks"; -		params["show_tab_panel"] = "create_pick"; -		LLFloaterSidePanelContainer::showPanel("my_profile", params); +		// open the new pick panel on the Picks floater +		LLFloater* picks_floater = LLFloaterReg::showInstance("picks"); + +		LLPanelPicks* picks = picks_floater->findChild<LLPanelPicks>("panel_picks"); +		picks->createNewPick();  	}  	void editPick(LLPickData* pick_info) @@ -247,12 +247,11 @@ public:  	void createClassified()  	{ -		// open the new classified panel on the Me > Picks sidetray -		LLSD params; -		params["id"] = gAgent.getID(); -		params["open_tab_name"] = "panel_picks"; -		params["show_tab_panel"] = "create_classified"; -		LLFloaterSidePanelContainer::showPanel("my_profile", params); +		// open the new classified panel on the Picks floater +		LLFloater* picks_floater = LLFloaterReg::showInstance("picks"); + +		LLPanelPicks* picks = picks_floater->findChild<LLPanelPicks>("panel_picks"); +		picks->createNewClassified();  	}  	void openClassified(LLAvatarClassifiedInfo* c_info) diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h index 29db110523..3bb7413ac3 100755 --- a/indra/newview/llpanelpicks.h +++ b/indra/newview/llpanelpicks.h @@ -82,6 +82,9 @@ public:  	// parent panels failed to work (picks related code was in my profile panel)  	void setProfilePanel(LLPanelProfile* profile_panel); +	void createNewPick(); +	void createNewClassified(); +  protected:  	/*virtual*/void updateButtons(); @@ -115,9 +118,6 @@ private:  	bool onEnableMenuItem(const LLSD& user_data); -	void createNewPick(); -	void createNewClassified(); -  	void openPickInfo();  	void openClassifiedInfo();  	void openClassifiedInfo(const LLSD& params); diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 7f8f9b29af..6d321d4716 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -82,6 +82,7 @@ static const std::string CREATE_LANDMARK_INFO_TYPE	= "create_landmark";  static const std::string LANDMARK_INFO_TYPE			= "landmark";  static const std::string REMOTE_PLACE_INFO_TYPE		= "remote_place";  static const std::string TELEPORT_HISTORY_INFO_TYPE	= "teleport_history"; +static const std::string LANDMARK_TAB_INFO_TYPE     = "open_landmark_tab";  // Support for secondlife:///app/parcel/{UUID}/about SLapps  class LLParcelHandler : public LLCommandHandler @@ -365,83 +366,104 @@ void LLPanelPlaces::onOpen(const LLSD& key)  	if (key.size() != 0)  	{ -		mFilterEditor->clear(); -		onFilterEdit("", false); - -		mPlaceInfoType = key["type"].asString(); -		mPosGlobal.setZero(); -		mItem = NULL; -		isLandmarkEditModeOn = false; -		togglePlaceInfoPanel(TRUE); - -		if (mPlaceInfoType == AGENT_INFO_TYPE) +		std::string key_type = key["type"].asString(); +		if (key_type == LANDMARK_TAB_INFO_TYPE)  		{ -			mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT); +			// Small hack: We need to toggle twice. The first toggle moves from the Landmark  +			// or Teleport History info panel to the Landmark or Teleport History list panel. +			// For this first toggle, the mPlaceInfoType should be the one previously used so  +			// that the state can be corretly set. +			// The second toggle forces the list to be set to Landmark. +			// This avoids extracting and duplicating all the state logic from togglePlaceInfoPanel()  +			// here or some specific private method +			togglePlaceInfoPanel(FALSE); +			mPlaceInfoType = key_type; +			togglePlaceInfoPanel(FALSE); +			// Update the active tab +			onTabSelected(); +			// Update the buttons at the bottom of the panel +			updateVerbs();  		} -		else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE) +		else  		{ -			mLandmarkInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK); +			mFilterEditor->clear(); +			onFilterEdit("", false); -			if (key.has("x") && key.has("y") && key.has("z")) +			mPlaceInfoType = key_type; +			mPosGlobal.setZero(); +			mItem = NULL; +			isLandmarkEditModeOn = false; +			togglePlaceInfoPanel(TRUE); + +			if (mPlaceInfoType == AGENT_INFO_TYPE)  			{ -				mPosGlobal = LLVector3d(key["x"].asReal(), -										key["y"].asReal(), -										key["z"].asReal()); +				mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT);  			} -			else +			else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE)  			{ -				mPosGlobal = gAgent.getPositionGlobal(); +				mLandmarkInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK); + +				if (key.has("x") && key.has("y") && key.has("z")) +				{ +					mPosGlobal = LLVector3d(key["x"].asReal(), +											key["y"].asReal(), +											key["z"].asReal()); +				} +				else +				{ +					mPosGlobal = gAgent.getPositionGlobal(); +				} + +				mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal); + +				mSaveBtn->setEnabled(FALSE);  			} - -			mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal); - -			mSaveBtn->setEnabled(FALSE); -		} -		else if (mPlaceInfoType == LANDMARK_INFO_TYPE) -		{ -			mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK); - -			LLInventoryItem* item = gInventory.getItem(key["id"].asUUID()); -			if (!item) -				return; - -			setItem(item); -		} -		else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE) -		{ -			if (key.has("id")) +			else if (mPlaceInfoType == LANDMARK_INFO_TYPE)  			{ -				LLUUID parcel_id = key["id"].asUUID(); -				mPlaceProfile->setParcelID(parcel_id); +				mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK); -				// query the server to get the global 3D position of this -				// parcel - we need this for teleport/mapping functions. -				mRemoteParcelObserver->setParcelID(parcel_id); +				LLInventoryItem* item = gInventory.getItem(key["id"].asUUID()); +				if (!item) +					return; + +				setItem(item);  			} -			else +			else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)  			{ -				mPosGlobal = LLVector3d(key["x"].asReal(), -										key["y"].asReal(), -										key["z"].asReal()); -				mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); +				if (key.has("id")) +				{ +					LLUUID parcel_id = key["id"].asUUID(); +					mPlaceProfile->setParcelID(parcel_id); + +					// query the server to get the global 3D position of this +					// parcel - we need this for teleport/mapping functions. +					mRemoteParcelObserver->setParcelID(parcel_id); +				} +				else +				{ +					mPosGlobal = LLVector3d(key["x"].asReal(), +											key["y"].asReal(), +											key["z"].asReal()); +					mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); +				} + +				mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE);  			} +			else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) +			{ +				S32 index = key["id"].asInteger(); -			mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE); -		} -		else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) -		{ -			S32 index = key["id"].asInteger(); +				const LLTeleportHistoryStorage::slurl_list_t& hist_items = +							LLTeleportHistoryStorage::getInstance()->getItems(); -			const LLTeleportHistoryStorage::slurl_list_t& hist_items = -						LLTeleportHistoryStorage::getInstance()->getItems(); +				mPosGlobal = hist_items[index].mGlobalPos; -			mPosGlobal = hist_items[index].mGlobalPos; +				mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY); +				mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); +			} -			mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY); -			mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); +			updateVerbs();  		} - -		updateVerbs();  	}  	LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); @@ -942,7 +964,8 @@ void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible)  		}  	}  	else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE || -			 mPlaceInfoType == LANDMARK_INFO_TYPE) +			 mPlaceInfoType == LANDMARK_INFO_TYPE || +			 mPlaceInfoType == LANDMARK_TAB_INFO_TYPE)  	{  		mLandmarkInfo->setVisible(visible); @@ -960,13 +983,15 @@ void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible)  		{  			LLLandmarksPanel* landmarks_panel =  					dynamic_cast<LLLandmarksPanel*>(mTabContainer->getPanelByName("Landmarks")); -			if (landmarks_panel && mItem.notNull()) +			if (landmarks_panel)  			{  				// If a landmark info is being closed we open the landmarks tab  				// and set this landmark selected.  				mTabContainer->selectTabPanel(landmarks_panel); - -				landmarks_panel->setItemSelected(mItem->getUUID(), TRUE); +				if (mItem.notNull()) +				{ +					landmarks_panel->setItemSelected(mItem->getUUID(), TRUE); +				}  			}  		}  	} @@ -1163,7 +1188,8 @@ LLPanelPlaceInfo* LLPanelPlaces::getCurrentInfoPanel()  		return mPlaceProfile;  	}  	else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE || -			 mPlaceInfoType == LANDMARK_INFO_TYPE) +			 mPlaceInfoType == LANDMARK_INFO_TYPE || +			 mPlaceInfoType == LANDMARK_TAB_INFO_TYPE)  	{  		return mLandmarkInfo;  	} diff --git a/indra/newview/llpanelsnapshot.cpp b/indra/newview/llpanelsnapshot.cpp new file mode 100644 index 0000000000..fdae521ac5 --- /dev/null +++ b/indra/newview/llpanelsnapshot.cpp @@ -0,0 +1,195 @@ +/**  + * @file llpanelsnapshot.cpp + * @brief Snapshot panel base class + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llpanelsnapshot.h" + +// libs +#include "llcombobox.h" +#include "llsliderctrl.h" +#include "llspinctrl.h" +#include "lltrans.h" + +// newview +#include "llsidetraypanelcontainer.h" +#include "llviewercontrol.h" // gSavedSettings + +// virtual +BOOL LLPanelSnapshot::postBuild() +{ +	getChild<LLUICtrl>(getImageSizeComboName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onResolutionComboCommit, this, _1)); +	getChild<LLUICtrl>(getWidthSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onCustomResolutionCommit, this)); +	getChild<LLUICtrl>(getHeightSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onCustomResolutionCommit, this)); +	getChild<LLUICtrl>(getAspectRatioCBName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onKeepAspectRatioCommit, this, _1)); + +	updateControls(LLSD()); +	return TRUE; +} + +// virtual +void LLPanelSnapshot::onOpen(const LLSD& key) +{ +	S32 old_format = gSavedSettings.getS32("SnapshotFormat"); +	S32 new_format = (S32) getImageFormat(); + +	gSavedSettings.setS32("SnapshotFormat", new_format); +	setCtrlsEnabled(true); + +	// Switching panels will likely change image format. +	// Not updating preview right away may lead to errors, +	// e.g. attempt to send a large BMP image by email. +	if (old_format != new_format) +	{ +		LLFloaterSnapshot::getInstance()->notify(LLSD().with("image-format-change", true)); +	} + +	updateCustomResControls(); +} + +LLFloaterSnapshot::ESnapshotFormat LLPanelSnapshot::getImageFormat() const +{ +	return LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG; +} + +LLSpinCtrl* LLPanelSnapshot::getWidthSpinner() +{ +	return getChild<LLSpinCtrl>(getWidthSpinnerName()); +} + +LLSpinCtrl* LLPanelSnapshot::getHeightSpinner() +{ +	return getChild<LLSpinCtrl>(getHeightSpinnerName()); +} + +S32 LLPanelSnapshot::getTypedPreviewWidth() const +{ +	return getChild<LLUICtrl>(getWidthSpinnerName())->getValue().asInteger(); +} + +S32 LLPanelSnapshot::getTypedPreviewHeight() const +{ +	return getChild<LLUICtrl>(getHeightSpinnerName())->getValue().asInteger(); +} + +void LLPanelSnapshot::enableAspectRatioCheckbox(BOOL enable) +{ +	getChild<LLUICtrl>(getAspectRatioCBName())->setEnabled(enable); +} + +LLSideTrayPanelContainer* LLPanelSnapshot::getParentContainer() +{ +	LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent()); +	if (!parent) +	{ +		llwarns << "Cannot find panel container" << llendl; +		return NULL; +	} + +	return parent; +} + +// virtual +void LLPanelSnapshot::updateCustomResControls() +{ +	LLComboBox* combo = getChild<LLComboBox>(getImageSizeComboName()); +	S32 selected_idx = combo->getFirstSelectedIndex(); +	const bool enable = selected_idx == (combo->getItemCount() - 1); // Current Window or Custom selected + +	getChild<LLUICtrl>(getWidthSpinnerName())->setEnabled(enable); +	getChild<LLSpinCtrl>(getWidthSpinnerName())->setAllowEdit(enable); +	getChild<LLUICtrl>(getHeightSpinnerName())->setEnabled(enable); +	getChild<LLSpinCtrl>(getHeightSpinnerName())->setAllowEdit(enable); +	enableAspectRatioCheckbox(enable); +} + +void LLPanelSnapshot::updateImageQualityLevel() +{ +	LLSliderCtrl* quality_slider = getChild<LLSliderCtrl>("image_quality_slider"); +	S32 quality_val = llfloor((F32) quality_slider->getValue().asReal()); + +	std::string quality_lvl; + +	if (quality_val < 20) +	{ +		quality_lvl = LLTrans::getString("snapshot_quality_very_low"); +	} +	else if (quality_val < 40) +	{ +		quality_lvl = LLTrans::getString("snapshot_quality_low"); +	} +	else if (quality_val < 60) +	{ +		quality_lvl = LLTrans::getString("snapshot_quality_medium"); +	} +	else if (quality_val < 80) +	{ +		quality_lvl = LLTrans::getString("snapshot_quality_high"); +	} +	else +	{ +		quality_lvl = LLTrans::getString("snapshot_quality_very_high"); +	} + +	getChild<LLTextBox>("image_quality_level")->setTextArg("[QLVL]", quality_lvl); +} + +void LLPanelSnapshot::goBack() +{ +	LLSideTrayPanelContainer* parent = getParentContainer(); +	if (parent) +	{ +		parent->openPreviousPanel(); +		parent->getCurrentPanel()->onOpen(LLSD()); +	} +} + +void LLPanelSnapshot::cancel() +{ +	goBack(); +	LLFloaterSnapshot::getInstance()->notify(LLSD().with("set-ready", true)); +} + +void LLPanelSnapshot::onCustomResolutionCommit() +{ +	LLSD info; +	info["w"] = getChild<LLUICtrl>(getWidthSpinnerName())->getValue().asInteger(); +	info["h"] = getChild<LLUICtrl>(getHeightSpinnerName())->getValue().asInteger(); +	LLFloaterSnapshot::getInstance()->notify(LLSD().with("custom-res-change", info)); +} + +void LLPanelSnapshot::onResolutionComboCommit(LLUICtrl* ctrl) +{ +	updateCustomResControls(); + +	LLSD info; +	info["combo-res-change"]["control-name"] = ctrl->getName(); +	LLFloaterSnapshot::getInstance()->notify(info); +} + +void LLPanelSnapshot::onKeepAspectRatioCommit(LLUICtrl* ctrl) +{ +	LLFloaterSnapshot::getInstance()->notify(LLSD().with("keep-aspect-change", ctrl->getValue().asBoolean())); +} diff --git a/indra/newview/llpanelsnapshot.h b/indra/newview/llpanelsnapshot.h new file mode 100644 index 0000000000..a49782a3e0 --- /dev/null +++ b/indra/newview/llpanelsnapshot.h @@ -0,0 +1,69 @@ +/**  + * @file llpanelsnapshot.h + * @brief Snapshot panel base class + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLPANELSNAPSHOT_H +#define LL_LLPANELSNAPSHOT_H + +#include "llfloatersnapshot.h" + +class LLSideTrayPanelContainer; + +/** + * Snapshot panel base class. + */ +class LLPanelSnapshot: public LLPanel +{ +public: +	/*virtual*/ BOOL postBuild(); +	/*virtual*/ void onOpen(const LLSD& key); + +	virtual std::string getWidthSpinnerName() const = 0; +	virtual std::string getHeightSpinnerName() const = 0; +	virtual std::string getAspectRatioCBName() const = 0; +	virtual std::string getImageSizeComboName() const = 0; + +	virtual S32 getTypedPreviewWidth() const; +	virtual S32 getTypedPreviewHeight() const; +	virtual LLSpinCtrl* getWidthSpinner(); +	virtual LLSpinCtrl* getHeightSpinner(); +	virtual void enableAspectRatioCheckbox(BOOL enable); +	virtual LLFloaterSnapshot::ESnapshotFormat getImageFormat() const; +	virtual void updateControls(const LLSD& info) = 0; ///< Update controls from saved settings + +protected: +	LLSideTrayPanelContainer* getParentContainer(); +	virtual void updateCustomResControls(); +	void updateImageQualityLevel(); +	void goBack(); ///< Switch to the default (Snapshot Options) panel +	void cancel(); + +	// common UI callbacks +	void onCustomResolutionCommit(); +	void onResolutionComboCommit(LLUICtrl* ctrl); +	void onKeepAspectRatioCommit(LLUICtrl* ctrl); +}; + +#endif // LL_LLPANELSNAPSHOT_H diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp new file mode 100644 index 0000000000..63ccbc1b02 --- /dev/null +++ b/indra/newview/llpanelsnapshotinventory.cpp @@ -0,0 +1,109 @@ +/**  + * @file llpanelsnapshotinventory.cpp + * @brief The panel provides UI for saving snapshot as an inventory texture. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llcombobox.h" +#include "lleconomy.h" +#include "llsidetraypanelcontainer.h" +#include "llspinctrl.h" + +#include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model +#include "llpanelsnapshot.h" +#include "llviewercontrol.h" // gSavedSettings + +/** + * The panel provides UI for saving snapshot as an inventory texture. + */ +class LLPanelSnapshotInventory +:	public LLPanelSnapshot +{ +	LOG_CLASS(LLPanelSnapshotInventory); + +public: +	LLPanelSnapshotInventory(); +	/*virtual*/ BOOL postBuild(); +	/*virtual*/ void onOpen(const LLSD& key); + +private: +	/*virtual*/ void updateCustomResControls(); ///< Show/hide custom resolution controls (spinners and checkbox) +	/*virtual*/ std::string getWidthSpinnerName() const		{ return "inventory_snapshot_width"; } +	/*virtual*/ std::string getHeightSpinnerName() const	{ return "inventory_snapshot_height"; } +	/*virtual*/ std::string getAspectRatioCBName() const	{ return "inventory_keep_aspect_check"; } +	/*virtual*/ std::string getImageSizeComboName() const	{ return "texture_size_combo"; } +	/*virtual*/ void updateControls(const LLSD& info); + +	void onSend(); +}; + +static LLRegisterPanelClassWrapper<LLPanelSnapshotInventory> panel_class("llpanelsnapshotinventory"); + +LLPanelSnapshotInventory::LLPanelSnapshotInventory() +{ +	mCommitCallbackRegistrar.add("Inventory.Save",		boost::bind(&LLPanelSnapshotInventory::onSend,		this)); +	mCommitCallbackRegistrar.add("Inventory.Cancel",	boost::bind(&LLPanelSnapshotInventory::cancel,		this)); +} + +// virtual +BOOL LLPanelSnapshotInventory::postBuild() +{ +	return LLPanelSnapshot::postBuild(); +} + +// virtual +void LLPanelSnapshotInventory::onOpen(const LLSD& key) +{ +	getChild<LLUICtrl>("hint_lbl")->setTextArg("[UPLOAD_COST]", llformat("%d", LLGlobalEconomy::Singleton::getInstance()->getPriceUpload())); +	LLPanelSnapshot::onOpen(key); +} + +// virtual +void LLPanelSnapshotInventory::updateCustomResControls() +{ +	LLComboBox* combo = getChild<LLComboBox>(getImageSizeComboName()); +	S32 selected_idx = combo->getFirstSelectedIndex(); +	const bool show = selected_idx == (combo->getItemCount() - 1); // Custom selected + +	getChild<LLUICtrl>(getWidthSpinnerName())->setVisible(show); +	getChild<LLUICtrl>(getHeightSpinnerName())->setVisible(show); +	getChild<LLUICtrl>(getAspectRatioCBName())->setVisible(show); + +	// enable controls if possible +	LLPanelSnapshot::updateCustomResControls(); +} + +// virtual +void LLPanelSnapshotInventory::updateControls(const LLSD& info) +{ +	const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true; +	getChild<LLUICtrl>("save_btn")->setEnabled(have_snapshot); +} + +void LLPanelSnapshotInventory::onSend() +{ +	LLFloaterSnapshot::saveTexture(); +	LLFloaterSnapshot::postSave(); +} diff --git a/indra/newview/llpanelsnapshotlocal.cpp b/indra/newview/llpanelsnapshotlocal.cpp new file mode 100644 index 0000000000..eaa27b8d41 --- /dev/null +++ b/indra/newview/llpanelsnapshotlocal.cpp @@ -0,0 +1,154 @@ +/**  + * @file llpanelsnapshotlocal.cpp + * @brief The panel provides UI for saving snapshot to a local folder. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llcombobox.h" +#include "llsidetraypanelcontainer.h" +#include "llsliderctrl.h" +#include "llspinctrl.h" + +#include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model +#include "llpanelsnapshot.h" +#include "llviewercontrol.h" // gSavedSettings + +/** + * The panel provides UI for saving snapshot to a local folder. + */ +class LLPanelSnapshotLocal +:	public LLPanelSnapshot +{ +	LOG_CLASS(LLPanelSnapshotLocal); + +public: +	LLPanelSnapshotLocal(); +	/*virtual*/ BOOL postBuild(); +	/*virtual*/ void onOpen(const LLSD& key); + +private: +	/*virtual*/ std::string getWidthSpinnerName() const		{ return "local_snapshot_width"; } +	/*virtual*/ std::string getHeightSpinnerName() const	{ return "local_snapshot_height"; } +	/*virtual*/ std::string getAspectRatioCBName() const	{ return "local_keep_aspect_check"; } +	/*virtual*/ std::string getImageSizeComboName() const	{ return "local_size_combo"; } +	/*virtual*/ LLFloaterSnapshot::ESnapshotFormat getImageFormat() const; +	/*virtual*/ void updateControls(const LLSD& info); + +	void onFormatComboCommit(LLUICtrl* ctrl); +	void onQualitySliderCommit(LLUICtrl* ctrl); +	void onSend(); +}; + +static LLRegisterPanelClassWrapper<LLPanelSnapshotLocal> panel_class("llpanelsnapshotlocal"); + +LLPanelSnapshotLocal::LLPanelSnapshotLocal() +{ +	mCommitCallbackRegistrar.add("Local.Save",		boost::bind(&LLPanelSnapshotLocal::onSend,		this)); +	mCommitCallbackRegistrar.add("Local.Cancel",	boost::bind(&LLPanelSnapshotLocal::cancel,		this)); +} + +// virtual +BOOL LLPanelSnapshotLocal::postBuild() +{ +	getChild<LLUICtrl>("image_quality_slider")->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onQualitySliderCommit, this, _1)); +	getChild<LLUICtrl>("local_format_combo")->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onFormatComboCommit, this, _1)); + +	return LLPanelSnapshot::postBuild(); +} + +// virtual +void LLPanelSnapshotLocal::onOpen(const LLSD& key) +{ +	LLPanelSnapshot::onOpen(key); +} + +// virtual +LLFloaterSnapshot::ESnapshotFormat LLPanelSnapshotLocal::getImageFormat() const +{ +	LLFloaterSnapshot::ESnapshotFormat fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG; + +	LLComboBox* local_format_combo = getChild<LLComboBox>("local_format_combo"); +	const std::string id  = local_format_combo->getValue().asString(); +	if (id == "PNG") +	{ +		fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG; +	} +	else if (id == "JPEG") +	{ +		fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG; +	} +	else if (id == "BMP") +	{ +		fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP; +	} + +	return fmt; +} + +// virtual +void LLPanelSnapshotLocal::updateControls(const LLSD& info) +{ +	LLFloaterSnapshot::ESnapshotFormat fmt = +		(LLFloaterSnapshot::ESnapshotFormat) gSavedSettings.getS32("SnapshotFormat"); +	getChild<LLComboBox>("local_format_combo")->selectNthItem((S32) fmt); + +	const bool show_quality_ctrls = (fmt == LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG); +	getChild<LLUICtrl>("image_quality_slider")->setVisible(show_quality_ctrls); +	getChild<LLUICtrl>("image_quality_level")->setVisible(show_quality_ctrls); + +	getChild<LLUICtrl>("image_quality_slider")->setValue(gSavedSettings.getS32("SnapshotQuality")); +	updateImageQualityLevel(); + +	const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true; +	getChild<LLUICtrl>("save_btn")->setEnabled(have_snapshot); +} + +void LLPanelSnapshotLocal::onFormatComboCommit(LLUICtrl* ctrl) +{ +	// will call updateControls() +	LLFloaterSnapshot::getInstance()->notify(LLSD().with("image-format-change", true)); +} + +void LLPanelSnapshotLocal::onQualitySliderCommit(LLUICtrl* ctrl) +{ +	updateImageQualityLevel(); + +	LLSliderCtrl* slider = (LLSliderCtrl*)ctrl; +	S32 quality_val = llfloor((F32)slider->getValue().asReal()); +	LLSD info; +	info["image-quality-change"] = quality_val; +	LLFloaterSnapshot::getInstance()->notify(info); +} + +void LLPanelSnapshotLocal::onSend() +{ +	LLFloaterSnapshot* floater = LLFloaterSnapshot::getInstance(); + +	floater->notify(LLSD().with("set-working", true)); +	LLFloaterSnapshot::saveLocal(); +	LLFloaterSnapshot::postSave(); +	goBack(); +	floater->notify(LLSD().with("set-finished", LLSD().with("ok", true).with("msg", "local"))); +} diff --git a/indra/newview/llpanelsnapshotoptions.cpp b/indra/newview/llpanelsnapshotoptions.cpp new file mode 100644 index 0000000000..df904b6836 --- /dev/null +++ b/indra/newview/llpanelsnapshotoptions.cpp @@ -0,0 +1,104 @@ +/**  + * @file llpanelsnapshotoptions.cpp + * @brief Snapshot posting options panel. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "lleconomy.h" +#include "llpanel.h" +#include "llsidetraypanelcontainer.h" + +#include "llfloatersnapshot.h" // FIXME: create a snapshot model + +/** + * Provides several ways to save a snapshot. + */ +class LLPanelSnapshotOptions +:	public LLPanel +{ +	LOG_CLASS(LLPanelSnapshotOptions); + +public: +	LLPanelSnapshotOptions(); +	/*virtual*/ void onOpen(const LLSD& key); + +private: +	void openPanel(const std::string& panel_name); +	void onSaveToProfile(); +	void onSaveToEmail(); +	void onSaveToInventory(); +	void onSaveToComputer(); +}; + +static LLRegisterPanelClassWrapper<LLPanelSnapshotOptions> panel_class("llpanelsnapshotoptions"); + +LLPanelSnapshotOptions::LLPanelSnapshotOptions() +{ +	mCommitCallbackRegistrar.add("Snapshot.SaveToProfile",		boost::bind(&LLPanelSnapshotOptions::onSaveToProfile,	this)); +	mCommitCallbackRegistrar.add("Snapshot.SaveToEmail",		boost::bind(&LLPanelSnapshotOptions::onSaveToEmail,		this)); +	mCommitCallbackRegistrar.add("Snapshot.SaveToInventory",	boost::bind(&LLPanelSnapshotOptions::onSaveToInventory,	this)); +	mCommitCallbackRegistrar.add("Snapshot.SaveToComputer",		boost::bind(&LLPanelSnapshotOptions::onSaveToComputer,	this)); +} + +// virtual +void LLPanelSnapshotOptions::onOpen(const LLSD& key) +{ +	S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); +	getChild<LLUICtrl>("save_to_inventory_btn")->setLabelArg("[AMOUNT]", llformat("%d", upload_cost)); +} + +void LLPanelSnapshotOptions::openPanel(const std::string& panel_name) +{ +	LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent()); +	if (!parent) +	{ +		llwarns << "Cannot find panel container" << llendl; +		return; +	} + +	parent->openPanel(panel_name); +	parent->getCurrentPanel()->onOpen(LLSD()); +	LLFloaterSnapshot::postPanelSwitch(); +} + +void LLPanelSnapshotOptions::onSaveToProfile() +{ +	openPanel("panel_snapshot_profile"); +} + +void LLPanelSnapshotOptions::onSaveToEmail() +{ +	openPanel("panel_snapshot_postcard"); +} + +void LLPanelSnapshotOptions::onSaveToInventory() +{ +	openPanel("panel_snapshot_inventory"); +} + +void LLPanelSnapshotOptions::onSaveToComputer() +{ +	openPanel("panel_snapshot_local"); +} diff --git a/indra/newview/llpanelsnapshotpostcard.cpp b/indra/newview/llpanelsnapshotpostcard.cpp new file mode 100644 index 0000000000..6867c7af4e --- /dev/null +++ b/indra/newview/llpanelsnapshotpostcard.cpp @@ -0,0 +1,269 @@ +/**  + * @file llpanelsnapshotpostcard.cpp + * @brief Postcard sending panel. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llcombobox.h" +#include "llnotificationsutil.h" +#include "llsidetraypanelcontainer.h" +#include "llsliderctrl.h" +#include "llspinctrl.h" +#include "lltexteditor.h" + +#include "llagent.h" +#include "llagentui.h" +#include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model +#include "llpanelsnapshot.h" +#include "llpostcard.h" +#include "llviewercontrol.h" // gSavedSettings +#include "llviewerwindow.h" + +#include <boost/regex.hpp> + +/** + * Sends postcard via email. + */ +class LLPanelSnapshotPostcard +:	public LLPanelSnapshot +{ +	LOG_CLASS(LLPanelSnapshotPostcard); + +public: +	LLPanelSnapshotPostcard(); +	/*virtual*/ BOOL postBuild(); +	/*virtual*/ void onOpen(const LLSD& key); +	/*virtual*/ S32	notify(const LLSD& info); + +private: +	/*virtual*/ std::string getWidthSpinnerName() const		{ return "postcard_snapshot_width"; } +	/*virtual*/ std::string getHeightSpinnerName() const	{ return "postcard_snapshot_height"; } +	/*virtual*/ std::string getAspectRatioCBName() const	{ return "postcard_keep_aspect_check"; } +	/*virtual*/ std::string getImageSizeComboName() const	{ return "postcard_size_combo"; } +	/*virtual*/ LLFloaterSnapshot::ESnapshotFormat getImageFormat() const { return LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG; } +	/*virtual*/ void updateControls(const LLSD& info); + +	bool missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response); +	void sendPostcard(); + +	void onMsgFormFocusRecieved(); +	void onFormatComboCommit(LLUICtrl* ctrl); +	void onQualitySliderCommit(LLUICtrl* ctrl); +	void onTabButtonPress(S32 btn_idx); +	void onSend(); + +	bool mHasFirstMsgFocus; +	std::string mAgentEmail; +}; + +static LLRegisterPanelClassWrapper<LLPanelSnapshotPostcard> panel_class("llpanelsnapshotpostcard"); + +LLPanelSnapshotPostcard::LLPanelSnapshotPostcard() +:	mHasFirstMsgFocus(false) +{ +	mCommitCallbackRegistrar.add("Postcard.Send",		boost::bind(&LLPanelSnapshotPostcard::onSend,	this)); +	mCommitCallbackRegistrar.add("Postcard.Cancel",		boost::bind(&LLPanelSnapshotPostcard::cancel,	this)); +	mCommitCallbackRegistrar.add("Postcard.Message",	boost::bind(&LLPanelSnapshotPostcard::onTabButtonPress,	this, 0)); +	mCommitCallbackRegistrar.add("Postcard.Settings",	boost::bind(&LLPanelSnapshotPostcard::onTabButtonPress,	this, 1)); + +} + +// virtual +BOOL LLPanelSnapshotPostcard::postBuild() +{ +	// pick up the user's up-to-date email address +	gAgent.sendAgentUserInfoRequest(); + +	std::string name_string; +	LLAgentUI::buildFullname(name_string); +	getChild<LLUICtrl>("name_form")->setValue(LLSD(name_string)); + +	// For the first time a user focuses to .the msg box, all text will be selected. +	getChild<LLUICtrl>("msg_form")->setFocusChangedCallback(boost::bind(&LLPanelSnapshotPostcard::onMsgFormFocusRecieved, this)); + +	getChild<LLUICtrl>("to_form")->setFocus(TRUE); + +	getChild<LLUICtrl>("image_quality_slider")->setCommitCallback(boost::bind(&LLPanelSnapshotPostcard::onQualitySliderCommit, this, _1)); + +	getChild<LLButton>("message_btn")->setToggleState(TRUE); + +	return LLPanelSnapshot::postBuild(); +} + +// virtual +void LLPanelSnapshotPostcard::onOpen(const LLSD& key) +{ +	LLPanelSnapshot::onOpen(key); +} + +// virtual +S32 LLPanelSnapshotPostcard::notify(const LLSD& info) +{ +	if (!info.has("agent-email")) +	{ +		llassert(info.has("agent-email")); +		return 0; +	} + +	if (mAgentEmail.empty()) +	{ +		mAgentEmail = info["agent-email"].asString(); +	} + +	return 1; +} + +// virtual +void LLPanelSnapshotPostcard::updateControls(const LLSD& info) +{ +	getChild<LLUICtrl>("image_quality_slider")->setValue(gSavedSettings.getS32("SnapshotQuality")); +	updateImageQualityLevel(); + +	const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true; +	getChild<LLUICtrl>("send_btn")->setEnabled(have_snapshot); +} + +bool LLPanelSnapshotPostcard::missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +	if(0 == option) +	{ +		// User clicked OK +		if((getChild<LLUICtrl>("subject_form")->getValue().asString()).empty()) +		{ +			// Stuff the subject back into the form. +			getChild<LLUICtrl>("subject_form")->setValue(getString("default_subject")); +		} + +		if (!mHasFirstMsgFocus) +		{ +			// The user never switched focus to the message window. +			// Using the default string. +			getChild<LLUICtrl>("msg_form")->setValue(getString("default_message")); +		} + +		sendPostcard(); +	} +	return false; +} + + +void LLPanelSnapshotPostcard::sendPostcard() +{ +	std::string to(getChild<LLUICtrl>("to_form")->getValue().asString()); +	std::string subject(getChild<LLUICtrl>("subject_form")->getValue().asString()); + +	LLSD postcard = LLSD::emptyMap(); +	postcard["pos-global"] = LLFloaterSnapshot::getPosTakenGlobal().getValue(); +	postcard["to"] = to; +	postcard["from"] = mAgentEmail; +	postcard["name"] = getChild<LLUICtrl>("name_form")->getValue().asString(); +	postcard["subject"] = subject; +	postcard["msg"] = getChild<LLUICtrl>("msg_form")->getValue().asString(); +	LLPostCard::send(LLFloaterSnapshot::getImageData(), postcard); + +	// Give user feedback of the event. +	gViewerWindow->playSnapshotAnimAndSound(); + +	LLFloaterSnapshot::postSave(); +} + +void LLPanelSnapshotPostcard::onMsgFormFocusRecieved() +{ +	LLTextEditor* msg_form = getChild<LLTextEditor>("msg_form"); +	if (msg_form->hasFocus() && !mHasFirstMsgFocus) +	{ +		mHasFirstMsgFocus = true; +		msg_form->setText(LLStringUtil::null); +	} +} + +void LLPanelSnapshotPostcard::onFormatComboCommit(LLUICtrl* ctrl) +{ +	// will call updateControls() +	LLFloaterSnapshot::getInstance()->notify(LLSD().with("image-format-change", true)); +} + +void LLPanelSnapshotPostcard::onQualitySliderCommit(LLUICtrl* ctrl) +{ +	updateImageQualityLevel(); + +	LLSliderCtrl* slider = (LLSliderCtrl*)ctrl; +	S32 quality_val = llfloor((F32)slider->getValue().asReal()); +	LLSD info; +	info["image-quality-change"] = quality_val; +	LLFloaterSnapshot::getInstance()->notify(info); // updates the "SnapshotQuality" setting +} + +void LLPanelSnapshotPostcard::onTabButtonPress(S32 btn_idx) +{ +	LLButton* buttons[2] = { +			getChild<LLButton>("message_btn"), +			getChild<LLButton>("settings_btn"), +	}; + +	// Switch between Message and Settings tabs. +	LLButton* clicked_btn = buttons[btn_idx]; +	LLButton* other_btn = buttons[!btn_idx]; +	LLSideTrayPanelContainer* container = +		getChild<LLSideTrayPanelContainer>("postcard_panel_container"); + +	container->selectTab(clicked_btn->getToggleState() ? btn_idx : !btn_idx); +	//clicked_btn->setEnabled(FALSE); +	other_btn->toggleState(); +	//other_btn->setEnabled(TRUE); + +	lldebugs << "Button #" << btn_idx << " (" << clicked_btn->getName() << ") clicked" << llendl; +} + +void LLPanelSnapshotPostcard::onSend() +{ +	// Validate input. +	std::string to(getChild<LLUICtrl>("to_form")->getValue().asString()); + +	boost::regex email_format("[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}(,[ \t]*[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,})*"); + +	if (to.empty() || !boost::regex_match(to, email_format)) +	{ +		LLNotificationsUtil::add("PromptRecipientEmail"); +		return; +	} + +	if (mAgentEmail.empty() || !boost::regex_match(mAgentEmail, email_format)) +	{ +		LLNotificationsUtil::add("PromptSelfEmail"); +		return; +	} + +	std::string subject(getChild<LLUICtrl>("subject_form")->getValue().asString()); +	if(subject.empty() || !mHasFirstMsgFocus) +	{ +		LLNotificationsUtil::add("PromptMissingSubjMsg", LLSD(), LLSD(), boost::bind(&LLPanelSnapshotPostcard::missingSubjMsgAlertCallback, this, _1, _2)); +		return; +	} + +	// Send postcard. +	sendPostcard(); +} diff --git a/indra/newview/llpanelsnapshotprofile.cpp b/indra/newview/llpanelsnapshotprofile.cpp new file mode 100644 index 0000000000..89245fc804 --- /dev/null +++ b/indra/newview/llpanelsnapshotprofile.cpp @@ -0,0 +1,100 @@ +/**  + * @file llpanelsnapshotprofile.cpp + * @brief Posts a snapshot to My Profile feed. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +// libs +#include "llcombobox.h" +#include "llfloaterreg.h" +#include "llpanel.h" +#include "llspinctrl.h" + +// newview +#include "llfloatersnapshot.h" +#include "llpanelsnapshot.h" +#include "llsidetraypanelcontainer.h" +#include "llwebprofile.h" + +/** + * Posts a snapshot to My Profile feed. + */ +class LLPanelSnapshotProfile +:	public LLPanelSnapshot +{ +	LOG_CLASS(LLPanelSnapshotProfile); + +public: +	LLPanelSnapshotProfile(); + +	/*virtual*/ BOOL postBuild(); +	/*virtual*/ void onOpen(const LLSD& key); + +private: +	/*virtual*/ std::string getWidthSpinnerName() const		{ return "profile_snapshot_width"; } +	/*virtual*/ std::string getHeightSpinnerName() const	{ return "profile_snapshot_height"; } +	/*virtual*/ std::string getAspectRatioCBName() const	{ return "profile_keep_aspect_check"; } +	/*virtual*/ std::string getImageSizeComboName() const	{ return "profile_size_combo"; } +	/*virtual*/ LLFloaterSnapshot::ESnapshotFormat getImageFormat() const { return LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG; } +	/*virtual*/ void updateControls(const LLSD& info); + +	void onSend(); +}; + +static LLRegisterPanelClassWrapper<LLPanelSnapshotProfile> panel_class("llpanelsnapshotprofile"); + +LLPanelSnapshotProfile::LLPanelSnapshotProfile() +{ +	mCommitCallbackRegistrar.add("PostToProfile.Send",		boost::bind(&LLPanelSnapshotProfile::onSend,		this)); +	mCommitCallbackRegistrar.add("PostToProfile.Cancel",	boost::bind(&LLPanelSnapshotProfile::cancel,		this)); +} + +// virtual +BOOL LLPanelSnapshotProfile::postBuild() +{ +	return LLPanelSnapshot::postBuild(); +} + +// virtual +void LLPanelSnapshotProfile::onOpen(const LLSD& key) +{ +	LLPanelSnapshot::onOpen(key); +} + +// virtual +void LLPanelSnapshotProfile::updateControls(const LLSD& info) +{ +	const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true; +	getChild<LLUICtrl>("post_btn")->setEnabled(have_snapshot); +} + +void LLPanelSnapshotProfile::onSend() +{ +	std::string caption = getChild<LLUICtrl>("caption")->getValue().asString(); +	bool add_location = getChild<LLUICtrl>("add_location_cb")->getValue().asBoolean(); + +	LLWebProfile::uploadImage(LLFloaterSnapshot::getImageData(), caption, add_location); +	LLFloaterSnapshot::postSave(); +} diff --git a/indra/newview/llpostcard.cpp b/indra/newview/llpostcard.cpp new file mode 100644 index 0000000000..4f2d6da7e5 --- /dev/null +++ b/indra/newview/llpostcard.cpp @@ -0,0 +1,155 @@ +/**  + * @file llpostcard.cpp + * @brief Sending postcards. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpostcard.h" + +#include "llvfile.h" +#include "llvfs.h" +#include "llviewerregion.h" + +#include "message.h" + +#include "llagent.h" +#include "llassetuploadresponders.h" + +/////////////////////////////////////////////////////////////////////////////// +// misc + +static void postcard_upload_callback(const LLUUID& asset_id, void *user_data, S32 result, LLExtStat ext_status) +{ +	LLSD* postcard_data = (LLSD*)user_data; + +	if (result) +	{ +		// TODO: display the error messages in UI +		llwarns << "Failed to send postcard: " << LLAssetStorage::getErrorString(result) << llendl; +		LLPostCard::reportPostResult(false); +	} +	else +	{ +		// only create the postcard once the upload succeeds + +		// request the postcard +		const LLSD& data = *postcard_data; +		LLMessageSystem* msg = gMessageSystem; +		msg->newMessage("SendPostcard"); +		msg->nextBlock("AgentData"); +		msg->addUUID("AgentID",			gAgent.getID()); +		msg->addUUID("SessionID",		gAgent.getSessionID()); +		msg->addUUID("AssetID",			data["asset-id"].asUUID()); +		msg->addVector3d("PosGlobal",	LLVector3d(data["pos-global"])); +		msg->addString("To",			data["to"]); +		msg->addString("From",			data["from"]); +		msg->addString("Name",			data["name"]); +		msg->addString("Subject",		data["subject"]); +		msg->addString("Msg",			data["msg"]); +		msg->addBOOL("AllowPublish",	FALSE); +		msg->addBOOL("MaturePublish",	FALSE); +		gAgent.sendReliableMessage(); + +		LLPostCard::reportPostResult(true); +	} + +	delete postcard_data; +} + + +/////////////////////////////////////////////////////////////////////////////// +// LLPostcardSendResponder + +class LLPostcardSendResponder : public LLAssetUploadResponder +{ +	LOG_CLASS(LLPostcardSendResponder); + +public: +	LLPostcardSendResponder(const LLSD &post_data, +							const LLUUID& vfile_id, +							LLAssetType::EType asset_type): +	    LLAssetUploadResponder(post_data, vfile_id, asset_type) +	{ +	} + +	/*virtual*/ void uploadComplete(const LLSD& content) +	{ +		llinfos << "Postcard sent" << llendl; +		LL_DEBUGS("Snapshots") << "content: " << content << llendl; +		LLPostCard::reportPostResult(true); +	} + +	/*virtual*/ void uploadFailure(const LLSD& content) +	{ +		llwarns << "Sending postcard failed: " << content << llendl; +		LLPostCard::reportPostResult(false); +	} +}; + +/////////////////////////////////////////////////////////////////////////////// +// LLPostCard + +LLPostCard::result_callback_t LLPostCard::mResultCallback; + +// static +void LLPostCard::send(LLPointer<LLImageFormatted> image, const LLSD& postcard_data) +{ +	LLTransactionID transaction_id; +	LLAssetID asset_id; + +	transaction_id.generate(); +	asset_id = transaction_id.makeAssetID(gAgent.getSecureSessionID()); +	LLVFile::writeFile(image->getData(), image->getDataSize(), gVFS, asset_id, LLAssetType::AT_IMAGE_JPEG); + +	// upload the image +	std::string url = gAgent.getRegion()->getCapability("SendPostcard"); +	if (!url.empty()) +	{ +		llinfos << "Sending postcard via capability" << llendl; +		// the capability already encodes: agent ID, region ID +		LL_DEBUGS("Snapshots") << "url: " << url << llendl; +		LL_DEBUGS("Snapshots") << "body: " << postcard_data << llendl; +		LL_DEBUGS("Snapshots") << "data size: " << image->getDataSize() << llendl; +		LLHTTPClient::post(url, postcard_data, +			new LLPostcardSendResponder(postcard_data, asset_id, LLAssetType::AT_IMAGE_JPEG)); +	} +	else +	{ +		llinfos << "Sending postcard" << llendl; +		LLSD* data = new LLSD(postcard_data); +		(*data)["asset-id"] = asset_id; +		gAssetStorage->storeAssetData(transaction_id, LLAssetType::AT_IMAGE_JPEG, +			&postcard_upload_callback, (void *)data, FALSE); +	} +} + +// static +void LLPostCard::reportPostResult(bool ok) +{ +	if (mResultCallback) +	{ +		mResultCallback(ok); +	} +} diff --git a/indra/newview/llpostcard.h b/indra/newview/llpostcard.h new file mode 100644 index 0000000000..0eb118b906 --- /dev/null +++ b/indra/newview/llpostcard.h @@ -0,0 +1,48 @@ +/**  + * @file llpostcard.h + * @brief Sending postcards. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLPOSTCARD_H +#define LL_LLPOSTCARD_H + +#include "llimage.h" +#include "lluuid.h" + +class LLPostCard +{ +	LOG_CLASS(LLPostCard); + +public: +	typedef boost::function<void(bool ok)> result_callback_t; + +	static void send(LLPointer<LLImageFormatted> image, const LLSD& postcard_data); +	static void setPostResultCallback(result_callback_t cb) { mResultCallback = cb; } +	static void reportPostResult(bool ok); + +private: +	static result_callback_t mResultCallback; +}; + +#endif // LL_LLPOSTCARD_H diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp index 119fc95cf0..18626e3273 100644 --- a/indra/newview/llpreview.cpp +++ b/indra/newview/llpreview.cpp @@ -363,8 +363,10 @@ void LLPreview::onBtnCopyToInv(void* userdata)  		// Copy to inventory  		if (self->mNotecardInventoryID.notNull())  		{ -			copy_inventory_from_notecard(self->mNotecardObjectID, -				self->mNotecardInventoryID, item); +			copy_inventory_from_notecard(LLUUID::null, +										 self->mNotecardObjectID, +										 self->mNotecardInventoryID, +										 item);  		}  		else  		{ diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 45cf81751b..15ba5195d9 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -708,6 +708,8 @@ void LLScreenChannel::showToastsTop()  //--------------------------------------------------------------------------  void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)  { +	LLScreenChannelBase::updateRect(); +  	LLRect toast_rect;  	LLToast::Params p;  	p.lifetime_secs = timer; @@ -730,13 +732,10 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)  	text_box->setValue(text);  	text_box->setVisible(TRUE); -	S32 old_height = text_box->getRect().getHeight();  	text_box->reshapeToFitText();  	text_box->setOrigin(text_box->getRect().mLeft, (wrapper_panel->getRect().getHeight() - text_box->getRect().getHeight())/2); -	S32 new_height = text_box->getRect().getHeight(); -	S32 height_delta = new_height - old_height; -	toast_rect.setLeftTopAndSize(0, toast_rect.getHeight() + height_delta +gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_rect.getHeight()); +	toast_rect.setLeftTopAndSize(0, getRect().getHeight() - gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_rect.getHeight());  	mStartUpToastPanel->setRect(toast_rect);  	addChild(mStartUpToastPanel); diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index a24f6b24f0..91f8035556 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -113,21 +113,13 @@ public:  			switch (added_category_type)  			{  				case LLFolderType::FT_INBOX: +					mSidepanelInventory->enableInbox(true);  					mSidepanelInventory->observeInboxModifications(added_category->getUUID());  					break;  				case LLFolderType::FT_OUTBOX: +					mSidepanelInventory->enableOutbox(true);  					mSidepanelInventory->observeOutboxModifications(added_category->getUUID());  					break; -				case LLFolderType::FT_NONE: -					// HACK until sim update to properly create folder with system type -					if (added_category->getName() == "Received Items") -					{ -						mSidepanelInventory->observeInboxModifications(added_category->getUUID()); -					} -					else if (added_category->getName() == "Merchant Outbox") -					{ -						mSidepanelInventory->observeOutboxModifications(added_category->getUUID()); -					}  				default:  					break;  			} @@ -288,7 +280,6 @@ BOOL LLSidepanelInventory::postBuild()  	gSavedSettings.getControl("InventoryDisplayInbox")->getCommitSignal()->connect(boost::bind(&handleInventoryDisplayInboxChanged));  	gSavedSettings.getControl("InventoryDisplayOutbox")->getCommitSignal()->connect(boost::bind(&handleInventoryDisplayOutboxChanged)); -	updateInboxOutbox();  	// Update the verbs buttons state.  	updateVerbs(); @@ -316,20 +307,20 @@ void LLSidepanelInventory::updateInboxOutbox()  	// Set up observer for inbox changes, if we have an inbox already  	if (!inbox_id.isNull())  	{ -		observeInboxModifications(inbox_id); -  		// Enable the display of the inbox if it exists  		enableInbox(true); + +		observeInboxModifications(inbox_id);  	}  #if ENABLE_MERCHANT_OUTBOX_PANEL  	// Set up observer for outbox changes, if we have an outbox already  	if (!outbox_id.isNull())  	{ -		observeOutboxModifications(outbox_id); -  		// Enable the display of the outbox if it exists  		enableOutbox(true); + +		observeOutboxModifications(outbox_id);  	}  #endif  } diff --git a/indra/newview/llsidetraypanelcontainer.cpp b/indra/newview/llsidetraypanelcontainer.cpp index 95a12c7c23..e340333c2c 100644 --- a/indra/newview/llsidetraypanelcontainer.cpp +++ b/indra/newview/llsidetraypanelcontainer.cpp @@ -62,6 +62,13 @@ void LLSideTrayPanelContainer::onOpen(const LLSD& key)  	getCurrentPanel()->onOpen(key);  } +void LLSideTrayPanelContainer::openPanel(const std::string& panel_name, const LLSD& key) +{ +	LLSD combined_key = key; +	combined_key[PARAM_SUB_PANEL_NAME] = panel_name; +	onOpen(combined_key); +} +  void LLSideTrayPanelContainer::openPreviousPanel()  {  	if(!mDefaultPanelName.empty()) diff --git a/indra/newview/llsidetraypanelcontainer.h b/indra/newview/llsidetraypanelcontainer.h index 14269b002b..93a85ed374 100644 --- a/indra/newview/llsidetraypanelcontainer.h +++ b/indra/newview/llsidetraypanelcontainer.h @@ -57,6 +57,11 @@ public:  	/*virtual*/ void onOpen(const LLSD& key);  	/** +	 * Opens given subpanel. +	 */ +	void openPanel(const std::string& panel_name, const LLSD& key = LLSD::emptyMap()); + +	/**  	* Opens previous panel from panel navigation history.  	*/  	void openPreviousPanel(); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index e62227fa3c..9d8d1be0f5 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -190,6 +190,7 @@  #include "lllogin.h"  #include "llevents.h"  #include "llstartuplistener.h" +#include "lltoolbarview.h"  #if LL_WINDOWS  #include "lldxhardware.h" @@ -2091,7 +2092,12 @@ void login_show()  #else  	BOOL bUseDebugLogin = TRUE;  #endif - +	// Hide the toolbars: may happen to come back here if login fails after login agent but before login in region +	if (gToolBarView) +	{ +		gToolBarView->setVisible(FALSE); +	} +	  	LLPanelLogin::show(	gViewerWindow->getWindowRectScaled(),  						bUseDebugLogin || gSavedSettings.getBOOL("SecondLifeEnterprise"),  						login_callback, NULL ); diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 70b0a31308..e7a176f4f9 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -1641,8 +1641,8 @@ void LLTextureCache::purgeTextures(bool validate)  		{  			purge_count++;  	 		LL_DEBUGS("TextureCache") << "PURGING: " << filename << LL_ENDL; -			removeEntry(idx, entries[idx], filename) ;  			cache_size -= entries[idx].mBodySize; +			removeEntry(idx, entries[idx], filename) ;			  		}  	} @@ -1879,13 +1879,12 @@ void LLTextureCache::removeEntry(S32 idx, Entry& entry, std::string& filename)  			  file_maybe_exists = false;  		  }  		} +		mTexturesSizeTotal -= entry.mBodySize;  		entry.mImageSize = -1;  		entry.mBodySize = 0;  		mHeaderIDMap.erase(entry.mID); -		mTexturesSizeMap.erase(entry.mID); - -		mTexturesSizeTotal -= entry.mBodySize; +		mTexturesSizeMap.erase(entry.mID);		  		mFreeList.insert(idx);	  	} diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp index ed1dfbb8cd..5ff0ccfeb2 100644 --- a/indra/newview/lltoolbarview.cpp +++ b/indra/newview/lltoolbarview.cpp @@ -315,6 +315,19 @@ bool LLToolBarView::loadToolbars(bool force_default)  	return true;  } +bool LLToolBarView::clearToolbars() +{ +	for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) +	{ +		if (mToolbars[i]) +		{ +			mToolbars[i]->clearCommandsList(); +		} +	} + +	return true; +} +  //static  bool LLToolBarView::loadDefaultToolbars()  { @@ -332,6 +345,23 @@ bool LLToolBarView::loadDefaultToolbars()  	return retval;  } +//static +bool LLToolBarView::clearAllToolbars() +{ +	bool retval = false; + +	if (gToolBarView) +	{ +		retval = gToolBarView->clearToolbars(); +		if (retval) +		{ +			gToolBarView->saveToolbars(); +		} +	} + +	return retval; +} +  void LLToolBarView::saveToolbars() const  {  	if (!mToolbarsLoaded) diff --git a/indra/newview/lltoolbarview.h b/indra/newview/lltoolbarview.h index 4307d10258..b99e8bc28d 100644 --- a/indra/newview/lltoolbarview.h +++ b/indra/newview/lltoolbarview.h @@ -94,9 +94,13 @@ public:  	// Loads the toolbars from the existing user or default settings  	bool loadToolbars(bool force_default = false);	// return false if load fails +	// Clears all buttons off the toolbars +	bool clearToolbars(); +	  	void setToolBarsVisible(bool visible);  	static bool loadDefaultToolbars(); +	static bool clearAllToolbars();  	static void startDragTool(S32 x, S32 y, LLToolBarButton* toolbarButton);  	static BOOL handleDragTool(S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type); diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index c761969fcf..74c4f6d2dc 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -85,7 +85,6 @@  #include "llfloateropenobject.h"  #include "llfloaterpay.h"  #include "llfloaterperms.h" -#include "llfloaterpostcard.h"  #include "llfloaterpostprocess.h"  #include "llfloaterpreference.h"  #include "llfloaterproperties.h" @@ -245,7 +244,6 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("people", "floater_people.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);  	LLFloaterReg::add("places", "floater_places.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>); -	LLFloaterReg::add("postcard", "floater_postcard.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostcard>);  	LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);  	LLFloaterReg::add("prefs_proxy", "floater_preferences_proxy.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreferenceProxy>);  	LLFloaterReg::add("prefs_hardware_settings", "floater_hardware_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHardwareSettings>); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 519d4fe7f8..163581ea7f 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -1209,7 +1209,23 @@ void move_inventory_item(  	gAgent.sendReliableMessage();  } -void copy_inventory_from_notecard(const LLUUID& object_id, const LLUUID& notecard_inv_id, const LLInventoryItem *src, U32 callback_id) +const LLUUID get_folder_by_itemtype(const LLInventoryItem *src) +{ +	LLUUID retval = LLUUID::null; +	 +	if (src) +	{ +		retval = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(src->getType())); +	} +	 +	return retval; +} + +void copy_inventory_from_notecard(const LLUUID& destination_id, +								  const LLUUID& object_id, +								  const LLUUID& notecard_inv_id, +								  const LLInventoryItem *src, +								  U32 callback_id)  {  	if (NULL == src)  	{ @@ -1255,7 +1271,7 @@ void copy_inventory_from_notecard(const LLUUID& object_id, const LLUUID& notecar      body["notecard-id"] = notecard_inv_id;      body["object-id"] = object_id;      body["item-id"] = src->getUUID(); -	body["folder-id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(src->getType())); +	body["folder-id"] = destination_id;      body["callback-id"] = (LLSD::Integer)callback_id;      request["message"] = "CopyInventoryFromNotecard"; diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 41542a4e0f..7822ef4da6 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -363,7 +363,10 @@ void move_inventory_item(  	const std::string& new_name,  	LLPointer<LLInventoryCallback> cb); -void copy_inventory_from_notecard(const LLUUID& object_id, +const LLUUID get_folder_by_itemtype(const LLInventoryItem *src); + +void copy_inventory_from_notecard(const LLUUID& destination_id, +								  const LLUUID& object_id,  								  const LLUUID& notecard_inv_id,  								  const LLInventoryItem *src,  								  U32 callback_id = 0); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 41b4dc01e8..2858330597 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -50,6 +50,7 @@  #include "llvoavatar.h"  #include "llvoavatarself.h"  #include "llviewerregion.h" +#include "llwebprofile.h"  #include "llwebsharing.h"	// For LLWebSharing::setOpenIDCookie(), *TODO: find a better way to do this!  #include "llfilepicker.h"  #include "llnotifications.h" @@ -319,6 +320,10 @@ public:  		std::string cookie = content["set-cookie"].asString();  		LLViewerMedia::getCookieStore()->setCookiesFromHost(cookie, mHost); + +		// Set cookie for snapshot publishing. +		std::string auth_cookie = cookie.substr(0, cookie.find(";")); // strip path +		LLWebProfile::setAuthCookie(auth_cookie);  	}  	 void completedRaw( @@ -1484,6 +1489,8 @@ void LLViewerMedia::setOpenIDCookie()  		std::string profile_url = getProfileURL("");  		LLURL raw_profile_url( profile_url.c_str() ); +		LL_DEBUGS("MediaAuth") << "Requesting " << profile_url << llendl; +		LL_DEBUGS("MediaAuth") << "sOpenIDCookie = [" << sOpenIDCookie << "]" << llendl;  		LLHTTPClient::get(profile_url,    			new LLViewerMediaWebProfileResponder(raw_profile_url.getAuthority()),  			headers); @@ -1716,7 +1723,8 @@ LLViewerMediaImpl::LLViewerMediaImpl(	  const LLUUID& texture_id,  	mNavigateSuspended(false),  	mNavigateSuspendedDeferred(false),  	mIsUpdated(false), -	mTrustedBrowser(false) +	mTrustedBrowser(false), +	mZoomFactor(1.0)  {   	// Set up the mute list observer if it hasn't been set up already. @@ -2302,6 +2310,17 @@ void LLViewerMediaImpl::clearCache()  	}  } + +////////////////////////////////////////////////////////////////////////////////////////// +void LLViewerMediaImpl::setPageZoomFactor( double factor ) +{ +	if(mMediaSource && factor != mZoomFactor) +	{ +		mZoomFactor = factor; +		mMediaSource->set_page_zoom_factor( factor ); +	} +} +  //////////////////////////////////////////////////////////////////////////////////////////  void LLViewerMediaImpl::mouseDown(S32 x, S32 y, MASK mask, S32 button)  { @@ -2450,44 +2469,58 @@ BOOL LLViewerMediaImpl::handleMouseUp(S32 x, S32 y, MASK mask)  //////////////////////////////////////////////////////////////////////////////////////////  void LLViewerMediaImpl::updateJavascriptObject()  { +	static LLFrameTimer timer ; +  	if ( mMediaSource )  	{  		// flag to expose this information to internal browser or not.  		bool enable = gSavedSettings.getBOOL("BrowserEnableJSObject"); + +		if(!enable) +		{ +			return ; //no need to go further. +		} + +		if(timer.getElapsedTimeF32() < 1.0f) +		{ +			return ; //do not update more than once per second. +		} +		timer.reset() ; +  		mMediaSource->jsEnableObject( enable );  		// these values are only menaingful after login so don't set them before  		bool logged_in = LLLoginInstance::getInstance()->authSuccess();  		if ( logged_in )  		{ -		// current location within a region -		LLVector3 agent_pos = gAgent.getPositionAgent(); -		double x = agent_pos.mV[ VX ]; -		double y = agent_pos.mV[ VY ]; -		double z = agent_pos.mV[ VZ ]; -		mMediaSource->jsAgentLocationEvent( x, y, z ); - -		// current location within the grid -		LLVector3d agent_pos_global = gAgent.getLastPositionGlobal(); -		double global_x = agent_pos_global.mdV[ VX ]; -		double global_y = agent_pos_global.mdV[ VY ]; -		double global_z = agent_pos_global.mdV[ VZ ]; -		mMediaSource->jsAgentGlobalLocationEvent( global_x, global_y, global_z ); - -		// current agent orientation -		double rotation = atan2( gAgent.getAtAxis().mV[VX], gAgent.getAtAxis().mV[VY] ); -		double angle = rotation * RAD_TO_DEG; -		if ( angle < 0.0f ) angle = 360.0f + angle;	// TODO: has to be a better way to get orientation! -		mMediaSource->jsAgentOrientationEvent( angle ); - -		// current region agent is in -		std::string region_name(""); -		LLViewerRegion* region = gAgent.getRegion(); -		if ( region ) -		{ -			region_name = region->getName(); -		}; -		mMediaSource->jsAgentRegionEvent( region_name ); +			// current location within a region +			LLVector3 agent_pos = gAgent.getPositionAgent(); +			double x = agent_pos.mV[ VX ]; +			double y = agent_pos.mV[ VY ]; +			double z = agent_pos.mV[ VZ ]; +			mMediaSource->jsAgentLocationEvent( x, y, z ); + +			// current location within the grid +			LLVector3d agent_pos_global = gAgent.getLastPositionGlobal(); +			double global_x = agent_pos_global.mdV[ VX ]; +			double global_y = agent_pos_global.mdV[ VY ]; +			double global_z = agent_pos_global.mdV[ VZ ]; +			mMediaSource->jsAgentGlobalLocationEvent( global_x, global_y, global_z ); + +			// current agent orientation +			double rotation = atan2( gAgent.getAtAxis().mV[VX], gAgent.getAtAxis().mV[VY] ); +			double angle = rotation * RAD_TO_DEG; +			if ( angle < 0.0f ) angle = 360.0f + angle;	// TODO: has to be a better way to get orientation! +			mMediaSource->jsAgentOrientationEvent( angle ); + +			// current region agent is in +			std::string region_name(""); +			LLViewerRegion* region = gAgent.getRegion(); +			if ( region ) +			{ +				region_name = region->getName(); +			}; +			mMediaSource->jsAgentRegionEvent( region_name );  		}  		// language code the viewer is set to diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 0b69b8f0c1..3db9f0b4e0 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -250,6 +250,7 @@ public:  	std::string getMediaEntryURL() { return mMediaEntryURL; }  	void setHomeURL(const std::string& home_url, const std::string& mime_type = LLStringUtil::null) { mHomeURL = home_url; mHomeMimeType = mime_type;};  	void clearCache(); +	void setPageZoomFactor( double factor );  	std::string getMimeType() { return mMimeType; }  	void scaleMouse(S32 *mouse_x, S32 *mouse_y);  	void scaleTextureCoords(const LLVector2& texture_coords, S32 *x, S32 *y); @@ -416,6 +417,7 @@ private:  private:  	// a single media url with some data and an impl.  	LLPluginClassMedia* mMediaSource; +	F64		mZoomFactor;  	LLUUID mTextureId;  	bool  mMovieImageHasMips;  	std::string mMediaURL;			// The last media url set with NavigateTo diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index b9293b3b31..7e830e14bf 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -528,23 +528,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t  		{  			gViewerWindow->playSnapshotAnimAndSound(); -			LLPointer<LLImageFormatted> formatted; -			switch(LLFloaterSnapshot::ESnapshotFormat(gSavedSettings.getS32("SnapshotFormat"))) -			{ -			  case LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG: -				formatted = new LLImageJPEG(gSavedSettings.getS32("SnapshotQuality")); -				break; -			  case LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG: -				formatted = new LLImagePNG; -				break; -			  case LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP:  -				formatted = new LLImageBMP; -				break; -			  default:  -				llwarns << "Unknown Local Snapshot format" << llendl; -				return true; -			} - +			LLPointer<LLImageFormatted> formatted = new LLImagePNG;  			formatted->enableOverSize() ;  			formatted->encode(raw, 0);  			formatted->disableOverSize() ; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index a9ca70fd26..7cae19a1d2 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -59,9 +59,9 @@  #include "llfloaterland.h"  #include "llfloaterregioninfo.h"  #include "llfloaterlandholdings.h" -#include "llfloaterpostcard.h"  #include "llfloaterpreference.h"  #include "llfloatersidepanelcontainer.h" +#include "llfloatersnapshot.h"  #include "llhudeffecttrail.h"  #include "llhudmanager.h"  #include "llinventoryfunctions.h" @@ -6470,7 +6470,7 @@ void process_user_info_reply(LLMessageSystem* msg, void**)  	msg->getString( "UserData", "DirectoryVisibility", dir_visibility);  	LLFloaterPreference::updateUserInfo(dir_visibility, im_via_email, email); -	LLFloaterPostcard::updateUserInfo(email); +	LLFloaterSnapshot::setAgentEmail(email);  } diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 8db72da1ee..d6002e7320 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -113,7 +113,7 @@ LLViewerParcelMgr::LLViewerParcelMgr()  	mRequestResult(0),  	mWestSouth(),  	mEastNorth(), -	mSelectedDwell(0.f), +	mSelectedDwell(DWELL_NAN),  	mAgentParcelSequenceID(-1),  	mHoverRequestResult(0),  	mHoverWestSouth(), @@ -233,7 +233,7 @@ void LLViewerParcelMgr::getDisplayInfo(S32* area_out, S32* claim_out,  	S32 price = 0;  	S32 rent = 0;  	BOOL for_sale = FALSE; -	F32 dwell = 0.f; +	F32 dwell = DWELL_NAN;  	if (mSelected)  	{ @@ -579,7 +579,7 @@ void LLViewerParcelMgr::deselectLand()  		mCurrentParcel->mBanList.clear();  		//mCurrentParcel->mRenterList.reset(); -		mSelectedDwell = 0.f; +		mSelectedDwell = DWELL_NAN;  		// invalidate parcel selection so that existing users of this selection can clean up  		mCurrentParcelSelection->setParcel(NULL); @@ -1663,7 +1663,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use  			LLViewerParcelMgr::getInstance()->requestParcelMediaURLFilter();  			// Request dwell for this land, if it's not public land. -			LLViewerParcelMgr::getInstance()->mSelectedDwell = 0.f; +			LLViewerParcelMgr::getInstance()->mSelectedDwell = DWELL_NAN;  			if (0 != local_id)  			{  				LLViewerParcelMgr::getInstance()->sendParcelDwellRequest(); diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h index 68d8978ea8..cac8d8391c 100644 --- a/indra/newview/llviewerparcelmgr.h +++ b/indra/newview/llviewerparcelmgr.h @@ -43,6 +43,8 @@ class LLParcel;  class LLViewerTexture;  class LLViewerRegion; +const F32 DWELL_NAN = -1.0f;	// A dwell having this value will be displayed as Loading... +  // Constants for sendLandOwner  //const U32 NO_NEIGHBOR_JOIN = 0x0;  //const U32 ALL_NEIGHBOR_JOIN = U32(  NORTH_MASK  diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 0a9fae68a6..b41ed00f17 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -88,12 +88,12 @@ public:  	{  		LLVector3d global_pos;  		landmark->getGlobalPos(global_pos); -		LLViewerInventoryItem* agent_lanmark = +		LLViewerInventoryItem* agent_landmark =  				LLLandmarkActions::findLandmarkForGlobalPos(global_pos); -		if (agent_lanmark) +		if (agent_landmark)  		{ -			showInfo(agent_lanmark->getUUID()); +			showInfo(agent_landmark->getUUID());  		}  		else  		{ @@ -104,8 +104,13 @@ public:  			}  			else  			{ +				LLInventoryItem* item = item_ptr.get();  				LLPointer<LLEmbeddedLandmarkCopied> cb = new LLEmbeddedLandmarkCopied(); -				copy_inventory_from_notecard(object_id, notecard_inventory_id, item_ptr.get(), gInventoryCallbacks.registerCB(cb)); +				copy_inventory_from_notecard(get_folder_by_itemtype(item), +											 object_id, +											 notecard_inventory_id, +											 item, +											 gInventoryCallbacks.registerCB(cb));  			}  		}  	} @@ -1266,9 +1271,11 @@ bool LLViewerTextEditor::importStream(std::istream& str)  void LLViewerTextEditor::copyInventory(const LLInventoryItem* item, U32 callback_id)  { -	copy_inventory_from_notecard(mObjectID, +	copy_inventory_from_notecard(LLUUID::null,  // Don't specify a destination -- let the sim do that +								 mObjectID,  								 mNotecardInventoryID, -								 item, callback_id); +								 item, +								 callback_id);  }  bool LLViewerTextEditor::hasEmbeddedInventory() diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 280337be0f..786e2b73b1 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -417,6 +417,48 @@ const S32 min_non_tex_system_mem = (128<<20); // 128 MB  F32 texmem_lower_bound_scale = 0.85f;  F32 texmem_middle_bound_scale = 0.925f; +//static  +bool LLViewerTexture::isMemoryForTextureLow() +{ +	const static S32 MIN_FREE_TEXTURE_MEMORY = 5 ; //MB +	const static S32 MIN_FREE_MAIN_MEMORy = 100 ; //MB + +	bool low_mem = false ; +	if (gGLManager.mHasATIMemInfo) +	{ +		S32 meminfo[4]; +		glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo); + +		if(meminfo[0] / 1024 < MIN_FREE_TEXTURE_MEMORY) +		{ +			low_mem = true ; +		} +	} +#if 0  //ignore nVidia cards +	else if (gGLManager.mHasNVXMemInfo) +	{ +		S32 free_memory; +		glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &free_memory); +		 +		if(free_memory / 1024 < MIN_FREE_TEXTURE_MEMORY) +		{ +			low_mem = true ; +		} +	} +#endif + +	if(!low_mem) //check main memory, only works for windows. +	{ +		LLMemory::updateMemoryInfo() ; +		if(LLMemory::getAvailableMemKB() / 1024 < MIN_FREE_MAIN_MEMORy) +		{ +			low_mem = true ; +		} +	} + +	return low_mem ; +} +  //static  void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity)  { @@ -449,6 +491,11 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity  			sEvaluationTimer.reset();  		}  	} +	else if(sEvaluationTimer.getElapsedTimeF32() > discard_delta_time && isMemoryForTextureLow()) +	{ +		sDesiredDiscardBias += discard_bias_delta; +		sEvaluationTimer.reset(); +	}  	else if (sDesiredDiscardBias > 0.0f &&  			 BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) < sMaxBoundTextureMemInMegaBytes * texmem_lower_bound_scale &&  			 BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) < sMaxTotalTextureMemInMegaBytes * texmem_lower_bound_scale) diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index a4a5ae0a5b..b96441127d 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -267,6 +267,7 @@ private:  	/*virtual*/ LLImageGL* getGLTexture() const ;  	virtual void switchToCachedImage(); +	static bool isMemoryForTextureLow() ;  protected:  	LLUUID mID;  	S32 mBoostLevel;				// enum describing priority level diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index c64488251a..a48572f792 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -530,9 +530,11 @@ void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image)  		}  		llerrs << "LLViewerTextureList::removeImageFromList - Image not in list" << llendl;  	} -	if(mImageList.erase(image) != 1)  + +	S32 count = mImageList.erase(image) ; +	if(count != 1)   	{ -		llerrs << "Error happens when remove image from mImageList!" << llendl ; +		llerrs << "Error happens when remove image from mImageList: " << count << llendl ;  	}  	image->setInImageList(FALSE) ; @@ -1053,6 +1055,13 @@ S32 LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended)  		// Treat any card with < 32 MB (shudder) as having 32 MB  		//  - it's going to be swapping constantly regardless  		S32 max_vram = gGLManager.mVRAM; + +		if(gGLManager.mIsATI) +		{ +			//shrink the availabe vram for ATI cards because some of them do not handel texture swapping well. +			max_vram = (S32)(max_vram * 0.75f);   +		} +  		max_vram = llmax(max_vram, getMinVideoRamSetting());  		max_texmem = max_vram;  		if (!get_recommended) @@ -1060,10 +1069,19 @@ S32 LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended)  	}  	else  	{ -		if (get_recommended) -			max_texmem = 128; -		else +		if (!get_recommended) +		{  			max_texmem = 512; +		} +		else if (gSavedSettings.getBOOL("NoHardwareProbe")) //did not do hardware detection at startup +		{ +			max_texmem = 512; +		} +		else +		{ +			max_texmem = 128; +		} +  		llwarns << "VRAM amount not detected, defaulting to " << max_texmem << " MB" << llendl;  	} diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 6fcbc401af..cf21ac4e5d 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1789,17 +1789,13 @@ void LLViewerWindow::initBase()  	mLoginPanelHolder = main_view->getChild<LLView>("login_panel_holder")->getHandle();  	// Create the toolbar view -	// *TODO: Eventually, suppress the existence of this debug setting and turn toolbar FUI on permanently -	if (gSavedSettings.getBOOL("DebugToolbarFUI")) -	{ -		// Get a pointer to the toolbar view holder -		LLPanel* panel_holder = main_view->getChild<LLPanel>("toolbar_view_holder"); -		// Load the toolbar view from file  -		gToolBarView = LLUICtrlFactory::getInstance()->createFromFile<LLToolBarView>("panel_toolbar_view.xml", panel_holder, LLDefaultChildRegistry::instance()); -		gToolBarView->setShape(panel_holder->getLocalRect()); -		// Hide the toolbars for the moment: we'll make them visible after logging in world (see LLViewerWindow::initWorldUI()) -		gToolBarView->setVisible(FALSE); -	} +	// Get a pointer to the toolbar view holder +	LLPanel* panel_holder = main_view->getChild<LLPanel>("toolbar_view_holder"); +	// Load the toolbar view from file  +	gToolBarView = LLUICtrlFactory::getInstance()->createFromFile<LLToolBarView>("panel_toolbar_view.xml", panel_holder, LLDefaultChildRegistry::instance()); +	gToolBarView->setShape(panel_holder->getLocalRect()); +	// Hide the toolbars for the moment: we'll make them visible after logging in world (see LLViewerWindow::initWorldUI()) +	gToolBarView->setVisible(FALSE);  	// Constrain floaters to inside the menu and status bar regions.  	gFloaterView = main_view->getChild<LLFloaterView>("Floater View"); @@ -4020,10 +4016,11 @@ BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d  }  // Saves an image to the harddrive as "SnapshotX" where X >= 1. -BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image) +BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, bool force_picker)  {  	if (!image)  	{ +		llwarns << "No image to save" << llendl;  		return FALSE;  	} @@ -4043,7 +4040,7 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image)  		pick_type = LLFilePicker::FFSAVE_ALL; // ???  	// Get a base file location if needed. -	if ( ! isSnapshotLocSet())		 +	if (force_picker || !isSnapshotLocSet())  	{  		std::string proposed_name( sSnapshotBaseName ); @@ -4083,6 +4080,7 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image)  	}  	while( -1 != err );  // search until the file is not found (i.e., stat() gives an error). +	llinfos << "Saving snapshot to " << filepath << llendl;  	return image->save(filepath);  } diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index d10b06f121..0cb7f82b58 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -324,7 +324,7 @@ public:  	BOOL			thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL do_rebuild, ESnapshotType type) ;  	BOOL			isSnapshotLocSet() const { return ! sSnapshotDir.empty(); }  	void			resetSnapshotLoc() const { sSnapshotDir.clear(); } -	BOOL		    saveImageNumbered(LLImageFormatted *image); +	BOOL		    saveImageNumbered(LLImageFormatted *image, bool force_picker = false);  	// Reset the directory where snapshots are saved.  	// Client will open directory picker on next snapshot save. diff --git a/indra/newview/llwebprofile.cpp b/indra/newview/llwebprofile.cpp new file mode 100644 index 0000000000..641f338f2c --- /dev/null +++ b/indra/newview/llwebprofile.cpp @@ -0,0 +1,305 @@ +/**  + * @file llwebprofile.cpp + * @brief Web profile access. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llwebprofile.h" + +// libs +#include "llbufferstream.h" +#include "llhttpclient.h" +#include "llimagepng.h" +#include "llplugincookiestore.h" + +// newview +#include "llpanelprofile.h" // for getProfileURL(). FIXME: move the method to LLAvatarActions +#include "llviewermedia.h" // FIXME: don't use LLViewerMedia internals + +// third-party +#include "reader.h" // JSON + +/* + * Workflow: + * 1. LLViewerMedia::setOpenIDCookie() + *    -> GET https://my-demo.secondlife.com/ via LLViewerMediaWebProfileResponder + *    -> LLWebProfile::setAuthCookie() + * 2. LLWebProfile::uploadImage() + *    -> GET "https://my-demo.secondlife.com/snapshots/s3_upload_config" via ConfigResponder + * 3. LLWebProfile::post() + *    -> POST <config_url> via PostImageResponder + *    -> redirect + *    -> GET <redirect_url> via PostImageRedirectResponder + */ + +/////////////////////////////////////////////////////////////////////////////// +// LLWebProfileResponders::ConfigResponder + +class LLWebProfileResponders::ConfigResponder : public LLHTTPClient::Responder +{ +	LOG_CLASS(LLWebProfileResponders::ConfigResponder); + +public: +	ConfigResponder(LLPointer<LLImageFormatted> imagep) +	:	mImagep(imagep) +	{ +	} + +	/*virtual*/ void completedRaw( +		U32 status, +		const std::string& reason, +		const LLChannelDescriptors& channels, +		const LLIOPipe::buffer_ptr_t& buffer) +	{ +		LLBufferStream istr(channels, buffer.get()); +		std::stringstream strstrm; +		strstrm << istr.rdbuf(); +		const std::string body = strstrm.str(); + +		if (status != 200) +		{ +			llwarns << "Failed to get upload config (" << status << ")" << llendl; +			LLWebProfile::reportImageUploadStatus(false); +			return; +		} + +		Json::Value root; +		Json::Reader reader; +		if (!reader.parse(body, root)) +		{ +			llwarns << "Failed to parse upload config: " << reader.getFormatedErrorMessages() << llendl; +			LLWebProfile::reportImageUploadStatus(false); +			return; +		} + +		// *TODO: 404 = not supported by the grid +		// *TODO: increase timeout or handle 499 Expired + +		// Convert config to LLSD. +		const Json::Value data = root["data"]; +		const std::string upload_url = root["url"].asString(); +		LLSD config; +		config["acl"]						= data["acl"].asString(); +		config["AWSAccessKeyId"]			= data["AWSAccessKeyId"].asString(); +		config["Content-Type"]				= data["Content-Type"].asString(); +		config["key"]						= data["key"].asString(); +		config["policy"]					= data["policy"].asString(); +		config["success_action_redirect"]	= data["success_action_redirect"].asString(); +		config["signature"]					= data["signature"].asString(); +		config["add_loc"]					= data.get("add_loc", "0").asString(); +		config["caption"]					= data.get("caption", "").asString(); + +		// Do the actual image upload using the configuration. +		LL_DEBUGS("Snapshots") << "Got upload config, POSTing image to " << upload_url << ", config=[" << config << "]" << llendl; +		LLWebProfile::post(mImagep, config, upload_url); +	} + +private: +	LLPointer<LLImageFormatted> mImagep; +}; + +/////////////////////////////////////////////////////////////////////////////// +// LLWebProfilePostImageRedirectResponder +class LLWebProfileResponders::PostImageRedirectResponder : public LLHTTPClient::Responder +{ +	LOG_CLASS(LLWebProfileResponders::PostImageRedirectResponder); + +public: +	/*virtual*/ void completedRaw( +		U32 status, +		const std::string& reason, +		const LLChannelDescriptors& channels, +		const LLIOPipe::buffer_ptr_t& buffer) +	{ +		if (status != 200) +		{ +			llwarns << "Failed to upload image: " << status << " " << reason << llendl; +			LLWebProfile::reportImageUploadStatus(false); +			return; +		} + +		LLBufferStream istr(channels, buffer.get()); +		std::stringstream strstrm; +		strstrm << istr.rdbuf(); +		const std::string body = strstrm.str(); +		llinfos << "Image uploaded." << llendl; +		LL_DEBUGS("Snapshots") << "Uploading image succeeded. Response: [" << body << "]" << llendl; +		LLWebProfile::reportImageUploadStatus(true); +	} + +private: +	LLPointer<LLImageFormatted> mImagep; +}; + + +/////////////////////////////////////////////////////////////////////////////// +// LLWebProfileResponders::PostImageResponder +class LLWebProfileResponders::PostImageResponder : public LLHTTPClient::Responder +{ +	LOG_CLASS(LLWebProfileResponders::PostImageResponder); + +public: +	/*virtual*/ void completedHeader(U32 status, const std::string& reason, const LLSD& content) +	{ +		// Viewer seems to fail to follow a 303 redirect on POST request +		// (URLRequest Error: 65, Send failed since rewinding of the data stream failed). +		// Handle it manually. +		if (status == 303) +		{ +			LLSD headers = LLViewerMedia::getHeaders(); +			headers["Cookie"] = LLWebProfile::getAuthCookie(); +			const std::string& redir_url = content["location"]; +			LL_DEBUGS("Snapshots") << "Got redirection URL: " << redir_url << llendl; +			LLHTTPClient::get(redir_url, new LLWebProfileResponders::PostImageRedirectResponder, headers); +		} +		else +		{ +			llwarns << "Unexpected POST status: " << status << " " << reason << llendl; +			LL_DEBUGS("Snapshots") << "headers: [" << content << "]" << llendl; +			LLWebProfile::reportImageUploadStatus(false); +		} +	} + +	// Override just to suppress warnings. +	/*virtual*/ void completedRaw(U32 status, const std::string& reason, +							  const LLChannelDescriptors& channels, +							  const LLIOPipe::buffer_ptr_t& buffer) +	{ +	} +}; + +/////////////////////////////////////////////////////////////////////////////// +// LLWebProfile + +std::string LLWebProfile::sAuthCookie; +LLWebProfile::status_callback_t LLWebProfile::mStatusCallback; + +// static +void LLWebProfile::uploadImage(LLPointer<LLImageFormatted> image, const std::string& caption, bool add_location) +{ +	// Get upload configuration data. +	std::string config_url(getProfileURL(LLStringUtil::null) + "snapshots/s3_upload_config"); +	config_url += "?caption=" + LLURI::escape(caption); +	config_url += "&add_loc=" + std::string(add_location ? "1" : "0"); + +	LL_DEBUGS("Snapshots") << "Requesting " << config_url << llendl; +	LLSD headers = LLViewerMedia::getHeaders(); +	headers["Cookie"] = getAuthCookie(); +	LLHTTPClient::get(config_url, new LLWebProfileResponders::ConfigResponder(image), headers); +} + +// static +void LLWebProfile::setAuthCookie(const std::string& cookie) +{ +	LL_DEBUGS("Snapshots") << "Setting auth cookie: " << cookie << llendl; +	sAuthCookie = cookie; +} + +// static +void LLWebProfile::post(LLPointer<LLImageFormatted> image, const LLSD& config, const std::string& url) +{ +	if (dynamic_cast<LLImagePNG*>(image.get()) == 0) +	{ +		llwarns << "Image to upload is not a PNG" << llendl; +		llassert(dynamic_cast<LLImagePNG*>(image.get()) != 0); +		return; +	} + +	const std::string boundary = "----------------------------0123abcdefab"; + +	LLSD headers = LLViewerMedia::getHeaders(); +	headers["Cookie"] = getAuthCookie(); +	headers["Content-Type"] = "multipart/form-data; boundary=" + boundary; + +	std::ostringstream body; + +	// *NOTE: The order seems to matter. +	body	<< "--" << boundary << "\r\n" +			<< "Content-Disposition: form-data; name=\"key\"\r\n\r\n" +			<< config["key"].asString() << "\r\n"; + +	body	<< "--" << boundary << "\r\n" +			<< "Content-Disposition: form-data; name=\"AWSAccessKeyId\"\r\n\r\n" +			<< config["AWSAccessKeyId"].asString() << "\r\n"; + +	body	<< "--" << boundary << "\r\n" +			<< "Content-Disposition: form-data; name=\"acl\"\r\n\r\n" +			<< config["acl"].asString() << "\r\n"; + +	body	<< "--" << boundary << "\r\n" +			<< "Content-Disposition: form-data; name=\"Content-Type\"\r\n\r\n" +			<< config["Content-Type"].asString() << "\r\n"; + +	body	<< "--" << boundary << "\r\n" +			<< "Content-Disposition: form-data; name=\"policy\"\r\n\r\n" +			<< config["policy"].asString() << "\r\n"; + +	body	<< "--" << boundary << "\r\n" +			<< "Content-Disposition: form-data; name=\"signature\"\r\n\r\n" +			<< config["signature"].asString() << "\r\n"; + +	body	<< "--" << boundary << "\r\n" +			<< "Content-Disposition: form-data; name=\"success_action_redirect\"\r\n\r\n" +			<< config["success_action_redirect"].asString() << "\r\n"; + +	body	<< "--" << boundary << "\r\n" +			<< "Content-Disposition: form-data; name=\"file\"; filename=\"snapshot.png\"\r\n" +			<< "Content-Type: image/png\r\n\r\n"; + +	// Insert the image data. +	// *FIX: Treating this as a string will probably screw it up ... +	U8* image_data = image->getData(); +	for (S32 i = 0; i < image->getDataSize(); ++i) +	{ +		body << image_data[i]; +	} + +	body <<	"\r\n--" << boundary << "--\r\n"; + +	// postRaw() takes ownership of the buffer and releases it later. +	size_t size = body.str().size(); +	U8 *data = new U8[size]; +	memcpy(data, body.str().data(), size); + +	// Send request, successful upload will trigger posting metadata. +	LLHTTPClient::postRaw(url, data, size, new LLWebProfileResponders::PostImageResponder(), headers); +} + +// static +void LLWebProfile::reportImageUploadStatus(bool ok) +{ +	if (mStatusCallback) +	{ +		mStatusCallback(ok); +	} +} + +// static +std::string LLWebProfile::getAuthCookie() +{ +	// This is needed to test image uploads on Linux viewer built with OpenSSL 1.0.0 (0.9.8 works fine). +	const char* debug_cookie = getenv("LL_SNAPSHOT_COOKIE"); +	return debug_cookie ? debug_cookie : sAuthCookie; +} diff --git a/indra/newview/llwebprofile.h b/indra/newview/llwebprofile.h new file mode 100644 index 0000000000..10279bffac --- /dev/null +++ b/indra/newview/llwebprofile.h @@ -0,0 +1,69 @@ +/**  + * @file llwebprofile.h + * @brief Web profile access. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLWEBPROFILE_H +#define LL_LLWEBPROFILE_H + +#include "llimage.h" + +namespace LLWebProfileResponders +{ +    class ConfigResponder; +    class PostImageResponder; +    class PostImageRedirectResponder; +}; + +/** + * @class LLWebProfile + * + * Manages interaction with, a web service allowing the upload of snapshot images + * taken within the viewer. + */ +class LLWebProfile +{ +	LOG_CLASS(LLWebProfile); + +public: +	typedef boost::function<void(bool ok)> status_callback_t; + +	static void uploadImage(LLPointer<LLImageFormatted> image, const std::string& caption, bool add_location); +	static void setAuthCookie(const std::string& cookie); +	static void setImageUploadResultCallback(status_callback_t cb) { mStatusCallback = cb; } + +private: +	friend class LLWebProfileResponders::ConfigResponder; +	friend class LLWebProfileResponders::PostImageResponder; +	friend class LLWebProfileResponders::PostImageRedirectResponder; + +	static void post(LLPointer<LLImageFormatted> image, const LLSD& config, const std::string& url); +	static void reportImageUploadStatus(bool ok); +	static std::string getAuthCookie(); + +	static std::string sAuthCookie; +	static status_callback_t mStatusCallback; +}; + +#endif // LL_LLWEBPROFILE_H diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 265d5dc801..e99657cd22 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -422,7 +422,7 @@ void LLWorldMapView::draw()  				// Draw something whenever we have enough info  				if (overlayimage->hasGLTexture())  				{ -					gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO); +					gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);	  					gGL.getTexUnit(0)->bind(overlayimage);  					gGL.color4f(1.f, 1.f, 1.f, 1.f);  					gGL.begin(LLRender::QUADS); diff --git a/indra/newview/skins/default/textures/arrow_keys.png b/indra/newview/skins/default/textures/arrow_keys.pngBinary files differ deleted file mode 100644 index f19af59251..0000000000 --- a/indra/newview/skins/default/textures/arrow_keys.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Pan_Over.png b/indra/newview/skins/default/textures/bottomtray/Cam_Pan_Over.pngBinary files differ deleted file mode 100644 index b5781718ec..0000000000 --- a/indra/newview/skins/default/textures/bottomtray/Cam_Pan_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/bottomtray/CameraView_Press.png b/indra/newview/skins/default/textures/bottomtray/CameraView_Press.pngBinary files differ deleted file mode 100644 index 5a9346fd39..0000000000 --- a/indra/newview/skins/default/textures/bottomtray/CameraView_Press.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.pngBinary files differ deleted file mode 100644 index 20fa40e127..0000000000 --- a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.pngBinary files differ deleted file mode 100644 index f1420e0002..0000000000 --- a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.pngBinary files differ deleted file mode 100644 index 89a6269edc..0000000000 --- a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.pngBinary files differ new file mode 100644 index 0000000000..857fa1e047 --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.pngBinary files differ new file mode 100644 index 0000000000..453bb53673 --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.pngBinary files differ new file mode 100644 index 0000000000..135a66ca0d --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.pngBinary files differ new file mode 100644 index 0000000000..a63aec5e6d --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.pngBinary files differ new file mode 100644 index 0000000000..1719eb3e84 --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png diff --git a/indra/newview/skins/default/textures/checkerboard_transparency_bg.png b/indra/newview/skins/default/textures/checkerboard_transparency_bg.pngBinary files differ deleted file mode 100644 index 9a16935204..0000000000 --- a/indra/newview/skins/default/textures/checkerboard_transparency_bg.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/circle.tga b/indra/newview/skins/default/textures/circle.tgaBinary files differ deleted file mode 100644 index d7097e3a35..0000000000 --- a/indra/newview/skins/default/textures/circle.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/containers/Accordion_ArrowClosed_Over.png b/indra/newview/skins/default/textures/containers/Accordion_ArrowClosed_Over.pngBinary files differ deleted file mode 100644 index e47f913db1..0000000000 --- a/indra/newview/skins/default/textures/containers/Accordion_ArrowClosed_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/containers/Accordion_ArrowOpened_Over.png b/indra/newview/skins/default/textures/containers/Accordion_ArrowOpened_Over.pngBinary files differ deleted file mode 100644 index e2c67de9c0..0000000000 --- a/indra/newview/skins/default/textures/containers/Accordion_ArrowOpened_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/containers/TabTop_Left_Over.png b/indra/newview/skins/default/textures/containers/TabTop_Left_Over.pngBinary files differ deleted file mode 100644 index 295cd89a57..0000000000 --- a/indra/newview/skins/default/textures/containers/TabTop_Left_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/containers/TabTop_Middle_Over.png b/indra/newview/skins/default/textures/containers/TabTop_Middle_Over.pngBinary files differ deleted file mode 100644 index 0758cbcf0d..0000000000 --- a/indra/newview/skins/default/textures/containers/TabTop_Middle_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/containers/TabTop_Right_Over.png b/indra/newview/skins/default/textures/containers/TabTop_Right_Over.pngBinary files differ deleted file mode 100644 index c2cbc2b1e5..0000000000 --- a/indra/newview/skins/default/textures/containers/TabTop_Right_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icn_label_web.tga b/indra/newview/skins/default/textures/icn_label_web.tgaBinary files differ deleted file mode 100644 index 7c9131dfff..0000000000 --- a/indra/newview/skins/default/textures/icn_label_web.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/icn_media.tga b/indra/newview/skins/default/textures/icn_media.tgaBinary files differ deleted file mode 100644 index 43dd342c9d..0000000000 --- a/indra/newview/skins/default/textures/icn_media.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/icn_voice-groupfocus.tga b/indra/newview/skins/default/textures/icn_voice-groupfocus.tgaBinary files differ deleted file mode 100644 index 9f48d4609d..0000000000 --- a/indra/newview/skins/default/textures/icn_voice-groupfocus.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/icn_voice-localchat.tga b/indra/newview/skins/default/textures/icn_voice-localchat.tgaBinary files differ deleted file mode 100644 index 7cf267eaf5..0000000000 --- a/indra/newview/skins/default/textures/icn_voice-localchat.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/icn_voice-pvtfocus.tga b/indra/newview/skins/default/textures/icn_voice-pvtfocus.tgaBinary files differ deleted file mode 100644 index abadb09aaf..0000000000 --- a/indra/newview/skins/default/textures/icn_voice-pvtfocus.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/icon_day_cycle.tga b/indra/newview/skins/default/textures/icon_day_cycle.tgaBinary files differ deleted file mode 100644 index 2d5dee1e94..0000000000 --- a/indra/newview/skins/default/textures/icon_day_cycle.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/icon_event_adult.tga b/indra/newview/skins/default/textures/icon_event_adult.tgaBinary files differ deleted file mode 100644 index f548126e5a..0000000000 --- a/indra/newview/skins/default/textures/icon_event_adult.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/icon_lock.tga b/indra/newview/skins/default/textures/icon_lock.tgaBinary files differ deleted file mode 100644 index 23521aa113..0000000000 --- a/indra/newview/skins/default/textures/icon_lock.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/AddItem_Over.png b/indra/newview/skins/default/textures/icons/AddItem_Over.pngBinary files differ deleted file mode 100644 index cad6e8d52f..0000000000 --- a/indra/newview/skins/default/textures/icons/AddItem_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/BackArrow_Over.png b/indra/newview/skins/default/textures/icons/BackArrow_Over.pngBinary files differ deleted file mode 100644 index b36e03a8cf..0000000000 --- a/indra/newview/skins/default/textures/icons/BackArrow_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/DragHandle.png b/indra/newview/skins/default/textures/icons/DragHandle.pngBinary files differ deleted file mode 100644 index c3cbc07a33..0000000000 --- a/indra/newview/skins/default/textures/icons/DragHandle.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/Generic_Object.png b/indra/newview/skins/default/textures/icons/Generic_Object.pngBinary files differ deleted file mode 100644 index e3a80b2aef..0000000000 --- a/indra/newview/skins/default/textures/icons/Generic_Object.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/Inv_Gift.png b/indra/newview/skins/default/textures/icons/Inv_Gift.pngBinary files differ deleted file mode 100644 index 5afe85d72d..0000000000 --- a/indra/newview/skins/default/textures/icons/Inv_Gift.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/OptionsMenu_Over.png b/indra/newview/skins/default/textures/icons/OptionsMenu_Over.pngBinary files differ deleted file mode 100644 index fcabd4c6d3..0000000000 --- a/indra/newview/skins/default/textures/icons/OptionsMenu_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_On_Selected.png b/indra/newview/skins/default/textures/icons/OutboxPush_On_Selected.pngBinary files differ deleted file mode 100644 index 0e60b417b0..0000000000 --- a/indra/newview/skins/default/textures/icons/OutboxPush_On_Selected.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.png b/indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.pngBinary files differ deleted file mode 100644 index d72f02f708..0000000000 --- a/indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png b/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.pngBinary files differ deleted file mode 100644 index f82354959e..0000000000 --- a/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/TrashItem_Over.png b/indra/newview/skins/default/textures/icons/TrashItem_Over.pngBinary files differ deleted file mode 100644 index 1a0eea6c67..0000000000 --- a/indra/newview/skins/default/textures/icons/TrashItem_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png b/indra/newview/skins/default/textures/icons/parcel_color_EVRY.pngBinary files differ deleted file mode 100644 index b5508423eb..0000000000 --- a/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/parcel_color_EXP.png b/indra/newview/skins/default/textures/icons/parcel_color_EXP.pngBinary files differ deleted file mode 100644 index 4813d37198..0000000000 --- a/indra/newview/skins/default/textures/icons/parcel_color_EXP.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/parcel_color_M.png b/indra/newview/skins/default/textures/icons/parcel_color_M.pngBinary files differ deleted file mode 100644 index 41984c43e4..0000000000 --- a/indra/newview/skins/default/textures/icons/parcel_color_M.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/image_edit_icon.tga b/indra/newview/skins/default/textures/image_edit_icon.tgaBinary files differ deleted file mode 100644 index 8666f0bbe6..0000000000 --- a/indra/newview/skins/default/textures/image_edit_icon.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/inv_folder_animation.tga b/indra/newview/skins/default/textures/inv_folder_animation.tgaBinary files differ deleted file mode 100644 index 1b4df7a2d8..0000000000 --- a/indra/newview/skins/default/textures/inv_folder_animation.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/inv_folder_inbox.tga b/indra/newview/skins/default/textures/inv_folder_inbox.tgaBinary files differ deleted file mode 100644 index 04539c2cc4..0000000000 --- a/indra/newview/skins/default/textures/inv_folder_inbox.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/map_avatar_above_8.tga b/indra/newview/skins/default/textures/map_avatar_above_8.tgaBinary files differ deleted file mode 100644 index 193428e530..0000000000 --- a/indra/newview/skins/default/textures/map_avatar_above_8.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/map_avatar_below_8.tga b/indra/newview/skins/default/textures/map_avatar_below_8.tgaBinary files differ deleted file mode 100644 index 9e14bfab90..0000000000 --- a/indra/newview/skins/default/textures/map_avatar_below_8.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/map_event_adult.tga b/indra/newview/skins/default/textures/map_event_adult.tgaBinary files differ deleted file mode 100644 index f548126e5a..0000000000 --- a/indra/newview/skins/default/textures/map_event_adult.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/map_event_mature.tga b/indra/newview/skins/default/textures/map_event_mature.tgaBinary files differ deleted file mode 100644 index 71067c0dfd..0000000000 --- a/indra/newview/skins/default/textures/map_event_mature.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/map_track_8.tga b/indra/newview/skins/default/textures/map_track_8.tgaBinary files differ deleted file mode 100644 index 53425ff45b..0000000000 --- a/indra/newview/skins/default/textures/map_track_8.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/model_wizard/divider_line.png b/indra/newview/skins/default/textures/model_wizard/divider_line.pngBinary files differ deleted file mode 100644 index 76c9e68767..0000000000 --- a/indra/newview/skins/default/textures/model_wizard/divider_line.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/mute_icon.tga b/indra/newview/skins/default/textures/mute_icon.tgaBinary files differ deleted file mode 100644 index 879b9e6188..0000000000 --- a/indra/newview/skins/default/textures/mute_icon.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/navbar/Arrow_Left_Over.png b/indra/newview/skins/default/textures/navbar/Arrow_Left_Over.pngBinary files differ deleted file mode 100644 index a91b74819f..0000000000 --- a/indra/newview/skins/default/textures/navbar/Arrow_Left_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/navbar/Arrow_Right_Over.png b/indra/newview/skins/default/textures/navbar/Arrow_Right_Over.pngBinary files differ deleted file mode 100644 index a2caf227a7..0000000000 --- a/indra/newview/skins/default/textures/navbar/Arrow_Right_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/navbar/Help_Over.png b/indra/newview/skins/default/textures/navbar/Help_Over.pngBinary files differ deleted file mode 100644 index b9bc0d0f87..0000000000 --- a/indra/newview/skins/default/textures/navbar/Help_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/navbar/Home_Over.png b/indra/newview/skins/default/textures/navbar/Home_Over.pngBinary files differ deleted file mode 100644 index d9c6b3842e..0000000000 --- a/indra/newview/skins/default/textures/navbar/Home_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/places_rating_adult.tga b/indra/newview/skins/default/textures/places_rating_adult.tgaBinary files differ deleted file mode 100644 index c344fb1e78..0000000000 --- a/indra/newview/skins/default/textures/places_rating_adult.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/places_rating_mature.tga b/indra/newview/skins/default/textures/places_rating_mature.tgaBinary files differ deleted file mode 100644 index 61c879bc92..0000000000 --- a/indra/newview/skins/default/textures/places_rating_mature.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/places_rating_pg.tga b/indra/newview/skins/default/textures/places_rating_pg.tgaBinary files differ deleted file mode 100644 index 7805dbce60..0000000000 --- a/indra/newview/skins/default/textures/places_rating_pg.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/propertyline.tga b/indra/newview/skins/default/textures/propertyline.tgaBinary files differ deleted file mode 100644 index 0c504eea71..0000000000 --- a/indra/newview/skins/default/textures/propertyline.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/avatar_free_mode.png b/indra/newview/skins/default/textures/quick_tips/avatar_free_mode.pngBinary files differ deleted file mode 100644 index be7c87efb6..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/avatar_free_mode.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/camera_free_mode.png b/indra/newview/skins/default/textures/quick_tips/camera_free_mode.pngBinary files differ deleted file mode 100644 index 9a3f3703b2..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/camera_free_mode.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/camera_orbit_mode.png b/indra/newview/skins/default/textures/quick_tips/camera_orbit_mode.pngBinary files differ deleted file mode 100644 index dd72cc0162..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/camera_orbit_mode.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/camera_pan_mode.png b/indra/newview/skins/default/textures/quick_tips/camera_pan_mode.pngBinary files differ deleted file mode 100644 index b537dcbe46..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/camera_pan_mode.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/camera_preset_front_view.png b/indra/newview/skins/default/textures/quick_tips/camera_preset_front_view.pngBinary files differ deleted file mode 100644 index 7674a75ac3..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/camera_preset_front_view.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/camera_preset_group_view.png b/indra/newview/skins/default/textures/quick_tips/camera_preset_group_view.pngBinary files differ deleted file mode 100644 index 9c9b923a5a..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/camera_preset_group_view.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/camera_preset_rear_view.png b/indra/newview/skins/default/textures/quick_tips/camera_preset_rear_view.pngBinary files differ deleted file mode 100644 index 15c3053491..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/camera_preset_rear_view.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/move_fly_first.png b/indra/newview/skins/default/textures/quick_tips/move_fly_first.pngBinary files differ deleted file mode 100644 index b6e2ce60e4..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/move_fly_first.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/move_fly_second.png b/indra/newview/skins/default/textures/quick_tips/move_fly_second.pngBinary files differ deleted file mode 100644 index 84b63cc338..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/move_fly_second.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/move_run_first.png b/indra/newview/skins/default/textures/quick_tips/move_run_first.pngBinary files differ deleted file mode 100644 index 16093dc683..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/move_run_first.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/move_run_second.png b/indra/newview/skins/default/textures/quick_tips/move_run_second.pngBinary files differ deleted file mode 100644 index 19fa43ec32..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/move_run_second.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/move_walk_first.png b/indra/newview/skins/default/textures/quick_tips/move_walk_first.pngBinary files differ deleted file mode 100644 index 92d120d53e..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/move_walk_first.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/move_walk_second.png b/indra/newview/skins/default/textures/quick_tips/move_walk_second.pngBinary files differ deleted file mode 100644 index f8e28722be..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/move_walk_second.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/show_btn.tga b/indra/newview/skins/default/textures/show_btn.tgaBinary files differ deleted file mode 100644 index 5f05f377e3..0000000000 --- a/indra/newview/skins/default/textures/show_btn.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/show_btn_selected.tga b/indra/newview/skins/default/textures/show_btn_selected.tgaBinary files differ deleted file mode 100644 index 00a2f34a37..0000000000 --- a/indra/newview/skins/default/textures/show_btn_selected.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/smicon_warn.tga b/indra/newview/skins/default/textures/smicon_warn.tgaBinary files differ deleted file mode 100644 index 90ccaa07e5..0000000000 --- a/indra/newview/skins/default/textures/smicon_warn.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/snapshot_download.png b/indra/newview/skins/default/textures/snapshot_download.pngBinary files differ new file mode 100644 index 0000000000..6aa1abded5 --- /dev/null +++ b/indra/newview/skins/default/textures/snapshot_download.png diff --git a/indra/newview/skins/default/textures/snapshot_email.png b/indra/newview/skins/default/textures/snapshot_email.pngBinary files differ new file mode 100644 index 0000000000..dee784a9bf --- /dev/null +++ b/indra/newview/skins/default/textures/snapshot_email.png diff --git a/indra/newview/skins/default/textures/spacer35.tga b/indra/newview/skins/default/textures/spacer35.tgaBinary files differ deleted file mode 100644 index b88bc6680a..0000000000 --- a/indra/newview/skins/default/textures/spacer35.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/square_btn_32x128.tga b/indra/newview/skins/default/textures/square_btn_32x128.tgaBinary files differ deleted file mode 100644 index d7ce58dac3..0000000000 --- a/indra/newview/skins/default/textures/square_btn_32x128.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/square_btn_selected_32x128.tga b/indra/newview/skins/default/textures/square_btn_selected_32x128.tgaBinary files differ deleted file mode 100644 index 59ca365aa4..0000000000 --- a/indra/newview/skins/default/textures/square_btn_selected_32x128.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/startup_logo.j2c b/indra/newview/skins/default/textures/startup_logo.j2cBinary files differ deleted file mode 100644 index d1b991f17f..0000000000 --- a/indra/newview/skins/default/textures/startup_logo.j2c +++ /dev/null diff --git a/indra/newview/skins/default/textures/status_busy.tga b/indra/newview/skins/default/textures/status_busy.tgaBinary files differ deleted file mode 100644 index 7743d9c7bb..0000000000 --- a/indra/newview/skins/default/textures/status_busy.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.pngBinary files differ deleted file mode 100644 index 0b91abfb0d..0000000000 --- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.pngBinary files differ deleted file mode 100644 index 33a47236a5..0000000000 --- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.pngBinary files differ deleted file mode 100644 index 421f5e1705..0000000000 --- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Me_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Me_Selected.pngBinary files differ deleted file mode 100644 index 905d4c973e..0000000000 --- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Me_Selected.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_People_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_People_Selected.pngBinary files differ deleted file mode 100644 index 909f0d0a47..0000000000 --- a/indra/newview/skins/default/textures/taskpanel/TabIcon_People_Selected.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Large.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Large.pngBinary files differ deleted file mode 100644 index cc505c4a30..0000000000 --- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Large.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.pngBinary files differ deleted file mode 100644 index 8e0fb9661e..0000000000 --- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Things_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Things_Selected.pngBinary files differ deleted file mode 100644 index d4ac451c8e..0000000000 --- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Things_Selected.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index bb91d32c6c..8702ebde2a 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -39,7 +39,7 @@ with the same filename but different name    <texture name="Accordion_Over" file_name="containers/Accordion_Over.png" preload="false" />    <texture name="Accordion_Selected" file_name="containers/Accordion_Selected.png" preload="false" /> -<texture name="Activate_Checkmark" file_name="taskpanel/Activate_Checkmark.png" preload="false" /> +  <texture name="Activate_Checkmark" file_name="taskpanel/Activate_Checkmark.png" preload="false" />    <texture name="AddItem_Disabled" file_name="icons/AddItem_Disabled.png" preload="false" />    <texture name="AddItem_Off" file_name="icons/AddItem_Off.png" preload="false" /> @@ -48,9 +48,6 @@ with the same filename but different name    <texture name="Arrow_Left_Off" file_name="navbar/Arrow_Left_Off.png" preload="true" />    <texture name="Arrow_Right_Off" file_name="navbar/Arrow_Right_Off.png" preload="true" /> -<!-- ---> -    <texture name="Arrow_Small_Up" file_name="widgets/Arrow_Small_Up.png" preload="true" />    <texture name="Arrow_Small_Left" file_name="widgets/Arrow_Small_Left.png" preload="true" />    <texture name="Arrow_Small_Right" file_name="widgets/Arrow_Small_Right.png" preload="true" /> @@ -157,7 +154,6 @@ with the same filename but different name    <texture name="ComboButton_Disabled" file_name="widgets/ComboButton_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />    <texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />    <texture name="ComboButton_UpSelected" file_name="widgets/ComboButton_UpSelected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> -  <texture name="ComboButton_Up_On_Selected" file_name="widgets/ComboButton_Up_On_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />    <texture name="ComboButton_On" file_name="widgets/ComboButton_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />    <texture name="ComboButton_Off" file_name="widgets/ComboButton_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />    <texture name="ComboButton_UpOff" file_name="widgets/ComboButton_UpOff.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> @@ -190,6 +186,10 @@ with the same filename but different name    <texture name="Flag" file_name="navbar/Flag.png" preload="false" /> +  <texture name="Flyout_Left" file_name="windows/Flyout_Left.png" preload="false" /> +  <texture name="Flyout_Pointer" file_name="windows/Flyout_Pointer.png" preload="false" /> +  <texture name="Flyout_Right" file_name="windows/Flyout_Right.png" preload="false" /> +    <texture name="Folder_Arrow" file_name="folder_arrow.tga" preload="false" />    <texture name="ForSale_Badge" file_name="icons/ForSale_Badge.png" preload="false" />    <texture name="ForwardArrow_Off" file_name="icons/ForwardArrow_Off.png" preload="false" /> @@ -547,6 +547,10 @@ with the same filename but different name    <texture name="Unknown_Icon" file_name="icons/unknown_icon.png" preload="true" />    <texture name="Snapshot_Off" file_name="bottomtray/Snapshot_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> +  <texture name="Snapshot_Download" file_name="snapshot_download.png" preload="false" /> +  <texture name="Snapshot_Email" file_name="snapshot_email.png" preload="false" /> +  <texture name="Snapshot_Inventory" file_name="toolbar_icons/inventory.png" preload="false" /> +  <texture name="Snapshot_Profile" file_name="toolbar_icons/profile.png" preload="false" />    <texture name="startup_logo"  file_name="windows/startup_logo.png" preload="true" /> @@ -568,21 +572,13 @@ with the same filename but different name    <texture name="Sync_Progress_5" file_name="icons/Sync_Progress_5.png" preload="true" />    <texture name="Sync_Progress_6" file_name="icons/Sync_Progress_6.png" preload="true" /> -  <texture name="TabIcon_Appearance_Off" file_name="taskpanel/TabIcon_Appearance_Off.png" preload="false" /> -  <texture name="TabIcon_Appearance_Selected" file_name="taskpanel/TabIcon_Appearance_Selected.png" preload="false" />    <texture name="TabIcon_Close_Off" file_name="taskpanel/TabIcon_Close_Off.png" preload="false" /> -  <texture name="TabIcon_Home_Off" file_name="taskpanel/TabIcon_Home_Off.png" preload="false" />    <texture name="TabIcon_Home_Selected" file_name="taskpanel/TabIcon_Home_Selected.png" preload="false" />    <texture name="TabIcon_Me_Off" file_name="taskpanel/TabIcon_Me_Off.png" preload="false" /> -  <texture name="TabIcon_Me_Selected" file_name="taskpanel/TabIcon_Me_Selected.png" preload="false" />    <texture name="TabIcon_Open_Off" file_name="taskpanel/TabIcon_Open_Off.png" preload="false" />    <texture name="TabIcon_People_Off" file_name="taskpanel/TabIcon_People_Off.png" preload="false" /> -  <texture name="TabIcon_People_Selected" file_name="taskpanel/TabIcon_People_Selected.png" preload="false" /> -  <texture name="TabIcon_Places_Large" file_name="taskpanel/TabIcon_Places_Large.png" preload="false" />    <texture name="TabIcon_Places_Off" file_name="taskpanel/TabIcon_Places_Off.png" preload="false" /> -  <texture name="TabIcon_Places_Selected" file_name="taskpanel/TabIcon_Places_Selected.png" preload="false" />    <texture name="TabIcon_Things_Off" file_name="taskpanel/TabIcon_Things_Off.png" preload="false" /> -  <texture name="TabIcon_Things_Selected" file_name="taskpanel/TabIcon_Things_Selected.png" preload="false" />    <texture name="TabTop_Right_Off" file_name="containers/TabTop_Right_Off.png" preload="false"  scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />    <texture name="TabTop_Right_Selected" file_name="containers/TabTop_Right_Selected.png" preload="false"  scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" /> @@ -646,6 +642,12 @@ with the same filename but different name    <texture name="VoicePTT_Lvl3" file_name="bottomtray/VoicePTT_Lvl3.png" preload="false" />    <texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" />    <texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" /> +   +  <texture name="VoicePTT_Lvl1_Dark" file_name="bottomtray/VoicePTT_Lvl1_Dark.png" preload="false" /> +  <texture name="VoicePTT_Lvl2_Dark" file_name="bottomtray/VoicePTT_Lvl2_Dark.png" preload="false" /> +  <texture name="VoicePTT_Lvl3_Dark" file_name="bottomtray/VoicePTT_Lvl3_Dark.png" preload="false" /> +  <texture name="VoicePTT_Off_Dark" file_name="bottomtray/VoicePTT_Off_Dark.png" preload="false" /> +  <texture name="VoicePTT_On_Dark" file_name="bottomtray/VoicePTT_On_Dark.png" preload="false" />    <texture name="Wearables_Divider" file_name="windows/Wearables_Divider.png" preload="false" /> @@ -678,9 +680,6 @@ with the same filename but different name    <!--WARNING OLD ART BELOW *do not use*-->    <texture name="icn_media_web.tga" preload="true" />    <texture name="icn_media_movie.tga" preload="true" /> -  <texture name="icn_voice-localchat.tga" /> -  <texture name="icn_voice-groupfocus.tga" /> -  <texture name="icn_voice-pvtfocus.tga" />    <texture name="jump_left_out.tga" file_name="widgets/jump_left_out.png" />    <texture name="jump_left_in.tga" file_name="widgets/jump_left_in.png" /> @@ -714,7 +713,6 @@ with the same filename but different name    <texture name="icon_avatar_offline.tga" />    <texture name="icon_avatar_online.tga" /> -  <texture name="icon_day_cycle.tga" />    <texture name="icon_diurnal.tga" />    <texture name="icon_for_sale.tga" file_name="icons/Icon_For_Sale.png" />    <texture name="icon_top_pick.tga" /> @@ -731,7 +729,6 @@ with the same filename but different name    <texture name="map_avatar_16.tga" />    <texture name="map_avatar_8.tga" />    <texture name="map_event.tga" /> -  <texture name="map_event_mature.tga" />    <texture name="map_home.tga" />    <texture name="map_infohub.tga" />    <texture name="map_telehub.tga" /> diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_On_Over.png b/indra/newview/skins/default/textures/widgets/Checkbox_On_Over.pngBinary files differ deleted file mode 100644 index bc504d130e..0000000000 --- a/indra/newview/skins/default/textures/widgets/Checkbox_On_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_Over.png b/indra/newview/skins/default/textures/widgets/Checkbox_Over.pngBinary files differ deleted file mode 100644 index 5a7162addf..0000000000 --- a/indra/newview/skins/default/textures/widgets/Checkbox_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png b/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.pngBinary files differ deleted file mode 100644 index fd1d11dd0b..0000000000 --- a/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Closed_Over.png b/indra/newview/skins/default/textures/widgets/DisclosureArrow_Closed_Over.pngBinary files differ deleted file mode 100644 index 45bcb0464e..0000000000 --- a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Closed_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Opened_Over.png b/indra/newview/skins/default/textures/widgets/DisclosureArrow_Opened_Over.pngBinary files differ deleted file mode 100644 index dabbd85b34..0000000000 --- a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Opened_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/PushButton_On_Over.png b/indra/newview/skins/default/textures/widgets/PushButton_On_Over.pngBinary files differ deleted file mode 100644 index 064a4c4f7f..0000000000 --- a/indra/newview/skins/default/textures/widgets/PushButton_On_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Selected_Over.png b/indra/newview/skins/default/textures/widgets/PushButton_Selected_Over.pngBinary files differ deleted file mode 100644 index 064a4c4f7f..0000000000 --- a/indra/newview/skins/default/textures/widgets/PushButton_Selected_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_On_Over.png b/indra/newview/skins/default/textures/widgets/RadioButton_On_Over.pngBinary files differ deleted file mode 100644 index 3e7d803a28..0000000000 --- a/indra/newview/skins/default/textures/widgets/RadioButton_On_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_Over.png b/indra/newview/skins/default/textures/widgets/RadioButton_Over.pngBinary files differ deleted file mode 100644 index a5c8cbe293..0000000000 --- a/indra/newview/skins/default/textures/widgets/RadioButton_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Down_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Down_Over.pngBinary files differ deleted file mode 100644 index 605d159eaa..0000000000 --- a/indra/newview/skins/default/textures/widgets/ScrollArrow_Down_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over.pngBinary files differ deleted file mode 100644 index c79547dffd..0000000000 --- a/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over.pngBinary files differ deleted file mode 100644 index e353542ad9..0000000000 --- a/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Up_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Up_Over.pngBinary files differ deleted file mode 100644 index dd2fceb716..0000000000 --- a/indra/newview/skins/default/textures/widgets/ScrollArrow_Up_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz_Over.png b/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz_Over.pngBinary files differ deleted file mode 100644 index cf78ea3924..0000000000 --- a/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert_Over.png b/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert_Over.pngBinary files differ deleted file mode 100644 index 53587197da..0000000000 --- a/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On.pngBinary files differ deleted file mode 100644 index 7afb9c99c3..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Disabled.pngBinary files differ deleted file mode 100644 index 77c4224539..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Disabled.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Over.pngBinary files differ deleted file mode 100644 index 8b93dd551e..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Selected.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Selected.pngBinary files differ deleted file mode 100644 index 3f207cbea2..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Selected.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On.pngBinary files differ deleted file mode 100644 index 220df9db25..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Over.pngBinary files differ deleted file mode 100644 index 5bbcdcb0b4..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Press.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Press.pngBinary files differ deleted file mode 100644 index dde367f05e..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Press.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Over.pngBinary files differ deleted file mode 100644 index d4f30b9adb..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Over.pngBinary files differ deleted file mode 100644 index 5bbcdcb0b4..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On.pngBinary files differ deleted file mode 100644 index 467c43fc90..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Over.pngBinary files differ deleted file mode 100644 index 2049736897..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Over.pngBinary files differ deleted file mode 100644 index 2049736897..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SliderThumb_Over.png b/indra/newview/skins/default/textures/widgets/SliderThumb_Over.pngBinary files differ deleted file mode 100644 index b6f900d3bd..0000000000 --- a/indra/newview/skins/default/textures/widgets/SliderThumb_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Down_Over.png b/indra/newview/skins/default/textures/widgets/Stepper_Down_Over.pngBinary files differ deleted file mode 100644 index 01e0a2d9f1..0000000000 --- a/indra/newview/skins/default/textures/widgets/Stepper_Down_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Up_Over.png b/indra/newview/skins/default/textures/widgets/Stepper_Up_Over.pngBinary files differ deleted file mode 100644 index 2ce84ea5be..0000000000 --- a/indra/newview/skins/default/textures/widgets/Stepper_Up_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/windows/Flyout.png b/indra/newview/skins/default/textures/windows/Flyout.pngBinary files differ deleted file mode 100644 index 5596b194c9..0000000000 --- a/indra/newview/skins/default/textures/windows/Flyout.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png b/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.pngBinary files differ deleted file mode 100644 index 361fab59e0..0000000000 --- a/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png b/indra/newview/skins/default/textures/windows/Icon_Gear_Over.pngBinary files differ deleted file mode 100644 index 67bd399358..0000000000 --- a/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/windows/Icon_Undock_Press.png b/indra/newview/skins/default/textures/windows/Icon_Undock_Press.pngBinary files differ deleted file mode 100644 index 3ab8c3666a..0000000000 --- a/indra/newview/skins/default/textures/windows/Icon_Undock_Press.png +++ /dev/null diff --git a/indra/newview/skins/default/xui/da/floater_nearby_chat.xml b/indra/newview/skins/default/xui/da/floater_nearby_chat.xml index bd17224259..76bc40edac 100644 --- a/indra/newview/skins/default/xui/da/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/da/floater_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="nearby_chat" title="CHAT NÆRVED"> -	<check_box label="Oversæt chat (håndteret af Google)" name="translate_chat_checkbox"/> +	<check_box label="Oversæt chat" name="translate_chat_checkbox"/>  </floater> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml index f0f6242fff..890a3038ef 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml @@ -31,7 +31,7 @@  	<spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_fadingtime"/>  	<check_box name="translate_chat_checkbox"/>  	<text name="translate_chb_label"> -		Benyt maskinel oversættelse ved chat (håndteret af Google) +		Benyt maskinel oversættelse ved chat  	</text>  	<text name="translate_language_text" width="110">  		Oversæt chat til : diff --git a/indra/newview/skins/default/xui/da/teleport_strings.xml b/indra/newview/skins/default/xui/da/teleport_strings.xml index 071aab46f4..0d89fae986 100644 --- a/indra/newview/skins/default/xui/da/teleport_strings.xml +++ b/indra/newview/skins/default/xui/da/teleport_strings.xml @@ -20,6 +20,10 @@ Hvis du stadig ikke kan teleporte, prøv venligst at logge ud og ligge ind for a  			Beklager, systemet kunne ikke fuldføre teleport forbindelse.  Prøv igen om lidt.  		</message> +		<message name="NoHelpIslandTP"> +		Du kan ikke teleportere tilbage til Welcome Island. +Gå til 'Welcome Island Puclic' for at prøve tutorial igen. +		</message>  		<message name="noaccess_tport">  			Beklager, du har ikke adgang til denne teleport destination.  		</message> diff --git a/indra/newview/skins/default/xui/de/floater_nearby_chat.xml b/indra/newview/skins/default/xui/de/floater_nearby_chat.xml index bbb4114200..2aabbb18f2 100644 --- a/indra/newview/skins/default/xui/de/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/de/floater_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="nearby_chat" title="CHAT IN DER NÄHE"> -	<check_box label="Chat übersetzen (Service von Google)" name="translate_chat_checkbox"/> +	<check_box label="Chat übersetzen" name="translate_chat_checkbox"/>  </floater> diff --git a/indra/newview/skins/default/xui/de/panel_nearby_chat.xml b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml index c3ce42efa1..2068c39024 100644 --- a/indra/newview/skins/default/xui/de/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="nearby_chat"> -	<check_box label="Chat übersetzen (von Google bereitgestellt)" name="translate_chat_checkbox"/> +	<check_box label="Chat übersetzen" name="translate_chat_checkbox"/>  </panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml index 104f89b80c..04f6c27330 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml @@ -31,7 +31,7 @@  	<spinner label="Ein-/Ausblenddauer von Toasts für Chat in der Nähe:" name="nearby_toasts_fadingtime"/>  	<check_box name="translate_chat_checkbox"/>  	<text name="translate_chb_label"> -		Beim Chatten Maschinenübersetzung verwenden (von Google bereitgestellt) +		Beim Chatten Maschinenübersetzung verwenden  	</text>  	<text name="translate_language_text">  		Chat übersetzen in: diff --git a/indra/newview/skins/default/xui/de/teleport_strings.xml b/indra/newview/skins/default/xui/de/teleport_strings.xml index 69c952c532..bbfc830688 100644 --- a/indra/newview/skins/default/xui/de/teleport_strings.xml +++ b/indra/newview/skins/default/xui/de/teleport_strings.xml @@ -20,6 +20,10 @@ Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab u  			Das System konnte keine Teleport-Verbindung herstellen.  Versuchen Sie es später noch einmal.  		</message> +		<message name="NoHelpIslandTP"> +		Sie können nicht zurück nach Welcome Island teleportieren.  +Gehen Sie zu „Welcome Island Public“ und wiederholen sie das Tutorial. +		</message>  		<message name="noaccess_tport">  			Sie haben leider keinen Zugang zu diesem Teleport-Ziel.  		</message> diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index eaffbf5fa6..1c7b354221 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -487,7 +487,7 @@               name="DwellText"               top_delta="0"               width="186"> -                0 +                Loading...              </text>              <button diff --git a/indra/newview/skins/default/xui/en/floater_avatar.xml b/indra/newview/skins/default/xui/en/floater_avatar.xml index 2d973e7d90..6009821f7f 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar.xml @@ -16,11 +16,11 @@   save_rect="true"   save_visibility="true"   title="AVATAR PICKER" - width="635"> + width="700">      <web_browser        top="25"        height="200" -      width="635" +      width="700"        follows="all"        name="avatar_picker_contents"        trusted_content="true"/> diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml index b9c415633f..0637eedfb2 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml @@ -23,6 +23,5 @@      right="-1"       top="1"      bottom="-1"  -    ignore_ui_scale="false"      name="browser"/>  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 91b4ed6954..d7a1510c1c 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -5,400 +5,308 @@   can_minimize="true"   can_close="true"   follows="left|top" - height="520" + height="600"   layout="topleft"   name="Snapshot"   help_topic="snapshot"   save_rect="true"   save_visibility="true"   title="SNAPSHOT PREVIEW" - width="245"> + width="470">      <floater.string       name="unknown">          unknown      </floater.string> -    <radio_group -     height="70" -     label="Snapshot type" -     layout="topleft" -     left="10" -     name="snapshot_type_radio" -     top="20" -     width="205"> -<!-- -        <radio_item -         height="16" -         label="Share to Web" -         layout="topleft" -         name="share_to_web" -         top_pad="0" /> ---> -         <radio_item -         height="16" -         label="Email" -         layout="topleft" -         name="postcard" -         top_pad="2" /> -        <radio_item -         height="16" -         label="My inventory (L$[AMOUNT])" -         layout="topleft" -         name="texture" -         top_pad="2" /> -        <radio_item -         height="16" -         label="Save to my computer" -         layout="topleft" -         name="local" -         top_pad="2" /> -    </radio_group> -  <ui_ctrl  -    height="90" -    width="125" +    <string +     name="postcard_progress_str"> +        Sending Email +    </string> +    <string +     name="profile_progress_str"> +        Posting +    </string> +    <string +     name="inventory_progress_str"> +        Saving to Inventory +    </string> +    <string +     name="local_progress_str"> +        Saving to Computer +    </string> + 	<string + 	 name="profile_succeeded_str"> + 	    Your Profile Feed has been updated! + 	</string> + 	<string + 	 name="postcard_succeeded_str"> + 	    Email Sent! + 	</string> + 	<string + 	 name="inventory_succeeded_str"> + 	    Saved to Inventory! + 	</string> + 	<string + 	 name="local_succeeded_str"> + 	    Saved to Computer! + 	</string> + 	<string + 	 name="profile_failed_str"> + 	    Failed to update your Profile Feed. + 	</string> + 	<string + 	 name="postcard_failed_str"> + 	    Failed to send email. + 	</string> + 	<string + 	 name="inventory_failed_str"> + 	    Failed to save to inventory. + 	</string> + 	<string + 	 name="local_failed_str"> + 	    Failed to save to computer. + 	</string> +   <view_border  +    bevel_style="in" +    follows="left|top"  +    height="21" +    left="10"      layout="topleft" -    name="thumbnail_placeholder" -    top_pad="6" +    name="img_info_border" +    top="22" +    width="50" +   /> +   <icon +    follows="top|left" +    height="18" +    image_name="Snapshot_Off" +    layout="topleft" +    left_delta="-5" +    mouse_opaque="true" +    name="refresh_icon" +    top_delta="3" +    width="36" /> +   <button      follows="left|top" -    left="10" -    /> -    <text -     type="string" -     font="SansSerifSmall" -     length="1" -     follows="left|top" -     height="14" -     layout="topleft" -     right="-5" -     left_delta="0" -     halign="right" -     name="file_size_label" -     top_pad="8" -     width="195"> -        [SIZE] KB -    </text> -    <button -     follows="left|top" -     height="22" -     image_overlay="Refresh_Off" -     layout="topleft" -     left="10" -     name="new_snapshot_btn" -     width="23" /> -    <button -     follows="left|top" -     height="23" -     label="Send" -     layout="topleft" -     left_pad="5" -     right="-5" -     name="send_btn" -     width="100" /> -    <button -     follows="left|top" -     height="23" -     label="Save (L$[AMOUNT])" -     layout="topleft" -     right="-5" -     name="upload_btn" -     top_delta="0" -     width="110" /> -    <flyout_button -     follows="left|top" -     height="23" -     label="Save" -     layout="topleft" -     right="-5" -     name="save_btn" -     tool_tip="Save image to a file" -     top_delta="0" -     width="100"> -        <flyout_button.item -         label="Save" -         name="save_item" -         value="save" /> -        <flyout_button.item -         label="Save As..." -         name="saveas_item" -         value="save as" /> -    </flyout_button> -        <button -     follows="left|top" -     height="23" -     label="More" -     layout="topleft" -     left="10" -     name="more_btn" -     tool_tip="Advanced options" -     width="80" /> +    height="22" +    image_overlay="Refresh_Off" +    layout="topleft" +    left_delta="31" +    name="new_snapshot_btn" +    top_delta="-3" +    width="23" />      <button       follows="left|top"       height="23" -     label="Less" +     image_overlay="TabIcon_Close_Off" +     is_toggle="true"       layout="topleft" -     left_delta="0" -     name="less_btn" +     left="240" +     name="advanced_options_btn"       tool_tip="Advanced options"       top_delta="0" -     width="80" /> -    <button -     follows="left|top" -     height="23" -     label="Cancel" -     layout="topleft" -     right="-5" -     left_pad="5" -     name="discard_btn" -     width="110" /> -    <text -     type="string" -     length="1" -     follows="top|left" -     height="12" -     layout="topleft" -     left="10" -     name="type_label2" -     top_pad="5" -     width="127"> -        Size -    </text> -    <text -     type="string" -     length="1" -     follows="top|left" -     height="12" -     layout="topleft" -     left_pad="5" -     name="format_label" -     top_delta="0" -     width="70"> -        Format -    </text> -    <combo_box -     height="23" -     label="Resolution" -     layout="topleft" -     left="10" -     name="postcard_size_combo" -     width="120"> -        <combo_box.item -         label="Current Window" -         name="CurrentWindow" -         value="[i0,i0]" /> -        <combo_box.item -         label="640x480" -         name="640x480" -         value="[i640,i480]" /> -        <combo_box.item -         label="800x600" -         name="800x600" -         value="[i800,i600]" /> -        <combo_box.item -         label="1024x768" -         name="1024x768" -         value="[i1024,i768]" /> -        <combo_box.item -         label="Custom" -         name="Custom" -         value="[i-1,i-1]" /> -    </combo_box> -    <combo_box -     height="23" -     label="Resolution" -     layout="topleft" -     left_delta="0" -     name="texture_size_combo" -     top_delta="0" -     width="127"> -        <combo_box.item -         label="Current Window" -         name="CurrentWindow" -         value="[i0,i0]" /> -        <combo_box.item -         label="Small (128x128)" -         name="Small(128x128)" -         value="[i128,i128]" /> -        <combo_box.item -         label="Medium (256x256)" -         name="Medium(256x256)" -         value="[i256,i256]" /> -        <combo_box.item -         label="Large (512x512)" -         name="Large(512x512)" -         value="[i512,i512]" /> -        <combo_box.item -         label="Custom" -         name="Custom" -         value="[i-1,i-1]" /> -    </combo_box> -    <combo_box -     height="23" -     label="Resolution" -     layout="topleft" -     left_delta="0" -     name="local_size_combo" -     top_delta="0" -     width="127"> -        <combo_box.item -         label="Current Window" -         name="CurrentWindow" -         value="[i0,i0]" /> -        <combo_box.item -         label="320x240" -         name="320x240" -         value="[i320,i240]" /> -        <combo_box.item -         label="640x480" -         name="640x480" -         value="[i640,i480]" /> -        <combo_box.item -         label="800x600" -         name="800x600" -         value="[i800,i600]" /> -        <combo_box.item -         label="1024x768" -         name="1024x768" -         value="[i1024,i768]" /> -        <combo_box.item -         label="1280x1024" -         name="1280x1024" -         value="[i1280,i1024]" /> -        <combo_box.item -         label="1600x1200" -         name="1600x1200" -         value="[i1600,i1200]" /> -        <combo_box.item -         label="Custom" -         name="Custom" -         value="[i-1,i-1]" /> -    </combo_box> -    <combo_box -     height="23" -     label="Format" -     layout="topleft" -     left_pad="5" -     name="local_format_combo" -     width="70"> -        <combo_box.item -         label="PNG" -         name="PNG" /> -        <combo_box.item -         label="JPEG" -         name="JPEG" /> -        <combo_box.item -         label="BMP" -         name="BMP" /> -    </combo_box> -    <spinner -     allow_text_entry="false" -     decimal_digits="0" -     follows="left|top" -     height="20" -     increment="32" -     label="Width" -     label_width="40" -     layout="topleft" -     left="10" -     max_val="6016" -     min_val="32" -     name="snapshot_width" -     top_pad="10" -     width="95" /> -    <spinner -     allow_text_entry="false" -     decimal_digits="0" -     follows="left|top" -     height="20" -     increment="32" -     label="Height" -     label_width="40" -     layout="topleft" -     left_pad="5" -     max_val="6016" -     min_val="32" -     name="snapshot_height" -     top_delta="0" -     width="95" /> -    <check_box -     bottom_delta="20" -     label="Constrain proportions" -     layout="topleft" -     left="10" -     name="keep_aspect_check" /> -    <slider -     decimal_digits="0" -     follows="left|top" -     height="15" -     increment="1" -     initial_value="75" -     label="Image quality" -     label_width="124" -     layout="topleft" -     left_delta="0" -     max_val="100" -     name="image_quality_slider" -     top_pad="5" -     width="228" /> -    <text -     type="string" -     length="1" +     width="23" /> +  <ui_ctrl  +    height="160" +    width="250" +    layout="topleft" +    name="thumbnail_placeholder" +    top="50" +    follows="left|top" +    left="10"> +      <loading_indicator +       follows="left|top" +       height="48" +       layout="topleft" +       name="working_indicator" +       left="101" +       top="46" +       visible="false" +       width="48" /> +      <text +       follows="left|top|right" +       font="SansSerifBold" +       height="14" +       layout="topleft" +       left="5" +       length="1" +       halign="center" +       name="working_lbl" +       right="-5" +       top="98" +       translate="false" +       type="string" +       visible="false" +       width="130"> +          Working +      </text> +  </ui_ctrl> +  <view_border  +   bevel_style="in"  +   height="21" +   width="250" +   layout="topleft" +   name="img_info_border" +   top_pad="3" +   follows="left|top" +   left_delta="0" +   /> +   <text +    type="string" +    font="SansSerifSmall" +    length="1" +    follows="left|top" +    height="14" +    layout="topleft" +    left_delta="5" +    halign="left" +    name="image_res_text" +    top_delta="5" +    width="100"> +       [WIDTH] x [HEIGHT] px +   </text> +   <text +    follows="left|top" +    font="SansSerifSmall" +    height="14" +    layout="topleft" +    left="200" +    length="1" +    halign="right" +    name="file_size_label" +    top_delta="0" +    type="string" +    width="50"> +       [SIZE] KB +   </text> +    <panel_container       follows="left|top" -     height="13" +     height="360"       layout="topleft" -     left="10" -     name="layer_type_label" -     top_pad="5" -     width="50"> -        Capture: -    </text> -    <combo_box -     height="23" -     label="Image Layers" -     layout="topleft" -     left="30" -     name="layer_types" -     width="145"> -        <combo_box.item -         label="Colors" -         name="Colors" -         value="colors" /> -        <combo_box.item -         label="Depth" -         name="Depth" -         value="depth" /> -    </combo_box> -    <check_box -     label="Interface" -     layout="topleft" -     left="30" +     left="0" +     name="panel_container" +     default_panel_name="panel_snapshot_options"       top_pad="10" -     width="180" -     name="ui_check" /> -    <check_box -     label="HUDs" -     layout="topleft" -     left="30" -     top_pad="10" -     width="180" -     name="hud_check" /> -    <check_box -     label="Keep open after saving" -     layout="topleft" -     left="10" -     top_pad="8" -     width="180" -     name="keep_open_check" /> -    <check_box -     label="Freeze frame (fullscreen)" +     width="270"> +      <panel +       class="llpanelsnapshotoptions" +       filename="panel_snapshot_options.xml" +       follows="all" +       layout="topleft" +       left="0" +       name="panel_snapshot_options" +       top="0" /> +      <panel +       class="llpanelsnapshotprofile" +       follows="all" +       layout="topleft" +       name="panel_snapshot_profile" +       filename="panel_snapshot_profile.xml" /> +      <panel +       class="llpanelsnapshotpostcard" +       follows="all" +       layout="topleft" +       name="panel_snapshot_postcard" +       filename="panel_snapshot_postcard.xml" /> +      <panel +       class="llpanelsnapshotinventory" +       follows="all" +       layout="topleft" +       name="panel_snapshot_inventory" +       filename="panel_snapshot_inventory.xml" /> +      <panel +       class="llpanelsnapshotlocal" +       follows="all" +       layout="topleft" +       name="panel_snapshot_local" +       filename="panel_snapshot_local.xml" /> +    </panel_container> +    <panel +     height="295"       layout="topleft" -     left="10" -     top_pad="8" -     width="180" -     name="freeze_frame_check" /> -    <check_box -     label="Auto-refresh" -     layout="topleft" -     left="10" -     top_pad="8" -     width="180" -     name="auto_snapshot_check" /> +     left="270" +     name="advanced_options_panel" +     top="20" +     width="200"> +        <text +         type="string" +         font="SansSerifSmall" +         length="1" +         follows="left|top" +         height="14" +         layout="topleft" +         left="10" +         halign="left" +         name="advanced_options_label" +         right="-10" +         top="10"> +            ADVANCED OPTIONS +        </text> +        <view_border  +         bevel_style="in" +         follows="left|top|right"  +         height="1" +         left="10" +         layout="topleft" +         name="advanced_options_hr" +         right="-10" +         top_pad="5" +         /> +        <text +         type="string" +         length="1" +         follows="left|top" +         height="13" +         layout="topleft" +         left="10" +         name="layer_type_label" +         top_pad="10" +         width="50"> +            Capture: +        </text> +        <combo_box +         follows="left|top|right" +         height="23" +         label="Image Layers" +         layout="topleft" +         left="30" +         name="layer_types" +         right="-10"> +            <combo_box.item +             label="Colors" +             name="Colors" +             value="colors" /> +            <combo_box.item +             label="Depth" +             name="Depth" +             value="depth" /> +        </combo_box> +        <check_box +         label="Interface" +         layout="topleft" +         left="30" +         top_pad="10" +         width="180" +         name="ui_check" /> +        <check_box +         label="HUDs" +         layout="topleft" +         left="30" +         top_pad="10" +         width="180" +         name="hud_check" /> +        <check_box +         label="Freeze frame (fullscreen)" +         layout="topleft" +         left="10" +         top_pad="8" +         width="180" +         name="freeze_frame_check" /> +        <check_box +         label="Auto-refresh" +         layout="topleft" +         left="10" +         top_pad="8" +         width="180" +         name="auto_snapshot_check" /> +    </panel>  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_toybox.xml b/indra/newview/skins/default/xui/en/floater_toybox.xml index ef3951a1cd..493d44a9cf 100644 --- a/indra/newview/skins/default/xui/en/floater_toybox.xml +++ b/indra/newview/skins/default/xui/en/floater_toybox.xml @@ -5,7 +5,7 @@    can_minimize="false"    can_resize="false"    default_tab_group="1" -  height="460" +  height="330"    help_topic="toybox"    layout="topleft"    legacy_header_height="18" @@ -46,7 +46,7 @@        Buttons will appear as shown or as icon-only depending on each toolbar's settings.    </text>    <toolbar -    bottom="395" +    bottom="265"      button_display_mode="icons_with_text"      follows="all"      left="20" @@ -82,20 +82,32 @@    <panel      bevel_style="none"      border="true" -    bottom="396" +    bottom="266"      follows="left|bottom|right"      left="20"      right="-20" -    top="396" /> +    top="266" /> +  <button +    follows="left|bottom|right" +    height="23" +    label="Clear all toolbars" +    label_selected="Clear all toolbars" +    layout="topleft" +    left="185" +    name="btn_clear_all" +    top="285" +    width="130"> +    <button.commit_callback function="Toybox.ClearAll" /> +  </button>    <button      follows="left|bottom|right"      height="23"      label="Restore defaults"      label_selected="Restore defaults"      layout="topleft" -    left="260" +    left="335"      name="btn_restore_defaults" -    top="415" +    top="285"      width="130">      <button.commit_callback function="Toybox.RestoreDefaults" />    </button> diff --git a/indra/newview/skins/default/xui/en/floater_translation_settings.xml b/indra/newview/skins/default/xui/en/floater_translation_settings.xml index c03f751265..a212ce7889 100644 --- a/indra/newview/skins/default/xui/en/floater_translation_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_translation_settings.xml @@ -4,7 +4,7 @@   height="310"   layout="topleft"   name="floater_translation_settings" - help_topic="environment_editor_floater" + help_topic="translation_settings"   save_rect="true"   title="CHAT TRANSLATION SETTINGS"   width="485"> diff --git a/indra/newview/skins/default/xui/en/menu_toolbars.xml b/indra/newview/skins/default/xui/en/menu_toolbars.xml index 7384114d7d..fbe40a7244 100644 --- a/indra/newview/skins/default/xui/en/menu_toolbars.xml +++ b/indra/newview/skins/default/xui/en/menu_toolbars.xml @@ -3,9 +3,15 @@        layout="topleft"        name="Toolbars Popup"        visible="false"> +  <menu_item_call label="Remove this button" +                  layout="topleft" +                  name="Remove button"> +    <menu_item_call.on_click function="Toolbars.RemoveSelectedCommand" /> +  </menu_item_call> +  <menu_item_separator layout="topleft" />    <menu_item_call label="Toolbar buttons..."                    layout="topleft" -                  name="Chose Buttons"> +                  name="Choose Buttons">      <menu_item_call.on_click function="Floater.Show"                               parameter="toybox" />    </menu_item_call> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 9c44d90a6e..263d961be1 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -538,13 +538,13 @@  	    <menu  	     create_jump_keys="true" -	     label="Enviroment Editor" -	     name="Enviroment Editor" +	     label="Environment Editor" +	     name="Environment Editor"  	     tear_off="true">  	     	<menu_item_call -	     	 label="Enviroment Settings..." -	     	 name="Enviroment Settings"> +	     	 label="Environment Settings..." +	     	 name="Environment Settings">  	     	 	<menu_item_call.on_click  	     	 	 function="World.EnvSettings"                   parameter="editor"/> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 3ed8c30ca8..e4458f33b1 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -4636,7 +4636,21 @@ Are you sure you want to quit?     name="ConfirmRestoreToybox"     type="alertmodal">      <unique/> -Are you sure you want to restore your default buttons and toolbars?  +This action will restore your default buttons and toolbars. + +You cannot undo this action. +    <usetemplate +     name="okcancelbuttons" +     notext="Cancel" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="ConfirmClearAllToybox" +   type="alertmodal"> +    <unique/> +This action will return all buttons to the toolbox and your toolbars will be empty.  You cannot undo this action.      <usetemplate @@ -4644,7 +4658,7 @@ You cannot undo this action.       notext="Cancel"       yestext="OK"/>    </notification> -   +    <notification     icon="alertmodal.tga"     name="DeleteItems" diff --git a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml index 8e8d8e6505..0f8c37c691 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml @@ -32,7 +32,7 @@          name="Upper Fabric"          tool_tip="Click to choose a picture"          top="10" -        width="74" > +        width="75" >           <texture_picker.commit_callback               function="TexturePicker.Commit" />         </texture_picker> diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 3835cd17b6..6521bf2a4e 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -22,17 +22,17 @@ top="600"  <!-- *NOTE: Custom resize logic for login_html in llpanellogin.cpp -->  <web_browser    tab_stop="false"  -trusted_content="true"  -bg_opaque_color="Black" -border_visible="false" -bottom="600" -follows="all" -left="0" -name="login_html" -start_url="" -top="0" -height="600" -     width="980" /> +  trusted_content="true"  +  bg_opaque_color="Black" +  border_visible="false" +  bottom="600" +  follows="all" +  left="0" +  name="login_html" +  start_url="" +  top="0" +  height="600" +  width="980"/>  <layout_stack  follows="left|bottom|right"  name="login_widgets" diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat.xml index f766236b2e..d492f9bd68 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_chat.xml @@ -11,7 +11,7 @@               control_name="TranslateChat"               enabled="true"               height="16" -             label="Translate chat (powered by Google)" +             label="Translate chat"               layout="topleft"               left="5"               name="translate_chat_checkbox" diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml index 5d7334f780..670aa47313 100644 --- a/indra/newview/skins/default/xui/en/panel_places.xml +++ b/indra/newview/skins/default/xui/en/panel_places.xml @@ -202,7 +202,7 @@ background_visible="true"  					</layout_panel>  					<layout_panel -					follows="bottom|left|right" +					follows="bottom|right"  					height="23"  					layout="bottomleft"  					left_pad="0" @@ -212,7 +212,7 @@ background_visible="true"  				    auto_resize="true"  					width="24">  						<menu_button -				         follows="bottom|left|right" +				         follows="bottom|right"  				         height="23"  						 image_disabled="ComboButton_UpOff"  						 image_unselected="ComboButton_UpOff" diff --git a/indra/newview/skins/default/xui/en/floater_postcard.xml b/indra/newview/skins/default/xui/en/panel_postcard_message.xml index adc2433105..e9f322f590 100644 --- a/indra/newview/skins/default/xui/en/floater_postcard.xml +++ b/indra/newview/skins/default/xui/en/panel_postcard_message.xml @@ -1,117 +1,87 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater - legacy_header_height="18" - can_minimize="false" - can_resize="true" +<panel   height="380"   layout="topleft" - min_height="380" - min_width="490" - name="Postcard" - help_topic="postcard" - title="EMAIL SNAPSHOT" + name="panel_postcard_message"   width="490"> -    <floater.string -     name="default_subject"> -        Postcard from [SECOND_LIFE]. -    </floater.string> -    <floater.string -     name="default_message"> -        Check this out! -    </floater.string> -    <floater.string -     name="upload_message"> -        Sending... -    </floater.string>      <text       type="string"       length="1"       bottom="35"       follows="top|left"       font="SansSerif" +     height="16"       layout="topleft"       left="12" -     name="to_label"> -        Recipient's Email: +     name="to_label" +     top="10" +     width="60"> +        To:      </text>      <line_editor       control_name="LastPostcardRecipient" -     follows="left|top" +     follows="left|top|right"       height="20"       layout="topleft" -     left_delta="148" +     left_pad="10"       name="to_form" -     top_delta="-4" -     width="150" /> -    <text -     type="string" -     length="1" -     bottom_delta="23" -     follows="top|left" -     font="SansSerif" -     layout="topleft" -     left="12" -     name="from_label"> -        Your Email: -    </text> -    <line_editor -     follows="left|top" -     height="20" -     layout="topleft" -     left_delta="148" -     name="from_form" -     top_delta="-4" -     width="150" /> +     right="-10" +     top_delta="-4" />      <text       type="string"       length="1"       bottom_delta="23"       follows="top|left"       font="SansSerif" +     height="16"       layout="topleft"       left="12" -     name="name_label"> -        Your Name: +     name="name_label" +     width="60"> +        From:      </text>      <line_editor -     follows="left|top" +     follows="left|top|right"       height="20"       layout="topleft" -     left_delta="148" +     left_pad="10"       max_length_bytes="100"       name="name_form" -     top_delta="-4" -     width="150" /> +     right="-10" +     top_delta="-4" />      <text       type="string"       length="1"       bottom_delta="23"       follows="top|left"       font="SansSerif" +     height="16"       layout="topleft"       left="12" -     name="subject_label"> +     name="subject_label" +     width="60">          Subject:      </text>      <line_editor -     follows="left|top" +     follows="left|top|right"       height="20"       label="Type your subject here."       layout="topleft" -     left_delta="148" +     left_pad="10"       max_length_bytes="100"       name="subject_form" -     top_delta="-4" -     width="150" /> +     right="-10" +     top_delta="-4" />      <text       type="string"       length="1"       bottom_delta="23" -     follows="top|left" +     follows="top|left|right"       font="SansSerif"       layout="topleft"       left="12" -     name="msg_label"> +     name="msg_label" +     right="-10">          Message:      </text>      <text_editor @@ -123,9 +93,9 @@       left_delta="0"       max_length="700"       name="msg_form" -     word_wrap="true"  +     right="-10"       top_pad="10" -     width="420"> +     word_wrap="true">          Type your message here.      </text_editor>      <button @@ -136,7 +106,10 @@       name="cancel_btn"       right="-10"       top="350" -     width="100" /> +     width="100"> +      <button.commit_callback +       function="Postcard.Cancel" /> +    </button>      <button       follows="right|bottom"       height="23" @@ -145,5 +118,8 @@       left_delta="-106"       name="send_btn"       top_delta="0" -     width="100" /> -</floater> +     width="100"> +      <button.commit_callback +       function="Postcard.Send" /> +    </button> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_postcard_settings.xml b/indra/newview/skins/default/xui/en/panel_postcard_settings.xml new file mode 100644 index 0000000000..84e3593798 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_postcard_settings.xml @@ -0,0 +1,102 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + height="380" + layout="topleft" + name="panel_postcard_settings" + width="490"> +    <combo_box +     follows="left|top|right" +     height="23" +     label="Resolution" +     layout="topleft" +     left="10" +     name="postcard_size_combo" +     right="-10" +     top_pad="10"> +        <combo_box.item +         label="Current Window" +         name="CurrentWindow" +         value="[i0,i0]" /> +        <combo_box.item +         label="640x480" +         name="640x480" +         value="[i640,i480]" /> +        <combo_box.item +         label="800x600" +         name="800x600" +         value="[i800,i600]" /> +        <combo_box.item +         label="1024x768" +         name="1024x768" +         value="[i1024,i768]" /> +        <combo_box.item +         label="Custom" +         name="Custom" +         value="[i-1,i-1]" /> +    </combo_box> +    <spinner +     allow_text_entry="false" +     decimal_digits="0" +     follows="left|top" +     height="20" +     increment="32" +     label="Width" +     label_width="40" +     layout="topleft" +     left="10" +     max_val="6016" +     min_val="32" +     name="postcard_snapshot_width" +     top_pad="10" +     width="95" /> +    <spinner +     allow_text_entry="false" +     decimal_digits="0" +     follows="left|top" +     height="20" +     increment="32" +     label="Height" +     label_width="40" +     layout="topleft" +     left_pad="5" +     max_val="6016" +     min_val="32" +     name="postcard_snapshot_height" +     top_delta="0" +     width="95" /> +    <check_box +     bottom_delta="20" +     follows="left|top" +     label="Constrain proportions" +     layout="topleft" +     left="10" +     name="postcard_keep_aspect_check" /> +    <slider +     decimal_digits="0" +     follows="left|top" +     height="15" +     increment="1" +     initial_value="75" +     label="Image quality" +     label_width="80" +     layout="topleft" +     left="10" +     max_val="100" +     name="image_quality_slider" +     top_pad="7" +     width="200" /> +    <text +     type="string" +     follows="left|top" +     font="SansSerifSmall" +     length="1" +     height="14" +     layout="topleft" +     left_pad="-5" +     halign="left" +     name="image_quality_level" +     top_delta="0" +     width="60"> +       ([QLVL]) +    </text> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml new file mode 100644 index 0000000000..7b148fa338 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + height="380" + layout="topleft" + name="panel_snapshot_inventory" + width="490"> +    <icon +     follows="top|left" +     height="18" +     image_name="Snapshot_Inventory" +     layout="topleft" +     left="12" +     mouse_opaque="true" +     name="title_icon" +     top="5" +     width="18" /> +    <text +     follows="top|left|right" +     font="SansSerifBold" +     height="20" +     layout="topleft" +     left_pad="12" +     length="1" +     name="title" +     right="-10" +     text_color="white" +     type="string" +     top_delta="5"> +        Save to My Inventory +    </text> +    <view_border  +     bevel_style="in" +     follows="left|top|right"  +     height="1" +     left="10" +     layout="topleft" +     name="hr" +     right="-10" +     top_pad="5" +     /> +    <text +     bottom="35" +     follows="top|left|right" +     font="SansSerif" +     height="56" +     layout="topleft" +     left="12" +     length="1" +     name="hint_lbl" +     top_pad="10" +     type="string" +     word_wrap="true"> +        Saving an image to your inventory costs L$[UPLOAD_COST]. To save your image as a texture select one of the square formats. +    </text> +    <combo_box +     follows="top|left|right" +     height="23" +     label="Resolution" +     layout="topleft" +     left_delta="0" +     name="texture_size_combo" +     right="-10" +     top_pad="10"> +        <combo_box.item +         label="Current Window" +         name="CurrentWindow" +         value="[i0,i0]" /> +        <combo_box.item +         label="Small (128x128)" +         name="Small(128x128)" +         value="[i128,i128]" /> +        <combo_box.item +         label="Medium (256x256)" +         name="Medium(256x256)" +         value="[i256,i256]" /> +        <combo_box.item +         label="Large (512x512)" +         name="Large(512x512)" +         value="[i512,i512]" /> +        <combo_box.item +         label="Custom" +         name="Custom" +         value="[i-1,i-1]" /> +    </combo_box> +    <spinner +     allow_text_entry="false" +     decimal_digits="0" +     follows="left|top" +     height="20" +     increment="32" +     label="Width" +     label_width="40" +     layout="topleft" +     left="10" +     max_val="6016" +     min_val="32" +     name="inventory_snapshot_width" +     top_pad="10" +     width="95" /> +    <spinner +     allow_text_entry="false" +     decimal_digits="0" +     follows="left|top" +     height="20" +     increment="32" +     label="Height" +     label_width="40" +     layout="topleft" +     left_pad="5" +     max_val="6016" +     min_val="32" +     name="inventory_snapshot_height" +     top_delta="0" +     width="95" /> +    <check_box +     bottom_delta="20" +     follows="left|top" +     label="Constrain proportions" +     layout="topleft" +     left="10" +     name="inventory_keep_aspect_check" /> +    <button +     follows="right|bottom" +     height="23" +     label="Cancel" +     layout="topleft" +     name="cancel_btn" +     right="-10" +     top="350" +     width="100"> +      <button.commit_callback +       function="Inventory.Cancel" /> +    </button> +    <button +     follows="right|bottom" +     height="23" +     label="Save" +     layout="topleft" +     left_delta="-106" +     name="save_btn" +     top_delta="0" +     width="100"> +      <button.commit_callback +       function="Inventory.Save" /> +    </button> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml new file mode 100644 index 0000000000..4d6c4bcdfa --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml @@ -0,0 +1,194 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + height="380" + layout="topleft" + name="panel_snapshot_local" + width="490"> +    <icon +     follows="top|left" +     height="18" +     image_name="Snapshot_Download" +     layout="topleft" +     left="12" +     mouse_opaque="true" +     name="title_icon" +     top="5" +     width="18" /> +    <text +     follows="top|left|right" +     font="SansSerifBold" +     height="20" +     layout="topleft" +     left_pad="12" +     length="1" +     name="title" +     right="-10" +     text_color="white" +     type="string" +     top_delta="4"> +        Save to My Computer +    </text> +    <view_border  +     bevel_style="in" +     follows="left|top|right"  +     height="1" +     left="10" +     layout="topleft" +     name="hr" +     right="-10" +     top_pad="5" +     /> +    <combo_box +     follows="left|top|right" +     height="23" +     label="Resolution" +     layout="topleft" +     left_delta="0" +     name="local_size_combo" +     right="-10" +     top_pad="10"> +        <combo_box.item +         label="Current Window" +         name="CurrentWindow" +         value="[i0,i0]" /> +        <combo_box.item +         label="320x240" +         name="320x240" +         value="[i320,i240]" /> +        <combo_box.item +         label="640x480" +         name="640x480" +         value="[i640,i480]" /> +        <combo_box.item +         label="800x600" +         name="800x600" +         value="[i800,i600]" /> +        <combo_box.item +         label="1024x768" +         name="1024x768" +         value="[i1024,i768]" /> +        <combo_box.item +         label="1280x1024" +         name="1280x1024" +         value="[i1280,i1024]" /> +        <combo_box.item +         label="1600x1200" +         name="1600x1200" +         value="[i1600,i1200]" /> +        <combo_box.item +         label="Custom" +         name="Custom" +         value="[i-1,i-1]" /> +    </combo_box> +    <spinner +     allow_text_entry="false" +     decimal_digits="0" +     follows="left|top" +     height="20" +     increment="32" +     label="Width" +     label_width="40" +     layout="topleft" +     left="10" +     max_val="6016" +     min_val="32" +     name="local_snapshot_width" +     top_pad="10" +     width="95" /> +    <spinner +     allow_text_entry="false" +     decimal_digits="0" +     follows="left|top" +     height="20" +     increment="32" +     label="Height" +     label_width="40" +     layout="topleft" +     left_pad="5" +     max_val="6016" +     min_val="32" +     name="local_snapshot_height" +     top_delta="0" +     width="95" /> +    <check_box +     bottom_delta="20" +     follows="left|top" +     label="Constrain proportions" +     layout="topleft" +     left="10" +     name="local_keep_aspect_check" /> +    <combo_box +     follows="left|top" +     height="23" +     label="Format" +     layout="topleft" +     left_delta="0" +     name="local_format_combo" +     top_pad="10" +     width="120"> +        <combo_box.item +         label="PNG (Lossless)" +         name="PNG" +         value="PNG" /> +        <combo_box.item +         label="JPEG" +         name="JPEG" +         value="JPEG" /> +        <combo_box.item +         label="BMP (Lossless)" +         name="BMP" +         value="BMP" /> +    </combo_box> +    <slider +     decimal_digits="0" +     follows="left|top" +     height="15" +     increment="1" +     initial_value="75" +     label="Image quality" +     label_width="80" +     layout="topleft" +     left="10" +     max_val="100" +     name="image_quality_slider" +     top_pad="7" +     width="200" /> +    <text +     type="string" +     follows="left|top" +     font="SansSerifSmall" +     length="1" +     height="14" +     layout="topleft" +     left_pad="-5" +     halign="left" +     name="image_quality_level" +     top_delta="0" +     width="60"> +       ([QLVL]) +    </text> +    <button +     follows="right|bottom" +     height="23" +     label="Cancel" +     layout="topleft" +     name="cancel_btn" +     right="-10" +     top="350" +     width="100"> +      <button.commit_callback +       function="Local.Cancel" /> +    </button> +    <button +     follows="right|bottom" +     height="23" +     label="Save" +     layout="topleft" +     left_delta="-106" +     name="save_btn" +     top_delta="0" +     width="100"> +      <button.commit_callback +       function="Local.Save" /> +    </button> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml new file mode 100644 index 0000000000..792f6dbec8 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml @@ -0,0 +1,148 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + follows="all" + height="240" + layout="topleft" + name="panel_snapshot_options" + width="490"> +  <button +   follows="left|top|right" +   font="SansSerif" +   halign="left" +   height="38" +   image_overlay="Snapshot_Profile" +   image_overlay_alignment="left" +   image_top_pad="-2" +   imgoverlay_label_space="10" +   label="Post to My Profile Feed" +   layout="topleft" +   left="10" +   name="save_to_profile_btn" +   pad_left="10" +   right="-10" +   top="5"> +    <button.commit_callback +     function="Snapshot.SaveToProfile" /> +  </button> +  <button +   follows="left|top|right" +   font="SansSerif" +   halign="left" +   height="38" +   image_overlay="Snapshot_Email" +   image_overlay_alignment="left" +   image_top_pad="-2" +   imgoverlay_label_space="10" +   label="Email" +   layout="topleft" +   left_delta="0" +   name="save_to_email_btn" +   pad_left="10" +   right="-10" +   top_pad="10"> +    <button.commit_callback +     function="Snapshot.SaveToEmail" /> +  </button> +  <button +   follows="left|top|right" +   font="SansSerif" +   halign="left" +   height="38" +   image_overlay="Snapshot_Inventory" +   image_overlay_alignment="left" +   image_top_pad="-2" +   imgoverlay_label_space="10" +   label="Save to My Inventory (L$[AMOUNT])" +   layout="topleft" +   left_delta="0" +   name="save_to_inventory_btn" +   pad_left="10" +   right="-10" +   top_pad="10"> +    <button.commit_callback +     function="Snapshot.SaveToInventory" /> +  </button> +  <button +   follows="left|top|right" +   font="SansSerif" +   halign="left" +   height="38" +   image_overlay="Snapshot_Download" +   image_overlay_alignment="left" +   image_top_pad="-2" +   imgoverlay_label_space="10" +   label="Save to My Computer" +   layout="topleft" +   left_delta="0" +   name="save_to_computer_btn" +   pad_left="10" +   right="-10" +   top_pad="10"> +    <button.commit_callback +     function="Snapshot.SaveToComputer" /> +  </button> +  <panel +   background_visible="true" +   bg_alpha_color="0.9 1 0.9 1" +   bottom="-10" +   follows="left|bottom|right" +   font="SansSerifLarge" +   halign="center" +   height="20" +   layout="topleft" +   left_delta="0" +   length="1" +   name="succeeded_panel" +   right="-10" +   type="string" +   visible="false"> +      <text +       follows="all" +       font="SansSerif" +       halign="center" +       height="18" +       layout="topleft" +       left="1" +       length="1" +       name="succeeded_lbl" +       right="-1" +       text_color="0.2 0.5 0.2 1" +       top="4" +       translate="false" +       type="string"> +          Succeeded +      </text> +  </panel> +  <panel +   background_visible="true" +   bg_alpha_color="1 0.9 0.9 1" +   bottom="-10" +   follows="left|bottom|right" +   font="SansSerifLarge" +   halign="center" +   height="20" +   layout="topleft" +   left_delta="0" +   length="1" +   name="failed_panel" +   right="-10" +   type="string" +   visible="false"> +      <text +       follows="all" +       font="SansSerif" +       halign="center" +       height="18" +       layout="topleft" +       left="1" +       length="1" +       name="failed_lbl" +       right="-1" +       text_color="0.5 0.2 0.2 1" +       top="4" +       translate="false" +       type="string"> +          Failed +      </text> +  </panel> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml new file mode 100644 index 0000000000..d8ff043444 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + height="380" + layout="topleft" + name="panel_snapshot_postcard" + width="490"> +    <string +     name="default_subject"> +        Postcard from [SECOND_LIFE]. +    </string> +    <string +     name="default_message"> +        Check this out! +    </string> +    <string +     name="upload_message"> +        Sending... +    </string> +    <string +     name="default_subject"> +        Postcard from [SECOND_LIFE]. +    </string> +    <string +     name="default_message"> +        Check this out! +    </string> +    <icon +     follows="top|left" +     height="18" +     image_name="Snapshot_Email" +     layout="topleft" +     left="12" +     mouse_opaque="true" +     name="title_icon" +     top="5" +     width="18" /> +    <text +     follows="top|left|right" +     font="SansSerifBold" +     height="20" +     layout="topleft" +     left_pad="12" +     length="1" +     name="title" +     right="-10" +     text_color="white" +     type="string" +     top_delta="3"> +        Email +    </text> +    <button +     follows="right|top" +     height="23" +     is_toggle="true" +     label="Message" +     layout="topleft" +     name="message_btn" +     right="-82" +     top_delta="-7" +     width="70"> +      <button.commit_callback +       function="Postcard.Message" /> +    </button> +    <button +     follows="right|top" +     height="23" +     is_toggle="true" +     label="Settings" +     layout="topleft" +     name="settings_btn" +     top_delta="0" +     right="-10" +     width="70"> +      <button.commit_callback +       function="Postcard.Settings" /> +    </button> +    <view_border  +     bevel_style="in" +     follows="left|top|right"  +     height="1" +     left="10" +     layout="topleft" +     name="hr" +     right="-10" +     top_pad="5" +     /> +    <panel_container +     follows="all" +     height="340" +     layout="topleft" +     left="0" +     name="postcard_panel_container" +     default_panel_name="panel_postcard_message" +     top_pad="10" +     width="490"> +      <panel +       follows="all" +       layout="topleft" +       name="panel_postcard_message" +       filename="panel_postcard_message.xml" /> +      <panel +       follows="all" +       layout="topleft" +       name="panel_postcard_settings" +       filename="panel_postcard_settings.xml" /> +    </panel_container> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml new file mode 100644 index 0000000000..0760a33f82 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml @@ -0,0 +1,165 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + height="380" + layout="topleft" + name="panel_snapshot_profile" + width="490"> +    <icon +     follows="top|left" +     height="18" +     image_name="Snapshot_Profile" +     layout="topleft" +     left="12" +     mouse_opaque="true" +     name="title_icon" +     top="5" +     width="18" /> +    <text +     follows="top|left|right" +     font="SansSerifBold" +     height="20" +     layout="topleft" +     left_pad="12" +     length="1" +     name="title" +     right="-10" +     text_color="white" +     type="string" +     top_delta="4"> +        Post to My Profile Feed +    </text> +    <view_border  +     bevel_style="in" +     follows="left|top|right"  +     height="1" +     left="10" +     layout="topleft" +     name="hr" +     right="-10" +     top_pad="5" +     /> +    <combo_box +     follows="left|top" +     height="23" +     label="Resolution" +     layout="topleft" +     left_delta="0" +     name="profile_size_combo" +     top_pad="10" +     width="250"> +        <combo_box.item +         label="Current Window" +         name="CurrentWindow" +         value="[i0,i0]" /> +        <combo_box.item +         label="640x480" +         name="640x480" +         value="[i640,i480]" /> +        <combo_box.item +         label="800x600" +         name="800x600" +         value="[i800,i600]" /> +        <combo_box.item +         label="1024x768" +         name="1024x768" +         value="[i1024,i768]" /> +        <combo_box.item +         label="Custom" +         name="Custom" +         value="[i-1,i-1]" /> +    </combo_box> +    <spinner +     allow_text_entry="false" +     decimal_digits="0" +     follows="left|top" +     height="20" +     increment="32" +     label="Width" +     label_width="40" +     layout="topleft" +     left="10" +     max_val="6016" +     min_val="32" +     name="profile_snapshot_width" +     top_pad="10" +     width="95" /> +    <spinner +     allow_text_entry="false" +     decimal_digits="0" +     follows="left|top" +     height="20" +     increment="32" +     label="Height" +     label_width="40" +     layout="topleft" +     left_pad="5" +     max_val="6016" +     min_val="32" +     name="profile_snapshot_height" +     top_delta="0" +     width="95" /> +    <check_box +     bottom_delta="20" +     label="Constrain proportions" +     layout="topleft" +     left="10" +     name="profile_keep_aspect_check" /> +    <text +     length="1" +     follows="top|left|right" +     font="SansSerif" +     height="16" +     layout="topleft" +     left="12" +     name="caption_label" +     right="-10" +     top_pad="10" +     type="string"> +        Caption: +    </text> +    <text_editor +     follows="all" +     height="170" +     layout="topleft" +     left_delta="0" +     length="1" +     max_length="700" +     name="caption" +     right="-10" +     top_pad="5" +     type="string" +     word_wrap="true"> +    </text_editor> +    <check_box +     follows="left|bottom" +     initial_value="true" +     label="Include location" +     layout="topleft" +     left_delta="0" +     name="add_location_cb" +     top_pad="15" /> +    <button +     follows="right|bottom" +     height="23" +     label="Cancel" +     layout="topleft" +     name="cancel_btn" +     right="-10" +     top="350" +     width="100"> +      <button.commit_callback +       function="PostToProfile.Cancel" /> +    </button> +    <button +     follows="right|bottom" +     height="23" +     label="Post" +     layout="topleft" +     left_delta="-106" +     name="post_btn" +     top_delta="0" +     width="100"> +      <button.commit_callback +       function="PostToProfile.Send" /> +    </button> +</panel> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index ec230773cc..befcc5dd87 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -3724,4 +3724,12 @@ Try enclosing path to the editor with double quotes.    <string name="Wrap">Wrap</string>    <string name="Preview">Preview</string>    <string name="Normal">Normal</string> + +  <!-- Snapshot image quality levels --> +  <string name="snapshot_quality_very_low">Very Low</string> +  <string name="snapshot_quality_low">Low</string> +  <string name="snapshot_quality_medium">Medium</string> +  <string name="snapshot_quality_high">High</string> +  <string name="snapshot_quality_very_high">Very High</string> +    </strings> diff --git a/indra/newview/skins/default/xui/en/teleport_strings.xml b/indra/newview/skins/default/xui/en/teleport_strings.xml index bae821d3b5..dce6b8dd6d 100644 --- a/indra/newview/skins/default/xui/en/teleport_strings.xml +++ b/indra/newview/skins/default/xui/en/teleport_strings.xml @@ -20,6 +20,10 @@ If you still cannot teleport, please log out and log back in to resolve the prob  			Sorry, but system was unable to complete the teleport connection.  Try again in a moment.  		</message> +		<message name="NoHelpIslandTP"> +You cannot teleport back to Welcome Island. +Go to 'Welcome Island Public' to repeat the tutorial. +		</message>  		<message name="noaccess_tport">  			Sorry, you do not have access to that teleport destination.  		</message> 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 413ca1d1ef..f47e9874b4 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 @@ -12,13 +12,19 @@       tab_stop="false"       width="25" />      <chiclet_im_adhoc.speaker -     auto_update="true" -     draw_border="false" -     height="23" -     left="25" -     name="speaker" -     visible="false" -     width="20" /> +      image_mute="Parcel_VoiceNo_Light" +      image_off="VoicePTT_Off_Dark" +      image_on="VoicePTT_On_Dark" +      image_level_1="VoicePTT_Lvl1_Dark" +      image_level_2="VoicePTT_Lvl2_Dark" +      image_level_3="VoicePTT_Lvl3_Dark" +      auto_update="true" +      draw_border="false" +      height="24" +      left="25" +      name="speaker" +      visible="false" +      width="20" />      <chiclet_im_adhoc.avatar_icon       bottom="3"       follows="left|top|bottom" 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 372a89cbc7..8dfdf95e80 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 @@ -12,13 +12,19 @@       tab_stop="false"       width="25" />      <chiclet_im_group.speaker -     auto_update="true" -     draw_border="false" -     height="25" -     left="25" -     name="speaker" -     visible="false" -     width="20" /> +      image_mute="Parcel_VoiceNo_Light" +      image_off="VoicePTT_Off_Dark" +      image_on="VoicePTT_On_Dark" +      image_level_1="VoicePTT_Lvl1_Dark" +      image_level_2="VoicePTT_Lvl2_Dark" +      image_level_3="VoicePTT_Lvl3_Dark" +      auto_update="true" +      draw_border="false" +      height="24" +      left="25" +      name="speaker" +      visible="false" +      width="20" />      <chiclet_im_group.group_icon       bottom="3"       default_icon="Generic_Group" 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 d27c14f4e7..cef698e577 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 @@ -12,13 +12,19 @@       tab_stop="false"       width="25"/>      <chiclet_im_p2p.speaker -     auto_update="true" -     draw_border="false" -     height="23" -     left="25" -     name="speaker" -     visible="false" -     width="20" /> +      image_mute="Parcel_VoiceNo_Light" +      image_off="VoicePTT_Off_Dark" +      image_on="VoicePTT_On_Dark" +      image_level_1="VoicePTT_Lvl1_Dark" +      image_level_2="VoicePTT_Lvl2_Dark" +      image_level_3="VoicePTT_Lvl3_Dark" +      auto_update="true" +      draw_border="false" +      height="24" +      left="25" +      name="speaker" +      visible="false" +      width="20" />      <chiclet_im_p2p.avatar_icon       bottom="3"       color="white" diff --git a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml new file mode 100644 index 0000000000..7a7a6e9a09 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<inbox_folder_view_item +  item_height="20"  +  item_top_pad="4" +  selection_image="Rounded_Square" +  > +	<new_badge  +        label="New"  +        label_offset_horiz="-1" +        location="right"  +        padding_horiz="12.5"  +        padding_vert="2" +        location_offset_hcenter="-23" +        border_image="New_Tag_Border" +        border_color="DkGray2" +        image="New_Tag_Background" +        image_color="Black" +        /> +</inbox_folder_view_item> diff --git a/indra/newview/skins/default/xui/es/floater_nearby_chat.xml b/indra/newview/skins/default/xui/es/floater_nearby_chat.xml index 1fee9ab056..b3b8cdcfff 100644 --- a/indra/newview/skins/default/xui/es/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/es/floater_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="nearby_chat" title="CHAT"> -	<check_box label="Traducir chat (mediante Google)" name="translate_chat_checkbox"/> +	<check_box label="Traducir chat" name="translate_chat_checkbox"/>  </floater> diff --git a/indra/newview/skins/default/xui/es/panel_nearby_chat.xml b/indra/newview/skins/default/xui/es/panel_nearby_chat.xml index 95ce14c9a7..5a852a6711 100644 --- a/indra/newview/skins/default/xui/es/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/es/panel_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="nearby_chat"> -	<check_box label="Traducir chat (mediante Google)" name="translate_chat_checkbox"/> +	<check_box label="Traducir chat" name="translate_chat_checkbox"/>  </panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml index 4625075aa5..e822585566 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml @@ -31,7 +31,7 @@  	<spinner label="Tiempo de los otros interlocutores:" name="nearby_toasts_fadingtime"/>  	<check_box name="translate_chat_checkbox"/>  	<text name="translate_chb_label"> -		Usar en el chat el traductor automático de Google +		Usar en el chat el traductor automático  	</text>  	<text name="translate_language_text">  		Traducir el chat al: diff --git a/indra/newview/skins/default/xui/es/teleport_strings.xml b/indra/newview/skins/default/xui/es/teleport_strings.xml index e0e0061729..e785a7ac40 100644 --- a/indra/newview/skins/default/xui/es/teleport_strings.xml +++ b/indra/newview/skins/default/xui/es/teleport_strings.xml @@ -19,6 +19,10 @@ Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].  			Lo sentimos, pero el sistema no ha podido completar el teleporte.  Vuelva a intentarlo en un momento.  		</message> +		<message name="NoHelpIslandTP"> +		No puede teleportarse de vuelta a la Welcome Island ('Isla de Ayuda'). +Vaya a la 'Welcome Island Public' ('Isla Pública de Ayuda') para repetir el tutorial. +		</message>  		<message name="noaccess_tport">  			Lo sentimos, pero no tienes acceso al destino de este teleporte.  		</message> diff --git a/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml b/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml index 9b1b21c434..8bbd34baae 100644 --- a/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="nearby_chat" title="CHAT PRÈS DE MOI"> -	<check_box label="Traduction du chat (fournie par Google)" name="translate_chat_checkbox"/> +	<check_box label="Traduction du chat" name="translate_chat_checkbox"/>  </floater> diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml index 98eddf196b..31cb3308e3 100644 --- a/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="nearby_chat"> -	<check_box label="Traduction du chat (fournie par Google)" name="translate_chat_checkbox"/> +	<check_box label="Traduction du chat" name="translate_chat_checkbox"/>  </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml index 646f53704c..fa026d8106 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml @@ -31,7 +31,7 @@  	<spinner label="Disparition progressive du popup Chat près de moi :" name="nearby_toasts_fadingtime"/>  	<check_box name="translate_chat_checkbox"/>  	<text name="translate_chb_label"> -		Utiliser la traduction automatique lors des chats (fournie par Google) +		Utiliser la traduction automatique lors des chats  	</text>  	<text name="translate_language_text">  		Traduire le chat en : diff --git a/indra/newview/skins/default/xui/fr/teleport_strings.xml b/indra/newview/skins/default/xui/fr/teleport_strings.xml index 7c291c0984..401b272c81 100644 --- a/indra/newview/skins/default/xui/fr/teleport_strings.xml +++ b/indra/newview/skins/default/xui/fr/teleport_strings.xml @@ -20,6 +20,10 @@ Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis r  			Désolé, la connexion vers votre lieu de téléportation n'a pas abouti.  Veuillez réessayer dans un moment.  		</message> +		<message name="NoHelpIslandTP"> +		Vous ne pouvez pas retourner sur Welcome Island. +Pour répéter le didacticiel, veuillez aller sur Welcome Island Public. +		</message>  		<message name="noaccess_tport">  			Désolé, vous n'avez pas accès à cette destination.  		</message> diff --git a/indra/newview/skins/default/xui/it/floater_nearby_chat.xml b/indra/newview/skins/default/xui/it/floater_nearby_chat.xml index 4c41df8a62..9e81899880 100644 --- a/indra/newview/skins/default/xui/it/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/it/floater_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="nearby_chat" title="CHAT NEI DINTORNI"> -	<check_box label="Traduci chat (tecnologia Google)" name="translate_chat_checkbox"/> +	<check_box label="Traduci chat" name="translate_chat_checkbox"/>  </floater> diff --git a/indra/newview/skins/default/xui/it/panel_nearby_chat.xml b/indra/newview/skins/default/xui/it/panel_nearby_chat.xml index 7afc3cd7e7..1b529e2737 100644 --- a/indra/newview/skins/default/xui/it/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/it/panel_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="nearby_chat"> -	<check_box label="Traduci chat (tecnologia Google)" name="translate_chat_checkbox"/> +	<check_box label="Traduci chat" name="translate_chat_checkbox"/>  </panel> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml index 72e687b6d1..1a0a1d8434 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml @@ -29,9 +29,9 @@  	<check_box label="Chat IM" name="EnableIMChatPopups" tool_tip="Seleziona per vedere una finestra popup quando arriva un messaggio IM"/>  	<spinner label="Durata chat vicine:" name="nearby_toasts_lifetime"/>  	<spinner label="Durata dissolvenza chat vicine:" name="nearby_toasts_fadingtime"/> -	<check_box label="Use machine translation while chatting (powered by Google)" name="translate_chat_checkbox"/> +	<check_box label="Use machine translation while chatting" name="translate_chat_checkbox"/>  	<text name="translate_chb_label"> -		Usa la traduzione meccanica durante le chat (tecnologia Google) +		Usa la traduzione meccanica durante le chat  	</text>  	<text name="translate_language_text" width="110">  		Traduci chat in: diff --git a/indra/newview/skins/default/xui/it/teleport_strings.xml b/indra/newview/skins/default/xui/it/teleport_strings.xml index 7a1046abd3..a0b324d8fb 100644 --- a/indra/newview/skins/default/xui/it/teleport_strings.xml +++ b/indra/newview/skins/default/xui/it/teleport_strings.xml @@ -18,6 +18,10 @@ Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE  		<message name="timeout_tport">  			Spiacenti, il sistema non riesce a completare il teletrasporto. Riprova tra un attimo.  		</message> +		<message name="NoHelpIslandTP"> +		Non è possibile per te ritornare all'Welcome Island. +Vai alla 'Welcome Island Public' per ripetere il tutorial. +		</message>  		<message name="noaccess_tport">  			Spiacenti, ma non hai accesso nel luogo di destinazione richiesto.  		</message> diff --git a/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml b/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml index a29c6a0630..bcddcc6907 100644 --- a/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="nearby_chat" title="近くのチャット"> -	<check_box label="チャットを翻訳(Google翻訳)" name="translate_chat_checkbox"/> +	<check_box label="チャットを翻訳" name="translate_chat_checkbox"/>  </floater> diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml b/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml index 4334659557..aca055bb43 100644 --- a/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="nearby_chat"> -	<check_box label="チャットを翻訳(Google翻訳)" name="translate_chat_checkbox"/> +	<check_box label="チャットを翻訳" name="translate_chat_checkbox"/>  </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml index c8584ccaae..1502442a06 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml @@ -29,9 +29,9 @@  	<check_box label="IM チャット" name="EnableIMChatPopups" tool_tip="これを選択すると、インスタントメッセージを受信した際にポップアップが表示されます"/>  	<spinner label="近くのチャットメッセージが表示される長さ:" name="nearby_toasts_lifetime"/>  	<spinner label="近くのチャットメッセージが消えるまでの長さ:" name="nearby_toasts_fadingtime"/> -	<check_box label="Use machine translation while chatting (powered by Google)" name="translate_chat_checkbox"/> +	<check_box label="Use machine translation while chatting" name="translate_chat_checkbox"/>  	<text name="translate_chb_label"> -		チャット中に内容を機械翻訳する(Google翻訳) +		チャット中に内容を機械翻訳する  	</text>  	<text name="translate_language_text">  		翻訳する言語: diff --git a/indra/newview/skins/default/xui/ja/teleport_strings.xml b/indra/newview/skins/default/xui/ja/teleport_strings.xml index 2f67d43707..04ea1c2438 100644 --- a/indra/newview/skins/default/xui/ja/teleport_strings.xml +++ b/indra/newview/skins/default/xui/ja/teleport_strings.xml @@ -20,6 +20,10 @@  			申し訳ございませんが、システムはテレポートの接続を完了できませんでした。  もう少し後でやり直してください。  		</message> +		<message name="NoHelpIslandTP"> +		Welcome Islandには戻ることができません。 +「Welcome Island Public」に行き、 +		</message>  		<message name="noaccess_tport">  			残念ながら、そのテレポート目的地へのアクセスがありません。  		</message> diff --git a/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml b/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml index 7dc3e1f22e..214d465f1c 100644 --- a/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="nearby_chat" title="CZAT LOKALNY"> -	<check_box label="Tłumaczenie czatu (wspierane przez Google)" name="translate_chat_checkbox"/> +	<check_box label="Tłumaczenie czatu" name="translate_chat_checkbox"/>  </floater> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml index be730eb73f..7fd1029e6a 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml @@ -31,7 +31,7 @@  	<spinner label="Czas znikania czatu w pobliżu:" name="nearby_toasts_fadingtime"/>  	<check_box name="translate_chat_checkbox"/>  	<text name="translate_chb_label"> -		Użyj translatora podczas rozmowy (wspierany przez Google) +		Użyj translatora podczas rozmowy  	</text>  	<text name="translate_language_text">  		Przetłumacz czat na: diff --git a/indra/newview/skins/default/xui/pl/teleport_strings.xml b/indra/newview/skins/default/xui/pl/teleport_strings.xml index 57fb55bf4c..0366c3fdbc 100644 --- a/indra/newview/skins/default/xui/pl/teleport_strings.xml +++ b/indra/newview/skins/default/xui/pl/teleport_strings.xml @@ -19,6 +19,10 @@ Jeśli nadal nie możesz się teleportować wyloguj się i ponownie zaloguj.  		<message name="timeout_tport">  			Przepraszamy, ale nie udało się przeprowadzić teleportacji. Spróbuj jeszcze raz.  		</message> +		<message name="NoHelpIslandTP"> +		Brak możliwości ponownej teleportacji do Welcome Island. +Odwiedź 'Welcome Island Public' by powtórzyć szkolenie. +		</message>  		<message name="noaccess_tport">  			Przepraszamy, ale nie masz dostępu do miejsca docelowego.  		</message> diff --git a/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml b/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml index 60edfa505f..653861f7d8 100644 --- a/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="nearby_chat" title="Bate-papo local"> -	<check_box label="Traduzir bate-papo (via Google)" name="translate_chat_checkbox"/> +	<check_box label="Traduzir bate-papo" name="translate_chat_checkbox"/>  </floater> diff --git a/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml b/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml index 9d44c7f62d..15470dc94a 100644 --- a/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="nearby_chat"> -	<check_box label="Traduzir bate-papo (via Google)" name="translate_chat_checkbox"/> +	<check_box label="Traduzir bate-papo" name="translate_chat_checkbox"/>  </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml index e5aa42aae0..f98659aa73 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml @@ -31,7 +31,7 @@  	<spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_fadingtime"/>  	<check_box name="translate_chat_checkbox"/>  	<text name="translate_chb_label"> -		Traduzir bate-papo automaticamente (via Google) +		Traduzir bate-papo automaticamente  	</text>  	<text name="translate_language_text">  		Traduzir bate-papo para: diff --git a/indra/newview/skins/default/xui/pt/teleport_strings.xml b/indra/newview/skins/default/xui/pt/teleport_strings.xml index 11ea0f4195..f8ded1ce69 100644 --- a/indra/newview/skins/default/xui/pt/teleport_strings.xml +++ b/indra/newview/skins/default/xui/pt/teleport_strings.xml @@ -18,6 +18,10 @@ Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE].  		<message name="timeout_tport">  			Desculpe, não foi possível para o sistema executar o teletransporte. Tente novamente dentro de alguns instantes.  		</message> +		<message name="NoHelpIslandTP"> +		Você não pode se tele-transportar de volta à Ilha de Welcome. +Vá para a Ilha de Welcome Pública para repetir este tutorial. +		</message>  		<message name="noaccess_tport">  			Desculpe, você não tem acesso ao destino deste teletransporte.  		</message> diff --git a/indra/newview/skins/default/xui/ru/floater_nearby_chat.xml b/indra/newview/skins/default/xui/ru/floater_nearby_chat.xml index fd3c9f3512..184c753e40 100644 --- a/indra/newview/skins/default/xui/ru/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/ru/floater_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="nearby_chat" title="ЛОКАЛЬНЫЙ ЧАТ"> -	<check_box label="Перевод чата (используется Google)" name="translate_chat_checkbox"/> +	<check_box label="Перевод чата" name="translate_chat_checkbox"/>  </floater> diff --git a/indra/newview/skins/default/xui/ru/panel_nearby_chat.xml b/indra/newview/skins/default/xui/ru/panel_nearby_chat.xml index a371040b74..1d26eecf87 100644 --- a/indra/newview/skins/default/xui/ru/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/ru/panel_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="nearby_chat"> -	<check_box label="Перевод чата (технология Google)" name="translate_chat_checkbox"/> +	<check_box label="Перевод чата" name="translate_chat_checkbox"/>  </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml index fa08c134ad..fb368b8b5e 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml @@ -30,7 +30,7 @@  	<spinner label="Время отображения всплывающих реплик:" name="nearby_toasts_lifetime"/>  	<spinner label="Время затухания всплывающих реплик:" name="nearby_toasts_fadingtime"/>  	<text name="translate_chb_label"> -		Использовать машинный перевод при общении (технология Google) +		Использовать машинный перевод во время общения  	</text>  	<text name="translate_language_text">  		Переводить чат на: diff --git a/indra/newview/skins/default/xui/ru/teleport_strings.xml b/indra/newview/skins/default/xui/ru/teleport_strings.xml index 6a7a181046..296562e6f1 100644 --- a/indra/newview/skins/default/xui/ru/teleport_strings.xml +++ b/indra/newview/skins/default/xui/ru/teleport_strings.xml @@ -20,6 +20,10 @@  			Системе не удалось выполнить подключение телепорта.  Повторите попытку позже.  		</message> +		<message name="NoHelpIslandTP"> +		Вы не можете телепортироваться обратно на Остров Помощи. +Телепортируйтесь на Общественный Остров Помощи, чтобы повторить обучение +		</message>  		<message name="noaccess_tport">  			У вас нет доступа к точке назначения этого телепорта.  		</message> diff --git a/indra/newview/skins/default/xui/tr/floater_nearby_chat.xml b/indra/newview/skins/default/xui/tr/floater_nearby_chat.xml index 6570c4379c..6b12ad0ef5 100644 --- a/indra/newview/skins/default/xui/tr/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/tr/floater_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="nearby_chat" title="YAKINDAKİ SOHBET"> -	<check_box label="Sohbeti çevir (Google tarafından desteklenir)" name="translate_chat_checkbox"/> +	<check_box label="Sohbeti çevir" name="translate_chat_checkbox"/>  </floater> diff --git a/indra/newview/skins/default/xui/tr/panel_nearby_chat.xml b/indra/newview/skins/default/xui/tr/panel_nearby_chat.xml index 73da726cb2..c405105e00 100644 --- a/indra/newview/skins/default/xui/tr/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/tr/panel_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="nearby_chat"> -	<check_box label="Sohbeti çevir (Google tarafından desteklenir)" name="translate_chat_checkbox"/> +	<check_box label="Sohbeti çevir" name="translate_chat_checkbox"/>  </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml index aeef737420..9c9e960715 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml @@ -30,7 +30,7 @@  	<spinner label="Yakındaki sohbet iletilerinin vurgulanma süresi:" name="nearby_toasts_lifetime"/>  	<spinner label="Yakındaki sohbet iletilerinin sönme süresi:" name="nearby_toasts_fadingtime"/>  	<text name="translate_chb_label"> -		Sohbet ederken makine çevirisi kullanılsın (Google tarafından desteklenir) +		Sohbet ederken makine çevirisi kullanılsın  	</text>  	<text name="translate_language_text">  		Sohbeti şu dile çevir: diff --git a/indra/newview/skins/default/xui/tr/teleport_strings.xml b/indra/newview/skins/default/xui/tr/teleport_strings.xml index c0c4be1393..c506bb8a58 100644 --- a/indra/newview/skins/default/xui/tr/teleport_strings.xml +++ b/indra/newview/skins/default/xui/tr/teleport_strings.xml @@ -20,6 +20,10 @@ Hala ışınlanamıyorsanız, sorunu çözmek için lütfen çıkış yapıp otu  			Üzgünüz fakat sistem ışınlama bağlantısını tamamlayamadı.  Bir dakika sonra tekrar deneyin.  		</message> +		<message name="NoHelpIslandTP"> +You cannot teleport back to Welcome Island. +Go to 'Welcome Island Public' to repeat the tutorial. +		</message>  		<message name="noaccess_tport">  			Üzgünüz, bu ışınlanma hedef konumuna erişim hakkına sahip değilsiniz.  		</message> diff --git a/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml b/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml index f0c34acb06..38a5dab523 100644 --- a/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml @@ -1,4 +1,4 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="nearby_chat" title="附近的聊天"> -	<check_box label="Translate chat (powered by Google)" name="translate_chat_checkbox"/> +	<check_box label="Translate chat" name="translate_chat_checkbox"/>  </floater> diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml index fc326c2ce2..738c77fd08 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml @@ -30,7 +30,7 @@  	<spinner label="Nearby chat toasts life time:" name="nearby_toasts_lifetime"/>  	<spinner label="Nearby chat toasts fading time:" name="nearby_toasts_fadingtime"/>  	<text name="translate_chb_label"> -		聊天時使用機器自動進行翻譯(由 Google 所提供) +		聊天時使用機器自動進行翻譯  	</text>  	<text name="translate_language_text">  		聊天翻譯為: diff --git a/indra/newview/skins/default/xui/zh/teleport_strings.xml b/indra/newview/skins/default/xui/zh/teleport_strings.xml index ffb4c903bb..bfdb107810 100644 --- a/indra/newview/skins/default/xui/zh/teleport_strings.xml +++ b/indra/newview/skins/default/xui/zh/teleport_strings.xml @@ -20,6 +20,10 @@  			抱歉,不過系統無法完成瞬間傳送的聯接。  請稍後再試。  		</message> +		<message name="NoHelpIslandTP"> +		您不能瞬间转移回“援助岛”。 +去“公共援助岛”重复您的教程。 +		</message>  		<message name="noaccess_tport">  			抱歉,你並沒有權限進入要瞬間傳送的目的地。  		</message> diff --git a/indra/newview/skins/minimal/xui/ru/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/ru/menu_script_chiclet.xml deleted file mode 100644 index f95913ef2b..0000000000 --- a/indra/newview/skins/minimal/xui/ru/menu_script_chiclet.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="ScriptChiclet Menu"> -	<menu_item_call label="Close (TODO: translate to Russian)" name="Close"/> -</menu> diff --git a/indra/newview/skins/minimal/xui/tr/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/tr/menu_script_chiclet.xml deleted file mode 100644 index 2efe6d7e71..0000000000 --- a/indra/newview/skins/minimal/xui/tr/menu_script_chiclet.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="ScriptChiclet Menu"> -	<menu_item_call label="Close (TODO: translate to Turkish)" name="Close"/> -</menu> diff --git a/indra/newview/skins/minimal/xui/zh/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/zh/menu_script_chiclet.xml deleted file mode 100644 index a0a8520650..0000000000 --- a/indra/newview/skins/minimal/xui/zh/menu_script_chiclet.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="ScriptChiclet Menu"> -	<menu_item_call label="Close (TODO: translate to Traditional Chinese)" name="Close"/> -</menu> | 
